查看原文
其他

如果现在只能用汇编和Goto编程......

码农翻身刘欣 码农翻身 2021-04-27

上世纪五六十年代,高级语言还没普及,很多人用汇编写程序,汇编代码运行效率高,但是有个致命的缺点:不容易看懂,维护困难。


程序设计是少数聪明人干的事情,他们智力超群, 写代码也不讲什么规则,可以随意使用灵活而又强大的Goto,写出只有自己能懂的代码。


但是到了六十年代中后期,事情就慢慢不对了,计算机的计算能力提升速度远远超过程序员,软件规模和数量随之急剧上升, 出现了一堆问题:项目预算超支,项目难以管理,代码质量很低,软件不符合需求,这该怎么办?



01北约会议



1968年,“北约软件工程大会”在风景如画的德国小镇Garmisch召开(我很奇怪为什么这个会议以北约的名义牵头,有知情的同学请告知。)



会议指出:软件的复杂度已经变得人脑无法掌控,我们已经处于严重的软件危机当中!


会议强调:软件的生产有必要建立在某些理论基础和实践指导之上!


会议要求:各单位要切实加强对其他学科的学习,实施软件软件工程的办法,努力提高程序设计的效率和质量。


可是理论基础和实践指导在哪里呢?



021968年的Dijkstra



每当危机到来,总会有大神出手相救,这一次是Dijkstra。



学编程的同学肯定知道他,《数据结构和算法》中有他的Dijkstra算法,《操作系统》中有他的信号量,银行家算法,他还在程序设计,分布式计算,并行计算,编译器等很多领域做出了开创性贡献,于1972年获得计算机界最高奖:图灵奖。


Dijkstra大神经过研究,于1968年在ACM上发表了一篇论文,名字叫做《Go to 语句有害论》,要求废除Go to 语句!


这篇战斗檄文一下子就使编程界炸了锅,支持Goto 语句的人觉得他们的权益受到了极大的侵犯:没有Go to 语句,程序流程怎么跳来跳去,以后怎么写代码?


Dijkstra准备充分,他本人在50年代就用机器代码编写了大量程序,清楚地知道Go to 语句的危害, 但是为了以理服人, 他搬出了一个著名的、被证明的理论:


无论是什么程序,不管多么复杂,都可以用三种基本的结构来表达:顺序,分支,循环。



所以,你们不用再瞎BB了, 不用go to 语句也能写程序。



03结构化编程



更进一步,Dijkstra创造了一个词:结构化编程,它包括这些元素:


控制结构:顺序, 分支,循环,还有著名的递归

子程序:也叫过程,方法,函数,可以封装一系列语句让别人调用。

代码块:如if...fi,Begin...END , {....}


这几乎就是现代编程语言最基本的元素了,软件工程这座大厦的地基终于打好, 结构化编程掀起了一场革命:


自顶向下分析问题

模块化设计

高内聚、低耦合

瀑布式开发方法

......


结构化编程大大降低了编程的复杂性, 必须感谢这些大神,让我等资质平庸的人也能投身于软件编程的伟大事业当中,如果把我扔到五六十年代的Go to洪流中,我可能活不过三集。


对Go to 的争论一直没有停歇,包括高纳德这样的大神也卷入进来,发表文章《Structured Programming with go to Statements》,他分析了许多常见编程任务,然后发现其中的一些使用Go to 将得到最理想的结构。例如:跳出嵌套循环,多个分支的跳出等,所以现在很多编程语言依然保留着goto这个关键字。



04致命问题



随后几年,结构化编程运动如火如荼,人们写的程序越来越复杂,结构化编程的两个致命问题逐渐暴露:


1.  维护全局变量变成噩梦


子程序(函数)虽然封装了相同的代码逻辑,成为黑盒子,但是多个子程序(函数)需要共享信息的时候,就需要全局变量,全局变量一旦变多,维护就变成噩梦。




2. 子程序(函数)的复用性太差


函数是一个有输入、输出的简单的逻辑单元,其他程序可以通过调用公用函数来实现复用,但是这种复用的层次太低。


比如:我们想定义一个这样的主程序:



里边包含一些逻辑,但是有些步骤是虚线,表示希望在运行时能动态的替换成用户自己的东西(没错,这其实就是一个框架了!) ,结构化编程就有点儿着急了。


也就是说,我们无法复用这个主程序的结构。


C语言可能会跳出来:用函数指针来做啊。没错,函数指针能实现,但是属于高级技巧,不是普罗大众程序员能玩的, 何况有些语言还不支持。



051967年的Simula



时间倒退一年到1967年,挪威的两名科学家Ole-Johan Dahl 和Kristen Nygaard发明了一个叫做Simula 67的语言,这个语言和当时流行的Fortran, COBOL, Basic 全然不同, 它不但支持类,还支持继承,多态这些新鲜的概念。


不过由于当时的计算机硬件性能低下,而这些概念又过先进,所以在很长时间内都没人注意到。


随着结构化编程缺陷的暴露,人们发现Simula 67 这门语言的特征正好可以解决上面的两个问题:


1. 类可以把函数和成员变量组织在一起,消除全局变量


使用权限控制,可以使得实例变量对外不可见。


2. 通过多态,可以实现对主程序的复用




主程序只调用接口或者缺省类,使用者提供实现类,两者结合起来,完成业务功能。


大神程序员可以集中精力搞定那些最基础,最重要的东西,创建出通用的框架和类库让程序员使用。我等普通人只需要专注业务逻辑即可, 又可以快乐地搬砖了!


使用面向对象的技术代码的复用层级从简单的函数进化到类和框架,不仅如此,还有些程序员从框架和类库中抽取出了可以重用的思想:模式。


面向对象技术从60年代的Simula 67起源,70年代出现了Smalltalk,80年代出现了C++, 到了90年代,Java横空出世,面向对象编程终于成为主流。


2001年,图灵奖姗姗来迟,颁给了发明Simula 67 的Ole-Johan Dahl 和Kristen Nygaard。



06尾声



1967年和1968年真是神奇的两年, 面向对象技术发明, 结构化编程运动开启。


表面看,这两项技术没什么大不了的,但是它们都降低了软件开发的复杂度,使得普通人也能参与到搬砖的伟大事业当中,这才造就了繁荣的软件编程行业和互联网。


请大家切记,使用某种更高级的技术,不能代表你就能开发出高级的程序,关键在于人。 用面向对象的语言,写着面向过程的程序,这样的人大有人在。


所以,如果有人再宣称

OOP大法好

设计模式大法好

函数式编程大法好

XXX框架大法好

XXX大法好


你不用多费口舌,只需要问他一个直击灵魂的问题:你用这个技术,是不是降低了你所在领域的复杂度呢?是不是提高了可维护性和重用性?看看他怎么回答吧!


后记:本文是受到《面向对象是怎样工作的》一书的启发所写,这本书比较深入地讲述了面向对象的技术,推荐。




架构师劝退指南Java每次遇难,总会有大神拯救你们这些偷代码的程序员!程序员的宿命芯片战争70年,真正的王者即将现身干掉软件开发的最大怪兽:狼人宇宙第一IDE到底是谁?HTTP Server :一个差生的逆袭如何降低程序员的工资?程序员,你得选准跑路的时间!两年,我学会了所有的编程语言!Javascript: 一个屌丝的逆袭我是一个线程TCP/IP之大明邮差一个故事讲完HttpsCPU 阿甘

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存