写在前面

2015年秋季学期就这么过去了,随之而来的就是下一个新年。在新旧交替之际想把这一学期所学所想所感做一个小结。这篇文章主要总结的是学习方面。

课程总结

小结一下这学期的学术成果:这学期一共选了4门课,到下半学期的时候把最不需要,而又很占用时间的刷题课08-722给退掉了,所以最后成绩单上剩下3门课,分别是

  1. 15-213 Introduction to Computer Systems, 课程总结
  2. 15-619 Cloud Computing, 课程总结(先挖个坑,最近两天填上)
  3. 18-730 Introduction to Computer Security, 课程总结(先挖个坑,最近两天填上)

三门课各有千秋,总体workload还算合理。下面想把这些课程的学习感想写一下,在课程总结链接里只想写一些课程相关的内容,感受就不再写了。

15-213 Introduction to Computer Systems

15-213,计算机系统导论,是用CMU的邮政编码作为课号的旗舰课。课程已经开设了近20年,从课程内容到作业内容都已经特别规范化。本学期比较特殊的是这门课的教材《深入理解计算机系统》(Computer Systems: A Programmer’s Perspective) 由第二版改为第三版,而且由两位作者进行授课,我运气好正好赶上。第三版与第二版的主要差距是,第三版主要面向的是64位Intel系统架构,而将32位系统作为补充内容来进行讲解。

这门课的主要内容是计算机系统介绍。如课程教材的英文名称一样,这门课是给程序员简介计算机的基本知识。神室友Codinfox在学期开课之前给我简介了一下这门课的课程以及每一个lab的内容等等。他对这门课的总结是:集汇编语言/组成原理/操作系统/计算机网络于一身的大课,上完了这门课之后感觉他的总结十分精当。然而这门课仍然只是导论,在以上领域都是浅尝辄止。(在这里吐槽一下《深入理解计算机系统》这个翻译,很多人都觉得译成《程序员眼中的计算机系统》更恰当一些)

这学期其实本来想把学业重心放在这门课上来着。然而由于本学期Cloud Computing这个奇葩的存在,使得在后半学期根本就没有太多时间花在这门课上,还是有点小遗憾;但是鉴于下学期要修操作系统,所以可能还是会把这学期落下的一些知识补回来的。

其中工作量最大的malloc-lab,做这个lab的时候正巧在进行Addepar和Microsoft的onsite面试,飞来飞去,在旅馆把CC所有当周的项目和quiz都搞定的情况下回到匹兹堡,时间压力巨大,用了三天半的时间完成,在硬截止之前的3个小时还是69/100分的情况下将最后一个bug调了出来上升到97分,最后的结果还算不错。在此感谢fan神的指点。

对我来说工作量最小的是bomb-lab。 这门课有一些东西跟本科自己的兴趣重合了,比如x86的汇编(bomb-lab),attack-lab中的原始缓冲区溢出攻击等等,所以学起来没什么太大压力。考试的话,也觉得考前一周看一下以往的试卷,复习一两遍PPT应该就可以拿A了。

15-619 Cloud Computing

15-619,云计算,又称CC,在CMU从刚刚开课时的水课蜕变成为工作量最大的课程之一。CC的这个学期是自开课以来workload最重的一学期,听到谣言说下学期(‘16 Spring)这门课要减少工作量了,但是话说回来,每学期都有人说这门课要减量,然而都是假的。

CC是一门网课,课程内容主要分两部分:一是在网上阅读大量内容,每周一次quiz;二是项目。其中项目又分为个人项目和团队项目;个人项目每星期一个,团队项目在期中左右放出,一共三个检查点,前两个检查点开发时间为两周,最后一个检查点有三周的时间进行开发。

课程项目上来讲,除了预备知识项目(Primer projects)之外,所有的项目都是以AWS作为平台进行教学。项目内容覆盖了当今云计算的绝大部分基础内容,包括MapReduce并行编程框架,Load balancing,SQL & NoSQL 数据库,Data Warehousing,Iterative Programming,Stream Processing等等。每一周都有新的挑战去完成,每一周结束了项目之后午夜12点新的项目又会放出来;这门课的体验用“痛并快乐着”描述再合适不过。

这学期学习的时间,据我粗略统计,60%以上奉献给了CC。团队项目下放之前每天的日子还是很快活的,而且可以分配给15-213很多时间;但是自从团队项目下放之后就开始挣扎了。团队项目是3人一组,组了两个妹子,都很给力。话说我觉得看一个队友给不给力并不是看其能力如何,而是是看他对课程和项目的态度。我的两个队友都愿意花大把的时间和精力在团队项目上。

成绩的话,在拿到成绩之前一直觉得自己怎么也不可能拿A的,然而结果真的出乎我意料。这门课Quiz一直在90分左右徘徊,最高拿过100,最低拿过68;个人项目有一次排行榜排到了榜首,然而由于算法不合要求被扣了18分;还有一周由于过分专注于团队项目,过分轻视个人项目的困难度,在那周的项目的最后一个部分有一个bug未在截止之前修复,导致扣了30分左右。组队项目就更坑了,我越来越觉得我把我的两个队友坑了。她们这门课都拿了A-。如果能够把组队项目做的更好的话,大家也许就能皆大欢喜。最后我粗略算了一下,组队项目总分拿了83分。

