程序员修炼之道:通向务实的最高境界(第2版)豆瓣阅读|百度网盘下载

编辑评论:

程序员的修炼之路:通向实用主义的最高境界(第二版) 2011年与原网易COO詹仲辉共同创办EJOY游戏公司,任CTO。公司已被阿里收购;在互联网和游戏行业具有较高的技术影响力,常年发表博客文章,是《游戏之旅》和《Effective C++(评论版)》的作者。

程序员培养之道:通向实用主义的最高境界(第2版)豆瓣阅读

编辑推荐

谁应该阅读:无论您是新程序员、经验丰富的程序员,还是负责软件项目的经理,您都将通过本书获得个人生产力、准确性和工作满意度,学习学习技巧、习惯您获得的态度和态度将成为您在职业生涯中取得长期成功的基础。

屹立20年有影响力的作品,数千万成功案例,超越任何语言|框架|方法。

为未来重写一切,从程序员职责和职业发展,到灵活|易于适应|可重用的架构。

53 个核心主题 | 99 个高能技巧,阐明了软件开发的卓越之路以及沿途的典型陷阱。

编程界的传奇人物云峰,翻译了真谛、奥义、案例、技巧的原著,都挖到了顶峰。

与“软件腐烂”作斗争

持续学习

避免知识重复的陷阱

编写灵活、动态、适应性强的代码

利用基本工具的力量

避免依赖巧合编程

了解实际需求

解决并发代码的底层问题

防止安全漏洞

打造务实的程序员团队

对你的工作和事业负责

持续有效的测试,包括基于特征的测试

构建实用的入门工具包

取悦您的用户

简介

《程序员的修养之道》之所以在全球广为流传,被一代又一代的开发者奉为标准,是因为它可以创造真正的价值:或者写出更好的软件,或者探索编程的精髓,以及所有收益都与特定的语言、框架和方法无关。时隔20年的新版经过全面重选、整理和编写,涵盖哲学、方法、工具、设计、解耦、并发、重构、需求、团队、并且易于架构技术的转换和重用。这本书非常有见地和有趣,适合从初学者到建筑师的各个层次的读者,全神贯注地学习或扩展知识。

书评

赞誉不断:通过写一本书来推动整个行业是安迪和戴夫在《实践准则:从悲伤到专家》中完成的一项壮举。然而,有时两次雷击确实击中了同一个地方,这幅杰作的再版证明了这一点。其令人印象深刻的内容更新足以确保它在接下来的二十年中始终保持在“最佳软件开发书籍”列表的首位,并且名副其实。

——VM (Vicky) Brasseur

瞻博网络开源战略总监

如果您想让您的软件领先于时代并易于维护,请随身携带一份“程序员之道:迈向实用主义的最高境界(第 2 版)”的副本。这本书充满了实用的建议,包括技术和专业的,这将使您和您的项目在未来几年受益。

――安德烈亚·古莱特

Corgibytes 首席执行官

LegacyCode.Rocks 创始人

可以说,《程序员之道》彻底改变了我的职业轨迹,为我在软件领域指明了成功的方向。正是这本书拓宽了我的视野,让我意识到我不仅仅是一台巨大机器上的一个齿轮,而是有一天我可以通过实践成为一名工匠。这是我生命中很重要的一本书。

——奥比·费尔南德斯

Rails Way 的作者

第一次阅读本书的读者在看到软件开发实践的新世界时会立即充满期待。这本书的第一版在塑造这样一个迷人的现代世界方面做得很好。现在,第一版的读者将有机会在新版中重温旧梦,再次接受以《程序员修养之道》为标准的洞察力和实践智慧的洗礼。更重要的是,由两位专家整理更新的再版书籍,焕发了新的知识。

——大卫·A·布莱克

《Ruby程序员的修行之路》作者

《程序员之道》的旧版本就在我的书架上。自从很久以前它改变了我作为程序员的工作方式以来,我一直在阅读和阅读。在这个新版本中,一切似乎都变了,一切似乎都还在。虽然我们现在在 iPad 上阅读新版本,但它的代码示例是用现代编程语言实现的——但其中嵌入的概念、想法和态度是永恒的和普遍的。二十年后,这本书从未失去它的价值。令人欣慰的是,现在和未来的开发人员都有机会从 Andy 和 Dave 的见解中受益,就像我当时所做的那样。

