What every computer science major should know 每一个计算机专业的学生应该知道什么

Given the expansive growth in the field, it’s become challenging to discern what belongs in a modern computer science degree.
由于计算机领域的迅速发展,辨别什么是现代计算机科学学位是一项挑战。
My own faculty is engaging in this debate, so I’ve coalesced my thoughts as an answer to the question, “What should every computer science major know?”
我们教职工正在参与这场辩论,所以我把自己的想法结合起来,回答了一个问题:“每个计算机科学专业的学生都应该知道什么?”
I’ve tried to answer this question as the conjunction of four concerns:
我试着把四个问题结合起来回答这个问题:
What should every student know to get a good job?
为了找到一份好工作,每个学生都应该知道什么?
What should every student know to maintain lifelong employment?
为了不失业,每个学生都应该知道些什么?
What should every student know to enter graduate school?
为了考研究生,每个学生都应该知道些什么?
What should every student know to benefit society?
为了造福社会,每个学生都应该知道些什么?
My thoughts below factor into both general principles and specific recommendations relevant to the modern computing landscape.
我的以下想法包括了与现代计算领域相关的一般原则和具体建议。
Computer science majors: feel free to use this as a self-study guide.
计算机科学专业的学生:请随意使用这个作为自学指南。
Please email or tweet with suggestions for addition and deletion.
请通过电子邮件或推特发送添加和删除建议。
Update: Thanks for the suggestions and reminders! I’ll incorporate them as I receive them to keep this a living document.
更新:谢谢你的建议和提醒!当我收到它们的时候,我会把它们合并在一起,以保持这是一份活的文件。

Portfolio versus resume 作品集 VS 简历

Having emerged from engineering and mathematics, computer science programs take a resume-based approach to hiring off their graduates.
计算机科学课程已经从工程学和数学中脱颖而出,采用了基于简历的方法来招聘毕业生。
A resume says nothing of a programmer’s ability.
简历说明不了程序员的能力。
Every computer science major should build a portfolio.
每个计算机科学专业都应该建立一个作品集。
A portfolio could be as simple as a personal blog, with a post for each project or accomplishment. A better portfolio would include per-project pages, and publicly browsable code (hosted perhaps on github or Google code).
作品集可以像个人博客一样简单,每个项目或成就都有一个帖子。 更好的作品集应包括每个项目的页面以及可公开浏览的代码(可以放在github或Google Code上)。
Contributions to open source should be linked and documented.
对开源代码的贡献应该有链接并记录下来。
A code portfolio allows employers to directly judge ability.
一个作品集可以使雇佣者直接判断求职者的能力。
GPAs and resumes do not.
GPAs和简历都做不到。
Professors should design course projects to impress on portfolios, and students, at the conclusion of each course, should take time to update them.
教授应该给学生设计可放入作品集的课程项目,在每门课程结束后,学生应该花时间更新它们。
Examples
Edward Yang’s web site.
Michael Bradshaw’s web site.
Github is my resume.

Technical communication 技术交流

Lone wolves in computer science are an endangered species.
在计算机科学中,单枪匹马干是不可能的。
Modern computer scientists must practice persuasively and clearly communicating their ideas to non-programmers.
现代计算机科学家必须练就很强的说服力,并将他们的思想清晰地传达给非程序员们。
In smaller companies, whether or not a programmer can communicate her ideas to management may make the difference between the company’s success and failure。
在较小的公司中,程序员是否可以将其想法传达给管理层,可能会影响公司的成败。
Unfortunately, this is not something fixed with the addition of a single class (although a solid course in technical communication doesn’t hurt).
不幸的是,单纯的增加一个课程并不能解决这一问题(尽管技术交流方面的扎实课程也无济于事)。
More classes need to provide students the opportunity to present their work and defend their ideas with oral presentations.
需要更多的课程为学生提供以口头演讲的形式介绍他们的工作并捍卫自己的想法的机会。
Specific recommendations
具体建议
I would recommend that students master a presentation tool like PowerPoint or (my favorite) Keynote. (Sorry, as much as I love them, LaTeX-based presentation tools are just too static.)
我建议学生掌握PowerPoint或(我最喜欢的)Keynote之类的演示工具。 (很抱歉,尽管我很喜欢它们,但是基于LaTeX的演示工具太静态了。)
For producing beautiful mathematical documentation, LaTeX has no equal. All written assignments in technical courses should be submitted in LaTeX.
为了制作出精美的数学文档,LaTeX无与伦比。 技术课程中的所有书面作业均应在LaTeX中提交。

Recommended reading
推荐读物
Writing for Computer Science by Zobel.
Even a Geek Can Speak by Asher.
The LaTeX Companion.
The TeXbook by Knuth. (Warning: Experts only.)
Notes on Mathematical Writing.
Simon Peyton-Jones’s advice on How to Give a Good Research Talk.
My advice on how to send and reply to email.

An engineering core 工程核心

Computer science is not quite engineering.
计算机科学不是完全工程。
But, it’s close enough.
但是,它已经足够接近了。
Computer scientists will find themselves working with engineers.
计算机科学家会发现自己正在与工程师合作。
Computer scientists and traditional engineers need to speak the same language–a language rooted in real analysis, linear algebra, probability and physics.
计算机科学家和传统工程师需要说相同的语言-这种语言植根于实际分析,线性代数,概率和物理学。
Computer scientists ought to take physics through electromagnetism. But, to do that, they’ll need take up through multivariate calculus, (and differential equations for good measure).
计算机科学家应该通过电磁学来研究物理学。 但是,要做到这一点,他们将需要处理多元微积分(以及微分方程以取得良好的效果)。
In constructing sound simulations, a command of probability and (often times) linear algebra is invaluable. In interpreting results, there is no substitute for a solid understanding of statistics.
在构造模拟声音时,概率和(通常的)线性代数的命令是无价的。 在解析结果时,扎实的统计学的理解是无法代替的。

