前言
这是一篇关于“实干”的文章。本文将帮助你成为更好的程序员。
毫无疑问,你的人生是你自己的。
之所以有必要阅读本文(读完记得点个“赞”),是因为你相信自己——可以成为一个更好的开发者,并能帮助其他人变得更好——也就是说,可以成为一个务实的程序员。
不论你是独立开发者,还是大型项目团队的一员,或是同时与许多客户共事的顾问,都无所谓。本文旨在告诉你,作为个体如何更好地完成工作——或编写出更好的软件,或探究出编程的本质,熟谙编程语言、框架、方法、模式,哲学、工具、设计、解耦、并发、重构、需求、团队等务实话题的最佳实践及重大陷阱,以及设计开发易于改造、复用的架构技术。
“务实”这个词。
务实,英文是 Pragmatic,这个词来自拉丁语 pragmaticus ——“精通业务”,该词又来源于希腊语 πραγματικός,意思是“适合使用”。
俗话说,“读万卷书,行万里路”。 《尚书》说,“非知之艰,行之惟艰”。 《左传》说,“非知之实难,将在行之”。知,即认知或良知。行,指行为、行动。知行关系、道德认识与道德践履是中国哲学思想的核心。
王阳明说,“知行合一”。知是指内心的觉知,对事物的认识,行是指人的实际行为。即认识事物的道理与实行其事,是密不可分的。
务实的程序员的特质是什么?是他们面临问题时,在解决方案中透出的态度、风格及理念。 他们总是越过问题的表面,试着将问题放在更宽泛的上下文中综合考虑,从宏观大局结构和精微本质着想。
毕竟,若不去了解来龙去脉,结合实际如何谈起?又怎能做出明智的妥协和合理的决策?
责任感,驱使务实派程序员不会在他们的项目分崩离析时坐视不管。 软件开发,和生命过程一样,都是在和“熵增”作斗争,在做“负熵”运动。 在软件的熵中,我们将告诉你如何让项目保持清爽。
马克思说,“理论联系实践”。
编程是____。
编程是一门技艺。简单地说,编程,就是让计算机做你想让它做的事情(或是你的用户想让它做的事情)。 作为一名程序员,你既在倾听,又在献策; 既是传译,又行独裁; 你试图捕获难以捉摸的需求,并找到一种表达它们的方式,以便仅靠一台机器就可以从容应付。 你试着把工作记录成文档,以便他人理解; 你试着将工作工程化,这样别人就能在其上有所建树; 更重要的是,你试图在项目时钟的滴答声中完成所有这些工作。 你每天都在创造小小的奇迹。
编程是一项艰难的工作。 想帮你的人可不少——工具供应商在吹嘘他们家产品所创造出的奇迹。 方法论大师承诺他们的技术可以为结果做出保证。 每个人都声称他们用的编程语言是最好的。 每个操作系统都自诩包治百病。 ...... 当然,这些都不是真的!
哪有什么简单的答案。 没有最好的解决方案,无论是工具、语言还是操作系统; 只在特定的环境下,才有所谓更合适的系统。
务实主义:Pragmatism
——这就让务实主义有了用武之地。 你不应该拘泥于任何特定的技术, 而应该拥有足够广泛的背景和经验基础, 以便在特定的情况下选择合适的解决方案。 你的背景来自对计算机科学基本原理的理解, 你的经验来自广泛的实际项目。 你的理论结合你的实践, 会让你变得强大。
达尔文雀:根据环境变化,不断快速进化自己
1835年,一位年轻的博物学家,跟着一艘叫“小猎犬号”的轮船环游世界。 然后,他发现了一个很奇怪的现象。 有一种雀类,明明是同一个物种,但在13个小岛上,雀的喙部,居然各不相同。 有的雀,喙部又厚又硬,因为它要在地上捡食坚果。 有的雀,喙部又尖又细,因为它要啄食树木里的虫子。 有的雀,喙部不紧密切合,还微微向内弯,因为这更方便吃花蜜和昆虫。
这个现象,启发了另一位博物学家。24年后,他提出了著名的“进化论”。他就是达尔文。
而这种根据环境变化,而不断进化的雀,就被称为“达尔文雀”。 就像英特尔创始人安迪·格鲁夫曾提出过的“十倍速变化”理论:外界变化永远要比我们预料到的,快10倍。 普通人面对巨变的时代,唯一的破局之道,就是像“达尔文雀”一样,拥有“进化思维”。 什么是进化思维? 进化思维,就是接受世界在不停进化,倒逼自己协同进化。 只有不断进化,才能适应快速变化的世界。 如果不能与时俱进,就只有接受大浪淘沙的命运。
达尔文雀的故事告诉我们—— 你要主动,主动积极地,去调整你的方法,去适应当前的情况和环境。 对所有影响项目因素的相对重要性做出判断,并通过经验找到适当的解决方案。 随着工作的进展,你要持续不断地这样做。 务实的程序员不仅把工作做完,并且做得很好。
软件以“负熵”为生
生命以负熵为生。 ——薛定谔
虽然软件开发不受绝大多数物理法则的约束,但我们无法躲避来自熵的增加的重击。熵是一个物理学术语,它定义了一个系统的“无序”总量。不幸的是,热力学法则决定了宇宙中的熵会趋向最大化。
当软件中的无序化增加时,程序员会说“软件在腐烂”。有些人可能会用更乐观的术语来称呼它,即“技术债”,潜台词是说他们总有一天会偿还的——恐怕不会还了。
不过不管叫什么名字,债务和腐烂都可能失控地蔓延开。
有很多因素会导致软件腐烂。最重要的一个似乎是项目工作中的心理性状态,或者说文化。即使是一个单人团队,你的项目的心理性状态也是个非常脆弱的东西。即使有最合理的计划和最佳的人员,项目还是可能在生命周期中逐步荒废、腐烂。但也有一些项目在经历了巨大的困难、持续不断的挫折之后,成功地对抗了天然的无序化倾向,走出了困境。
“项目进展缓慢,完全失去了控制——这是很常见的症状。大多数软件灾难都始于微不足道的小事,项目的拖延也是一天天累积而成的。系统一个特性接一个特性地偏离规范,一个接一个的补丁加到代码上,最终原始代码无影无踪。往往就是一件件小事的累积破坏了团队和士气。”
在城市中心,有些建筑干净漂亮,而另一些则破落不堪。为什么会这样?一些犯罪和城市衰败领域的研究人员发现了一个有趣的触发机制,只需一样东西就能非常迅速地把一幢干净完好的宜居建筑变成一个破败的废弃物。 是什么造成了差异?
一扇破窗。
还有一双来自南美洲大陆蝴蝶的翅膀——一个思想类似的“混沌理论”。
心理学家的研究表明,绝望是会传染的,就像狭窄空间中的流感病毒。
无视一个明显损坏的东西,会强化这样一种观念:看来没有什么是能修好的,也没人在乎,一切都命中注定了。所有的负面情绪会在团队成员间蔓延,变成恶性循环。
人生是你的。
我活着不是为了满足你的期望,正如你也不是因为我的期望而活着。 ——李小龙
人生是你自己的,是你在拥有、经营和创造。 我们和很多沮丧的开发者交谈过。他们的担忧多种多样。 一些人感觉自己的工作停滞不前。还有一些人认为自己的技术已经过时了。 有人觉得自己没有得到应有的重视,有人觉得薪水过低,有人觉得团队已经一团糟。 一些人想去美洲或是欧洲工作,一些人想在家工作。 对此,我们总是给出相同的答案。 “为什么你不考虑改变一下呢?”
“这个行业给了你一系列非凡的机遇。积极主动点,掌控这些机遇。”
知止:在不完美的世界中开发代码
知止而后能定,定而后能静,静而后能安。 《大学》
《道德经》:“知足不辱,知止不殆”。这就是说,人的祸患多源于自身永不知足的贪婪本性,因此,圣人不仅要有优秀的道德修养、完美的人格魅力,还要筑牢廉洁自律的思想防线。
知道何时止步。
在某些方面,编程就像绘画。你从一张空白的画布开始,只有一些非常基础的原料。你糅合了科学、艺术、工艺手段来决定用这些原料做点什么。你勾勒出一个整体的形状,绘制出潜在的基调,然后再装点细节。你不断地带着批判的眼光回顾自己已完成的部分。你会时不时地扔掉一张画布,然后重新开始。 不过艺术家会告诉你,如果你不知道什么时候该停止,那么所有的努力就都白费了。如果你不断地一层叠一层,细节盖细节,绘画将迷失在颜料中。
不要让过度的修饰和精炼侵蚀掉一个完好的程序。
继续前行,让代码在它该有的位置驻留一段时间。 它或许并不完美,不要紧的——它就算永不完美也没关系。
改变习惯、行为和期望。
仅仅知道如何编程,并不会让你成为一名更好的程序员,在这个过程中,必须经历有意识地和深思熟虑地实践。只有通过真枪实弹地战斗过,在攻坚战、冲锋站、游击战、长期战役等等猛烈的炮火的洗礼中才能得到真正地人生和成长。
我们觉得,如果你不关心怎么把软件开发好,那么软件开发领域就再也没什么好谈的事情了。
每个开发人员都是独特的,有各自的优势和劣势,以及偏好和厌恶的东西。诚如随着时间的推移,每个人都将打造自己的个人环境。这种环境将像程序员的爱好、衣服或发型一样,能强烈地反映出他或她的个性。然而,作为务实的程序员,你们会共有许多如下特征:
早期的采纳者/快速的适配者
你对技术和技巧有一种直觉,喜欢尝试。当接触到新东西时,你可以很快地掌握它们,并把它们与其他的知识结合起来。你的信心来自经验。
好奇者
你倾向于问问题。这真不错——你怎么做到的?你对那个库有意见吗?总在听人说起的量子计算到底是什么?符号链接是怎么实现的?你热衷于收集各种细微的事实,坚信它们会影响自己多年后的决策。
批判思考者
你在没有得到证实前很少接受既定的现实。当同事们说“因为就该这么做”,或者供应商承诺会解决所有的问题时,你会闻到挑战的味道。
现实主义
你试图理解所面临的每个问题的本质。这种现实主义让你对事情有多困难、需要用多长时间有一个很好的感知。一个过程应该很难,或是需要点时间才能完成,对这些的深刻理解,给了你坚持下去的毅力。
多面手
你努力熟悉各种技术和环境,并努力跟上新的进展。虽然目前的工作可能要求你在某个专门领域成为行家,但你总是能够进入新的领域,迎接新的挑战。
思考!时刻思考反省你的工作
为一名务实的程序员,在做事的时候,要求自己,思考一下自己正在做什么。这不是对当前实践做的一次性反省——而是对每天里每一个项目所做的每一个决定进行的批判性评估。
要不断地思考,即时地批判自己的工作!
座右铭: “思考!”,实属每个务实程序员的真言。
如果你觉得这听起来很困难,那么你就表现出了现实主义的特征。 这会占用你一些宝贵的时间——可能是已经处于巨大压力之下的时间。 当然会有回报,你能更积极地投入喜欢的工作,对越来越多的学科有掌控感,对不断进步产生愉悦感。
从长期来看,时间投资将得到回报,因为你和你的团队将变得更高效,能编写出更容易维护的代码,并且在会议上花的时间更少。
工程与匠心:我们采集的只是石头,却必须始终展望着未来的大教堂
诚然,软件构造有工程的成分。然而,这并不妨碍个体的技艺。想想中世纪在欧洲建造的大教堂,每一座都需要数千人年的努力,时间跨度长达几十年。从中吸取的经验教训被传递给下一代的建造者,最终一代代累积的造诣推动了结构工程的发展。而木匠、石匠、雕刻师和玻璃工人都是手工艺人——通过吃透工程要求,其创造所体现出的整体水准,已远超建筑中纯机械的部分。
正是他们对个人贡献的信念支撑着这些项目:我们,采集的只是石头,却必须始终展望着未来的大教堂。
在一个项目的整体结构中,总有个性和技艺的空间。考虑到软件工程的当前状态,这一点尤为正确。今天的土木工程师,很难接受中世纪大教堂建造者使用的技术——百年后我们的工程看上去也一样古老,而我们的技艺仍将受到尊重。
工具:工欲善其事必先利其器
每个制造者在开始他们的职业生涯时,都会准备一套精良的基础工具。木工可能需要一些尺子、量规,几把锯子,好的刨刀,精细的凿子,钻头和支架,木槌以及夹子。这些工具是精心挑选出来的,打算一直使用下去,不同工具的用途之间很少重叠——也许更重要的是,这些工具会越用越称手。
接下来是一个学习和适应的过程。每个工具都有自己的特性和“怪癖”,需要特别的操作方法。每一个都需要用一个独特的方式打磨,或需要专门的手法持握。随着时间的推移,经过使用中的不断磨合,抓握之处会像依据木工的手模做出来的一样,磨合出的切面刚好与持握的角度吻合。在这一刻,工具就变成了大脑到最终产品的导管——成为了制造者的手的延展。过了一段时间,木工会添置新的工具,如木工接合机、激光制导斜切锯、燕尾夹具等各种奇妙的科技产品。但可以打包票,木工手里还是拿着一件原始的工具,享受着刨刀划过木料时发出的美妙声音,因为这时候最开心。
工具会放大你的才能。工具越好,同时你越知道怎样用更好,效率就越高。一开始一组基础的通用工具就够用了。随着经验的增长,伴随着各种特殊需求的出现,你会扩充你的工具组合。这是和工匠学的——定期给工具箱添加工具。要一直寻找更好的做事方法。如果感觉手头的工具搞不定遇到的问题,先记录下来,再去试试其他的工具,只要它足够强大,就可能对你有帮助——让需求来驱使你不断选购新的工具。记得让自己的基础工具集随时保持锋利和可用状态。同时,也要记得,不断丰富和更新换代你的工具箱。
这是一个连续的过程
一位游客在参观英格兰伊顿公学时,询问园丁是如何把草坪修剪得如此完美的。 “那很简单,”园丁回答说,“你只要每天早上拂去露水,隔天修剪一次,一周再滚压一次就行了。” “就是这些吗?”游客问。 “就这些,”园丁回答,“这样做上五百年,你也会有一片漂亮的草坪。
伟大的草坪需要每天的点滴护理,伟大的程序员也是如此。
“改善(Kaizen)” , 这个词的意思是不断地做出许多小的改进。这被认为是日本制造业生产率和质量大幅提高的主要原因之一,并被全世界广泛效仿。
改善也适用于个人。每一天都要努力打磨你的技能,并往技能库里添加新的工具。与伊顿草坪不同,你会在几天内就看到效果。
几年下来,你会对成果惊讶不已——经验业已开花结果,技能早就茁壮成长。
独孤九剑:“神而明之,存乎一心” 。
天下武功数不胜数,单是见识就已极为不易,更遑论以一套剑法来破解。独孤九剑是以周易为源,衍生三百六十种剑法的变化之道(总诀式),又针对天下武功从兵刃拳脚暗器到内功分化出不同的应对甚至破解方法。
独孤九剑有九个剑诀,每个剑诀有一千多种变化,但变化不固定。 独孤九剑剑法,把人能做的动作,全部拆解,透过分析对手的姿势,他能做的动作有哪些?对手哪个部位、哪条肌肉有动作徵兆,推算他下一步只可能是什么招式?这就是风清杨一再强调的“料敌机先”,也就是九剑的真正精髓!
草木竹石皆可为剑。
最终,达到拳脚兵器暗器、内外轻功无所不能无所不精,却不受任何束缚,即景生情自由挥洒,从心所欲无不如意之境界。
心境
无需坚定内心,因为内心自然而然犹如浩瀚星空,不可撼动; 无需抵抗幻境,因为幻境和真实宇宙比,不堪一击。 明心见性 ,直指本心。 心如明镜,不惹一丝尘埃。 心凝练如刀,斩掉一切阻碍。
修心三重境界
第一重:明心见性 ,直指本心。 心如明镜,不惹一丝尘埃,心凝练如刀,斩掉一切阻碍。 第二重:赤子之心、阴阳相合、刚柔并济;达到天人合一、赤子之心、心境大圆满。 第三重:“心无限大、心包容一切”,任凭他威压再强我都能包容,我心无限,自然不可能被压迫崩溃。
最后:批判性地分析你读到和听到的东西(包括本文)
批判性思维本身就是一门完整的学科,我们鼓励你仔细研究和学习这门学科。现在先在这里起个头,问几个值得思考的问题。
问“五个为什么”
我最喜欢的咨询技巧是:至少问五次“为什么”。就是说,每当有了答案后,还要追问“为什么”。像个烦人的四岁小孩那样经常性重复提问,不过记得要比小朋友更有礼貌。这样做可以让你更接近本源。
谁从中受益(Who)
虽然听起来有点世俗,不过追踪钱的流动更容易理清脉络。其他人或其他组织的利益可能和你自己的一致,也可能不一致。
有什么背景(What)
每件事都发生在它自己的背景下,这也是为何“能解决所有问题”的方案通常不存在,而那些兜售“最佳实践”的书或文章实际上经不起推敲。“最适合谁”是一个值得考虑的好问题,类似的还有先决条件是什么、后果是什么,以及是短期的还是长期的。
什么时候(When)在哪里(Where)可以工作起来(How To Work)
是在什么情况下?太晚了吗?太早了吗?不要停留在一阶思维下(接下来会发生什么),要进行二阶思考:当它结束后还会发生什么?
为什么这是个问题
是否存在一个基础模型?这个基础模型是怎么工作的? 很不幸,现在很难再找到简单的答案。 但借助广泛的知识组合,在你将读到的海量技术出版物上,再加一点批判性分析,你就能理解那些复杂的答案。
挑战
· 本周就开始学习一门新语言。你是不是一直在用同一门古老的语言编程?试试 Lisp、Clojure、Elixir、Elm、F#、Go、Kotlin、Haskell、Python、R、ReasonML、Ruby、Rust、Scala、Swift、Typescript,或是其他你看过去感觉会喜欢的语言。
· 开始读一本新的书(不过一定要先把我这篇文章读完!)。如果你正在做非常细致的实现和编码工作,就去读一本讲设计和构架的书。如果你正在较高的层次做设计工作,就去读一本讲编码技术的书。
· 走出去和那些与你当前项目无关的人谈谈技术,和别的公司的人聊聊。试着在公司餐厅建立你的人脉,或是去参加本地的聚会,找一些志同道合的人。(独学而无友,则孤陋而寡闻)
文本在阐释中烟消云散。 ——尼采《善恶的彼岸》
最后,愿每个写代码的人都能成为务实的程序员。
参考阅读
“作为务实的程序员,我们的基础材料不是木头或铁块,而是知识。我们把需求以知识的形式收集起来,然后在设计、实现、测试和文档中表达这些知识。” 摘录来自: (美)David Thomas(大卫·托马斯),Andrew Hunt(安德鲁·亨特). “程序员修炼之道:通向务实的最高境界(第2版)。”