04 | 编程语言的进化

2019-04-26 许式伟
《许式伟的架构课》
课程介绍


讲述:丁伟

时长:大小12.82M

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

软件是活的书籍

我个人一直有一个观点:软件是活的书籍,是我们人类知识传承能力的一次伟大进化。书籍能够通过文字来记载事件、传递情感、揭示规律、传承技术。书籍能够让人们进行远程的沟通(飞鸽传书),也能够让我们了解古人的生活习性,与古人沟通(虽然是单向的)。
这些事情软件都可以做到,而且做得更好。为什么我说软件是活的书籍,有两方面的原因。
其一,表达方式的多样性。书籍只能通过文字描述来进行表达,这种表达方...

展开全文
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。

精选留言

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

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

    
    22
  • 有铭
    2019-04-26
    对象范式的原始概念其实根本不包括类和继承,只有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 的本来面目
    展开

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

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

    作者回复: 挺形象的比喻

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

    作者回复: 👍

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

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

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

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

    1
    17
  • 东次哒呲
    2019-05-09
    使用java四年了,看到封装,继承,多态的描述,特别精准,又有了更深刻的理解。

    不了解go语言,比如有一个表单的基类,里面有基本的处理,子类继承这个基类,有自己特殊的实现。

    这种情况,如何用组合实现呢?

    作者回复: 这是受继承思维的影响了。其实继承实现了代码复用和多态两个东西,揉在一起。在go里面,组合实现代码复用,接口实现多态,彼此完全独立,非常清晰。

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

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

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

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

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

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

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

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

    1
    9
  • ljf10000
    2019-04-27
    我一直认为C++走了邪路,带坏了java,php,python等一众小弟

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

    
    8
  • gopherliu
    2019-04-26
    后端服务可能趋向于标准化或者固定化,可能前端才是真正的战场。

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

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

    作者回复: 是的

    
    7
  • Akagilnc
    2019-05-12
    精选留言里面那段COP的内容能知道出处么?

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

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

    作者回复: 👍

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

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

    
    6
  • 青山
    2019-04-28
    老师您好,我有一个不太理解的地方,是我不太理解您说的继承是个过度设计的原因,我目前在架构过程中大量的使用了继承,而且我也觉得继承功能将我的代码功能高度抽象化,给我带来了很大的方便。我想咨询下您如果不是用继承的话,用什么方法替代继承的功能呢?

    作者回复: 建议继承只使用接口继承;正常情况下,优先用组合;当然因为大部分语言的组合功能不够强大,有时候从便捷性的角度继承可以适度使用,但是应当意识到如果过度使用继承对工程来说是有害的

    
    5