Recommended reading
推荐阅读
Calculus by Spivak.
All of Statistics: A Concise Course in Statistical Inference by Wasserman.

The Unix philosophy Unix哲学

Computer scientists should be comfortable with and practiced in the Unix philosophy of computing.
计算机科学家应该对Unix计算哲学感到满意和实践。
The Unix philosophy (as opposed to Unix itself) is one that emphasizes linguistic abstraction and composition in order to effect computation.
Unix哲学(与Unix本身相反)是一种强调语言抽象和组合以影响计算的哲学。
In practice, this means becoming comfortable with the notion of command-line computing, text-file configuration and IDE-less software development.
实际上,这意味着要熟悉命令行计算,文本文件配置和无IDE软件开发的概念。
Specific recommendations
具体建议
Given the prevalence of Unix systems, computer scientists today should be fluent in basic Unix, including the ability to:
鉴于unix系统的普及,计算机科学家现在应该能够熟练地使用基本unix,包括:
navigate and manipulate the filesystem;
浏览和操作文件系统;
compose processes with pipes;
用管道组成流程;
comfortably edit a file with emacs and vim;
使用emacs和vim轻松地编辑文件;
create, modify and execute a Makefile for a software project;
为软件项目创建、修改和执行makefile;
write simple shell scripts.
编写简单的shell脚本。
Students will reject the Unix philosophy unless they understand its power. Thus, it’s best to challenge students to complete useful tasks for which Unix has a comparative advantage, such as:
除非他们了解Unix哲学,否则他们将拒绝Unix哲学。 因此,最好挑战学生完成Unix具有相对优势的有用任务,例如:
Find the five folders in a given directory consuming the most space.
查找给定目录中占用空间最多的五个文件夹。
Report duplicate MP3s (by file contents, not file name) on a computer.
报告计算机上重复的MP3(按文件内容而不是文件名)
Take a list of names whose first and last names have been lower-cased, and properly recapitalize them.
列出名字和姓氏均小写的名字列表,并适当地对其进行大写。
Find all words in English that have x as their second letter, and n as their second-to-last.
查找英语中所有以x为第二个字母,以n为倒数第二个单词的单词。
Directly route your microphone input over the network to another computer’s speaker.
通过网络将您的麦克风输入直接路由到另一台计算机的扬声器。
Replace all spaces in a filename with underscore for a given directory.
将文件名中的所有空格替换为给定目录的下划线。
Report the last ten errant accesses to the web server coming from a specific IP address.
报告从特定IP地址对Web服务器的最后十次错误访问。
Recommended reading
推荐阅读
The Unix Programming Environment by Kernighan and Pike.
The Linux Programming Interface: A Linux and UNIX System Programming Handbook by Kerrisk.
Unix Power Tools by Powers, Peek, O’Reilly and Loukides.
commandlinefu.
Linux Server Hacks.
The single Unix specification.
单个unix规范

Systems administration 系统管理

Some computer scientists sneer at systems administration as an “IT” task.
一些计算机科学家嘲笑系统管理是一项“ IT”任务。
The thinking is that a computer scientist can teach herself how to do anything a technician can do.
这种想法是,计算机科学家可以教自己如何做技术人员可以做的任何事情。
This is true. (In theory.)
这是真的。 (理论上。)
Yet this attitude is misguided: computer scientists must be able to competently and securely administer their own systems and networks.
但是这种态度是错误的:计算机科学家必须能够胜任和安全地管理他们自己的系统和网络。
Many tasks in software development are most efficiently executed without passing through a systems administrator.
在不经过系统管理员的情况下,可以最有效地执行软件开发中的许多任务。
Specific recommendations
具体建议
Every modern computer scientist should be able to:
每个现代计算机科学家都应该能够:
Install and administer a Linux distribution.
安装并管理Linux发行版。
Configure and compile the Linux kernel.
配置并编译linux内核
Troubleshoot a connection with dig, ping and traceroute.
使用dig,ping和traceroute对连接故障进行排除。
Compile and configure a web server like apache.
编译和配置Web服务器(如apache)。
Compile and configure a DNS daemon like bind.
编译并配置DNS守护进程,例如bind。
Maintain a web site with a text editor.
使用文本编辑器维护网站。
Cut and crimp a network cable.
切断和压接网络电缆。
Recommended reading
推荐阅读
UNIX and Linux System Administration Handbook by Nemeth, Synder, Hein and Whaley.

Programming languages 编程语言

Programming languages rise and fall with the solar cycle.
编程语言随着太阳周期的变化而变化。
A programmer’s career should not.
程序员的职业生涯不应该这样。
While it is important to teach languages relevant to employers, it is equally important that students learn how to teach themselves new languages.
虽然教授与雇主相关的语言很重要,但学生学习如何自学新语言也同样重要。
The best way to learn how to learn progamming languages is to learn multiple programming languages and programming paradigms.
学习编程语言的最好方法是学习多种编程语言和编程范例。
The difficulty of learning the nth language is half the difficulty of the (n-1)th.
学习第n种语言的难度是第(n-1)种语言的一半。
Yet, to truly understand programming languages, one must implement one. Ideally, every computer science major would take a compilers class. At a minimum, every computer science major should implement an interpreter.
但是,要真正理解编程语言,必须实现一种。 理想情况下,每个计算机科学专业的学生都应参加编译器课程。 至少,每个计算机科学专业的学生都应该实现一个解释器。
Specific languages
特定语言
The following languages provide a reasonable mixture of paradigms and practical applications:
以下语言提供了范例和实际应用的合理组合:
Racket;
C;
JavaScript;
Squeak;
Java;
Standard ML;
Prolog;
Scala;
Haskell;
C++; and
Assembly.