但其实这门课的成绩也不重要了,学到的东西真的特别多,很庆幸自己在这个学期毅然选择了CC。

18-730 Introduction to Computer Security

18-730,计算机安全导论。选这门课完全是因为自己的兴趣。想当年在澳大利亚交流的时候也选择了一门叫做Security的课程,简单介绍了有关Security的各方面内容。CMU的这门课更偏技术一些,这也是吸引我的一大原因。本学期这门课由Lujo Bauer教授授课,可能每学期的内容和授课方式,评分细则都不一样。Bauer教授的授课风格和我的听课风格不太搭,我个人觉得他讲课有点无聊,于是也翘了很多次课。INI MSIT项目的小伙伴们必修这门课的姐妹课程14-741 Introduction to Information Security。这门课的两位教授之一Nicolas Christin对学生要求苛刻,而且课业量很大,课程内容也比较偏Policy一点。

18-730的课程内容也是分为两大部分:授课内容+项目作业。授课内容以考试作为考核方式,一共3次,期末评分的时候将最低的那个分数剔除掉;项目作业一共4次。其中授课内容包含了密码学/安全协议/BGP/访问控制/授权/网络攻击方式/主机攻击方式/防火墙/安全架构/静态动态分析和一些其他的有关计算机安全的杂项话题。其中我最感兴趣的是密码学和各种攻击方式。4次作业中,前两次还是有些无聊的,第三第四次很有意思,在这门课的课程总结 文中会描述一下。

这门课是这学期付出精力最少的一门课,每次考试都是之前一天临时抱佛脚。第一次考试相对后两次是比较难的,考的是密码学的应用和一些证明;第二第三次考试由于CC Group项目已经放出来了,再加上翘了许多次课,只能利用作业和考试的前一天复习的知识强上考场,然而两次考的都比第一次好,让我有点觉得这门课的考试方式还是没严格到能把我这样似懂非懂半懂不懂的人过滤出去。

但是在课程项目作业上还是付出了自己应该付出的精力。这门课的项目是两个人一队,共享分数。这学期和一个印度兄弟组了队,能力还不错。也是帮了一些忙。

刷题/面试/实习求职

这学期是找实习的第一个学期。在学期刚开始的一个月之后就是著名的招聘大会TOC,海投了简历,获得了不少的面试机会,由于经验不够也面挂了一大把公司,最后签了微软,也算不错。

刷题的话,这学期一共刷了不到40题吧。来CMU之前刷了大约120道,所以Leetcode现在也就刷了一半左右。这学期更多的其实是在学习如何面试,包括在面试官面前克服紧张,把脑海中的内容一五一十,有条理地讲出来,最后在白板上写出完美的代码。

一共面了8家公司,如果面试题不在Leetcode中则不便透露原题,我就分别在下面简单写一下每个面试题的大概。

Palantir

Palantir在TOC刚刚投完简历,第二天就要我去校园面试。

面试官印度小哥,面试题 Leetcode 146: LRU Cache

WhatsApp

WhatsApp在TOC投完简历第三天要求校园面试。

面试题链表相关。其中进阶内容是如何在不用if,不用伪节点的前提下完成链表的add-first操作。

解决方案:C++,二重指针。

Addepar

Addepar一共给了三轮,其中前两轮是电话面试,第三轮飞去了纽约on site.

电话面试中的问题都比较简单如矩阵的处理和一级DP

onsite中两道值得一提的题,一道Leetcode 37: Sudoku Solver,和一道图论的题,简化之后是找所有从点A到点B的路径。

LinkedIn

LinkedIn一共两轮,第一轮的两道题分别是二分搜索和递归,第二轮是对一棵树的每一个节点做类似AVL树的左旋操作。

Google

Google校园面试两轮,电话面试一轮。

校园面试题一道OO设计,用buffer封装流输入;一道简单得不能再简单的数组题和一些进阶。

电话面试三道题:8421-BCD码数字的加一,删除字符串当中的所有特定字符,判断两个圆是否相交

Yelp

Yelp进行了一轮电话面试,第二轮面试由于已经接了微软的offer就没面。

面试题是简单设计一个搜索引擎,进阶内容是如何进行并行搜索

Microsoft

微软一共两场面试,第一场是校园面,俄国大妈,题目:剔除已排序数组中所有的重复元素

第二场一共四轮。

  1. 字符串转整数,需支持进制转换。
  2. 系统设计,设计并实现一个实时的虚拟机事件日志系统
  3. 午餐面试,行为面试,各种吹
  4. 将二维数组以螺旋方式输出

Cloudera

Cloudera一轮电话面试。面试题有关搜索引擎,不便详细描述。

写在后面

来CMU的第一个学期,简单地总结就是在压力和时间的夹缝中求生存。身边的大神们特别多,从他们身上也学到了特别多。自从CC团队项目下放之后基本上每天的生活状态就是,起床,奔向INI,午餐,做项目,晚餐,做项目,吃冻酸奶,做项目+吹逼,Escort/骑车回家。每天都觉得很充实,每天都觉得学到了很多东西,这样的感觉是在本科的时候所没有体会过的。

下一个学期还有一个星期多就要开始了。希望自己能用比这学期更好的状态去迎接OS,无论如何,也要尝试去冲击一下那个不可能的A。

Update 2016-5-31: A已经冲击成功 :D