杜克ECE 软件工程方向毕业总结

avatar 459685
wtmxs
30609
65
最近秋季的课程也陆续结束了,在杜克一年又三个月的学习也进入了收官阶段。在这里我承接上贴:instant.1point3acres.cn

继续跟大家继续分享一下后面的SE-track上课的心得体验。本文部分内容来自于20 fall 杜克EECS群里我分享的一些经验,直接搬过来用了。

为了避免产生困惑,这里先解释下正常选课数目其实是3331,也即四学期毕业,前三学期各一门,最后一学期一门。我采取的是334,也即最后一学期四门。所以我是提前毕业了,Duke ECE正常还是一个两年的项目。

总的来说来说我现在还是非常推荐Duke ECE这个项目。课程不仅可以完全选软,而且质量上佳。且由于第一学期ECE551的存在,课程体系适合零基础的同学开始系统的锻炼编程能力,培养工程习惯,熟悉专业工具和积攒基础知识,而非简简单单像udemy上课一样糊弄几个web项目就说自己学过CS了。此外,大多数Duke CS的核心课程应该ECE都是能轻松选上的。比较值得一上的有三门:CS510 Advanced OS, CS512 Distributed System和CS516 DB System这三门课。只要CS开课的话,我周围没听说有欲选而不得的。

我一共选了十门课。
19 fall的选课是:
ECE550 Fundamentals of Computer Systems
ECE551 C++ programming
ECE590 Algorithm
20 spring的选课:
ECE568 Engineering Robust Server Software
ECE650 System Programming
ECE 651 Software Engineering
20 fall:
CS510 Advanced OS
ECE565 Performance Optimization&Parallelism
ECE581 Random Signals and Noises
CS590 Parallel Computing。

第一学期的选课已经去年已经发帖介绍过一次了,这次主要说一下剩下的两个学期。

总体来说春季ECE-SE方向传统的选课套餐就是我选的那三门。合称春季三件套。

ECE651 Software Engineering在前几届都是相对轻松的一门课,从我们这届开始被Drew魔改了。课程网站如下:
adhilton.pratt.duke.edu
改了之后workload大了很多,但也有用了很多,非常推荐上。这门课里Drew会结合自己的理解,给大家讲很多软件工程的方法论和思想。其中包括了虽然虚一些,但是确实有用的proactive communication, technical debt之类的想法,又包含了面试和实际工作中会大量用到的Object Oriented Design(OOD)的design principle 和design pattern等知识。其中里面讲到的start a final project from minimal end-to-end system这个思想方法非常有实践的意义,让我破除了长久的一个工程习惯的误区。

这门课作业都是Java的工程, 特别是后面final project以三个evolution的形式布置非常有效果。但是提醒大家一下,不要课上听听就罢,要刻意的把课上讨论的思想和知识用在自己的实践中。要有意识的去反思自己之前的OOD做的有什么问题,自己开发的workflow有什么问题并加以修改。即使你用一个垃圾design写出来的代码也可以通过testcase,但是这样你的学习效果会大打折扣。我记得即使在Drew讲了多人协同工作的git分支管理的重要性之后,有的团队仍然用微信传代码的方式来进行沟通…..当时跟Drew闲聊时候谈到这个问题还记得他叹了口气,感叹到:”you can drag a horse to water, but you can never force it to drink…”

此外值得一提的是Drew会很乐意大家单独schedule一个meeting去交流,讨论你们的设计。这是很好的学习机会,大家可以利用好教学资源,学费不只是付一个听课费。

ECE650 system programming是这学期550的老师Rabih交。课程网站是:
rabihyounes.com
650是春季学期里workload最小的一门课。lecture因为塞了太多topic在一门课里所以节奏显得略快。由于我之前课下自学过一些OS和Network的知识,故而感觉还好,但不少零基础的同学听课有些吃力。这门课的作业都是C/C++的单人作业,共计五次,作业不过份复杂而又实用,涵盖了memory management, concurrency, security, data base的使用以及socket programming。socket programming是作业3,那次作业同时也是一个很好的基于Message Passing形式进行synchronization的实践,对初学者来说是有价值的。不过对于本科基础非常好,实践经验非常丰富同学来说这门课略显基础,可以酌情替换掉这课。

ECE568 Robust Server Software也是一门杂糅了很多内容的课。涵盖了scalability, security, web, REST架构,network, container等诸多跟后端有关系的题材。貌似这课早年是Drew神设计的,所以课里讨论的话题都非常有价值,作业强度也非常高(四个大project一个security analysis)。第一次作业是Django,第二次C++,后面则不做限制, final project我是用Java写的。不过主讲老师Brian声音实在是非常催眠,又是八点半的早课,我们这届很多同学课都没怎么听下去…不过这课的项目都很适合写到简历里,对春季还需要找实习的同学来说很有价值,因此也相对推荐上。

此外,ECE553 compiler是另外一门Drew开的课,基础不是很好的同学这个学期可能不太适合选。CS512 distributed systems是Jeff开的课。Jeff是个很博学而富有元气的教授,在这学期510 OS的piazza详细回答了我各种各样刁钻的system方面的问题,解决了我很多困惑,非常感激。512 作业不是很好写,因此整门课压力很大。不过510上课期间Jeff提过他今年春季要溜出去休假,不知道这门课还开不开。

秋季由于开始的时候已经成功return了,所以20fall我一共选了四门课来提前毕业。

CS510 Advanced OS应该是默认有上过undergraduate级别的OS课程才适合上。课程官网是:
www2.cs.duke.edu

我非常喜欢主讲老师Jeff,这学期也是我上的最开心的一门课。我本科是通信工程的,但是假期的时候自己找了本OS的书仔细通读了一遍,外加上过650 System Programming,因此也就勉强上阵了。开学一共八周每周一个lab。大概有一个是MIT OS课的JOS lab的一小部分,一个是基于LRU原则来做memory swap的page fault handler,一个是user level的thread library,一个是生产者消费者问题变式的仿真,一个是concurrent queue和用futex实现的barrier以及最后一个是给shell添加pipe, redirection之类的功能。因为每周都有一个lab,所以每一个都不是很大,更多的是让大家实践课程的知识。最后有一个自己选题的final project,周围有同学写的是在xv6基础上做pid&mount的namespace,我写的是在xv6基础上实现cgroup来对CPU资源进行分配。此外,每周还有一篇论文要读,一般都是OSDI/SOSP之类的地方扒出来的神论文,以及完成一些论文有关的quizzes和reflection question之类的。这课workload其实不小,但是不知道是不是经过春季课程的毒打变强了很多的缘故,没太大压力的上下来了。就是有时候510的课在讨论一些相对前沿的research话题时候听的不是很懂,要先找本科生的310课程视频来学一遍….我还是太菜了:(

ECE565讲的是如何结合硬件知识写出高性能的代码,workload相对较小,中规中矩的一门课。一共有5次作业,前面三次大多都是笔答题或着顶多在给好的program基础上稍稍改改来测性能。后两次都是编程作业并交报告,最后一次对之前毫无经验的同学来说稍稍有点难度,但也不算太难。前半学期讲的是如何优化sequential program的,但是感觉里面不少内容其实编译器后端应该都是做好了,不太需要开发者操心,纯粹就当科普一下了。后半学期讲了一些parallel programming的知识。内容中规中矩,我听起来感觉还不错,不过Brian讲课有点沉闷,对于完全没有这方面编程经验的同学来说可能稍显枯燥一点。

CS590 parallel computing 同样讲了很多并行编程的东西,感觉什么都讲了一些,什么都没讲太深…workload也偏小,同样是5次lab,需要用到OpenMp/Cilk/TBB/MPI/CUDA之类的东西来写些程序。

ECE581 随机信号,ECE万年经典水课不解释….分数已经出了,果然是个A。

这学期本来是第一年边刷题边上课实在是太辛苦了,日常9-12-7生活模式。想着最后一学期还是对自己好一点,选课策略保守了一些,现在看来感觉可能有点太保守了,还挺怀念春季学期那种天天被DDL追的要死要活的感觉….可能有点斯德哥尔摩综合症了哈哈哈
本帖隐藏内容需要登录后才能查看。
大概就是以上这些,欢迎大家申请。希望21年美签早日解禁,各位都能正常继续自己的学业!

补充内容 (2020-11-25 22:31):
码了这么多字,大多都是地里之前完全没有介绍过的东西。求版主加精,求各位加米!

补充内容 (2020-11-26 11:24):
我这里列的基本都是自己上过或者周围熟人上过的课,多少难免局限在Software Engineering这个范畴内了。CS那边我也主要只关注了下system有关的几个课程。

当然其实ECE下面还有一批CV/NLP/ML的课,CS那边也有图论,算法类的课。我一直觉得对我没啥大用就没关注过,这里还是提一下in case有人想学。

补充内容 (2020-11-29 10:50):
补一下,CS590 parallel computing除了几个lab外其实还有个占分40%的final project。

CS510以及本科版本的310没有完全围绕传统OS的几块来讲,还谈了一些security,performance以及Raft/GFS等分布式有关的东西。

补充内容 (2021-04-17 22:15 +08:00):
Google Cloud今年在Durham开张了,听说这个夏天就开始招人了。鉴于Durham除了Duke之外是啥都没有纯正的美国大农村,感觉就是冲着我校(或许还有点隔壁UNC)来的?最近已经收到了学院发的很多Google宣讲的通知了
  • 211
65条回复