Racket
Racket, as a full-featured dialect of Lisp, has an aggressively simple syntax.
racket作为lisp的一种全功能语言,语法非常简单。
For a small fraction of students, this syntax is an impediment.
对于一小部分学生来说,这种语法是一种障碍。
To be blunt, if these students have a fundamental mental barrier to accepting an alien syntactic regime even temporarily, they lack the mental dexterity to survive a career in computer science.
直截了当地说,如果这些学生在接受一个外来的句法体系时有一个根本的心理障碍,即使是暂时的,他们也缺乏在计算机科学领域生存的智力。
Racket’s powerful macro system and facilities for higher-order programming thoroughly erase the line between data and code.
racket强大的宏系统和高阶编程工具彻底消除了数据和代码之间的界限。
If taught correctly, Lisp liberates.
如果教得正确,Lisp可以解放。
Recommended reading
推荐阅读
How to Design Programs by Felleisen, Findler, Flatt and Krishnamurthi.
The Racket Docs.

ANSI C 标准C
C is a terse and unforgiving abstraction of silicon.
C是silicon的简洁抽象。
C remains without rival in programming embedded systems.
C在嵌入式系统编程方面仍然没有竞争对手。
Learning C imparts a deep understanding of the dominant von Neumann architecture in a way that no other language can。
学习C语言可以加深对冯·诺依曼体系结构的理解,这是其他语言无法做到的。
Given the intimate role poor C programming plays in the prevalence of the buffer overflow security vulnerabilities, it is critical that programmers learn how to program C properly.
鉴于不良C编程会直接导致缓冲区溢出安全漏洞,因此,程序员学习如何正确编程C至关重要。
Recommended reading
ANSI C by Kernighan and Ritchie.

JavaScript
JavaScript is a good representative of the semantic model popular in dynamic, higher-order languages such as Python, Ruby and Perl.
JavaScript是动态、高级语言(例如Python,Ruby和Perl)中流行的语义模型的良好代表。
As the native language of the web, its pragmatic advantages are unique.
作为网络的母语,其语言优势是独特的。
Recommended reading
JavaScript: The Definitive Guide by Flanagan.
JavaScript: The Good Parts by Crockford.
Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript by Herman.

Squeak
Squeak is a modern dialect of Smalltalk, purest of object-oriented languages.
Squeak是Smalltalk的现代方言,是最纯粹的面向对象语言。
It imparts the essence of “object-oriented.”
它体现了“面向对象”的本质。
Recommended reading
Introductions to Squeak
Java
Java will remain popular for too long to ignore it.
Java将在很长一段时间内保持流行,不会忽视它。
Recommended reading
Effective Java by Bloch.
Standard ML
Standard ML is a clean embodiment of the Hindley-Milner system.
标准ml是hindley-milner系统的完全体现。
The Hindley-Milner type system is one of the greatest (yet least-known) achievements in modern computing.
Hindley-Milner型系统是现代计算领域最伟大(但鲜为人知)的成就之一。
Though exponential in complexity, type inference in Hindley-Milner is always fast for programs of human interest.
尽管复杂度呈指数级增长,但对于人类感兴趣的程序,Hindley-Milner中的类型推断始终是快速的。
The type system is rich enough to allow the expression of complex structural invariants. It is so rich, in fact, that well-typed programs are often bug-free.
类型系统足够丰富,可以表达复杂的结构不变量。事实上,它是如此丰富,良好类型的程序往往是无缺陷的。
Recommended reading
ML for the Working Programmer by Paulson.
The Definition of Standard ML by Milner, Harper, MacQueen and Tofte.

Prolog
Though niche in application, logic programming is an alternate paradigm for computational thinking.
尽管在应用程序中占有一席之地,但逻辑编程是计算思维的另一种范式。
It’s worth understanding logic programming for those instances where a programmer may need to emulate it within another paradigm.
对于程序员可能需要在另一个范式中进行仿真的那些实例,有必要了解逻辑编程。
Another logic language worth learning is miniKanren. miniKanren stresses pure (cut not allowed) logic programming. This constraint has evolved an alternate style of logic programming called relational programming, and it grants properties not typically enjoyed by Prolog programs.
另一种值得学习的逻辑语言是minikanren。minikanren强调纯(不允许剪切)逻辑编程。这个约束已经演变成一种称为关系编程的逻辑编程的替代样式,并且它赋予了Prolog程序通常不支持的属性。
Recommended reading
Learn Prolog Now!
Another tutorial.
miniKanren.
Scala
Scala is a well-designed fusion of functional and object-oriented programming languages. Scala is what Java should have been.
Scala是功能和面向对象的编程语言的精心设计的融合。 Scala是Java应有的。
Built atop the Java Virtual Machine, it is compatible with existing Java codebases, and as such, it stands out as the most likely successor to Java.
它建立在Java虚拟机之上,与现有的Java代码库兼容,因此,它是Java最有可能的继承者。
Recommended reading
Programming in Scala by Odersky, Spoon and Venners.
Programming Scala by Wampler and Payne.

