基础理论课
- 数据结构和算法
- 操作系统
- 计算机组成原理与汇编
- 计算机网络
我列出这四门课,是因为国内本科结束之后,考研初试要考的就是这四门课。这也说明了这四门课是计算机专业非常重要的基础学科。复试的话会涉及到更深入的一点东西,比如:编译原理、软件工程、人工智能、多媒体技术、信号处理。
书籍推荐
CSAPP
中文叫:深入理解计算机系统
英文叫:Computer Systems: A Programmer’s Perspective,简称 CSAPP。
- 有能力的话,尽量看英文版
- 看书要做笔记,细分知识点,明确所学的核心知识点
- 习题不要略过,一定要做
这是 CMU(Carnegie Mellon University,卡内基梅隆大学)的计算机入门教材,这本教材对应的课程是 CS 213 ,是很多课程的先修课。
- 课程主页
- 2016 年课程主页
- 卡内基梅隆大学 Introduction to Computer Systems CMU 15-213 Fall
- 卡内基梅隆大学 Introduction to Computer Systems CMU 15-213 2015 Spring
看完知乎答主的回答,我们需要注意的是这门课也有一个先修课,是一门编程语言 C0(C 语言的子集),对应的课程是 CS 122,或者你学 Python 也行。CMU 一般是给大二学生开这个课,学过 C 以后就可以上了。
这本书讲的是计算机底层的基础原理,涵盖范围主要是 计算机组成原理和汇编,是圣经般的入门书,突出原理,讲解非常细腻、系统。
我目前还在学习,这里有我的学习笔记:
SICP
APUE
动手开始写代码
ACM
然而仅仅是学习理论是完全不够的。
我这里要讲的是 ACM,ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest, ICPC)
的简称,由 ACM(Association for Computing Machinery,(美国)计算机协会)主办。
为什么 ACM 如此重要(以及 ACM 的大奖对本科生找工作的分量这么重),因为编程活动所要依赖的只有两个:抽象和逻辑,这就是为什么其实编程可以从小学开始(没有过高的知识门槛)。计算机科学的诸多课程,就是由先辈们靠着抽象和逻辑搭建起来的知识大厦,这些知识和经验是叶,而你抽象和逻辑能力,依靠计算机解决问题的能力是根。练习 ACM 就跟武术世界里面的李小龙每天练拳一样,是基本功。
练习 ACM 一般用 Online Judge 系统,这里我推荐几个:
大型项目
ACM 自然跟真正的应用程序的编写是不一样的,当你真正步入开发的时候,你会发现还有非常多的东西要学,一个看似简单的 APP,其架构却是非常复杂的,代码量和代码结构的复杂也远超你的想象。那么如何上手学习呢,你也不可能一步登天,一上来就开发一款应用啊。答案自然是:一个功能,一个功能的实现,按模块学习,按模块设计,慢慢积累,有点像搭积木。你不要觉得仅实现一个功能会拿不出手,初学者就是这样积累起来的,所以你大可以把你实现的那些小东西都整理好(这也就是我下面会写到的,做好编程札记),文档和代码都好好保存,因为东西太多比较容易忘,而且编程最忌讳的就是重复工作,从零做起。
编程心得
其实我早就想写一个系列,就叫:编程心得,这个里面放上很多编程中的细节问题,就跟网上的笔试面试经典一样,其实这些东西虽然吸收的快,但有些东西还是必须经过亲力亲为才能真正体会到,但我并不反对直接看这种东西,否则我就不必花心思去写了。直接看前人总结的经验非常有好处,这就像武侠世界里的传输内力,人类之所以发展起了文明,就是因为知识的传递非常迅速而有效,我们根本不需要做任何事之前都需要自己做过一遍才知道怎么做,我们往往都借助他人的经验。
说到这个话题,我觉得有必要强调一下,编程札记 这个东西。一直以来我都十分建议积累式学习,不管是工作还是学习,都要做好记录,特别是重要的点,一定要记下来,比如实现一个东西的时候遇到的困难,以及如何解决,有哪些关键点,等等。写这个东西是为了便于回顾,以及衡量自己的工作量。
学而时习之,不亦说乎
目前免费的云笔记首推:有道云笔记,虽然用的没有为知笔记爽,对于穷学生来说还是比较友好的。另外人家后台是网易,而且跟网易云音乐、有道词典、网易公开课、网易云课堂、网易严选等等产品构成了一个网易的高口碑生态链,所以你一定程度上不用担心它关门倒闭。
素养
访问全球网
众所周知,我们处于一个国域网当中,如果你想看看外面的世界,必须要学会科学上网(翻墙)。互联网时代,这是必备技能。目前我用的是 搬瓦工+shadowsocks。
脱离 Windows 的襁褓
很多人喜欢争论 Linux 和 Windows,就像各种语言之间的争论一样,无休无止。但同样很多人喜欢说,Windows 和 Linux 无所谓,真正的开发者都是什么好用用什么,主要看需求。
而这里我要说的,跟这些都不一样,对于初学者我的建议一定是:脱离 Windows 的襁褓。否则你将很难对计算机的 CLI(Command Line Interface)产生直观性的体验。Linux 逼迫你,把你暴露在一个更原始的环境,也就更贴近事物的原理,让你看的更加清楚,让你脱离不动脑子傻瓜式的鼠标点点点。而之所以那些高手喜欢说 Windows 很好用,没必要用 Linux,是因为他们都是脱离了低级层次,已经到达更高层次的人,他们当然无所谓,Windows 早已蒙蔽不了他们的双眼。这是一种看山还是山,看水还是水的境界。而你不经过历练,是不会到达这个境界的。
不要一见到命令行就恐惧,正如你不应该一见到英文网站和英文资料就恐惧一样,这种回避绝对是有害的。
对于初学者,Linux 比 mac os x 好,因为 mac 也可以点点点。
当然如果你已经脱离了低级层次,那么我绝对更推荐你用 windows,其次是 mac,最后是 linux。原因自然是 Windows 的应用生态是最完善的,最能满足日常需求的。
LaTex 和 Markdown
说到文档和笔记的编写,就得推这两个东西了:LaTex 是学术界写论文的标准,现在微软的 word 软件似乎也有一席之地了,毕竟 LaTex 比 word 难用多了,特别是对非计算机类的学者来说。LaTex 排版效果非常棒,我感觉,出版社出版,维基百科词条,也都用得上 LaTex。Markdown 是 github 上文档的标准,也是网络上各种博主的写作标准,最最关键的点是,mathjax 这个组织,让 Markdown 的便捷和 LaTex 的强大结合起来了,你可以在 Markdown 中插入用 LaTex 书写的数学公式。这也是我不用简书的原因,简书虽然有 Markdown,却不支持 mathjax,公式贴图可以啊,但你总不至于写个上下标都贴图吧。
时至今日(2018-11-01),简书的 markdown 已经支持数学公式了。除了 mathjax 还有 katex 也是不错的数学公式渲染引擎,katex 似乎比 mathjax 还要快上一些。
关于 LaTax 的手册,我还是希望大家自己去找,在这个时代一定要把自己的搜索能力练起来,特别是寻找 最权威的资料,最一手的信息,因为这样你才有可能在比特币刚诞生不久的时候就了解到它(举个例子),当然很多人会说其实他们早就知道这个东西,只不过一直不想去深入了解。
当然我也不会吝啬于分享,我先讲讲我如何找这份资料:首先使用 google 搜索引擎,其次使用英文搜索,输入 LaTex math
,得到如下有用的答案:
多用搜索少用书签,锻炼自己的搜索能力
至于要不要把它们加进你的书签,我的建议是这类东西没必要加,你可以仔细思考一下这个搜索有什么特别的,对,他加了 math
这个关键信息,如果你只是单纯的搜索 LaTex
或者 math
那么你将得到大量无关的信息,但其实你平常用的时候经常就只是用到LaTex
数学方面的东西,其他的基本用 MarkDown 排版。
我在使用 mathjax 写数学公式过程中遇到过的最头痛的问题有两个:
- 三重环积分无法显示:$\unicode{x2230}$(我这里用了特殊的技巧才将它显示出来),显示为:$\oiiint$,详情参考:mathjax 常用公式记录
- markdown 和 mathjax 的冲突,详情参见:Hexo+Markdown+MathJax 搭建个人博客
版本管理工具
一提到版本管理工具,现在最流行的就是 git 了。最基本的是要理解一点 git 的原理,git 的作用主要体现在可以进行文本内容的比较,而不是简单粗暴的将发生修改的文件直接替换掉。多人协作的时候,如果想减少冲突,有两种手段,排首位的就是勤合并,其次是分工明确,不要多个人做同一件事(改同一个地方)。
工具
- 编辑器:虽然现在编程都用 IDE,但平常处理一些文本的时候,还是要用到普通的文本编辑器,我目前使用的事 sublime text3:精通一款编辑器之 sublime text3
时至今日,github 已经被微软收购,而微软力推的 vscode 编辑器也成为了主流。尤其是自从我做前端以来,都是用 vscode 敲代码。
互联网时代的能力
- 依靠互联网和计算机解决问题的能力
- 搜索能力
- 找资源的能力
举几个例子:
- 腾讯视频的资源好多都要 VIP,但是在 YouTube 上很多可以找到免费的资源,毕竟墙外面。而很多美剧英剧资源则都在百度云上面,可以说是互相伤害的局面。
- B 站上的资源真的多,有不少的教育类的付费视频在 B 站上可以免费看,但随时有被查封的可能,所以批量下载 B 站的视频是比较常见的需求。
- github 上的电子书资源相当多,各类破解软件也挺多的,用来学习的开源项目也是数不胜数。以前下载电子书我都是用微盘和百度网盘的,时间再往前则是新浪爱问知识人了。破解软件嘛,类似 kmspico(Windows 的破解软件),github 上轻松找到。kcptun 的 mac 版(kcptun darwin)轻松找到。
- 谷歌经常能搜到大学课件或者服务器的某些内部资料。