最近,我作为培训师参与了一个教绝对初学者编程的项目。
学习如何编程是很难的。我经常发现,大学课程和训练营错过了编程的重要方面,并采取了糟糕的方法来教授菜鸟。
我想和大家分享一下我认为一个成功的编程课程应该建立在五个基本支柱上。一如既往,我是针对主流网络应用的背景。
菜鸟的目标是掌握编程的基础知识,了解库和框架的重要性。
云、一般的操作或构建工具等高级话题不应该是课程的一部分。在谈到设计模式时,我也持怀疑态度。它们预设了初学者永远不会有的经验。
所以,让我们看看新程序员应该从哪里开始。
测试驱动的开发 (TDD)
TDD带来了很多【好处】(https://www.rainerhahnekamp.c...。不幸的是,这是一个高级话题,初学者还没有完全准备好。
初学者不应该写测试。这对于他们的基本技能水平来说,将是太多了。相反,他们应该学习如何使用测试。
每一门编程课程都应该以练习为中心。我用单元测试来扩展我的练习,并为学生提供一个已经设置好的环境来运行这些测试。
学生们所要做的就是编写他们的代码,然后看着测试器的灯从红色变成绿色。由此产生的游戏化是一个很好的副作用。
比如说 如果选择的技术是Spring,我就在Spring项目中提供练习和测试。学生们不需要知道任何关于Spring的知识,他们只需要知道Spring的位置。他们只需要知道练习的位置和触发测试的按钮。
此外,学生们必须知道如何使用调试器,并且要有一个方便的Read-Eval-Print Loop(REPL)。在TDD中,能够在运行时分析代码,并且有一个小实验的操场是必不可少的。
主要是保证学生在掌握核心编程技能后,不用再学习基本的TDD行为。在学生以后的职业生涯中,改变习惯会比现在学习这些习惯难得多。这就是为什么他们应该从一开始就如同呼吸一样的频繁的使用TDD的原因
在以后的职业生涯中,他们应该对没有单元测试的项目产生反感。他们应该直观地将没有单元测试的项目视为反模式。
基础第一
我经常听到,新手应该立即从框架开始。这就好比把人放在拉力赛车里教他们如何开车,要求他们避免转向过度。这根本就忽略了一个事实,那就是他们仍然把刹车误认为是油门。
当我们让学生开始学习Angular这样的框架时同样适用。初学者需要先了解编程的基础知识。他们需要在使用别人的代码之前,先熟悉基本元素和编写代码的含义。
对于新手来说,函数、变量、条件和循环的概念是完全陌生的。这四个元素构建了编程的基础。一个程序的一切构成都依赖于它们。
学生是第一次听到这些概念,但最重要的是学生要熟练掌握这些概念。如果学生没有掌握基础知识,接下来的一切都像魔术一样,会导致学生感到困惑和沮丧。
教师应该在这些基础知识上多花些时间。但可悲的是,很多人走得太快了。问题在于,有些教师难以把自己放到学生的角色中去。他们已经从事编程多年,已经忘记了初学者要处理的问题类型。这和一个专业的拉力赛车手很相似。他无法想象有人在刹车前需要思考。他只是自动地去做。
我设计的练习是具有挑战性的,但通过使用四个主要元素的组合,可以在合理的时间内解决。
一个很好的例子是罗马和阿拉伯数字的转换器。这个挑战需要学生的耐心。一旦他们成功运用四大要素解决挑战,他们的积极性也会得到很大的提升。
基础知识很重要。在他们没有解决之前,不要继续前进。
库和框架
当学生花了大量时间编码之后,他们一定会了解到大部分代码已经以库或框架的形式存在。这与其说是一种模式,不如说是一种思维方式。
正如我写过的以前。现代开发者知道并选择正确的库。他们不会花几个小时自己写一个错误的版本。
为了让这种思维方式的转变取得成功,"基础阶段 "的例子应该是可以通过使用知名库来解决的,比如Moment.js、Jackson、Lodash或Apache Commons。
这样一来,学生们就会立刻明白库的价值。他们围绕那些复杂的问题绞尽脑汁。现在他们发现,一个库很快就解决了这个练习。
与TDD类似,当同事吹嘘他们自制的状态管理库使Redux变得没有必要时,学生应该产生怀疑。
谈到框架,学生一旦了解库的用处,就不会有任何问题,理解其重要性。
根据课程的时间安排,可能很难在框架上投入时间。但正如我已经指出的,最重要的方面是将学生的思维方式从一切从头开始编程转变为探索和使用库。
我没有在这个支柱中加入工具,因为它们只对有经验的开发人员有用。在这个早期阶段,学生不需要学习如何集成和配置工具。
师傅和学徒
20多岁的时候,我就想学钢琴。我不想请老师,认为自己可以学。五年后,我咨询了一位专业的家教老师。嗯,我能说什么呢?我在1个月内学到的东西比之前5年的时间还多。
我的钢琴老师指出了我弹奏中我听不到的错误,让我意识到了我从未想象过的演绎方式。毕竟,她给我灌输了音乐和艺术的思维方式,而这两种思维方式对于身为技术人员的我来说是遥不可及的。
在编程中也是一样。如果有人没有编程的经验,那么自学就可能是个坏主意。虽然有很多成功的案例,但我质疑单干的效率。
相反,应该是 "师徒 "关系。一开始,师傅给出的规则,徒弟必须遵守--盲目地遵守! 师傅可能会解释规则,但通常道理是徒弟无法理解的。
这些内化的规则形成了一种安全网。如果一个人迷失了方向,总能有一些安全的归宿。
教学不应该是独角戏。师傅要和每个学生单独打交道。他应该检查学生的工作情况,提出建议,并根据他们的进度调整课程的速度。
当徒弟们掌握到一定程度后,应鼓励他们去探索新的领域。师傅演变成一个分享 "智慧"、开放讨论的导师。
挑战与激励
"让我们创造一个Facebook克隆版!" 这句话并不是来自一个由一群高级软件开发人员和数百万欧元预算支持的CEO。这是程序员入门课程中的一个练习。这样的任务实际上是不可能的。更糟糕的是,学生们被置于仙境之中,并被蒙蔽了双眼,以为自己拥有的技能真的是遥不可及。
毫无疑问,教师意识到了这一点,但出于激励的原因,却创造了这样的练习。
练习的主要目的不是为了娱乐。它应该围绕着某一特定的技术而创造,应该帮助学生理解这一技术。
激励是好事,但不能以牺牲内容为代价。编程并不容易。如果学生没有内在的动机,编码可能不是办法。
新手应该体验一下什么是专业的开发人员。在投入大量时间之前,他们应该知道等待他们的是什么。
例如,许多商业应用都围绕着复杂的表单和网格。创建这些是练习可以传授的重要技能。构建一个类似于Facebook的应用程序可能不是学生马上学习的最佳课程。
同样,一个非程序员可能会惊讶于开发人员每天写的代码行数之少。甚至有的时候,我们会删除代码或者一无所获。
为什么会这样呢?因为事情总是出错。我们花了无尽的时间来修复一些极其奇怪的bug,结果只是一个简单的错别字。一些工具可能无法使用,只是因为一个库有了一个小的版本升级。或者系统崩溃是因为有人忘了在git中添加文件。这样的例子可以举不胜举。
学生应该享受这些经验。在时间的压力下,针对未知库的练习可能正是正确的事情;)
在现实生活中,阳光并不总是灿烂的。初学者应该为编程的现实做好充分的准备。
最后建议
最后但并非最不重要。一个人不可能在两周、两个月甚至一年内成为一个专业的程序员。它需要时间和耐心。
培训师不应该急于求成或做出虚假的承诺。他们应该把重点放在学生是否理解概念上,而不是太快。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。