南京大学李樾副教授:浅谈国内高校编程语言教育

作者简介

李樾博士,南京大学计算机科学与技术系副教授,主要研究方向为程序设计语言与程序分析。李樾博士曾参与“华为-南京大学下一代程序设计联合实验室创新项目”。

  • 知乎:@啥玩应啊

  • 个人主页:https://yuelee.bitbucket.io/

前言

应华为编程语言实验室邀请,对我2018年丹麦做博士后期间在知乎写的这篇小文章做一下简单的改动(我目前就职于南京大学计算机科学与技术系,计算机软件研究所,计算机软件新技术国家重点实验室,任职副教授)。为了体现当时写作的心境,这个改动非常小,保留当时绝大部分观点,希望自己浅薄的认识,能够起到一定抛砖引玉的作用。

实际上2019年9月回国后我发现,咱们国家已经开始在PL的教育和科研上发力了,包括北大引进PL国际知名学者胡振江教授,教育部高等学校计算机类教指委委任上海交大傅玉熙教授组织筹建“计算机专业教育丛书——程序设计语言系列”编委会,PL国际知名学者南京大学冯新宇教授(华为编程语言实验室主任)担任主编,他们正在筹划建设咱们国家未来亟需的PL本科教材,此外我还知道有一个“程序设计语言组(筹)”微信群,里面有非常多的PL学者在为PL的教育讨论并献计献策,因此,现在我对咱们国家未来PL的高等教育很有信心,我个人也将和这些优秀的PL前辈和同事们一道,为国内高校编程语言的教育贡献一份自己的力量。

以下是我在2018年9月写的文章,当时的一些措辞被调整了:主要是去掉了些调侃的话——当时还年轻(大雾)——没办法,毕竟现在我有官方身份了(南京大学待我不薄^^),不当之处,还请自己消化,莫要指出(南京大学7、8月份还要招生,有啥问题可以秋后算账 :-))。

开篇

在知乎上活跃着、潜水着很大一批程序员,有的出于对编程的热爱不断磨练提升自己的编程阶位,有的迫于自身的能力和工作的需要不得不强迫自己加班补课不能掉队,有的一直努力着试图在高薪和兴趣之间牵上一条能够说服自己的线。他们大多低调勤奋,每天在跟代码死磕,拿着相对称心工资的同时也为加班压力烦心无奈,更多的幸福也许来自于每每调试成功或完成任务那一刻的暗自欣喜,悄悄地告诉自己“我还不赖”,默默地激励自己“我可以更好”。这篇文章就是为了这些简单的人——如今和未来的“程序员”们。

我觉得在正文之前,有必要先简单自我介绍一下,以防下面的内容没人看,觉得我在瞎扯(那我就白写了啊(>﹏<))。我叫啥玩应儿,一个普普通通的海外博士 博后,在编程语言(PL)领域(更细化一点是编程语言的静态程序分析方向)做过一些微小的工作。这篇文章我用心准备了很多天,因为它有着比较“神圣”的写作动机。

动机

此文的写作动机主要来源于两股力量的碰撞:惋惜和鼓舞。

  • 惋惜

我发现在知乎上很多科班出身的计算机或软件专业的大学生对于一些基础的编程语言问题比如“什么是解释器”,“什么是编程语言的语义”,“什么是函数式编程”,“为什么语言会有静态和动态类型”等等很多基础知识并不清楚(更不要提诸如“编程语言的核是什么”,“它们如何被一些基本的语言特性组成搭建最终形成自己的语言生态”等更进一步的知识),更令人不安的是很多人认为“我不了解它们并不影响我编程,所以不知道也无所谓”。

想到这里,我的脑海中立刻浮现出我人生中的第一门编程语言课(C语言)当时全国通用的清华大学谭浩强的绿皮《C程序设计》教材,和老师课上不断强调的“变量使用前应该声明”,“循环数组不能越界”,“printf的参数有哪些”.....之后又学了一些编程语言课(Java面向对象编程设计,C 等)。然而一路下来,对于编程语言的理解依然停留在我了解这个语言的语法,熟悉它的开发环境,知道怎么查文档和API使用,也知道怎么用它和一些相关的framework或library完成一些实际的编程任务,然后(心虚地)在简历上写道熟悉某某编程语言。

