论在美国本科学习计算机的正确姿势

在创立AADPS以前,陈欣老师在中国和美国的一流大学里学了八年物理,对相关的课程和科研领域有了第一手的认识。在进行理论推导和实验系统设计的过程中,他选修和自学了一部分计算机科目,后来更是为美国大学的计算机系教授和一家南非公司(学生签证一般情况下没法在美国很方便的工作,大家知道的)解决了一些棘手的问题。

诚然,目前国内留学行业是被文科生把持着的。也正因为如此,AADPS的老师们觉得懂一些计算机科学(Computer Science),无论是在短期选校和写why essay上,亦或是在谋划长远的职业发展上,都是十分有必要的。过去几年里,我们的学员们顺利拿到了哥伦比亚大学康奈尔大学卡内基梅隆大学莱斯大学佐治亚理工学院加州大学伯克利分校等美国一流CS名校的录取,让陈老师觉得有必要把多年积累的经验用平实易懂的语言分享给大家。


离散数学

英文名示例:Intro Discrete Math

交叉领域:数学

主要内容:离散数学是计算机科学的理论基础。对于许多复杂的计算问题,在没有真正利用计算机开始解决之前就有可能通过理论上的推演来得到一些提示和可能的进攻方向。主要的主题涵盖信息论、集合理论、图论、数论乃至最后延伸到更加艰深的拓扑学。对于基础的大学数学来说,就是涵盖微积分和线性代数以外的三不管地段。

解决问题:

  • 如何迅速算出我微信好友的好友的好友一共多少人?
  • 如何生成Windows 98的序列号但是不让别人生成?(P versus NP)

职业方向:对求职没有什么实际的作用,只是提供一个沟通交流的基础……当然能解决领域里任何一个悬而未决的问题的话,没准就拿图灵奖了

基础编程

英文名示例:Intro-Object Orient Prog

交叉领域:数学、物理

主要内容:不学电脑,编程等于没学,所以第一学期编程是逃不过的。

对于普通的美国大学,一般会在课堂上教Java。这是一门很干净的语言,所有不清爽的东西都被语言自己以极低的效率自个儿吭哧吭哧处理了。程序员和准程序员只要专注于把跑得慢且并没有什么实际作用的代码写出来就行了,写错的话基本上语言也会好心的提示一下哪里写错了。而且关于“面向对象”的部分,一个很经典的问题是会学习怎么做一个冰淇淋店。基本上类似于冰淇淋店是一个商店,商店里面有店员,然后店员标准的方法是卖东西,然后冰淇淋店继承了商店,店员卖东西的的方法要加一点卖冰淇淋特有的勺子铲冰淇淋的部分。不过就算做完了,还是没有真的冰淇淋可以吃……

对于文艺的美国大学,一般会在课堂上教C或者C++。相对Java来说就不那么干净,初学者会出现各种神奇的状况。电脑在大多数情况下会认为是编程的人真的要它去撞墙,于是就很愉快高效的撞墙去了。标准的东西,比如逻辑判断,四则运算,字符输入输出和函数都还和Java差不多。不过C语言并做不了冰淇淋店,习惯上也没有人让用C++做冰淇淋店的,但是成功把学校电脑搞死机难度并不大,因此创新创造的空间还是相当不错。

对于2B的美国大学,会教OCaml或者Lisp。陈欣老师当年帮计算机系教授做过这方面的工作的时候,确实知道他们(有一个专门的名词Academia,中文叫“学术圈”?)对于这方面有一种奇怪的偏执,回国的话,不仅没见过,连听都没有听说过(所以也算学了一门屠龙之技?有知道国内做这方面的朋友可以在文章下留个言,可以愉快的交流一下),所以学计算机还是要在美国呐。总之这些语言只有函数,概念上特别优美,实际操作中特别方便(比如啪的一下打散一个数据集合,对里面元素逐个操作一遍,再啪的一下倒着粘起来),唯一不好的地方就是反直觉。以正常人类的思维并不能很好的理解写出来的都是啥。所以比如像卡内基梅隆这种大学本科就只上这个,因为会假定你早在五岁的时候就把之前那些都学通了,或者至少是可以业余时间自学下吧

