博主属于路子铺的比较广的那种,玩过开发板、研究过系统内核、改过浏览器内核、写过网站、弄过机器学习毕设又转过头去做网络了,所以没有什么特别精通的方向。不过好在基础面铺的比较广,各个方面都能和人聊两句,所以这里也就给一些打基础的参考。
参考书
过来人都知道,学计算机只靠上课那些内容是远不够的,而有些网站推荐的程序员必读系列感觉有点坑,而且没有什么针对性,纯粹是别人说好我也来捧的感觉。博主这里推荐的都是看完过,而且确实有实际作用的书,尽量去除掉神话光环。
以下是基础篇
这本书来回读了三遍,每次都有很大收获。说到底这只是一本导论性质的书,不像坊间流传的那么传奇,毕竟也只是 CMU 本科生的一门计算机基础性质的课。不过看完后确实能对整个计算机系统从底层编码到上层开发产生一个清晰的脉络,课后的习题每道都很有意义,作为一部教材,确实让人读起来赏心悦目。北大这边已经将这本书作为必修课的教材,当时知道的时候我还是很为学生们开心的,当然学生们普遍反映很虐。
博主从前是个算法渣,当然现在也强不到哪去。但是我一直感觉推荐《算法导论》甚至《TAOCP>是毫无诚意的做法。上述两本书一本是字典性质的,另一本就是辞海性质了,看字典和辞海是要闹哪样。《算法引论》这本书主要讲的是如何设计算法,开篇介绍了高中学的数学归纳法,然后通过归纳法告诉你其他的算法是怎么设计出来的。读了这本书很多原来不熟悉的算法都能推导出来了,尤其是动态规划类的题归纳法简直是大杀器。博主之前看过两遍算法导论都是迷迷糊糊,看完算法引论后感觉突然算法开窍了,再看其他算法都清晰了很多。
虽说博主是所谓软件工程国家重点实验室的人,但是真正和软工领域相关的书只有两本能读下来且觉得有意义。(另一本是《人月神话》也推荐大家读一下)软工的书很容易写的无聊,这本书的优点就是不无聊。个人感觉设计模式主要是针对对面向对象编程尤其是 Java 的,能够构建出比较高质量的代码,在面电商的时候几乎都碰到设计模式类的问题了。而且真正看下去,感觉这个东西确实是有意义的。很多人推荐另一本书《设计模式:可复用面向对象软件的基础》,但是由于读了几次都没读下去就不推荐了,感兴趣的同学可以试一下。
这是一本实用的 Linux 入门基础教程,尽管里面作者的一些观点有些偏激而且说话太啰嗦了……,但是教的东西都是实打实的。可以减少很多自己摸索的痛苦,对命令行不那么恐惧,不过要注意的就是有些东西已经过时了。
以下是 C++ 篇
不夸张的说是看完这本书才会写程序的,很多人觉得上手用这本书太难,我当时是课上学过C来看的,感觉讲的比较基础难度没有很大。外国书没那么多 tricky 类的问题,中规中矩介绍语言,并且融合了软工的一些内容,看完了对编码的帮助还是很大的。
是我看过的 C++ 相关收获最大的一本书。很多人根据有没有读过这本书来把 C++ 程序员划分为两类,这点我就觉得有点过了。这本书很大的一个作用就是扫雷,把 C++ 的雷坑一个个挖出来给你看,告诉你应该怎么绕过去,读之前我都不知道居然有这么多坑。此外也提供了很多软工方面的建议,通过这些建议来帮助程序员写更好的代码掉更少的坑。这本书还有续集《More Effective C++》,续集偏设计模式一些了,感觉没有上一代那么有启发意义,不过还是值得一看。
由于 C++ 的坑太多了,就专门有一本探坑的书,这本书介绍了 C++ 的具体实现告诉大家坑是怎么来的,这本书也被誉为是 C++ 进阶级程序员必读。但这本书本身也是个大坑,原作挖了一堆坑,侯捷老爷子翻译的时候填坑也没填完还又挖了新坑。看这本书很有意思的一点就是看到批注里有老爷子指出原作者哪里又错了。这本书确实对理解 C++ 有着一剂猛药的作用,看完了再看 C++ 感觉都不太一样了,面试时问到的奇葩问题也都能和面试官侃了。但是有一个问题是 C++ 的标准里并没有规定实现标准,所以这本书里介绍的实现模型其实在不同编译器里是不一样的,而且这本书里介绍的一些实现和现在已经不一样了,所以这本书还是个大坑。可以眺,但也不要太认真。
以下是 Python 篇
Python 相关的书看过一些,但是都乏善可陈,而且内容都比较陈旧,官方的文档反而写的很不错,尤其是 HOWTOs 部分,看得很过瘾。本来想把 Library 部分加上的,但是鉴于我还没读完,就算了。有余力的同学可以看一下 Library 部分的文档,你会发现很多 Python 不优雅,不直观的地方。而且看 Library 的过程中还能顺便把计算机的基础知识都过一遍。如果是完全没有什么编程经验的同学直接看文档可能会有些苦难,(后方夹带私货,高能预警)可以看我做的一个 Python 基础教程。
以下是其他杂项
已经出第六版了,虽说比较厚,但是内容都很扎实,前面是数据库基础知识包括 SQL,后面是数据库系统的设计实现,讲的很全面,用数据库开发数据库都能获得收获。
广度还不错的一本书,图真的很多,不过深度略差。主要好在内容比较新,无线,IPV6 等最新技术都有涉猎。谁让《TCP/IP 详解》系列还是 94 年的东西,内容太陈旧了呢。不过最近貌似出第二版了,但是没有看过,有兴趣的同学可以去看看。
另一种视角来看字符串处理,还是很颠覆原来思想的。
为了不让书单太长就不加了,博主看过的书可以参考豆瓣书单里面大部分的书都是上了研究生后才开始看的(本科四年荒废过去了)。所以告诉大家这些书还是能看完的,可能一开始看会很慢,比如我最初看《深入理解计算机系统》就看了两个多月,不过之后基础好了再看别的书会很快的,只要能保持看书的习惯,看完还是没那么痛苦的。当然这些书也只是个基础,不要指望他们能让你功成名就。
视频网站
上面的书很多都是偏理论的,而且内容比较老,这几年的一些新技术其实主要还是靠看博客和看视频来学习的。视频网站主要推荐两个:
大名鼎鼎的 Coursera,里面的东西也相对偏理论,不过好处是都是很新,前沿的理论,老师的教学质量很好(发现最近有些新课程质量在下滑,不过北美名校的质量还不错)。博主数据挖掘,机器学习,统计类的知识都是在这上面学到的。不过真正完整拿到结业的只有 Machine Learning 和 Critical Thinking。因为很多学的时候并没有当期的课,不过学完后和一些高数据挖掘的同学聊天发现居然都能听懂。
这个就是纯技术应用的视频网站了,手把手教你做网站,P图,搞设计,开发应用。教学质量高的吓人,看过几个课程完全就被专业的教学震惊了,当然课程是收费的。在中国你是能找到一些免费的,不过课程都比较老了。如果几个人共用一个账号的话,我感觉这些钱还是相当值的。
资讯类
干 IT 这行,最新的咨询流是很必要的,但是过多的信息又容易让人烦躁,所以如何管理好自己的 Timeline 就很重要了。关于 Timeline 的管理可以参考如何“修剪”知乎上的 timeline?。连知乎这样曾经高质量的社区都水了,可以想象没有不水的地方了,不过我们还是能做到让自己的 Timeline 不水的。下面是我关注的一些新闻源和博客,都是可以 RSS 订阅的:
Oilbeater (夹带私货,高能预警)
前面提到的每天都不会有很多,而且干货比较多,质量还不错。
reddit 重点提一下 reddit,是我主要的外文资源的获取地,可以去里面搜索你感兴趣的专题,然后订阅那个专题的咨询,我现在就订阅了 python 和 django 两个。如果你不是很确定的话可以试一下 programming 板块,每天会有将近 100 的量,空闲时间很多的话可以挑战一下。如果还是能看完的话就试一下 HackNews 吧。
如果大家有什么好的资讯或者博客源的话希望也能赏我几个。
微博上多关注几个大牛也能获得很多新鲜的知识,推荐几个(当然也可先关注 Oilbeater,再顺着我的关注走,我的关注还是比较少的): InfoQ,我爱机器学习,IT 技术博客大学习,DataScientist,湾区评论,何_登成,程序员的那些事)
在强调清洗 Timeline 的重要性,取消关注一定取消,绝对不能手软,不然到最后 Timeline 里就全是男默女泪、不转不是中国人、成功人士的n个方法的鸡汤聚集地。同时要警惕那些只知道站队没有实际内容的人,现在越来越不喜欢知乎的一个原因就是发现不管什么问题站队的回答总能顶到最高,实际的回答反而被忽视。所以要让自己的 Timeline 少一些站队的消息。
关于项目和实习
其实很多人夸大了实习和项目的作用,我的感觉项目和实习的名头不是那么重要,重要的是你做了什么事情,能不能拿出一个让人看到觉得还可以的东西。博主去大公司实习过感觉大公司学到的更多的是流程管理类的东西,真正做出来的东西可能并不是那么重要。所以如果不是直接找工作的实习的话推荐去个小公司,或者创业公司,至少能做出一个像样的东西。项目也是类似的,重要的是做出一个能拿出手的东西,论文专利什么的其实都是比较虚的东西。自己做出一些东西改变一下这个世界一点点,感觉还是很好的,比如说写博客。
总结
打好基础,清理 Timeline,做有用的东西,仅供参考,欢迎拍砖。