如今想来,这么多学生不喜欢编程,感觉它难且太复杂,枯燥无味却又不得不死记硬啃,写了那么多代码和作业却依旧感觉距离理解编程语言相距甚远。这在很大程度上并不是学生的问题,一味讲解这些语言的语法细节和如何使用它们实现数据结构和算法,很难让学生真正地理解编程语言并提起兴趣。这些学生或程序员本可以更喜欢编程,更热衷自己的编程工作,想到这里,不由地为他们(也是当年的自己)感到了些许惋惜。

  • 鼓舞

我在知乎上同时又发现以 @rainoftime @Felis sapiens @圆角骑士魔理沙 等为代表的另一波人。他们是纯粹的编程语言爱好者,经常分享着编程语言很多有趣且有用的知识(据说他们这些志同道合的小伙伴私底下也有编程语言交流群分享知识)。我觉得他们很厉害(也很羡慕,因为他们讨论的很多有用的东西我都不懂甚至之前都没听说过,惭愧惭愧(* ﹏ *)),同时也感受到他们对于自己喜欢的东西的那种难得的专注和纯粹。
这些对兴趣的专注和纯粹本应该是大学生在自己专业上该有的年轻的、百舸争流的样貌,如今却被年薪、房价和社会的物化价值观所左右。如果连我们国家顶尖大学的教育都摆脱不了物欲横流的浮躁,又如何完成国家民族集体人格的进一步塑造?在这种背景下,知乎上的这些编程语言爱好者们的所为有如夏日之凉风,让我意识到咱们国家始终有一群爱学习、爱思考、忠于兴趣的学生。他们的存在激励着我说出今天想说的话,希望让更少的学生被惋惜,让更多的学生受鼓舞。

为什么编程语言教育在我国不受重视?

如今计算机行业日新月异,随着计算能力的不断提升和信息智能化在各行业的大量普及(当然还有一些大公司在背后搞事情),香饽饽领域如“人工智能”“大数据”等受到了前所未有的瞩目。加之我国现今正在产业升级当中,想要利用国内巨大市场和国人对于新鲜事物特有的包容心态等在所谓“工业革命4.0”的历史进程中弯道超车,把“人工智能”“大数据”“物联网”等计算机应用学科列为了国家战略规划项目。

这些行业的从业人员也没有让大家失望,很多智能应用确实很大程度上改善了人们的生活体验(我回国手机刷个小黄车都兴奋不已(o ̄∇ ̄)见笑)。然而如此一来,计算机应用学科强大的优势便更容易让人们忽视对计算机基础学科的关注和发展(本来基础学科因为其回报不能被立即“看到”而已经受到了一定的忽视)。这其中最重要的计算机基础学科之一,也是在我国一直被忽视的学科,就是编程语言。

如果说硬件的核心是芯片,软件的核心便是编程语言。前一阵子中兴芯片事件闹得沸沸扬扬,当时我看到报道后既气愤又无奈。其实多少了解到咱们国家对芯片的研究是有投入的,然而由于芯片行业本身研究成本极高且要和各种国际上更重视更有钱的公司机构竞争,创新成本太大。可是编程语言作为软件的重要核心,研究成本照比硬件几乎为零,在我国却一直不被重视,因为很多人对编程语言学科抱有一种误解的态度:

“通用的编程语言全世界就那么几个,该有的都有了,我也会用,有啥可研究的?总不会让我再去设计一个新的编程语言吧?那有啥用?而且也没人用啊!”

如此,编程语言学科的研究很容易受到轻视,研究受到轻视导致了这门学科人才的缺失,人才缺失意味着没有足够专业的人来为其重要性发声(编程语言学科的人才本来就不多),又因为其作为基础学科发展效果不会像应用学科“立竿见影”,国家高等教育决策层便无法主动意识到发展它的必要,因此从决策层便不会发展这一学科并重视、引进相关人才l A。无从责备啊╮(╯▽╰)╭

