话题 | 在美国大学计算机专业都学什么?
作者简介:祁一鸣,2016年4月加入携程,任机票研发部技术专家,同时负责携程App国际机票预定主流程技术团队。毕业于美国常春藤名校 Dartmouth College 本科,曾先后在硅谷的Oracle、Yahoo!和Salesforce总部效力过。从scratch到delivery完成过的最成功的产品是年销售额超1亿美金的商业社区网站模板。平时喜欢吃冰激凌和甜甜圈,也蛮喜欢上海野兽派的花。
【编者按】在这个行业,我们关心着大洋彼岸硅谷世界里的新动向新技术,但这一切却都来源于最初的教育。在这篇文章中,一鸣分享了他是如何开启学习计算机科学的道路,所学的课程以及经历感受。希望透过这篇文章,了解一些我们未曾触碰过的面,从中收获些许启发。
我是2010届毕业的美国Dartmouth College(达特茅斯学院)的计算机专业本科生。Dartmouth College位于美国东北部新英格兰地区的New Hampshire(新罕布什尔州),一年中有将近五个月的漫长冬季。从学校向北开车三小时可以到达加拿大的Montreal(蒙特利尔)大都市练习法语口语,往南开车三小时可以到达美国Massachusetts州的港口城市Boston吃小绵羊火锅。Dartmouth成立于1769年,作为美国常春藤大学联盟之一,在2016年U.S. News的美国本科院校排名榜中占第11位。
起始:抱着对计算机的好奇心
在开始大学生涯之前, 我对计算机这一门学科的接触不多,唯一记得的大概就是中学时代上计算机课时用Visual Basic写过几个小程序。用周围爸爸妈妈的话来讲,就是远远地输在了未来要当程序员的起跑线上。不过对于这一切,当时的我是并不知道的。
Dartmouth一年有四个学期,也就是美国俗称的Quarter System。每个Quarter学期的时间是10个礼拜上下,一般修3门课,一门课一个学分。毕业时每个学生要修满36个学分,并且有三分之一的课程(12个学分)是致力于某一个专业。Dartmouth有一点不同于其他七所常春藤联盟学校,它属于Liberal Arts College(文理学院)。
Liberal Arts College有一个我很喜欢的地方,就是刚进大学的前两年可以自由选修不同领域的课程,发掘自己的兴趣爱好,找到合适的专业。然后,在大二结束之前必须确立好专业,用剩下两年的大学时间来主修自己的专业课程。
每年的春季学期都会有一门计算机入门课,叫作CS5 Introduction to Computer Science。抱着对计算机的好奇心,我在大一春季修了这门课。因为CS5是计算机入门课,选课的同学还是很多的,人数大约在70人左右,是我在计算机系修过的人数最多的课程了。
CS5比较hands-on,一半是学习Java这一编程语言,另一半是通过Java编程为媒介来学习递归、模块化编程、面向对象编程的概念,同时还涉及了一些用户界面实现的内容。一个学期10个礼拜,每个礼拜3堂课,包含了11个short assignment,5个lab assignment,2个期中考试和1个期末考试。Short assignment的概念是正常花1到2个小时就能完成的编程作业。Lab assignment是相当于完成3到4个short assignment作业量的任务,涉及到编写比较大的程序,代码量在500-1000行左右。考试的话就是一个小时的试卷答题。课程还配备一个Teaching Assistant (TA)和多个Section Leaders (SL)。
TA会在每周固定的时间设置office hours,学生可以在office hour时间去找TA开开小灶,对课上未能理解的内容提问求解。而Section Leader则会负责对学生讲解short assignment和lab assignment的需求,并为这些作业打分。TA主要来自计算机系的研究生,而SL主要来自上过该门课程并且当时成绩是A的高年级本科学生。
现在回想起来,我对TA没什么印象,应该是从来没有去过office hours。SL倒是还记得,是一个叫Luke的高年级学生,经常在作业布置的时间迟到早退,一副无精打采的样子,批作业也是经常出错,常需要找他去改正分数。说到分数,不得不说明一下,美国大学是按Grade Point Average来计算成绩的,也就是俗称的GPA。课程得分为A对应的point是4.0,A-是3.66,B+是3.33,B是3,以此类推。大学四年毕业的时候满分是4.0,也就是全部都拿了A,用现在时髦的话讲是学霸级人物的存在。
CS5这门课,如果是100分的总分,只有拿到92分以上才能拿A的成绩,因为这门课学生的成绩普遍都比较高。学生对于包括10%的上课出勤分在内的每一分都是很在意的,所以对于作业或者考卷被扣错分数是无法容忍的,这大概也就是为什么我到今天还记得当时修这门课的SL。
进阶:定义功能需求与开发实现
虽然修CS5的整个体验中有些小小的不愉快,但我还是受到了how to solve problems computationally的启发,产生了一种想要去学习更多的热情。于是乎,在大二的第一个秋季学期,我修了第二门计算机课程CS 8。CS 8也是入门级的课程,但是它的curriculum在当时是全新的,是用Haskell语言编程来学习Functional Programming。能够学以前别人没有学过的内容总是很令人兴奋,课程的内容也很丰富,包括用Functional Programming来实现动画,分析生物序列,搜索社交网络,解析和操纵HTML,识别数据集群,解决Sudoku难题,编写俄罗斯方块游戏等等。记得当时第一个Lab任务就是用递归的方式去画一个雪花fractal,如图所示,短短50行Haskell代码,就可以画出这么一个界面上显示复杂但是逻辑很清晰的图形,在当时觉得非常得酷。
一个学期学下来,最后一个Lab从UI设计到代码编写完成了一个俄罗斯方块的游戏,如图所示。对于这个Lab的印象我也比较深刻,因为花了很大力气去自定义和完成了extra credits的功能来获取附加分。既担任了产品经理的角色来定义功能需求, 又担任开发实现了这些功能。同时也第一次深刻地认识了80:20 rule。做出一款产品去实现基本的功能或许只要花20%的力气,但要去把这个产品做好做精彩,却要付出80%的力气,甚至更多。一路前行,保持谦虚谨慎的心态很重要。
修CS 8这门课的时候,我会经常往计算机系的实验室跑,在那里见到过Douglas Mcllroy,著名数学家和工程师,Unix系统里的很多命令行工具都是他开发的。以及算法导论“Introduction to Algorithms”这本书的作者之一的Thomas Cormen。Douglas是一个很安静的人,每次路过他办公室的时候都看到他静静地写着一些代码。Tom则很风趣,很喜欢和学生们讲美食,每年的夏季学期他都会在他家的院子里组织一个盛大的Barbeque,他和他的太太会一起烹饪食物,邀请计算机系所有的老师和学生来品尝。我开始喜欢上了计算机系的氛围。
在接下来大二的冬季学期里,同时修了两门计算机课程,CS19 Discrete Mathematics in Computer Science 和 CS 23 Software Design and Implementation。CS 19是一门理论课,偏向计算机方向的离散数学课。 而CS 23则是注重实践的软件设计和开发课程。 CS 23让我接触了C语言,并用10周的时间从novice变成了一名C语言小能手,上半学期编写了一个Web Search engine,包括web crawler、document indexer和query engine三个部分。 下半学期编写了一个Robotics应用,通过与电动玩具车上装有的wireless sensor API沟通,从而实现操纵玩具车行驶并沿途打开摄像头拍摄照片的功能。
人工智能、拓扑学、算法思维
整个冬季学期比较深的印象就是一天课上好以后傍晚去计算机系实验室开始写程序,到差不多凌晨1,2点钟开始离开实验室,看着漫天大雪飘落,又给整个校园覆盖了一层新的银装的画面。那个时候头脑会觉得特别清醒,如果适逢正好又把程序跑通了的话,会特别地开心,会顺道去附近的fraternity喝一杯social一下。刚才说到过CS 19,是一门计算机理论课。我在这门课中认识了我未来两年的计算机“导师” Afra。
跟着Afra在大三修了他的 CS 44 Artificial Intelligence 人工智能,CS 85 Computational Topology研究生课程计算拓扑学,以及大四的毕业论文课程。CS 44还是一贯保持着编程的重心,写了偏向搜索、逻辑、概率推理,以及通过神经网络做人脸识别的多个程序。而CS 85则是非常的难,我记得当时全班只有五个学生,如果少一个学生,那么课就开不了了。我也算是支持我喜欢的教授去修的这门课。我已经不太记得自己当时是如何去度过那一个学期,有很长一段时间看着桌上的咖啡杯都感觉它是一个非常美味的甜甜圈,想要一口吃下去。
之后的两年的大学生涯,我陆续修习了Introduction to Algorithms,Theory of Computation, Operating System,Machine Learning and Statistical Data Analysis等课程。学会了用算法的思维综合考虑时间复杂度和空间复杂度去寻找最优的方案来解决问题,去够判断什么样的问题是NP-Hard,并编写一个简单的操作系统,运用一些机器学习的方法和模型去做一些数据上的预测和分类等等。那是一段非常快乐且有些孤独的时光。
如果别人告诉你美国大学生是不在乎成绩的,那绝对是个笑话
越往上修高级的课程,需要花的精力越多,自己的思维逻辑和编程的能力也会变得越强。但同时,同年级的同学也会变得越来越少。从一开始的CS 5班上有70个学生,到大二以后基本上修的每一门计算机课不会超过15个学生。Dartmouth每年大概会招1000-1200位本科生,但是每年毕业的计算机专业学生不会超过20个,淘汰率如此可见一般。
大部分的美国大学都会给予想留下来继续读硕士的大四学生一定的优待,Dartmouth也不例外。本科四年一般只要再多读一年完成一个4+1项目就可以拿到计算机硕士学位。而外校的报考生却要花至少两年才可以。尽管如此,愿意留下来读计算机硕士的Dartmouth本科生却是少之又少。一是因为大家能在计算机系的实验室写满四年程序差不多都已是到达了极限,已经迫不及待加入Google、Oracle这样的对口公司快乐地工作起来。二是Dartmouth全校的硕士Program很小,学校本身注重的是对本科生的教育,不像麻省理工或者斯坦福那些注重研究生教育的院校,硕士生在校园里反而没那么强的归属感。
去任何一个美国的一流大学,大学四年都不会轻松。如果选择了计算机专业,就要付出更多的努力。每一门课的分数matters,大学四年最后的GPA matters。如果别人告诉你美国大学生是不在乎成绩的,那绝对是个笑话。我读大三为CS 19的教授打工做grader给学生批作业和试卷的时候,每周都会有学生来找我, 希望给做错的题目少扣点分。因为,大部分的一流公司每年校招只去一流的大学招生,并且对学生都会有GPA cutoff标准。如果GPA分数不到,那么简历就会被丢弃,电话面试的机会也不会给。但不管分数有多重要,既然选择了计算机专业,还是要尽可能多地去have some fun,不管是lecture上听教授讲课的时候,TA office hour求助解惑的时候,还是深夜和同学们在实验室一起编写程序的时候。 只有自己喜欢,才会有动力坚持到底。读计算机专业如此,人生中的很多其他事情也是一样。
最后,附上Dartmouth 2017年校友日历的封面图,祝大家在新的一年心想事成,程序员进阶之路越走越好。
*本文首发于CSDN,经授权转载*
这篇文章有没有勾起你的一些回忆,你是如何走上码农这条路的?在学习/工作的过程中,又有哪些趣事?欢迎在评论区和我们分享哦。
啊,你看到这里啦~
携程技术中心目前开设了架构/移动/大数据/前端/运维5个微信群,方便关注同一领域的小伙伴们交流。我们也会在群里及时同步携程技术中心主办的相关话题线上和线下活动。
如想进群交流,请加携程技术中心小助手个人微信号ctirp_tech,标注相关领域(如大数据),之后小助手会拉你入群哦。