设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123426 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

78 | 开源实战二(上):从Unix开源开发学习应对大型复杂项目开发

最小惊奇原则
KISS首要原则
为扩展而设计
高内聚、松耦合
基于接口通信
分层与模块化
封装与抽象
财务系统
物流系统
高性能消息队列
图像识别
自动驾驶
设计原则和思想
复杂度
技术难
应对软件开发的复杂度
应对软件开发的难度
大型复杂项目开发

该思维导图由 AI 生成,仅供参考

软件开发的难度无外乎两点,一是技术难,意思是说,代码量不一定多,但要解决的问题比较难,需要用到一些比较深的技术解决方案或者算法,不是靠“堆人”就能搞定的,比如自动驾驶、图像识别、高性能消息队列等;二是复杂度,意思是说,技术不难,但项目很庞大,业务复杂,代码量多,参与开发的人多,比如物流系统、财务系统等。第一点涉及细分专业的领域知识,跟我们专栏要讲的设计、编码无关,所以我们重点来讲第二点,如何应对软件开发的复杂度。
简单的“hello world”程序,谁都能写得出来。几千行的代码谁都能维护得了。但是,当代码超过几万行、十几万,甚至几十万行、上百万行的时候,软件的复杂度就会呈指数级增长。这种情况下,我们不仅仅要求程序运行得了,运行得正确,还要求代码看得懂、维护得了。实际上,复杂度不仅仅体现在代码本身,还体现在协作研发上,如何管理庞大的团队,来进行有条不紊地协作开发,也是一个很复杂的难题。
如何应对复杂软件开发?Unix 开源项目就是一个值得学习的例子。
Unix 从 1969 年诞生,一直演进至今,代码量有几百万行,如此庞大的项目开发,能够如此完美的协作开发,并且长期维护,保持足够的代码质量,这里面有很多成功的经验可以借鉴。所以,接下来,我们就以 Unix 开源项目的开发为引子,分三节课的时间,通过下面三个话题,详细地讲讲应对复杂软件开发的方法论。希望这些经验能为你所用,在今后面对复杂项目开发的时候,能让你有条不紊、有章可循地从容应对。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Unix开源项目是一个值得学习的例子,它从1969年诞生至今,代码量庞大,却能完美协作开发并长期维护,保持足够的代码质量。本文从设计原则和思想、研发管理和开发技巧、以及Code Review三个角度详细讲解了应对复杂软件开发的方法论。文章首先强调了封装与抽象的重要性,Unix系统中的“一切皆文件”设计思想体现了封装和抽象,有效隔离底层设备访问的复杂性,简化了上层代码的编写。其次,文章提到了分层与模块化的重要性,Unix系统将系统划分成各个独立的模块,不同的模块之间通过接口进行通信,实现了高内聚、松耦合的代码结构。最后,基于接口通信和设计高内聚、松耦合的代码也是文章强调的重点。这些方法不仅能有效应对复杂软件开发,还能提高代码质量和可维护性。 文章还提到了一些重要的设计原则和思想,如为扩展而设计、KISS首要原则和最小惊奇原则。为扩展而设计强调在前期设计上多花点时间,提前思考项目中未来可能会有哪些功能需要扩展,以便在未来需求变更的时候,在不改动代码整体结构的情况下,轻松地添加新功能。KISS首要原则强调简单清晰、可读性好是任何大型软件开发要遵循的首要原则。最小惊奇原则则强调遵守统一的开发规范,避免反直觉的设计。这些原则和思想在大型软件开发中能有效地应对代码的复杂性,提高代码质量和可维护性。 总的来说,本文通过详细讲解Unix开源项目的设计原则和思想,以及一些重要的设计原则和思想,为读者提供了应对复杂软件开发的方法论,帮助读者更好地理解和应用这些方法,提高软件开发的效率和质量。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(37)

  • 最新
  • 精选
  • Jxin
    1.不用哪些,只要一个,就是合理的分层。 2.大型软件的持续开发,。人多,代码量大,时间长会有这三个问题。 3.人多:人一多什么鸟都有,在快节奏下,你很难去保证所有人的所有代码质量。即便你有code review,但质量是要对业务做让步的,而这是合理的。那么这时候去要求每个人的,编码规范,抽象封装能力,就非常的难。所以这些能力对软件质量很重要,但你抓不了也是白搭。反观分层,它其实是限定了一块业务逻辑,实现代码的基本拆分和归类,定义了一个基本的规范。任何人都可以顺着这个规范去阅读他人的代码。实现了最基本的复杂性隔离。可执行可落地,试用期基本就可以灌输成功。 4.代码量大:对于代码量大的项目,要找到目标功能,是很痛苦的。而分层在这时候就具备类似索引的功能。哪怕项目没注释,只要它按着分层写,你就可以顺着 业务 功能 细节这样的线去摸到目标功能,无需从入口开始读代码。 5.时间长:软件在时间线上是动态的,当下的业务边界很可能因时间的推移而被变革,需要重组模块的数据范围和业务边界。好的分层可以让你更快的重组模块,解决当前模块划分不合理的问题。具体可以看下ddd的分层。它可以让你在重组模块时,只需花一两个小时,剪切粘帖整块聚合的业务代码,并调整一些基础功能的实现,便能实现模块重组。而不需长达数个月的风险评估,代码调整,测试覆盖。
    2020-05-03
    2
    69
  • javaadu
    年前做的一个项目,是一个能力编排引擎,这是我实际参与的第一个具备良好设计的软件项目,满足了:抽象和封装、模块化和分层结构、基于接口而非实现编程等设计原则,在这个项目中我才真正获得了对这些设计原则的理解。这个经历说明—我应该尽量去高水平高素质的团队,才有机会遇到高水平的项目和代码
    2020-05-05
    2
    40
  • 下雨天
    分层和模块化,基于接口通讯,这两点最重要! 这个相当于整个架构搭起来了,每个模块怎么划分怎么交流定好了,其他扩展行,可读性,抽象都可以细化到模块中实施。
    2020-05-05
    14
  • jaryoung
    个人觉得是:高内聚、松耦合,高内聚说明合适的人都在一起了,松耦合说明不合适的人的都隔离起来。
    2020-05-02
    1
    9
  • Frank
    我觉得在大型项目开发中,单一职责和最小知识原则也是发挥很大的作用,从编码角度来看,类,模块都遵守单一和最小知识原则,这样的话内聚性高,耦合少,每个类和模块可能都不会太复杂,可读性,可测试性也就不会太差。从一个系统的生命周期来看,单一职责体现为产品,开发,测试,运维。各个角色的人各司其职,耦合不会太多,能有效的提高效率。会想起以前在某家传统公司,需求沟通、设计、编码、测试、维护几乎要自己一个人干,有时候觉得太累。
    2020-05-01
    8
  • 辣么大
    五一快乐! 我觉得抽象封装和分层模块化最能发挥作用。最近在看ROS机器人操作系统,是开源一个中间件系统,思想是通过封装,抽象,使得不懂硬件的程序员可以对机器人进行编程。里面所有的可执行程序,都可以叫做一个node(节点),机器人可以组装的(移动底盘,机器臂等)这个是模块化,机械臂控制使用moveit运动学控制规划模块,底座导航使用导航功能模块,这个算是模块化。机器的各个部分,都使用命名空间的方式访问,和争哥将的linux系统结构的方式差不多。
    2020-05-01
    3
    5
  • 落尘kira
    我觉得是最小惊奇原则,可读性一定要是第一位的(不管代码写的有多惊奇,起码得让后面的同学看懂,多写一行注释也好)
    2020-05-13
    4
  • xk_
    单一职责原则和KISS原则,其他原则太复杂,就记得这两个。
    2020-05-09
    4
  • 如何定义复杂度: 对软件做一些修改,所需的人力物力较少,那么我们就可以说他复杂度低,反之则认定它复杂度较高 分层和模块化应对的是架构层面的复杂度,影响的是整个软件的质量,他应该是软件开发中最重要的部分,一旦发生改动,需要多个模块进行修改,将近于重新做架构设计,成本非常大 实例: TCP/IP网络模型,应用层,传输层,网络传输层,网络层的划分是水平方向的划分,应用服务器,负载均衡服务器,DNS服务器,个人电脑,体现的是垂直方向的划分,这种划分方式能够很好的应对复杂度 基于接口通讯是应对的是模块通讯时的复杂度,一次改动,通常会影响多个模块,需要多个模块的开发者协作才能完成改动,但毕竟只需要修改模块之间的通讯,成本相对较小,所以较为次要 KISS,为扩展设计,最小惊奇应对的是代码层面的复杂度,属于实现细节,改动通常不会被其他模块感知,改动需要的人力物力较上两者更少,所以他最为次要
    2020-05-07
    2
  • J
    封装与抽象、分层与模块化、基于接口通信,我觉得是最重要的三个设计原则。 封装与抽象是从使用者的角度来考虑系统该如何设计。 分层与模块化则是在系统建设者之间划分好界限和职责。 基于接口通信构建了内外之间最合适的交互方式。
    2020-05-05
    2
收起评论
显示
设置
留言
37
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部