—— 桑迪·马莫里

敏捷教练

自我选择如何让人们超越作者

20 年前,《程序员之路》的第一版彻底颠覆了我的科技生涯。这个新版本也会对你产生这种影响。

——迈克·科恩

“Scrum 敏捷软件开发”

“敏捷估计与规划”

用户故事和敏捷方法的作者

程序员修炼之道——通向实用主义的最高境界

很多年前我读过这本书,并认为它是一个宝藏。现在读这本书的第二版,书中提到的许多思想和方法都像当年一样触动了我,激励着我成为一个务实的程序员。

00

作者在前言中列出了务实程序员的五个特征。就像能力陷阱说的那样,如果你想有所作为,你必须首先定义你想成为什么样的人,然后去做那样的事情。而这五个特点是一个务实的程序员应该具备的。通过这样做,我也可以成为一个务实的程序员。务实程序员的五个特点是:

包容。成为早期采用者、快速适应者、乐于看到新事物、快速学习并成为通才。

好奇心。如果你不明白,问,不要羞于问。

具有批判精神。想想你的工作,成为一个批判性的思考者。 “倾听你内心的蜥蜴”。不要依赖巧合,而是要深思熟虑地编程。编程时要时刻注意自己在做什么。能够向更初级的程序员详细解释您编写的代码。不要使用您不完全了解的应用程序,或使用您不了解的技术。只依赖可靠的东西,不要依赖假设,记录假设,不要只测试代码,测试假设。

现实一点。保持真实。

专注于工艺。

01

第一章从哲学层面描述了一个务实的程序员应该具备的世界观或思想框架,包括以下内容:

生活是你的,你有选择的权利。

提供选择,不要找借口。对自己的行为负责,对错误诚实,并依靠自己的专业知识来解决问题。

不要放过破碎的窗户。不要搁置“破窗”(糟糕的设计、糟糕的决定、糟糕的代码),并在找到它们后立即修复它们。如果没有足够的时间来完全修复它,那就钉它(注释掉糟糕的代码,显示尚未实现的行,或者用假数据替换它)。

不要打破窗户。如果您在一个健康的团队中,并且您的项目代码非常完美(写得清晰、设计精良、简洁优雅),那么您往往会格外小心,即使面对截止日期、发布日期、销售演示等。它搞砸了。

利用石头做的汤作为变革的催化剂;不要做水煮青蛙,记住全景。

足够好的软件。将质量要求视为需求问题。

对知识组合进行定期投资。

沟通。你说什么和你怎么说一样重要。将文档嵌入代码中,而不是束缚在表面上。建议对模板和导出的函数都进行注解,这样对其他开发者在使用时会有很大帮助。限制非 API 评论以讨论它们存在的原因、意图和目标。

02

第 2 章从方法的角度描述了实用程序员常用的一些技术和过程,包括以下内容。

设计应该灵活且易于更改。解耦,避免全局数据,尽可能使用接口表达多态性,提供带委托的服务,使用mixins共享功能,正交性,DRY(不要重复自己),事件策略(有限状态机,观察者模式,发布/订阅,反应式编程和流式传输),转换式编程(所有程序实际上都是数据的转换),具有外部配置的参数化应用程序。

靠近问题域的程序。构建内部语言所花费的精力并不多于节省的精力。仅当应用程序的域语言对用户开放编写时,才建议选择外部语言。

学习原型。任何有风险的东西,任何以前没有尝试过的东西或对最终系统至关重要的东西,任何未经证实的实验性或可疑的东西,以及任何让你不舒服的东西都需要原型,例如架构、现有系统中的新功能、数据结构或外部数据的内容、第三方工具或组件、性能问题、用户界面设计。

使用追踪器找到目标。原型生成一次性代码,跟踪代码是最终系统框架的一部分。 Tracer 代码允许用户更早地获得工作,为开发人员构建一个工作框架,因此您拥有一个集成的平台,可以演示的内容以及更好的进度感。

