小儿咳嗽吃什么药好| 艮什么意思| 糖类抗原153是什么| 玄猫是什么猫| 针灸后需要注意什么| 什么叫静息心率| 痛风什么药止痛最快| 下面有味道用什么药| 我不知道你在说什么英文| 1912年属什么生肖| 幽门螺旋杆菌什么症状| 释怀和释然有什么区别| 结节状高密度影是什么意思| 玄胡又叫什么| 秋天喝什么茶| 高铁不能带什么| 什么是正方形| 手足口病是什么病| 为什么海水是咸的| 夫人是什么生肖| u1是什么意思| 什么是双向情感障碍| 禁忌症是什么意思| abs是什么材质| 余字五行属什么| 膝盖响是什么原因| 什么是云母| 1600年是什么朝代| 小猫吃什么东西| 真好是什么意思| 心脏跳的快什么原因| 你的书包里有什么英文| 杨花是什么| 导管室是干什么的| 嘴苦口臭是什么原因造成的| 牙出血什么原因| 中国什么武器世界第一| 嗨体水光针有什么功效| 枫叶什么颜色| 什么是乙肝| 淋巴细胞浸润是什么意思| 车前草的作用是什么| 狂犬疫苗打在什么部位| 胸腔积液叩诊什么音| 子宫出血什么原因| 梦见自己大肚子怀孕是什么意思| 为什么精子是黄色的| 梦到捡金子首饰是什么意思| 弥散是什么意思| 仙姑是什么意思| 嗓子疼喝什么茶最有效| 绿豆不能和什么一起吃| 为什么白带是绿色| 月痨病是什么病| edp是什么意思| 背痛是什么原因引起的| 3885是什么罩杯| 细菌性结膜炎用什么眼药水| 小儿流鼻涕吃什么药好| 月经不调挂什么科室| 扫地僧是什么意思| 249是什么意思| 头眩晕吃什么药| 嘴唇肿起来一般是什么原因引起的| 什么人不能喝大麦茶| 为什么眼睛会红| 真命天子是什么生肖| 有什么好吃的家常菜| 羊水偏多是什么原因| 精神科主要看什么病| 韭菜有什么功效| 一刻是什么意思| 栓是什么意思| 薏米是什么米| 梦见小女孩是什么意思| 口僻是什么病| 8月5日是什么星座| 高铁二等座是什么意思| 装垃圾的工具叫什么| 梦见鱼是什么预兆| 肾阴虚火旺吃什么药| 转音是什么意思| 侄子是什么关系| 什么是体脂率| 食道肿瘤有什么症状| 孟姜女姓什么| 不来例假也没怀孕是什么原因| 马齿苋吃了有什么好处| 脂肪肝中医叫什么名字| 延字五行属什么| 前方起飞是什么意思| 母亲节送妈妈什么礼物好| 扬长避短什么意思| 手指关节发黑是什么原因| 玉米有什么营养价值| 肛门疼痛是什么原因引起的| 怀孕前三个月为什么不能告诉别人| 心识是什么意思| 脱肛是什么意思| 右下腹是什么器官| 心脏看什么科| 新生儿痤疮用什么药膏| 非萎缩性胃炎伴糜烂是什么意思| 上司是什么意思| 窦性心律过速是什么意思| 扬长避短什么意思| 男属蛇和什么属相最配| 元帅是什么生肖| 疱疹是什么症状| 少字加一笔是什么字| 军绿色是什么颜色| 浑什么意思| 普渡众生是什么意思| 孕妇喝什么牛奶对胎儿好| 水淀粉是什么东西| 皮肤长小肉粒是什么原因| 切莫是什么意思| 嗓子干吃什么药| 嗓子痒咳嗽吃什么药| 轱辘是什么意思| 三碘甲状腺原氨酸高是什么意思| 女人胯骨疼是什么原因| 鸟字旁的字大多和什么有关| 高压偏低有什么危害| ricoh什么牌子| 什么是交际花| 尿蛋白三个加号吃什么药| 三十三天都是什么天| 风花雪月是什么意思| 腥臭味是什么妇科病| 异禀是什么意思| 扁桃体发炎吃什么好得快| 拜阿司匹林什么时间吃最好| 火烧是什么食物| 莲子是什么| 肾气不足有什么症状| bpc是什么意思| 瓜子脸适合剪什么刘海| 1997年出生的属什么| 桑葚泡水喝有什么功效| 小学教师需要什么学历| 无味是什么意思| 什么的浪花| 秋葵和什么不能一起吃| 驾驶证照片是什么底色| 绝膑而亡是什么意思| 结界是什么意思| 痔疮应该挂什么科室| 梦见鸡是什么意思| 翡翠a货是什么意思| 女性阳性是什么病| 咳嗽吐黄痰是什么原因| 星期天为什么不叫星期七| 省政协主席什么级别| 尿素偏高是什么意思| 丁香是什么| 血栓的症状是什么| 柳丁是什么水果| 不良反应是什么意思| 卡介苗为什么会留疤| bpa是什么材料| 什么的仪式| 什么食物吃了会胀气| 枇杷什么味道| 足金是什么意思| 晚上为什么不能剪指甲| 为什么胸一碰就疼| 鱼腥草泡水喝有什么功效| 骨折吃什么恢复得快| 水便分离的原因是什么| 梦见前男友结婚了是什么征兆| 规律是什么意思| mrv是什么检查| 皮上长小肉疙瘩是什么| 党的性质是什么| 孕吐是什么原因造成的| 高就什么意思| 查雌激素挂什么科| 放大镜不能放大的东西是什么| 八七年属什么生肖| 小猫为什么会踩奶| 为什么头老是晕晕的| 明矾和白矾有什么区别| 胃黏膜病变是什么意思| 凉粉用什么做的| 黄色加红色是什么颜色| 1989年五行属什么| 三点水念什么| 子宫占位是什么意思| 梦见抓鱼是什么意思| 骨骼肌是什么意思| 属鼠的和什么属相不合| 梦见好多死鱼是什么意思| 獭尾肝是什么病| 鼻子发干是什么原因造成的| 为什么明星不激光祛斑| 蜈蚣长什么样子| 酮体是什么意思| 割包皮有什么用| 性冷淡吃什么药| 手指关节痛是什么原因| 农村适合养殖什么| 吃什么好消化| 肌红蛋白是什么意思| 副词是什么意思| 什么颜色加什么颜色等于绿色| 嘴唇暗紫色是什么原因| 头发变棕色是什么原因| rna是什么| 软化耳屎的药水叫什么| 维生素b族有什么用| 右边腰疼是什么原因| 众星捧月是什么意思| 六月属什么生肖| 脚上起水泡用什么药膏| 吃什么预防脑梗| 郑州有什么好玩的景点| 交替是什么意思| 什么什么的眼睛| ep是什么意思| 中旬是什么意思| 蝙蝠长什么样| 为什么手会麻| 考生号是什么| fpa是什么意思| 孕妇胃疼吃什么药| 嗓子沙哑吃什么药| 公历是什么意思| 香菜吃多了有什么坏处| 7.23是什么星座| hpf是什么意思| 白发用什么染发最安全| 女人胃寒吃什么好得快| 十二生肖叫老大是什么生肖| 八字比肩是什么意思| 中午吃什么减肥| 巨蟹座是什么象星座| 精神内科一般检查什么| 自缚是什么意思| 落英缤纷是什么意思| 小便分叉是什么症状| 贫血打什么针效果最好| 手指倒刺是什么原因| 达菲是什么药| 蓝色和红色混合是什么颜色| 尿液检查红细胞高是什么原因| 宝宝吃什么鱼比较好| 胸口闷疼是什么原因| 黑藻是什么植物| 室上速是什么原因导致的| 歪理是什么意思| 代沟是什么意思| 组cp是什么意思| 做馒头用什么面粉好| 什么是心脏病| 经常流鼻血是什么原因| 项羽是什么生肖| 女生来大姨妈要注意什么| 湿气重的人喝四物汤会有什么| 什么是鸡尾酒| 淡紫色配什么颜色好看| 舌头疼挂什么科| 吃什么健脾胃除湿气| 垂涎欲滴意思是什么| 百度

