信息科学

基础理论课

  1. 数据结构和算法
  2. 操作系统
  3. 计算机组成原理与汇编
  4. 计算机网络

我列出这四门课,是因为国内本科结束之后,考研初试要考的就是这四门课。这也说明了这四门课是计算机专业非常重要的基础学科。复试的话会涉及到更深入的一点东西,比如:编译原理、软件工程、人工智能、多媒体技术、信号处理。

书籍推荐

CSAPP

中文叫:深入理解计算机系统
英文叫:Computer Systems: A Programmer’s Perspective,简称 CSAPP。

  1. 有能力的话,尽量看英文版
  2. 看书要做笔记,细分知识点,明确所学的核心知识点
  3. 习题不要略过,一定要做

这是 CMU(Carnegie Mellon University,卡内基梅隆大学)的计算机入门教材,这本教材对应的课程是 CS 213 ,是很多课程的先修课。

先修课

如何阅读《深入理解计算机系统》这本书?

看完知乎答主的回答,我们需要注意的是这门课也有一个先修课,是一门编程语言 C0(C 语言的子集),对应的课程是 CS 122,或者你学 Python 也行。CMU一般是给大二学生开这个课,学过C以后就可以上了。

这本书讲的是计算机底层的基础原理,涵盖范围主要是 计算机组成原理和汇编,是圣经般的入门书,突出原理,讲解非常细腻、系统。

我目前还在学习,这里有我的学习笔记:

SICP

APUE

动手开始写代码

ACM

然而仅仅是学习理论是完全不够的。

我这里要讲的是 ACM,ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest, ICPC)的简称,由 ACM(Association for Computing Machinery,(美国)计算机协会)主办。

ACM logo

为什么 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写数学公式过程中遇到过的最头痛的问题有两个:

  1. 三重环积分无法显示:$\unicode{x2230}$(我这里用了特殊的技巧才将它显示出来),显示为:$\oiiint$,详情参考:mathjax常用公式记录
  2. markdown和mathjax的冲突,详情参见:Hexo+Markdown+MathJax搭建个人博客

版本管理工具

一提到版本管理工具,现在最流行的就是git了。最基本的是要理解一点git的原理,git的作用主要体现在可以进行文本内容的比较,而不是简单粗暴的将发生修改的文件直接替换掉。多人协作的时候,如果想减少冲突,有两种手段,排首位的就是勤合并,其次是分工明确,不要多个人做同一件事(改同一个地方)。

工具

  1. 编辑器:虽然现在编程都用IDE,但平常处理一些文本的时候,还是要用到普通的文本编辑器,我目前使用的事sublime text3:精通一款编辑器之sublime text3

时至今日,github已经被微软收购,而微软力推的vscode编辑器也成为了主流。尤其是自从我做前端以来,都是用vscode敲代码。

互联网时代的能力

  • 依靠互联网和计算机解决问题的能力
  • 搜索能力
  • 找资源的能力

举几个例子:

  1. 腾讯视频的资源好多都要VIP,但是在YouTube上很多可以找到免费的资源,毕竟墙外面。而很多美剧英剧资源则都在百度云上面,可以说是互相伤害的局面。
  2. B站上的资源真的多,有不少的教育类的付费视频在B站上可以免费看,但随时有被查封的可能,所以批量下载B站的视频是比较常见的需求。
  3. github上的电子书资源相当多,各类破解软件也挺多的,用来学习的开源项目也是数不胜数。以前下载电子书我都是用微盘和百度网盘的,时间再往前则是新浪爱问知识人了。破解软件嘛,类似kmspico(Windows的破解软件),github上轻松找到。kcptun的mac版(kcptun darwin)轻松找到。
  4. 谷歌经常能搜到大学课件或者服务器的某些内部资料。