这是为一个知乎问题的答案。

大学是系统性地学习基本原理的时候,没有必要追逐最新最流行的编程语言和开发框架,毕竟到了毕业工作的时候往往又有很多新的变化。把基本的知识体系掌握好会终身受用无穷。大学只是提供环境和条件,学习的方向和重点需要自己把握。下面这几方面对于本科生是尤其重要的。

计算机体系结构:这是理解计算机工作原理的基础,即使以后只做软件方面的工作,这方面的知识也是至关重要的。一方面软件运行在硬件上,理解计算机各部分的工作原理以及他们之间的通信机制对于代码优化和系统级的软件开发都是必须的;另一方面硬件只不过是石化的软件,软硬件不过是逻辑组合的不同实现方式而已。很多美国大学的这门课程都会让学生用代码把一台虚拟计算机实现出来,这确实是个好办法。

操作系统:所有做软件开发的人都需要对进程、线程、内存的管理有清楚的理解。操作系统为在计算机上运行多个应用程序提供基础,Docker 等这些现在流行的技术也无非是把操作系统提供的机制和工具进行了封装而已。

编译原理:编译原理让你理解程序在运行的时候具体在做什么。只有能把高级语言的每条语句在大脑中映射到 CPU、寄存器、内存里栈和堆的具体操作,才能写出高效、错误少的代码。每个计算机专业的学生都应该尝试自己实现一个语言。

一门系统编程语言(C/C++):C 语言仍然是最好的用来学习编程的语言。它在语言层面的概念比较少,容易比较快地把注意力从语法转到程序设计上。同时由于 C 在标准库里没有提供现成的容器,所以不可避免地需要学习如何实现基本的数据结构:不同类型的链表、队列、字典等,在实现这些结构的时候又不可避免地要熟悉指针操作和递归。虽然在日常软件开发中很少会需要自己实现这些容器,但是理解他们的实现和性能特点可以避免你用 Java 之类的语言时什么都用 Vector 来做。在熟悉 C 之后可以学一下 C++。C++ 之所以复杂,在于它将控制权交到了程序员手里。其他的主流面向对象语言里之所以没有 virtual function 等 C++ 特有的概念,是因为在语言层面已经帮程序员做了选择,虽然降低了语言复杂度,但是也导致不能总得到最好的性能。深入学习 C++ 可以让程序员了解面向对象特性的底层实现以及它们在编译时和运行时的开销,这对于使用其他语言也是很有帮助的。

算法、数据结构:如果你将来做系统软件开发,将会需要自己做一些算法的实现。即使是做应用软件开发,也需要在这方面有足够的知识来权衡不同的选择。虽然现代的高级语言大多提供了丰富的容器、算法函数、中间件等等,只有理解他们的性能特征和资源代价才能作出好的选择。

一门学科的知识体系就好像大脑中的一个架子,一开始搭建它的时候会感觉是个很慢的过程。但是如果你耐心地把它建立起来,再学习新的东西就会知道该把新吸收的知识放在什么位置,它和架子上现有的内容是如何联系的,在理解、记忆、应用上都会事半功倍。