CS学习攻略

前言

同学让我总结下自己的计算机学习之路,其实我不太适合这个任务,毕竟自己也没有真正去互联网或者CS公司实习过。虽然平时的任务非常依赖计算机但是很多还是自己摸索的,而且科学计算和真实的码农工作还是有不少区别的。但是在目前这个关键节点上,也是给自己的一个好的总结和计划。

所以不才布鼓雷门,班门弄斧尝试着写下这个任务,欢迎大家斧正指教。

同时显然我不是所有领域都掌握的炉火纯青所以我会借鉴一些成熟的好的博客和知乎的内容。主要是如下两篇文章:

首先是谷歌Lucida大神的书单其实你只要按照这个书单照方抓药就行。

程序员必读书单 1.0

我的算法学习之路

下面是知乎上的一个行动指南,这个是专为了准备博士或者硕士毕业不做科研找工作同学准备的。当然这个工作是做程序猿至于其他的需要你去求教别的同学。

编程入门指南 v1.4

目标

离开目标谈所谓的学习攻略或者计划是没有意义的。举个粒子,如果你的目标是前段工程师,你花很多时间研究 GPU 计算这是赤果果的南辕北辙。

当然你要是说这是你个人的兴趣什么的我还是非常喜欢的。

所谓我这个攻略其实侧重于两个部分,一个是实用基础,一个是偏向科学计算的其他技能。

之所以是实用基础,是因为如果单单说基础那么像离散数学,微积分这些我感觉都是基础,但是既然我们是拿来主义和实用主义这些就都暂时缓一缓,不是说它们不重要而是你确实很少在实际工程中直接使用到它们。

实用基础

编程语言

简单来说各种语言都有各自的用途,争论谁是谁非并没有太大的价值,但是在你的学习中专注你的目标还是非常有意义的。

首先从我个人科学计算的背景得来的一点偏见是——我推荐 C/C++ 和 Python,可能在稍微加上R取决于你的工作性质。

首先C/C++是因为科学计算毕竟是计算密集型的任务为主,那么速度就是一个绕不过去的考量。没有哪个科学计算任务是考虑效率。提到效率其实在科学计算中主要是Fortran和C/C++系列。之所以不推荐大家学习Fortran其实是因为Fotran实在是太老了,比如大家都知道CERN已经把自己的体系全部从Fortran迁移到C++体系了,参见ROOT的转变,现在ROOT已经完全基于C++了。但是之所以Fortran还保留的原因只有一个,那些从1970年代开始接受了大量检验高效完美的数学库实在是不能割舍啊,所以我们还能看到Fortran的身影活跃在科学计算领域。但是如果你是新的进入者就不用再从Fortran开始了吧。同时对于C/C++也有自己的方法调用Fotran库,这样你更可以放心了。

但是很多任务,我们不是计算效率中心的。典型的就是比如做完实验之后的数据统计,作图,以至于到了更高级的时候你在服务器调度计算任务这些。对于这些任务,因为总计算量不是特别大,最慢也就是大概5min左右的样子,你完全可以等待喝杯咖啡。所以推荐用Python和R来做处理。现在Python和R其实有相融合的趋势,比如Python的作图系统就大量借鉴了R的ggplot2。

该阅读的书籍,对于C我推荐两本

  1. C和指针 Pointers On C
  2. C程序设计语言

对于Python,我推荐两个,都是在线教程因为Python变化确实是很快,完全没必要看书:

  1. 《Think Python 2ed》最新版中文翻译
  2. 廖雪峰 Python 3 中文教程

我都是推荐的Python3,现在的现实是基本大多数包都支持Python3了,还是迁移到Python3吧。

算法

这个其实也是我在学习的部分,推荐3本经典:

  1. 算法(第4版)
  2. 数据结构与算法分析:C语言描述
  3. 算法导论

尽量按照这个顺序来阅读。

计算机结构

这个也只推荐一本

深入理解计算机系统(第2版)