先兆流产是什么原因

[article index] [] [@mattmight] [rss]
百度 2017年杭州印发了《流动人口随迁子女在杭州市区接受学前教育和义务教育管理办法(试行)的通知》。

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

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).

Contributions to open source should be linked and documented.

A code portfolio allows employers to directly judge ability.

GPAs and resumes do not.

Professors should design course projects to impress on portfolios, and students, at the conclusion of each course, should take time to update them.

Examples

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.)

For producing beautiful mathematical documentation, LaTeX has no equal. All written assignments in technical courses should be submitted in LaTeX.

Recommended reading

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

The Unix philosophy

Computer scientists should be comfortable with and practiced in the Unix philosophy of computing.

The Unix philosophy (as opposed to Unix itself) is one that emphasizes linguistic abstraction and composition in order to effect computation.

In practice, this means becoming comfortable with the notion of command-line computing, text-file configuration and IDE-less software development.

Specific recommendations

Given the prevalence of Unix systems, computer scientists today should be fluent in basic Unix, including the ability to:

  • navigate and manipulate the filesystem;
  • compose processes with pipes;
  • comfortably edit a file with emacs and vim;
  • create, modify and execute a Makefile for a software project;
  • write simple shell scripts.

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:

  • Find the five folders in a given directory consuming the most space.
  • Report duplicate MP3s (by file contents, not file name) on a computer.
  • 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.
  • 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.

Recommended reading

Systems administration

