软件设计的系统思维
Author |
Guodong Zhu |
Version |
1.0.0 |
软件开发者的烦恼
对于入门编程的人来说,首先投入的是编程语言的学习,这个阶段主要是在摸索如何运用语言去表达想要实现的功能,也就是怎样给计算机发正确的操作指令。经过一段时间、一些项目的训练,便可以积累起常用的语言技巧,比如C++的类继承、虚函数,Java的接口、同步锁等等,在语言这个层面,逐渐熟练起来。
随着参入编写的软件复杂度的增加,苦恼也随之出现:bug五花八门;新功能加不进去;每修改少量代码,便引出大量问题;按下葫芦浮起瓢……逐渐陷入了被代码所折磨的境地。
此时心中常常泛起困惑:是否有更好的软件实现方式?程序员只能机械式的面向API手册编程、面向谷歌搜索编程,面向bug编程吗?如何写成更庞大、更复杂、质量更高的软件?
软件设计:系统性工具
就像苏格拉底所说:“未经审视的人生是不值得过的”,未经过精心设计的软件大多是混乱、错误、低劣的产物。软件开发的先行者们摸索出一条软件复杂度的应对之策:软件设计。软件设计的内涵是:从更高的层次,更广阔的视角去察看、分析软件。它将软件作为一个整体、一个系统来综合看待和处置,在这个系统中,各个模块各司其职,又相互配合,对外提供复杂的功能。
软件设计的核心是应对软件复杂度,这其中包括了产品需求的复杂度和软件功能的复杂度,当然,大量的需求需要集成大量的功能来实现,这是因和果的关系,因此,根本上,软件设计的核心是应对软件需求的复杂度。
软件设计是一个工具箱,打开这个工具箱,我们可以看到:SOLID原则、设计模式、架构设计、软件重构、软件测试等等。下面就走马观花,看看其中几点:
SOLID原则:以5个面向对象的基本设计原则(单一功能、开闭原则、里氏替换、接口隔离、依赖反转)的首字母命名。当这些原则被应用时,一个软件能够获得更好的维护性和扩展能力。
软件重构:本质上就是软件修改。软件并不是一成不变,它会随着时间发展和演进,如何修改软件的一部分是开发者工作的主要内容之一,软件重构的主旨便是探索如何更好地修改软件。
软件测试:软件测试的wiki定义是:一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。其中TDD(Test-drived Development,软件驱动开发)是一种受推崇的软件开发实践。一种通俗的理解是,测试就像是一把尺子,一种测量工具,比如:常见的ST、UT就像是米尺和厘米尺,用来量不同量级的长度(模块功能和函数功能)。
软件开发中的系统思维
大多软件总是以一个功能集合的整体形式提供给用户使用。这样看来,软件设计,便是回归问题的本原,是一个位于相同(整体)层次下的解决方案。更进一步,纵观这个问题的处理过程,也可以得到一个结论:良好的软件开发需要具备系统思维。
程序开发中引发困扰的一个常见因素便是过度陷于实现的细节,执着于如何操作具体的文件,如何操作具体的数据库字段,不是说这些不重要,但不分层次,不做抽象,就可能埋下系统性冲突的“雷”,这也就是我们常说的典型“技术债务”的之一。因此,从积累编写更优秀程序的能力角度来说,我们追求逻辑自洽、实现完备、高内聚低耦合的软件系统,系统思维正是其中关键。