这里已用Google大神的话来解释这本书,其实不用多说

深入理解计算机系统是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读深入理解计算机系统是最有效率的方式。

其他技能

前面的几个是最最基础的部分,我觉得无论你是学习将来做什么都需要掌握的部分。但是到了其他技能部分,我觉得其实是和你的真正需求直接相关的。比如一个做网络优化的可能更需要C++,一个做iOS客户端开发的可能需要Swift,Objetive-C这些;但是一个做深度学习的可能只需要Python就行。不少同学做企业级开发,那么可能Java更好。总之方方面面各有不同,不能一概而论。

我下面只说说我推荐的,基于科学计算的角度。

网络部分

这个一个是你要掌握下基本的网络结构和搭建网页的方法,推荐我本科上课的时候的教材

计算机网络

这本书的作者也是传奇人物,Tanenbaum教授,Minix的发明人。不知道的人,读读MacTalk的这篇博文吧。Linus,一生只为寻找欢笑(完全版)

基本上你到了办公室总有可能要链接网线,也有可能需要搭建网站。这门课现在看,除了专业课是我毕业用到最多的课程。比如这是给组里做的网页,虽然简单,但是还是可以用的,同时我没使用特别复杂的技术栈,因为考虑到后面维护同学的技术水平和这个网站的性质,这样的水平就已经可以了,我们毕竟不是为了炫技中国科学院物理研究所SM08组:颗粒和胶体物理组

当然你要为了个人找工作的话,还是使用各种技术栈吧。

高性能计算

这个是两块,分别是并行计算和GPU计算。因为我处在学习阶段就不贻笑大方了,但是这个确实是科学计算的方向。个人感觉将来你要是说你的计算不是基于GPU估计论文档次也好不了。因为这个确实是现在的方向和未来。至少从深度学习和人工智能的程度上说已经大部分集中到了这个邻域。

画图

画图是个比较复杂的话题,我之前写过一个总结,现在还是这个总结,画图的工具应该具有这么几个特点:

  1. 脚本自动化。这样可以方便你不断修改,同时记录下自己每次修改的内容,到时候万一有了什么改动可以方便地全局修改起来。
  2. 作图应该足够美观,不能太丑啊。
  3. 可以方便的实现示意图和数据图的两个功能。

可以参考下这个博客用R做DSC曲线图

按照我现在的总结其实就是这么几个,数据图用R,Gnuplot,而示意图,用PPT和Tikz(一个基于LaTeX的画图软件)。可以参考这个博文论文工具链总结

这里提下PPT很多同学看不起,觉得太low事实是,我知道有的组发在Nature,Science上的示意图也是用PPT做的,特别是到了PPT2007版本及以上,抗锯齿化,颜色的Alpha值这些都是可以设置的。而且提供了丰富的图形选择,图形还可以精确设置大小。非常值得你快速做示意图。

Linux和Bash

其实Linux简单了解就好,需要知道的可能不超过10个命令。因为很多人其实只需要做好在服务器上提交任务的事情就好了复杂的更多的内容是交给服务器的维护人员的。但是你必须要知道简单的交互办法。

所以Bash的命令,一些简单脚本,比如如何重复提交100次某个程序计算并且把结果存在不同的文件夹?参考这几篇博文的总结:Linux下批量Kill多个进程的方法Bash脚本的批量作业,最好的超算中心提交任务方法

Git和Github

现在的世界作为一个程序猿,你必须要和Git和Github打交道,所以学会使用这个先进的代码管理工具也是非常有必要的。

推荐下面这个教程Git教程-廖雪峰

LaTeX

基本上作为科研人员,特别是偏向数理的计算机人员,你是一定会使用LaTeX进行你的论文写作的。

所以掌握下LATEX还是很有必要的。

推荐这个教程非常好,Latex Note2

总结

班门弄斧了一番,希望大家指正。这个总结长期更新,欢迎大家留言。

Written on April 15, 2016