什么是快乐的程序员呢?就是把编程当作兴趣和爱好的人,享受着编程的快乐的一群人。
优秀的程序员都是从快乐的程序员开始的。因为,成为优秀的程序员是需要很长时间的磨练的,如果在编程中连快乐都没有,很难熬到优秀程序员的。事实上,做任何事情只要找到了快乐,成功是迟早的事情。
我们每一个程序员都希望在快乐的编程中成长为一名优秀的程序员。
什么是优秀的程序员
先讲一个编程大师的传说:
传说在很久很久以前,软件界出过一位大师。他能直接用二进制编写复杂高效且无错的程序;他写过的机器码比我们吃过的米还要多;他用眼睛看看闪烁的硬盘灯就知道程序当前的运行状态;他用耳朵听听机器的噪音就可以准确地判断出错误在哪个模块的哪一行代码上。
他写的程序极为精简,10行代码就可以顶别人写的100行代码,且效率更高。他不轻易给人写程序,即使千金也难换来他的一行代码。但他一旦开始写编码,那可是潇潇洒洒一挥而就,代码都是一行千金。
他从不困惑于软件的宏观体系和微观结构之中,因为他通晓软件的本原,预知软件的未来。他早已看透软件世界与现实世界的本质,面向对象只是他博大精深的武功中的一套长拳。他能使用所有的软件开发工具,从CASE工具到DEBUG。传说曾有人亲眼看见过他用一把小刀在硬盘表面刻写操作系统的一段内核。
自他死后,软件界再也没有出现过真正的大师。世间只残存一些有关他的传奇,一代一代地流传下去……
可能这个故事编得太玄了。但在我们的心里却真希望软件领域能有这样的神人,或许梦想自己有朝一日也能练出这样的道行。
大家都知道:软件是计算机的灵魂!
程序员是软件的创造者,是计算机灵魂的工程师。而优秀的程序员就是用灵魂书写代码的人,他们将自己的生命与软件机融为一体,从而让计算机世界充满生机和活力。
优秀的程序员往往将编程当作艺术,对待自己的每一个程序,就像对待自己的艺术品一样。优秀的程序员总喜欢对自己的代码精雕细琢,他希望自己的代码都是精品,绝不愿意敷衍了事地将垃圾代码提供给他人。
优秀的程序员大都有很好的人品修养。他们知道自己的长处,也更加知道自己的短处。在外人眼里他是神,但他自己明白他也是会犯错误的人。因此,优秀的程序员往往会在展现实力的同时,保持着谦虚的美德。偶尔狂妄,那也只是性情中人。
优秀的程序员对计算机的本质了解很深,喜欢从哲学上去理解软硬件的关系和数据代码的运转规律。有时候,他们看起来更像个思想家,因为他们想像力非常丰富,小到蚂蚁,大到星云,都能联系到代码上。据说,他们走在大街上也能敏锐地感觉到两旁大楼里各种计算机的脉冲跳动。
优秀的程序员对新技术有独特的洞察能力。他们的思想非常超前,总能提前做好准备,迎接新技术的到来,而不是被新技术推着走。即使遇到尚未涉足过的新技术领域,他们总能很快地把握新技术的本质,迅速适应该领域的工作,并成为这些技术的带头人。
的确,一名优秀的程序员是让人敬佩和羡慕的。要想成为一名优秀的程序员,必须首先要坚信自己一定能行。再经过努力地修炼,总有一点你也能成为一名优秀的程序员的。
程序员的修炼历程
如果大家都希望成为一名优秀的程序员,秘诀只有两个字:修炼!
在IT行业中要想成为一名优秀的程序员,必须需要经过千锤百炼,才能最终修炼成佛。事实上,程序员必须在IT大潮的实践中接受改造,不断取得进步,提高自己能力和修养。由一个幼稚的菜鸟,要变成一个成熟老道的大牛,往往需要经过一个很长的修炼的过程。
首先,要想成为一名优秀的程序员,必须要热爱编程工作,完全将编程当作自己的兴趣和爱好,甚至毕生追求的圣神目标。如果你没有这样的想法,只是把编程当作工作,最好别做程序员,趁早改行。
许多人说,编程是非常枯燥乏味的事情,程序员必须要耐得住寂寞,能忍受孤独。但真正的程序员却感受着编程的快乐,一点都不觉得孤独和寂寞。他们深信硬件的坚强,享受着软件的温柔,在计算机世界里,他们个个都是情种。
许多人说,程序员职业是一碗青春饭,都是20-30岁的年轻人干的。超过30岁之后呢,就干不动了。是这样吗?的确,早些年一些目光短浅的软件企业确实为了降低成本,雇佣年轻的低价程序员来完成工作。不是老程序员干不动了,而是挨踢了,所以程序员就叫挨踢一族。
但是,随着软件企业的不断成熟,老板们发现程序的开发和维护都是长期的事情。而有经验的老程序员编写的代码更加可靠和简洁,系统开发反而会减少很多麻烦事情,因此总体软件开发成本反而比雇佣大量年轻程序员要低。不但如此,老程序员而且还能帮企业带出一批新人,使得企业积累的技术经验能得到传承和发展。
其实,在发达国家的程序员,那可是越老越吃香。现在,国内越来越多的企业都愿意招聘有经验的老程序员,甚至某些软件企业还专招30岁以上的老程序员。越来越多的软件企业认识到,由老中青三代人构成的开发团队,才是真正永远有战斗力的团队。因此,程序员职业将不再是一碗青春饭,同样也是可以干一辈子的。
要成为优秀的程序员需要有很强的自学能力,必须不断地学习新技术和新知识。除了要学习前人的理论和经验之外,还必须亲自参加到具体的项目中去,在实践中运用所学的知识,解决和处理具体问题。
只有这样,他才能够逐渐地体验和认识编程的规律性,才能真正深刻地认知编程的本质,才能发现自己的弱点和原来不正确的思想、习惯、成见,并加以改正,从而提高自己编程质量,改善编程的方法等。
所以,程序员要改造和提高自己,必须参加具体项目,绝不能离开工作实践。更为关键的是,程序员必须要有自我学习和修炼的主动性,否则再多的项目实践也无法使自己进步。
经常会看到这样的情况,几个程序员一起参加一个软件项目。项目结束之后,有些程序员提高很快,有的进步很慢,有的却原地踏步。这是什么原因呢?
提高较快的程序员大都勤奋好学,喜欢探究编程的规律,并能逐渐总结出自己的方法。而进步较慢的程序员虽然也勤奋努力,但往往只着眼于具体的代码,不善于抽象和总结规律。而原地踏步的程序员呢,大都是混饭吃的,根本没有主动学习和提高自己的意识。
程序员不但要修炼自己的技术,还要善于修炼自己的人品。不是说编程中的大多数问题都是人品问题吗?当然,这里说的是程序员性格和人格的修养。
程序员的学习能力
没有哪个人是天生就会编程序的。大多数刚毕业的学生走上工作岗位时,常常抱怨学校教的知识都派不上用场,一切都得重头学起。在IT行业,这种现象更加严重,知识更新的频度和密度是其他行业没法比拟的。
学校的时光也许真的没有教给我们多少实用的知识,但却教会我们一个重要的法宝:自学能力!既然吃了程序员这碗饭,我们就必须牢记一句话:活到老,学到老。
学习有很多方式,读书是最好的学习方法,喜欢读书的程序员大都是爱学习的人。不过,现在的技术书真是太多太杂,我们不可能有太多时间来读书,更不可能读遍所有的书,需要挑选好书来读。
要挑一本好书也确实不容易,因为现在的技术书是鱼龙混杂。有优秀的精品,有滥竽充数的;有大家名作,也有误认子弟的。一般来说,我们可以购买两种图书,一种是可以反复阅读的精华,另一种是现用现查的资料类图书。网上购书是个不错的方式,可以参考销量排行榜和其他读者的评价。
网上学习也是非常不错的方式。只要善于搜索,总能在网上找到需要的文章和资料。最近,人们发明了一个新词叫“搜商”,它衡量人的网络使用能力。搜商高的人把网络当作蕴藏宝藏的海洋,他们更能熟练地从垃圾网页中淘出自己需要的宝贝。这也可以称作“淘宝能力”,网上学习也是需要很强的淘宝能力的。
此外,喜欢做实验也是非常好的学习方式。如果,书上有例子,不妨亲手试试。如果,学习中有什么新想法,也不妨马上试试。因为,通过实验不但可以加深对所学知识的领悟,还能增加对技术的感性认识,甚至带来某些意想不到的灵感。
喜欢学习,是一个程序员最大的优点。不过,这学习也是大有学问的。
学习就要刨根问底!任何事情喜欢刨根问底的人,一定能成为优秀的程序员!问大家一个问题:Java为什么要取名为Java?
如果你能回答这个问题,你一定喜欢刨根问底,我也相信你一定比其他人更加理解Java!
如果你回答不上来,就听我给你讲讲。
Java一词来源于印度尼西亚南端的一个岛名,即爪哇岛,那里以盛产咖啡闻名。当SUN公司的开发人员在给这种语言取名的时候,正好喝着爪哇咖啡,于是Java由此得名。
我怎么知道这个故事呢?不瞒您说,我从来就没有编过一句Java的代码,我那是刻意查过资料的。如果我要学Java,我一定要先搞懂Java是怎么来的,搞懂为什么要发明Java语言等一系列问题,这其实就是刨根问底。
然后,我会先用记事本写一个Helloworld程序,看看怎么编译它,看看它怎么运行,需要哪些文件等等。至于语法语义等,编译器会告诉我该怎么写。然后边学边做,看书,查资料。实在搞不明白,我就像大家请教。相信一段时间下来,我也能编出地道的Java程序。
在学习过程中,我会以自学为主,尽量自己解决问题。如果拿一些基础性的问题向各位高手请教的话,你们一定会回答:自己看书!我要请教各位的问题一定是那种雪天裸体360度空翻跪地拜求,书上没讲,网上查不到的疑难问题。
事实上,这也是向高手和前辈们请教的学问,也是学习方式之一。作为编程高手,他们最喜欢帮助那些经过自身实践的探索和琢磨,快要入门但不得要领的人。这时,只需轻轻点化,新手就能体会到顿悟的快感,而高手也有渡人成佛的成就感。
程序员的思想境界
年轻的程序员最喜欢追求新技术和新潮流,这是无可厚非的。我们应该大力鼓励年轻的程序员学习新知识,爱学习的都是好同志。
不过,我们不但要学习技术的应用,更重要的是学习技术背后所蕴含的思想真谛甚至情感境界。一种新技术的诞生,一种新潮流的兴起,往往背后都有理论思想的指导。只有深刻地理解了这些技术背后的理论思想,才能更好地把握技术本身。
比如,面向对象编程是大家都在用的技术吧。有的程序员已经能用C++或Java或C#写一个类,定义属性,编写方法,然后创建一个对象,就可以调用它的方法,操纵它的属性了。这样,他也可以编写出面向对象的程序。不过,他所看到的只是程序对象。
深入学习和理解面向对象的思想之后,我们就会明白:所有的对象都是对现实世界的抽象,面向对象编程就是用人类最自然的思维模式来编写程序。这时,我们看到的分类就是现实世界的门纲属科,那些对象也就成了现实世界的活物,属性和方法也就成了他们的性格和活动。
这时候,我们再写面向对象的程序,就像写作文一样。各种命名都很自然地用到现实世界的各种名词,代码本身就无需多少注释,因为它们大都是自注释的。编写代码逻辑,就像编写现实世界的游戏规则。整个程序的思路非常清晰明了,代码也显得非常简洁优雅,运行效率也自然会高些。
因此,学会技术的思想之后会对使用技术的能力产生一个质飞跃,可以更深层次地使用这些技术,而不会被表现的形式所迷惑。事实上,只要掌握了面向对象思想的本质,即使不用面向对象的语言,也能编写有面向对象思想的程序。就好像武林高手用树枝也能玩剑法,虽然树枝不是剑,但处处体现剑法的精髓。
学会编程思想就足够了吗?如果还想更上一层楼,就得追求编程的境界。境界这个东西很虚,看不见摸不着,但可以从内心感觉得到。这种感觉有点像心灵相通的默契,若有若无。编程的境界追求的是人与程序间的心灵相通和情感交融,将自己的身心与程序世界融为一体,与现实世界融为一体。
编程境界这个东西的确有点玄,境界这个东西是因人而异的,每个人的感悟都不同。就像佛教里的禅的思想,什么是禅呢?禅是需要自己体验的东西,别人说的都不算,是不能用语言来描述的。所谓,不立文字,直指人心。我也是只知皮毛啊。
如果要我说什么是禅?一句话:通过感悟生活,得到生命的快乐。
编程之禅也就是:通过感悟编程的真谛,得到编程的快乐。
编程的境界只有高低之分,而且永远没有尽头。当你的编程境界到了一定高度,你的思想将会跳出编程的范畴。你将会发现,软件的根本实际上是哲学问题,很多方面都是和其他科学相通的。就像现代的量子理论发展到最后,发现量子论事实上是与哲学相关的一样。这个撤得就远了,但是喜欢哲学思考的程序员一定会成为一名优秀的程序员。
不过,再高的思想境界也得落到实处。光玩思想境界也不行啊,毕竟大家都在软件企业工作,都得道成仙了,谁来编码呢?
优秀的程序员也一定是务实的程序员。务实就是理论与实践相结合,追求的是完美与现实的平衡。毕竟理想和现实是有差距的,我们只有胸怀远大理想,面对残酷现实。
前段时间我还给人讲过一句话:
为了玩刀而上战场的人大都死于刀下,临死时怪自己的刀没有选好。为了杀人而上战场的人大都成了将军,临死时放下屠刀立地成佛了。
所以,程序员要想成佛,不但要追求编程境界,还要学会在残酷的现实中拼杀,解决具体的问题才行。
程序员的协作能力
现代软件软件开发,都是多人协作的大规模软件开发。对于大中型应用系统,特别是大中型网站系统,基本上不会产生单打独斗的软件英雄了。在现代软件开发中,将诞生越来越多的英雄的团队,而我们这些程序员也只能是这个团队的一员。
因此,程序员是否具有协作能力,成了衡量程序员水平的另一个重要指标。成员的协作能力对于一个团队来说,往往比个人能力更加重要。一个优秀的团队,并不一定要由优秀的个体组成。反过来,优秀的个体如果缺乏协作能力,也无法成就一个优秀的团队。
沟通交流能力是最基本的协作能力。什么是沟通交流能力呢?很简单,一是能听得懂读得懂别人的话,二是能准确表达自己的思想和看法。不过,这看似简单的东西,却不是人人都会的。
有的人并不善于倾听别人,常常误解人家的意思。有的人呢,说话都说不清楚,脑袋里装的东西说不出来也写不出来,或者说了半天人家无法理解。
为什么会出现这样的问题呢?据我多年的观察和研究,主要有两个原因,一是没有耐心,二是没把话说清楚。什么意思呢?没有耐心听人说话,又懒得把话说清楚。
都说倾听别人是一种美德,可有的人就只顾自己说,喜欢打断人家说话,甚者人家还没把话说完就否定别人。所以,我说沟通应该从倾听做起。
我在平常的生活中很喜欢与同事和朋友们交流,他们也都喜欢和我讨论问题。一些同事和朋友找我解决一些问题,我总是耐心得倾听,尽力去理解,不断地点点头。常常听他们说了一半,突然说:啊,我知道问题在哪里了!这种情况我都遇到好多次了。
其实,有的时候只要做到了耐心的倾听,就能解决问题。
其次是说话不清。这个说话不清并不是指说话的声音不清晰,而是指话中的用词不清,说话的逻辑不清,经常使用大量的指代词。比如我对你说:“点一下这个,就让它改变颜色。”,谁能听懂我在说啥?估计没人能听懂。如果我再说:“用鼠标右键点击一下网页上的字体颜色按钮,就可以让选中的文本变成相应的字体颜色。”,这下听懂了。
为什么前一句话他家听不懂呢?因为我省略了大量的在自己脑海中的景象,没告诉大家,潜意识中是以自我为中心的。“这个”、“它”这些代词只有自己明白指代的是啥,而听者并不清楚,自然听不懂我在说什么?
第二句话能听懂,是因为我尽量把每个脑海中的事物都说全把细节说全。这样,听者就能很快进入角色,大家迅速建立起沟通交流的上下文环境。一旦这个交流的上下文环境建立起来,再使用一些指代词也就不会影响沟通过程了。
其实,这些简单的道理不但适用于语言交流,还适用于客户调研,需求分析,书面协作,等等方面。今后有机会再给大家继续探讨。
协作能力还有一个重要的方面,那就是按规矩办事。按规矩办事就是所谓的规范化,规范化是一个优秀的团队的头等大事。作为一名有协作精神的程序员,就必须遵守团队的规范。
如果你有个人英雄主义,那么,对不起,在你那深刻独到的见解没有成为团队认可的规范之前,你必须保留个人意见。编程的命名规范,接口形式,注释要求,开发管理流程,必须要遵守。
接下来考验一个人的协作能力就是:是否有责任心。也就是对待自己那部分工作的态度。说得高尚一点儿,就是程序员的职业美德。责任心就是对自己所属的工作负责,认真对待自己那部分代码,甚至象呵护自己的孩子一样。其实,责任心也不是什么沉重的东西,有智慧的程序员总是喜欢将工作当作乐趣,大家不妨试试。
以前有句老话说,文人相轻,就是文人之间互相瞧不起。事实上,程序员相轻,也是很普遍的事情。不是经常都会听到程序员说,那人代码写得真烂,重构人家的代码还不如自己重写呢。其实,很多情况下,你留下的代码也常常被人骂。
在一个团队中,程序员相轻的现象是会引发团队内耗的。而具有协作精神的程序员对待其他程序员的代码,总是有一颗包容的心。他们更愿意通过改变自己去影响他人,从而让整个团队共同进步。
做快乐的程序员
一开始我就说过,优秀的程序员是从快乐的程序员开始的。
什么是快乐呢?
快乐,谁不知道啊,大家都感受过快乐。但快乐怎么定义呢?
快乐 = 现实 / 欲望
什么意思呢?就是快乐的大小,与现实条件的多少成正比,与欲望的大小成反比。快乐就是现实对欲望的满足感,就等于现实除以欲望。你拥有的现实条件越多,钱越多,房越大,车越好,快乐就多;你的欲望越大,解决了温饱就想娇妻,刚成为白领就想当经理,个个都想成为马云和比尔盖茨,现实满足不了,你就不快乐。
当然,每个人追求的目标不一样,就会有不同的快乐和痛苦。程序员也一样,想实现更多功能,想让程序跑得更快,现实世界的软硬件条件又满足不了,客户的需求又变来变去,开发确实是一件痛苦的事情。
程序员怎样使自己快乐呢?最简单的办法就是“知足常乐”。知足常乐就是把欲望控制在现实条件可以满足的基础之上。在编程中呢,就是把功能控制在可以实现的范围只能。在软件工程中呢,就是把用户需求控制在开发成本和期限之内。
当然,要做到知足常乐是很不容易的事情。人们难免会不被各种欲望引诱,程序员也难免不被新技术吸引,也总想给客户提供更加强大的软件功能。要知道,人的欲望总是无穷无尽的,而现实条件总是有限的。佛说,有欲望就有痛苦。
削除欲望会怎样呢?就是欲望为零。学过算术的人都知道,任何数除以零,等于无穷大。当欲望为零的时候,任何一点点现实的满足,就能带来无穷的快乐。这可能就是佛所说的极乐吧,似乎有些道理。
其实呢,快乐的程序员还要有一颗童心。 童心会使我们对任何事物都充满好奇心,这会让我们在学习和探索新知识的过程中,充满无限的乐趣。童心会让我们把编程当作游戏,编程就像玩过家家,用心呵护自己的程序。童心让我们跳出狭隘的自私心,与同事快乐地相处。充满童心真是可以为我们带来许许多多的快乐,这是快乐程序员的有一个秘诀。