02
04
58
08
为了账号安全,请及时绑定邮箱和手机立即绑定

谈谈《软件设计哲学》里的设计心得

我最近读完了约翰·奥斯特霍特的《软件设计哲学》。如果你喜欢《代码整洁之道》或《程序员修炼之道》,那么你也会喜欢这本书。这本书的内容与那些书非常相似,部分内容与那些书有重复,并且主要聚焦于区分优良的软件设计与糟糕的软件设计。

当我读技术书时,我总是记笔记,并标出那些让我有共鸣的部分。这有助于我记住我认为有意义的内容。下面是我大部分的笔记,希望你们也能找到一些与你产生共鸣的内容。

享受!

编程小贴士

当你对某人的代码建议有不同的看法时,试着理解一下为什么会有这样的分歧。《代码整洁之道》中的建议也包括在内。

“每个规则都有例外,每个原则都有它的限度。如果你把任何设计概念推到极致,最终可能会陷入糟糕的境地。”

复杂度

“对于读者而言,复杂性比作者感知的更为明显。你觉得很简单,但其他人觉得复杂,那么它就是复杂的。当你遇到这种情况时,了解一下其他开发者为何觉得代码复杂;这种差异背后可能隐藏着一些值得学习的经验。作为开发者,你的任务不仅仅是创建自己能够轻松处理的代码,还应该创建其他人也能轻易处理的代码。”

复杂性的迹象

  • 变更放大:看似简单的改动往往需要在多个不同的地方修改代码。
  • 认知负荷:完成任务时,开发者需要了解多少内容
  • 未知的未知:哪些代码需要修改并不明显

好的设计应该很明显。

模块、接口和实现方式

模块应该深入。复杂的实现应该被简单的接口所隐藏,这些接口具有易用的默认设置,适合最常见的使用情况。

“最棒的特点是你甚至都不知道它们的存在,”

“如果你是模块开发者,你应该尽量让使用你的模块变得尽可能简单,即使这意味着你需要投入更多的时间和精力。”

“减少需要处理异常的情况。”

设计思路和方法

“设计软件很难,所以你最初对如何构建模块或系统的想法可能不是最好的。如果为每个主要设计决策都考虑多种选择,结果会更理想。”

“尽量选择一些彼此完全不同的方法;这样你会学到更多。即便你坚信只有一种合理的设计,也试着考虑第二个设计方案,无论你觉得它多么糟糕。思考这个设计的不足,并将其与其它设计的特点进行对比,会有帮助。”

备注和文档

应该用评论来解释那些代码本身无法表达清楚的事情,比如某项决策背后的思考,做出某个决定的理由。

“跨模块文档面临的最大挑战是如何找到一个开发人员会自然发现的位置。”

一致性、惯例和编码规范

“一致性创造认知优势:一旦你学会了某个地方是如何做某件事的,你就可以用这些知识立即理解其他采用相同方法的地方。”

关于文档编码规范和编码风格偏好。尽可能地使用自动化工具(如 ESLint 和 Prettier)来执行这些规范。当你加入新的公司或团队时,遵循已有的编码规范。对所有现有代码进行重构或重写以适应新规范,通常不值得去做。

战术 vs 战略;还有敏捷

不要仅仅着眼于让一个小改动生效,如果这会让未来的改动变得更复杂。战术编程 vs 战略编程。

“敏捷开发往往会引导开发人员专注于功能,而非抽象,并鼓励开发人员推迟设计决策,以便尽快推出可运行的软件。例如,一些敏捷实践者认为,一开始不应急于实现通用机制;先实现一个最小的专用机制,然后根据实际需要将其重构为更通用的形式。虽然这些论点在一定程度上是有道理的,但它们与投资方法相对立,并且鼓励了一种更战术性的编程风格。这可能迅速导致复杂性积累。”

测试为什么很重要

“测试在软件开发中非常重要,尤其是单元测试,因为它们可以帮助我们更容易地重构代码。没有测试套件,对系统进行大型结构调整会变得很危险。没有容易的方法来发现错误,因此错误可能会在新代码部署后才被发现,这时发现和修复错误的成本会大大增加。因此,在没有良好测试套件的系统中,开发人员会尽量避免重构;他们尽量减少每次添加新功能或修复错误时的代码改动,这会导致系统的复杂性逐渐增加,设计上的错误也不会轻易被修正。”

“有了良好的测试集,开发人员在重构代码时会更有信心,因为测试套件会捕捉到大部分引入的错误。这鼓励开发人员对系统进行结构改进,从而得到更好的设计结果。单元测试尤为重要:单元测试的代码覆盖率通常高于系统测试,因此更有可能发现潜在的错误。”

性能提升

在做出性能改动之前,测量你需要的数据以建立当前性能的基准。我们对哪些改动能提升性能的直觉有时是错误的,这些改动要么没有实质性影响,要么实际上会降低性能。

围绕核心路径来设计代码。在不是最瓶颈的地方进行性能优化,这样一来,当你到达路径的那部分时,仍然会遇到瓶颈。

结论部分及好的设计带来的好处

“你對良好設計的投資很快就能得到回報。你在項目開始時精心定義的模塊,隨著你一次又一次地重用它們,將節省你大量的時間。你半年前撰寫的清晰文檔,當你回去給代碼添加新功能時,也將節省你不少時間。你花在提升設計技能上的時間同樣值得:隨著你的技能和經驗增長,你會發現自己能夠越來越快地創作優秀的設計。一旦你掌握了窍门,良好的設計其實並不會比快速拼凑的設計多花太多時間,一旦你知道如何做。

“成为好设计师的好处是,你可以在设计阶段花费更多时间,这很有趣。而糟糕的设计师大多时间都在调试复杂的、脆弱的代码。如果你提升你的设计技能,不仅能够更快地开发出高质量的软件,而且整个软件开发过程也会更加愉快。”

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

0 评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消