答 MOOC 学院问

问:你为什么要转行?为什么要离开生物行业,又为什么选择计算机?

答:转行有生计和学术两方面原因。

1)生计方面的原因是:在生物学术领域发展,难度有目共睹。要找到教职,一般都先做一两轮博士后,每轮两年,等找到教职,大多已经 30 岁出头,还要经过 6 年考核才能成为终身教授。对于学术研究,我没有很多自信,觉得自己不可能异于常人。如果在生物学术道路上走下去,不可避免要重复上述过程,在拿到终身教职之前难免一直处于高压力低收入的状态,对家人非常不公平。一方面,我常常想着等到工作了要多带爸妈出国旅游,可是博士、博士后期间的工资微薄,要实现这一愿望不知何年何月。另一方面,我有一个高中相识、大学开始异地五年的女友,一路走来非常不易,早就许诺要给她幸福的生活。如果我为了满足自己的好奇心专研学术,而让她跟着我吃苦,那是极其自私的,到时免不了会分手,可是她年龄也大了,再找情投意合的婚嫁谈何容易。既然改变不了生物学术道路的现状,只能改变自己。

2)学术方面的原因是:细胞归根结底就是一个化学反应容器,无数底物和酶在其中组成反应网络。因为参与反应的因子(基因、RNA、蛋白)各自特异,目前大多数生物研究就是穷举法,比如修改一个基因,查看一下表型,从而总结这个基因的作用。人类基因组虽然只编码两万到两万五千个基因,但是因子总数远超于此。每个基因都可能有多种转录调控,编码的蛋白可以有不同的修饰,还有大量的 non-coding RNA,要用穷举法把它们的功能都调查清楚,是不可能的。一般要把一个因子及其上下游代谢、反应通路研究清楚,需要一个教授带领一个 5 人以上团队研究数年。这是我根据那些功成名就的老教授的总结性演讲推理出来的,他们一生往往也就研究通透了一条通路。所以我认为传统生物学实验不足以解答重要的生物学问题。而且穷举式的研究缺乏智力上的挑战。再者,我的研究兴趣本来是癌症,在读博期间,自认为领悟到了癌症发生的本质原因,认为癌症是生命的另一面,其发生不可避免,不可能攻克,只能暂时抑制或者延缓,所以对学术研究的热情也有所减弱。

学习计算机一开始是为了学术研究。上面讲过,我认为穷举法不可能把生物现象研究清楚,倒是有很多科学家借用其他领域的知识,为生物研究提供了很好的思路。比如 MIT 有实验室用 RNA 当电路元件,让细胞自我识别是否已经癌变,如果癌变则启动凋亡通路。有实验室收集了某单细胞细菌的各类基础生理生化数据,从 DNA 复制速率到特定化合物反应速率,用超级计算机模拟了这一生命体的全部过程,结果和在培养皿里观察到的相差无几。冯诺伊曼不懂生物,不过他精通数学,正确地猜测出斑马身上的条纹,是由两种激素相互竞争产生的,这一假说在几年前被实验证实了。生物是复杂系统的一种,运用数学、物理、信息学等学科手段,有时候才更好地探索生物问题,这也是为什么以上几个例子能借他山之石功玉。渐渐领悟这些之后,我开始做一些生物信息学的项目,想通过自动化的手段提高研究效率。在这一过程中,以前对计算机的兴趣又被重新激发起来,对编程越来越喜爱,最终决定选择计算机作为目标行业。

计算机有以下特点特别吸引我:
1)只要技术高超,在计算机上可以任意创造,唯一的限制就是想象力。
2)计算机建立在数学基础之上,而数学恰好是描绘宇宙的语言,所以说用计算机可以探索整个世界也不为过。生物研究只能探索目前地球上既定的生物设计。
3)计算机程序高度的自动化让我们可以把更多的时间精力投入到智力活动中去,而不是重复性的体力劳动。计算机编程还可以通过封装低级细节,不断提高程序的抽象程度,可用于解决非常复杂的问题。这一点是生物目前做不到的,生物研究主要时间都花在实验本身,所有底层细节都需要研究者自己完成。

