最近帮弟弟选高考志愿专业,最后敲定计算机类专业(计算机科学与技术、软件工程、网络工程)。和主席在一起的时候就聊起了以前也经常聊的话题:计算机该如何学习?把这个问题的讨论记录下来,给自己深入学习指明方向,也给后来学习计算机的人一个方向。主席本科网络工程、研究生计算机技术,到现在计算机领域学习了6年。他自己说本科完全是被逼着、被动学习计算机;终于在研究生期间找到自己的学习方向,为他庆幸。而我,高中文科、大学非计算机专业理科、中途转行跨专业进入计算机领域学习软件工程工科,相信在回答如何从一个完全不懂计算机的门外汉到进入这个领域学习并不断深入研究,算是有一些自己的想法和理解;也能理解那些在学习过程中的困惑与迷惘。希望我们之间的闲谈、思想经验碰撞的火花能够提供给各位学习计算机一些启迪。
先放上一张学习计算机的思维导图:
如果在学习一个新知识体系前,就已经了解了这个知识的产生的原因、发展历程,那么对于学习肯定有帮助。如果一上来就讲解譬如分布式事务的CAP、BASE、两阶段提交等理论知识,而不是先讲解这个的产生以及发展或者说对你来说有什么用。我想,对于大部分没有了解过这个的来说,肯定会觉得枯燥、进而产生逆反心理;如果不是为了考试,我想一下课就恨不得还给老师。
譬如解释为什么苹果机运行流畅,而安卓机越用越卡的问题。原因是安卓基于Linux的宏内核、为了兼容各种配置的手机,代码需要跨平台,需要使用虚拟机解决这个问题。通过使用虚拟机翻译应用程序为机器码来运行。并且由于需要做内存管理,虚拟机需要做内存碎片化整理,这个时候整个系统都会卡顿一会。即使安卓通过优化提高系统运行速度,但是这个本质不会变。而苹果手机因为其封闭性,不用考虑兼容,应用程序直接翻译成高效的机器码来运行,并且苹果可以提供高效率的底层API给APP开发者调用,不用经过虚拟机的环节,每发布一个新机器就可以针对新机器进行优化,系统运行流畅度可以得到显著提高。这就是为什么“苹果机越升级越卡,安卓机越升级越流畅”的来历。如果你使用的还是当年诺基亚的功能机,根本没有接触这些手机。你就会想:教我这些有何用?只有真的用起来卡顿,才会有亲身体会,才会觉得学习这些真的有用。同样的对于一个完全没接触过类似知识或者没有碰到需要这些知识解决问题的场景,那么学这些到底有何用?
所以基于这样的思路,对于刚进入大学学习计算机专业的学生来说,我和主席认为大致的安排可以这样:
- 第一阶段(一年):先学习应用于“上层”、可以交互的语言,比如Java、Python,做一两个网站或者爬虫,学会集成开发工具(IDE)的使用,能够解决常见的bug,积累一些获取相关知识的网站、论坛,懂得如何通过搜索引擎解决自己遇到的问题(使用Google),对计算机有一个感性的认识,培养自己的成就感。
- 第二阶段(一年半):通过一年的学习,已经大概知道计算机的运行方式了。只不过到目前来讲,计算机相对来说还是一个黑盒:只知道这样子输入进去、会得到那样的结果,至于为什么会这样、中间程序出现了问题如何定位等等这些可能就不那么清楚了。如果只是停留在这一阶段,估计最终的结果就是面向搜索引擎、面向github编程。不生产代码、只做代码的搬运工了。所以这一阶段,需要深入学习计算机核心原理:包括操作系统(应用程序是跑在操作系统之上的,了解了操作系统原理,从而能够设计出优秀的代码;并且操作系统里面的很多思想也可以借鉴到解决其他问题中去)、计算机网络(计算机间数据如何通信的问题)、算法与数据结构(解决问题、提高计算效率的必备,而不是每次都是用暴力求解;同时学习这门课程,你会为有些算法思想的设计而感叹精妙绝伦)、数据库(数据存储的仓库,如今的计算机系统没有一个能够离开数据库的)、分布式(随着计算机成本的下降而对系统计算力的要求越来越高,计算机系统从过去的工作站、单机步入到大规模廉价的分布式集群。这涉及到分布式存储——数据库、计算机之间的通信——网络、节点之间的设计如数据热点等问题——算法以及操作系统的支持,几乎设计到计算机核心知识的方方面面)等。通过学习这些,知道计算机是如何运作的;并且学习前辈为了解决一个问题设计的算法和数据结构,从而举一反三,把这些思想用到解决自己的问题当中。
- 第三阶段(半年):通过前面两年半的学习,已经对计算机有深入的理解了,这个时候再来学习晦涩难懂的编译原理等课程,也就有了更好的基础,而不是囫囵吞枣式的学习。
可以看出来,学习方向是自上而下学习的。从最开始的计算机语言到最底层的编译原理等,我觉得这样的学习路线可以为大多数人所接受而不是一开始学习就产生抗拒心理或者觉得发出——“计算机太难了”的感慨。
关于第一和第二阶段之间的过渡,引用之前微博上一位工作过人所提出的问题:
无头苍蝇说明的事实是:一方面业务代码已经很熟悉了,但是工作中碰到了目前所掌握的技术无法解决问题的焦虑。也就是说:功夫中的剑法已经很熟练了,但是内功不够。而想成为技术大神,必须苦练内功。而对于计算机的内功就是:计算机系统、网络、算法和数据结构,以及现在流行的分布式技术。独孤九剑很精湛,但是没有吸星大法的令狐冲照样不能持久。
优秀的计算机类书籍:
- Java/C/C++:《深入理解Java虚拟机》、《Java并发编程实战》、《C程序设计语言》、《C++ Primer 中文版(第 5 版)》
- 架构:《大型网站技术结构:核心原理与案例分析》、《高可用架构(第1卷)》、《企业应用架构模式》
- 操作系统:《深入理解计算机系统》、《UNIX环境高级编程》
- 计算机网络:《计算机网络(第5版)》、《Wireshark网络分析就这么简单》、《TCP/IP详解 卷1:协议》
- 算法与数据结构:算法竞赛入门经典(第2版)、LeetCode刷题、《剑指Offer》、《数据结构与算法分析:Java语言描述》、《数据结构与算法分析:C语言描述》、《算法设计与分析基础》
- 计算机组成原理:《编码 : 隐匿在计算机软硬件背后的语言》
- 科普及其他:《码农翻身》、《计算机是怎样跑起来的》、《网络是怎样连接的》、《程序是怎样跑起来的》、《黑客与画家 : 来自计算机时代的高见》、《人月神话》
- 英语:《六级词汇》、《红宝书·考研英语词汇》、《考研词汇速记指南》(为什么计算机类书籍中有英语?连编程语言都是用英语写的,更不用说浩如瀚海的英文doc、编程语言源码中的英文注释以及英文论坛、论文了。学习计算机要学习英语的重要性就不用再强调了吧。)
- 书籍列表持续更新……
参考: