程序员,你应该知道
(说明:本文转自公司知识库的一篇原创文章,作者:李瑞宽)
想象你是一个初出茅庐的小菜鸟,上头交代你做任务,你对其中的一项任务有那么一小点疑问,你怯生生地问:“我觉得这项任务说得不是很清楚,那样做行吗?为什么呢?我觉得应该这样做更好。”项目很紧,上头头大着呢,他很不耐烦地对你说:“不要问那么多!我都考虑清楚了,只要照着做就行!”你应该怎么办呢?你是就这样屁颠屁颠地去做了,还是还是觉得你应该知道为什么要按照他说的做,而不是按照你说的做吗? 你应该知道。而且你要一直坚持“我应该知道”这种想法,因为这种想法,会带领你走进一片新天地。你可能还意识不到,你现在的是否坚持和你后续的发展休戚相关。坚持了,你会向着更深的层次迈进;放弃了,你就一直呆在原地,没有办法进步。
依我看来,技术人员的发展,不外乎往深度发展或者往广度发展。
什么是深度呢?就是你对技术的掌握程度,你一套扎进去,对技术有自己越来越深的理解,你从不会到会,从会到精,你会显著感觉到自己能力的提升,等到精通了技术之后,使用这项技术自然是挥洒自如,易如反掌。
什么是广度呢?就是十八般武艺,刀枪剑戟棍,.NET, JAVA, Silverlight,逮着什么就是什么,都去参上那么一腿,这个就是广度。你学习了N多技术,每次见到一种新技术新语言你就两眼放光四肢冒汗,你都要根据它们的入门指南操作那么一次,好吧你是很踏实的人,所以你多操作了那么两次,之后你就能够很NB地在简历上面吹牛逼:“本人精通C#、C++、JAVA、PHP、HTML、C、汇编、Python 不拉不拉不拉,神马技术神马语言对于我都是浮云!”说出去唬的别人一愣一愣的,当然,他们并不知道,你只写过这一堆语言的Hello world。
深度很奥妙,广度很有趣,你应该怎么选?
如果是二选一,毋庸置疑,你应该选择深度!为啥呢?深度是一个技术人员的核心竞争力。在这个IT从业人员多如过江之鲫的今天,IT民工、码农到处都是;本科如狗,硕士满街走,只有博士还能抖一抖;街边随便哪个修钥匙档上面都贴着广告“200元企业建站!立等可取!”技术人员如何安身立命?
这个时候,你应该靠你的深度,你也只能靠你的深度了。道理很简单,技术人员靠什么吃饭?靠自己的脑子。从你人生到现在的经历中,你早早就依靠脑子跟别人竞争了。从小学到初中到高中到大学,哪一次升学考试你不是靠自己的脑子将别人PK下去?你知识掌握的越牢固,学得越深入,对那一堆公式定理理解的越深刻,你就越能够在竞争中占据有势,最终赢得求学阶段的胜利。不管现在学校扩招多厉害,名牌大学还是高质量的金字招牌,在普罗大众的眼中熠熠生辉,阿弥陀佛。进入了社会,这样的竞争其实还是很类似的,只要你比人功夫深,你就比人香喷喷。
深度就是你的内功,它带来效率,它能够让你非常稳健地向前进。我们来看看倚天屠龙记里面对乾坤大挪移的描述:“正如要一个七八岁的小孩去挥舞百斤重的大铁锤,锤法越是精微奥妙,越会将他自己打得头破血流,脑浆迸裂,但若舞锤者是个大力士,那便得其所哉了”。你的深度,就是你自己的力量,你要使用的技术,就一把大铁锤,你要掌控好这把铁锤,没有深度,就等着自己被砸伤吧!深刻地掌握一样东西,不单明白了它什么时候非常适合使用,什么时候能够使用,也能明白它什么时候最好不用。在平时的生活中你是否经常听到这样的话:“微软/Java/etc的XXX技术太难用了!我想要XXX它XXX就是搞不定!”很显然,你碰到了大铁锤的受害者。不排除微软的确是有难用的东西,臭名昭著的就有MSN,但依据我粗浅的技术眼光,至少在开发技术这块,微软还是相当有想法的,而且构建的东西只要摸清它的底,用起来还是颇为畅快的。
说到深度,就要提到境界。从你选择了深度这条路开始,你已经开始踏入了境界之旅。
境界是分层次的,学拳的说“招熟,懂劲,神明”,孔子说“三十而立,四十不惑,五十知天命,六十耳顺,七十为所欲为不守规矩!哦,是从心所欲不逾矩”。这两家说的都是不同的境界层次。你在开始境界之旅中的某一个时刻,将会处在某一个特定的境界层次中。不同的境界的认识是不同的,同样的话,境界低的人会看不到什么东西,境界高的人就能一眼看到其中的道理。即使大家都能看到其中有东西,看到的东西本身往往是不一样的。你平时有没有试过在一个问题上面困扰很久,旁边一个人过来一句话就将它解决了?这是因为他的境界比你高出一层不止。
站在地上往下看,能看见直径1m的范围,有蚂蚁、落叶和浮土;站在4层楼顶上往下看,能看见直径100m的范围,有汽车、马路和绿化带;站在50层楼顶上往下看,能看见直径10000m的范围,有成片的楼群,飘过的直升机和绵延的山岭。境界不同,看到的东西就不同。
境界不同,有时候交流起来是比较困难的,同样的概念,大家的理解是不一样的,虽然可能在不同的境界中他们都正确。好多东西你觉得很新奇很给力,在更上一层的人看来,那不过是常识罢了。有人说人民日报是最真的媒体,从上面获益良多;有些老板什么电视都不看,天天就看新闻联播;而这些在愤青眼中,只不过是党欺骗P民的谎言,令人作呕。你说谁才是对的?老板看完了,能够摸到政策的动向,赚到实实在在的money;而在同样的愤青群体眼中,他们就会觉得这位受到喉舌毒害的愤青是正确的,就应该呕吐,唾弃它们,鄙视这些五毛党!慈禧年间,有个农妇和别人吹水:“老佛爷吃的煎饼,那可真不得了啊!至少一定得有锅盖那么大!”殊不知连低慈禧N个档次的人,可能都已经不知道煎饼是何物了。这就是境界不同的缘故了。我现在回想起中学学习的思想政治课,开始觉得它们不再如当初的枯燥,变得非常有道理。
技术的境界和学拳的是非常类似的,一开始你只要学会怎么用,用熟练就好,然后你开始好奇它内在是怎么实现的,开始研究它实现的机制,等你学会了这些机制,你就懂得怎么发力了,你能够将这些机制用到其他地方,招招见血啊!再然后你通过不断的思索总结,你窥到了其中的概念和原理,你悟到了它存在的理由,于是你就神明了,你悟到的这些道理,不单可以用到类似的应用场景中,还可以用到更深远的地方,甚至日常生活之中。譬如事务这个玩意,一开始你只知道它是数据库里面的一个东西,你不知道它是啥,但是上头就是要求你用它。后来你知道它怎么用了,再然后你可以搞定死锁,将它用得很帅。终于有一天,你悟到了事务原来并不是只有一种实现,它是一个概念,是一个协议,它能够达到概念和实现的分离,它可以通过二阶段提交,也可以通过补偿等方式实现,更要命的是它不单可以通过计算机搞,还可以通过手工来搞。事务协调器可以不单只是一段代码,还可以是一封Email,一张贴在墙上的纸……那你才真正明白了事务这个玩意可以怎么玩,然后再明白了怎么去根据这种思路去探索其他的东西。想象你去超市买东西,你先给了钱给收银的美女,然后你还没有踏出大门,你就后悔了——TMD怎么又买了这么多用不着的东西?你对收银MM说:“不好意思咱不买了,你退钱给我吧!”收银MM又PP又通情达理,她在POS机里面将你的消费记录XX掉,将钱退回给你,顺便还送给你一盒益达——是你的益达!这中间,就体现了一种事务的思想。你体会了这种思想,就可以一下子老了四五十岁,达到七十岁的境界,为所欲为。计算机相关的这些东西,集人类智慧之大成,研究这个而能有所感悟,真真正正能达到境界上的提高。
境界到了最高妙之处,就会由实入虚,从术而道,这时你就悟到了如何将事物的本源跟事物的存在区分开来,你能够看清楚什么是本质,什么是表象,什么是要做到的目标,而什么是具体的行为。你从本质的角度看过去,你就具有了一双慧眼,将这纷扰看得清清楚楚明明白白真真切切,这双慧眼就是做洞察力。
什么是本质呢?本质就是事物赖以存在的根本原因,若然没有这个原因,这个事物就没有存在的意义,就会消亡。所谓存在即合理,这个合理不是说的合乎情理,而是说存在都是具有它深层次的根本原因的,也就是都是有本质的。不知道你有没有注意到,很多技术书籍第一章都是介绍技术出现的历史的,之前我觉得这些罗里啰嗦,都是废话,直接翻过去直奔技术本身而去也,其实它是全书的总纲(天之道,损有余而补不足,是故虚胜实,不足胜有余……),它论述的是这种技术的存在理由,如果没有这种理由,这种技术都没必要存在了,我们还学它干毛啊。
我们来说一个普通的项目,它的本质是什么?是它复杂纠结的需求吗?是它深奥精妙的设计吗?是它完全符合CMMI5滴水不漏的流程吗?都不是,它存在的意义,就是为了能为客户产生价值,真真正正消除客户的痛处。本质和表象是很容易混杂的,要将东西乱七八糟混杂在一起很容易,要清清楚楚区分它们,将它们有条有理摆放得整整齐齐是很困难的,这里快刀斩乱麻行不通,你得抽丝剥茧,一条条分得清清楚楚,不然你永远达不到透彻的境界。
本质是虚的,表象是实的。我们很难捉摸得到虚的东西,而实实在在的东西一直围绕在我们周围,所以我们很容易就能够接受它们,然后我们很容易就被这些东西迷惑,看不到背后还存在深刻的东西。我们需要透过现象看到本质,找到它们。本质坚如磐石,相对不变,只要有存在的理由,它就一直都存在,而表象如行云流水,花开花落,一直都在改变。就如用兵,目标是求胜,这是断然不会改变的,而行军就是兵无常势,水无常形,因时制宜,随机应变。倘若我们混淆了本质和表象,追求的是表象的东西,由于表象千变万化,到头来疲于奔命,却又两手空空,最后郁闷得对天大骂:“TMD这技术变得太快了!老子跟不上不玩了!”。你应该知道,凡是觉得乱的,都是因为没有得到本质。当你具有了深邃的洞察力,你得到了本质,你就能够不役于物,你就能看清变以不变,你就不会再去盲目追求具体的行为。
当你做项目,你强调的不再是符合某个规范来做,你深深知道规范只是一种具体的行为,你关注你的目标,你能够带给客户的价值,你团队的效率。当现在的规范不符合你的项目,你就大胆裁剪它,甚至抛弃它,而不是盲目将项目往规范上靠——只因为它是CMMI的建议,你所作的一切,都是为了你的这个目标而努力。
具有洞察力,通晓变与不变,你不但能看清现在的情形,你还能看清今后的趋势,然后针对趋势采取措施。我们可以清楚地看到,技术日新月异,但人们的思想变化却不大,一部道德经,几千年下来我们的思想仍然无法突破它论述的范畴,所以我们可以利用将来可能出现的新技术,结合人们不怎么改变的思想需求,做一些东西出来——不要问我是什么东西,我想到也不会告诉你。
是不是觉得上面的这些东西都很虚很哲学?虚实只是相对的,当你达到这样的境界,你自然就会明白我说的是什么,当然,当你觉得已经知道我在说什么了,我觉得你还是可以继续再想想,后面再来看,感觉又不一样。张三丰教张无忌太极剑的时候,连续两次教招,却无一式相同。张无忌“细细体会其中圆转如意,绵绵无尽之意”,杨逍殷天正“粗略窥到这个层次”,而周颠则是“大为担心,两遍都不一样,咱们教主怎么记得住?”道理不在于讲,而是在于悟,否则讲得再多也没用,不深刻,没效果。一阵风吹过,吹过松散的茅草屋,那就是一场灾难;吹过石壁,最多也只能带走几颗细沙;吹过水面,能荡起了一圈圈的波浪;吹过风车,则产生了源源不断的电力。苹果掉到牛顿头上,就诞生了万有引力,掉到你我头上,只能产生一个包和一颗苹果核。好吧我们就不讨论假如掉的不是苹果而是椰子的事情了。上士闻道,勤而行之;中士闻道,若存若亡;下士闻道,大笑之,不笑,不足以为道。邓小平之所以喜欢看金庸的小说,称呼金庸为大师,他必然是看到了小说里面的这些道理。
虚到九天之上,还是得落地。让我们看看一些稍微实际点的东西。你水平提高了,开始做设计了,开始写设计文档,你应该写些什么?在你记录下你做出来的东西(你搞出了CDM、PDM)的时候,我觉得你还需要记录下你这样做的原因,因为随着时间推移,你设计的东西很可能不适用,但你的想法还是很有用很有参考意义的,你的想法是你CDM存在的原因。别人看你的设计文档,不单能看到死的结果,还能看到活生生的你的思想,然后延续这种思想,让设计具有生命力,能够延续下去。平时我们做需求,也要很清楚地知道什么才是真正的需求。我们来研究一下手机铃声,它表示了一种什么样的需求呢?你写下需求“我们的手机需要一种铃声”,于是,设计就产生了蜂鸣声铃声、十六和弦铃声、MP3铃声,但这就是我们的需求吗?不是的,其实你想说的是“我们需要一种提醒方式,这样在短信、或者电话到来的时候就能提醒使用者注意了”,这样就能设计出各种铃声,还有震动,还有铃声混合震动,在极端情况下,假如用户处于一个高度紧张的环境之下,很难注意到这种提醒,我们还能设计出让手机弹出一根刺,刺他一下的方式,一下不行?来多几下。记得之前看到一个闹钟的笑话:推销员对一个职员说,我们这种闹钟非常好用!它一开始放轻柔的音乐,如果还不醒,那它改放嘈杂的音乐,如果还不醒,它就往你头上洒水,再不醒,它就开始刺你。如果这样都还不醒,它就会打电话给你老板,告诉他你生病了,请假一天。这个闹钟深刻把握了自己的本质啊。
具有洞察力,我们就能根据行为和目标的契合程度,评价行为是否合理。作为技术人员,我们身边的争论随处可见,语言之争,框架之争,各种流派,各种山寨,比比皆是。“{”到底放在方法定义的最右边,还是放在方法定义的下一行呢,这可不是一件小事,这是一件很严肃的大事情,关乎信仰!从我了解的历史开始,我还没有见到任何一方说服了另外一方。面对这这样疯狂的一个世界,你怎样选择加入哪一方呢?李开复说:“Follow your heart!”我说,你首先看看你的目标,你就知道选择那一方了。譬如说开发语言,我们用它的目标是什么?假如我们需要能够很自然地去面对复杂的问题,而且开发过程中,我们需要能够飞快地利用语言的特性,构建我们的软件,那么C#就是很好的选择,用了汇编你就死翘翘,至少干十年才能把一个增删改查Web系统搞出来;假如我们需要进行很底层的开发,逻辑不复杂,但要做到精确的控制,性能是第一要义,那么你要选择汇编,甚至用刀子在硬盘上刻程序也在所不惜啊。语言之争之混乱,在于大家将目标和选择两者混为一谈,从而成功地将它们捣成了一桶浆糊。框架也是如此,我们现在的目标是什么?我们要自然,要快速开发,而且我们还需要能够扩展,那么我们评价框架的标准就很清楚了。你框架里头技术含量多么深厚,都到地核了,你用了三层架构,你共使用了23种不同的模式,你使用了微软到目前为止出现的所有技术,这些都没有意义。你做不到让我用起来那种如臂使指的感觉,你甚至阻碍我整体流的思考方式,你就说服不了我,你的框架是适用的。
到达了虚的境界之后,是不是实就没有用了呢?不是的,年轻人,看问题不能那么片面。虚和实,就相当于战略和战术,你看清楚了目标,只能说明你最高能去到什么地方,这只是一种可能。而实实在在你能够达到什么高度,是由你的战术来决定的。眼界只能决定你看到的高度,而实操才真正决定了你达到的高度。虚实到头来要结合到一起,用虚指导实,用实来实现虚,相得益彰,互为阴阳。
这个世界规律是虚的,推动世界发展实实在在的力量是实的。我们想想电灯,电脑,抽水马桶,哪一个不是实在的术创造出来的?我们看看下图的这张凳子,它就是传说中的“Aeron chair”,它具有出众的外观,具有领衔的人体工学设计,它能根据就座者不同的体重、姿势和动作进行精准的调节,与你的身体自然贴合,让你感受一整天不会疲倦的轻松自如,更有一小撮份子宣称,由于坐起来太舒服了,他们经常不知不觉加了好多次班还不知道!(广告!广告!赶快Cut掉!)对比一下我们平时坐的电脑椅呢?这就是术的差距,术的力量!当然,也在于他们把握了椅子不单只是用来坐的,而是要用来坐得非常舒服的这个道有关系。
说了那么久深度,让我们也来聊聊广度。广度也是人认识中很重要的一部分。你只有掌握了很多东西,你才能够了解到什么时候应该用什么技术。有这么一句话:“假如你是一把锤子,那么所有东西在你眼中都是钉子”。假如你只会铁锤这项技能,你只能打桩用锤,砍树用锤,连吃饭你都用锤盛着吃。好吧,你锤子练到了最高境界,达到了刚极而柔的化境,你用来吃饭一点问题都没有,可是,你真……没觉得吃相有那么一点难看么?打桩用铁锤,砍树用斧头,吃饭用筷子,耶!这样就温文尔雅得多了。
对广度的关注,也会促成转化为深度的思考,考虑不同东西的相同之处。对广度的探寻,常常会引出创新的主意,将不同的东西混合起来解决问题,是一种创新的做法;综合多种不同的思想,产生一种新的技术,就是创新的领域。近亲繁殖多产生怪胎,相距越远,就越能产生优良的品种。所以我们也要追求广度,不过要留意要达到创新的地步的话,至少在深度上面是要达到一定境界的。
你看我扯了这么多方外之言,内心在颤抖,这个行业水太深了!我是不是应该转行?你这样想。完全不必要,假如你朝着深度这条路走下去,你最终也能有这样的感悟。而且即使是其他行业,也是要有深度的,我们最终走向的将会是同一条路。
要往深度走下去,你应该怎么做呢?假如你抓住我,让我尽快提升你的境界,锤炼你的深度,我是做不到的。要做到这件事,只能靠你自己的不断思考,思考一切后面的原因。想象一个胖子需要减肥,有什么万试万灵的方式吗?假如他一天需要减十斤,我认为是搞不定的,我们只能从他身上切下一块肉,称一下——十斤!真正有效的办法是他自己运动起来,注意健康的饮食,然后长期下来,才能达到一个健康的体魄,才能有真正的精气神。
所以你的思考,就是这么一个过程,只有你自己不断思考不断突破,最终才能达到一个较高的境界。别人说的再多,你没有经过思考消化吸收,最后也没能转化为你的肌肉,提供给你力量,只会变成你的脂肪,增加你的负担,阻碍你的行动,最后还影响你对其他营养的吸收。看书本怎么说,看我怎么说,然后教条主义去运用,是行不通的,你需要将这些东西真真正正变成你自己的东西。知难行易,你可能轻易就开始行动了,却惨不透其中的道理;知易行难,知道了跑步有益身心,你却很难去坚持它。这些都是你的障碍,只能靠你自己去突破。
我们什么时候会思考?就我自己而言,我通常在看书的时候思考,在和人讨论的时候思考,在遇到困难的时候思考,在独处的时候,有时候也会发呆思考。基本上,都是思想遇到冲击的时候进行思考。所以,你如果要往更深的地方发展,要做的是从现在开始,珍惜看书的机会,珍惜和别人讨论的机会,创造机会和别人讨论(听君一席话,胜读十年书啊,八卦除外),去完成具有挑战性的任务。平时也要注意一些你觉得有思想的文章的微言大义,琢磨一下,都是能够对你思想进行冲击的,比如我之前推荐的《火星人的耳机》、《一百年后人类怎么编程》等貌似不着边际的文章。普通的解决问题的文章,讲究的是头痛医头脚痛医脚,违反中医之道,通常是很难促进你体质的提高的。书要挑经典的书,否则它说不定将你带进歧途深处,积重难返。眼中看着《金瓶梅》,脑中想着世界运转的道理,人间色相,尽是脂粉骷髅,这种境界,小弟目前修炼尚浅,是万万达不到的。
最重要的是你认识到这一点,从今天开始觉得,你应该知道。上头再跟你说“你TMD不需要知道,你只需要做就行了”,你应该认识到他说这句话,他的意思其可能是:他很忙,没空跟你说;他自己也不知道。而绝对不是你不需要知道的意思。你需要知道,从现在开始思考,开始寻找为什么吧。