总结一下,我转行的原因是:一方面生物研究不足以在经济上支撑我和家人的生活,另一方面传统生物研究缺乏智力上的挑战,因此我转去了能够弥补这两方面短处的计算机专业。


问:你是怎样接触到 MOOC 的?

答:如何接触到 MOOC 已经忘了,应该是从网络新闻上看到的。MOOC 我很早就关心了,第一次听说 MOOC 是 MIT 的 OCW 项目,那是还不叫 MOOC。不过 OCW 资料不完全,课程没有互动,缺乏 deadline 和考试,全靠自己很难坚持。直到 2012 年从新闻里看到 Coursera 和 Udacity,我注册了 Udacity 体验了一下,互动性非常好,难度由浅入深,一周就学完了第一门课。从此 MOOC 自学成为一种常态。


问:为了转行,你学了哪些课程?

答:全部学完的包括以下课程:

1)Udacity 平台
这个平台的优点就是课程互动性很强,每几分钟的视频就有一个小练习,而且没有开课时间,随时可学。

  • Intro to Computer Science (CS101)
    自学 MOOC 的第一门课程。这门是 Python 入门,Python 本来就简单,而且课程极多,很多都不错。这门课通过编写网络爬虫(搜索引擎的基础)来教 Python,有几个练习稍有难度,需要图论的知识。

  • Intro to Programming
    很好的 Java 入门课程。三大平台上讲 Java 的好像比较少,放心选这门就行了。

2)CalTech Online 平台
加州理工的在线课程平台,不过好像一直就只有一门课,现在课程已经并入 edX,没必要再去了。

  • Learning from Data
    这门课是 machine learning(ML) 入门,现在已并入 edX 平台,而且另有全中文版,由台湾大学的合作教授开设。我学这门课的时候还没打算走软件这条路,当时想作数据分析师。那时候仅仅入门了 Python 就开始学这门了,做作业很累,所有的工具都是用 Python 从零写起,包括最后的 SVM,是根据原始论文的伪代码自己写的,因为不知道 Python 的循环效率比较低,也不懂向量化,写出来的 SVM 要运行几分钟。建议有更多数据分析软件包使用经验再学 ML。比如会用 R 或者 Matlab 的话,作业非常简单,直接调用现成函数就可以了。这样能把更多时间集中在掌握 ML 概念上。
    关于 ML 再多说几句。ML 课程极多,各个大牛学校都有自己的 ML 课程,Coursera 上 Stanford 的那门也很好,还有 CMU 大牛教授开设的,可能更棒。我觉得学习 ML 这类知识点很多的课程的一个好办法是:像背 GRE 单词那样学习。先选一门 ML 课,过一遍,碰到不懂的地方不要纠缠太久,跳过去。学完一遍以后,再选另一门 ML 课重新学。如此学习两三轮,就比较扎实了。这样的好处是可以尽早搭建起一个完整的知识框架,而不是纠结于细枝末节。很多前面碰到的问题,等学到后面,和后面的知识点一对照,很快就搞懂了。就好比初三碰到的问题,等到了高三都不是问题。