此外,由于编程语言是一门结构性很强、在国外发展了近60年如今仍旧活跃的重要计算机学科,因此并不是只要会编程、有博士学位和相关计算机背景的人就能教好其课程的专业。如此一来,我们国家缺乏编程语言方向相关的人才,势必造成今天国内高校编程语言教育落后的局面。

重视编程语言教育真的很重要吗?

“在X年内,进入世界知名大学行列;在X Y年内,冲入世界一流大学行列”,这是近几年国内很多高校的通用口号模板。然而我们再来看看真正世界的“知名”“一流”大学(例如Top 100,包括MIT、Stanford、UC Berkeley、CMU、Cornell、UPenn、UW、Harvard、ETH、Oxford、Cambridge等太多名校),你会发现它们之中但凡有点规模的计算机院系,几乎都有编程语言(programmming languages)方向的教授或研究人员,而且往往排名越靠前的大学越重视编程语言,相关科研人员也越多,编程语言课程都是由这些专业人才讲授的。

反之,我国绝大多数985、211高校无论计算机学院还是软件学院,编程语言方向居然很少有全职教授。此外,我国计算机学会有那么多计算机方向的专委,就是没有编程语言专委(注,形式化方法专委和软件工程专委很难直接取代编程语言专委,反之亦然)。

这一对比应该很说明问题了:不是我们有问题,就是我们学习的那些世界一流大学有问题。然而我前面也解释过了,于我而言,我国编程语言教育的落后和人才的缺失是个无从责备的问题;换言之,我相信如果咱们高校或教育决策层的领导意识到了这个问题的重要性,是有动力和能力解决它的(毕竟干实事为学生想的领导还是有的)。

刚刚,世界名校们用它们强大的编程语言教授阵容向我们客观地展示了编程语言教育的重要性。接下来,我想从个人和社会两个层面主观地谈谈提高编程语言教育质量的好处。

1. 个人

编程语言虽然复杂,但是其设计是遵循着一些基本规则的。不同语言的语法语义虽然有所不同,但一些基本的核是相似的(例如基于表达式扩展的语法和对基本数据类型的抽象),编程语言可以顺着这些核一点点展开,根据语言设计的初衷选择合适的编程范式(例如命令式还是函数式还是都要)进而对核进行相应的调整(例如函数本身是不是个基本数据类型),一点点添加需要的规则(例如什么样的scoping,什么样的类型系统)和特性(例如是否支持多线程,支持异步),这些规则特性与编程语言之核的组合,造就了今天编程语言的琳琅满目。
然而,我们如今绝大多数国内的教育不解释这些基本原理和它们与编程语言的本质关系,学生对编程语言缺乏一种抓得住的“全局观”和举一反三的能力,看到的都是被“糖化”后的语法和复杂的语用环境,所以感到语言太复杂、枯燥。如此一来,以下情形便容易解释了。例如,
  • 你经常对编译器和解释器报出的错毫无头绪;

  • 你无法理解为什么一些framework或library的用法是这样那样的,因此你只能靠着例子和pattern来编程,对于背后被封装和使用的原理一无所知,进而导致了一旦有问题自己便推不出原因,只能找google或有求于同事;

  • 你对于大的任务该用什么样的编程语言或怎样使用其特性无法做出独立的思考,天经地义地觉得这是leader该管的事;

  • 还有太多太多心有余力不足的情况。

