如何成为一个牛逼的程序员

  作为程序员,身边总是有牛逼的前辈、后辈或者同辈。牛逼的人总是让人羡慕。比如自己苦搞一天的 BUG ,头发快抓掉完了,人家扫上两眼,改一行代码,问题就解决了;比如自己干了十年开发,薪水还不到 10K ,人家才毕业就签了 16K 的合同;比如我要天天辛苦加班工作还干不完,人家嘛事儿不干每天就喝喝咖啡,结果写出来的软件居然比我的稳定多了好用多了。这样的事情太多太多,怎么办?

陈胜起义时说:王侯将相宁有种乎!

  作为程序员,面对牛逼的同类,其实我们也可以愤而追之:大丈夫当如是也!

  有梦想有追求总是好的,关键是,如何才能牛逼起来耶?

 

程序员的分类
  早上翻看陆其明陆老师翻译的Jeff Atwood的书《高效能程序员的修炼》,里面有一篇文章,名字是《程序员的八种境界》,讲得很好,受益匪浅。不过我打算从另外一个角度为程序员分一分类。

来自古老的儒家经典《论语》的说法:"生而知之者,上也;学而知之者,次也;困而学之,又其次也;困而不学,民斯为下矣。”

  博主鲁钝,不知道谁能生而知之,我本人是困而学之,而后学而知之。一切从自我出发,窃以为困而学之、学而知之这两类,都可以牛逼起来。有兴趣的话,可以评估一下自己是哪种类型的。

 

10000个小时法则
  迈阿密大学的 AndersEricsson 教授写过一篇论文——《有目的的训练在专业人才培养中的作用》(The Role of Deliberate Practice in the Acquisition of Expert Performance),介绍了他在研究“最好的音乐家”有什么共同点时的发现:卓越的音乐家的练琴时间,没有一个人小于 10000 小时。

  2008 年,畅销书作家 Malcolm Gladwell ,将这篇论文写进了他的新书《异类:成功人士的故事》(Outliers: The Story of Success)。Malcolm Gladwell 概念化了原始论文的结论,宣称存在一个“ 10000 小时法则”(10000 hour rule),即成功至少需要 10000 个小时的投入。你造吗,这本书出版后,成为《纽约时报》畅销书排行榜的第一名。

  10000 个小时法则背后的思想是:真正决定一个人成就的,不是天分,也不是运气,而是严格的自律和高强度的付出。看到这里你可能以为博主扯淡又扯远了……其实不是的,刚开始而已,真正扯的在下面。我想很多人看过古龙大师的《边城浪子》,里面的主角是傅红雪,傅红雪的绝技是拔刀术。我靠,简单吧。苍白的手,漆黑的刀,刀过人亡,血还没见着刀又还鞘了。这就是傅红雪的拔刀、收刀之术,关键在一“快”字。天下武功,唯快不破。傅红雪的刀,已超越了速度的极限。可是你造吗,傅红雪是癫痫症患者,资质也仅仅是中等,比起叶开,那是差了一大截,比到处留情的楚香帅,也差了一大截。关键是,傅红雪永远看着都那么苦逼:在苍茫的关外,握着刀,拖着腿,背负着于己无关的血海深仇,在“一入万马堂,刀断刃,人断肠”的歌声里寻觅不是仇人的仇人。这下扯大发了,其实我想说的是,捡来的孩子傅红雪,资质平庸又身有残疾,结果却炼成了举世无双的刀法,其秘诀非常之简单,卖油翁一言概之:无他,惟手熟尔。要知道,傅红雪被不是妈妈的妈妈每天逼着练一本残缺到只有拔刀式的白家刀法,苦逼地每天拔刀两千次以上,拔了十几年,你试试,要是你拔刀拔十几年,不疯掉的话肯定也能炼成个无影刀什么的。

  傅红雪是另一个 10000 小时法则的实例。

 

爱是众妙之门
  我在前面介绍了“ 10000 小时法则”,当然那只是一个必要条件,不是充分条件。我以为要想让 10000 小时法则有效,还有一个条件。

安·兰德说过:“为了将事情做好,首先你得喜欢做这件事,而不是喜欢这件事情的结果,那仅仅是第二位。”

  想牛逼的程序员,不能仅仅盯着一个项目干完后的奖金吧,也不能老想着忙过这阵子就可以休息了吧,也不能盼着应用能 Run 就交差了吧……也不能老想着我学了 Scala 就能拿到 20K 的薪水吧……

牛逼的程序员很多是酱紫的:喜欢干,干得牛逼了,收益来了,机会多了。

  要说你不喜欢一件事情,有时被逼着也能胜任,但要说你讨厌一件事又能干得出类拔萃,那我不相信,最好你也别让我相信——我怀疑你早晚有一天会人格分裂。

  伟大的科学家爱因斯坦(晚年研究神学)说过:“兴趣是最好的老师。”这就是说,一个人一旦对某事物有了浓厚的兴趣,就会主动去求知、去探索、去实践,并在求知、探索、实践中产生愉快的情绪和体验,而这种愉快的情绪和体验反过来又会促使他继续去求知、探索、实践。这样就产生了良性循环。“成为达人”的欲求就会推动着你不断前行。

  你爱编程,享受做设计、写代码、解决问题的过程,再遵循 10000 小时法则,那你想不牛逼都难啊。

 

