发布于 2026-01-06 13 阅读
0

学习编程的五大支柱

学习编程的五大支柱

学习编程很难。我经常发现大学课程和编程训练营会忽略编程的重要方面,而且对新手的教学方法也不尽如人意。

我想分享我认为一个成功的编程课程应该建立在五个基本支柱之上的内容。和以往一样,我将以主流Web应用程序为例进行讲解。

新手的目标是掌握编程基础知识,并了解库和框架的重要性。

云计算、运维或构建工具等高级主题不应纳入课程。我对设计模式也持怀疑态度,因为它们假定学员具备初学者所不具备的经验。

测试驱动开发(TDD)

测试驱动开发

TDD有很多好处。但遗憾的是,它是一个比较高级的主题,初学者可能还没有完全做好准备。

初学者不应该编写测试用例,这对他们的基本技能水平来说太难了。相反,他们应该学习如何使用和处理测试用例。

每门编程课程都应该以练习为中心。我会在练习中加入单元测试,并为学生提供一个已经配置好的运行这些测试的环境。

学生们只需编写代码,然后观察测试运行器的指示灯从红色变为绿色即可。由此产生的游戏化效果是一个不错的附加好处。

例如:如果选择的技术是 Spring,我会将练习和测试放在一个 Spring 项目中。学生无需了解任何 Spring 相关知识,他们只需要知道练习的位置以及触发测试的按钮即可。

此外,学生必须掌握调试器的使用方法,并能随时使用交互式解释器(REPL)。在测试驱动开发(TDD)中,能够在运行时分析代码并拥有一个用于小型实验的实验环境至关重要。

关键在于确保学生在掌握核心编程技能后,无需再去学习基本的测试驱动开发(TDD)行为规范。在学生未来的学习生涯中改变习惯远比现在就养成这些习惯困难得多。因此,他们应该从一开始就将单元测试融入到日常工作中。

在他们职业生涯的后期,他们应该对没有单元测试的项目深恶痛绝。他们应该凭直觉就能意识到缺少单元测试是一种反模式。

基本功第一

基本功第一

我经常听到有人说新手应该一开始就学习框架。这就像教人开车,直接把他们放到拉力赛车里,让他们避免转向过度一样。这样做完全忽略了他们仍然会把刹车误认为是油门的事实。

同样的情况也适用于我们向学生介绍像 Angular 这样的框架。初学者首先需要理解编程的基础知识。他们需要熟悉基本元素以及编写代码的意义,才能使用别人编写的代码。

函数、变量、条件和循环这些概念对新手来说完全陌生。但这四个要素构成了编程的基础。程序的一切都依赖于它们。

学生们都是第一次接触这些概念,但熟练掌握这些概念至关重要。如果学生没有掌握基础知识,接下来的一切都会显得像魔法一样,最终只会导致困惑和挫败感。

教师应该花更多时间讲解这些基础知识,但遗憾的是,他们往往操之过急。问题在于,教师很难设身处地地站在学生的角度思考问题。他们编程多年,早已忘记了初学者会遇到哪些类型的问题。这很像职业拉力赛车手。他无法想象刹车前需要思考,他只是下意识地做出反应。

我设计的练习题既具有挑战性,又可以通过四个主要要素的结合在合理的时间内解决。

一个很好的例子是罗马数字和阿拉伯数字的转换器。这项挑战需要学生的耐心。一旦他们成功运用这四个要素解决挑战,他们的积极性也会大大提高。

基本面很重要。在基本面稳定之前,不要贸然行动。

库和框架

库和框架

学生们花费大量时间编写代码后,必须意识到大部分代码已经以库或框架的形式存在。这与其说是一种模式,不如说是一种思维方式。

正如我之前写过的:现代开发者懂得选择合适的库。他们不会花费数小时自己编写一个充满漏洞的版本。

为了成功实现这种思维转变,“基础阶段”的例子应该能够使用 Moment.js、Jackson、Lodash 或 Apache Commons 等知名库来解决。

