极客大学架构师训练营 编程的本质与未来 第三课 听课总结

发布于: 4 小时前

说明

编程的本质与未来

这一课的内容都是从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汇编)

2000: BMI $2009 ;若结果为负数,那么转地址2009
2002: BEQ $200C ;若 = 0,转地址 200C
2004: CLC ;这里说明 > 0
2005: ADC #$01
2007: TAY
2008: RTS
2009: LDY #$01
200B: RTS
200C: LDY #$00
200E: RTS

每一种 CPU 都有独特的机器语言,因而需要不同的汇编语言。

早期的 Basic 语言

10 CLS:J=1:TROFF:KEY OFF:DIM Z(30),B$(20,20),C(30),BS(22):BS=0:BS$(1)="YES":BS$(0)="NO":DIM BU$(11),PL(11),DI$(11),CH(11),SC(11),CH$(11),P2(11):P2(11)=3
11 FOR I=0 TO 7:READ B$(I,10):NEXT I
12 FOR I=1 TO 4:READ B$(I,8):NEXT I
13 FOR I=0 TO 7:READ B$(I,12):NEXT I
14 FOR I=1 TO 4:READ B$(I,14):NEXT I
15 P1=3:QF=1:L$="A":R$="D":U$="W":D$="S":P$="P":Q$="Q":M$="O" 16 FOR I=1 TO 2:READ B$(I,18):NEXT I
17 FOR I=1 TO 2:READ B$(I,20):NEXT I:FOR I=1 TO 30:C(I)=2:NEXT I:C(20)=1
20 COLOR 7,0,0:CLS:DIM NA$(11):DIM NAM$(40)
21 FOR I=1 TO 11
23 READ P2(I),BU$(I),DI$(I),CH(10),SC(I),NA$(I)
25 NEXT I:PLAY "T500"

早期 Basic 语言虽然号称为 “高级语言”, 但是保留了汇编语言的特性 -- 地址(即行号)。

结构化的 Basic 语言(Quick Basic、Visual Basic等)

DO
SCREEN 7, , APage%, VPage% ' Draw to the active page
' while showing the visual page.
' Clear the active page.
CLS 1
' Rotate the cube "Angle%" degrees:
DRAW "TA" + STR$(Angle%) + Plot$
' Angle% is some multiple of 15 degrees:
Angle% = (Angle% + 15) MOD 360
' Drawing is complete, so make the cube visible in its
' new position by switching the active and visual pages: SWAP APage%, VPage%
LOOP WHILE INKEY$ = "" ' A keystroke ends the program.

结构化的 Basic 语言仍然兼容传统的 Basic,而且提供了更好的集成开发环境IDE。

结构化的编程取消了 "地址" 和 Goto 语句,代之以几种程序控制 "结构", 如:循环、条件等。

Perl 语言

package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
sub name {
my $self = shift;
$$self;
}
sub named {
my $class = shift;
my $name = shift;
bless \$name, $class;
}
my $talking = Horse->named("Mr. Ed");
print $talking->name;

Perl 是一种脚本语言,最强大的功能是正则表达式。但 Perl 的语法比较晦涩难懂。 Perl 是一种 "伪" 的面向对象语言。

C 语言

#include <stdio.h>
#include <stdib.h>
int main(void) {
puts("Hello World!");
return EXIT_SUCCESS;
}

C 语言是一个结构化的语言

C++ 语言

#include <iostream>
using namespace std;
int main()
{
cout << "Hello, world!" << endl;
return 0;
}

C++ 向后兼容 C 的所有功能,并且提供了面向对象的编程机制。

Java 语言

package zgpeace.test;
public class TestMain {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

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函数式编程语言,比较适合面向数据编程。不同的函数之间调用,是异步执行的。

注意:以上信息如有侵权,请联系作者删除,谢谢。

发布于: 4 小时前 阅读数: 7
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

前阿里巴巴资深无线开发,目前汇丰银行专家。客户端架构师,全栈工程师。擅长算法、数据结构、设计模式、iOS、Java、 Spring Boot、Spring Cloud、Docker

评论

发布
暂无评论
极客大学架构师训练营 编程的本质与未来 第三课 听课总结