许式伟的架构课
许式伟
七牛云CEO
立即订阅
19859 人已学习
课程目录
已更新 70 讲 / 共 77 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 怎样成长为优秀的软件架构师?
免费
基础平台篇 (21讲)
01 | 架构设计的宏观视角
02 | 大厦基石:无生有,有生万物
03 | 汇编:编程语言的诞生
04 | 编程语言的进化
05 | 思考题解读:如何实现可自我迭代的计算机?
06 | 操作系统进场
07 | 软件运行机制及内存管理
08 | 操作系统内核与编程接口
09 | 外存管理与文件系统
10 | 输入和输出设备:交互的演进
11 | 多任务:进程、线程与协程
12 | 进程内协同:同步、互斥与通讯
13 | 进程间的同步互斥、资源共享与通讯
14 | IP 网络:连接世界的桥梁
15 | 可编程的互联网世界
16 | 安全管理:数字世界的守护
17 | 架构:需求分析 (上)
18 | 架构:需求分析 (下) · 实战案例
19 | 基础平台篇:回顾与总结
加餐 | 我看Facebook发币(上):区块链、比特币与Libra币
加餐 | 我看Facebook发币(下):深入浅出理解 Libra 币
桌面开发篇 (16讲)
20 | 桌面开发的宏观视角
21 | 图形界面程序的框架
22 | 桌面程序的架构建议
23 | Web开发:浏览器、小程序与PWA
24 | 跨平台与 Web 开发的建议
25 | 桌面开发的未来
26 | 实战(一):怎么设计一个“画图”程序?
27 | 实战(二):怎么设计一个“画图”程序?
28 | 实战(三):怎么设计一个“画图”程序?
29 | 实战(四):怎么设计一个“画图”程序?
30 | 实战(五):怎么设计一个“画图”程序?
31 | 辅助界面元素的架构设计
课外阅读 | 从《孙子兵法》看底层的自然法则
加餐 | 想当架构师,我需要成为“全才”吗?
32 | 架构:系统的概要设计
33 | 桌面开发篇:回顾与总结
服务端开发篇 (14讲)
34 | 服务端开发的宏观视角
35 | 流量调度与负载均衡
36 | 业务状态与存储中间件
37 | 键值存储与数据库
38 | 文件系统与对象存储
39 | 存储与缓存
40 | 服务端的业务架构建议
41 | 实战(一):“画图”程序后端实战
42 | 实战(二):“画图”程序后端实战
43 | 实战(三):“画图”程序后端实战
44 | 实战(四):“画图”程序后端实战
45 | 架构:怎么做详细设计?
46 | 服务端开发篇:回顾与总结
加餐 | 如何做HTTP服务的测试?
服务治理篇 (11讲)
47 | 服务治理的宏观视角
48 | 事务与工程:什么是工程师思维?
49 | 发布、升级与版本管理
50 | 日志、监控与报警
加餐 | 怎么保障发布的效率与质量?
51 | 故障域与故障预案
52 | 故障排查与根因分析
53 | 过载保护与容量规划
54 | 业务的可支持性与持续运营
55 | 云计算、容器革命与服务端的未来
56 | 服务治理篇:回顾与总结
架构思维篇 (7讲)
57 | 心性:架构师的修炼之道
用户故事 | 站在更高的视角看架构
58 | 如何判断架构设计的优劣?
59 | 少谈点框架,多谈点业务
60 | 架构分解:边界,不断重新审视边界
加餐 | 实战:“画图程序” 的整体架构
61 | 全局性功能的架构设计
许式伟的架构课
登录|注册

04 | 编程语言的进化

许式伟 2019-04-26
你好,我是七牛云许式伟。今天我们继续来聊聊编程语言。
编程语言的出现,诞生了软件工程师(也叫程序员)这样一个职业,而汇编语言则可以看做是软件工程师这个分工出现的标志。
通过编程语言,软件工程师和计算机可以进行交互,表达自己的思想。但是,如果我们把掌握编程语言看做是软件工程师的专业技能,其实又低估了编程语言带来的革命性变化。
编程语言在信息科技发展中的位置,如同人类文明中语言所在的位置。而编程语言写出来的软件(及其源代码),如同人类文明中不断被传承下来的图书典籍。

软件是活的书籍