解决问题:

  • 弄一个日历,或者GPA计算器,或者扫雷?不过一般是字符界面的那种
  • 所有说着的话都倒着回答你答回着倒都话得着说有所(Palindrome)

职业方向:程序员,不过函数式编程的话在中国可能还是找不到工作?

数据结构

英文名示例:Data Struct & Algorithms

交叉领域:物理

主要内容:基本的问题是时间复杂度和空(内)间(存)复杂度。在离散数学的基础上(但是其实不用学离散也没啥关系)研究经典编程问题的解决方法。之前学过图是啥东西,但是这回真的要做出来,具体可以分成树、链表、图、栈、队列等各种有的没的。然后就是怎么操作这些东西的算法。当然最重要的一点是,学到这里会发现一个函数可以调用自己,以及如果不设计好调用截止条件的话在用Java以外的语言时会把电脑搞死机这一事实。Java的话会用自己特有的方式发表一个严厉的谴责Exception in thread “main” java.lang.StackOverflowError

上面这个翻译成为正常人类能懂的语言就是:同学你还嫩着,这次期末要挂科了吧?

解决问题:

  • 如何把一个柱子上的盘子都移到另外一个柱子上?(汉诺塔)
  • 如何迅速给全省的高考考生按分数排个名次?

职业方向:可以确保在找计算机相关工作的时候通过面试

微机原理

英文名示例:Systems and Networks

交叉领域:物理

主要内容:研究计算机底层是怎么工作的。虽然不会真让写11101010101,但是汇编语言的话也差不多,仅仅是把1和0换成助记符而已。中国大学的话一般让了解一下我们大家现在使用的个人电脑的x86架构,然后就可以在真机上试。美国大学的话一般让学某教授拍脑袋想出来的MIPS架构,因为实际这个东西并不靠谱,没有厂商愿意生产,所以就只能在模拟器上试。不过我们现在智能手机用的架构有一点点类似,但学校并不会给这个机会,因为一不小心把手机变砖头了就不好玩了,光靠学费可能还回不了本……

之前学C语言的同学可以在这里看一看电脑实际执行的是个啥,然后就会发现在基础编程里面编的程序,人实际上只做了1%不到的工作,剩下的都是编译器给补全的。因此有的时候无知的确是一种幸福。

解决问题:

  • 如何在屏幕上显示Hello, World?
  • 如何在无法生成序列号的情况下破解Windows 98?

职业方向:做手机、手表、无人机、路由器、体重秤、水杯垫。电脑一般还轮不上

操作系统

英文名示例:Design-Operating Systems

主要内容:研究计算机核心软件是怎么工作的。如果之前没学过C语言的,一只和善的大肚子芬兰企鹅(Linux)包教包会。除此之外,你会知道如何管理文件(和伪装成文件的各种硬件设备),观察系统里面各种数据都是什么意思,然后写小程序尝试着让系统性能变得更好或者更糟糕。比较正规的项目会让把Linux的内核代码全部编译一遍,试着开关各种模块。对于有充足时间以及典型自虐倾向的(比如说陈欣老师自己),还可以再全部人工读一遍。不过我当年读的是2.6.0,所以其实还好。读今天最新4.3版本的,节哀走好不送。

解决问题:

  • 如何在不安装360安全卫士的情况下把电脑优化得比装360安全卫士还好?
  • 如何解释Mac是PC,但是PC不是Mac?
  • (Bonus) 如何以别人的身份发电子邮件?

职业方向:系统管理员或者做手机。手表、无人机、路由器、体重秤、水杯垫的只要把操作系统从手机上抄过来就可以,因此并不需要人来做。特别优秀但是不习惯美国生活的,国内各种电脑卫士都张开双臂欢迎

编译原理

