17611538698
webmaster@21cto.com

学校正在让你成为更差的程序员:以C++为例

编程语言 0 10 47分钟前
图片

21CTO 导读:学校如何让学生变成“差”的程序员的?请看本文一察究竟。

学校正在越来越让程序员变差。尤其是当它在我所在的国家里把 vector 从 1 开始教、把 string 从 0 开始教时,同时又把可测量的算法与数据结构训练放在真实项目之前。

全球编程行业从 0 开始计数,而更有效的路径是把有限时间投入真实编码和能逐步增加难度的大项目之中。

接下来,我便以自己的实践、体会包括案例,阐述了学校让学生越来越差的论点。整段观点中我用五道题测试这些编程习惯是否会留下哪些问题。

C++的if 语句应该保留花括号


在我进入高中时,其实已经自学了两年 C++。原本我很期待在学校继续学习,却发现学校的 C++ 课程太基础,几乎没有多少新鲜的内容。

课程里还有一些严重的坏习惯。

很多老师认为,如果 if 里面只有一条语句,就不需要写花括号。这样可以减少代码,让代码更适合放在屏幕上。

他不知道问题和程序的延展,代码之后很可能会被修改。如果有人在 if 中加入第二条语句,就有不小的概率引入 bug。这也就是 if单条语句的修改风险。

所以即使当前只有一条语句,if 后也应该保留花括号,包括 Google 在内的一些公司,已经把这项规则设为强制要求。

一次大学代码审查暴露了三个变量问题


我在大学时遇到过一次代码审查。老师让学生实现一个 class,之后随机挑选一份代码进行 review。

这段代码问题集中在变量区域,一共有三类。

第三题则专门追问其中最重要的一类,也就是变量名定义再到初始化的问题。

使用描述性变量名


变量一般应该使用容易理解的名称。小范围代码中可以使用单字母变量,但大型项目里,变量名应该说明它的作用。

描述性名称能让人更快读懂代码,也能减少修改时的误解。许多书里大量使用 i、j做为变量定义,这非常难以理解,缺乏描述性。不妨想像一下,许多单字母变量放在大型函数中,很快就会变得难以追踪。

在使用处声明变量


大约在 1990 年,编译器有一些限制,变量只能在函数开头声明。现在已经不是这样,但很多老师仍然要求学生把所有的变量放在函数开始处。

一位老师还信誓旦旦地说:“这才是程序员真正的写法。”

而实际上,变量应该在使用时声明,并尽量放在合适的作用域中。这样可以避免一个函数里漂着 100 个变量,让代码更容易阅读与修改。

声明时初始化每个变量


变量初始化可以说是整个问题中最重要的部分。

也就是说,变量应该从声明开始就拥有有效的初始值。

变量先声明之后再初始化,看起来似乎没有问题。但当项目或 struct 变大时,这种写法很容易制造大量 bug。

因此从现在开始,初始化所有变量。许多人转向 Rust,是因为 Rust 能帮助捕获更多 bug。但是许多程序员只是从来没有学会写出安全、清楚的代码,学校并没有教会他们。

OOP、design patterns 和 getters 不能替代基础代码质量


有一次代码审查,老师认为这个 class 基本没问题,只需要增加一点 OOP,以及更多 private 成员和 getters。

代码已经存在变量命名、声明位置和初始化等基础问题,但老师的反馈却集中在抽象的结构上。

大学经常教学生遵守模糊的编程准则,例如 OOP 和 design patterns,却没有把重点放在真正能减少 bug 的写法上。知道这些抽象概念并不能替代清楚、安全的基础代码。

C++ 多人 Minecraft 克隆只用了 BFS 和 unordered_map


学校过度重视算法和数据结构,部分原因是这些内容容易测试,也容易在信息学相关竞赛中衡量。

作为对比,用 C++ 制作的多人 Minecraft clone为例。第四题要求判断这个项目使用的算法和数据结构是简单、中等还是困难。答案是,它们基本都很简单。

这个项目中最难的算法是 BFS,最复杂的数据结构是 unordered_map。这并不是特殊案例,几乎所有项目都使用类似难度的基础工具。

我已经记不清上次使用 list,或者上次需要创建 graph 是什么时候。大学里花了很多时间讲各种 heaps,但我从没在实际项目中使用过它们,甚至不太记得它们具体解决什么问题。

当然,如果你在 Google 工作,需要处理数百万条记录,复杂算法当然有用。但对大多数人来说,只因为未来可能用到,就花大量时间学习高级算法,并不是好的时间分配。

我曾经在一个游戏中使用过稍微高级的 least recently used cache 数据结构,后来又把它移除了。大学没有教过这个结构,但我自己很快就理解并完成了。

因此,我建议是先掌握基础算法和数据结构。只有在项目真的需要时,再学习更复杂的内容。

