如何向新手程序员介绍编程?

jopen 5年前

学习Java,他们都说很easy。

作为一名刚从斯康星大学麦迪逊分校计算机科学系毕业的大学生,我通过一些编程课程认识了很多使用Java的朋友。现在很多学校都在从别的编程语言 (大多是C ++)转教Java,一项于2014年7月所做的研究表面截至调查时间为止,39个顶级美国CS项目已经有22个使用Java作为入门课程。

那么,到底是什么使得Java能从众多的教学语言中脱颖而出?纵观各个方面,我们发现了一些蛛丝马迹:

  • 语法相对比较简单(相较于C语言和C++),难点较少(还是相较于C语言和C++)。语法越简单就意味着新手需要掌握的规律就越少,这对新手而言绝对不亚于一个福音。
  • Java相较于一些传统的教学选择,如C和C++,比较不容易出错,因为很多操作都会自动检查。如果你想要访问的数组超出了其界限或者使用空对象 产生了异常,那程序就会通过漂亮的堆栈跟踪告诉你出了什么错误,哪里出了问题(直接将范围缩小到造成这个问题的源文件中)。与此相比,C语言和C++,如 果访问了空指针,那么程序就像炸弹一样毫无预警地爆炸,丝毫不留给你任何有用的提示信息(除非你是在调试器中运行,所以我们必须学会使用调试器,以防万 一)。而要是C语言和C++的数组越界的话,那就更悲剧了,因为在很多例子中,甚至会有内存中数组元素值莫名其妙被改写的情况。然后你只能面对着这个崩溃 的程序,目瞪口呆、完全束手无策。这绝对是分分钟逼疯一个程序员的节奏!
  • 有了垃圾回收器就意味着你并不需要亲自来管理内存。用new关键字创建对象之后,那它将永远保留在内存中(只要有任意一个地方引用即可)。而且使用完这个对象后,垃圾回收器就会为你清理掉这个对象。
  • Java在行业中的应用非常广泛,因此,从理论上讲,我们在学校里学到的知识可以直接转化成真正的工作。TIOBE编程指标将它列为第二门最为常用的编程语言。无论你是否同意TIOBE的准确分析,但是你不得不赞同Java被广泛使用的这个现状。
  • Java是面向对象的。你可以创建包含数据的对象,然后编写方法用来描述作用于这些数据的行为。

上面这些听上去真美!但是却并不完整。

迂回策略

几乎所有的程序员编写的任何语言的第一个程序都是“Hello World”。它所做的就是显示一些消息(传统上都会选择“Hello World”),然后退出,非常简单。下面是用Java写的Hello World程序:

public class Hello {  public static void main(String[] args) {  System.out.println("hello, world");  }  }

一些对于编程全然陌生的人就会心有疑问了 ,然后这时候如果你是老师的话,嘿嘿,麻烦就来了。想要一下子就能将所有内容通通解释给学生听,可能会成为压垮骆驼的稻草,所以,你最好采取迂回策略。
“请问,public是什么意思?”——现在没必要考虑这些,以后我们会深入探讨。
“class是什么?”——现在没必要考虑这些,以后我们会深入探讨。
“static是什么意思?”——现在没必要考虑这些,以后我们会深入探讨。
……等等,都可以这么说。

但是值得一提的是,无论是教什么内容,我们都应该将其分解成一块块容易消化理解的组成部分。封装(public关键字)、面向对象的编程 (class和static)、数组(String[ ])以及命令行参数(args)这些重要的知识都应该适时地解释给学生。当然,对于那些尚处于编程启蒙阶段的新生来说,要想一口吃成个大胖子未免太过于天 方夜谭了。我认识的很多朋友,他们在其他领域绝对算个佼佼者,但是碰到这些编程概念问题也立马一个头两个大。就像是在代数中突然引入这个:

如何向新手程序员介绍编程?

一旦我们知道了这些符号的含义,那么理解起来似乎也没有那么困难。但是对那些才涉足这一领域的新生来说,这完全不亚于是无字天书啊。再则,迂回策略 虽然鼓励了学生使他们不至于立马泄气,但是从另一个角度讲,却只是表面化地展示某种“神奇”成果,并没有分析解释其原理。但是我想说,如果你想成长为一名 真正的教师,这种方法与你的理念应该是背道而驰、截然相反的。例如Hello World这个例子,

  • Java严格面向对象,并要求每一个函数(或“方法”,在Java中的说法)被放置在一个类中。如果你还没阅读过Execution in the Kingdom of Nouns这 篇优秀文章,那我强烈推荐你去读一下。它的主要内容可以概括为,“倡导面向对象的编程就像是为客人量身定制服装一样”。向那些对if语句和for循环这些 概念还是一团浆糊的新生解释面向对象的设计原则,绝对是个糟糕的“调用”。要着眼于将工作分解为一个一个可以写成函数的小片段,然后我们再回过头来讲什么 是OOP。
  • Java规定,所有的对象都是以堆的形式分配的,所以所有的对象变量都是指针。现在你需要解释的是值和引用之间的差异,就像为什么int、 boolean、float在赋值和比较时与strings的行为就是有所不同。类似于这些衍生出来的问题共同组成了一个一致性的解释工作原理的心智模式 ——作为程序员这个是必备——但是其过程异常艰巨。

Java对于开发程序(无论大小范围)而言或许真心是门超棒的编程语言,但是对于初学者而言这家伙绝对算不上友好。

那么我们应该教什么语言呢?

既然如此,那有人会问,那我一开始先学点简单的概念,然后在这些的基础上再深入学习Java,不就成了?!但是很抱歉,Java表示臣妾做不到!

那么我们该怎么做呢?下面这两种合情合理的开启编程之路的方法或许能让你有一种醍醐灌顶之感:

  • 低水平的起始点,然后一步步提升难度。教你如何使用计算机,这样你就可以直接用C语言写一些简单的程序。然后再在这个基础上,构建更高层次的计算机科学结构体系。
  • 高水平的起始点,然后再一步步降低难度。先教授计算机科学的理论和一种编程语言,这种编程语言得非常容易实现,并且毋须担心底层机器的细节,例如 Python,在这里就是一个挺不错的选择,因为它不受正面加载Java需求的影响。然后再分解计算机是如何一步步实现这些理论的。

现在,第2个方法变得越来越风靡,从本文开篇提及的研究——Python已经超越Java成为了使用最广的编程入门语言这一事实——可见一斑。

无论你选择哪种方法,关键是要保持学生对此的兴趣。如果你选择的是低水平起始点的方法,可以使用Arduino或机器人技术套件,以便于学生可以在 物理世界中观看他们写的代码。话说,我刚一开始用C语言为一支机器人团队编写代码,我就被这个奇幻的世界深深地迷住了:看着120磅的钢管和转动马达因为 我写的代码而动起来的时候,那感觉真心是太神奇、太不可思议了。如果你选择的是高水平起始点的方法的话,不妨利用库中资源来制作视频游戏或者其他图形程 序。

如何向新手程序员介绍编程?

编程特别的不可思议。除了你的想象力还有表达能力,其他没有别的东西可以限制你。找到学生的兴趣切入点,寓教于乐,从易到难,循序渐进,教会他们如何使用工具,授之以鱼不如授之以渔,让他们在编程的世界中自由疯狂地成长。

译文链接:http://www.codeceo.com/article/introduce-programming.html
英文原文:How should you introduce people to programming?
翻译作者:码农网 – 小峰