高效能程序员的修炼_1
# 高效能程序员的修炼_1
知名博主和程序员Jeff Atwood力作 Coding Horror精华文章
本书是Coding Horror博客中精华文章的集合。本书的包括如下精彩话题:
- 程序员的八种境界
- 如何培养写作习惯【推荐】
- 把一堆烂事情搞定的艺术
- 避免写注释
- 你的团队能通过电梯测试吗
- 怎样招聘程序员
- 领导须以身作则
- 会议是浪费工作时间的最佳去处
- 坏苹果是团队的毒药
- 程序员的《权利法案》
- 细节决定成败
- 用户界面代表软件
- 单元测试的最终失败
- 结交“混世魔猴”
- 软件定价:我们深谙其道吗
- 程序员,你幸福吗?
# 入门须知
# 你想成为一个程序员
“不是所有程序员在他们的职业生涯中都渴望相同的东西。但是,思考一个程序员在10年、20年、30年甚至他一生的时间里所能取得的成就,还是挺有意义的!”
平心而论,我觉得大多数想要学习编程的人都是被一种盲目的信仰刺激所致,他们认为代码都是善良的、可以信手拈来。其实,你需要了解它的另一面,那就是在代码世界里还有很多悬而未决的问题,并且没有银弹这样的神秘武器去解决。如果在全面了解了利弊之后,你还是想学习编程,那就用尽一切办法开始学吧!如果在了解了那些编程的阴暗面之后,你轻易就动摇了,那么你不应该学习编程——这世上还有很多其他的事情值得你花时间去学习,它们无疑比编程更加有益并且易于实践。你可以遵循Michael Lopp的教诲,学着做个更好的沟通者。你也可以追随Gina Trapani,学习怎样才能提出更好的解决方案。依我的经验,编程只是整个解决方案中极其微小的一个部分。为何非得在这棵树上吊死呢?
在最早期的计算机上,每一个用户都必须成为程序员,因为那个时代没有任何应用软件。如果你想让计算机做点什么,你就得自己写程序。年代稍近一些的计算机,在启动以后就会直接进入BASIC解释器,它还闪动着一个略显友好的光标。
在我看来,软件开发的整个历程,就是程序员们耗尽毕生精力去编写代码,以使其他人能从代码编写工作中解脱出来(他们就不必成为程序员了),从而可以很方便地使用计算机来做他们真正需要做的事情的一个过程。因此,宣扬“每个人都需要知道如何去编程”,我认为是一种倒退!
我完全支持互联网基础知识的普及。然而,为了能成为一名好司机,是不是每个人都需要透彻地掌握汽车的工作原理呢?我们必须普及机械自动化的基础知识,并且把手工艺课提升到跟英语、数学一样重要的地位吗?对普通人来说,知道该如何换轮胎以及何时把汽车送去保养不就足够了吗?如果你家的马桶堵住了,为了把它修好,想必你不会花上两个星期的时间去toiletcademy.com学习高级水管工的课程。事实上,浏览一个简单的网页,即学即用,应该就足够了。
那么,从最抽象的意义来看,到底什么是代码呢?
代码是:
1,一组信号,用以在消息传递过程中表示字母或者数字;
2.一组有特定含义的符号、字母或者词条,使得消息传递更加保密或简洁;
3.一组符号或者规则,用以向计算机传递指令。 ——摘自《美国传统英语词典》
代码是打孔卡?远程终端?Emacs①? Textmate? Eclipse? Visual Studio? C?Ruby?JavaScript?在20世纪20年代,人们普遍认为学会如何使用滑尺是非常重要的。时至20世纪60年代,机械制图又登上了神坛。而如今,这些知识都已经不再重要了。除了那些在“Code: The Hidden Language of Computer Hardware and Software”(代码:计算机硬件和软件的隐语)一文中提到的,我不太愿意向别人推荐任何特定的编程方法。因为我不确定再过20年或者30年,编程是否还会是现在这个形态。对于现在的孩子们,将来他们的编程可能就像玩《我的世界》或者《传送门2》⑤之类的游戏那样··
但是,每个人都应该试着写上一小段程序,因为这在一定程度上会使你的思维变得更为犀利,是不是呢?
或者大胆试想一下,也许把《大英百科全书》从头到尾完整地读一遍也能达到同样的效果。说实话,我更建议人们先花些时间去想想,什么样的问题才是他们真正热爱和感兴趣的,然后再好好研究研究这些问题。生命中最困难的,是想清楚你真正想要做的事情,而不是学上一堆假设将来会有用的东西。如果说你的研究和探索最终引领你走上了编程之路,那就用尽一切方法去学习吧,我的祝福与你同在..·当然,我的祝福你听听也就算了,它帮不了你。
所以,我绝对不会提倡为了学编程而学编程。我鼓励的是毫无保留地追求你的快乐。举个例子,我曾经收到过这样一封电子邮件:
我是一名律师〈兼注册会计师〉,现年45岁,正试图尽快放弃目前的律师职业, 并全力以赴寻找我的下一个事业。事实上,我雇用了专业人士来帮我做这件事。作 为“寻找自我”环节的第一步,他们让我回顾我那漫长而又曲折的职业生涯,找到 那些在我的职业生活中我真正享受工作的时刻。
作为一个工作在个人电脑革命时代的会计师(当我在安达信会计师事务所开始 我的第一份工作的时候,我们甚至会为手动更新资产折旧计划表而向客户收取费 用X我花了很多时间学习如何使用电脑、打印机和应用软件(有人用过丨^1〇 吗而当我受聘为一家大型医疗系统的健康保障计划财务分析师的时候,这些准 信息技术相关的事情在我工作中的比重达到了顶峰。在我开始那份工作的第一天, 我发现我的前任仅仅留给我一页静态的电子数据表,传说它可以用来为一个 有7家医院的医疗机构“分析”一份涉及数百万美元的托管保障合同。没办法,我 只能开始构建我自己的电子数据表,但是它很快就超出了数据库功能的容限。 因此我只能自学八00655。接下来很快又把八00以5电子数据表方面的功能利用到了 极限~~我需要调出成千上万条病患数据记录,套用特定的计算公式,最终得出结 论:在假定完全相同的使用情况下,我们从签署的合同中所能得到的付款会更多还 是更少。
不得不承认,从任何专业的角度来看,我当时的工作都不是编程。我想办法让 八00以8做到了 一些微软的技术支持人员告诉我八00以5做不到的事情。但我也仅仅 是使用最基本的控制命令,来让一个现有的应用程序服从于我的意志。我依然清晰 地记得,我当时很快乐。我每天花12〜14个小时往公式单元格里输入无限嵌套的 命令,我是那样的兴奋,以至于当我不得不停下来休息的时候,我会感到非常失落。
我创造了那个“怪物”并且让它为我效力的经历,至今仍是最能让我感到满足 的职业成就,即便我后来担任了另外一家健康保障机构的首席财务官(一个当时可 以满足我所有职业抱负的成就〉,都无法与之相比。不仅仅是因为那些工作,还有在 我尝试、失败、尝试、调试、孜孜不倦地构建那个基于数据库的大家伙的过程中, 所认识的那群志同道合的分析师和系统管理员。我知道了复活节彩蛋和那些编程的 学问,并且破解进入了医院的主服务器。以我当时的收入水平,那台主机的价格已经远远超出了我所能承受的范围。遗憾的是,我后来还是选择了继续追求我所谓的“职业目标”,并且最终在我憎恨的职业中做着我厌恶的工作。”
上面例子中的这个人,第一,他碰到了自己感兴趣的问题;第二,他尝试着解决问题;(最终很自然地)第三,问题引领着他去学习编程。而且,他热爱编程。事情也理应如此。我并不是因为有人告诉我学习编程很重要才成为程序员的;我成为程序员是因为我想改变我所玩电脑游戏的规则,而学习编程是唯一的途径。一路走过来,我也爱上了编程。
我只是想说,如今我再一次站到了人生的十字路口,在干着准编程工作的那些日子里,虽然平平淡淡,但我却非常享受我的工作。我心里仍然能听到来自它们的“塞壬之歌“。
塞壬(Siren):来源于古希腊神话传说,在神话中她被塑造成一个人面鸟身的海妖,飞翔在大海上,拥有天籁般的歌喉,常用歌声诱惑过路的航海者而使航船触礁沉没,船员则成为塞壬的腹中餐。
我想问你的是,你觉得像我这把年纪的人,还能学习编程并且达到一个让别人雇用我的水平吗?我并不想一边在纽约城里忙碌奔波,一边又只把编程当作一个副业。恰恰相反,我完完全全真诚地希望变成一个善良的程序员,并用我的时间来创造一些有价值的东西。
遗憾的是,以程序员自居会使你的职业生涯受到诸多限制,特别是对一个曾经担任过首席财务官的成功人士来说,这个转变可不算小。跟钱打交道的人往往会挣很多钱--看看华尔街就知道了。
然而,这不是钱的问题,对不对?我们要说的是“热爱”。如果你想成为一个程序员,你只需追随你快乐的感觉,并且爱上代码。真正的程序员很快会结交到其他一些真诚的善男信女--一些像他们一样毫无保留、疯狂地热爱代码的人。欢迎来到程序员的部落!
如果你在读这篇文章,并且在想,“让这个 JeffAtwood 见鬼去吧,他到底是谁呀,凭什么对我是否应该学编程说三道四?”而我想对你说的是:“好样的,你应该具备这种独立思考的精神!
”
# 程序员的八种境界
在求职的时候,相信很多人都被问过这样的问题:“你对自己未来5年的职业是怎样规划的?”每当我被问及这个问题的时候,我的脑海里总是会浮现出TwistedSister①乐队在1984年拍摄的一段视频里的这个场景:一位老师对着他的学生大喊, “我想要你告诉我,不,是告诉全班同学,你究竟想过怎样的生活?”
Twisted Sister 是一支源自美国纽约的摇滚乐队,成立于20世纪70年代早期。后来经过将近10年的奋斗,他们在20世纪80年代初有了较大的突破。然而,由于他们的叛逆形象和古 怪行为,在他们最风光的时候,被美国政府看作是重金属毒害青少年的一个典型例子,于 1988年被迫解散。——译者注
你自然会想:我要变得很牛!至少也得成为一个很牛的程序员。尽管这个问题看起来并不像其他一些同样老掉牙的问题那么严肃(如“你觉得你最大的弱点是什么?”),但很可能你还是觉得难以回答。也许有时候你表现得太牛了,不屑于回答这样的问题。但要小心了,你可能会冒犯别人。
在我看来,这个问题同样是一个相当严肃的问题,值得好好思考一番。不是为了应付面试官,而是为了你自己。
对于这个问题,大部分人都会选择一个不痛不痒的回答来敷衍面试官。但它也确实引出了一个更为深层次的问题:一个软件开发人员究竟该有怎样的职业生涯?当然,我们选择这一行是因为我们喜欢这一行,并且幸运地得到了老天的眷顾,让我们干上了这一行。但你能在50岁的时候依然坐在电脑前敲代码吗?60岁呢?所以,我们得趁年轻的时候好好思考一下这个问题:作为一个程序员,最完美的职业生涯应该是什么样的?
那我就来告诉你吧:世界上的程序员大致有8种境界.
# 1.不朽的程序员
这是最高境界!虽然人已经离开这个世界,但是他的代码却依然活着。他成为计算机博物馆中的一个永久收藏。其他为数众多的程序员都在学习他的作品。他在生前可能获得过图灵奖,或者发表了大量有影响力的论文,或者发明了一些影响到计算机专业课程设置的基础技术。他已经不仅仅拥有一个维基百科的条目;事实上,有很多专门的网站都在讲述他的作品以及他的生平事迹。
在有生之年能够达到这一境界的程序员屈指可数。
代表人物:Dijkstra,Knuth,Kay。
# 2.成功的程序员
成功的程序员不仅拥有广泛的知名度,同时还运营着一个不错的公司,甚至控制了整个产业链。他们拥有绝对的自由,可以做任何自己想做的事情。他们同时还拥有把“自由”带给广大程序员同胞的梦想。
这一境界的程序员最受人美慕。要达到这一境界,更多的是需要商业上的才能而不是编程能力。
代表人物:比尔·盖茨,Carmack,DHH。
# 3.知名程序员
达到这一境界的程序员也不错,当然,前提是你得有一份不错的工作。
这个境界的程序员虽然在圈子里很有名,但是成为名人并不意味着可以靠这个赚取收入并且养活自己。出名固然不错,但成功更为关键。你可能在一家非常知名的大型技术公司工作,也可能在一家很有影响力的小公司或者是在一个很有希望的创业团队工作。不管怎么样,其他的程序员都或多或少地听说过你,并且你对自己所在的领域有着积极的影响。
# 4.胜任的程序员
作为一名软件工程师你非常成功,你的能力使你在工作中游刃有余。你从来不会为得到一份满意的工作而发愁。你的同事也非常尊敬你。每一家你曾经工作过的公司都因为你的加盟而在某些方面得到了提升。
但问题是:接下来你将何去何从?
# 5.普通程序员
这个境界的程序员基本上能够应付一般的编程工作。他们自己也很清楚,由于天资所限,他们很难成为杰出的程序员。
其实,天赋跟成功的关系并不大。如果你有敏锐的商业嗅觉和不错的人际交往能力,你依然可以变得很成功。如果你是一个普通的程序员,但你还能靠这一行当过上不错的生活,这已经说明你是很有才的,只是你不必非得干程序员这一行。
人贵有自知之名。通常你的能力都会比你自认为的要低。缺乏天赋并不是什么大不了的事情。要勇敢一点,发掘自己的特长,并且充分加以发挥。
# 6.业余程序员
业余程序员通常都热衷于编码。他们可能是一些很有前途的学生或实习生,也可能正在参与某些开源项目,或者利用个人闲暇时间开发一些“好玩的”应用程序或网站。从他们的代码和创意可以看出,他们是一群很有想法、充满激情的人。
成为一名业余程序员是件好事。这个境界的程序员可以通过自我提升,迅速地胜任程序员这个职业。
# 7.低调的程序员
还有一些坊间流传的比较有个性的程序员,如JoeCoder,很有能力但是没什么令世人瞩目的成就。他们可能服务于某家大型公司。对于这些人来说,写代码仅仅是份工作而已,并非他们生活的全部。这没什么错,挺好的!
# 8.烂程序员
这个级别的程序员技能极其匮乏(已无境界可言),他们通常是阴差阳错地干上这一行的。他们所做的任何事情都会给他们的同事带来痛苦和灾难--当然可能也有一个例外,就是他们的同事也是一帮差劲的程序员,差到连身边全是一帮烂程序员都意识不到。
如果要给烂程序员下一个定义的话,那就是:没有金刚钻,却偏偏揽了瓷器活.
应该承认,以上所有的这些境界定义得并不严谨。事实上,并不是所有的程序员在他们的职业生涯中都渴望相同的东西。思考一个程序员在 10年、20年、30年甚至一生的时间里所能取得的成就,是非常有意义的!想一想,你最崇拜哪个程序员?到底是他的什么成就,使得你对他如此地崇拜?
总之,你究竟想要过怎样的生活?
# 如何培养写作习惯
我得忏悔一下:程序员同胞们,从某种程度上来说,我创办的 Stack Overflow网站“耍”了大家。
在你找来棍棒准备揍我之前,请允许我先解释一下,
在过去的6年时间里,我越来越坚定地有了这样一个想法,那就是:成为一名杰出的程序员其实跟写代码没有太大的关系。做程序员确实需要一些技能,当然,还要有坚韧不拔的精神。但除此之外,更重要的还是要有良好的沟通技巧。
杰出的程序员跟勉强过得去的程序员之间的差别,不在于他们掌握了多少种编程语言,也不在于他们谁更擅长 Python 或 Java。真正的关键是,他们能不能把他们的想法表达清楚。杰出的程序员通过说服别人来达成协作。通过清晰的注释和技术文档,他们让其他程序员能够读懂他们的代码,这也意味着其他程序员能够重用他们的代码,而不必重新去写。要不然,他们所写的代码的价值就大打折扣了。
以上是我的合伙人 Joel Spolsky 说过的一段话。我对他的这个观点非常赞赏!
程序员们可能会争辩道:与人沟通本来就不是我们的长项;我们并不是因为热爱跟别人聊天才做软件开发这一行的。然而,沟通从来就是个问题,书面沟通尤其困难。既然我们选择了这个行业,还是想想如何在这方面有所提高吧!我觉得写博客是个好方法:
人们需要花一生的时间去学习如何有效地写作。这事没有捷径。这东西你也买不来。你必须自己去提高。
这也正是那些担心自己写作不行的人应该开始写博客的原因.
这是一种锻炼。不管现在的你多么不靠谱,只要你每周练习几次,就一定会有所提高。博客不用太长,坚持每周写几个,你一定能越写越好。但如果你因为写作恐惧症而不这么做,那么,你很可能永远就这样了(别想成为杰出的程序员)!
大家都知道我抱有极大的善意,但只是单纯地对一个人说“你应该写博客,他是不会理你的。对此我有切身体会。并不是所有的人都适合写博客。对于个普通程序员来说,要他写一篇哪怕是很短的文章,都是一项不可能完成的任务,就像要他的命一样。那么,我该怎样让广大程序员自觉地写博客、培养起写作习惯呢?
连哄带骗呗,别无他法!
大家来看看我曾经收到过的这封信吧:
我不知道你有没有意识到 Stack Overflow 的边际效应,不过,这个网站确确实实教会了我很多有效写作的方法,比我从以前听过的任何课程、读过的任何书,或参加过的任何其他活动中学到的都要多.
我想不出还有什么其他工具,可以用来检测我写的东西,并且如此迅速地对它的质量给出反馈。当我在 Stack Overflow 上回答问题的时候,特别是做一些高质量的技术纠错时,我能看到其他人也在努力,所有的回复放在一起,差别自现。大家的投票是不会骗人的。他们给了我信心,让我确信将来我发给同事的电子邮件会在多大程度上被接受,也有助于我把商业企划做得更好。
在过去的5个月时间里,我可以察觉到自己写的回复在质量上的稳步提升。如果我的回复没被选为最佳答案,我会去看别人的回复,然后去研究原因。我会想:也许我写得太啰唆了?也许太简练了?也许我没有抓住问题的关键,或者没有一针见血?
我记得你曾经说过,这么多年来你一直在 Coding Horror 发表博文,这极大地提升了你的写作能力。我想告诉你,StackOverflow对于我来说起到了相同的作用因此我要由衷地感谢你。我决定效仿你,开设一个我自己的关于编程的博客。今天我刚刚完成了域名注册。我希望它能像 Stack Overflow 一样出色。没有哪个评论家会像程序员那样,对每个细节都创根问底,拼命地想从你说的话中或者语法结构中找出纰漏。如果你写的东西能够被广大程序员接受,那么你将能经得起任何读者的考验。
Joel 和我一直把 Stack Overflow 以及其他所有的 Stack Exchange 问答网站定位为轻量级的、专注的、不失趣味的写作型网站。
没错,凭良心说,我们是在“诱导”你成为一个更棒的写手。事实证明,这很奏效!Stack Overflow 拥有很多非常明显的像游戏一样的元素,能为你的进步助力,也能使互联网变得更加美好。更重要的是,它使你变得更为出色!看着广大程序员跟他们的同伴们聚集在一起,在专设的专家问答社区里自然而然地提高了他们的书面沟通能力,我真是无比自豪!
还有其他的一些兄弟社区,它们同样对编程以外的写作推崇备至。在那里,你可以自由地锻炼你的文笔。我们也有这样的网站。
如果你是一名作家、编辑、评论员、博主、撰稿人,或者有志于任何方面写作的人,职业的或非职业的,都可以去看看 writers.stackexchange.com。不管你是做什么的,有效写作都是推进你的职业生涯发展的一种基础性技能,必须加以重视!
再说一遍,你应该写作!我觉得 Jon Skeet 总结得非常好:
每个人都应该大量地写作,不管是撰写博客、写书、回复 Stack Overflow 上的问题、写电子邮件,还是写其他的什么东西。写下来,然后回过头去斟酌一下。依我的经验,这种书面沟通有助于理清我们的思路。当你要向其他人详细解释某样东西的时候,你会惊讶地发现你自己有多无知。于是,你不得不开始一个全新的探索过程。
写作的过程真的就是一次探索之旅,而且它会贯穿人的一生。至于你是在写一篇小说、写印刷评论、回复 Stack Overflow 上的问题、创作漫画故事、写博客、写一段注释、写技术白皮书、写旅游日志或者是写关于写作本身的文章,这些真的都无关紧要。动手吧,开始写起来!
# 把一堆烂事情搞定的艺术
学海无边
作者在 Twitter 上发的一条短讯:
“每一天,你一定要一起床就热情澎湃。否则,你就只是在打工。”
-------------------------3:51 PM-2012-5-1
在我们创办 Stack Overflow 网站之后,有些人不得不承认:我们创建了一个还过得去的“捕鼠器”,把大家都吸引到那里去提出和回答问题。情理之中的猜测也随之而来:我们是否可以用你们的引擎来创建一个关于各种主题的问答网站呢?我们的答案就是 Stack Exchange。如果每月付我们 129 美元(或者更多),你也可以在我们的引擎上组建一个问答社区--针对你喜欢的任何主题。
好吧,我得忏悔一下:我的心思从来就没在 Stack Exchange 上。它是一个在平行世界里的并行工作,和我自己的“事业”只擦一点点边。有很多理由来解释其中的原因,但是如果非得用一句话来概括,我会说金钱对于社区是有毒的。每月 129 美元听起来并不多--事实上也不多--但我们毕竟成立了公司,它的商业本质从一开始就渗透并扭曲了所有这一切。
毋庸置疑,Stack Overflow Internet Services Incorporated©®TM严格地说是一家商业公司--它甚至现在还拿到了风险投资--但是,我当初(和 Joel Spolsky 一起)创办它并不是为了挣钱。我的初衷是想做一些很酷的东西来让互联网变得更好。没错,并非只是我一己之力,我还将身边所有的程序员同伴都联合了起来,因为我知道我们中间总有些人能在别人混沌的时候保持清醒。
没有人是为了挣钱才来参与 Stack Overflow 的。我们参与 Stack Overflow 的原因是:
- 我们热爱编程;
- 我们想把自己的“面包屑小道”留给其他程序员,这样他们就可以避免犯我们曾经犯过的愚蠢错误;
- 教同伴是提高我们自己的专业水平最好的途径之一;
- 我们可以让兴趣自由地引领我们去任何地方;
- 我们想要贡献自己微薄的力量,一起为社区创造伟大的东西.
我不在乎你付我多少钱,当我向社区里的同伴展示我对技能的精通时,那份难以置信的满足感是你永远也无法复制的。这就是我们在 Stack Overflow 上所做的事情:玩得开心,同时让互联网每天都一点一点变得更好。
如果有人说 Stack Overflow 比做他们的本职工作更能让人感到满足,你会觉得奇怪吗?我反正一点儿都不诧异。
如果你听着这些像是一堆无稽之谈,我能够理解。整件事情很难解释。但是事实上有很多科学研究都已经证明了这些奇妙的动机。让我们从 Dan Pink°在 2009年做的TED演讲开始吧。
DanielH. Pink(丹尼尔·平克)是美国的一位畅销书作家,他还是《纽约时报》、《哈佛商业评论》、《快公司》和《连线》杂志的撰稿人,美国前副总统戈尔及白宫行政部门演讲稿撰写人。他在世界各大公司、大学院校以及各种协会进行演讲,讨论有关经济变革和创造新型工作环境的话题。主要著作有:《全新思维》、《自由工作者的国度》、《菜鸟职场物语》、《未来在等待的人才》等。--译者注
Dan"的演讲围绕着“蜡烛问题”展开。假如给你下面3样东西:
- 一根蜡烛
- 一盒图钉
- 一盒火柴
你怎样才能将蜡烛粘到墙上去?
这个问题本身并不是很有趣,事实上也确实如此。但如果你尝试以激励的方式让团队去解决这个问题,结果就变得很有趣了:
来自普林斯顿°的一位名叫 Sam Glucksberg 的科学家,做了一个关于蜡烛问题的实验。现在我想给你们介绍一下这个实验。他是这么做的:
面对第一组人,他说:“我会为你们计时,以统计出通常情况下人们解决这类问题所需时间的平均值。”
面对第二组人,他说:“如果有人解决这个问题的速度在最快的 25%之内,这些人能得到5美元的奖励。另外,今天在这里参加测试的所有人当中最快的那位将得到 20 美元。”(这是很多年前的事了。如果考虑通货膨胀,对于几分钟的工作而言,这报酬已经是很不错的了!)
接下来的问题是:第二组解决问题的速度(比第一组)快多少?
结果让人大吃一惊:平均而言,他们解决这个问题的时间(比第一组)多3分30 秒。多3分30秒啊!这看起来完全没有道理。不是吗?我是说,我是一个美国人我相信自由市场。这结果完全出乎我们的预料。如果你想让人们做得更好,你就给他们报酬。可以给他们奖金、提成,让他们“人尽其才,才尽其用”。用物质奖励来刺激他们。这就是商业的运作方式。但是,这个实验展示给我们的却不是这样。你用一个与金钱相关的激励方法来提高思维能力、加速创新,然而这样的方法起到的作用恰恰相反--它让思维变得迟钝并且阻碍创新。
事实证明,传统的“胡萝卜加大棒”的激励方式仅仅对于那些重复的、机械性的任务有效。一旦你要做的事情稍微复杂一点,而你需要解决哪怕很小但又没有现成的解决方案或无规律可循的问题时,这些基于物质的激励方式不但没有效果反而会把事情弄得更糟。
Dan Pink 最终把这个主题写成了一本书:《驱动力(在奖励与惩罚都已失效的当下,如何焕发人的热情)》(《Drive:The Surprising Truth About What MotivatesUs》)。
你并不需要去读这本书。下面这个充满智慧的白板动画,能在短短 10分钟之内让你快速了解 Dan Pink 的主要观点。如果你今天只想看一个视频,那就看它吧
这段视频在 YouTube 上可以找到:http://www.youtube.com/watch?v=u6XAPnuFiJc。--译者注
内在激励的概念或许并不是新提出的,但是我发现,很少有公司有足够的勇气去真正实行它。
在建设我自己的团队时,我竭尽全力不违背当年创办 Stack Overflow 的初衷我不在乎你什么时候来上班,或者你如何安排你的时间。我不在乎你住在世界的哪个角落(前提是你能快速地接入互联网)。我不在乎你怎么做你的工作。我不会事无巨细样样过问,然后分配给你一大堆任务。这些都没有必要。
如果你想造一艘船,就不要催着工人们去收集木材,分派工作,发号施令。你应该教会他们的是对无边无际大海的渴望。
————————————Antoine de Saint-Exupéry
因为我知道,你和我们一样,渴望着无边无际的大海。
# 磨刀不误砍柴工
作为一名软件开发人员,你该如何磨快你的锯子?
“磨锯子”实际上是一个代名词,泛指一切编程以外的活动(不必编写代码)而这些活动(从理论上来说)能使你成为一名更出色的程序员。这个词源自于Covey 的一本书:《高效能人士的7个习惯》(《The 7 Habits of Highly EffectivePeople》)。
有个人在山间漫步,偶遇一位伐木工。他便停下来观察这位伐木工,看他热火朝天地锯一棵很大的树。他发现这位伐木工干得大汗淋漓,不停地锯来锯去,但是没有丝毫进展。这个过路人注意到伐木工所使用的锯子已经和黄油刀一样钝了。于是,他就对伐木工说:“不好意思,伐木工先生,我看着你已经很使劲地在锯那棵树了,但为什么进展不大呀?”伐木工回答道:“是呀……我也知道。不过,看起来这棵树不好对付啊!”此时,汗正从他的眉毛间滴落下来。过路人于是提醒道:“伐木工先生,这不是树的问题,是你的锯子太钝了。这么钝的锯子什么东西也锯不断的!”“我知道。”伐木工回答,“但是,我连锯树都忙不过来,哪有时间磨锯子啊!”
大家都知道,如果想要在某方面有所提高,最好的办法就是勤加练习。但是,如果你只顾着埋头写代码,连讨论、反思或者学习的时间都没有,将得不到真正的进步。你必须在磨炼工艺与思考如何提高工艺之间找到一个适当的平衡点。
我们应该鼓励开发团队里的每个成员都先去磨快他们的锯子。正所谓磨刀不误砍柴工。在这方面,Scott Hanselman 有一些很不错的建议。其实还有个更简单的方法,就是你此刻正在做的事情:阅读编程相关的博客或书籍。如果你有一个开放的心态,你可以用这种方法来磨快你的锯子,正如ReginaldBraithwaite 所述:
我们通常是这样做的:每当读起一篇博文,我们会把我们认同的内容一点一点读下去,而只要有一个论点不符合我们自己的世界观,我们就会很较真。如果整篇文章的主题都跟我们的成见相左,我们就会大骂作者是个白痴。老实说,如果让我们去做销售,结果会一塌糊涂,因为我们一碰到不认同我们的人就会匆匆放弃。
我建议我们要向销售人员学习。当我们在读一篇帖子,或者一本书,或者学习一门新的语言时,我们应该假定它的某些部分(甚至绝大部分)并不新颖。让我们假设我们肯定会讨厌它的某些部分。与此同时,我们也要从自身利益出发去考虑:如果我们能从中找到哪怕只有一点对我们有用的东西(它能让我们变成更好的程序员),我们就已经赚了。
这就是我们对一篇博文应有的期待。明白这一点很重要!如果一篇帖子中能有一样有价值的东西,我们就赚大了。其实我们不该这么贪心--只要我们在读了100 篇帖子后能学到一样有价值的新东西,我们就已经赚大了。
如果你正在寻找优秀的编程博客来磨快你的锯子(或者至少能激发你的潜力和兴趣),我可以向你推荐两个很棒的专门针对编程的链接聚合网站,相信它们一定可以帮助你。
一个是 Hacker News(http://news.ycombinator.com)。我强烈推荐这个网站。
Hacker News 是 Paul Graham"想出来的,所以这个网站多多少少反映了他在Y Combinator 的投资兴趣,以及他对诸如创业公司、企业事务之类的关注。Paul对网站内容的审阅是非常认真的,因此除了那个很有代表性的摇滚(Diggy-style投票机制外,还有一个由他亲自挑选的编辑组成的秘密集团(我喜欢把他们想象成忍者黑帮◎,“没有人会承认他们仍然存在!”)他们会删除标记过的帖子。更重要的是,这个网站上关于文章内容的讨论都非常理性,几乎没有任何嘈杂声和骂战。
另外一个是 programming reddit(http://www.reddit.com/r/programming)。相比之下,那里的讨论更加杂乱,像狂野的西部,任何事情都变得很敏感,而且它仅靠社区里或顶或踩的投票机制来把关。不过,我们往往能从这个网站发掘出各种各样程序员特别感兴趣的链接。
当然,过多地磨锯子,或者随意地、没有目标地磨锯子,会变成另外一种形式的延误。然而,如果一个程序员对这些完全不感兴趣,那也是一个巨大的危险信号。就像 Peter Bregman 说的那样,“痴迷可以是一件好事”:
人们成功常常不是因为他们克服了自己的机能障碍,反而是这些障碍成就了他们痴迷是通向成功的一个最明显的风向标。如果理解了一个人的痴迷,你就会理解他最自然的动机--他会为之坚持走到世界的尽头。
对磨锯子有些痴迷是没有问题的,但前提是,你的痴迷是类似Hackers News的网站上积极地提交和讨论与编程相关的文章。
作为一名程序员,你对如何磨快锯子有更好的建议吗?
# 一路向前冲
就运营 Stack Overflow 这个公司而言,我采用的商业策略全来自一个人,而且只有这一个人:Curtis Armstrong。
更准确地说,是 Curtis Armstrong 在 1985 年的经典荒诞青春喜剧《再见人生》(《Better OfDead》)中所扮演的 Charles DeMar。当他被问到如何从一个特别险峻的高山上滑雪下去的时候,他回答道:
沿着那条路下去,一定要快。如果有什么东西挡住了你的去路……绕开它
在我们宣布 Stack Overflow 公司成立之后的5个月时间里,我们完成了下面这些事情:
- 组建了一支国际化的团队;
- 在 Area 51上制定了新建问答网站所需遵循的一个全新的民主开放流程!发布了大约 24个社区驱动的 Stack Exchange 网络子站点;
- 为每个站点实现了独立的“元”@(meta)讨论以及实时聊天功能;
- 发布了新版本的 Careers(职业生涯)和 Jobs(工作)子站点;
- 开发并开源了 Stack Exchange 数据浏览工具(http://data.stackexchange.com),方便用户查看和分享我们收集到的所有数据:
- 敲定了 Stack Exchange 应用程序编程接口的第一个版本。通过使用这些接口,你可以基于我们的问答平台来构建你自己的应用,
坦率地说,我还是有些担心我们走得不够快……
现在市面上已经出现了一些 Stack Overflow 引擎的复制品。我想说他们干得不错!我为能创造出一些值得复制的东西而感到骄傲。如果我们仅能做到帮助整个世界远离那些老旧的、破损严重而叽嘎乱响的、类似于 phpBB®和 vBulletin@那样的公告牌系统--从那里获取信息就像在一条奔流不息的臭水沟里淘金一样--那已经是我的奢望了。
作为一个公司,我们的既定目标是要与网络世界和谐共生,我们的使命是让互联网变得更好(哪怕我们只能带来一些细微的改进)。我发誓,这是真的!我们把它白纸黑字写下来了,并且时时处处都在践行。我们没曾想过要推翻谁或者占有什么东西。我们只是热爱社区,并且乐于为我们的问题找到完美的答案。所以在这个过程中,如果有任何东西挡住了我们的路,请放心,我们不会大打出手。我们会绕开。然后继续向前,快速进步。因此,如果那些抄袭者想要跟上我们的话,他们也得行动快点。
我想,也许只有我们公司才会把 Charles DeMar 当成业务顾问,但“贵在神速”策略绝不是我们首创的。例如,Google的某些项目看起来就深得“博伊德®迭代法则”的精髓。
博伊德认为,空战中取胜的主要决定因素不是观察、定向、计划以及更好地执行,而是观察、定向、计划以及更快地执行。换句话说,能不能取胜就看人们能够多快地执行迭代。博伊德暗示,迭代的速度胜过迭代的质量。
说起迭代的速度,大家肯定会想到 Google Chrome。
version | Time |
---|---|
1.0 | 2008年12月11日 |
2.0 | 2009年5月24 日 |
3.0 | 2009年10月12日 |
4.0 | 2010年1月25日 |
5.0 | 2010年5月25日 |
6.0 | 2010年9月2日 |
Chrome 的第一版和第二版已经是一个相当不错的浏览器了。整个项目一直在以一种很快的速度向前推进。结果呢?恕我直言,目前它已经是这个星球上最好的浏览器了。Google 一开始并没有浏览器产品,而是平地起高楼,前后才用了不到两年的时间。值得注意的是,微软的 浏览器从第七版升级到第八版所用的时间却比 Chrome 的整个开发过程还要长。而到IE9发布的时候--尽管它看起来像是微软产品史上最好的一款浏览器,也是最给力的一次技术升级--但它一推出就会被 Firefox 和 Chrome 完全比下去。
作者的这篇文章写于2010年9月,而微软的IE9是在2011年3月发布的。也就是说,作者写这篇文章的时候 I9还没发布。--译者注
Google 的 Android”项目是另一个极好的例子。Android 不一定非得比 iPhone好(事实上它也肯定比不上 iPhone;它一直表现平平,直到最近的几个版本才有所起色)。但这不要紧,他们只需以更快的速度去改进。Google 以令人难以置信的、极快的速度推出了 Froyo,Gingerbread,Honeycomb 等多个版本。没错,苹果有更好的品位(这个无可争议),而且它把用户体验也做到了极致。不过,如果按照苹果现在的进展速度,它在几年以后的移动产品领域里就只能做 Google 的陪衬了这是必然的!
所以,除非我另作声明,否则我们就会遵循跟 Android 和 Chrome 团队一样的策略。我们会沿着那条路,非常快地向前冲。如果有东西挡住了去路,我们就会绕开它!
Tim O’Reilly@timoreilly 在 Twitter 上发的一条短讯:
“[arry Page”对'决策的速度和正确性之间的相互关系’是这么评论的:只有又快又好的决定,而在反应迟缓的情况下不可能做出好的决定来。”
3:40 PM-2011-9-27