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


学习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磅的钢管和转动马达因为我写的代码而动起来的时候,那感觉真心是太神奇、太不可思议了。如果你选择的是高水平起始点的方法的话,不妨利用库中资源来制作视频游戏或者其他图形程序。

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

如何向新手程序员介绍编程?相关推荐

  1. 编程老手的哪些特点,是值得新手程序员学习的?

    作为一个经验丰富的程序员,有哪些事情是你希望在一开始编程的时候就知道的?或者换个方式来说,你认为每个新手程序员应该做或者学什么才能让自己的编程水平更好? 下面是一位 CTO Ken Mazaika 的 ...

  2. 算法精解 c语言描述 豆瓣,斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂!...

    原标题:斯坦福大学教授亲授,这本美亚4.7星的算法书,新手程序员都看得懂! "算法会扩展并提高大家的编程技巧,而学习基本的算法设计范式,可以和许多不同领域的不同问题密切相关,还能作为预测算法 ...

  3. 有哪些新手程序员不知道的小技巧?

    提到新手程序员,大家想到的第一个词可能就是:刷题.尤其是通过LeetCode刷题,想必新手程序员们都经历过这一步,甚至不少人认为只要在LeetCode上刷的题目够多,就一定能够进阶为大神. 但是,不难 ...

  4. 写给新手程序员的一封信

    首先,欢迎来到程序员的世界.在这个世界上,不是有很多人想创造软件并解决问题.你是一名hacker,属于那些愿意做一些有挑战性的事情的人. "当你不创造东西时,你只会根据自己的感觉而不是能力去 ...

  5. webstorm怎么跑项目_看不懂代码,不会用框架,新手程序员入职后如何快速上手项目?...

    大家好,我是良许. 对于职场新人,特别是应届毕业生,他们拿到offer之后,进入公司后会有一段时间的焦虑感.比如说,不懂公司项目开发流程,代码看不懂,业务流程也不知道,框架不会用,等等还有各种各样的问 ...

  6. 师妹问我:有哪些新手程序员不知道的小技巧?

    阅读本文大概需要5分钟. 一个师妹问:洋哥,我今年应届毕业,刚开始写代码,不知道有没有一些新手需要注意的地方. 给了师妹一些建议之后,感觉这是个好问题!不光是新手程序员,很多小技巧小秘密恐怕老手也未必 ...

  7. 新手程序员基础都掌握了,动手敲代码就一脸懵逼?教你解决办法!

    相信很多初学编程的朋友都有这样的苦恼:为什么我感觉自己基础都掌握了,也看过很多视频和资料了,但就是自己动手敲代码的时候就开始懵逼了! 通常新手程序员会以不同的方式来表达这个疑问,比如: "我 ...

  8. 新手程序员必备10大技能

    如果你已经有一段时间的编程经验,或者正准备学习编程,那么可能会考虑的是:怎样才能成为一名优秀的程序员?计算机专业的毕业生如何为软件开发和编程职业生涯做准备?职场对于初级开发人员有哪些期望?这是临近毕业 ...

  9. 给新手程序员的一点学习建议

    我是一个有几年经验的程序员,之前对于自己的发展却是一头雾水,不知道主流技术,不知道工作是迎合主流技术还是迎合公司发展.让我有感触的是这两年的坚持学习,在迎合公司的发展的前提下,有自己的学习时间,基于此 ...

最新文章

  1. 华为手机 开启LOGCAT
  2. 学python的好处-学习python有什么好处?python强大之处在哪?
  3. 无需predetermine一条路
  4. 边坡稳定性分析软件slope/w用户指南_岩石边坡平面滑动(Planar Sliding)稳定性分析...
  5. Django进阶Model篇—数据库操作(ORM)
  6. Java String indexOf(int ch)方法与示例
  7. java jbutton 禁用_java-禁用后对jButton执行的操作
  8. Linux基础(9)--延时与时间
  9. html禁止转义reg,HTML转义 - Reg表达式?
  10. fastapi 的启动方式
  11. javascript 未来新方法的介绍
  12. 网页另存显示不全_word另存为选项没有PDF格式怎么办?别忘了还有这招!
  13. c语言p1-melepeo,C语言做个学生选课系统 -电脑资料
  14. 深度学习之 RBF神经网络
  15. 对文件夹中文件进行批量重命名
  16. 大容量U盘计算机会不识别吗,电脑无法识别U盘?学会这5步操作,不求人自己也能解决...
  17. win10专业版关闭Windows Defender Antivirus
  18. 解决“你没有权限访问,请与网络管理员联系”
  19. 关于微信小程序自定义导航栏时,如何获取手机状态栏和导航栏高度
  20. Android入门教程(八)

热门文章

  1. 计算机换色带技巧,色带盒怎么更换 色带盒更换安装方法【图文教程】
  2. php记录网站访问,PHP简单实现记录网站访问量的功能
  3. Andriod:安卓线程实现页面的自动跳转
  4. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式
  5. Rxjava 优雅的实现短信验证码发送
  6. 二分法细节学习-mid
  7. Pytorch学习-tensorboard的使用
  8. opencv 边缘检测
  9. Python 求最大子集的递归实现
  10. keras lstm 层理解