牛逼的方法论
  前面是开胃酸汤,现在到正题了,我们来聊聊一个程序员,要如何才能一步一步慢慢牛逼起来。

1)编码

  毫无疑问,你必须得编码,持续不断地编码,要达到一定的量。

  量变会引起质变,但不是必然。

  持续编码的结果有两个,一个是达到质变,水平不断提升;一个是重复重复再重复最终麻木。要哪个?

2)回顾与思考
  要想质变与提升,必须有目的地停下编码!只编码,不走心,那是万万不行的。不走心的程序员很多,干多少年了水平还和初干时差不多,十年如一日。走心就不一样,走心一日如十年。

  我们要周期性的回顾自己,看看以前的代码,分析下现在的设计,看看哪些可以改善,有多少种改善思路……这样就能看出以前的自己与现在的自己这两者之间的差距。如果你觉得自己以前的代码是翔,那恭喜你,你绝对提升了不少。

  要回顾以前,还要分析现在。程序员还要经常梳理一下自己的状态,看看我现在都掌握了什么技能,在哪些方向和领域有所成就,再加上对过去的回顾,看看哪些是延续性的前进,哪些是无心插柳,哪些是冤枉路,哪些是意外之喜。这样就会对自己的能力边界有所了解,知道自己知道什么,也知道自己不知道什么,更重要的是,你会发现自己能把什么东西学好用好,还能发现自己为什么可以把这些东西学好,那样你就可以找到自己擅长的方向,做得更好。

  回顾了以前,分析了现在,还要想想将来。在技术上,我要在哪些方向继续前行深入挖掘?这点非常重要。我们伫立现在,回首过去,仰望未来,这是上山的姿势啊。哈哈,上山好啊,值得期待的只有前方。

  有人说上到山顶就只有下山喽……那,这也是真的,不过,顾城有首诗《避免》可以看看:

你说

你不爱种花

因为害怕看见花一片片的凋落

所以

为了避免一切的结束

你拒绝了所有的开始

  作为有追求的程序员,我们不必这样担心吧。只管积累我们的 10000 小时去,只管思考如何有效地利用这 10000 小时去,不但过程是美丽的,将来也会是美丽的。

3)多学一点点
  台上一分钟,台下十年功。那些牛逼的程序员,无一不是付出了比普通程序员更多的精力。

  我们在开发时,会接触各种各样的新技术。有时因为项目时间原因,很多技术只能是走马观花的用,解决问题为目的,项目结束了可能就扔一边儿去了。但要想让自己有更大的成长,那我们就应该学多一点,用一分学两分,广里一分,深里一分,不能不求甚解一带而过。对于用过的技术,最好在当时,项目的间隙或者项目结束时,抽时间了解它的背景、长处、机理,让自己对用到的技术都有相当程度的了解。惟其如此,我们的知识面和技术深度,才会随着开发经验而不断递进。

4)实践新技术
  选择或者学习一门新的技术,必须要实践。可以把它应用到工作中的项目,如果工作条件限制,那也要自己定义一个自己喜欢的项目,坚持使用你的新技术做下来。唯有实践,你的新技术才能理解得更为深刻。知道有那么一门技术,与实际使用过,其间的差异可不止一点。

5)沟通

  很多人觉得程序员比较难沟通,说程序员不会好好说话……你觉得呢?

  我想说的是:要想成为牛逼的程序员,沟通一定要过硬!

  程序员是干嘛的?不是写代码的,而是解决问题的。

  解决问题才是程序员的职责。

  要解决问题,离不开沟通。

  客户会找你,市场会找你,产品经理会找你,UI设计师会找你,开发同事会找你,测试妹妹会找你,老板也会找你,女盆友会因为你的投入与执着爱上你也会在爱上你后因为这些而不断与你争执……

  哪一样离得开沟通呢?

  当然我不是说程序员要像销售、市场、营销等等岗位的兄弟姐妹们一样妙语生花,其实沟通最重要的是能听懂别人说什么,能把你想说的以对方能理解的方式说出来。至于是妙语连珠还是磕磕绊绊,是语言沟通、眼神沟通还是书面沟通,只要达到目的即可。

  有人说我天生不爱说话,跟机器打交道才觉得踏实。其实这没关系,你要找到自己的沟通方式,看怎样才能让别人理解,也调整自己的聆听和理解方式,看怎样才能理解别人说的话。

  怎样才能让别人正确理解你的话,怎样你才能正确听懂别人的话,这都需要不断的学习、练习,这方面有很多的书啊视频啊,可供参考。这没什么不好意思的啊,我认识一些朋友,觉得学习说话技巧是很不好意思的一件事儿,好像这样做就说明自己心怀鬼胎就多丢人似的。其实不必,我们的目的不是巧舌如簧地骗取别人的信任然后来谋取利益,我们的目的很简单,就是让别人理解我们也让自己理解别人。