英文名示例:Languages and Computation

主要内容:觉得学别人的语言不过瘾,自己写一个计算机语言吧,然后只要把这个语言映射到任何一个现成的计算机语言就成。这个比把大象装进冰箱还要少一个步骤:第一步,写lexer或者叫tokenizer,把语言的关键词全部分解提取出来;第二部,写parser,把提取出来的关键词转换成目标语言的结构。计算机发展史上一个最为牛逼的成就,就是用一门计算机语言写自身的编译器。

早年某著名大神为了在业余编程打赌中坑自己的对手,正是在编译器上做手脚让对方的计时慢了一倍。陈老师自己原先做的那一个,就是把某教授发明的函数式语言编译成合法的C++语句。这样整个链条下来的话,可以直接编译执行操作数据库的SQL。相对于原先解释执行的框架,效率平均提高了七倍,不过还是没有什么用处。

解决问题:

  • 如何发(闲)明(的)一(没)门(事)计(重)算(新)机(造)语(轮)言(子)?

职业方向:另一门对求职没有什么实际用途的课程。当然有朝一日如果真写出一个占市场比例5%以上的编程语言,简历上只要I wrote XXX一句话,FLAG (Facebook, Linkedin, Amazon, Google)随你挑,工资随你开

软件工程

英文名示例:Intro to Software Engr

交叉领域:商科?

主要内容:劳力者治于人,劳心者治人。名字是工程,实质是管人。研究一个团队怎么有效率的开发软件、测试软件、发行软件、回收软件。如果你想找计算机方面的工作,但是在计算机科学上确实没什么天赋,这门课会是你为数不多的扳本机会。但也因为这门课内容和计算机科学本身没啥关系,陈老师的话其实不是太熟……

解决问题:

  • 为什么一个人花一个月能完成的编程工作,三个人要花两个月完成?
  • 为什么三个人花一个月能完成的编程工作,十个人永远也完成不了?
  • 世界上有没有银色的子弹(silver bullet)?(答案:没有)

职业方向:产品经理,即不会写程序的程序员(不过一般PPT做得还不错)

数据库

英文名示例:Intr to Database Systems

主要内容:研究如何用专门的软件来管理分析海量的数据记录。基本内容就是围绕两个单词,一个增删查改的CRUD (create, read, update, delete),一个中文没法翻译不如记英文原文的ACID (atomicity, consistency, isolation, durability)。

前面这个搞清楚分数下不了B(重点:知道怎么join,就是一次查n个有关联的数据表。一张表有你姓名和身份证号,一张表有身份证号和准考证号,一张表有准考证号和成绩,然后知道姓名查成绩),后面这个搞清楚分数下不了A+(重点:知道什么时候该用transaction,就是张三转账给李四,转到张三账户扣了钱李四账户没扣钱的时候电脑停电了。来电之后该退钱退钱该转账继续转,别让钱人间蒸发了)。往牛逼了说可以有数据挖掘(data mining)和数据仓库(data warehouse)但是并没有本质上的区别。

所使用的SQL数据库查询语言除了用分号结束句子以外完全符合英语语法,简直是计算机语言里面的耻辱,一般美国大学都不屑去正式教这个。

解决问题:

  • 在手机订餐时,如何迅速定位住所位置附近的餐馆?
  • 如何搜索邮箱里面的邮件?
  • 为什么Walmart要把啤酒和尿布放在一起?(已经被证实是中国人开脑洞瞎编的案例)

职业方向:数据库管理员,最好在华尔街上,但即便如此相对来说还是不赚钱

版权申明

本文为AADPS原创,保留著作及出版权利。欢迎非盈利性质的转载,但须保留作者和原始发布地址。

本文的原始发布地址是http://aadps.net/2014/6965.html。我们每年夏季会更新最新美国大学本科申请文书题目和权威院校指南,欢迎把网站加入浏览器收藏夹。

发布者

陈 欣

陈 欣

AADPS创始人

发表评论