2014-09-13 03:54
这是一个混合了爱情、理想与小人物的生存之痛的现实主义故事。
2013年,我异国恋终于修成正果,辞职跑来休斯顿陪读。媳妇还有一年博士毕业,我想着去了以后能找份工作,攒点海外经验,等媳妇毕业再考虑回国还是多呆几年。然而开始找工作后就遇到了两座大山,一座叫专业,一座叫签证。
先说专业。我是国内生物学硕士毕业,在实验室、生物公司工作过,然后来果壳做了三年编辑。如今生物专业在找不到工作排行榜上绝对名列前茅。大美帝同样如此,每个生物实验室都挤满了博士博士后,薪水和别的行业相比还特别低。前几年经济好、研究资金充足的时候,国内来陪读的慢慢找个实验员工作也不算太难。如今地主家也没有余粮,都在砍人。我这种国内小硕更加完全没有竞争力,在休斯顿医学中心海投了两圈简历,最终只拿到一个实验员职位的面试。
那次面试本来谈得挺好,但是问到我的签证状况时问题又来了。我是F2陪读签证,不允许在美国工作,所以必须有雇主愿意支持我转工作签证。但是工作签证是每年4月前交申请,10月才批下来,有的还会被拒。哪个公司愿意4月招一个人,花一笔钱为他转签证,然后10月才能上班?
签证就这样成了我找工作的最大限制。折腾一圈之后我发现,我这种情况比较容易找到工作的方法是,要么去中餐馆打黑工,要么就回学校再读一个硕士,毕业之后拿着OPT(工作许可)名正言顺去求职。和我爱人商量,她支持后者。
这里介绍一下我爱人,那可是当年在我们系总考第一的主,GRE SUB考97%,博士期间GPA 3.92。你们知道娶个学霸老婆压力有多大吗!
而我自己,之前从来没有想过我也有申国外学校这一天,本科和研究生期间过得有点奔放,GPA一塌糊涂。一般中等水平的大学都要求GPA 3.0以上。我把本科成绩单拿出来照着网上的公式算了一下,差点哭着放弃了。后来找了正式的成绩认证网站一算,勉强够标准,这才打起精神继续。然后又准备了几个月去考了GRE和托福,成绩也就能用来申请和GPA一个档次的学校。
然后是专业选择。对我来说,重新读书不仅能解决签证限制问题,也是一个转行的机会!有个华人论坛mitbbs,专门有个版就叫生物转行,其中较热门的专业有计算机、统计、会计等等。我决定去学计算机,一方面是因为自己还算有一点点基础,本科时还考过计算机三级证书;另一方面,这个专业目前在美帝的就业前景还是不错的。
虽然决定了要申请计算机科学专业的硕士,但我没有学过这个专业的本科课程,能不能跟上是个问题。本科时为了考那个计算机等级证书,我自学过一段时间C语言,现在早忘光了。还选修过一门数据库的课(Visual FoxPro)、一门Javascript的课,也都忘差不多了。除了还会用Photoshop之外,这基本上就是我去年下半年、开始MOOC经历之前的计算机知识储备。
所以,我决定在剩下这几个月中,补补计算机专业的基础课程。我觉得这些不仅在申学校时会是重要的加分项,而且如果申到了,开学以后也可以快点跟上课程。
其实我学的第一门MOOC课程是约翰霍普金斯大学的数学生物统计学入门,在Coursera开的。我还花了49美元购买了签名认证(Signature Track)。因为当时还没最后决定是读计算机还是读统计,所以选了这门应用面比较广的课。课程主要讲概率、期望、重要的分布和检验,还讲到了贝叶斯法则和Bootstrap等。我还记了厚(bao)厚(bao)一叠笔记。其实这些知识对任何学科的研究都有很大的助益,同时我也熟悉了网上上课、做作业和赶deadline的方法。
第二门课是MIT的计算机科学及Python编程导论,在edX开课。这是我第一门计算机MOOC课程,也是初次接触Python编程。这门课非常好,因为它不光讲Python,还介绍编程的一般原理、思路。我在这门课中第一次学到了时间复杂度的概念、递归的方法,以及最基本的数据结构知识,树啊图啊什么的。我也略略学到了一点Python的入门知识,而且知道了什么是IDE、什么是编译器,知道了遇到问题应该去查技术文档。我还发现stackoverflow.com有时比维基百科还好用。
学完这门Python的课之后,我有点意犹未尽,又去udemy学了一遍Python入门(当时这门课还是免费的)。这门课让我体会到MOOC上的课还是有优劣之分的。之前学那门生物统计,尽管老师语速飞快、词汇难懂,但暂停之后反复咂摸字幕里的句子,真正理解之后,不由感叹真是字字珠玑。那门MIT的Python课程更是深入浅出、逻辑顺畅,而且没一句废话。相比之下,udemy上的课程并非专业的教师,更像是公司里的技术人员介绍经验,内容和演示都比较随意。不过耐着性子听下来,还是有收获,了解了很多实际编程中的小技巧,比如一些快捷键、一些简写习惯等;也第一次装了eclipse这个软件,后来也装过别的IDE,但用的最多的还是它。还学会了一句程序员间告别、致意的行话:Happy coding!
一头扎进来学了三门课之后,我开始尝试理顺思路,安排今后要学的内容和进度。我在网上参考各种转行计算机的经验帖子、查询一些大学的课表,最后渐渐列出了几门我认为比较重要的课程:算法和数据结构、软件工程、计算机结构、操作系统。除了这几门外,还应该熟练掌握一两种编程语言。有一个帖子里说如果编程很熟练就可以去找工作了。我觉得,也许吧,但是我还是需要在未来和科班出身的人交流的时候,确保我们有同样的知识储备。
柿子捡软的捏,我首先学起来的课程是算法。我绝对不敢轻视算法,不过每个人有他略微相对更加擅长的领域。算法我学起来比较顺,另外几门课就有点吃力。
这里还有个小插曲。当时普林斯顿在Coursera的算法课还有一个月开课,我一看这门课的先修要求,发现他是用Java讲的。也就是说我还有一个月的时间从零开始学习Java。我跑去Udacity报了Java课,这是随报随上的。课程不难,老师讲得很有趣,助教妹纸也很萌。我后来还在MOOC学院发过帖子推荐这门课,不过上Udacity要翻墙,而且他们现在没有免费证书了。总之,一个月之后,普林斯顿算法课毫无压力。而且到现在,Java仍然是我最熟练的编程语言。
算法和数据结构我上了三门课程:普林斯顿的算法(Coursera)、斯坦福的算法:设计和分析(Coursera),和清华大学的数据结构(edX)。其中,普林斯顿的和斯坦福的内容重叠不多,恰好互为补充。前者的老师是大名鼎鼎的罗伯特·赛奇威克(Robert Sedgewick),有一本《算法》教材就是他编的。这门课以介绍为主,讲排序、平衡树、寻路等算法,介绍原理和实现。内容比较浅,就像一节节小讲座。后者虽然也是这些知识点,但是侧重分析,上来先讲主定理,之后的每一种算法都花很大篇幅进行正确性证明。更像是学校上课的感觉。直白点说,普林斯顿的课上完后觉得:“原来还可以这么干!”而斯坦福的课上完后觉得:“原来是因为这样才要这么干!”
普林斯顿的课的编程作业评分系统也是一大亮点。很多软件设计方面的概念(比如封装、复用、简约等原则),我都是在和这个评分系统的调教与反调教中建立起来的。这门课没有证书,但与能学到的东西相比证书真的不重要。
而清华大学邓俊辉老师的数据结构,内容方面和普林斯顿的课程比较重合,但多出一些内容。比如平衡树部分,普林斯顿的课程只讲了红黑树,清华的课程还讲了AVL树、伸展树等等,而后两者可以帮助深入理解红黑树。这门课用中文授课也是一大优势。邓老师的语言风格属于慢火煲汤型。其实从我自己发在MOOC学院的笔记就可以看出我也是属于说话啰嗦的那种,一句话说完再换个角度,生怕别人不理解,所以我上邓老师的课还是挺对味的。况且,现实中老师讲课唠叨你没有办法,网上听课你可以快进呀!
不过,清华这门课是用C语言讲的。像我这点C语言程度,听课勉强能听懂,编程作业就没办法糊弄了。所以我又把C捡了起来。正好同一时间北大在C站开了程序设计实习课,这门课是给有C语言基础的人讲C++入门和进阶。靠着这门课的训练,我临时抱佛脚地恶补了C和C++,完成了数据结构课一多半的编程题,得分惨不忍睹,但总分总算是过了。(北大那门课没过,否则也太没天理了。)
其他专业课程其他几门课的进展就没有这么顺。我选了北大的面向对象技术高级教程(Coursera),但不知为什么学不进去,觉得比较抽象,听着很费力。坚持了好几周,正好要回国,就中断了一下,再回来就接不起来了。操作系统课我是在YouTube上找的UC伯克利的公开课,只有YouTube自动生成的英文字幕(常常有错字),没有作业,听了几节之后也没有坚持下去。此外还选了莱斯大学的计算原理,从进度来看肯定拿不到证书了,但是能学多少算多少吧。
不过,这几门课的视频我都保留了起来,一旦有空闲时间还是会拿出来再次挑战一下。此外,Coursera 9月会开一门计算机系统结构,也在我计划之内。
除了上面这些计算机专业课程,还有几门课正好有时间也学了。一些是约翰霍普金斯大学开的数据分析类课程,主要讲R语言。未来数据挖掘领域会是热点,学一点R肯有是有益的。还有两门是生物信息学课程,毕竟生物是我老本行,生物信息又是它与计算机的交叉学科,这个领域打点基础,长远来看对职业发展也许会有帮助。
今年4月,还在面向对象技术课和程序设计实习课中苦苦挣扎的我,收到了旧金山州立大学(SFSU)计算机系硕士的录取通知。
当时申请这个学校是看中它地点好,IT行业工作机会多。当然和同城市的斯坦福、UC伯克利或者UCSF不能比,但是被录取的机会比较现实。同时收到录取通知的还有休斯顿MD Anderson的分子遗传硕士。后者只读一年,据说将来工作稳定,又是老本行。但是比较了一下生物和计算机的就业前景、薪资水平,还是没有改变转行的决心。另外还有个原因:从地图上看,旧金山离家近。
当时申请这里时,提交过一张“学过的计算机相关课程”表格。这张表格列出了计算机专业很多基础课程,哪些课程学过,就把名称、参考书等信息填上去。(其他大学申请时也有类似的表格。)我把大学里必修和选修的计算机课,以及学过的MOOC课程,能填的一股脑都填了。
我拼死拼活地填了这张表三分之一的空白。填上去的课中,一半以上都来自MOOC。其实你会发现,这里面很多课程都在MOOC上开设过,比如编译器、人工智能、并行计算等等。只是我没有时间一一学过去。
不知道这张表对我最终被录取起了多大作用。但是有一点它一定帮到我了:旧金山州立大学的计算机系录取的转专业学生中,有一部分是“有条件录取”,就是说你进来之后先要学很多本科的先修课,然后才能选研究生课程。选哪些课则是由指导老师指定的。我最近认识一个和我一样也是生物转行过来、准备同一年入学的同学,他有七门先修课。但我不是“有条件录取”。我的指导老师只是建议我先学两门本科课程,一门是软件工程,一门是计算理论。我第一学期就可以选研究生课程。
即使拿到了offer,也要继续学习其实上学的事还没有尘埃落定。其他手续都办好了——免疫证明、医疗保险、选了课、交了学费,连房子都租好了。但我还在等我的签证转为F1学生签证——又是签证,麻烦死了。今年转不成的话上学这事儿就泡汤了。
当然也没有干等。我还在上斯坦福的算法2,过段时间准备把之前没有坚持下来的课重新上一遍。目前我只有算法和数据结构估计算是和本科生水平相当了,软件工程(面向对象)、计算机结构和操作系统还差得挺远。汇编语言、编译器这两门课在犹豫要不要学。所以第一学期没有选太多课,准备留出补基础课的时间,其中去本科生的教室旁听和学MOOC的课程这两种方法都可能采用。
编程技术也在磨练中,最近开始在LeetCode上做题。前段时间还不务正业地用Java编了几个小游戏。普林斯顿算法课提供的课件里包含一些可视化的类,本来是完成作业时显示运行结果用的,我发现做小游戏非常好用。遇到问题就上网查,从stackoverflow、Java文档、维基百科学了好多东西。现在回想当初听不懂的面向对象技术课程,觉得有实践经验之后,领悟的程度可能会不一样。
我媳妇看我学得挺投入,还挺羡慕的。她在MOOC主要学了约翰霍普金斯那几门R语言的课程,科研中正好能用上。她也想学计算机课程,不过动力不像我这么大,也许她毕业之后有时间了也会试试看。
说一点学MOOC课程的经验吧。
从我的讲述中你也能看出来,我在计算机专业还是学渣一枚,将入门没入门的程度,而MOOC把我带到了门口。如果没有这些在线课程资源,没有名校教师的讲课视频、习题、课程论坛,我只能自己下载教材、自己找习题,看不懂的地方也不能很方便地找人讨论。总之,MOOC把原本艰难、耗费时间的跨专业学习过程变得更容易和高效。迈过这扇门还是要靠自己,但MOOC把门槛降低了许多。而证书对我来说意义不太大,毕竟正式的计算机专业毕业证书更有说服力。不过设想一下,如果我没有重新上学,而是学过一些课程和编程语言之后直接去IT公司求职,那么MOOC的证书会是简历上的重点之一,标准放低的话并非完全不可能成功。
上哪些课还是要有选择的。我因为是陪读,不用上班,全部(看美剧之外的)时间都可以用来学习。我最密集的时候同时在跟四门课(面向对象、程设实习、生物信息方法、数据结构),其中两门没有跟下来。不过对于有工作的人来说,最好不要同时跟超过两门。学MOOC课程,目标要明确。是像我一样准备转行,还是本专业精益求精,还是发展兴趣爱好。根据需要选择课程,最好少而精。
我回顾自己拿到证书和最终放弃的那些MOOC课程,发现即使是艰难的课,坚持下去也能学完。这里指的学完是说能够独立完成作业和考试。其实按照现在大多数MOOC课的规则,作业允许多次提交,考试不限时间,即使学得马马虎虎也能拿到证书。就和上学时一样,考完试就把知识还给老师。但是我总觉得既然是自己选择来学这门课,如果没学好,不如先放弃,将来准备得更充分之后重新来过。省得留一张自欺欺人的证书反而打消了重新再学的动力。我放弃的几门课,有的是实在太难,像安卓开发,需要大量的时间去查阅技术文档;也有几门本来还能咬牙坚持,因为回国中断了一个月,再回来就跟不上了。
我比较习惯独自学习,很少去课程论坛。其实挺可惜的,我知道论坛里有很多非常有启发的帖子。但是我很喜欢把学习和做作业的过程写成笔记,发在MOOC学院。有时遇到计算机专业的同学指点一下优化方法、给一些相关资源链接,收获也挺大。记笔记是个非常有用的习惯。有几门课(比如生物统计)常常学了后面忘了前面,幸好当时记了笔记,翻一翻就想起来了。笔记写在纸上或者发帖子在网上都可以,能找到就行。
有时想想觉得挺惶恐。一把年纪了,从本科课程开始学一个新专业,两年之后就要出去,在这个领域找工作。不过,总得试试看才知道成不成。况且现在还有这么多方便的资源可以用。
我当然无法和科班出身、行业经验丰富的人相比。男怕入错行,大把时间已经投入在另一个领域了。但是朝闻道,夕死可也,转行就是要有点不管不顾的劲头。而且我其实还挺喜欢编程的。
最后,希望大家都能实现自己的目标。
Happy coding!