Haskell
Haskell is the crown jewel of the Hindley-Milner family of languages.
Haskell是Hindley-Milner语言家族的皇冠上的明珠。
Fully exploiting laziness, Haskell comes closest to programming in pure mathematics of any major programming language.
Haskell充分利用懒惰,最接近于任何主要编程语言的纯数学编程。
Recommended reading
Learn You a Haskell by Lipovaca.
Real World Haskell by O’Sullivan, Goerzen and Stewart.
ISO C++
C++ is a necessary evil.
C ++是必不可少的。
But, since it must be taught, it must be taught in full.
但是,既然一定要教,就一定要全教。
In particular, computer science majors should leave with a grasp of even template meta-programming.
特别是,计算机科学专业的学生甚至应该掌握模板元编程。
Recommended reading
The C++ Programming Language by Stroustrup.
C++ Templates: The Complete Guide by Vandevoorde and Josuttis.
Programming Pearls by Bentley.
Assembly
Any assembly language will do.
任何汇编语言都可以。
Since x86 is popular, it might as well be that.
因为x86很受欢迎,因此可能也是这样。
Learning compilers is the best way to learn assembly, since it gives the computer scientist an intuitive sense of how high-level code will be transformed.
学习编译器是学习汇编的最佳方法,因为它可以使计算机科学家直观地了解如何转换高级代码。
Specific recommendations
具体建议
Computer scientists should understand generative programming (macros); lexical (and dynamic) scope; closures; continuations; higher-order functions; dynamic dispatch; subtyping; modules and functors; and monads as semantic concepts distinct from any specific syntax.
计算机科学家应该理解生成编程(宏);词汇(和动态)范围;闭包;延续;高阶函数;动态调度;子类型;模块和函子;和单子作为与任何特定语法不同的语义概念。

Recommended reading
Structure and Interpretation of Computer Programs by Abelson, Sussman and Sussman.
Lisp in Small Pieces by Queinnec.

Discrete mathematics 离散数学

Computer scientists must have a solid grasp of formal logic and of proof. Proof by algebraic manipulation and by natural deduction engages the reasoning common to routine programming tasks. Proof by induction engages the reasoning used in the construction of recursive functions.
计算机科学家必须牢牢掌握形式逻辑和证明。通过代数运算和自然演绎的证明涉及到常规编程任务中常见的推理。归纳证明涉及递归函数构造中使用的推理。
Computer scientists must be fluent in formal mathematical notation, and in reasoning rigorously about the basic discrete structures: sets, tuples, sequences, functions and power sets.
计算机科学家必须精通形式数学符号,并能对基本的离散结构(集合、元组、序列、函数和幂等)进行严格的推理。
Specific recommendations
For computer scientists, it’s important to cover reasoning about:
对于计算机科学家来说,重要的是要涵盖以下方面的推理:
trees;

graphs;

formal languages; and
automata.
形式语言和自动化
Students should learn enough number theory to study and implement common cryptographic protocols.
学生应该学习足够的数论来学习和实现常用的密码协议。
Recommended reading
How to Prove It: A Structured Approach by Velleman.
How To Solve It by Polya.

Data structures and algorithms 数据结构和算法

Students should certainly see the common (or rare yet unreasonably effective) data structures and algorithms.
学生当然应该看到常见的(或罕见但不合理的有效)数据结构和算法。
But, more important than knowing a specific algorithm or data structure (which is usually easy enough to look up), computer scientists must understand how to design algorithms (e.g., greedy, dynamic strategies) and how to span the gap between an algorithm in the ideal and the nitty-gritty of its implementation.
但是,比知道一个特定的算法或数据结构(通常很容易查找)更重要的是,计算机科学家必须了解如何设计算法(例如贪婪的、动态策略),以及如何跨越理想算法与其实现的细节之间的差距。
Specific recommendations
At a minimum, computer scientists seeking stable long-run employment should know all of the following:
寻求稳定长期工作的计算机科学家至少应了解以下所有知识:
hash tables;
哈希表
linked lists;
单链表
trees;

binary search trees; and directed and undirected graphs.
二叉搜索树和有向图和无向图
Computer scientists should be ready to implement or extend an algorithm that operates on these data structures, including the ability to search for an element, to add an element and to remove an element.
计算机科学家应该准备好实现或扩展对这些数据结构进行操作的算法,包括搜索元素,添加元素和删除元素的能力。
For completeness, computer scientists should know both the imperative and functional versions of each algorithm.
为了完整性,计算机科学家应该知道每种算法的命令和功能版本。
Recommended reading
CLRS.
Any of the Art of Computer Programming series by Knuth.
Theory
A grasp of theory is a prerequisite to research in graduate school.
掌握理论是研究生学习的前提。
Theory is invaluable when it provides hard boundaries on a problem (or when it provides a means of circumventing what initially appear to be hard boundaries).
当理论为一个问题提供了硬性边界时(或者当它提供了一种绕过最初看起来是硬性边界的方法时),它是无价的。
Computational complexity can legitimately claim to be one of the few truly predictive theories in all of computer “science.”
计算复杂性可以合理地声称是所有计算机“科学”中为数不多的真正可预测的理论之一。
A computer scientist must know where the boundaries of tractability and computability lie. To ignore these limits invites frustration in the best case, and failure in the worst.
计算机科学家必须知道易处理性和可计算性的界限在哪里。 忽略这些限制会在最好的情况下导致挫败感,而在最坏的情况下会导致失败。
Specific recommendations
At the undergraduate level, theory should cover at least models of computation and computational complexity.
在本科阶段,理论至少应涵盖计算模型和计算复杂性。
Models of computation should cover finite-state automata, regular languages (and regular expressions), pushdown automata, context-free languages, formal grammars, Turing machines, the lambda calculus, and undecidability.
计算模型应涵盖有限状态自动机,正则语言(和正则表达式),下推自动机,无上下文语言,形式语法,图灵机, lambda演算和不确定性。
At the undergraduate level, students should learn at least enough complexity to understand the difference between P, NP, NP-Hard and NP-Complete.
在本科阶段,学生应至少学习足够的复杂性,以理解P,NP,NP-Hard和NP-Complete之间的差异。
To avoid leaving the wrong impression, students should solve a few large problems in NP by reduction to SAT and the use of modern SAT solvers.
为了避免给学生留下错误的印象,学生应该通过简化成SAT和使用现代SAT解算器来解决NP中的一些大问题。
Recommended reading
Introduction to the Theory of Computation by Sipser.
Computational Complexity by Papadimitriou.
Algorithms by Sedgewick and Wayne.
Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein.