3)Coursera 平台
课程最全面,质量也最参差不齐。一个问题是,开课有时限,有的时候多门好课挤在一起,无暇兼顾。

  • Algorithms I
    Princeton 的基础算法课,侧重 implementation。个人感觉是算法讲得最清晰的,能够与之匹敌的可能只有 edX 上清华的算法入门课程。所有作业要求用 Java 完成,学过上面提过的 Udacity 的 Intro to Programming 就能够应付作业了。作业的打分平台不仅会评估代码的正确与否,还会检测你的代码风格,对养成好的代码习惯很有帮助。

  • Algorithms: Design and Analysis
    Stanford 的基础算法课,侧重算法分析,适合与上面那门一起学习。作业可以用任何语言完成,不算太难,PPT 里一般都有伪代码提供基本思路。这门课的 Part II 涉及动态规划,如果用 Python 做作业的话,记得装 numpy 用向量化代替循环,否则程序效率极低,原本几秒钟的作业可能要等几个小时。

  • An Introduction to Interactive Programming in Python
    简单的 Python 课程。每周做一个游戏,比较有意思。两位任课老师一唱一和,很有人格魅力,让课程增色不少。

  • Programming Languages
    讲解编程语言的课程。这门课通过三种语言(ML、Racket、Ruby),介绍了编程语言中许多基本概念和范式。一共八个部分,分十周上完,两次考试,七次作业,每次作业都颇有难度,虽然代码量不大,但是要完成一般需要 6 小时,我身边的计算机老手完成作业也需要这么久。一个原因是函数式编程上手需要时间适应。最有挑战性的作业是用 Racket 写简单的语言解释器。强烈推荐,对于融会贯通之前零散学到的编程语言知识极有帮助。

  • Introduction to Systematic Program Design - Part 1
    这门课所谓的 systematic design,应该就是 test-driven development,强调每次编写代码的时候,先根据需求写出相应的测试实例,然后再编写代码逻辑,使测试得到通过。学习一下这种思路颇有益处。老教授教学非常认真,用的是简化版的 Racket。可惜 Part 2 好像一直没有出来。

  • Learn to Program: Crafting Quality Code
    Python 课程,是这个系列的第二门课,内容其实和 Udacity 的 Intro to Computer Science 最后几个章节是重叠的。也介绍了 test-driven development 的思想。太过简单了。

  • Introduction to Data Science
    介绍了 Data Science 的完整流程:数据的获取、分析处理以及呈现。作业设计得很好,包括用 Python 抓取 tweet 数据进行情绪分析,用 SQL 进行数据分析处理,用 Tableau 进行数据可视化。可惜老师语速没控制好,时快时慢,很影响听课。

我上过的 MOOC 课程总数是以上列出的数量的两倍,没全部上完的就不多说了,中途退出两大主要原因是:1)一部分课程质量低,视频、作业沉闷;2)Coursera 有时好课扎堆开,心有余而力不足,我白天在实验室工作,只有晚上和周末的时间学习 MOOC,即使一开始选了很多,最后也只能退课。

4)工业认证
除了 MOOC,我还考过 Linux 和数据库的证书。一般认为工业认证作用不大,不过我觉得考证的好处是:对于一个科目中哪些知识点要掌握到什么程度,证书考纲都会给出明确的范围,还有指定教材,可以有的放矢地学习,很适合自学。而且考证事先要交钱,已经投入了成本,自然不容易荒废。

5)其他
我在读生物博士期间上过计算机系的三门课,还在 Code School、Rubymonk 等交互编程教学网站学习过 Python、Ruby、Git 等科目。


问:在学这些课程的时候,你是怎样规划的?

答:大都是自己摸索,一边学习一边调整规划。大致过程是这样的:
1)跟据自己的兴趣,列出需要学习的科目列表,按需选课;
2)一门课一旦选了,坚持一到两周,如果两周下来还觉得不好,及时退课;
3)学习过程中对整个学科的框架会有更清晰的认识,也会不断发现新的方向,所以每隔几周调整一下科目列表,最终做到 T 型发展,即每个重要方向都要有所了解,精通一到两个方向作为自己的专攻。


问:在学习的过程中,有遇到了什么好玩或者印象深刻的事吗?

答:
1)Udacity 的 Design of Computer Programs 课,是 Peter Norvig 教的。学过人工智能的同学都知道,Norvig 教授是此领域中泰斗级的人物,曾任 NASA 研究中心电脑部主任,现任 Google 研究部 director。在视频中看到他用满是皱纹和老年斑的手指导初学者学习程序设计,非常感动。

2)还有就是前面提过的 Coursera 的 An Introduction to Interactive Programming in Python 课,两位任课老师一位每天坚持戴领带,另一位从来不戴,两人演示 21 点游戏的时候打赌,不戴领带的教授输了赌局,只能坚持戴一周,那一段很有意思。他们还找来真人出演过 Big Bang Theory 的前宇航员出镜,帮助大家保持学习热情。


