2013年秋天,我开始学习Python。一个转了专业的程序员,干嘛30多岁还要去学一门新的编程语言呢?因为看到了痛点,学生的痛点。
除了数据库英文授课之外,我还有一门《信息系统开发》课程,授课对象是信息管理专业高年级的本科生。
信管专业的学生需要学习多门计算机技术类课程。基础课程包括C语言、数据结构、数据库、计算机网络、操作系统、Web开发技术,还有许多与系统开发相关的课程,例如管理信息系统、信息系统建模、信息系统分析与设计,以及这门信息系统开发。
作为最后一门系统类课程,这门课需要大综合,就是把之前学到的知识都用上,做一个实际的系统出来。
系统开发需要进行多个步骤。规划、分析、设计、实施和测试维护。每到课程进展到了实施环节,就总会有学生来我这儿哭鼻子。
呜呜呜……
你怎么了?
我不会写代码!
怎么可能呢?C语言是必修课,许多学生还选修了Java和ASP.Net。如果你不会写代码,C语言课你怎么过的?
学生每到这个时候都很坦诚——背下来了,就考过了。
背下来了?!这是编程好不好?绝对的实践类课程。既不是语文,又不是英语,你背了管什么用?我的三观受到了强烈冲击,立即感到脑缺氧状态。
学生这时候往往还不忘给我伤口上撒一把盐——“比思修还难背,考完就忘光了”……
后来,我耐心进行了调查。终于明白了这种怪事儿发生的缘由。问题就出在第一门编程课上面。
许多学生刚开始学编程还有些新鲜感。但是如果遭遇到挫折,会立即选择四散奔逃。要命的是,他们第一门接触到的编程课是C语言。
虽然有一本C语言教材火了好几十年,但不知道有没有人真正琢磨过,各大学不分专业一刀切地都用C语言作为学生的编程入门,这样真的好吗?
计算机语言有高级语言和低级语言之分。如果你觉得高级语言好,低级语言不好,那就大错特错了。二者实际上是一个连续光谱上的两端而已。
最低级的语言就是机器语言,也就是只由0和1构成。计算机看得懂。人要想看懂……反正我是不去尝试的。
高级语言计算机是看不懂的,它就是向人的思维靠拢。开发者用着越舒服,这语言就越高级。如果我用自然语言告诉电脑完成一个指令,它就真的能够完成,那它的背后就是一个非常高级的语言。2016年5月发布的Viv,实际上干的就是这个事儿。
但是我们都知道一个事实——天底下没有免费的午餐。语言的“高级”也是通过权衡换来的。牺牲的东西叫做效率。
这样就给了我们一个大致的分类。如果你要设计的东西效率优先(例如你要做个操作系统或者导弹防御系统),那么你应该选择低级语言;如果你要设计的东西效率不是那么重要,那么就选择高级语言吧,别折磨自己。
小测验:C语言是高级语言还是低级语言?
别背了。我知道那本书上面说它是高级语言。但是,它其实是披着羊皮的狼而已。
C语言与大多数高级语言(例如Java)的最大差别就是指针。指针干什么用?直接对内存操作。可控性高,效率也就高。可是缺乏计算机体系结构知识的学生学起来却一头雾水。我讲过2年C语言课程。讲到指针这部分,不得不使用大量的比喻,才能让学生有个模糊的感性认识。教案如果总结出来,比喻使用的密度可能会直追钱先生的长篇小说。
C语言很有用。看看你的手机就知道了。如果你用的是iPhone,其中大部分的App都是用C语言的一个变种Objective C写的;如果你用的是Android,那么手机操作系统是C写出来的。
C语言是计算机专业的必修课,这合情合理,因为它是将来挣钱的本领。但是,信管专业的学生可能将来只是打算开发个网站,做数据分析和数据可视化。C语言不但不是必须的,而且可能会从此浇灭他们学习编程语言的热情和兴趣。
有没有适合非计算机专业学习的编程入门语言呢?当然有。
看看美国的例子。MIT之前数十年都采用Scheme(Lisp语言的一个方言)作为6.001计算机导论课程的入门语言,培养了许多计算机科学界的优秀人才。
选择这门语言就是因为语法极其简单,半个小时就能讲完语法,后面专注介绍编程的思想。
这语言看起来很奇怪,满屏幕都是括号。
可是,一旦你真正掌握它,那可就是科技竞争中的核武器啊。不信你去看看著名的《黑客与画家》中提到的案例。
后来,MIT教学团队认识到了Python语言的优势,于是用Python替代了Scheme,继续给MIT学生的编程学习提供一个更好的无障碍且充满乐趣的路径。
为什么MIT不用C语言?MIT的计算机教授不懂C语言吗?还是MIT的学生天资不足,难以学会C语言?
都不是。因为明明有更好的选择啊! :-)
现在的程序开发,大都采用“搭积木”的方式。开发者会大量采用其他人制作的模块或者函数库。一种编程语言,如果有很多人用,社区就会更健康和强大。你使用这种编程语言,手头儿就会有更多类型的积木,会比其他人更好更快地搭出一个符合需求的系统。
Python有劣势。它属于解释型语言,执行效率并不高。所以我们没有听说过哪个广泛使用的操作系统是用Python做出来的。但是在很多方兴未艾的领域,Python都在默默崛起。
当然,我真的认识到这一事实,已经是1年以后的事情了。当时我想学习Python。只是因为2个交织在一起的原因:
Google搜索结果中排列靠前的包括他们自家提供的Python教程,不长。学过之后觉得这门语言确实很容易上手,但是该教程不够系统,练习也不够全面和深入。
继续搜索,发现Udacity平台上面有一门课很受学习者喜爱。课程名称叫做”Intro to Computer Science”。主讲者是弗吉尼亚大学计算机科学教授Dave Evans,曾荣获弗吉尼亚的大学教师最高奖。
这门课从2015年起已经扩展成为了3个月的时长了。在2013年的时候,只需要7周的时间就可以完成。课程的介绍很简洁——“七周时间,从小白到会写搜索引擎”(本人意译)。
搜索引擎?!
美国人很爱拿搜索引擎说事儿。因为Google简直就是个印钞机,它的成功让人们对于搜索引擎开发羡慕而又觉得遥不可及。这门课的最大贡献就是破除了这种迷信。如果一个初学者(之前没有任何的计算机编程,乃至是基本的计算机知识基础),也可以通过七周的学习掌握构建搜索引擎的基本方法,那这种技术就再也没有神秘感可言了。
我一下子来了兴趣。我虽然不是初学者,但是我之前并不掌握Python语言;之前我反复听过Page Rank的概念,但是从来没有实践过;而且,我也想体验一下Udacity平台的教学过程,要是能够拿个证书就更好了,据说可以帮助学生在硅谷找工作哦。 :-P
我开始了尝试。不得不说,当时Udacity的课程设计比Coursera好许多。
Coursera平台初期的课程还是保留了大学课堂的教学方式。一课一练,中间儿就是老师一个劲儿讲。在10几分钟的视频里,最多突兀地蹦出1-2个页面,让你做个选择题啥的,确保你没有在电脑前睡着。
Udacity课程是完全根据MOOC的理念重新设计过的。2-3分钟一个单元,随时都有可能蹦出来问题。大多数问题直接就在视频停止的截图上面给出选项或者文本框要求回答,把教学和实践的互促过程设计得更加紧密。
作为计算机导论课,这个课程里面还经常会有小惊喜。有的时候2-3分钟就介绍了一段很有趣且实用的相关科技史知识,让学习者在前行过程中顺便开阔了眼界。
课程不光有趣,也很有深度。七周的时间里,这门课不仅介绍了Python作为结构化语言部分的基础数据结构(当时面向对象部分没有作为主体内容,而是被放在了附录里),还让学习者自己从头用Page Rank算法搞了个小型搜索引擎出来。最为贴心的是,所有编程环境都在线上提供,学习者只要拥有一个浏览器就行了。必须承认,学习者做出来的这个搜索引擎实用性并不高,但是——太有成就感了!
因为那个学期我讲授英文数据库课程,备课任务比较重,学习这门课有些断断续续的。直到2014年的1月,我才拿到了课程的证书。至今我还记得那种喜悦,那是一种眼见得汗水化作了收获的奇妙感觉。