Architecture 体系结构

There is no substitute for a solid understanding of computer architecture.
对计算机体系结构的深刻理解无可替代。
Computer scientists should understand a computer from the transistors up.
计算机科学家应该从晶体管上了解计算机。
The understanding of architecture should encompass the standard levels of abstraction: transistors, gates, adders, muxes, flip flops, ALUs, control units, caches and RAM.
对体系结构的理解应该包括标准的抽象层次:晶体管,门,加法器,多路复用,触发器,ALU,控制单元,高速缓存和RAM。
An understanding of the GPU model of high-performance computing will be important for the foreseeable future.
在可预见的将来,对高性能计算的GPU模型的理解将非常重要。
Specific recommendations
A good understanding of caches, buses and hardware memory management is essential to achieving good performance on modern systems.
充分了解高速缓存,总线和硬件内存管理对于在现代系统上实现良好性能至关重要。
To get a good grasp of machine architecture, students should design and simulate a small CPU.
为了更好地掌握计算机体系结构,学生应该设计和模拟一个小型CPU。
Recommended reading
nand2tetris, which constructs a computer from the ground up.
nand2tetris,它从头开始构造一台计算机。
Computer Organization and Design by Patterson and Hennessy.
“What every programmer should know about memory” by Drepper.

Operating systems 操作系统

Any sufficiently large program eventually becomes an operating system.
任何足够大的程序最终都会变成一个操作系统。
As such, computer scientists should be aware of how kernels handle system calls, paging, scheduling, context-switching, filesystems and internal resource management.
因此,计算机科学家应该了解内核如何处理系统调用、分页、调度、上下文切换、文件系统和内部资源管理。
A good understanding of operating systems is secondary only to an understanding of compilers and architecture for achieving performance.
为了实现性能。对操作系统的良好理解仅次于对编译器和体系结构的理解。
Understanding operating systems (which I would interpret liberally to include runtime systems) becomes especially important when programming an embedded system without one.
当对没有嵌入式系统进行编程时,理解操作系统(我将宽泛地解释为包括运行时系统)变得尤为重要。
Specific recommendations
具体建议
It’s important for students to get their hands dirty on a real operating system. With Linux and virtualization, this is easier than ever before.
对学生来说,在真正的操作系统上动手是很重要的。有了Linux和虚拟化,这比以往任何时候都要容易。
To get a better understanding of the kernel, students could:
为了更好地了解内核,学生可以:
print “hello world” during the boot process;
在启动过程中打印“ hello world”;
design their own scheduler;
设计自己的调度程序;
modify the page-handling policy; and create their own filesystem.
修改页面处理策略; 并创建自己的文件系统。
Recommended reading
Linux Kernel Development by Love.

Networking 网络

Given the ubiquity of networks, computer scientists should have a firm understanding of the network stack and routing protocols within a network.
考虑到网络的普遍性,计算机科学家应该对网络中的网络堆栈和路由协议有深刻的了解。
The mechanics of building an efficient, reliable transmission protocol (like TCP) on top of an unreliable transmission protocol (like IP) should not be magic to a computer scientist. It should be core knowledge.
在不可靠的传输协议(例如IP)之上构建高效,可靠的传输协议(例如TCP)的机制,对计算机科学家而言应该不是魔术。它应该是核心知识。
Computer scientists must understand the trade-offs involved in protocol design–for example, when to choose TCP and when to choose UDP. (Programmers need to understand the larger social implications for congestion should they use UDP at large scales as well.)
计算机科学家必须了解协议设计中涉及的权衡因素,例如何时选择TCP和何时选择UDP。(如果程序员也大规模使用UDP,则他们需要了解对拥塞的更大社会影响。)
Specific recommendations
Given the frequency with which the modern programmer encounters network programming, it’s helpful to know the protocols for existing standards, such as:
鉴于现代程序员遇到网络编程的频率,了解现有标准的协议会很有帮助,例如:
802.3 and 802.11;
IPv4 and IPv6; and DNS, SMTP and HTTP.
Computer scientists should understand exponential back off in packet collision resolution and the additive-increase multiplicative-decrease mechanism involved in congestion control.
计算机科学家应该了解包冲突解决中的指数退缩以及拥塞控制中涉及的累加增减机制。
Every computer scientist should implement the following:
每个计算机科学家都应实现以下目标:
an HTTP client and daemon;
a DNS resolver and server; and a command-line SMTP mailer.
DNS解析器和服务器;和命令行SMTP邮件程序。
No student should ever pass an intro neworking class without sniffing their instructor’s Google query off wireshark.
任何学生都不得在未通过wireshark嗅探教师的Google查询的情况下通过入门网络课程。
It’s probably going too far to require all students to implement a reliable transmission protocol from scratch atop IP, but I can say that it was a personally transformative experience for me as a student.
要求所有学生在IP上从头开始实现一个可靠的传输协议可能太过分了,但我可以说,作为一名学生,这对我个人来说是一次变革性的经历。
Recommended reading
Unix Network Programming by Stevens, Fenner and Rudoff.