因此,对于个人,受到更好的编程语言教育意味着可以更好的理解从语言本身到构建出的复杂软件系统,对于问题的“势”和通过编程手段解决问题的“器”也都会有更好的把握。
编程语言的教育好比是为了构建出每个人编程知识树的主干(这种结构性很强的知识体系是很难通过经验自我摸索的),每遇到新的问题都可以用已有的编程语言知识消化吸收(或在此基础上通过查找资料更容易对其理解),进而每一步编程经历的积累都是给自己的知识树添枝增叶,日积月累,你的程序可以不知觉地写的更快,更简洁易懂,更少错,更安全,也会更容易学习理解新的编程语言和软件框架。
更重要的是其可以帮助个人对编程语言产生更浓厚的兴趣,这对于程序员健康心态的调整很重要:没有兴趣,迫于生活压力各种收罗经验编织履历向别人证明你已走多远;有了兴趣一路打怪升级顺便带带小弟时刻提醒自己还差多远但一切却又怡然自得,事业幸福感油然而生,生活幸福感便交相辉映。

2. 社会

随着社会对于信息化的不断依赖,软件势必走向复杂化,进而对于软件可靠性、高效性、安全性等都提出了新的挑战。这意味着日后对于程序员个人编程能力和素质都会有更高的要求(我后面会在应该如何讲授编程语言课程中简单提到几点)。因此,我国高校在培养软件人才方面应当应势所驱,重视编程语言的教育进而提高未来程序员编程素质、基本功和对待编程的兴趣,这对于整体提高处于信息化中的社会生产力是大有裨益的。随之而来的是软实力的质变,并一定会同时酝酿新技术的革新,因为基数和兴趣都得到提升,概率便不会让创造力失望。
简而言之,更好的编程语言教育可以切实地提高软件生产力,同时培育创新的沃土。例如,在大数据和智能计算的驱动下,很多行业都会利用自己领域内的数据进行一番智能变革(如医疗、城市建设、特种装备等),这给很多软件创新带来新的机遇,我们的程序员应该有能力有信心意识到,他们自己是可以创造或调制适合该行业领域应用的专属编程语言(如DSL),使得行业专家也可以很方便的使用语言编程,满足各种特定的可靠性、性能甚至知识产权等需求。这给新兴软件应用行业的创新提供了丰厚的技术资本,这些应用行业本身又会刺激市场,对计算机行业创新带来新的需求和机遇。

综上所述,重视并提高编程语言教育质量对个人和社会的发展都是大有裨益的。但是如何提高编程语言教育质量呢?最直接有效的方法就是讲授好编程语言课程。

应该如何讲授编程语言课程?

这是一个引火烧身的问题啊。

  • 首先,这个问题没有正确答案,我相信每个人心中都有自己的看法。

  • 其次,我对编程语言的理解和知识的掌握十分有限,我觉得很多教授编程语言的老师、很多有长时间编程经验的程序员都比我更懂编程语言。

  • 再次,我的授课经验目前还很有限,很难切身体会到那种潜在的“知识输出”和学生“知识接收”不对称的问题,但是我也相信,老师是可以通过自己的努力来尽量减小这种不对称的。

以上一番自我觉悟后,我仍想通过结合国内高校编程语言教育的一些实际情况,简单阐述一下关于“应该如何讲授编程语言课程”的几点个人看法。

1. 脉络和整体的把握

一个比较好的编程语言课程的脉络可以是从简入深地“成长”一个编程语言。这个“成长”不是基于具体语言的语法和特征的(比如Java的基本数据类型,运算符,变量声明长啥样),而是基于语言的基本概念的。换言之,上一门真正意义的编程语言课(尽管这门课指定了一门需要掌握的具体编程语言),应该主要是为了学习隐藏在这门具体语言背后的、支撑它的编程语言理论知识,而这门具体的语言(它的语法、语义、语用等)是为了理解这些编程语言知识的。

例如,编程语言可以从数据抽象开始,通过表达式(expression)表达基本的“逻辑”和“运算”,引入条件和循环对其“控制”,引入函数对其“封装”,函数的封装需要scoping,函数的调用需要context等概念来支撑;再high-level一点,imperative语言抽象数据,用变量绑定,用状态存储;functional语言既抽象数据又抽象行为,因此可以通过表达式传递“计算”,可以无需状态存储;再high-level一点,object-oriented语言有了状态和行为的统一封装,引入了类和继承等基本概念,而后者又需要overwritten,field hidden等概念支撑等等等等。如此一来,在一点点“成长”讲解这些编程语言知识的同时,用特定的语言的语法、语义来具体解释这些概念和知识。如此,不但能更深刻地掌握一门具体的编程语言,也能帮助了解编程语言设计的整体和核心,这是举一反三的基础,更是兴趣和自信的源泉。

