程序员的职业素养
不想成为优秀程序员的码农,那和咸鱼有什么区别?李清照有句诗:生当作人杰,死亦为鬼雄。也许我们不必、也可能永远都不会是最优秀的程序员,但我们至少可以成为一名职业的程序员。我们也想成为一名专业人士。
Chapter 1. 专业主义
作为一名“专业人士”,不仅仅是一种荣耀,它更多的意味着义务,正所谓欲戴王冠,必承其重。当项目中有某个“临时工”犯了错误,他大可不必承担责任,只需要摊摊手,说几句自我安慰的话;如果是“职业”人员,你必须为自己写的每一行代码负责,出了bug必须承担相应的责任。
“职业”的程序员也应当有自己的职业道德,Bob大叔把它概括为以下8点:
- 了解你的领域
- 坚持学习
- 练习
- 合作
- 辅导
- 了解业务领域
- 与雇主/客户保持一致
- 谦逊
Chapter 2. Say No
职业的程序员敢于与现实抗争,敢于说“不”。尤达说过:“能就是能,不能就是不能。不要说‘试试看’”。如果某项任务你无法胜任,拒绝接受总比临近交付日期才告诉产品经理你无法完成好;同样的,如果没办法在某个时间内完成,就不要说“试试看”。试试看意味着你会尝试着去完成,而大多数人都是乐观主义者,这样说无异于一种承诺。碍于情面的人也许觉得不妥,需要指出的是:“say no”并不意味着拒绝合作,而且为了团队更好的发展。
Chapter 3. Say Yes
如果你觉得“say no”让你很难为情,那么,“say yes”(做出承诺)也很有挑战性。做出承诺包含了三个步骤:
- 口头上说自己将会去做
- 心里认真对待做出的承诺
- 真正付诸行动
“职业的”程序员对自己做出的承诺会做到言必行,行必果,甚至承担相应的责任,职场上可不允许随便说说而已。
Chapter 4. 编码
“职业的”程序员应该具备良好的编码能力。代码要整洁、符合规范,特别是在赶进度的情况下。Bob大叔在《Clean Code》(《代码的整洁之道》)中说到,一个外科医生不会因为时间紧急而答应病人的请求——不要洗手就做手术,因为这样并不是职业的做法(更别说犯罪)。同样地,职业的程序员不会因为时间紧急就写出混乱的代码或者上百行代码的函数,这样谈不上快,只会让进度更加慢。整洁的代码也需要从平时不断的训练养成,这方面的书有《The Art of Readable Code》、Bob大叔的《Clean Code》、《Code Complete》。
Chapter 5. 测试
Bob大叔的书有一个特点(虽然我只看过两本…),他会在不经意中特别地插入测试方面的内容。看他的书都会对TDD有一定的了解,此处略去n个字……
不管是否采用TDD的方式,“职业的”程序员都必须具有一定的测试能力。最为开发人员,写的最多就是单元测试,虽然单元测试不能保证程序一定不出错,但是写好的单测是对自己代码负责的一种体现。如果代码没有测试过就签入代码库,无异于放进去一个定时炸弹。《Code Complete》里面介绍了一些办法,可以在写更少量的单测的情况下覆盖到更多的代码,例如结构化的基础测试。
Chapter 6. 预估
软件开发过程中最常出现的问题就是延期交付,因为进度延迟往往导致开发人员需要连续的加班,甚至通宵达旦的赶进度,而这个日期很多时候都是由于项目组过于乐观的预估。
-
时间预估——三元分析法
三元分析法是1957年美国海军的潜艇极地航行计划中的一部分内容,是一种对预估的计算方法,这种技术简单而有效,把预估变成概率分布。你可以更具三个数字预估某项任务:- O:乐观预估。这是非常乐观的数字,也就是我们经常说的最快时间,快到程序没有异常,开发过程中不会出岔。实际上,为了保持乐观预估有意义,这个数字对应的概率应当小于1%(正常分布下具体数字是3个西格玛或者0.13%)。
- N:标称预估。这个数字概率最大。如果画一张柱状图,标称预估就是最高的那个。
- P:悲观预估。这是最糟糕的数字,因为它考虑到各种意外,比如飓风啊,战争啊。为了保证这个数字有意义,它的概率也应当小于1%。
有了以上三个预估,我们可以这样描述概率分布:
μ = (O+4N+P)/ 6
μ 是任务的期望完成时间。
σ = (P - O)/ 6
σ 是任务的概率分布的标准差,用来衡量不确定性。数字大就表示非常不确定。
所以一项任务的预估时间就是 μ/σ 。
Chapter 7. 压力
书中有一段描述:
你看见自己躺在一张手术台上,以为外科医生给你做开胸手术。医生竭力挽救你的性命,但是时间有限……
你期望医生的表现如何?你希望他冷静、井井有条吗?你希望他清楚准确地吩咐助手吗?你希望他严格遵循当初训练时的做法坚守手术规程吗?
还是想让他汗流浃背、咒骂之声不断?想让他乱扔手术器械、把东西摔的哐当响吗?想让他满腹怨气责怪管理人员设定的不现实的手术时间,一直嚷嚷时间不够用吗?你期望他表现得像一名专业人士,还是像我们常见的某些开发人员的那种做派?
关于压力,最好的做法就是避免压力:
- 承诺:不要轻易做出承诺,承诺的时候也要正确地预估,避免过于乐观。
- 保持整洁:快速前进确保最后期限的方法就是保持整洁。专业人士不会为了快点儿乱来。“快速但脏乱”是自相矛盾的说法。
- 危机中的纪律:Bob大叔说过,观察自己在危机时刻中的反应就可以了解自己的信念。如果在危机中依然遵循你守持的纪律,就说明你确实相信那些纪律。选择那些你在危机中依然会遵循的纪律原则,并且在所有工作中都遵守这些纪律。遵守这些纪律原则是避免陷入危机的最好途径。
如果压力已经产生,不可避免的,“职业”的做法是不要惊慌,而是从容不迫、努力寻找解决方案,同时寻求帮助。
Chapter 8. 协作
大多数软件都是靠团队开发出来的,单打独斗与游离于团队之外都是不专业的表现。即使是Linus Torvalds这种单兵作战能力超强的,也需要一堆优秀程序员来帮忙维护Linux。想象一下deadline到来之前你拼了命赶进度,恨不得多找几个人来帮忙,这时候你是坚定不移的相信团队开发这个守则的。那为什么平时却不肯相信?
协作主要有两点:
- 与开发人员的协作:这要求我们按照规范写好代码、注释和文档,便于其他程序员更快理解。这也要求程序员要有良好的表达能力和写作能力。Joel Spolsky在《软件随想录》中给计算机系学生的建议中,第一条就是:毕业前练好写作。
- 与雇主的协作:代码应该是为了业务服务,有的开发人员只知道为了开发方便,随意的砍需求,或者想出一些不切实际的想法。所以Joel的建议(3)是:毕业前学好微观经济学。