我个人一直有一个观点:软件是活的书籍,是我们人类知识传承能力的一次伟大进化。书籍能够通过文字来记载事件、传递情感、揭示规律、传承技术。书籍能够让人们进行远程的沟通(飞鸽传书),也能够让我们了解古人的生活习性,与古人沟通(虽然是单向的)。
这些事情软件都可以做到,而且做得更好。为什么我说软件是活的书籍,有两方面的原因。
其一,表达方式的多样性。书籍只能通过文字描述来进行表达,这种表达方式依赖于人们对文字的理解,以及人的想象能力对场景进行还原。软件除了能够通过文字,还能够通过超链接、声音、动画、视频、实时的交互反馈等方式来还原场景。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《许式伟的架构课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(91)

  • jilur 置顶
    “我的演讲”,我也打不开。。

    编辑回复: 我复制了一份出来,放到了网盘。链接: https://pan.baidu.com/s/1mQen5iJw5Ojwt2nEaePn0Q 提取码: swgb

    2019-04-28
    12
  • 有铭
    对象范式的原始概念其实根本不包括类和继承,只有1,程序由对象组成,2,对象之间互相发送消息,协作完成任务。最初世界上第一个面向对象语言是 Simula-67,第二个面向对象语言是 Smalltalk-71。Smalltalk 受到了 Simula-67 的启发,基本出发点相同,但是最大的不同是Smalltalk是通过发消息来实现对象方法调用,而Simula是直接调用目标对象的方法。Bjarne Stroustrup 在博士期间深入研究过 Simula,非常欣赏其思想,C++的面向对象思路直接受其影响,因为调用目标对象的方法来“传递消息”需要事先知道这个对象有哪些方法,因此,定义对象本身有哪些方法的“类”和“继承”的概念,一下超越了对象本身,而对象只不过是类这个模子里造出来的东西,反而不重要。随着C++的大行其道,继承和封装变成了面向对象世界的核心概念,OOP 至此被扭曲为 COP ( Class Oriented Programming,面向类程序设计)。
    但是COP这套概念本身是有缺陷的:每个程序员似乎都要先成为领域专家,然后成为领域分类学专家,然后构造一个完整的继承树,然后才能 new 出对象,让程序跑起来。
    到了 1990 年代中期,问题已经十分明显。UML 中有一个对象活动图,其描述的就是运行时对象之间相互传递消息的模型。1994 年 Robert C. Martin 在《 Object-Oriented C++ Design Using Booch Method 》中,曾建议面向对象设计从对象活动图入手,而不是从类图入手。而 1995 年出版的经典作品《 Design Patterns 》中,建议优先考虑组合而不是继承,这也是尽人皆知的事情。这些迹象表明,在那个时候,面向对象社区里的思想领袖们,已经意识到“面向类的设计”并不好用。只可惜他们的革命精神还不够,delphi 之父在创建.Net Framework 的时候,曾经不想要继承,在微软内部引起了很大的争议,最后是向市场低头,加上了继承。
    2000 年后,工程界明确的提出:“组合比继承重要,而且更灵活”,Go和Rust也许是第一批明确的对这种思路进行回应的语言,他们的对象根本不需要类本身来参与,也能完成对象范式的多态组合。
    历史让 C++走上了舞台,历史也终将让 COP 重新回到 OOP 的本来面目

    作者回复: 赞。很好的学习材料。

    2019-04-26
    4
    173
  • 郭小菜
    老师的水平和文笔让人佩服得五体投地
    2019-04-26
    23
  • chitanda
    我的工作是Python后台。
    Python开发效率是相当快的,能想到的功能基本都有比较稳定的库,开发起来贼快。
    我公司三个后台,每个人写的Python都不一样,一个喜欢面向对象,一个喜欢类似过程式那种,另一个喜欢自创式。
    自己开发功能虽然相当快,但是一旦涉及到维护其它人的代码,效率就一落千丈,总是看不懂或者想要重构😂😂。
    最近裸辞了在家里学go,第一眼就爱上了这个语言。

    作者回复: 👍

    2019-04-26
    1
    13
  • Hurt
    完全可以看出 老师还是最爱go啊 哈哈😄
    2019-04-26
    13
  • 1900
    编程框架和编程范式具体有什么区别呢?感觉都具备约束、规范的作用。

    作者回复: 最主要的差别是:编程框架通常是领域性的,比如面向消息编程是多核背景下的网络服务器编程框架;编程范式则是普适性的,不管解决什么领域的问题都可以适用。

    2019-04-26
    12
  • 1900
    变量不可变我理解的就是一切变量皆常量(或者只能被初始化一次),但是函数没有副作用就不懂了,副作用具体指啥?为什么内部有IO行为的函数就有副作用呢?

    作者回复: 没有副作用是指对外界不产生影响,是纯函数。修改全局变量、发生io行为都是对外界的影响。

    2019-04-26
    10
  • Junho
    关于许老师说关于继承的看法,我拜读后深有同感。尤其多层的继承,理解成本多项式上升。有点像,你想了解清楚眼前的这位妹子,不但要知道她已有的一切(所有逻辑成员),还要知道她所有祖上(继承链)的一切(包括private),更要知道这位女孩做了什么叛逆行为(override),还不得不知道,这些叛逆行为,会对祖传的既有秘方产生怎样的影响(调用override函数的函数)…
    回顾一下最近自己工作的代码,的确不少的设计,最后会倾向于组合的方式。原本的想法主要是感觉,用继承的话,更像是可以去为了聊天而去相亲…不好意思说错了,是为了面向对象而去面向对象,一个月后,自己理解这部分设计也有不小的成本。读了许老师的课,才从更深层次的意识到这个特性的确有它天生的缺陷。

    作者回复: 挺形象的比喻

    2019-04-28
    9
  • A 付李珏
    我的演讲,链接不过去,是我自己的问题吗?

    作者回复: 我试了一下可以,还有其他人不能打开的么?

    2019-04-26
    9
  • 虎哥
    如果你想用函数式编程,你需要重修数据结构这门课程,大学里面学的数据结构是不顶用了。那应该学习什么可以给个建议吗?

    作者回复: 资料不多。我当年翻过的资料: Purely Functional Data Structures - https://www.cs.cmu.edu/~rwh/theses/okasaki.pdf

    2019-04-28
    7
  • ljf10000
    我一直认为C++走了邪路,带坏了java,php,python等一众小弟

    作者回复: 历史是螺旋上升的

    2019-04-27
    6
  • 感恩大佬分享 随喜大佬
    学生是java使用者 个人认为类之间具备‘is-a’的关系这种情况时 还是很有必要的;继承使所有子类公共的部分都放在了父类,使得代码得到共享,避免重复。
    这是学生一点自己的理解 望老师批评指正,再次感恩老师分享这么好的课程 我当奉持 如法修行

    作者回复: 逻辑上如此,这也是继承被发明的原因。但是软件工程的实践表明,继承带来了收益🈶️,但它带来的伤害更大。

    2019-04-26
    6
  • 汉锋
    老师说面向对象中的继承是过度设计,应该利用组合,面向协议可以理解就是组合吗?

    作者回复: 是的

    2019-04-26
    6
  • fy
    老师,你说的函数式编程:最核心的是变量不可变是啥意思?

    作者回复: 就是你不能写 x = x + 1 这样的语句了

    2019-04-26
    6
  • melon
    看到有人问到「编程范式和编程框架的区别?」,说一下自己的理解: 编程范式就好比是接口,编程框架就好比是实现了接口的抽象类,使用编程框架编写的应用就好是继承了该抽象类的类。

    作者回复: 👍

    2019-05-09
    5
  • gopherliu
    后端服务可能趋向于标准化或者固定化,可能前端才是真正的战场。

    作者回复: 这个我认同,我去年ecug大会演讲就是讲这个

    2019-04-26
    1
    5
  • Enthusiasm
    老师您好,目前我对面向连接不了解,只知道Java中的面向接口,请问面向连接是不是就是Java中的面向接口?只不过Java中保留了继承特性,而go把继承特性彻底抛弃了?如果不是这样,那Java和Go在这方面最大的区别您认为是什么?

    作者回复: 面向连接不等于面向接口。接口只是一种连接方式,但不是唯一的。

    2019-04-26
    5
  • Now@Future
    老师看问题的世界观更宏大些,厉害。
    2019-04-26
    5
  • Akagilnc
    精选留言里面那段COP的内容能知道出处么?

    作者回复: 我还真不知道,帮你顶一下

    2019-05-12
    4
  • Hurt
    go也有go的不足的吧

    作者回复: 这篇谈编程范式,不比较语言

    2019-04-26
    4
收起评论
91
返回
顶部