极客大学架构师训练营 编程的本质与未来 第三课 听课总结
说明
编程的本质与未来
这一课的内容都是从Bob大叔(Robert C. Martin)的书《敏捷软件开发原则、模式与实践》借鉴而来。笔者也写过Bob大叔2016年的演讲,可以配合来看。【编程的未来 Java, C, Go, Swift, Dart? Uncle Bob Martin - The Future of Programming 】
讲师:李智慧
架构设计回顾
上面这张图是上课的同学分类的,详细设计很多时候也是架构师的工作内容。笔者在阿里任职期间,实际上是要做开发设计的,比较符合阿里的分类。
李智慧老师从初级工程师到首席架构师的跃迁
李智慧老师,第一份工作是05年做日本的一个大型系统,那个时候前端是VB,服务端是用Java。刚开始的时候,一共也是几个人。最开始进去时候发现用VB调用Java Server,还没有办法直接调用。那个时候高手都到日本出差去了,李智慧老师给项目经理说了这个gap。项目经理也不懂技术,项目经理就说既然你提出这个问题,你就负责做这个组件吧。李智慧老师周末就看了Struts的架构,用两天时间画了一些组件图。周一就找项目经理评审,项目经理就协调了一些技术高手过来评审,觉得没什么大的问题。项目经理说现在项目还没开始,剩下的几个人就交给你分配任务,完成这个组件,并用一个业务做个Demo。最终组件就按照计划实现了,业务Demo也跑通了。后来大业务团队都从日本回来了,因为时间关系,大家就用了李智慧老师的框架,200多人的大团队都用了这个模块组件来进行前后端通信。高手们也提出一些改进计划,李智慧老师,后面就不断优化这个通信模块组件。整个团队都要李智慧老师培训,前端、后端如何用这个模块,包括后面入职新员工,都是由李智慧老师培训如何用该通信组件开发。李智慧老师从刚入职的低级新员工,到离开的时候就成了首席架构师。
第二份工作,李智慧老师跳槽到另一家日本公司,做的类似于Tomcat这种中间件,脱离了业务,专门去做技术架构。李智慧老师,觉得这两份工作经历为他后来的职业生涯提供了很大的帮助。
软件开发简史
从编程的历史看编程的本质和未来
请带着以下问题观看本节课的内容。
你还在用面向对象编程语言写面向过程的代码吗?
莱布尼兹的奇思怪想
莱布尼兹就是跟牛顿打了一辈子官司,谁是微积分的发明人。二进制就是莱布尼兹发明的。一切信息都可以用二进制表示。
计算机软件编程是个非常新兴的行业,程序员这一职业的出现不过半个多世纪,但是人类从事编程的探索却要久远的多,在计算机出现之前,甚至蒸汽机出现之前,人类就开始探索软件编程了。
最早开始编程探索的人是德国人莱布尼兹,早在1700年代,莱布尼兹就期望将各种事物都通过一种逻辑语言进行描述,然后用一种可执行演算规则的机器进行计算,就可以计算出事物的各种结果。这种思想其实和我们现代的软件编程与计算机已经差不多了,莱布尼兹为了实现这个想法,进行了大量的工作,获得了丰硕的成果,其中就包括了微积分和二进制。
莱布尼兹是计算机思想,后来科学家布尔,用Bool实现了逻辑编程。(就是Bool变量的这个布尔。)
人类第一位程序媛
莱布尼兹制造可编程计算机的梦想没有成功。又过了100年,法国人雅卡尔发明了一台可编程的织布机,这种织布机读取纸带上的打孔,进而控制织布机织出不同的图案。于是人们开始尝试将打孔纸带用于计算机编程,19世纪中叶,当英国人 Ada 利用打孔纸带写出人类第一个软件程序的时候,距离能够运行这个程序的计算机发明还有100年的时间,而这个程序已经包含了循环和子程序。 *Ada* 因此被认为是人类第一个程序员, 准确来说,是程序媛。科技发明受时代的限制,天才们的想象力和聪明才智却可以超过时代。
什么是计算机?什么是程序?
人类发明制造计算机器有非常悠久的历史,但是这些计算机器都是专门进行数值计算的,加减乘除、微分积分等等。而从莱布尼兹、Ada,到图灵、冯诺依曼,这些现代计算机的开创者们试图创造的是一种通用的计算机,这种计算机不是读取数值进行计算,而是读取数据进行计算,这些数据本身包含着计算的逻辑,这个数据就是程序。
现代计算机与现代的程序
当冯诺依曼在 ENIAC 计算机上输入第一个程序的时候,标志着现代计算机的诞生,也意味着软件编程这一新兴行业即将出现。
最早的计算机编程非常麻烦,程序员需要将电线编来编去,作为输入数据,以控制计算机的执行,这也是编程这个词的由来。不过很快人们就将打孔纸带应用到计算机上,编程的效率极大提升。
面向电线编程的时代。
形形色色的编程语言
汇编语言(以下为6502汇编)
每一种 CPU 都有独特的机器语言,因而需要不同的汇编语言。
早期的 Basic 语言
早期 Basic 语言虽然号称为 “高级语言”, 但是保留了汇编语言的特性 -- 地址(即行号)。
结构化的 Basic 语言(Quick Basic、Visual Basic等)
结构化的 Basic 语言仍然兼容传统的 Basic,而且提供了更好的集成开发环境IDE。
结构化的编程取消了 "地址" 和 Goto 语句,代之以几种程序控制 "结构", 如:循环、条件等。
Perl 语言
Perl 是一种脚本语言,最强大的功能是正则表达式。但 Perl 的语法比较晦涩难懂。 Perl 是一种 "伪" 的面向对象语言。
C 语言
C 语言是一个结构化的语言
C++ 语言
C++ 向后兼容 C 的所有功能,并且提供了面向对象的编程机制。
Java 语言
Java 是一个完全面向对象的语言,尤其是在当今的 Internet 编程领域,占领了绝对的市场。
编程语言的实质
编程的目的是:用计算机来解决现实世界的问题。
编程的过程即:在计算机所能理解的 "模型" (解空间)和 现实世界 (问题空间)之间,建立一种联系。
编程语言是一种 "抽象" 的机制, 问题是对 "谁" 来抽象。
问题领域(Problem Domain)
包含与系统所要解决的问题相关的实物和概念空间。
面向对象就是面向问题领域中的对象的编程。
抽象的种类
机器代码和汇编语言
对基础机器进行抽象
非结构化的高级语言(如 Basic,Fortran等)
对计算处理逻辑抽象
结构化的程序设计
开始对问题领域进行一定程度的抽象
面向对象的程序设计
直达表达问题空间内的元素
编程方法的演讲
编程的核心要素
面向对象是编程语言发展的最高阶段,新出来的语言都是面向对象的语言。
从莱布尼兹编程开始,只要编程的认知不变,新的编程语言不会超过面向对象的语言,40多年的面向对象语言一直没有变过。
面向对象编程的细分领域。最近几年,新的语言有些变化,面向数据的语言。机器学习,AI编程的出现,Scala函数式编程语言,比较适合面向数据编程。不同的函数之间调用,是异步执行的。
什么是面向对象编程
第一个成功的面向对象的语言 Smalltalk 描述:
万物皆为对象。
程序是对象的集合,它们通过发送消息来告知彼此所要做的。
每个对象都有自己的由其它对象所构成的存储。
每个对象都拥有其类型。
某一特定类型的所有对象都可以接受同样的消息。
C++ 和 Java 等后期的面向对象语言,都是在这个基础上设计的。
什么是对象
Booch 对于对象的描述:对象具有状态、行为和标识。
状态: 表明每个对象可以有自己的数据。
行为:表明每个对象可以产生行为。
标识:表明每个对象都区别于其它对象。(唯一的地址)
无状态对象,对象没有自己的数据,对象的数据都是通过参数传进来的,处理完后就没有了。
面向对象编程的三要素(特征)
封装性(Encapsulation)
隐藏实现细节(访问控制)
定义接口
继承性(Inheritance)
IS-A 关系
HAS-A 关系(组合)
多态性(Polymorphism)
后期绑定(虚函数)
向上转型 (Up Casting)
封装性 - 隐藏实现
封装并不是面向对象语言独有的。
面向过程的编程语言,比如 C 语言,也可以实现封装特性,从头文件 .h
里面定义方法,而在实现文件 .c
文件里定义具体的结构体和方法实现,从而使依赖 .h
头文件的外部程序只能够访问头文件里定义过的方法,这样同样实现了变量和函数的封装,以及访问权限的控制。
继承性 -- 接口的重用
集成也不是面向对象独有的。
C 语言也可以实现继承。如果 A 结构体包含 B 结构体的定义,那么就可以理解成 A 集成了 B, 定义在 B 结构上的方法可以直接(通过强制类型转换)执行 A 结构体的数据。
多态性 -- 对象互换的魔法
多态也不是面向对象独有的。因为指向函数的指针,多态事实上在 C 语言中也可以实现。
但是使用指向函数的指针实现多态是非常危险的,因为这种多态没有语法和编译方面的约束,只能靠程序员之间约定,一旦出现 bug,调试非常痛苦。因此在面向过程语言的开发中,这种多态并不能频繁使用。
而在面向对象的编程语言中,多态非常简单:子类实现父类或者接口的抽象方法,程序使用抽象父类或者接口编程,运行期注入不同的子类,程序就表现出不同的形态,是为多态。
多态是面向对象语言最重要的特性,如果没有用好多态,那就是没有掌握好面向对象编程。
总结
面向对象是编程语言发展的最高阶段,新出来的语言都是面向对象的语言。
从莱布尼兹编程开始,只要编程的认知不变,新的编程语言不会超过面向对象的语言,40多年的面向对象语言一直没有变过。
面向对象编程的细分领域。最近几年,新的语言有些变化,面向数据的语言。机器学习,AI编程的出现,Scala函数式编程语言,比较适合面向数据编程。不同的函数之间调用,是异步执行的。
注意:以上信息如有侵权,请联系作者删除,谢谢。
版权声明: 本文为 InfoQ 作者【John(易筋)】的原创文章。
原文链接:【http://xie.infoq.cn/article/c7094ac0e66c22aad07cfb5af】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论