估计。通过估计避免意外。选择答案的单位以反映您想要传达的准确性。估计基于对问题建模。估计的项目进度使用项目评估技术 PERT(分为乐观、最有可能和悲观估计)。当被要求进行估算时,请说“我稍后再联系您”。

根据代码,不断迭代调度。首先对初始函数进行编码和测试,然后标记为第1次迭代的终点。根据通过这个过程积累的经验,细化关于迭代次数和每次迭代如何处理的最终猜测。一遍一遍的迭代,精炼出来的东西会越来越好,进度的信息也会越来越多。

03

第 3 章概述了实用程序员使用的基本工具。包括以下这些。

纯文本。以纯文本形式保存知识。

外壳命令。

编辑器。轻松一步一步地使用编辑器。编辑时,需要自省。每次发现自己在重复做某事,就应该习惯性地想,可能有更好的方法,然后尽快找到这种方法,内化成一种肌肉记忆。你可以这样做。唯一的办法就是不断重复。

版本控制。

调试工具集。只是解决问题并解决它。不要惊慌,解决问题而不是指责。

一种文本处理语言。

工程日记。

04

第 4 章,务实的偏执狂,指出务实的程序员甚至不相信自己,他们建立了一系列的防御。本章是对这些防御机制的描述。包括以下内容

按合同设计。按合同设计。如果调用者满足所有前置条件,则所有后置条件和不变量在完成时都保证为真。

早早崩溃。

使用断言来防止不可能的事情。

保持资源平衡。从头到尾,分配资源的函数和对象负责释放它们。地方行动。对于大多数应用程序,我们可以为每种类型的资源制作一个包装器,并使用这些包装器来跟踪所有分配和释放操作。

不要超出大灯范围。小步走,从头到尾。

05

第6章针对并发的具体问题梳理了一些技术和方法,包括打破时域耦合,通过分析工作流提高并发;使资源具有事务性;随机失败通常是并发问题,通过角色实现并发,你不必共享状态,也不必使用黑板来协调工作流。

第 7 章不仅讲了在编码时不断思考、对问题敏感、编程深思熟虑,以及重构、测试和测试驱动开发的方法和思想,而且更强调确保系统安全。确保系统安全的基本原则包括最小化攻击面的大小、最小权限、安全默认值、加密敏感数据和维护安全更新。

第 8 章介绍了令人烦恼的需求坑的解决方案。没有人确切地知道他们想要什么。程序员帮助人们了解他们想要什么。需求是从反馈循环中学习的,与用户一起从用户的角度思考。需求中的策略是元数据。请记住维护项目词汇表。

第 9 章的作者谈到了如何做一个务实的项目。

拥有一支小而稳定的团队。

使用以往务实的理念、方法、工具等。

取悦用户。用户真正想要的不是代码,他们只是有一个业务问题需要在他们的目标和预算范围内解决,他们相信他们可以通过与您的团队合作来解决。所以请用户,而不仅仅是提供代码。

自动化。不要使用手动程序,一切都取决于自动化。在匿名云服务器上自动部署构建项目。

如何做一个务实、高效、高效的程序员?

什么是程序员?

我问过身边的同事,不同的人有不同的答案。

一个做运维的人说:“一个程序就是一段几千行的代码,用来解决一个问题。有时候,为了维护它,我想痛打人。写这段代码的程序员他脑子里有很多东西。什么?”

一位做架构设计的同事,发际线已经开始往后移了,他回答说:“程序员是资深的砌砖工,为了实现文档中指定的功能而移动代码。

做后端算法一整月一句话不说的同事说:“程序员是高级人机翻译,写一堆机器语言,让机器通过识别来实现你想要的输出你的意见。”

我们先不管他们的答案是否正确,因为每个人对程序员都有不同的看法和看法。

最近看了一本书《程序员的修炼之道:通用实用主义的最高境界》。书中的很多观点可以为程序员提供一个更冷静的视角来重新审视程序员的角色,为程序员提供一个更冷静的视角。工作提供了一些思路和方法。

