代码整洁之道——程序员的职业素养

代码整洁之道–程序员的职业素养

英文名称:The Clean Coder-A Code of Conduct for Professional Programmers 作者:[美] Robert C.Martin 著 余晟 章险洲 译

1.经过反省,我意识到没有对例行程序进行测试就交付软件是不负责任的。

2.的确,作为一名有追求的有抱负的专业人士,他的首要职责与目标难道不正是尽其所能行有益之事吗?

3.如果你希望自己的软件灵活可变,那就应该时常修改它!

4.这一策略有时也叫“无情重构”,我把它叫作“童子军训练守则”:对每个模块,每检入一次代码,就要让它比上次检出时变得更为简洁。每次读代码,都别忘了进行点滴的改善。

5.雇主出了钱,你必须付出时间和精力。为了说明问题,就用一周工作40小时的美国标准来做参照吧。这40小时应该用来解决雇主的问题,而不是你自己的问题。你应该计划每周工作60小时。前40小时是给雇主的,后20小时是给自己的。在这剩余的20小时里,你应该看书、练习、学习,或者做其他能提升职业能力的事情。你肯定会说:“那我的家庭该怎么办?还有我的生活呢?难道我就该为雇主牺牲这些吗?”在此,我不是说要占用你全部的业余时间。我是指每周额外增加20小时,也就是大约每天3小时。如果你在午饭时间看看书,在通勤路上听听播客,花90分钟学一门新的语言,那么你就能兼顾到了。做个简单的计算吧。一周有168小时,给你的雇主40小时,为自己的职业发展留20小时,剩下的108小时再留56小时给睡眠,那么还剩下52小时可以做其他的事呢。

6.别忘了桑塔亚那的诅咒:“不能铭记过去的人,注定要重蹈覆辙”。

7.业精于勤。真正的专业人士往往勤学苦干,以求得自身技能的纯熟精练。只完成日常工作是不足以称为练习的,那只算是种执行性质的操作,而不是练习。练习,指的是在日常工作之余专门练习技能,以期自我提升。

8.俗话说:教学相长。想迅速牢固地掌握某些事实和观念,最好的办法就是与你负责指导的人交流这些内容。这样,传道授业的同时,导师也会从中受益。

9.开始一个新领域的项目时,应当读一两本该领域相关的书,要就该领域的基础架构与基本知识作客户和用户访谈,还应该花时间和业内专家交流,了解他们的原则与价值观念。

10.“能就是能,不能就是不能。不要说‘试试看’。”—尤达

11.每位经理都承担着工作职责,绝大部分经理也知道该如何尽职尽责。其中一部分的工作职责,便是要竭尽所能追求和捍卫他们设定的目标。

12.可能最好的结果,是你和你的经理共同追求的目标。最关键的是要找到那个共同目标,而这往往有赖于协商。

13.我们都听说过具备“团队精神”是多么重要。具备团队精神,意味着恪尽职守,意味着当其他队员遭遇困境时你要援手相助。有团队精神的人会频繁与大家交流,会关心队友,会竭力做到尽职尽责。

14.口头上说。心里认真。付诸行动。作出承诺,包含三部步骤。(1)口头上说自己将会去做。(2)心里认真对待做出的承诺。(3)真正付诸行动。

15.很少有人会认真对待自己说的话,并且说到做到。有些人在说话时是认真的,但他从来都不会说到做到。而更多的人在做出承诺后,几乎从不会认真去履行诺言。是否听过有人嚷嚷说“天哪,我真该减减肥了”?但你知道其实他还会是老样子,什么改变都不会发生。这样的事确实屡见不鲜。

16.如果最终目标依赖于他人,那么你就应该采取些具体行动,接近最终目标。

17.编码是一件颇具挑战也十分累人的智力活动。相比其他类型的活动,编码要求更加聚精会神。因为在编码时你必须平衡互相牵制的多种因素。(1)首先,代码必须能够正常工作。(2)代码必须能够帮你解决客户提出的问题。(3)代码必须要能够和现有系统结合得天衣无缝。(4)其他程序员必须能够读懂你的代码。

18.如果感到疲惫或者心烦意乱,千万不要编码。强而为之,最终只能再回头返工。相反,要找到一种方法来消除干扰,让心绪平静下来。

19.关于高效率状态,大家已经写了很多,这种状态通常被称为“流态”。有些程序员将之称为“流态区”。不管用什么名字,你可能都不陌生,甚至有过这种体验。这是程序员在编写代码时会进入一种意识高度专注但思维视野却会收拢到狭窄的状态。在这种状态下,他们会感到效率极高;在这种状态下,他们会感到“绝无错误”。因此他们一直苦苦追求进入这种状态,并经常以能在那种状态下维持多久来衡量自我价值。

20.软件开发是一场马拉松,而不是短跑冲刺。你无法全程一直以最快的速度冲刺来赢得比赛,只有通过保存体力和维持稳定节奏来取胜。无论是赛前还是赛中,马拉松选手都会仔细调整好自己的身体状态。专业程序员也同样仔细地保存好自己的精力和创造力。

21.创造力和智力来自于大脑的高速运转。当你感到疲劳时,它们就不翼而飞了。

22.在程序员所有表现的各种不专业行为中,最糟糕的是明知道还没有完成任务却宣称已经完成。

23.对任何新鲜事物,最好不要马上批驳。

24.TDD(测试驱动开发)的三项法则:(1)在编好失败单元测试之前,不要编写任何产品代码。(2)只要一个单元测试失败了,就不要在写测试代码;无法通过编译也是一种失败情况。(3)产品代码恰好能够让当前失败的单元测试成功通过即可,不要多写。