当然,有的老师可能愿意把整个编程语言安排成初级和高级两个课程,在前者中讲授一门具体语言,在后者中专门讲解编程语言的理论知识,这也是一个合理的设计。但我个人更偏好一起来讲,因为理论和实践同时相互刺激能引起更强的求知欲,原因很简单,理论需要实践来解释how,实践需要理论来支撑why,一个学生如果能同时知道why和how,没有理由不愿意了解更多,虽然最后有没有兴趣是学生自己的事,但是是否引导了学生的兴趣是教育的事。

2. 讲授被忽略的重要编程语言知识

如上所述,国内的编程语言课程更侧重针对某一门具体语言的讲解,而缺少对编程语言整体设计的理解和判断。这好比学人体素描不识人体骨骼构成,学中医不讲阴阳,学音乐不知乐理。如此一来,知识的理解受限且无法融会贯通,不可深究亦不能长远。接下来我用两个重要的(但在国内编程语言课中经常被忽略的)编程语言知识点“函数式编程”和“语言的静态动态类型”作为例子简单说明一下。

  • 函数式编程

我们国内编程语言课程接触到的一般都是命令式语言(imperative)像C、Java、C 等,其中面向对象(object-oriented简称OO)的理论也有所普及。很多人听说过函数式语言(functional)但是并不了解,感觉现在找工作并没有强制要求了解函数式编程,所以觉得不学无所谓。

实际上多少了解一下函数式编程的思维更有助于理解用代码“抽象”和“计算”的概念。例如,如果普通数据value可以抽象,为什么行为(behaviour/action)不能抽象?我们可以把行为(用函数function来表达)看成像数据一样的value(first-class citizens),这样一来传入function的argument既可以是普通value也可以是行为(function)本身(进而引出higher-order function的概念),这使得function可以通过其function参数来“多态”行为,而一次计算任务就可以看成一套“行为”的组合(function的传递和调用),这样在实现一些计算任务时,代码会更简洁,逻辑会更清晰。

如今“函数式编程”被应用在越来越多的主流OO编程语言中。例如编程一霸JavaScript广泛支持了函数式编程机制;企业级代码新秀Scala一直以OO与Functional的“完美”结合标榜自己;就连OO代言人Java在Java 8后也开始通过“糖化”语法来支持函数式编程(如lambda expression)。对于一些纯函数式语言像Haskell,已经成为很多特殊行业(如金融)的宠儿。因此,教一教函数式编程(或思维)对编程语言的理解和实践都是有益的。

  • 语言的静态动态类型

有的时候编程语言可以通过“静态语言”和“动态语言”进行分类,如Scala、Haskell属于前者,JavaScript、Python属于后者。因此,有必要讲讲为什么会有静动之分,为什么不能各自取代对方,这对于理解编程语言的设计初衷和面对不同编程任务如何选择语言,都是有帮助的。
简单而言,静态语言定义变量需要声明类型,调用函数需要匹配类型等,而动态语言一般没有这种类型声明和匹配的约束。前者程序在运行前一般需要编译器静态检查这些约束,而后者程序可以直接在解释器上动态裸奔。各自好处是容易理解的,根据能量守恒原则(胡扯),静态语言需要程序员费时费力照规矩办事,面对复杂系统能大量减少运行时错误,写出的程序也容易理解和便于分析;反之,动态语言解放编程者天性想啥写啥,直接上手直接运行,轻便省力,但更容易导致运行时错误,且代码一般只有自己当天能读懂(o_O)。这也解释了为啥复杂的企业级软件青睐于静态语言,而脚本或轻量级程序一般选可以迅速上手的动态语言。
理解了这些,也就更容易理解为啥有时候编程语言会“动中向静”(JavaScript和TypeScript,动态语言静态化),有时候会“静中有动”(Java和Reflection,静态语言通过metaobject开了个动态的口子),有时候会“静动兼修”(Gradual typing)。

