为什么结构化编程、面向对象编程、软件工程、架构设计最后没有成为软件领域的银弹

为什么结构化编程、面向对象编程、软件工程、架构设计最后没有成为软件领域的银弹?

从计算机语言开始讲,一步一步的概述和讲解,最终会有一个结论,大家往后看,即可明白。

1.机器语言(1940年之前)

机器语言,直接使用二进制码0和1来表示机器可以识别的指令和数据。

比如0100011111000010101,请问你知道是什么意思吗?反正我是不知道。

当然了,不可否认的是机器语言是最底层与CPU直接交互。

机器语言之所以没有流行下来,原因三个方面:

(1)太难读了;

(2)太难写了;

(3)太难改了(万一因为0和1之间位置偏差导致程序出错,那真的会让人哭死);

当然了,机器语言并非没有优点,它的优点就是快,天下武功唯快不破。

 

 

2.汇编语言(20世纪40年代)

为了解决机器语言太难写了、太难读了、太难改了等三个缺点,于是,汇编语言应运而生。

例如:

机器语言:1000001001000111111

汇编语言:mov ax,bx

相比机器语言来说,汇编语言要清晰的多。比如mov是移动(move),ax和bx是寄存器的代号。

汇编语言解决了机器语言难读难写难改的缺点,当然了,它也有它的不足,比如我们必须精确地了解和熟悉计算机底层知识。

关于计算机知识的书,有一本比较通俗的读物,但是也不算是通俗,那本书的名字叫做《计算机文化》

对于计算机的基础知识描绘十分系统和详细,建议大学生或者是开发经验比较稳固但是计算机基础知识欠缺的朋友可以看看,我就时不时翻阅一下,这本书,我对此的阅读方法是:

(1)有选择的阅读,不要从头开始翻(我第一次读的时候,差点读着就睡着了,因为觉得太过乏味,后来有选择的看看,基本翻完了70%);

(2)你可以尝试快速从头开始翻,感兴趣的可以花点时间仔细看看,不感兴趣的,直接跳过;

总而言之,每个人都有每个人独特的阅读方式。

关于这本书的章节大概,我列出一下,大家可以做个参考。

一共十二章:

第一章 计算机和数字基础知识

A部分:一切数字事物

B部分:数字设备

C部分:数字数据显示

D部分:数字化处理

E部分:密码安全

 

第二章 计算机硬件

A部分:个人计算机基础知识

B部分:微处理和内存

C部分:存储设备

D部分:输入和输出设备

E部分:硬件安全

 

第三章 计算机软件

A部分:软件基础知识

B部分:办公套件

C部分:软件安装和升级

D部分:购买软件

E部分:安全软件

 

第四章 操作系统和文件管理

A部分:操作系统基础知识

B部分:现代操作系统

C部分:文件基础知识

D部分:文件管理

E部分:备份安全

 

第五章 局域网

A部分:网络构建基础

B部分:有线和无线技术

C部分:网络安装

D部分:文件共享

E部分:无线安全

 

第六章 因特网

A部分:因特网技术

B部分:固定因特网接入

C部分:便携式和移动因特网接入

D部分:因特网服务

E部分:因特网安全

 

第七章 Web和电子邮件

A部分:Web技术

B部分:搜索引擎

C部分:电子商务

D部分:电子邮件

E部分:Web和电子邮件安全

 

第八章 数字媒体

A部分:数字声音

B部分:位图图形

C部分:矢量图形和三维图形

D部分:数字视频

E部分:数字版权管理

 

第九章 计算机产业:历史、职业和道德

A部分:计算机历史

B部分:计算机产业和IT产业

C部分:计算机专业人员的职业

D部分:职业道德

E部分:工作区安全和人体工程学

 

第十章信息系统的分析与设计

A部分:信息系统

B部分:系统分析

C部分:系统设计

D部分:实现和可维护

E部分:企业数据安全

 

第十一章数据库

A部分:文件和数据库概念

B部分:数据管理工具

C部分:数据库设计

D部分:SQL

E部分:数据库安全

 

第十二章计算机编程

A部分:编程基础知识

B部分:过程化编程

C部分:面向对象编程

D部分:说明性编程

E部分:安全编程

 

A、B、C、D、E部分还会再细分,至少四个小节,这本书按照我的那种读法,两周就可以读完,不过每天平均可能至少要保持一个小时的阅读。

汇编语言的优缺点:
优点:占用内存少、执行速度快、易读懂。
缺点:可移植性差。

 

 

3.高级语言(20世纪50年代)

高级语言,它是在低级语言的基础上,采用接近于人类自然语言的单词和符号来表示一组低级语言程序,使编程变得更加简单,易学,且写出的程序可读性强。

高级语言的优缺点:

优点:

  (1)高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;

  (2)高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;

  (3)高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高;

缺点:有些高级语言写出的程序执行效率并不高。

 

