记不得在哪里看过这句话,“当你拥有一把用得顺手的锤子,就会认为全世界都是钉子”。所有的事情、所有的问题,你都尝试用这把锤子去解决。很多情况下,常常,这把锤子解决不了问题,或者说,有更好的工具来解决手头的问题。比如,将钉子从木头中取出来,使用起子会更有效率、更省事。
编程语言,比如C#,就是我们手上的锤子;而由此语言而形成的思维方式、思考习惯更是我们头脑中一把无形的锤子。这是好事、也是坏事--好事在于我们至少有一把锤子,坏事在于我们常常因为手中的用了顺手的锤子而忽略了其它工具。
我曾经在广州的一个公司建议我所在部门的经理将AOP技术应用到我们手头的项目中来解决很多AOP擅长而OOP不擅长的事情,部门经理告诉我说,“AOP能做好的,OOP都能做好,比如你说的日志记录,在每个需要记录的地方,加个函数调用就可以了啊,何必使用AOP把事情搞的那么复杂”。
我曾建议某个熟练C的程序员可以尝试了解一下C++,得到的回答大概如是,“C++能做的,C都能做,C++的对象可以使用结构和函数指针来模拟,多态可以使用基于函数指针的表来模拟”。可是了,这个熟练的C程序员从来都没有这么模拟过。他真的还有可能步入面向对象世界的门槛吗?
我曾建议某个熟练的C++程序员尝试了解一下C#或Java这样的语言,得到的回答大概如是,“C#和Java能做到的,C++都能做到,而且使用C++能对底层有更好的控制权,而且效率更高!”我又问他,“既然是为了更多的控制权和更高的效率,为什么不直接使用汇编或C了?”他没有回答。日后,他仍然使用着MFC快乐而低效地创造着很多似乎运行的并不高效的程序,他依然很满足很快乐。再当他和别人说到C#和Java,“那些是什么东西,我从来不用它们!”。
如果,我们不能暂时放下手中那把帮助了我们许多却又限制了我们许多的锤子,我们就永远不可能拿起其它的工具(思考方法)来更有效的解决问题,也永远不可能体会到其它工具(思考方法)的精妙所在!就像上面的那个经理,对于AOP的理解,再过10年,恐怕仍然也不会深入一点点。
我们不愿放下手中那把顺手的锤子,可能是因为
(1)我们已经深深的爱上这把锤子,对其它的工具都没兴趣
网上大把的口水战,像,C#和C++哪个好?Java和.NET哪个有前途?这些口水战的斗士们,支持.NET的你对Java的世界了解多少了?支持C++的你对C#又了解多少了?我们经常把自己关在井底观望着头上巴掌大的一片天空,然后对看不到的世界妄加论断,却始终没有勇气跳出井去了解一下我们不熟悉的更广阔的世界。
一个真正的智者,不在于它掌握了哪些编程语言、哪些平台,而在于他的思维方式、思考方法,在于他开阔的胸襟、不固步自封的人生态度。功夫练到最后,都是练内功、练个人修养,真正的高手,飞花落叶即可伤人!
(2)我们已经没有时间没有精力去学习新的工具(新的思维方式)
这个理由的缘由仅仅在于我们的懒惰和固步自封!
走出去学习吧,不断地走出现在的那口井、并且不断的学习才有出路,谁叫你选择程序员这个职业了。
(2006.04.10 Appendix)我很抱歉,我的文字让很多人误解了我的意思,我的本意并不是要大家去学习很多编程语言,而是建议大家从现在的思维模式、思考方式中走出来,去看看外面的世界!比如,你一直是面向过程的思维,可以了解一下OOP、AOP,你一直是使用静态的语言工作(如C++、C#),可以了解一下动态语言(如Python),你一直从事C/S开发,可以去了解一下B/S,你一直在Windows上工作,可以去了解一下Linux,反之亦然。扩宽我们的视野,无论如何,对我们的成长是有帮助的。当然,这些的前提是,你必须静下心去研究和体会(这是所有技术人员的必备的基本素质),要知道哪些东西是浅尝的,哪些是需要深究的。不要无缘无故的排斥、反感什么技术,不要无缘无故的追捧什么技术。
其实我最想强调的是这一点:“功夫练到最后,都是练内功、练个人修养,真正的高手,飞花落叶即可伤人!”思想狭隘者、固步自封者,很难成为真正的高手。