3. 拓展一些常见的编程语言知识

有的时候拓展讲解一点常见的编程语言知识会更有趣且有启发性。我举两个简单的例子:继承和异常处理(两个都拿常见的Java语言为例吧)。

  • 继承

相信面向对象课程都有针对继承的讲解(毕竟OO三大件是封装、继承、多态),比如Java中的类和父类的继承关系以及继承带来的好处。但是往往我们有一种倾向,就是觉得存在即合理,因此觉得继承一定就是好的,进而通常并不讲解Java中这种基于类的继承的弊端。实际上这种Java基于类的继承方式被很多PL的人吐槽过(当然只吐槽它不好的地方),因为它在很多情况下会造成不必要的冗余和开销(简单说就是你可以和你爹很多基因一样,但是不代表你俩穿的衣服都是一样的)。实际上很多继承关系是可以被更轻量级的composition比如Mixin技术代替的(虽然不像Scala、Ruby等语言在语言层面原生态支持Mixin,Java在Java 8后通过interface default methods也可以间接实现Mixin)。有了这些了解,也可以更容易理解其它继承设计的初衷和意义了,比如JavaScript这种基于prototype的更轻便的继承方式。
  • 异常处理

说到异常处理最直观的感受就是一种编程语言提供的处理错误的机制。很多程序任务都不可避免地要处理各种可预判的错误,例如访问的文件不存在,取值的对象为空等等,在异常处理机制下,错误可以标准化也可以定制化,不同的错误可以根据其类型通过try/catch捕捉处理。实际上,在此基础上如果再拓展讲一点,学生也许能站在更高(更抽象)的层面看到编程语言背后的设计哲学。这一点就是“异常处理”背后体现的“逻辑分流”设计。程序本身有“主体逻辑”(以期待的输入进行任务计算完成输出),然而这一过程不可避免地要处理“错误逻辑”。如何让程序以及编程者的主体逻辑思维不受错误逻辑干扰(代码也会随之简洁易懂)是异常处理机制设计的一个重要初衷。有了上面“逻辑分流”的理解,学生以后看到例如JavaScript的Promise这样的特性(resolve和reject分流),就会更容易理解该特性设计的初衷并愿意在合适的编程场合使用该特性。

以上,我觉得对一些基础知识(如上面讲的“继承”“异常处理”等)拓展地讲解,学生更容易跳出某个语言本身,更容易站在编程语言设计层面上去思考(进而将知识融汇贯通形成自己的知识树),甚至有可能进一步思考各种奇形怪状语言的雏形,这种兴趣的代入和思考的启发应该是教育的重心。我也相信这种“由内而外”的“漫天想象”会带来日后很多有生命的创新。

4. 对于语义的重视

编程语言的语义非常重要,学习好语义可以从本质上理解编程语言,因为它在教你运行(该语言写的)程序的解释器是如何思考工作的。大家知道很多通用编程语言有很长的规范来具体地描述语言的语法、语义和特性以及它们应该怎么被使用,很多市面上的编程语言书籍(例如XX程序设计语言,XX handbook,XX in action太多了)也是参考这些规范文档来撰写的。然而无论是官方的规范手册还是书籍都是用自然语言描写的,这就会产生很多歧义和覆盖不到一些特殊情况。这也意味着看书学习一个一个语法特性编程尝试后,也很难对语言有一个整体的了解,对于语言局部的细节也很难有准确的把握。

