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

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

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

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到架构师》之架构的历史背景

《计算机文化》

百度百科

原文地址:https://www.cnblogs.com/youcong/p/10015993.html

时间: 2024-10-10 02:04:11

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

面向对象编程6大设计原则:单一职责原则

单一职责原则(Single  Responsibility Principle)简称SRP原则. 定义 应该有且仅有一个原因引起类的变更. 优点 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多: 提高类的可读性,提高系统的可维护性: 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响. 说明 单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则: 单一职责原则要根据项目的实际情

<从编程到(架构)设计之路>的翻转式系列课程

<从编程到(架构)设计之路>的翻转式系列课程 课程(1):  从接口(Interface)出发:接口设计的技术和艺术 一個成功案例的實務傳承 高焕堂37年码农经验讲解 指导教练:高焕堂 1. 简介翻转式课堂 1.1  翻转式课堂的目标 萨尔曼·可汗 說:未来的世界是不确定的,因此重要的不是学到什么,而是学习新知识的能力.教育应该具有实践性,其目的应该是帮助学生掌握技能.取得信息,使他们能够谋生.教育应该具有实践性,其目的应该是帮助学生掌握技能.取得信息,使他们能够谋生.学徒制的基础是主动学习-

架构设计的方法学

约公元前25年,古罗马建筑师维特鲁威说:"理想的建筑师应该既是文学家又是数字家,他还应通晓历史,热衷于哲学研究,精通音乐,懂得医药知识,具有法学造诣,深谙天文学及天文计算."(好难哪,软件构架设计师的要求呢?大家好好想想吧.)   本文目录   一.与构架有关的几个基本概念:   二.构架设计应考虑的因素概揽:   三.程序的运行时结构方面的考虑:   四.源代码的组织结构方面的考虑:   五.写系统构架设计文档应考虑的问题   六.结语   一.与构架有关的几个基本概念:   1.模

转载知乎上的一篇:“ 面向对象编程的弊端是什么?”

弊端是,没有人还记得面向对象原本要解决的问题是什么. 1.面向对象原本要解决什么(或者说有什么优良特性)似乎很简单,但实际又很不简单:面向对象三要素封装.继承.多态 (警告:事实上,从业界如此总结出这面向对象三要素的一刹那开始,就已经开始犯错了!). 封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫接口. 有了封装,就可以明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者:而外部调用者也可以知道自己不可以碰哪里.这就提供一个良好的合作基础--或者说,只要接

面向对象编程的弊端是什么? 深入理解面向对象

现时C++可以说是支持OOP范式中最为常用及高性能的语言.虽然如此,在C++使用OOP的编程方式在一些场合未能提供最高性能.[1]详细描述了这个观点,我在此尝试简单说明.注意:其他支持OOP的语言通常都会有本答案中提及的问题,C++只是一个合适的说明例子. 历史上,OOP大概是60年代出现,而C++诞生于70年代末.现在的硬件和当时的有很大差异,其中最大的问题是内存墙. 内存墙,指的是内存性能严重限制CPU性能发挥的现象.在过去的20多年中,处理器的性能以每年大约55%速度快速提升,而内存性能的

架构设计三部曲之如何写架构设计说明书

架构设计是需求分析到软件实现的桥梁,也是决定软件质量的关键.编制架构设计说明书是开发人员向架构师转变必定会经历的过程.在架构师整个的成长过程中,必定会经历编制架构设计说明书.评审架构设计说明书以及根据业务需求分析设计系统架构的三个过程.作为一个架构师,我想尝试一下根据这三个过程对不同能力需要,写一次系列文章,包括<架构设计三部曲之如何写架构设计说明书>.<架构设计三部曲之如何评审架构设计说明书>以及<架构设计三部曲之如何做架构设计>,一来可以帮助自己整理思路,重新审视架

iOS分层架构设计

大家都知道,在移动设计开发中有很多种模式,最常用的单例设计模式.MVC设计模式.工厂设计模式.KVO.通知.代理等等.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.而架构设计是宏观的.全面的将设计魔术组织起来解决整个应用系统的方案.架构设计是人们对一个结构内的元素及元素间关系的一种主观映射的产物.一个好的架构设计有着良好的可复用性和可扩展性,这样可以满足用户不断变化的需求. 低耦合企业级系统架构设计 我们知道,软件设计的原则是提高软件系统的"可复用性"和

架构设计之如何写架构设计说明书

架构设计是需求分析到软件实现的桥梁,也是决定软件质量的关键.编制架构设计说明书是开发人员向架构师转变必定会经历的过程.在架构师整个的成长过 程中,必定会经历编制架构设计说明书.评审架构设计说明书以及根据业务需求分析设计系统架构的三个过程.作为一个架构师,我想尝试一下根据这三个过程对不 同能力需要,写一次系列文章,包括<架构设计三部曲之如何写架构设计说明书>.<架构设计三部曲之如何评审架构设计说明书>以及<架构设计三部曲之如何做 架构设计>,一来可以帮助自己整理思路,重新

面向对象设计与面向对象编程

我发现,面向对象设计,被忽视的太严重了.使用OOP语言,却不是面向对象来设计.无非就是用类写C程序而已,而且这种情况还很常见.另一种情况是过度重视类,而忽视了对象,但是对象才是根本.不过本文会以类型为主,来介绍面向对象设计. 前言 面向对象是一个完全不同于传统软件设计方式的理念,传统软件设计是以功能为主体,以功能为模块,以功能为目标.而面向对象不同,是以软件运行中的组件为主体,实现某个功能,只是恰好这些组件的交互可以间接做到.这些组件,就是对象.用面向对象来设计软件,实际上就是设计一系列的对象,