一个软件需要设计,这是你一定认同的。但软件设计到底是什么,不同的人却有着不同的理解:
有人认为,设计就是讨论要用什么技术实现功能;
有人认为,设计就是要考虑选择哪些框架和中间件;
有人认为,设计就是设计模式;
有人认为,设计就是 Controller、Service 加 Model;
……
你会发现,如果我们按照这些方式去了解“软件设计”,不仅软件设计的知识会很零散,而且你会像站在流沙之上一般:
今天你刚学会用 Java,明天 JavaScript 成了新宠,还没等你下定决心转向,Rust 又成了一批大公司吹捧的目标;
你终于知道了消息队列在解决什么问题,准备学习强大的 Kafka,这时候有人告诉你 Pulsar 在某些地方表现得更好;
你总算理解了 Observer 模式,却有人告诉你 JDK 中早就提供了原生的支持,但更好的做法应该是用 Guava 的 EventBus;
你好不容易弄清楚 MVC 是怎样回事,却发现后端开发现在的主要工作是写 RESTful 服务,Controller 还没有用,就应该改名成 Resource 了;
……
我们说,软件设计要关注长期变化,需要应对需求规模的膨胀。这些在不断流变的东西可能还没你的软件生命周期长,又怎能支撑起长期的变化呢!
那么回到一开始的问题,软件设计到底是什么呢?
核心的模型
在回答这个问题之前,我们先来思考这样一件事:软件的开发目的是什么?
一个直白的答案就是,软件开发是为了解决由需求带来的各种问题,而解决的结果是一个可以运行的交付物。比如,我们在线购物的需求,是通过电商平台这个方案解决的。
那软件设计在这个过程中做的事情是什么呢?就是在需求和解决方案之间架设一个桥梁。
区别于解决简单的问题,软件的开发往往是一项长期的工作,会有许多人参与其中。在这种情况下