问:你觉得学 MOOC 对你来说最大的困难是什么?最大的收获是什么?

答:最大的困难就是每天精力有限,白天忙完实验室,晚上往往难以长时间集中学习。所以一旦碰到视频沉闷的课程,就会非常不耐,难以坚持。

最大的收获自然是帮助我入门了计算机。MOOC 目前全面开花,基本上入门计算机所需的所有科目都能找到相应的课程。通过这些课程,我不用买很多昂贵的技术书籍,就能构建起整个知识框架。


问:你的家人和朋友如何看待你的 MOOC 学习?

答:自学 MOOC 转行关乎未来几十年的人生,一旦选定,别人的态度我就不太在乎了。家人对此不太了解。朋友应该都是持积极态度的。我学习 MOOC 一段时间之后,也带动了几位好友一起学习。


问:MOOC 证书或学习经历对你申请学校或求职起到了什么作用?

答:申请计算机硕士项目,我把近十张证书一起放在了申请材料里面。申请工作的时候,我在简历里提到在一年内自学近十门 MOOC。应该是有些作用,工作面试的时候,面试官还表示 impressive。

我自己总结,MOOC 的作用是:1)行业入门的途径;2)对一个行业的热情的佐证。

申请硕士项目,要向对方展示三点:1)贵校的项目能帮助我达成自己的职业规划;2)我有能力完成学业;3)我的背景经历能为贵校的项目作出贡献(这一点非必需)。

申请工作,主要要展示:1)我有能力胜任这一岗位;2)我有热情,不仅能满足岗位最低要求,还会自己钻研,超额完成目标;3)我的个性符合公司文化。

申请也就是拿出一个 package,package 中所有内容都是为了不断论证以上几点。可以看到,MOOC 的作用与申请时的要求有一定重合,所以我个人认为 MOOC 经历是有用的,可以放到申请 package 里面去。


问:你觉得对于职业导向的学习来说,MOOC 有哪些优点和不足?

答:MOOC 的优点和不足是它非常适合入门,但是难以帮助学习者进阶。以编程为例,用 MOOC 入门编程,尤其是那些互动性高的教程,效果有目共睹,是非常好的。但是编程进阶需要持之以恒地练习,只有代码量上去了,解决过不同的复杂问题,才能进一步提高。MOOC 不能胜任这一点,不是因为课程设计不好,而是一门课时间终归有限,作业量也不会很大。进阶需要相当于几百次作业练习,没有课能设计得如此之长。一个实例就是我用 Udacity 的 Intro to Computer Science 入门 Python 之后,立刻去学 Design of Computer Programs,非常吃力。前者是初级课程,后者是中级课程,中间的衔接只能靠自己平时的练习和实践。在写过几千行 Python 代码之后再学后者,就好多了,更能领悟课程的精华。不过传统教学也不能帮助学生进阶,“修行靠自身”,进阶这一任务始终要靠自己,所以,说这一点是 MOOC 的不足,大概也有失公允。

另一个不足是,中级高级课程还是相对少。尤其是职业导向的学习,中高级内容往往涉及很专很小的领域。MOOC 的内容大多一般化,难以胜任。


问:未来有什么学习计划吗?

答:目前一直在听文科课程,以后想多学点心理学、经济学、历史方面的内容。文科我从不做作业,都是视频转音频放在车上听。未来可能还要学习 Code School 上 JavaScript 系列课程。


问:还有什么想分享的经验吗?

答:学习不要矜持,也不要完美主义。经常听到这种说法:“等以后有时间了再学”。如果什么都要等到万事俱备才开始,这一天永远等不到。比如最近时间少,那可以只看视频,跳过作业考试,把知识框架搭起来也是好的;不确定哪一门课好,那选两门一起上,几周之后哪门好哪门坏就清楚了;“我数学不好,等我先补补数学再说”,不要找这样的借口,永远不会有时间补的,大部分 MOOC 的数学要求很低,真想学,根本就没有“数学不好”这回事。