在这种背景下,编程语言的形式化语义显得尤其重要,它通过一套基于数学的形式化的描述,通过语言的语法定义其相应的语义(注,一般只定义语言的核心部分,因为实际的通用编程语言很复杂,很难形式化准确定义描述所有其特性语义,如此一来整个语言和其使用环境并不能够得到严谨准确地描述和证明,因此可以说如今的编程语言包括编译器和运行环境实际上都会有bug,只是很多都还没有暴露而已)。编程语言领域语义的研究有着较长的历史,很多国外顶级大学的编程语言课程都会有形式化语义的专门讲解,描述语义的方法也有很多(如denotational semantics,operational semantics等)。

然而,尽管编程语言语义很重要,我们国内很多高校的编程语言教育忽略了这一块,据我所知,只有少数高校编程语言课上会单独讲授包括语义在内的语言理论知识,例如北京大学的王捍贫、熊英飞等老师、南京大学的梁红瑾、冯新宇老师等。

实际上,如果不是单独的程序语言理论课程也不用全面细致地讲解它们(这样可能会有些枯燥,毕竟我们不是法国人( ̄▽ ̄'))。例如,如果编程课程选择学习的语言是Java,可以考虑把整个Java的核心部分的语法和语义拿出来,挑选一种语义方法比如operational semantics里的small-step state machine方法来描述并一一讲解语言的每个核心语法和其对应的语义,这样学生在掌握了描述语法、语义方法的同时,也在整体和核心细节上理解了Java,这非常有益于日后更好地理解编程语言并编写程序。

当然,我前面说了这么多的内容,很多时候不可能在一个单独的课程中都覆盖到,不同高校可以结合自身的实际情况,可选择性地为学生提供不同的PL课程。

总结

这篇文章从“写作动机”开始,先后针对“为什么我国不重视编程语言教育”,“好的编程语言教育会对个人和社会带来什么好处”,“应当如何讲授编程语言课程”几个问题逐一阐述了我的个人观点。从来没有花过这么多时间和心思写这种观点性的文章,但是写完又有一种内心的满足,因为如同在文中“写作动机”所述,“希望让更少的学生被惋惜,让更多的学生受鼓舞”,尽管只是编程语言这一小领域,我仍庆幸自己迈出的这一小步。

知乎是一个挺好的地方,虽然如今感受到了更多的浮躁,但仍然能看到人们对于知识的渴望和对于自己进步的渴求,尤其是那些在更新速度极快的计算机领域中的学生和程序员们。鉴于自己在国内受过的编程语言教育和在知乎上看到的形形色色的编程语言问题,我切实地感受到了我国编程语言教育的相对落后,如文中所述,这对信息时代下的个人和社会的发展都会带来不可估量的损失。

我虽资质平平,但仍想借此文发声:我国高校主管计算机和软件教育的领导们,各计算机学院软件学院的院长们,人工智能、物联网、大数据等计算机应用固然重要,但请不要忽视计算机基础、软件核心“编程语言”的教育和研究,毕竟所有应用软件都是编程语言写的,毕竟如今的计算机行业对程序员的“质”的要求越来越高,毕竟我们有着这么多渴望编程知识和兴趣的准程序员们。期待我国编程语言教育和科研的进步。

此致。

后记

“国内编程语言教育”,即使是“浅谈”,我也觉得这个题目很大。我自知自己对编程语言的理解还很欠火候,也真心觉得编程能力与有很多工作经验的程序员相差甚远,因此每每下笔,都怕是妄谈,也尤为此,对文中每个观点都尽量客观地呈现自己所见所想。我虽然是个nobody,但还是希望认可文中一些观点的朋友们帮助宣传一下,别让这篇文章沉的那么快,希望能引发软件行业的同学们和程序员的一点思考,也希望能让那些关心学生和计算机教育的相关领导看到,真正帮助改变我国编程语言教育的现状。

最后,这篇文章这么长,能一直看完的人啊,我敬佩你(谢谢你!)b( ̄▽ ̄)d

李樾,南京大学计算机科学与技术系副教授(登峰B计划引进),2016年博士毕业于澳大利亚新南威尔士大学,之后先后在新南威尔士大学和丹麦奥胡斯大学从事博士后研究工作。

(0)

相关推荐