最近感觉自己在计算机方面有点入门了,而且恰好前几天和研一的新生聚餐,被问道一些所谓的“经验”方面的问题,所以在这里总结一下在前一个阶段自学计算机的一些尝试,也希望给看到这篇博文的自学计算机方面的人一点参考吧。
首先说明一下,自考研到目前为止,自己看过的书籍(这里所指的看过,是几乎都看完了或者看完至少一大半以上,这样我才能对书做一个评价)。
考研考的是东南大学计算机的自主命题935,科目包括数据结构,计组,操作系统。我用的书是根据统招408来的那三本,即:
- 《数据结构(C语言版)》,严蔚敏
- 《计算机组成原理(第二版)》,唐朔飞
- 《计算机操作系统》,汤子瀛
同时参考了程杰所作的那本《大话数据结构》,不过当时没敲代码(这点很不对)。当时备考还用过配套的王道的那三本书,就不一一列出了。
复试是C++笔试,用过的书分别是:
- 《C++程序设计》,谭浩强
- 《C++大学教程(第七版)》,东大指定的那本,书上大部分练习自己敲过一遍
之后研一,看过的书分别有:
- 《Accelerated C++: Practical Programming by Eample中文版》(中文名太别扭了,所以没敲)
- 《深入理解计算机系统(原书第二版)》,即那本大名鼎鼎的CSAPP
- 《C程序设计语言(第2版)》,即C语言设计者的那本K&R经典
- 《C和指针》
- 《人月神话》,软件工程方面的经典
现在正在开始补数据结构算法方面的内容,看的是《数据结构与算法分析——C语言描述(原书第2版)》。
我所经历过的阶段这里也说明一下,如果你也是这些方面的初学者,也许有点参考意义。
- 上网搜集资料,查找经验。网上的推荐书籍有一堆,每个方面的书籍都有很多经典之作,比如计算机入门必看CSAPP啦,C语言是K&R啦,C++是《C++Primer》啦,算法必须看《算法导论》啦,SICP绝对是培养编程思维的神书之类的。总之,网上有浩若烟海的经典书籍是必读的。然后,每本书自己都想细读一番。
- 自己实践。显然,在本科阶段把上面这些书自己研究一遍还有点可能,但是在研究生这个阶段,有了导师给布置的任务,而且还是初学者,不太可能把这些一一翻阅。于是开始找一条收益较高的方案。网上推荐的是快速入门C++看《Accelerated C++》,我也是从这本书开始重新敲C++代码的。同时快速的翻看了一遍《CSAPP》。
- 入门,有了自己的学习方向。这也就是现在了,当然以后的方向可能还有变化,不过确实现在感觉对计算机编程方面自学有了一点感悟了。
如果你也是初学者,我的一些建议是:
- 看书尽量找国外书籍看,国内的书籍大多数不适合自学。
- 如果你的基础确实不太多,可以从以下思路考虑:一门编程语言,数据结构和算法,操作系统,计算机网络。当然,这个更多的是针对互联网企业的后台开发岗位吧,确实我对前端和APP开发不了解。
- 每个方向的书籍两本就好,一般书籍的侧重可能不同,交叉着看能帮助理解。如果书籍太多的话,可能就会脱离自己上机实践了。前期你不可能看完那么多书的。经典书后面的课后习题,尽量做。
- 编程语言和算法互相学习可能效果更好一点。比如看数据结构的时候用编程语言自己实现一遍,多用一些编程语言的一些知识要点。同时,看到数据结构,算法的时候,可以考虑到lintcode上面刷刷类似的题目。
- 从网上大神的反馈和校招的情况看,编程能力、算法等基础很重要。
推荐的书籍以及考虑的参考顺序:
编程语言方面,因为我是看的C/C++,所以对JAVA不太懂,不过熟悉哪门语言都是要大量的敲代码,而不仅仅是看书。下面C/C++如果没时间就先看C++吧。看C的话主要是关注指针那块。
- 《C程序设计语言(第2版)》K&R那本
- 《C和指针》。上面那本书讲的太精炼了,参照这本书可以对C有一个了解
- 《Accelerated C++》。这本书最大的好处是把C++很多常用的语法和STL的一些用法给呈现出来了,而不像普通的C++书籍那样按部就班罗列知识点。
- 《C++大学教程》。和上面那本书对照着看。
再强调一遍,编程语言练习也就是自己多敲代码才是重要的,不要抱着书看完一遍又看一遍。
数据结构和算法:
- 《大话数据结构》,程杰。入门算是不错的书了,有C的代码,自己敲过一遍理解更深。
- 《数据结构与算法分析——C语言描述(原书第2版)》。我选这本书是因为它比较薄,上来直接啃《算法导论》我个人感觉有点太难了。
计算机基础书籍:
- 《深入理解计算机系统》。这本书入门计算机绝对没问题,包括了操作系统,汇编,硬件,还有网络的一些简单的东西,现在既然硬件那块需求不大,可以暂时不看吧。
我这条路在入门上面绝对能走通,不过每个人选择的书籍可能不同,也不用都照着来。方向大抵如此,同时,给出一个我看过的较全的书单:《程序员必读书单 1.0》。同样,这个书单也是仅作参考,前期你不可能都掌握的。别贪全,前期要把那些常常出现的问题给解决。
同时,再把自己所说的“入门”给定义或者说明一下,给你一个参照,以防你也是初学,而我又太low,把你带坑里。
之前,我敲代码时出错了是照着书上给的代码改自己的代码。有些确实是不懂,有些是感觉进度确实不能太慢,不然容易陷入细节的思考,还有就是时间拉太长了可能会学了后面的忘了前面的。现在,敲代码会自己设置断点改错,能够明白一些C语言的指针方面错误所在了。
简单的说就是:之前是被动输入,现在能主动输入了。即,把一些从前学过的C++、数据结构的知识进行组合,实现一些自己想到的功能,并且改错的时候能想通一些指针的特性了。这样融合起来学习,能够更好的理解书上的知识。
所以我感觉自己入门了。
我博客中前两篇文章的内容是二叉树的实现,本来其实感觉太简单不想贴出来的,不过想想可以给这篇文章做个铺垫。不信你可以对照着看一下,把《二叉树的实现以及相关操作C/C++》中的代码改写成《二叉树类的实现》中的类,就会遇到很多难题。我自己写的时候想避开《C++大学教程》上的一些方式,不过最后还是没避开,用其他方式我实现不了。当然,也许你写的代码会比我的更简洁。
同样,这里给出一个我看过的不错的入门建议,可以参考:如何从只会 C++ 语法的水平到达完成项目编写软件的水平?。我有空也会尝试的。
最后想到昨天有几个新生说迷茫,正好我也借这篇文章谈谈这个话题吧。
迷茫很正常。研一的新生可能因为刚刚开学,环境变了,同时看到以前的同学或者现在这个行业工作的人们工资很高,而自己能力不足,对未来有点担心。同时,可能是有了导师的直接管理而且感觉导师分配的任务和自己想要尝试的事情不太有交集。简单地说,其实迷茫就是对未来或多或少的担忧。
未来谁知道呢?对吧。没发生的总是没发生,谁也不能说自己的努力方向一定正确,自己的愿景一定实现。
仔细观察我们可以发现,除了大学之前我们没有过太多的迷茫感,在高考填志愿那时开始,很多人多少都会对未来有些迷茫了。因为在那之前,我们更多是在既定的轨道被动进行教育的。我们在规定的时间上课,规定的时间放学,规定的时间完成作业,每隔一段时间会被排名,从而评估你的成绩。更重要的是,那个时候我们不用直接为自己的行为负责,因为父母会给我们埋单。大学之后,我们要进行更多的选择,对自己的行为负责。同时,评估人的标准渐渐变得不那么单一了:有的人社团混的很好,人际交往让人羡慕;有的人会玩乐器,乐队在自己学校小有名气;有的人竞赛屡获佳绩,让人自愧不如。这些都会使我们努力的方向迷失,从而感觉迷茫。
现在,可能你迷茫的是一些学习方法。未来,你可能还会迷茫自己的择业,孩子的学校选择,不同城市到底安家到哪,等等。
那么在迷茫的时候,该做些什么呢?
- 上网搜集你所想要努力方向的资料,查找经验。
- 进行实践。
- 将自己的实践和努力的成果进行分析,修正。
- 重复进行2,3步。
然后,你也会找到自己的方向的。所以我在开始将我努力的过程给描述了一遍。
这里再分享一个经验:迷茫的最大敌人是拖延。
相信聪明的你,能更快地找到属于自己的那条道路。