春节在家,不想写项目,就捡起了早就听说的 Codecademy 来试试看,选了 Python 教程,花了几天时间断断续续刷完了(我的 profile )。写下一些我对于这个编程学习平台(工具)的感想。

一句话总结就是:设施齐备,内容欠缺。

设施齐备

Codecademy 的用户体验还是很不错的,那个用纯 JS + HTML 写成的 IDE (准确来说只是编辑器)对于简单编程练习来说还是堪用的,配色、缩进、高亮都很到位(虽然没有 vim 快捷键,笑),支持多标签,最关键的是右边的 virtual console 挺方便,实时、互动地显示出程序的运行结果( JS 和 HTML 是使用本地浏览器来运行的, Python 、 PHP 、 Ruby 等等则是上传云端运行的)。技术上还是很强大的。

根据学习 Python 教程的观察以及简单看了看制作教学 track 的文档,发现 judger 的类型还是比较丰富的,包括了校验 IO 以及变量、对象的值的多种单元测试方法,以及直接检查源代码的字符串处理,应该可以组合出很多有意思的东西。个人认为官方的 Python track 还没有充分用好这些工具(稍后会提到)。

另一方面, Codecademy 的成就系统非常完善,给了学习者不少动力。其实 Python track 难度很低,我本不想刷完的,后来坚持全部做完有一部分原因就是受到了它的成就系统的诱惑,有一种游戏过关的快感。

内容欠缺

可是, Codecademy 究竟把这样一套设施运用到了什么程度呢?我想说:很糟糕。我只做了 Python track ,不知道更老牌的 JS 和 HTML track 怎样,单就 Python 来说,难度有些尴尬:如果对编程完全没有基础,教程难度稍高一点(主要是曲线可能偏陡了),而且没有把一些关键概念讲清楚;对于有任何其他语言基础的人来说,这个教程又过于简单了。另外,教学内容逻辑性略显不足,有些地方本意像是要弄出“螺旋式学习”的样子,可实际效果却变成了简单的重复,过于冗长。尤其是最后关于对象的部分,简直混乱。另外,整个教程没有充分发挥这套系统的优势:单元测试有较大的灵活性,可以实现更庞大、有趣的题目;源码字符串处理又可以要求用户必须采用某个语法。我想,要是把任何一个著名的 Python tutorial 改编一下,都要好得多。

当然,单独批评一个 track 肯定是有所偏颇的,因为教程这种东西本来就很难写好,更难以满足所有人的口味。重要的问题是:缺少选择。整个 Codecademy 里头官方 track 屈指可数,没有足够的梯度层次,虽然看起来有在鼓励大家创建自己的 track ,但似乎效果平平。

谁适合用 Codecademy ?

现阶段,上面所有的官方 track 都是适合零基础的 WEB 编程爱好者学习。交互式的学习,贯穿始终的代码训练,应该可以达到比传统的阅读教程更好的效果,也更加有成就感(包括那套成就系统)。基本上,把 JS 、 HTML 、 PHP (或者 Python )几个 track 学习下来,就可以独立开发一个简单的 WEB 应用了。

如果有一定的编程基础,还是考虑别的学习途径吧,用这玩意儿略有些浪费时间了。

更多可能

我认为 Codecademy 还是一个相当不错的工具和平台,应该能够拥有更多可能。其中最大也最现实的一个可能在于:单元测试

对于一个问题来说,能够通过一套的单元测试,标志着你的程序基本正确。在传统的编程学习中,缺乏这样一种可以度量程序正确性的量度(尤其是对于自学者来说)。近年来,大学编程学习中也引入了类似 ACM 的工具来辅助学生学习,我自己在高中时接触的类 ACM 的信息学竞赛(OI)也是一个非常好的形式。经过这样的有量度的训练,可以帮助初学者更好更扎实地掌握编程,写出可靠的语言,养成良好的习惯(测试用例中一般都有各种 edge case ,可以迫使程序员习惯性地去考虑这些情况)。

而更高一个层次来说,能否正确写出测试用例来较为完整地覆盖一个问题的所有情况,以及能否主动地、习惯地、自然地为可能出问题的地方编写单元测试,是一个程序员迈向成熟的重要一步。单元测试就是那种看上去简单,做起来却很难的事情。而倘若单元测试本身都做不好,又跑去搞什么测试驱动开发,最后很有可能整个项目都要失控。我觉得 Codecademy 可以提供一个模式,来引导用户自己编写测试用例,测试自己的程序,学会如何做单元测试(及使用一些 xUnit 之类的工具)。有一个类似的例子: Cyber Dojo 。可惜它的界面实在过于简陋以至于不堪用,还需要在自己的电脑上搭建一个开发环境以供编写、测试之用,而且是仅仅针对 TDD 而设计的,不适合用作练习普通的单元测试。

总而言之,动手一定是学习编程语言最好的方式。