Security 安全

The sad truth of security is that the majority of security vulnerabilities come from sloppy programming. The sadder truth is that many schools do a poor job of training programmers to secure their code.
安全的可悲事实是,大多数安全漏洞来自于草率的编程。更悲哀的事实是,许多学校在培训程序员以确保代码安全方面做得很差。
Computer scientists must be aware of the means by which a program can be compromised.
计算机科学家必须知道破坏程序的方式。
They need to develop a sense of defensive programming–a mind for thinking about how their own code might be attacked.
他们需要培养一种防御性编程意识-一种思考如何攻击自己的代码的思想。
Security is the kind of training that is best distributed throughout the entire curriculum: each discipline should warn students of its native vulnerabilities.
安全性是最好在整个课程中分配的一种培训:每个学科都应警告学生其本身漏洞。
Specific recommendations
At a minimum, every computer scientist needs to understand:
至少,每个计算机科学家都需要了解:
social engineering;
社会工程学;
buffer overflows;
缓冲区溢出;
integer overflow;
整数溢出
code injection vulnerabilities;
代码注入漏洞;
race conditions; and privilege confusion.
race状态; 和特权混乱。
A few readers have pointed out that computer scientists also need to be aware of basic IT security measures, such how to choose legitimately good passwords and how to properly configure a firewall with iptables.
一些读者指出,计算机科学家还需要了解基本的IT安全措施,例如如何选择合法的安全密码以及如何使用iptables正确配置防火墙。
Recommended reading
Metasploit: The Penetration Tester’s Guide by Kennedy, O’Gorman, Kearns and Aharoni.
Metasploit:Kennedy,O’Gorman,Kearns和Aharoni撰写的《渗透测试人员指南》。
Security Engineering by Anderson.

Cryptography 密码学

Cryptography is what makes much of our digital lives possible.
密码术使我们的数字生活成为可能。
Computer scientists should understand and be able to implement the following concepts, as well as the common pitfalls in doing so:
计算机科学家应该理解并能够实现以下概念以及这样做的常见陷阱:
symmetric-key cryptosystems;
对称密钥密码系统;
public-key cryptosystems;
公钥密码系统;
secure hash functions;
安全哈希函数;
challenge-response authentication;
挑战响应认证;
digital signature algorithms; and threshold cryptosystems.
数字签名算法;和门限密码系统。
Since it’s a common fault in implementations of cryptosystems, every computer scientist should know how to acquire a sufficiently random number for the task at hand.
由于这是密码系统实现中的常见故障,因此每位计算机科学家都应该知道如何为手头的任务获取足够随机的数字。
At the very least, as nearly every data breach has shown, computer scientists need to know how to salt and hash passwords for storage.
至少,几乎每个数据泄露都表明,计算机科学家需要知道如何对密码进行加盐和哈希处理以进行存储。
Specific recommendations
Every computer scientist should have the pleasure of breaking ciphertext using pre-modern cryptosystems with hand-rolled statistical tools.
每一个计算机科学家都应该有幸用前现代密码系统和手工统计工具破解密文。
RSA is easy enough to implement that everyone should do it.
RSA很容易实现,每个人都应该这样做。
Every student should create their own digital certificate and set up https in apache. (It’s surprisingly arduous to do this.)
每个学生都应该创建自己的数字证书并在apache中设置https。(这样做非常困难。)
Student should also write a console web client that connects over SSL.
学生还应该编写一个通过SSL连接的控制台Web客户端。
As strictly practical matters, computer scientists should know how to use GPG; how to use public-key authentication for ssh; and how to encrypt a directory or a hard disk.
作为严格的实际问题,计算机科学家应该知道如何使用GPG。如何对ssh使用公钥身份验证;以及如何加密目录或硬盘。
Recommended reading
Cryptography Engineering by Ferguson, Schneier and Kohno.

Software testing 软件测试

Software testing must be distributed throughout the entire curriculum.
软件测试必须分布在整个课程中。
A course on software engineering can cover the basic styles of testing, but there’s no substitute for practicing the art.
一门关于软件工程的课程可以涵盖测试的基本风格,但是没有什么可以代替实践这门艺术。
Students should be graded on the test cases they turn in.
应该给学生上交的测试用例打分。
I use test cases turned in by students against all other students.
我使用学生提交的测试用例来对抗所有其他学生。
Students don’t seem to care much about developing defensive test cases, but they unleash hell when it comes to sandbagging their classmates.
学生们似乎并不太在意开发防御性测试用例,但是当涉及到给同学打沙包时,他们会释放地狱。

User experience design 用户体验设计

