本书主要讲什么是专业的(Professional)程序员,成为专业的程序员,需要什么样的态度、原则、行动。
作者简介
Robert C.Martin,人称Bob大叔,真·骨灰级 程序员。书中他是这么介绍自己的:
“我编了42年的程序。这42年里,我什么都经历过。我被开除过,也被表扬过。我当过小组长,当过主管,也当过普通员工,甚至当过CEO。”
“我用过COBOL、FORTRAN、BAL、PDP-8、PDP-11、C、C++、Java、Ruby、Smalltalk。”
“20世纪70年代,并没有多少资深程序员。我后来去哪里工作,就是那里的资深程序员。”
书名讨论
本书原文名为:The Clean Coder. A code of Conduct for Professional Programmers
译名为:《代码整洁之道 程序员的职业素养》。我觉得翻译得不是很贴切,而且极易与另一本书搞混。
书名直译过来应该是:整洁的程序员。专业程序员的行为准则。(Clean这个词在这里不太好翻译,姑且译为整洁的吧)。本书强调的是Coder,是人,是怎么做事、什么时候说Yes、什么时候说No。
作者还有另一本书,原文名为: Clean Code. A Handbook of Agile Software Craftsmanship.
译名为:《代码整洁之道》。是不是很上面那本书混淆了。这本书直译过来应该是:整洁的代码。敏捷软件开发指南。本书强调的是Code,是代码,怎么命名、写函数、写类等。
本书主要讲了以下几大内容:
- 专业主义
- 什么时候该说不,什么时候该说是
- 如何高效地写代码
- 测试的重要性以及执行方案
- 时间管理
- 预估工期
- 如何避免压力、应对压力
- 如何协作
- 团队与项目
- 程序员的不同阶段
1 专业主义
1.1 清楚你要什么
什么叫专业(Professional)?
当说一个人专业的时候,大家应该会想到娴熟的技艺,专注的态度,强烈的责任感。
如果一个人技术非常厉害,但工作态度不端正(做事随意、缺乏时间观念),恐怕是无法被称为专业。书中作者就讲到自己年轻的时候在公司虽然技术非常厉害,但缺乏责任感与时间观念,最后被公司开除的故事,可以说是专业一词的反面案例。
“专业主义”有很深的含义,它不但象征着荣誉骄傲,而且明确以为着责任与义务。
非专业人士不需要为自己所做的工作负责,他们大可把责任退给雇主。如果非专业人士把事情搞砸了,收拾摊子的往往是雇主;而专业人士如果反了错,只好自己收拾残局。
“专业注意”意味着担当责任。那么,我们改如何担当责任呢?
1.2 担当责任
1.3 首先,不行损害之事
1.3.1 不要破坏软件功能
- 让QA找不出任何问题;
- 要去确信代码正常运行;
- 自动化QA;
1.3.2 不要破坏结构
成熟的专业开发人员指导,聪明人不会为了发布新功能而破坏结构。
专业的软件开发人员会牢记这些原则和模式,并在开发软件的时候认真遵循。其中有一条就是,如果希望自己的软件灵活可变,那就应该常修改他。
有一种策略叫做“无情重构”:关注哪个模块,就对它做点简单的修改来改进结构。
1.4 职业道德
职业发展是你自己的事。雇主没有义务确保你在职场立于不败之地,也没有义务培训你,送你参加各种会议或给你买各种书籍充电。这些都是你自己的事。
你应该计划每周工作60小时。前40小时是给雇主的,后20小时是给自己的。在这剩余的20小时里,你应该看书、练习、学习,或做其他能提升职业能力的事情。
1.4.1 了解你的领域
每个软件开发人员必须精通的事项
- 设计模式。必须能描述GOF书中的全部24中模式,同时还要有POSA书中的多数模式的实战经验。
- 设计原则。必须了解SOLID原则,而且要深刻理解组件设计原则。
- 方法。必须了解 XP、Scrum、精益、看板、瀑布、结构化分析及结构化设计等。
- 实践。必须掌握测试驱动开发、面向对象设计、结构化编程、持续结成和结对编程。
- 工作 。 必须了解如何试用UML图、DFD图、结构图、Petri网络图、状态迁移图表、流程图和决策表。
1.4.2 坚持学习
软件行业的飞速改变,意味着软件开发人员必须坚持广泛学习才不至于落伍。
不写代码的架构师必然遭殃,他们很快就会发现自己跟不上时代了;不学习新语言的程序员同样回遭殃,他们只能眼睁睁看着软件业一路发展,把自己抛在后面;学不会新规矩和新技术的开发人员更可怜,他们只能在日渐沦落的时候看着身边的人越发优秀。
1.4.3 练习
真正的专业人士往往勤学苦干,以求得则自身技能的纯熟精炼。只完成日常工作是不足以称为练习的,那只能算是种执行性质操作,而不是练习。练习,指的是在日常工作之余专门练习技能,以期自我提升。
1.4.4 合作
专业软件开发人员往往会更加努力地尝试与他人一起编程、一起练习、一起设计、一起计划,这样他们可以从彼此身上学到很多东西,而且能在更短的时间内更高质量的完成更多工作。
1.4.5 辅导
专业人士会视辅导新人为己任,他们不会放人未经辅导的新手恣意妄为。
1.4.6 了解业务领域
1.4.7 与雇主客户保持一致
每次开发系统,都应该站在雇主的角度来思考,确保开发的功能真正能满足雇主的需要。
1.4.8 谦逊
2 说“不”
专业人士敢于说明真相而不屈从于全是。专业人士有勇气对他们的经理说“不”。
奴隶没有权利说“不”,劳工或许也对说“不”有所顾虑,但是专业人士应该懂得说“不”。
对于无法完成的需求,要如实反映情况,要勇敢说不。在明确无法在规定时间内完成需求的情况下,承诺“尝试”是一种不诚实的表现。
3 说“是”
3.1 承诺用语
做出承诺,包含三个步骤:
- 口头上说自己将会去做;
- 心里认真对待做出的承诺;
- 真正付诸行动。
3.1.1 缺乏承诺的征兆
“需要/应当”,“希望/但愿”,“让我们”(而不是“让我”)
3.1.2 真正的承诺听起来是怎样的
“我 将在...之前...”
对自己讲过做某件事做了清晰的事实称述,而且还明确说明了完成期限。
4 编码
不要在太疲惫的时候编码。
不要在焦虑、情绪不稳定的时候编码。
不要禁不住诱惑盲目冲刺。
9 时间管理
9.1 会议
9.1.1 拒绝
受到邀请的会议没有必要全部参加。你应该理智地使用时间,谨慎选择,应该参加哪些会议,礼貌拒绝哪些会议。
9.1.2 离席
如果发现参加某个会议是在浪费时间,就应当像个礼貌的办法退出来。
继续参加对你没有太多意义的会议,是不专业的行为。
9.1.3 确定议程与目标
为了合理使用与会者的时间,会议应当有清晰的议程,确定每一个议题所话得时间,以及明确目标。
9.1.4 立会
- 昨天干了什么;
- 今天打算干什么;
- 遇到了什么问题;
每个问题20秒,总共1分钟之内。
9.1.5 迭代计划会议
9.1.6 迭代回顾和Demo展示
9.1.7 争论/反对
如果观点无法在短时间(5-30min)里达成一致,就永远无法达成一致。唯一的出路,就是用数据说话。
10 预估
10.2 PERT
计划评估技术(PERT,Program Evaluation and Review Technique)
三元分析法:
- O:乐观预估。
- N:标称预付。概率最大的数字。
- P:悲观预估。最糟糕的数字。
任务期望完成时间: μ = (O + 4n + P) / 6
任务的概率分布标准差:σ = (P - O) / 6