第95篇
极客时间《许式伟的架构课》课程笔记。
编程语言的出现,诞生了程序员这个职业,汇编语言则是程序员这个分工出现的标志。
软件是活的书籍
- 书籍能够通过文字记载事件、传递情感、揭示规律、传承技术,软件也可以做到这些并且做得更好
- 软件的表达方式更具有多样性:书籍只能通过文字描述进行表达,软件除了文字,还能通过超链接、声音、动画、视频、实时交互反馈等方式来还原场景
- 软件对技术可以现场还原:文字记载可能会出现看不懂学不会的情况,而软件对技术的还原是精确的,技术传承也是精确的,失传概率大大降低
编程范式的进化
编程范式是编程语言的一种分类方式,它并不针对某种编程语言,一个编程语言可以支持多种范型多范型。典型语言是C++
过程式
- 过程式就是以一条条命令的方式,让计算机按我们的意愿来执行
- 过程式编程中最核心的两个概念是结构体(自定义的类型)和过程(也叫函数)
- 通过结构体对数据进行组合,可以构建出任意复杂的自定义数据结构。通过过程可以抽象出任意复杂的自定义指令,复用以前的成果,简化意图的表达
- 过程式语言的代表是 Fortran、C/C++、JavaScript、Go 等等
函数式
- 函数式本质上是过程式编程的一种约束,它最核心的主张就是变量不可变,函数尽可能没有副作用
- 函数式编程相对小众,因为代码质量虽然高,但是学习门槛也高
- 函数式语言的代表是 Haskell、Erlang 等
面向对象
- 面向对象在过程式的基础上,引入了对象(类)和对象方法(类成员函数)
- 面向对象编程主张尽可能把方法(其实就是过程)归纳到合适的对象(类)上,不主张全局函数(过程)
- 面向对象语言的代表是 Java、C#、C++、Go 等等
从“面向对象”到“面向连接”
面向对象的的优点
- 一是清晰的使用界面,某种类型的对象有哪些方法一目了然
- 二是信息的封装。面向对象不主张绕过对象的使用接口侵入到对象的内部实现细节
多态和继承
- 面向对象通过接口可以实现过程编程很费劲才能做到的“多态”:不同对象可以用相同代码来实现类似的复杂行为
- 继承带来了编码的便捷性,但也有了新的负担,因为复合对象的构造方法需要在“组合”和“继承”两个中间进行选择
面向连接的语言
- 所谓面向连接就是朴素的组合思想。研究连接,就是研究人与人如何组合,研究代码与代码之间怎么组合。
- 代码规范约束了人的行为,是人与人的连接契约;消息传递约束了进程的行为,是进程与进程的连接契约
- 消息传递是多核背景下流行起来的一种编程思想,其核心主张是:尽可能用消息传递来取代共享内存,从而尽可能避免显式的锁,降低编程负担
语言对架构的影响
- 从软件的业务架构来说,本身应该怎么拆分模块,每个模块具体做什么样的事情(业务边界是什么),这是业务需求本身决定的,和编程语言并没有关系
- 但在描述每个模块的规格时,采用的规格描述语言建议选择团队开发时采用的语言来描述接口
- 现实中语言的选择对业务架构决策的影响极其关键,原因有两个,1是开发效率,2是后期维护