4.第一次软件危机与结构化程序设计(20世纪60年代~20世纪70年代)

高级语言的出现,解放了程序员,但好景不长,随着软件的规模和复杂性的增加,20世纪60年代中期开始爆发了第一次软件危机,典型的表现:

软件质量低下、项目无法如期完成、项目严重超出预计支出等。

结构化程序设计概念,参考百度百科:

其概念最早由E.W.Dijikstra在1965年提出的,是软件发展的一个重要的里程碑。它的主要观点是采用自顶向下、逐步求精模块化的程序设计方法;使用三种基本控制结构构造程序,任何程序都可由顺序、选择、循环三种基本控制结构构造。结构化程序设计主要强调的是程序的易读性。

 

结构化程序设计的主要特点是抛弃goto语句,采取自顶向下、逐步细化、模块化的指导思想。结构化程序设计本质上还是一种面向过程的设计思想。

通过结构化程序设计,将软件的复杂度控制在一定范围内,从而从整体上降低软件开发的复杂度。结构化程序设计是20世纪70年代的软件开发潮流。

 

5.第二次软件危机与面向对象(20世纪80年代)

结构化编程的流行在一定程度上缓解了软件危机,然而随着硬件的快速发展,业务需求越来越复杂,以及编程应用领域越来越广,第二次软件危机开始到来。

第二次软件危机的根本原因还是在于软件生产力远远跟不上硬件和业务的发展。第一次软件危机的根源在于软件的逻辑变的非常复杂,而第二次软件危机主要体现在软件的“扩展”变得非常复杂。结构化程序设计虽然能够缓解软件逻辑的复杂性,但是对于业务变化带来的软件扩展却无能为力,软件领域迫切希望找到新的银弹来解决软件危机,在这个背景下,面向对象思想开始流行起来。

对于面向对象程序设计定义,引用百度百科:

面向对象程序设计(Object Oriented Programming)作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化

面向对象程序设计思想,现在仍然也很流行,不过据说目前领域驱动设计在不少公司正在实施中,我对这个领域驱动设计不是特别明白,目前用的比较多还是面向对象程序设计,因为我使用的编程语言是Java,Java是一个面向对象的编程语言。

 

6.软件架构

早在20世纪60年代,戴克斯特拉就涉及软件架构这个概念,但是软件架构真正的流行却是在20世纪90年代开始的,由于在Rational和Microsoft内部的相关活动,软件架构的概念开始越来越流行。

软件架构的定义,引用百度百科:

软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象
组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在
面向对象领域中,组件之间的连接通常用
接口来实现。
软件
体系结构是构建
计算机软件实践的基础。与
建筑师设定建筑项目的设计原则和目标,作为
绘图员画图的基础一样,一个
软件架构师或者
系统架构师陈述
软件构架以作为满足不同客户需求的实际系统设计方案的基础。
 
软件架构出现有其必然性,通常都是解决某种语言或者设计思想带来的问题,比如软件架构所解决的问题有三个(针对大规模系统而言)
(1)系统规模大,内部耦合严重,开发效率低;
(2)系统耦合严重,牵一发动全身,后续修改和扩展困难;
(3)系统逻辑复杂,容易出现问题,出现问题后很难排查和修复;
 
综合上述六个方面,我们可知,从机器语言、汇编语言、高级语言、面向结构程序设计、面向对象程序设计、软件架构,可以理解为优秀的进化,也可以理解为基因突变,基因突变有好有坏,每一次基因突变取决于所处的环境,人如此,编程语言或者相关的程序设计或架构亦如此。这就是我最终的观点和想法。
 
最后再针对这个问题:为什么结构化编程、面向对象编程、软件工程、架构设计最后没有成为软件领域的银弹?
我的观点是:所处的环境不用,适用范围也就有了限制,一句话,物竞天择,适者生存。当然了,一句话概述还远远不够。编程语言只是一个方面的体现。
同时还有软件工程方法也同样再变化,从最早期的瀑布模式、迭代、敏捷到现在先进的devops。从结构化编程、面向对象编程、软件工程、架构设计最后没有成为软件领域的银弹问题出发,你仔细想想,从多个方面考虑,以我个人的观点归纳如下:
(1)编程语言的体现,化繁为简;
(2)软件工程的体现,从瀑布、迭代、螺旋、devops,追求的目标是快速、高效、能够适应不断的变化;
(3)框架的变化,框架从过去的重量级到现在的轻量级,比如以java为例,过去的EJB,现在的Spring;
(4)项目管理工具,从CVS到SVN再到Git,或者可以说在没有CVS、SVN、Git之前手动合并代码;
(5)测试的变化,手动测试到自动化测试
(6)应用变化,单体应用到微服务。
诸如这样的例子有很多,欢迎大家留言。
本文除了自己的看法之外,所参考文献和资料如下:
《从0到架构师》之架构的历史背景
《计算机文化》
   百度百科