新手关于如何看编程经典书的一些疑惑?
很多学计算机的朋友,都有类似的困惑:我学了计算机专业,怎么还是做不出网站、软件、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》,或者用Codecademy,学会基本操作。然后找一些作品,比如WordPress,和它的一些经典模板,去看别人是怎么做的。然后,你就可以自己设计一个小网站,尝试把它做出来。不用等什么都学会了再开始做。做的过程中,你遇到什么障碍,再有针对性地去学习和解决。这种边实践边学习的模式,才是学技术的正确思路,这跟搞理论研究的思路是不一样的。
最后,再跟你说两个题外话。
第一,这几本书,就是大学教材而已,没有那么神。我们以前搞OI,初三就把《算法导论》的习题做得滚瓜烂熟,也就算是入个门,从地下室来到地面的水平。只是有人刚来到地面,就跟你大谈“会当凌绝顶”、“程序员世界的高富帅”什么的,这个不至于的,没必要激动。
第二,我面试过一个前端,问他最喜欢什么书,他说TAOCP,连QQ签名都是“只盼TAOCP出第五卷”。我问这对前端有何帮助,他说这是内功。后来考查写代码,他写不出来,说这个不是内功,而他擅长内功。我说那你先证明一下辗转相除法吧,他又强调他擅长的是计算机内功,而不是数学。但其实这个证明,就是TAOCP第一卷、第一章的第一道例题。
作者:苏椰
文章源自:知乎
原文地址:http://www.zhihu.com/question/26157282
共同学习,写下你的评论
评论加载中...
作者其他优质文章