什么是计算机专业完美的教学语言 - Garth


Python 作为一种教学初学者的语言远非理想。完美的教学语言是什么,或者至少应该是什么。我将列出这种语言的十二个特征,八个基本特征和四个理想特征。之后,我将对当代语言的衡量标准进行一些(相对)冷静的观察。
理想的特性
以下是理想的特征:

  • 工具支持。显然,我们希望我们的语言拥有一个强大的 IDE,并提供广泛的重构支持。应该有一个声明式构建工具和一个全面的测试环境,支持一系列方法(包括 TDD、BDD 和 PBT)。
  • 杂耍装置。初学者应该可以在没有帮助的情况下安装运行时、核心工具和 IDE。在语言版本之间切换应该很简单,就像在同一设备上维护多个版本一样。
  • 适用性。该语言应该可用于一系列应用程序。理想情况下,应该支持浏览器、移动设备、桌面和云。
  • 工业采用。该语言应该在整个软件行业中得到认可,并在面试过程中发挥重要作用。开发人员应该能够直接在行业中使用该语言,或者至少可以轻松转换为类似的替代方案。

  
主要特点
以下是我们理想的编程语言的主要特征。
  • 融合的:语言的特性应该结合在一起以提供一致的方法。在存在重复的情况下,它应该是一个深思熟虑的选择,而不是事后的改造。就像一个好的故事或电影一样,在语言的一部分中实现的“世界构建”不应该在其他部分中被挫败或被取消。例如,应该提供集合文字,但集合应该是常规类型,遵循与其他规则相同的规则,并且能够由开发人员扩展。
  • 综合的:尽管使用单一范式语言进行编码是一门优秀的学科,但学生的母语应该让他们接触到他们在工作场所可能需要的风格。为便于讨论,我将这些定义为命令式、面向对象、函数式和通用。该语言应该提供在这些范式中的每一个中进行编码的能力,并且(如上所述)尽可能无缝地集成它们。
  • 相关的:该语言不应违反我们行业的既定惯例。语言中使用的术语应与主流用法相呼应,而不是重新定义通用术语或进行任意替换。如果某个术语过时和/或仅因偶然使用,则可以例外,例如将static替换为shared。
  • 简洁:应谨慎使用关键字和特殊符号。保留字的数量应该最少,但至关重要的是,同一个关键字绝不能有多种含义。违规的例子是C++ 中的类和Java 中的扩展。理想情况下,符号也应该如此,但由于实用性,让步是不可避免的。在重用符号的地方应该有一些更高的主题来统一不同的含义,例如在 Scala 中使用下划线。
  • Goldilocks Typed:必须有一个没有特殊情况的统一类型系统。值类型和引用类型之间的任何内部区别都应该对开发人员隐藏。该语言必须在每个声明中都要求一个关键字或符号,并且每个变量都必须有一个已定义的类型。应明智地使用类型推断,以确保静态类型不会成为障碍。相反,类型推断不能如此普遍和阴险以致引起混淆。
  • 可扩展:认识到现代性,该语言应使其运行时能够利用多核和云托管硬件。默认情况下,变量应该是不可变的并且评估是惰性的。理想情况下,应该可以将代码库划分为纯区域和有副作用的区域。
  • 敏捷:学习者应该能够在快速反馈循环中工作,在那里他们可以快速看到代码更改的后果。编译和部署时间不应导致学生注意力不集中。理想情况下,构建/部署/测试周期应该是持续且无缝的。
  • 具有挑战性:该语言不应要求使用高级功能来完成日常任务。也不应该将常见的错误误认为是尝试使用高级功能。然而,语言应该提供一个开放式学习路径,在那里可以扩展语言和运行时。

 
对现有语言的思考
以下是我对当前语言如何衡量这些标准的看法:
  • 有许多较新的语言建立在过去的经验之上,并且在集成性、简洁性和可扩展性方面得分很高。在我大量的空闲时间里,我试图学习ReScriptElm,我觉得这两个都令人印象深刻。遗憾的是,这些语言严重依赖纯粹的 FP,因此在综合性和相关性上得分很低。它们非常适合以易于理解的方式教授 FP,但可以排除在此讨论之外。
  • TypeScript是一门极好的语言,它改变了我对代码的看法,变得更好。它在全面和具有挑战性的类别中获得加分,使结构类型和映射类型成为主流。不幸的是,它最大的优势仍然是最大的弱点,尤其是在当前背景下。通过在 JavaScript 上构建,它打开了一个潘多拉魔盒,我们不希望将这些问题强加给初学者。
  • C# 和 Java 非常全面,在可扩展性方面做得很好,并且正在改进类型和简洁性。对于有经验的开发人员来说,它们是很好的选择,但在集成性、相关性和简洁性方面严重不足。这两种语言仍然有很多仪式、杂耍值和引用类型,这使得教授函数式编程变得困难,并且有许多不推荐使用的特性。
  • 十年前Scala本来是一个竞争者,但由于技术债务问题而被其社区的优先事项所拖累。Scala 3 在很多方面都是一门新语言,在解决这些问题方面还有很长的路要走,但任何人都在猜测采用的速度。五年后它可能是一个不同的故事,但现在我们排除它。
  • RustF#是我们遇到的第一个强有力的竞争者。两者都会对我们所有理想的特征给予高度评价。它们越来越受欢迎,吸引了新采用者的称赞,并被第一篇文章的读者推荐给了我。然而,他们(以不同的方式)太固执己见,无法做出最后的决定。
  • 这给我们留下了RubyGoSwiftKotlin。我不得不承认我是 Ruby 的忠实粉丝,并相信它是一种很棒的教学语言,尤其是在 Ruby 3 中可用的静态类型。在类型栏的另一侧 Kotlin 和 Swift 选中每个框,优势将归于 Kotlin当您包括理想的标准时。最后,我找不到排除 Go 的理由,即使它不是我的菜。我认识的使用它的教育工作者都是忠实拥护者,对泛型的支持即将到来。所以值得认真考虑。

 
结论
想象一下,如果明天你被告知必须教授“X 语言”一年,而你的薪水将完全取决于学生作为开发人员的成长,你会有什么感受。