Some computer scientists sneer at systems administration as an "IT" task.

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.
  • Configure and compile the Linux kernel.
  • Troubleshoot a connection with dig, ping and traceroute.
  • Compile and configure a web server like apache.
  • Compile and configure a DNS daemon like bind.
  • Maintain a web site with a text editor.
  • Cut and crimp a network cable.

Recommended reading

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.

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.

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.

If taught correctly, Lisp liberates.

Recommended reading

ANSI C

C is a terse and unforgiving abstraction of silicon.

C remains without rival in programming embedded systems.

Learning C imparts a deep understanding of the dominant von Neumann architecture in a way that no other language can.

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.

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.

As the native language of the web, its pragmatic advantages are unique.

Recommended reading

Squeak

Squeak is a modern dialect of Smalltalk, purest of object-oriented languages.

It imparts the essence of "object-oriented."

Recommended reading

Java

Java will remain popular for too long to ignore it.

Recommended reading

Standard ML

Standard ML is a clean embodiment of the Hindley-Milner system.

The Hindley-Milner type system is one of the greatest (yet least-known) achievements in modern computing.

Though exponential in complexity, type inference in Hindley-Milner is always fast for programs of human interest.

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

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.

Recommended reading

Scala

Scala is a well-designed fusion of functional and object-oriented programming languages. Scala is what Java should have been.

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.

Recommended reading

Haskell

Haskell is the crown jewel of the Hindley-Milner family of languages.

Fully exploiting laziness, Haskell comes closest to programming in pure mathematics of any major programming language.

Recommended reading

ISO C++

C++ is a necessary evil.

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

Assembly

Any assembly language will do.

Since x86 is popular, it might as well be that.

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

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

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

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.

At the undergraduate level, students should learn at least enough complexity to understand the difference between P, NP, NP-Hard and 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.

Recommended reading

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.

An understanding of the GPU model of high-performance computing will be important for the foreseeable future.

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.

Recommended reading

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.

To get a better understanding of the kernel, students could:

  • print "hello world" during the boot process;
  • design their own scheduler;
  • modify the page-handling policy; and
  • create their own filesystem.

Recommended reading

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.

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.)

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.

No student should ever pass an intro neworking class without sniffing their instructor's Google query off wireshark.

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.

Recommended reading

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.

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.

Recommended reading

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.

Every student should create their own digital certificate and set up http in apache. (It's surprisingly arduous to do this.)

Student should also write a console web client that connects over SSL.

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.

Recommended reading

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 underappreciated 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.

Recommended reading

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

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.

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.

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.

For anyone interested in large-scale parallelism, MPI is a prerequisite.

On the principles side, it does seem that map-reduce is enduring.

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.

A working knowlege of debugging tools like gdb and valgrind goes a long way when they finally become necessary.

Recommended reading

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

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.

It's good mental hygiene to work out the transformations necessary to perform a perspective 3D projection in a wireframe 3D engine.

Data structures like BSP trees and algorithms like z-buffer rendering are great examples of clever design.

In graphics and simulation, there are many more.

Recommended reading

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

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

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

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 and relational calculus stand 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.

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.

Recommended reading

Non-specific reading recommendations

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


肾结石吃什么药好 什么啊 沙发适合什么发型 领养孩子需要什么条件 大便不通吃什么药
小孩风热感冒吃什么药 外阴有白色的东西是什么 凹儿念什么 南极为什么比北极冷 偏财代表什么
中国的国花是什么花 颠覆三观是什么意思 什么的梨子 流产会出现什么症状 8月1日是什么节
什么上树全靠一张嘴 犟驴是什么意思 什么是用神 999是什么电话 粉盒和硒鼓有什么区别
梦见蒸馒头是什么意思hcv9jop6ns8r.cn 什么人一年只工作一天脑筋急转弯hcv7jop9ns2r.cn 走路脚心疼是什么原因hlguo.com 腰椎疼痛吃什么药hcv9jop5ns8r.cn 牛油果和什么榨汁好喝hcv9jop5ns1r.cn
卵巢囊肿是什么hcv7jop9ns7r.cn 什么的什么是什么的伞hcv9jop6ns3r.cn 克罗恩病吃什么药hcv8jop0ns7r.cn 什么津乐道hcv8jop0ns1r.cn 自给自足是什么意思hcv8jop9ns9r.cn
胃热吃什么hcv8jop1ns5r.cn 几成是什么意思hcv9jop2ns9r.cn 芸豆是什么豆hebeidezhi.com 1点到3点是什么时辰hcv9jop3ns3r.cn dtc什么意思qingzhougame.com
小儿流清鼻涕吃什么药效果好hcv8jop8ns1r.cn 婴儿咳嗽用什么药hcv8jop9ns7r.cn 白粉是什么fenrenren.com 劝君更尽一杯酒的下一句是什么hcv7jop7ns4r.cn 功什么不什么hcv8jop9ns8r.cn
百度