这样,学生们就能立刻明白图书馆的价值。他们之前费尽心思琢磨那些复杂的问题,现在却发现图书馆能迅速帮他们解决问题。

与 TDD 类似,当同事吹嘘自己开发的、无需使用 Redux 的状态管理库时,学生应该提高警惕。

对于框架而言,一旦学生理解了库的用途,理解其重要性就不成问题了。

根据课程时间安排,可能很难抽出时间来学习框架。但正如我之前提到的,最重要的是转变学生的思维模式,让他们不再从零开始编写所有代码,而是探索和使用各种库。

我没有在这个模块中添加工具,因为它们只对经验丰富的开发人员有用。在这个早期阶段,学生不需要学习如何集成和配置工具。

师徒

师徒

二十出头的时候,我想学钢琴。我不想找老师,觉得可以自学。五年后,我咨询了一位专业导师。结果呢?我一个月学到的东西比之前五年加起来都多。

我的钢琴老师指出了我演奏中自己听不到的错误,并让我意识到一些我从未想过的诠释层面的问题。毕竟,她为我灌输了音乐和艺术的思维方式,而这两点对于我这样一个技术型的人来说,原本是遥不可及的。

编程也是如此。如果一个人没有任何编程经验,那么自学并不是一个好主意。虽然有很多成功案例,但我对独自学习的效率持怀疑态度。

相反,应该建立一种“师徒”关系。一开始,师傅制定规则,学徒必须盲目遵守!师傅或许会解释规则,但通常学徒无法理解其中的缘由。

这些内化的规则构成了一种安全网。即使迷失方向,也总能找到安全的归宿。

教学不应是单向讲授。教师必须因材施教,关注每一位学生的学习情况,给予指导,并根据学生的学习进度调整课程节奏。

当学徒达到一定的技艺水平后,就应该鼓励他们探索新的领域。师傅也会转变为一位分享“智慧”并乐于交流的导师。

挑战与动力

挑战与动力

“我们来创建一个Facebook克隆版吧!” 这可不是出自一位拥有众多资深软件开发人员和数百万欧元预算的CEO之口,而是一个程序员入门课程的练习。这样的任务根本不可能完成。更糟糕的是,学生们被引入了一个虚幻的世界,并被误导地认为自己拥有了实际上遥不可及的技能。

毫无疑问,老师也意识到了这一点,但他设计这些练习是为了激励学生。

练习的主要目的不是为了娱乐,而是为了围绕特定的技巧而设计,并帮助学生理解该技巧。

激发学习动力固然重要,但不能以牺牲学习内容为代价。编程并非易事。如果学生缺乏内在动力,编程可能并非最佳选择。

新手应该体验一下成为专业开发人员意味着什么。他们应该在投入大量时间之前,先了解一下自己将要面对什么。

例如,许多商业应用程序都围绕复杂的表单和网格展开。创建这些表单和网格是一项重要的技能,可以通过练习来培养。类似 Facebook 等公司的应用程序可能并非学生学习的最佳案例。

同样,非程序员可能会惊讶于开发人员每天编写的代码行数如此之少。甚至有时我们会删除代码或一无所获。

为什么?因为各种问题层出不穷。我们常常花费无数时间修复一些极其奇怪的bug,结果发现只是简单的拼写错误。某个工具可能仅仅因为某个库进行了小版本升级就无法正常工作。或者系统崩溃仅仅是因为有人忘记将文件添加到git仓库。这样的例子不胜枚举。

学生们应该享受这些经历。在时间压力下,对着一个陌生的图书馆进行练习,或许正是他们需要的。 ;)

现实生活中并非总是阳光灿烂。初学者应该做好充分准备,迎接编程的现实挑战。

最后建议

最后但同样重要的是:成为一名专业程序员不可能在两周、两个月甚至一年内完成。这需要时间和耐心。

培训师不应操之过急或做出虚假承诺。他们应该关注学员是否理解概念,而不是操之过急。

文章来源:https://dev.to/rainerhahnekamp/5-pillars-of-learning-programming-1hd9