算法作业让高中生没有时间写项目


我曾和一名热爱编程的高中生交谈。这个学生在学校课程里学习过编程,所以作者建议他自己开始制作项目。


学生也确实想这样做,但他说自己没有时间,因为老师已经布置了额外的信息学作业。

这些作业当然能让他学习算法和数据结构,但这是否是他时间的最佳用法?作者认为,算法练习确实能提升解决问题的能力。可是,如果一个人只做小型算法题,就永远不会接触到项目。

真正写大型项目时,学生才会遇到更多代码组织、修改和整合的问题。我认为,这正是人们学习编程、逐渐成为程序员的地方。

第五题问的是,这名学生现在最应该做什么。作者给出的答案是,暂时放下那份额外作业,开始自己写项目。虽然有些人确实想成为算法专家,但这个学生看起来并不喜欢这些内容。

大学的 C++ OpenGL 路线至少需要五年


我后来发现自己最感兴趣的是 graphics programming。我用大学的学习路线说明,学生可能要花很长时间,才能接触真正想做的方向。

前 3 年大学课程会安排各种零散内容,让学生接触不同领域。之后还要再花 2 或 3 年进行专业方向学习。这样算下来,大学和 master 至少需要 5 年。

按照这条路线,学生可能最终开始制作 C++ 和 OpenGL 项目。但大学实际上不会真正教到这个阶段。很多课程只是展示预先制作好的基础 OpenGL 示例。

我看过许多大学的课程表,认为这种情况并不只发生在一个地方。学生如果想做出真正的 OpenGL 项目,需要花费大量时间自学。

有人会说,大学期间本来就需要自己学习。但我认为,这恰好说明大学并不擅长教编程。它只提供一些表面知识,而这些内容学生之后也能自己找到。

我完成过 graphics programming master,但坦白说,学生可以拿到 diploma,却未必真的擅长 graphics programming。

11 年级的 OpenGL 项目和 12 年级的 Minecraft


我有一个 OpenGL 项目,比大学的学习路线早了 6 年。我在 11 年级时就做出了这个项目,到了 12 年级又制作了 Minecraft。

为了学习 OpenGL,我还在学校正式讲到线性代数之前,自己学习了 linear algebra。那不是为了考试,而是因为想做 OpenGL 项目。

这不是炫耀。我学习 OpenGL 时大约 17 岁。在Discord 服务器里,还有 14 岁的成员正在制作 OpenGL 项目,甚至有一名 14 岁的成员正在学习 Vulkan。

因此,我认为根本没有必要花 3 年大学时间,才第一次发现自己喜欢什么。许多人可以通过自学,在相同的 3 年里找到方向,并在这个方向上达到很高的水平。

我也能理解人们仍然想上大学,因为没有 diploma 会让人感到不安。但现在看来,花 5 年时间后仍然不会写好程序,则更加令人忧心。

理论信息学和理论数学挤掉了 C++ 项目时间


我有一位就读于优秀大学的朋友。由于有大量的作业,这位朋友几乎没有时间制作自己真正感兴趣的项目。

作业内容包括 theoretical informatics,以及 theoretical mathematics in informatics。

有人可能会说,学生学到的所有内容以后都会有用。

但如果一个人想成为面包师,他应该花时间学习烘焙,而不是先花 3 年学习高级化学。优秀的面包师当然知道一点化学,但他们主要花时间是做饭和烘焙。

同样,如果目标是成为程序员,就应该花时间编程和制作项目。我的这位朋友因为作业太多,根本无法获得这种练习。

我自己的做法是想办法少花时间在不关心的课程和作业上。我还会和同学交换任务,例如让同学完成 webdev homework,自己则帮对方完成 C++ homework。

我几乎没有花时间学习自己不在乎的内容,而是把时间用在他认为一定有帮助、也真正感兴趣的方向上。

skill scaling project 从 C++ Terraria clone 开始


我认为,学习编程需要参加开发一个大项目,但不能随便选一个项目。这个项目应该包含许多可以逐步加入的系统,而且每个系统都要有不同难度。

我把这种项目称为 skill scaling project。项目可以随着学习者的能力增加而变复杂,初学者和更有经验的人都能从中找到合适的挑战。

比如世界生成器就是一个例子。初学者可以先按照课程中的方式制作简单版本,也可以继续挑战更复杂的 world generator。整个项目的难度,可以随着学习者的进步不断增加。。

学历安全感并不能替代编程能力


学历带来的安全感,并不能保证一个人会写好程序。

我真正担心的是,有人完成大学和 master 后,仍然没有足够的时间和经验去制作自己想做的东西。

如果已经找到感兴趣的方向,就不必等学校或家长安排下一步。想要具体的新起点时,你可以从本文所提到的内容开始~

作者:场长

参考:

https://www.youtube.com/watch?v=eRqSAPpIPlY

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信