6)理解沟通模型
  沟通这事儿真是一门学问,虽然我在这方面一向鲁钝,还是想以我们程序员的方式,打个比方来说明一下沟通模型。

  首先每个人心里都有一个 TCP Server ,监听到某个端口上,等待陌生人或者熟人或者半生不熟的人来访问。

  其次呢,不同的人对自己的端口是否开放持不同的态度,OPEN的人就会监听到知名端口,比如80、21、7、13、22、23等等,这样别人就知道我们找这个 OPEN 的家伙说事儿该连接哪个端口。当然,只开放端口还不够,灵慧的人还会慢慢把自己的协议 SHOW 给别人,这样想找他聊天的人就可以遵循这个协议来说,事情就容易多了,双方就都能理解。还有一些人呢,比较内敛,虽然内心很饥渴,希望别人找自己聊聊天谈谈心,可是不知道怎么把自己的端口开放给别人,或者出于某种原因隐藏了端口。比如他本来是监听到 21 端口上,走 FTP 协议,因为被别人通过端口扫描的方式黑了两次受了点不大不小的伤害,就小心地封掉了 21 端口,把自己的服务挪到了其它端口上,并且也不告诉别人。这就出问题了,别人找不到端口号,怎么和你沟通咧……还有一些人呢,自己也不知道该监听到哪个端口上,不能有意识的训练自己,今天是 21 ,明天就 80 ,后天又走 37 了,结果不但自己混乱,跟他打交道的兄弟姐妹们也混乱:昨天这么说还挺融洽,今天再这么说他居然翻脸了呢!这是我们每个人内心的 TCP Server 。其实每个人还有一个 UDP Server ,是为那些夹生的人或者拥有特别标签的人准备的。你可以知道我的 UDP 端口,但是你发消息过来我就不一定搭理你,被拆穿了我还可以说 UDP 协议不可靠,我没收到……。这两个 Server 就是我们每个人身上基本的沟通模型。

  最后呢,如果你要想向别人说明你的意图并让别人按你的意图去做某件事,那就要花费精力去研究如何找到对方监听的端口、使用的协议。和 OPEN 的人沟通比较容易,访问 80 端口,走 HTTP 就行了,或者夜半三更FQ过去幽会也能成。而针对那些隐藏了端口和协议的,就要启用端口扫描这种神器,扫到端口,再抓包分析协议,成功的可能性总是有的,只不过费些力气罢了。

用这种模型来解释现实生活中的沟通问题,程序员们就可以释然了:啊哈,原来我给他说的事儿他老不反应,是搞错了端口或者走错了协议。

7)表达自己
  理解了沟通模型,找到了对方的端口和协议,还有一个问题需要解决:你怎么准确地表达你的意图。

  对于相当一部分程序员,这是个难题。有的人本身就寡言少语(我是这类的);有的人很厉害,与别人说话时脑子转得比别人快几倍,脑子里转的是长长的带上下文的句子,从嘴里出来后就成了嘎嘣脆的词语,还以为自己说过了别人都能理解;有的人写代码一二三四条理清楚,说话时就比较发散,正说股票呢忽然就转到APEC蓝上了;有的人比较羞涩,大男人说话却声若蚊蝇……总之各类情况都有,你见到的绝对比想到的多。

  不管你属于哪一类,要想能顺畅地与人沟通,先要训练自己,让自己可以准确地表达。

  我是不会表达的人呢,你看我洋洋洒洒长文千字,其实我不大会说话。不过我要说的是:如果你说不好,那就想办法先写好。

  “写”这个事情,比说更容易让人条理清楚,因为写这个过程时间相对宽松,上下文简单,不像与人沟通那样你来我往还要时刻注意话外音整个过程比较复杂。所以,写,是一个很好的锻炼自我表达的手段。写作能训练你表达的准确度。

  你可以通过写博客,写日志等等手段,把自己的想法表达出来。然后呢,过一段时间,你能通过写作来表达自己的了,再回头来影响说话,你把嘴上说的当作纸上写的,多练习练习,就能准确的表达自己的意图了。你看人家领导人讲话还需要先打打草稿呢不是,更甚之的还有念稿子的。

8)找到你的小伙伴

  程序员干的是技术活,找到一个谈得来的小伙伴很重要,可以相互促进,消除登顶路上的寂寞。

  胡一刀和苗人凤就是好伙伴,两人经常切磋,水平都很高。

  可能你需要在不同的阶段找不同的伙伴,最好是找某方面比你牛的人一起研究技术,这样可以学到东西。

  或曰:牛人为毛要搭理我撒……

  “在你所有的能耐中,至少应该有一样是拿得出手的。不会做很多事情并不可怕,可怕的是没有一件事情能做好。”

  要培养自己在某方面的长处,这样就可以互补喽。

  其实有相当一部分程序员离职的一个原因是:在这个公司真的太寂寞了,都找不到一个可以讨论技术相互促进的人!

9)分享
  这个,真的很重要,千万别掖着藏着,对待向我们求助的兄弟姐妹,要像春天般的温暖……

此处略去5w字……

 

posted @ 2015-01-06 09:41  牧师/preacher  阅读(6279)  评论(6编辑  收藏  举报