25.专业人士需要通过专门训练提升自己的技能,无一例外。要想表现优异,专业人士就会选择练习。

26.任何事情,只要想做得快,都离不开练习。要想尽可能快地重复编码/测试过程,就必须能够迅速作出决定。这需要识别各种各样的环境和问题,并懂得应付。

27.在每分钟进行多次编码/测试的状态下,你身上的肌肉记忆了要敲哪个键。意识中较基础的部分识别情景,在百分之一秒的时间内做出合适的反应,大脑则可以放心思考更高层次的问题。无论搏击还是编程,速度都来源于练习。而且,两种练习(重复编码/测试)并没有什么差别。我们选择了一系列的问题及其解决方案,一而再、再而三地练习,直到烂熟于心。

28.程序员用自己的时间来练习。老板的职责不包括避免你的技术落伍,也不包括为你倒灶一份好看的履历。医生练习手术不需要病人付钱,球员练习绕桩(通常)不需要球迷付钱,乐手练习音阶也不需要乐迷付钱。所以老板没有义务为程序员的练习来买单。

29.无论如何,专业人士都需要练习。他们这么做,是因为他们关心自己能够做到的最好结果。更重要的是,他们用自己的时间练习,因为他们知道保持自己的技术不落伍是自己的责任,而不是雇主的责任。练习的时候你是赚不到钱的,但是练习之后,你会获得回报,而且是丰厚的回报。

30.做业务的人和写程序的人都容易陷入一个陷阱,即过早进行精细化。业务方还没有启动项目,就要精确地知道最后能得到什么;开发方还没有评估整个项目,就希望精确知道要交付什么。双方都贪求不现实的精确性,而且经常愿意花大价钱来追求这种精确。

31.东西画(写)在纸上与真正做出来,是不一样的。

32.不同的团队对“完成”(done和complete)的定义各不相同,我曾经历过许多。其中一支团队甚至有“完成”和“真正完成”两种说法。专业开发人员的”完成“只能有一个含义:完成,就是完成。完成意味着所有的代码都写完了,所有的测试都通过了,QA和需求方已经认可。这,才是完成。

33.验收测试都应该自动进行。在软件开发的周期中,确实有时候需要手动测试,但是验收测试不应该手工进行,原因很简单:要考虑成本。专业程序员会避免这种情况。相比手动测试,自动化测试的成本非常低,让人手工执行测试脚本不划算。专业开发人员认为,实现验收测试的自动化是自己的责任。

34.因为美是主观的,会不断变化。大家都喜欢摆弄GUI(Graphical User Interface,简称 GUI,又称图形用户接口),希望能修改和操作各种GUI元素,希望尝试不同的字体、颜色、布局、工作流。所以,GUI通常是不断变化的。

35.交流细节信息是件麻烦事。尤其是开发方和业务方交流关于程序的细节时,更是如此。

36.会议的成本是每人每小时200美元。这个数字包含了工资、福利、设备损耗等因素。下次开会的时候,不妨算算会议的成本,你会很吃惊的。关于会议,有两条真理:(1)会议是必需的;(2)会议浪费了大量时间。

37.领导的重要责任之一,就是帮你从某些会议脱身。好的领导一定会主动维护你拒绝出席的决定,因为他和你一样关心你的时间。仔细管理自己的时间是你的责任。如果你发现参加某个会议是在浪费时间,就应当想个礼貌的办法退出来。

38.Kent Beck曾告诉我一个深刻的道理:”凡是不能在5分钟内解决的争论,都不能靠辩论解决。“争论之所要花这么多时间,是因为各方都拿不出足够有力的证据。所以这类争论依据的不是事实,而是信念。有人会尝试借助个人能力赢得争论。他们可能提高嗓门,近距离与你对视,或者摆出不屑的姿态。但这都不重要,强力是无法解决争论的,最终还是要数据。

39.编程是需要持续投入精力和注意力的智力活动,注意力是稀缺的资源。

40.承诺是必须做到的。如果你承诺在某天做成某事,必须按时完成。即便它意味着你必须每天工作12小时,放弃周末的休假,也不得不如此。既然承诺了,就必须兑现。承诺是关于确定性的。其他人会把你的承诺当真,据此拟订计划。

41.墨菲定律说的是,如果可能出错,那么就一定会出错。

42.应对压力的诀窍在于,能回避压力时尽可能的回避,当无法回避压力时则勇敢直面压力。可以通过慎重承诺、遵循自己的纪律原则、保持整洁等来回避压力。直面压力时,则要保持冷静,与别人多多沟通,坚守自己的原则纪律,并寻求他人的帮助。

43.我们并非是因为喜欢和其他人在一起工作才选择做程序员的。我们都认为人际关系难以应付而且毫无规律。编程用的机器则整洁,行为也可预见。如果可以一个人待在房间里数个小时沉浸在一些真正有趣的问题上,那将会是最开心的时光。

44.形成团队是需要时间的。团队成员需要首先建立关系。他们需要学习如何相互协作,需要了解彼此的癖好、强项、弱项,最终,才能凝聚成团队。有凝聚力的团队确实有些神奇之处。他们能够一起创造奇迹。他们互为知己,能够替对方着想,互相支持,激励对方拿出自己最好的表现。他们攻无不克。

45.“技艺“一词到底指的是什么?为了理解这个词语,我们先来看”工匠“这个词。这个词包含有心智、技能和质量的意味。它会在人们心中唤起”经验丰富“和”堪当重任“这样的印象。成熟工匠手脚麻利,从容淡定,他们能够做出合情合理的估算并遵守承诺。