学习编程之前一定要学习数学吗? - CACM


人们曾经认为人生学习的第一种编程语言很重要,但是现在上下文情况完全不同了,人们不必一定要学习数学以后才开始学习编程,而是可以直接从学习编程语言开始。学习数学可以成为更好的程序员,但是学习编程的大多数人都不想成为更好的程序员,专业程序员和计算机科学家只是其中的一小部分,而且计算机科学专业CS毕业的学生往往是为了找工作,而不是成为最好的程序员,甚至都不是专业程序员,更别谈计算机科学家了:
专家一直在研究当学生在 Python 和 Java 之间迁移时哪些知识会转移,哪些不会转移(请参阅此处的论文),研究认为:当我们考虑为非 CS 专业的学生教授编程时,第一种编程语言尤为重要。如果学生想成为数据科学家,R 或 Python 比学习C更有意义,但是,并非今天学习编程的每个人都希望或需要像计算机科学家那样轻松地切换语言的能力。
过去,人们局限于这样一个教授编程的思路:学习第一种语言需要能开发出语义概念和特定语法知识,而学习第二语言只涉及学习新的语法即可。这个想法的前提条件是假设这两种都是保留相同的语义结构,但是实践种人们还是可能学习具有完全不同语义的第二语言,例如 LISP 或 MICRO-PLANNER,则可能会发生与学习第一语言一样困难或更难。所以,这种想让程序员学习编程语言变得简单的教程编程思路如今也许过时了。

为什么第一种编程语言无关紧要? 
过去,当计算机科学这个领域还年轻时,第一种编程语言确实很重要:在 1960 年代后期首次定义 CS 课程时,重点是学习编程的数学基础。如果我们根据学生已经知道的数学来教授编程语言的语义,那么新的语法只是数学的新形式。数学家喜欢用不同的形式或不同的方法探索相同的想法。对于有很强数学背景的学生来说,第一种编程语言和未来的编程语言只是学生已经知道东西的不同符号而已。
但是今天,如果一位编程学习者并没有学习过数学呢?如果他是六年级学生在数学课上挣扎还没搞懂数学,而同时他正在上第一节 CS 课怎么办?如果图形设计师试图编写了PhotoShop脚本但避开数学课怎么办?如果编码学习者是一个“讨论式程序员”(参见此处的论文),他只希望能够与程序员讨论他们的任务与解决方案,但实际上并不想开发软件,该怎么办?现代编码学习者与 1970 年代的学习者大不相同啦。
因此,现在我们不必一定让编程与数学相关,讨论式程序员很难找到让他们可以学习的资源,因为需要他们关注逻辑和数学(请参阅此处的论文),但我们可以帮助讨论式程序员无需数学即可学习编程(请参阅此处的论文)。如果我们不期望学生编程前首先了解数学,我们就能够教更多的人学习编程了。
 
黑客新闻网友

上面这篇文章试图淡化数学,也许你确实可以教更多人编程,但如果他们学习和使用数学,他们会成为更好的程序员。
不过,今天学习编程的大多数人都不想成为更好的程序员,大多数学习编程的人是 K12 学生、最终用户程序员或讨论式程序员。专业程序员和计算机科学家只是其中的一小部分。是的,他们可能需要数学才能擅长并发编程。不是每个人都会做并发编程。
在没有学习数学的情况下直接学习编程语言,最大问题是学生掌握以后就没有什么可比的,因此自然而然地认为该语言的设计决策反映了一些深刻的潜在真理,该语言是事情应该做的方式而不是其时代的产物和其设计师的特定目标。
为什么人们调查发现:学生在将他们的编程基础知识从一种语言转移到另一种语言时遇到困难呢,也许是因为他们似乎一开始就没有真正理解它们,这是教学和测试的失败,并不是因为没有学习数学而妨碍了他们转移。
另外一方面,“编程基础”因语言而异。难以想象,一个学习 Python 编程的学生会开发出与使用 C或 Haskell(对类型和语义理论的理解)的学生相同类型的基本理解。
大多数程序员并不是计算机科学家。即使大多数拥有计算机科学学位的人本质上也不是计算机科学家,他们强迫自己完成课程作业以便找到工作(主要是网络,几乎不使用他们所教的任何东西)。
 
第一语言非常重要,我通常推荐 javascript,原因如下

  • - 它是 / 高度 / 可访问的(任何带有浏览器的计算机都可以编译和运行 javascript - 你只需要让浏览器加载文件)
  • - 它与 C 风格语言共享许多语法(这使得迁移到其他语言更容易)
  • - 它在如何执行规则方面“放松”(现在,这是有争议的,是否应该允许学习者摆脱以后会困扰他们的错误,或者是否应该让学习者从一开始就步履蹒跚并被迫精确, IMO 前者比后者更容易让人们提高技能)
  • - 它(目前)具有商业价值(也就是说,你可以在你的简历上找到一份使用 javascript 的工作)

 
我的轶事经历:
  • 我在大学里上一节非常乏味的 Java 课:这太糟糕了!我梦想让计算机做一些有趣的事情,但结果证明编程很烂,而且学习起来很无聊!(我最终退出并走上了不同的道路)
  • 20 年后,我从各种免费的在线资源中自己学习 Python:这太不可思议了!我可以让计算机做任何事情,这一切都有意义!我还能学到什么?!?

对我来说,它需要拥有正确的入门语言和正确形式的资源才能完成(通过视频学习课程,因为我对某个主题很好奇,比课堂效果要好得多)。
 
作者似乎在暗示计算机教育正在进入这种状态,在这种状态下,学生成为专业人士的可能性很小。但我仍然认为,旧的语言教学系统仍有一席之地,并期待一些学生继续在前沿做出贡献。
 
第一语言应侧重于入门。Python 在这方面工作得非常好。启动最少,学生可以在几分钟内开始编写功能代码。
后续语言应与其类的内容和重点相匹配(即 C 用于数据结构和算法,C/C++/Rust 用于系统编程,Java/C#/C++ 用于 OOP 类,Haskell/Clojure/等用于函数式编程类等)
 
目前大学中的编程教学状况非常糟糕。大学现在的做法是,您可以用一种或两种语言获得一些超级基本的指导,然后剩下的一切都需要自己照顾。