它告诉我们如何成为务实的程序员,编写更好的软件,探索编程的本质。这本书于 2020 年再版,与其说是第二版,不如说是前一版的演变。这本书涵盖了哲学、方法、工具、设计、解耦、并发、重构、需求、团队等等。初学者和高级架构师都可以从作者的思想中受益。

作者 Andrew Hunt 是一位软件开发作家,也是一位冷酷的科幻作家。这本书是他与大卫·托马斯合着的开创性著作。此外,他还是《程序员的培养之道》、《程序员思考维护与实践》等书籍的作者,并着有获奖的《高效程序员的45个习惯:敏捷开发的培养之道》,并且还发表了很多文章。

我从事软件开发已经八年多了。从“hello World!”开始进入现在的算法设计、架构设计、方案设计,虽然我没有服务亿万用户的经验,但我还是写过运行5年的代码,经历了超过十个大大小小的项目,一路走来,我也取得了小小的收获。

直到我读了这本书,我才意识到自己违反了一些原则,犯了很多次完美主义的错误。比如在功能完善之前就对代码进行了重构,各个模块的耦合度极高,导致影响全身的情况等等。

在经历了足够多的项目之前,一开始很难发现这些错误。这可能是成长的代价。如果能早点遇到这本书,一定程度上可以避免工作中一些不必要的坑,成为一个更加务实高效的程序员。

正如书中所说:“如果您遵循我们的方法,您将快速获得经验、提高生产力并更好地理解整个开发过程。最终,您将编写出更好的软件。”

01.务实的哲学

务实的编程源于务实的思维哲学。

务实的程序员在面对问题时的态度、风格和哲学是什么?着眼大局,超越表面问题,放宽视野,结合现实,做出明智的妥协和理性的决策。

例如,书中“足够好就足够了”的想法给了我很多启发,这也是程序员常犯的错误。

为了追求更好,我们摧毁了足够好的东西。 ——莎士比亚的《李尔王》

几年前,我参加了一个非常重要的“十三五”升级改造项目。我负责后端计算部分,和其他同事合作完成了一个比较大的项目。有同事负责UI,有同事负责硬件信号处理。 , 有同事负责日志处理,有同事负责数据库部分。

我在项目开发过程中几乎遇到了本书中提到的所有问题。一开始,我们总想把软件做到无懈可击,总想以高调的姿态完成项目,所以在项目过程中,我们一遍又一遍地修改我们的设计方法。在整个项目开发的过程中,我查阅了200多篇中外文献,当我看到一个别人做得很好的方法时,我就一直想把它移植到这个项目中。结果,在项目节点的交付中,虽然完成了列出的功能,但问题并没有完全解决,第一版交付的方式是覆盖了问题。

作者指出,“足够好”一词并不意味着草率或糟糕的代码。所有系统都必须满足基本的性能、隐私和安全标准。从用户需求的角度来看,你做的是否足够好?最好留给用户参与判断。

正如本书所教导的,现实世界不允许我们生产完美的产品、完全没有错误的软件。

我们缺乏让用户(甲方)参与整个过程的机会。很多时候,详细的要求是由我们的团队头脑风暴的。其实我们应该倾听用户的需求,因为他们比我们更了解用户的需求是什么。

完成一个软件项目的过程应该更像是完成一幅画。从一开始就明确整个作品的基调,勾勒出作品的框架,而不是一开始就扣掉作品的细节,比如用什么设计模式,用什么算法来实现某些功能。一开始要明确整个项目的结构,整个项目使用的交互方式,使用的数据库等基本问题。

“艺术家会告诉你,如果你不知道什么时候停下来,你所有的努力都白费了。如果你一直在画布上分层,用细节覆盖细节,最后的作品就会迷失在在油漆中。”

02.务实的操作

没有作家,故事就不会写出来;没有演员,故事就不会栩栩如生。 ——安吉-玛丽·德尔桑特

作者用并发来描述可以并行处理的问题和技术。好像是给新手的。老手应该熟悉并发、并行、多线程和多处理。对于复杂的程序软件,如果有大量的并行程序模块,首先应该使用活动图来确定。有朋友说,除了操作系统,世界上最复杂的软件就是浏览器了,这也是为什么国内还没有完全自主的操作系统或者浏览器内核的原因。

