软件设计的关键在于处理制品的复杂度。制品不同,其复杂度不同,需要的设计程度也不同。例如,如果需要制作一个布口袋或者搭建一面简易的砖墙,那么不需要进行专门的设计就可以直接缝制和堆砌。但是如果需要制作一件衬衣或者盖一间民居,就需要进行一些精细的设计了。如果需要定制一套盛装或者建成一栋大厦,那么需要多层次、多角度、专业和杰出的设计。
软件开发也同理,如果需要开发一个“计算 n !”,或者“进行冒泡排序”,又或者“对一个文件数据进行简单增删改操作”的软件,那么不需要进行专门的设计就可以直接编写代码,这些软件的复杂度还在人类思维的直接处理能力范围之内。但是如果需要开发一个小超市使用的销售业务系统,就需要进行一些简单的设计了。如果再复杂一些,需要开发的是一套类似于淘宝、京东系统的电子商务系统,那么需要一群出色的人组成团队进行细致反复的专业设计。
综上,之所以要在建造一个制品之前进行规划,是因为制品的复杂度超越了人类思维的直接处理能力。在复杂度超出人类思维的直接处理能力时,要么生产者对生产过程毫无头绪,要么结果质量不佳导致浪费。建造之前的规划活动可以帮助生产者厘清生产过程和建造细节,以尽可能地控制制品的质量,避免浪费。
初学者在学习时,接触的往往都是相对简单的软件开发需求,以至于无法深刻理解设计的作用,甚至忽视了设计活动,这会使得他们进入大型产品开发团队时面临工作困难。
软件设计的关键是控制复杂度。控制复杂度的主要手段有两个:一个是设计分层,另一个是关注点分离。