写在前面
自今年年初,便很想写一些文字。一来是有很多学弟学妹们经常问我,要成为一名合格的程序员,应该具备那些知识和能力,二来,也想在工作六年之际给自己一个交代。
然而,每当动手把自己心里要说的话付诸文字,心中总有些惴惴。
我能算作一个合格的程序员吗?虽然进入IT这个行当已经近六年,可至今,还是有很多领域没有涉足,还是有很多的知识我不具备,有一些还是急待了解和掌握的,比如LINQ,再比如WPF,更不要说Java,更不要说C++...
还没有动笔,冷汗却已打湿衣衫。自己尚且如此,何必再写些东西骗人呢?自己落个欺世盗名倒也无妨,可误人子弟的恶名,却是实在承受不起的。
上周,和师傅聊起此事,师傅劝我:“有时候,失败也是一种学习,即使你觉得自己有所欠缺,能够让别人从你的失败中有所得,也是很有意义的。”
所以,就有了这篇文章。
一 编程无涯,学习亦无涯
记得毕业的时候,学校领导曾送给我一件木牌,作为优秀毕业论文的奖品,木牌上写有:
“博学笃志,明德求真”
回想自己工作的两年,真的有些愧对学校领导对自己的期望。无数个夜晚,我不是在书桌边研读Burce Eckel的Think''in in C++,不是在小戴(作者注,笨狗的DELL本本的爱称)上实践书上的Sample,而是在Delta Force中沉迷,或者索性在电视台播放的肥皂剧前发呆。
在工作中提高和充实自己,对于任何一种职业,都是必要的,对于程序员,则尤为重要。因为程序开发,是一项十分耗费脑力和精力的工作,而人的一生中精力充沛的黄金时期,也不过那么十几年。一个程序员的一生是功德圆满还是碌碌无为,都取决于这十几年的时间。当然,有的学弟学妹可能会说,国外有很多年龄很大的程序员,写程序写到头发全白,直至掉光,这个我也不能否认,可是在中国,一个30岁以上的人去应征程序开发的工作,恐怕会很难很难。何况,即使你真的能做到四十几岁,五十几岁,那个时候的你,怕已经为生活的琐事所累,能抽出的学习提高时间也不会很多。
师傅曾和我开玩笑说,做程序员的好处之一,就是总有可学的东西。这话一点不假。光是主流的数据库系统就有MS SQL Server,Oracle,DB2,My SQL等等N多种,程序设计语言更是有Visual Basic,C,C++,C#,Java,Python等N+N多种,更不要说每个软件差不多都要不停推出新的Verson。就拿笨狗正在研习的C#来说,自己连remoting都还没怎么弄通,Visual Studio 2008就已经RTM,据说其中加入了范型等N多新的特性,看来笨狗脑中的知识又要有一次大的update。
既然不愁没有可学的东西,剩下的就是学些什么的问题。记得大学的西经老师耿伟姐姐告诉我们,一件东西的价格和供给的数量成反比,换成不是很拽的话,就是“物以稀为贵”。这个定理在程序员中也很适用,能熟练使用汇编语言编写单片机控制程序的兄弟和会用VB写Hello World的兄弟相比,少而又少,前者可能在Luccent拿着几十万的年薪,而后者可能在一个小公司靠着每月两三千块的薪水苟延残喘(比如,我-_-!)。当然,要是有哪位兄弟可以拿汇编写出任天堂的模拟器,每个月却只有可怜巴巴的几百大元,记得来TEDA找我,我倒是很愿意请你吃一顿香喷喷的水煮鱼,听你一诉衷肠,同时和你一起问候一下贵公司老板的母亲。不过,汇编语言的难度和VB相比,同样也是相差几个数量级。所以,若想年薪几十万,开着Polo(或者是别克凯越,我只是打个比方)到处疯,就要付出比别人多几十倍的代价。(那边的兄弟说了,他是做传销的,初中毕业,已经有自己的奥迪A6了,而且是一次性付款,这个~,哪位兄弟帮我去马路上拣块板砖回来*_*)我那苦命的爷爷曾经对我说过,要想人前显贵,就得人后受罪,当我每个月发薪日前为剩下几天如何过活发愁的时候,才发现他老人家的话真的一点不错。
当然,学东西也不是说刻意捞偏门,也要参考社会各类人才的需求程度,比如,现在社会上熟练掌握ALGOL语言的人不能不说凤毛麟角,可是你要真是去钻这个东西,恐怕对于自己的polo梦帮助实在有限。Why?''Cause it is out of date,man!过时啦~
所以说,学东西还是应当有一些前瞻性,从beta版本开始,是一个好的策略。也就是说,学习一门语言(或者说,学习一种语言的一个版本)应该由它的beta版本开始,这样当正式的版本RTM的时候,你才有机会先声夺人。不过,值得注意的是,软件厂家常常会在正式版发布的时候对软件本身做一些更动,所以正式版发布的时候,应该注意一下软件厂商提供的软件文档说明。
对于语言的学习本身,更多的是要注意勤于思考,争取做到"think''in in XXX"(所以笨狗一向觉得Bruce Eckel绝对是个天才),也就是从语言本身的特性思考实现的特性。嗯,比如Java吧,程序的设计者所注重的是程序本身的安全性,而不是运行性能(记得看过一篇文章上说某版本的java程序在VM上跑的比VC写的原生程序还要快,我一直很怀疑),所以既然C++中的指针指来指去的,容易出问题,索性从java中去掉,至于内存管理...C++的程序员经常会创建一个对象而忘记释放,造成内存泄漏,所以java设计了GC。至于.net Framework,从java中借鉴了很多思想,不过比java和微软的产品结合的更加紧密(比如,特别为微软的数据库提供了System.Data.SqlClient命名空间,Oracle的支持却是1.1才加上的),一套Visual C#标准版的售价不过一千多块,一套企业版的操作系统或者数据库系统则动辄几万块,所以Bill Gate同样是个天才。