如果你大学上过编程课,一定被老师提醒过:不要使用 goto 语句!
如果你上过编程课,一定被老师提醒过:不要使用goto语句!
因为goto语句不仅让代码的可读性很差,随意的跳出还会给程序带来安全隐患。
但是这种几乎被现代编程明令禁止的语句,在计算机诞生之初却司空见惯。
早期的程序员用goto来解决代码无法预料的后果,遇到什么问题就用一句goto,让程序跳转到某个指定语句。
直到一位MIT的女教授,才让我们彻底摆脱了goto语句的支配,她就是Barbara Liskov。
刚满80岁,荣誉等身,她是全美首批获得计算机博士学位的女性之一,集冯诺依曼奖、图灵奖于一身。
甚至可以说她发明了构成现代程序基础的体系结构。
但在此之前,她是一位曾经因为性别申请普林斯顿数学研究生被拒的人。
所以Barbara Liskov究竟是怎样的传奇计算机科学家?
在其80岁寿诞之际,我们一起看看她改变了编程的故事。
好的设计,才有好的代码
上世纪40年代,美国发明了第一台电子计算机ENIAC。虽然早期的计算机体积很大,但提供的功能简单,那时候的编程也不必考虑太复杂的结构。
goto语句是最简单的方法,只需把程序的执行引导到对应的某一句即可。
广泛使用的goto语句虽然简单,但是却没有逻辑章法。用这种方式编写的程序既难以阅读,又容易造成危险,甚至还闹出过人命。
曾经有一种名为Therac-25的软件控制的放射治疗机,就因为使用了过时程序设计方法,导致6名患者接受严重超剂量的辐射,造成了死亡事故。
如果没有一个程序设计的基本架构,计算机硬件的发展已经超出了程序员能力所能承受之重。
终于在60年代,计算机程序设计迎来了新的理论,当时Böhm和Jacopini两位计算机学家提出,可以用结构化的程序完全代替goto语句,只需使用顺序、选择和循环三种结构即可。
这种结构一直被使用至今。
1974年,彼时仅35岁的MIT女教授和她的学生将这种思想付诸实践,他们发明了一种新的编程语言CLU。
CLU完全抛弃了goto语句,虽然这种编程语言没有被广泛采用,但是它在面向编程语言的发展过程中起过非常重要的作用。
CLU中的一些概念在许多方面影响了后来的编程语言,对后来出现的一些面向对象编程(OOP)语言做出了许多贡献。
后来出现的Java、C++、C#、Python都是CLU的后代。
CLU的关键贡献包括抽象数据类型、共享调用、迭代器、多个返回值、类型安全的参数化类型和变量类型。
Liskov对程序设计的贡献不仅于此,现代面向对象程序设计的5大原则“SOLID”中的L就是以她名字命名的里氏替换原则(Liskov Substitution principle)。
1987年,Liskov在一次大会的主题演讲中最早提出了这一原则,即继承必须确保超类所拥有的性质在子类中仍然成立。
遵循里氏替换原则编写的程序,克服了继承中重写父类造成的可复用性变差的缺点。
而且这一原则还保证了程序的正确性,扩展的子类不会给已有的系统引入新的错误,降低了代码出错的可能性。
直至今日,所有面向对象编程的程序员还在遵守着Liskov提出的这项原则。
传奇的女性,Barbara Liskov
如今Liskov的学术成就已经获得的广泛的承认。
但在那个年代,作为一个科学家,还是个女性,真的挺不容易,曾因为性别申请普林斯顿数学研究生遭拒。
Liskov在伯克利读本科期间,100人的班里,只有一两名女性同学,她就是其中之一。
她修完了所有和数学、科学相关的课程,而学校当时却不鼓励女性同学这样的做法。
也从来没有人对她说:“嘿,你这样做很好,不考虑跟我们一起合作吗?”之类的话。
好在Liskov的母亲没有当面反对过她(虽然只是鼓励她要在学校好好表现)。
但她对此不以为然,直到在斯坦福读研毕业时,才意识到“性别”问题的存在。
因为在她毕业的时候,没有任何人找她谈工作的事情。
而像她的男性同学(Raj Reddy)就能被招聘到学术方向的岗位。
要知道,在那个年代,就业有点像“包分配”——顾问会通过与全国各地部门的合作来安排毕业生的工作。
但对于Liskov,可谓是“无人问津”。
在这之前,Liskov已经向MIT求职过,但得到的反馈却是“不考虑担任教授”。
发生这种情况时,你会认为“是我自己还不够优秀”。
“但同时我也认为,计算机科学是开放的。”
幸好Liskov在Mitre公司的第一份工作还算不错,她在这家公司期间,深入的研究了编程方法。
△Barbara Liskov正在设计抽象数据类型(ADT)
这项研究让她获得了一个一等奖论文。
1971年,她针对这项研究发表了一次演讲,而后便受到了MIT和伯克利的邀请。
事情至此才发生了改变。
刚刚进入MIT时,大约1000名员工中只有约10名左右的女性教员。但其实,MIT有很多杰出的女性并不在教职人员之列。
在科学领域,很少有人能够意识到女性做出的一些基础性贡献。
90年代,她回到斯坦福参加了一个部门庆典。一群老教授们谈论着“校园关系网(old-boy network)”的八卦,他们说:
有个年轻女人表现得确实非常不错,但那是因为她嫁给了一个教授。
Liskov觉得这件事情真是愚昧至极。
在Liskov担任计算机科学系主任之前的10年里,部门只发现了一位值得聘用的女性。
2001-2004年,在她担任部门领导期间,Liskov共聘用了7名女性,她并没有滥竽充数,其中的3名初级教员都非常优秀。
再后来,Liskov获得了图灵奖,即便拥有了如此殊荣,还是免不了质疑的声音。
△2008年度美国计算机学会(ACM)图灵奖(Turing Award)
她做的工作,没有我不知道的。为什么她会获得图灵奖?
哦,那个工作不是她做的,是一个男同事替她做的。
“简直一派胡言”,Liskov说道。
即便到了足够开放的今天,她也认为现在的情况并不比那时好:
也许我是幸运的。如果我大学一毕业就结婚了,我可能会有一个完全不一样的结果。
如何看待AI的未来
那么,Liskov对人工智能和机器学习发展有什么看法呢?
我博士学位的工作是与John McCarthy合作研究人工智能。
John提出了「国际象棋残局」这个主题,由于我没有玩过国际象棋,所以我读了相关书籍,并将国际象棋的一些算法翻译成了计算机算法。
那时候,人们认为,一个明智的做法是让程序按照人类的意愿来行事,但现在已然不是这样了。
现在的机器学习程序在多数情况下效果还是不错的。但有些情况下效果却并不是理想,人们不知道问题出在了哪里。
如果我在研究一个问题的时候,需要知道它的工作原理,那我不会用机器学习方法。
人工智能是一种应用,而不是一门核心科学。
而对于计算机科学的发展,Liskov比较担心的是互联网,包括假新闻和安全问题。
若是一对离婚的夫妇,丈夫在发表一些对妻子诽谤的内容,包括她的住址之类的私人信息,那就很可能引发一些非常可怕的事情。
这要回溯到80年代。那时候,15所大学和几个政府单位实验室通过互联网连在一起。我们都是好朋友。他们当时的态度是,网站不应该对内容负责,这将扼杀他们的发展。
而现如今,这种态度还在继续。
我们现在解决当下问题的时候,需要的不仅仅是技术,还需要法律来解决人们的不良行为,解决隐私与安全的问题。
One More Thing
分享Liskov对女性在事业发展过程中的一点建议:
在你能真正站起来之前,保持低调。而后再去拥抱成功。
如果你大学上过编程课,一定被老师提醒过:不要使用 goto 语句!的更多相关文章
- 第一次 在Java课上的编程
第一次在java课上的编程(使用参数输入求和): 代码: public class He { public static void main(String[] args) { ...
- 初次踏上GUI编程之路(有点意思,详细介绍了菜鸟的学习之路)
初次踏上GUI编程之路 —— 我的Qt学习方法及对Qt认识的不断转变 -> 开始接触GUI与开始接触Qt: 话说,我第一次看见“Qt”这一个名词,好像是在CSDN网站的主页上吧,因为CSDN好像 ...
- Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)” 清晰讲解logistic-good!!!!!!
原文:http://52opencourse.com/125/coursera%E5%85%AC%E5%BC%80%E8%AF%BE%E7%AC%94%E8%AE%B0-%E6%96%AF%E5%9D ...
- sdut 在机器上面向对象编程练习11(运算符重载)
在机器上面向对象编程练习11(运算符重载) Time Limit: 1000MS Memory limit: 65536K 标题叙述性说明 有两个矩阵a和b,均为2行3列,求两个矩阵之和.重载运算符& ...
- 缓存策略 半自动化就是mybaitis只支持数据库查出的数据映射到pojo类上,而实体到数据库的映射需要自己编写sql语句实现,相较于hibernate这种完全自动化的框架我更喜欢mybatis
springboot入门(三)-- springboot集成mybatis及mybatis generator工具使用 - FoolFox - CSDN博客 https://blog.csdn.net ...
- 《编程导论(Java)·3.2.4 循环语句》
本文全然复制<编程导论(Java)·3.2.4 循环语句>的内容.除[]中的说明文字.请阅读和比較其它编程教材. 我知道.假设我是一个刚開始学习的人,<编程导论(Java)>非 ...
- Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...
- android windows 上JNI编程
昨天学习windows上的JNI编程,JNI说白了就是java和c语言的一个互相沟通的桥梁.java能够调用JNI来完毕调用C语言实现的方法. JNI的全称是(Java native interfac ...
- 斯坦福大学自然语言处理第一课——引言(Introduction)
一.课程介绍 斯坦福大学于2012年3月在Coursera启动了在线自然语言处理课程,由NLP领域大牛Dan Jurafsky 和 Chirs Manning教授授课:https://class.co ...
随机推荐
- 基于ASP.NET core的MVC站点开发笔记 0x01
基于ASP.NET core的MVC站点开发笔记 0x01 我的环境 OS type:mac Software:vscode Dotnet core version:2.0/3.1 dotnet sd ...
- 逻辑式编程语言极简实现(使用C#) - 4. 代码实现(完结)
本文是本系列的完结篇.本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手 逻辑式编程语言极简实现( ...
- Python-模块XlsxWriter将数据写入excel
1.目的 用xlwt来生成excel的,生成的后缀名为xls,在xlwt中生成的xls文件最多能支持65536行数据.python XlsxWriter模块创建aexcel表格,生成的文件后缀名为.x ...
- Linux常用命令-文件传输类
bye 功能说明:中断FTP连线并结束程序 语 法:bye 补充说明:在FTP模式下,输入bye即可中断正在执行的连线作业,并且结束FTP的执行 ftp(file transfer protocol) ...
- 数据可视化之powerBI基础(三)编辑交互,体验更灵活的PowerBI可视化
https://zhuanlan.zhihu.com/p/64412190 PowerBI可视化与传统图表的一大区别,就是可视化分析是动态的,通过页面上筛选.钻取.突出显示等交互功能,可以快速进行访问 ...
- redis(二):Redis 命令
Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. 语法 Redis 客 ...
- windows python的多进程
最近打比赛,apply操作极慢,队友使用了线程池,用多核开辟多线程跑,加速. 在阿里平台上,都没问题. 我是win10系统+jupyter notebook 多线程那个模块运行,会显示一直运行,p.c ...
- 使用 maven 创建项目模板
前言 配置 demo 工程 生成模板 生成项目 上传模板到仓库 参看链接 前言 微服务的概念越来越流行,随着服务粒度越来越细,拆分的模块越来越明确,我们的工程项目也变得越来越多. 有时候一个项目搭建, ...
- wordpress学习笔记
版本:4.9.8 我用wordpress的初衷是借用它的后台系统,前端用自己的网页显示存在wordpress数据库里的文章. wordpress本质上是个框架,技术栈:web-php-mysql. 初 ...
- docker环境部署mysql
参考文档 docker官方:https://hub.docker.com/_/mysql/?tab=description 部署步骤 1. 拉取镜像 这里我拉取了tag为5.7的镜像 docker p ...