简单的说,浏览器就是以字符串的形式对html进行格式解析。假设您已经编写了这样一个内核,并且它已经通过您的界面进行了渲染。您还会遇到性能问题,为什么其他人的浏览器如此流畅,而您的浏览器可能会被谷歌搜索栏显示卡住。这就是并发的重要性,它涉及到太多并发模块之间的垂直耦合编程。

图中倒数第二列是线程数。总共有7个进程,几乎每个网页一个进程。

这也是我们经常遇到的一个问题,当你写一个软件的时候,你认为它似乎已经完成了所有的功能。但是一旦系统有异常值或边界值输入,你的软件就会崩溃。然后您检查信息并更改解决问题的方法。但是,在其他测试过程中,程序又崩溃了,你会在不断的崩溃中崩溃。

此时,我们应该停下来思考一下,这个打补丁的方法有没有问题,能不能跳出来,用图让我们更清楚问题的关键节点,或者是不是可以通过优化器处理线程模式和并发来提高工作效率...

作者在开发过程中也遇到了作者提到的问题,比如共享数据队列怎么处理,共享资源怎么做,信号量,资源锁,原子性等问题。这些问题是真实存在的。

我的想法是,遇到类似问题的开发人员可以编写自己的通用模块。如果可以封装自己的信号量、共享队列和资源锁,那就太好了。

因为几乎所有的并发资源共享问题都可以通过自己编写的模块来解决。为什么要使用您自己编写的模块而不是使用现有模块?首先,可以提高对底层实现的理解;第二,一旦你对共享资源队列有任何特殊要求,你可以修改它,甚至提高性能。一开始可能会很痛苦,但你会发现你付出的努力是值得的。

03.务实的依赖

在 L 组,Stover 管理着 6 名一流的程序员,这和养猫一样具有挑战性。 ——《华盛顿邮报》杂志,1985 年 6 月 9 日

在软件开发团队中,合作精神的重要性不言而喻。团队可以只有几个人,也可以是几千人,持续时间可以是一年,也可以是几十年。例如,Linux 内核团队。大多数开发任务中,根据不同的功能点,将团队分成几个小团队,人员比较稳定,充其量也就10-12人左右。团队相互信任和依赖。

团队沟通与协作

团队是一个整体,团队成员之间的磨合极为重要。最好保持合作默契,沟通顺畅。如果不可能,它可以受条约约束。

团队是一个整体,小问题要积极修复和处理。团队必须对产品的质量负责,质量保证取决于团队每个成员的自发贡献,而不是质量管理人员的监督。

团队沟通,包括内部和外部沟通。大多数时候,程序员都喜欢在自我陶醉的高潮中沉浸在根据需求文档编写代码的过程中,就像陶醉其中一样。

然而,沟通是整个开发的重中之重。我对技术着迷,很容易忽视客户的需求,忘记客户至上的理念。软件开发不是花招。客户的需求应该是我们所追求的。不要以为客户什么都不懂,要耐心倾听,多与客户沟通,与客户协调。因为只有沟通协调才能让我们的技术落地。

团队内部的沟通和沟通是实现需求的重要手段。我们不能认为小白比老菜鸟还差。软件开发涉及方方面面,我们不可能对所有领域都了如指掌。你应该养成不断学习的习惯,保持谦虚谨慎的态度。

团队应该是一个整体。如有任何想法,应及时沟通协调。努力工作,尽快做出满意的产品。将问题留在团队内部消化解决,以最佳状态完成软件开发,并鼓励每个成员积极监控环境的变化。保持清醒,注意任何有风险的事情。积极衡量新要求,不要抗拒变化。

结论

读完这本书,我觉得它会成为我职业生涯的有力指南。

它不仅提醒了软件开发中需要注意的地方和要避免的风险点。其务实的思维方式具有更广泛的适用边界,其他职业的人也可以借鉴和借鉴。

虽然我已经完成了几个项目,但我仍然认为本书中列出的 99 个技巧需要更多关注。希望通过本书的学习,能够总结自己这些年的得失,更好的面对未来,以更积极的心态和状态去工作。

阅读剩余
THE END