人是软件工程里最薄弱的环节,应为软件工程里的任何逻辑都可以用if/else实现,对于机器执行而言也没有什么困难,但是人却很难理解,就像有句话说的“代码是写给人看的,只是偶尔给机器执行”,所以为了解决这个问题,才出现了软件工程。从某种角度说软件工程的含义就是将复杂的逻辑通过某种手段变得让人更易理解。而以我的理解,这种手段就是抽象。

打个比方,让一个人放羊,人的眼睛一次只能盯着10只羊,但是现在有100只羊要放,怎么办?那就找10只牧羊犬呗(假设一只牧羊犬眼睛一次也只能盯着10只羊),每只牧羊犬各自盯着10只羊,人只需要盯着10只牧羊犬就行了。通过这种手段,一个人就能控制100只羊了。软件工程也是如此,一方面系统的需求导致了比较高的复杂度,另一方面人的脑子无法处理这么复杂的逻辑。为了解决这个矛盾,我们就要梳理好系统的业务逻辑,先忽略各种细节(正是这些细节极大的增加了系统的复杂度),将整个逻辑抽象成几个大的逻辑单元,这几个大的逻辑单元构成了实现整个系统逻辑的闭环,现在,我们需要处理的只是这个几个逻辑单元之间的逻辑关系,这时候需要我们大脑处理的逻辑复杂度就大大的降低了。等我们实现好这个逻辑单元之间的逻辑关系,理论上我们的系统就能实现,但是这只是理论,应为我们此时有个前提就是假设各个逻辑单元内部的逻辑细节是能够走通的。接下来,我们就可以逐个的实现各个逻辑单元内部的逻辑细节了,这时候,我们可以将每个逻辑单元当作一个独立的系统了,同理,我们依然可以将这个子系统抽象出几个大的逻辑单元,然后实现这些逻辑单元之间的相对不那么复杂的逻辑关系(如果感觉这些逻辑关系实现起来还是比较复杂,那是不是我的脑子实在太笨了???也许吧,还有可能是我们抽象的不合理,但这不还是说明我们的脑子比较笨?哈哈哈,人脑的笨是绝对的,聪明只是相对的),依此处理,最后我们成功的将系统里需要人脑同时处理的复杂度降低到我们能接受的程度了,系统也就能成功实现了。另外,我们也会发现通过抽象我们将系统的逻辑自然而然的分了层,就像一个金字塔。

现在,我们的整个系统的逻辑已经通过抽象成为一套有层次的逻辑了,那这么做仅仅是降低了系统的复杂度吗?还有个最大的好处就是每一层、每个逻辑单元都是独立的,这就叫低耦合高内聚。比如老板催的比较急,这个系统的上线时间提前了,要是没给系统抽象分层,那么从0到100的逻辑只能一个人同步的实现,而现在我们可以安排多个人分别实现0到10,10到20….并且是异步实现。因为每一层、每一个逻辑单元都是独立的。他们对外的功能都是约定好的,而内部的实现逻辑又不会影响到其他单元。再比如,老板想要我们实现另一个系统,经过分析,那个系统里某一层或者某一个逻辑单元和这个系统是一样的,那么我们就可以直接把这块逻辑拿过去组装一下就OK了。

所以,软件工程存在的意义就是人需要实现超出人脑能接受的复杂度的逻辑,并且还想偷点懒的实现。而解决手段就是抽象,而这也引出了一系列实现原则,比如:单一指责、关注隔离、开闭原则…这些以后有空再说。

嗯,再补充一句,人脑也不是笨的没有下限,一旦我们抽象出的逻辑单元内部的逻辑复杂度已经降低到正常的人脑能处理的程度了,就没必要再往下抽象出一层逻辑单元了,如果这么做那就叫过度工程化,我刚写代码时会犯这种错误,还自以为写的代码很优美。