《程序员修炼之道》笔记
Posted zhixin9001
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《程序员修炼之道》笔记相关的知识,希望对你有一定的参考价值。
这几天开始看《程序员修炼之道》,也许不少人看了书的标题,第一时间会觉得这是鸡汤一类的书。但至少以我自己的感受来看,这是很棒的书,现代人文主义不是提倡自我意识嘛,自己感觉好的就是好的。况且人家也是经过了时间和口碑的双重考验的,真心值得好好阅读。
作者在再版的序中写道:
写完《程序员修炼之道》至今已有十年。在这十年中,软件产业发生了翻天覆地的变化。……从表面上看,软件世界似乎陷入了疯狂的状态。但如果你深入繁杂表象的背后,会发现变化其实并不大。1999年的那些通用开发原则,在2009年同样有效(很可能到2019年还会有效)……
大师就是这样,能从繁杂的表象背后看到事物的本质。就像任正非说的:不管是不是互联网思维,你造的汽车首先应该是汽车。
书中的内容多是两位作者对多年经验的敏锐抽象和升华,对我这个只有一年多经验的程序员来说,要全部理解是不可能的,而好书也不是读一次就够的。这里就先记录一些有点感触的内容:
第一章 注重实效的哲学
下面是作者在开篇提到的注重实效的程序员的特征:主要体现在处理问题、寻求解决方案时的态度、风格、哲学
1. 能够超越出直接的问题去思考,总是设法把问题放在更大的语境中,设法注意更大的图景。没有这样更大的语境,你又怎能注重实效。
2. 对所做的每件事负责,因为负责,注重实效的程序员不会坐视他们的项目土崩瓦解或者慢慢腐烂。
3. 勇于接受变化。大多数人发现自己很难接受变化,有时是出于好的理由,有时只是因为固有的惰性。
4. 拥有广泛的知识和经验基础。
5. 善于交流。
从“程序员修炼之道”突然谈到“注重实效的程序员”,咋看有点突兀,但如果看看原书的标题 The Proagmatic Programmer,就不会有这种误会了。越往后看本书,越能体会到作者提到的这几个特征的必要性。处理问题、寻求方案时的态度、风格、哲学,这些对我们在软件开发中的行为是潜移默化而影响深远的。
1. 我的源码让猫给吃了
a. 在所有弱点中,最大的弱点就是害怕暴露弱点。
b. 不管是在职业生涯、还是项目、日常工作,为你自己和你的行为负责,是注重实效的哲学的一块基石,注重实效的程序员对自己的职业生涯负责,而且不害怕承认无知或错误。即使在最好的项目中,尽管有彻底的测试、良好的文档和足够的自动化,出错是难免的事情。一旦发生这样的事情,我们要设法尽可能职业地处理他们,要诚实坦率。我们可以为自己的能力自豪,但对于自己的缺点、无知和所犯的错,我们必须诚实。
c. 责任是你主动承担的东西。在作出承诺之前,尽可能的分析风险是否超出了自己的控制,对于不可能做到的事情或风险太大的事情,你有权不去负责。但如果你确实同意为某个结果负责,就应切实负起责任。但你犯错误或是判断失误是,就诚实地承认它,并设法给出各种选择。不要责备别人活别的东西,不要拼凑借口。遇到问题时,提供各种选择,不要找蹩脚的借口(Provide options, Don’t make lame execuses)
“我的源码让猫给吃了”便是一个蹩脚的借口。要做到坦然地暴露弱点,确实很难,但这是必要地,有一句很简练的话:Be Human。我们要明白自己是普通人,而不是某种完美的物种,我们有失误、疲倦、胆怯,允许这些发生并正视这一切,同时努力成为更好的人。而说到责任,作者首先教我们的是正确评估事情的风险和自己的能力,如果风险超过了自己的控制,有权不去承担。这真是再“实效”不过了。
2. 软件的熵
熵是一个物理学概念,指的是某个系统中“无序”的总量。当软件的无序性增长时,称为“软件腐烂”。而造成软件腐烂的原因主要是:开发项目时的心理(或文化)。软件开发同样受“破窗理论”影响,低劣的设计、错误的决策、糟糕的代码都是软件领域的破窗户。一旦窗户开始破裂,情况就会迅速恶化,不要对其置之不理,发现一个就修复一个,如果临时没有时间,就“用木板把它订起来”,比如注释、显示“为实现”消息,或用假数据(dummy data)加以替代。
对于这一点挺有体会,我见过有的软件,编译器给出了1000多个警告而置之不理。但话说回来,这又怎么处理,当看到前人留下的1000多个警告的时候,我们尝试过处理一下自己就近的,但马上就会觉得无助。只能小心别让自己增加更多的警告。当若干年前第一条警告出现的时候,窗户已经开始破裂,直到膨胀到无法收拾的地步。
3. 足够好的软件
a. 欲求更好,常会把好事变糟——李尔王
b. 我们没办法做到十分完美,但可以训练自己,编写出足够好的软件,对你的用户、对未来的维护者、对你的内心安宁来说足够好。但“足够好”绝不是编写不整洁或糟糕的代码
c. 如何编写出足够好的软件:
1) 让用户参与权衡
软件开发过程会受到各种约束,比如市场人员有需要信守的承诺,最终用户也许已经基于交付日期制定了各种计划,公司也会有现金流方面的约束。如果无视这些约束,一味地增加新特性或一次次润饰代码,这不是有职业素养的做法。但许诺不可能兑现的承诺,为赶上最后期限而削减基本的工程内容,同样不是有职业素养的做法。
使质量成为需求问题。常常需要权衡足够好与完美,许多用户宁愿在今天用上有一些“毛边”的软件,也不愿等待一年后的多媒体版本。今天的了不起的软件常常比明天的完美软件更可取。而且让用户提前使用,他们的反馈可以把你引导向更好的解决方案。
2) 知道何时止步
艺术家们会告诉你,如果你不懂得应何时止步,所有的辛苦劳作就会遭到毁坏。比如绘画,画家需要不时得后退,用批判的眼光观察自己的作品,以确定下一步,但如果你一层又一层地叠加细节,就会迷失在绘画中。程序也是这样,不要过度修饰和过于求精二损毁完好的程序。
区分完美主义与强迫症真是一件困难的事情。在现实生活中,两者都可能带来问题。还好作者提示“如果无视这些约束,一味地增加新特性或一次次润饰代码,这是不有职业素养的做法”,让我们懂得权衡并知道何时止步。同样地我想到最近发生在自己身上的一件事,遇到技术上的困难没有请教别人,耗费了很多时间才自己搞出来,这同样不是有职业素养的做法。
4. 你的知识资产
a. 你的知识和经验是最重要的职业财富,但它们是有时效的资产。随着你的知识价值的降低,对你的公司和客户来说,你的价值也在降低。
b. 怎样经营管理知识资产,与金融资产类似:
1) 定期投资。即使投资量很小,习惯自身也和总量一样重要。
2) 多元化是长期成功的关键。你知道的不同的事情越多,你就越有价值。但作为底线,你需要知道你目前所用的技术的各种特性,同时不要就此止步
3) 在保守的投资和高风险、高回报的投资之间取得平衡。不要把所有的技术放在一个篮子里。
4) 低买高卖,以获取最大回报。在新兴技术流行之前学习它就可能和找到被低估的股票一样困难,但所得到的就和那样的股票带来的一样。
5) 周期性地重新评估和平衡资产。
知识如同财富,需要用心经营,这听起来挺功利的,但对于技术性的知识来说,确实应该采纳作者的这些建议。
5. 交流
交流的重要性自不必作者多说,在交流技巧方面,作者建议考虑WISDOM原则:
What do you want them to learn
What is their interest in what you’re got to say
How sophisticated are they
How much detail do they want
Whom do you want to own the information
How can you motivate them to listen to you
总体来说,就是首先要了解交流的对象,并能够站在对方的角度想问题,同时要经常跳出事情本身来看看大局
欢迎关注我的个人公众号【菜鸟程序员成长记】
以上是关于《程序员修炼之道》笔记的主要内容,如果未能解决你的问题,请参考以下文章