不要浮华于编程世界
每次看到编程语言的排行榜时,依然会点开看一下,看看业内的语言发展趋势,看看自己熟知的编程语言处于什么什么位置,看到太多太多关于编程语言的争论与评论,有人甚至为选择何种具体的开发语言而苦恼与彷徨,C++,还是Java?向左还是向右?答案莫衷一是,那些鼓吹某种编程语言如何如何好的人,是否真正深入了解一门语言?还是仅仅浮于表面?
常听到一种解释,“具体的编程语言不重要,重要的是思想”,这句话本身并没有错,但忽略了一个前提,就是怎样才算有“思想”?个人认为,编程思想的培养,是建立在深入理解和熟练运用一门编程语言的基础之上的,当你用惯了高级语言时,你是否了解了操作系统底层的操作和机器指令?当你能熟练掌握了语言的基础数据类型和控制结构时,你是否想过要超越此抽象层工作?当你理解了常用的算法和数据结构时,你是否能迅速写出正确的code?当你用惯了封装的函数时,你是否想过能更优的代码实现?
至今仍然深刻地记得去MSRA的面试,第一个面试官问了我些语言底层的很多东西,我答得一般(现在回想起来好多东西回答的答案根本就不对),当时他也没问太多,后来考了我些具体的数据结构的应用,让我当面用代码实现,我写出来后他说还可以,问了些其他方面的事情,然后就让我等下一个面试官。下一个面试官问的东西更为底层,如实现strcpy、memcpy之类的东西,strcpy写对了,但memcpy写得很差(没考虑到共用一块内存的情况),之后问了一些算法上的东西,基本上都答对了。面试结束后,他们给我的评论是算法不错,但基础太差,所以......回来后有些郁闷,之前从来没有觉察到自己语言基础是如此的差,平时写程序很少因为遇到问题而不会实现的情况(即使不知道,MSDN或google),一直认为编程水平还可以,但细想下来,自己总有些“拿来主义”,只知道用而不去考虑内部是怎么实现的或是让自己去写会怎么实现之类的问题。也许你有些疑问,我为什么要考虑这些细节呢?语言既然已经提供了的东西,就是为了被别人用的,有现成的还会动手自己去实现么?在某些特殊的情况下,特别是些新技术环境里,编程工具也许会原始到你必须对期望的方法做较大的改变,这些可能使你无法采用自己期望的方法,比如在手机上实现文件搜索的功能,就不能简单的把运行在电脑上的程序直接移到手机上,而是不得不考虑自己去实现底层数据结构,甚至如何优化来提高性能,甚至这种最简单的写法
while(i>0) a[i--] = b[i--];
都要天之书成
while(i>4){
a[i--] = b[i--];
a[i--] = b[i--];
a[i--] = b[i--];
a[i--] = b[i--];
}
while(i>0) a[i--] = b[i--];
。
最近公司在做一个大型的业务系统,系统庞大到显得臃肿(暂且不论设计上的不足),其中有些具体的业务模块需要向服务器端去取数据,开发人员需要根据具体的业务写些SQL到服务端执行取得相应的数据。有一次对Team中的一个同仁写的SQL提出了一些优化的建议(如说尽可能用的用in取代or、where子句里避免使用!=、or等),同事对我说高版本的引擎内部会优化这些细节的,姑且不说是否正确,如果软件的用户用的是低版本的数据库你还会要求用户用你的软件还要去升级已有的数据库么?
以前一位老师曾经对我说过,程序员可简单地分为三类,第一类是遇到问题时,问别人怎么做或是看别人是如何解决的;第二类是遇到问题时,可以迅速的想到解决方法,并将其实现;第三类是先明确自己要解决什么问题,根据所掌握的语言和开发环境选择最佳的解决方案。第一类相当于入门级,会利用某些基本的功能,如写个循环,写个子程序,能使用语言的一些特性。第二类相当于中级的水平,能得心应手的使用编程语言。第三类则可以称为技术大牛了,他们不仅能熟练的掌握语言的应用,对开发环境也有着专业的技能。总之,除了要学好编程语言,还要学好数据结构、操作系统、编译原理等基础知识。即使当你处于一个技术带头人的位置上时,想必你更会孜孜不倦的去学习和充实自己。而处于向高手努力的人来说,千万不要浮华于编程世界,毕竟通往高手的路还有很长一段要走。