Programmers too often write software for other programmers, or worse, for themselves.
程序员经常为其他程序员编写软件,或者更糟的是为自己编写软件。
User interface design (or more broadly, user experience design) might be the most under appreciated aspect of computer science.
用户界面设计(或更广泛地说,是用户体验设计)可能是计算机科学中最未被重视的方面。
There’s a misconception, even among professors, that user experience is a “soft” skill that can’t be taught.
即使是在教授中,也存在一个误解,即用户体验是一种无法教授的“软”技能。
In reality, modern user experience design is anchored in empirically-wrought principles from human factors engineering and industrial design.
在现实中,现代用户体验设计是建立在人类因素工程和工业设计的经验性原则基础上的。
If nothing else, computer scientists should know that interfaces need to make the ease of executing any task proportional to the frequency of the task multiplied by its importance.
如果没有其他事情,计算机科学家应该知道接口需要使执行任何任务的难易程度与任务的频率乘以其重要性成正比。
As a practicality, every programmer should be comfortable with designing usable web interfaces in HTML, CSS and JavaScript.
实际上,每个程序员都应该熟悉用HTML,CSS和JavaScript设计可用的Web界面。
Recommended reading
Paul Graham’s essay on Web 2.0.
“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets” by Spolsky.
Spolsky的“每个软件开发人员绝对,肯定地必须绝对了解Unicode和字符集”。
HTML and CSS: Design and Build Websites by Duckett.
JavaScript: The Definitive Guide by Flanagan.

Visualization 可视化

Good visualization is about rendering data in such a fashion that humans perceive it as information. This is not an easy thing to do.
良好的可视化是指以一种人类认为是信息的方式呈现数据。这不是一件容易的事。
The modern world is a sea of data, and exploiting the local maxima of human perception is key to making sense of it.
现代世界是数据的海洋,利用人类感知的局部最大值是理解数据的关键。
Recommended reading
The Visual Display of Quantitative Information by Tufte.
Tufte的可视化定量信息显示。

Parallelism 平行性

Parallelism is back, and uglier than ever.
并行主义又回来了,而且比以往任何时候都要丑陋。
The unfortunate truth is that harnessing parallelism requires deep knowledge of architecture: multicore, caches, buses, GPUs, etc.
不幸的事实是,利用并行性需要深入了解架构:多核,缓存,总线,GPU等。
And, practice. Lots of practice.
而且,练习。很多练习。
Specific recommendations
It is not at all clear what the “final” answer on parallel programming is, but a few domain-specific solutions have emerged.
目前尚不清楚并行编程的“最终”答案是什么,但是出现了一些特定于领域的解决方案。
For now, students should learn CUDA and OpenCL.
现在,学生应该学习CUDA和OpenCL。
Threads are a flimsy abstraction for parallelism, particularly when caches and cache coherency are involved. But, threads are popular and tricky, so worth learning. Pthreads is a reasonably portable threads library to learn.
线程是并行性的脆弱抽象,特别是当涉及到缓存和缓存一致性时。但是,线程很流行而且很棘手,因此值得学习。Pthreads是一个值得学习的可移植线程库。
For anyone interested in large-scale parallelism, MPI is a prerequisite.
对于任何对大规模并行性感兴趣的人,MPI是先决条件。
On the principles side, it does seem that map-reduce is enduring.
从原则上讲,map-reduce似乎是持久的。

Software engineering 软件工程

The principles in software engineering change about as fast as the programming languages do.
软件工程中的原理变化与编程语言一样快。
A good, hands-on course in the practice of team software construction provides a working knowledge of the pitfalls inherent in the endeavor.
团队软件构建实践中的良好动手课程可提供有关该工作固有的陷阱的实用知识。
It’s been recommended by several readers that students break up into teams of three, with the role of leader rotating through three different projects.
几位读者建议将学生分成三个小组,在三个不同的项目中轮流担任领导者的角色。
Learning how to attack and maneuver through a large existing codebase is a skill most programmers will have to master, and it’s one best learned in school instead of on the job.
学习如何通过现有的大型代码库进行攻击和操纵是大多数程序员必须掌握的一项技能,这是在学校而不是在工作中学习的最好的方法。
Specific recommendations
All students need to understand centralized version control systems like svn and distributed version control systems like git.
所有学生都需要了解集中式版本控制系统(如svn)和分布式版本控制系统(如git)。
A working knowlege of debugging tools like gdb and valgrind goes a long way when they finally become necessary.
当最终需要使用诸如gdb和valgrind之类的调试工具时,他们会掌握很多种知识。
Recommended reading
Version Control by Example by Sink.

Formal methods 形式化方法

