前言:
软件架构师必须站在一个很高的高度去审视自己软件的架构,去理解自己的工作在更宏大的背景中的位置和作用,才能构建出一个经得起时间考验的软件系统。这个高度既能包括技术的高度和深度,也包括对软件编程这件事情的认知的程度,比如软件编程的历史和未来的理解,以及对自己工作的使命感的理解。
计算机软件编程是个非常新兴的行业,程序员这一职业的出现不过半个世纪,但是人们从事软件编程的探索却要久远的多,在计算机出现之前,甚至蒸汽机出现之前,人类就开始探索软件编程了。
最早开始编程探索的人是德国的莱布尼茨,早在17世纪,莱布尼茨就希望将各种事物都经过一种逻辑语言进行描述,然后用一种可执行的演算规则的机器进行计算,就可以计算出事物的各种结果。这种思想其实和我们现代的软件编程与计算机已经差不多了,莱布尼茨为了实现这个想法,进行了大量的工作,获得了很多的成果,其中就包括了微积分与二进制。
但是人们不能超越自己的时代,莱布尼茨制造了可编程 计算机的梦想并没有取得成功。又过了100多年,法国人雅卡尔发明了一台可编程的织布机,这种织布机经过读取纸袋上上的打孔,进而控制织布机编织出不同的图案。于是人们开始尝试打孔纸袋用于计算机编程,19世纪中期,当英国人Ada利用打孔纸袋写出人类第一个软件程序的时候,能够运行程序的计算机发明还有100多年,而这个程序已经包括了循环和子程序。Ada因此被认为是人类的第一个程序员。科技发明受时代的限制,天才们想象力和聪明才智却可以超越时代。
发明制造计算机有非常悠久的历史,但是这些计算机都是专门进行数值计算的,加减乘除,微积分等,而从莱布尼茨、Ada、到图灵、冯诺依曼,这些现代计算机的开创者们试图创造的是一种通用的计算机,这种计算机不是读取数值进行计算,而是读取数据进行计算,这些数据本身包括这计算的逻辑,这个数据就是程序。当冯诺依曼在ENIAC计算机上面输入第一个程序的时候,标志着现代化计算机的诞生,也意味着软件编程这一新兴的行业即将出现。信息时代、互联网时代而至,人类开始了有史以来最大的一次科技革命。
现在编程已经习惯了打开IDE,编写程序代码然后编译执行或者解释执行,认为编程就该如此。觉得那些不需要IDE,只是不需要编写字板或者Vim就可以编程的人里面的大牛了。事实上,最早的计算机编程非常麻烦,程序员需要将电线经过复杂的处理,输入数据,控制计算机执行,这个也就是编程的由来,不过很快人们在计算机上面实现了打孔的处理,编程的效率大大的提升了
程序员终于可以写代码,这个阶段的程序要需要牢记计算机指令的二进制编码,软件开发就是直接使用这些二进制指令进行编程,每个计算机指令后面要带操作数,操作数也是二进制编码,所有的这些二进制就是程序的代码,由程序员输入到计算机中。
早期的程序员意识到使用二进制进行编码很困难,于是发明了汇编语言。使用机器指令二进制编码是唯一不同是,汇编语言提供了机器指令助记符号,编程的时候,机器指令可以使用助记符号进行代替。软件的编程依然是需要使用计算机指令,一个指令一个指令进行编程处理。因此,机器指令二进制编程和汇编语言本质上都是面向机器的编程。汇编语言程序如下,这个已经是PC时代的汇编语言程序了。
在计算机出现的早期,即使堆程序员而言,计算机也是一个神奇的存在,同一台计算机,可以进行科学的计算,也可以进行弹道轨迹的计算处理,还可以进行财务核算的计算处理,计算机强大,神奇而且昂贵。
最早期的高级编程语言是Fortran,这是一种专门用于科学计算的高级语言,诞生于1957年。但是真正主流使用的各种高级语言诞生于1970年前后,其中就包括C语言,传说丹尼斯里奇发明了C语言,然后为了证明C语言的特性,开发了Demo,就是Unix操作系统
高级语言的普及极大释放了程序员的自由性,软件开发迎来了黄金时期,程序员的第一个极客时代,比尔盖茨、乔布斯都是那个时代成长起来的。
面向过程的复杂性随着软件规模的发展,面向过程的软件关注逻辑流程,更容易被设计成面条式程序,尝尝的过程调用,而大型项目最好由这样长调用组成,随着项目的复杂度 提高,最好项目维护成本越来越高。于是很多大型软件的开发过程开始失控,最终以失败告终。
软件危机使程序员们开始重视软件编程这件事情的本质,除了一部分科学计算或者其他特定目的的软件,大部分的软件是为了解决现实世界的问题,起亚的库存管理,银行的账务处理等等,软件编程的本质是程序员用代码的方式使现实世界的事务运行在计算机上面,计算机软件是为了解决现实世界的问题而开发出来的,那么软件编程这件事情应该关注的重点是客观世界的事务本身,而不是程序员的思维方式或者计算机的指令。
如果软件编程的重点是客观世界的本身,那么编程语言如何才能更好满足这一需求,于是,面向对象的编程语言应运而生。面向对象编程以对象作为软件编程的基本单位,提出了一切皆对象,客观世界的用户、账户、商品是对象;创建、组合、关联这些是对象的工厂、适配器、观察者也是对象;将所有的这些对象分析、设计、开发出来,一个软件系统就完成了,这个软件系统灵活、强大、最重要的是可以根据需求变化快速更新维护,Java代码:
编程技术的发展过程,经过了面向机器的编程、面向过程编程、面向对象编程三个阶段。这正好也是马克思经济学关于劳动力三个元素,劳动工具--》计算机、劳动者---》程序员、劳动对象---》客观对象。编程从面向劳动工具进化到面向劳动者,再进化到面向劳动对象。
面向对象编程似乎已经进化到编程这件事情本身意义上的终极形式。但是事实上并非如此,随着科技的不断发展,特别是大数据,人工智能以及移动互联网的发展,面向数据的编程需求越来越多,能够更好迎合这一需求的编程模型开始得到青睐,比如函数式编程。而极客编程的程序员对强类型的面向对象编程越来越不看好。他们希望在编程的时候能够得到更多的自由,编程语言的重心似乎重新出现了面向程序员的趋势。随着随着计算机性能的不断增强,以及互联网应用对计算资源需求的不断增加,如何更好地利用CPU的多核以及分布式集群的多服务器特性,必须是软件编程以及架构设计时需要考虑的重要问题,软件编程越来越多需要考虑机器本身,相对应的,反应式编程得到越来越多的关注。
根据辩证唯物主义可知,事物的发展轨迹是波浪式前进的,螺旋式上升,有的时候似乎重新回到过去,但是却有了本质的区别和进步,软件编程的进化史还在继续,是否对未来充满期待。