文/苏椰(知乎)
很多学计算机的朋友,都有类似的困惑:我学了计算机专业,怎么还是做不出网站、软件、App?很多人误以为是教材不接轨,因此崇拜国外教材,其实不是那么回事。我尽量详细地答一下,顺便也讲讲计算机科学到底是干什么的。
假如有个同学,受过基本的语文训练,初学写作,梦想成为金庸那样的小说家。他现在想知道,如何提高创作能力,并练习写第一篇小说。这时,有个中文系的大学生路过,面对这位略有稚气的同学,给出了高票答案:
我不认为学生写小说有啥意义。学生,就要沉得下心。你看我懂文学理论,要写小说的时候,哪怕不会组词,有本辞典就能写了。所以你不要浪费时间去搞那些,你要先把文学的本质理解透彻,达到我的境界,就能“会当凌绝顶”。所以你现在应该学习《深入理解现当代诗歌》、《文本的结构和意义的生成》以及《音韵导论》,然后脚踏实地学习 2+ 年,这些才是语言的内功。
这位同学当场被这些华丽的书名击倒,跑到知乎恭恭敬敬提问:
我想写小说,大师给我推荐三本经典,我应该按什么顺序学?学了这些,我能写出什么?
不用觉得滑稽,初学者被高大上的书目击倒是正常的,题主举例的这三本书也确实都是入门经典。但是我们要先搞明白,它们入的是什么门。
CSAPP 《深入理解计算机系统》:
这是 CMU 的“计算机科学导论”的教材。是操作系统入门。(这门课程要求学生有编程基础)
SICP 《计算机程序的构造和解释》:
这是 MIT 的 6.001 课程的教材。是编程语言入门。(这门课在好几年前就改成 Python 了)
CLRS 《算法导论》:
这是 MIT 的 6.006 课程的教材。是算法分析入门。
那么操作系统、编程语言、算法分析又属于什么呢?我们系统地看看,计算机科学到底是干什么的。CS 大体可以分成这么几个大领域:硬件、系统、软件、网络、计算理论、计算方法。
● 硬件—— 数字电路、集成电路、存储器、各种硬件设计和验证方法等。
● 系统—— 计算机架构(指令集、串/并行、网格、云端之类)、嵌入式、实时系统等。
● 软件—— 操作系统、虚拟机、编程语言、软件设计/开发/验证的工具和方法论等。
● 网络—— 计算机网络的架构、协议、组件、路径算法、性能分析等。
● 计算理论—— 可计算性、形式语言和自动机、密码、逻辑、算法分析等。
● 计算方法—— 数值计算、符号计算、并行计算、计算机图形学、人工智能、机器学习等。
你可以按这个提纲,逐个了解一下 CS 是干什么的。但现在可以先看着这些词,大概感受一下。我们再说那三本书:操作系统和编程语言,是软件领域中小领域,而算法分析是计算理论中的小领域,这是那三本书在计算机科学中的位置。它们作为所谓“经典”,入的就是这几个门。现在你知道这几本书是干什么的了,那么你的问题来了:做网站、做 App 又属于这里面的哪个位置?
答案是,哪个也不属于。你看整个计算机科学,研究的都是非常底层或基础的东西,与你说的“现实中的产品开发”,基本上是没有关系的。即使有些名称看着和开发有关,其实也不是一回事。比如这里所说的“编程语言”,就好比语言学,是研究各种语言结构的,而不是教你用语言写作的。你要认识到这一点,这不是教材好坏的问题,而是分工不同。就像天文学不是教你制造望远镜的,机械动力学不是教你开挖掘机的。
那么问题又来了,你现在就想学习做网站、做APP,这是什么?怎么学?哪家强?
实际上,国内大学极少有独立的 CS 专业,都是加个“与技术”,全称叫“计算机科学与技术”。顾名思义,这就包括计算机科学、计算机技术两部分。你想学的这些,就属于那个“与技术”。你想学的是技术方向,别人推荐的却是科学方向的经典,这个就是你困惑的根本原因。
说到这里,我想你应该已经理解了:计算机科学是干什么的,那三本书是干什么的,以及为什么学完了还是做不出来网站和 App。接下来,我想你会问这两个问题:
1、如果我想搞技术,那么学习科学部分还有没有必要?
我的观点是,这不是有没有必要的问题。这两者之间的区别,是追求的目标不同:科学追求尽量深入,探索原理;而技术追求尽量封装,提高效率。各种高级技术都是力求隐藏细节,以提高效率。而你选择学习内容的标准,就看它能否显著提高你的生产力。有些技术高度依赖底层细节或原理,造成了效率瓶颈,就应该学。但具体到 Web、App 开发,最能提高你生产力的,就是那些前/后端框架和脚本,学完了你马上就能做产品,而不是《计算机程序的构造和解释》什么的。
当然,上边有些朋友告诉你,你要学挖掘机,一定要先学机械动力学,否则你就没有内功,永远不可能成为挖掘机高手,机械动力学才是真正的知识,只是现在社会太浮躁,没人愿意花时间学。然而,我并没否认机械动力学的价值,它能让你把挖掘机分析得头头是道,甚至设计制造挖掘机。但是,如果你的目标是开挖掘机,那你就不该这样入门,因为这是两回事。说了这么多,希望你明白了。
2、我现在应该如何提高技术水平?
学技术的关键思路是两点:一个是模仿,一个是边实践边学。比如说学挖掘机,首先你要知道基本操作,然后看别人是怎么开的,最后自己上去开。遇到问题,比如跑偏了,你研究一下,挖掘无力,你再研究一下,弄明白了就继续开。具体到你说的做网站为例,首先你可以看看《Head First HTML5》和《Head First PHP & MySQL》,学会一些基本操作。然后找一些作品,比如 WordPress,和它的一些经典模板,去看别人是怎么做的。然后,你就可以自己设计一个小网站,尝试把它做出来。不用等什么都学会了再开始做。做的过程中,你遇到什么障碍,再有针对性地去学习和解决。这种边实践边学习的模式,才是学技术的正确思路,这跟搞理论研究的思路是不一样的。
本文系作者授权计蒜客发布,如需转载请与作者联系。
领取专属 10元无门槛券
私享最新 技术干货