As the demands on secure, reliable software increase, formal methods may one day end up as the only means for delivering it.
随着对安全、可靠软件需求的增加,形式化方法终有一天会成为交付它的唯一手段。
At present, formal modeling and verification of software remains challenging, but progress in the field is steady: it gets easier every year.
当前,正式的软件建模和验证仍然具有挑战性,但是该领域的进展是稳定的:每年都变得越来越容易。
There may even come a day within the lifetime of today’s computer science majors where formal software construction is an expected skill.
在当今计算机科学专业的一生中,甚至有一天,正式的软件构建是一项预期的技能。
Every computer scientist should be at least moderately comfortable using one theorem prover. (I don’t think it matters which one.)
每个计算机科学家都应该至少对使用一个定理证明器感到满意。(我认为哪一个都不重要。)
Learning to use a theorem prover immediately impacts coding style.
学习使用定理证明器会立即影响编码风格。
For example, one feels instinctively allergic to writing a match or switch statement that doesn’t cover all possibilities.
例如,一个人本能地对写一个不包含所有可能性的匹配或切换语句过敏。
And, when writing recursive functions, users of theorem provers have a strong urge to eliminate ill-foundedness.
而且,在编写递归函数时,定理证明器强烈希望消除过分的基础。
Recommended reading
Software Foundations.
Graphics and simulation
图形与模拟
There is no discipline more dominated by “clever” than graphics.
没有比“图形”更受“聪明”支配的学科。
The field is driven toward, even defined by, the “good enough.”
这个领域被推向,甚至被定义为“足够好”
As such, there is no better way to teach clever programming or a solid appreciation of optimizing effort than graphics and simulation.
因此,没有比图形和仿真更好的方法来教授聪明的编程或对优化工作的深刻理解。
Over half of the coding hacks I’ve learned came from my study of graphics.
我学到的编码黑客中有一半以上来自图形研究。
Specific recommendations
Simple ray tracers can be constructed in under 100 lines of code.
简单的光线跟踪器可以用不到100行代码来构造。
It’s good mental hygiene to work out the transformations necessary to perform a perspective 3D projection in a wireframe 3D engine.
做好线框图3D引擎中的透视3D投影所需的转换,这是良好的心理卫生。
Data structures like BSP trees and algorithms like z-buffer rendering are great examples of clever design.
诸如BSP树之类的数据结构和诸如z-buffer渲染之类的算法都是巧妙设计的绝佳示例。
In graphics and simulation, there are many more.
在图形和模拟中,还有更多。
Recommended reading
Mathematics for 3D Game Programming and Computer Graphics by Lengyel.
Lengyel编写的3D游戏编程和计算机图形学数学。

Robotics 机器人技术

Robotics may be one of the most engaging ways to teach introductory programming.
机器人技术可能是教授入门编程最吸引人的方法之一。
Moreover, as the cost of robotics continues to fall, thresholds are being passed which will enable a personal robotics revolution.
此外,随着机器人技术成本的持续下降,正在超越阈值,这将使个人机器人技术发生革命。
For those that can program, unimaginable degrees of personal physical automation are on the horizon.
对于那些可以编程的人来说,难以想象的个人物理自动化程度即将到来。
Related posts
Multitouch gesture control for a robot.
机器人的多点触控手势控制。

Artificial intelligence 人工智能

If for no other reason than its outsized impact on the early history of computing, computer scientists should study artificial intelligence.
如果除了对计算的早期历史产生巨大影响之外,计算机科学家应该研究人工智能。
While the original dream of intelligent machines seems far off, artificial intelligence spurred a number of practical fields, such as machine learning, data mining and natural language processing.
尽管智能机器的最初梦想似乎遥不可及,但人工智能刺激了许多实际领域,例如机器学习,数据挖掘和自然语言处理。
Recommended reading
Artificial Intelligence by Russell and Norvig.

Machine learning 机器学习

Aside from its outstanding technical merits, the sheer number of job openings for “relevance engineer,” indicates that every computer scientist should grasp the fundamentals of machine learning.
除了出色的技术优点外,“相关工程师”的空缺职位数量众多,这表明每位计算机科学家都应掌握机器学习的基础知识。
Machine learning doubly emphasizes the need for an understanding of probability and statistics.
机器学习加倍强调了对概率和统计数据的理解的需求。
Specific recommendations
At the undergraduate level, core concepts should include Bayesian networks, clustering and decision-tree learning.
在本科阶段,核心概念应包括贝叶斯网络,聚类和决策树学习。
Recommended reading
Machine Learning by Mitchell.

Databases 数据库

Databases are too common and too useful to ignore.
数据库太普通了,太有用了,无法忽略。
It’s useful to understand the fundamental data structures and algorithms that power a database engine, since programmers often enough reimplement a database system within a larger software system.
理解驱动数据库引擎的基本数据结构和算法是很有用的,因为程序员通常会在大型软件系统中重新实现数据库系统。
Relational algebra and3stand out as exceptional success stories in sub-Turing models of computation.
在子图灵计算模型中,关系代数和关系演算是出色的成功案例。
Unlike UML modeling, ER modeling seems to be a reasonable mechanism for visualing encoding the design of and constraints upon a software artifact.
与UML建模不同,ER建模似乎是一种可视化的机制,用于可视化对软件工件的设计和约束进行编码。
Specific recommendations
A computer scientist that can set up and operate a LAMP stack is one good idea and a lot of hard work away from running their own company.
可以设置和操作LAMP堆栈的计算机科学家是一个好主意,并且要远离自己的公司就需要大量艰苦的工作。
Recommended reading
SQL and Relational Theory by Date.
SQL和按日期的关系理论。
Non-specific reading recommendations
非特定阅读建议
Gödel, Escher, Bach by Hofstadter.
Nick Black’s advice for MS students.
What else?
My suggestions are limited by blind spots in my own knowledge.

What have I not listed here that should be included?
我的建议受到我所知的盲点的限制。
Related posts
相关文章
HOWTO: Get tenure
Parsing BibTeX into S-Expressions, JSON, XML and BibTeX
PAANDA: An NDA for academics
College tips, tricks and hacks
Tips for defending a Ph.D.
HOWTO: Respond to peer reviews
12 resolutions for grad students
HOWTO: Peer review scientific work
Electric meat
Peer fortress: The scientific battlefield
The shape of your problem
6 tips for low-cost academic blogging
The illustrated guide to a Ph.D.
The CRAPL: An open source license for academia
Why peer reviewers should use TOR
Academic job hunt advice

你可能感兴趣的:(程序员)