转载

2017 年,从阅读开始

又到年末,小说君也不免俗的来一篇年终总结&新年展望,服务端系列先暂停。

这篇文章的主题如标题,就是「阅读」。

知乎上的计算机相关话题有一种答题套路,叫「晒书单」。

把自己手头的书堆起来摆拍一下,挑几本看的时候打瞌睡少些印象深刻些的「点评」几句,不一会儿就凑出来一长篇,不需要有什么逻辑,也不需要有文章结构。

篇幅到了,书的质量到了,自然会跟来一堆赞和评论。

甚至很多人点赞的原因可能只是因为「这个答主也看了这本书」。

年复一年都是那么些问题,比如大一求书单,大二大三感受到找工作压力求书单,大四拿到offer到为下一阶段(工作或读研)做准备求书单。

然后答案还是那么些答案。想都不用想的都至少会推荐两本:

  • 一本是SICP,中译名计算机程序的构造与解释。在国内出名的原因小说君认为有三点:scheme逼格比一些热门语言要高;曾经是MIT的一本入门教材;书本身的质量确实可以。书确实是好书,但是这本书对于要找工作的同学没什么用。

  • 一本是CSAPP,中译名深入理解计算机系统。这本导论书的最大贡献,就是为国内的同级定位的书树立了一个标杆,形成对比的是各种内容不忍直视的国产导论书,以及大部分院校的计算机考研专业书。跟SICP不同,这本书可以说是面试必备,而且一本书能应付所有基础题,可谓投入产出比奇高。

出镜率最高的应该就是这两本,其他频率稍微低些的还有很多,本文既然也不是书单推荐,就不再列举了。

小说君在学校的时候也比较推崇读书,光是计算机相关的,不算在图书馆或是书店看的,自己买的就有三四十本。

不过,两三年过去,小说君现在也开始感慨,纸质书其实并不是阅读的全部。

举一个简单的例子,众所周知,最近几年互联网公司对「分布式」的考察比例增加许多。

「分布式」相关的内容,没办法借助书来建立知识体系。如果在学校只是搭一下hadoop跑一跑mapreduce,没有实践过分布式系统设计开发,那在面试中还是相当吃亏的。

这时候就只能找paper了,paper也是一种相当重要的阅读来源。

比如GFS、MapReduce、BigTable,还有一些一致性算法,比如paxos made simple,比如raft extended,都是看了paper才能有一种豁然开朗的感觉。如果要面试分布式相关岗位,阅读这些主题的paper远比前面说的两本书更重要。

看书这件事情,在知识体系没有建立的时候确实非常高效。但是,一旦知识体系建立了,从书里能学到的东西就会直线下降。

比如我们借助CSAPP建立了操作系统的知识体系,那再看到类似主题的书,就会发现每本书可能翻了半天只有一两小节是有价值的。

再比如说市场充斥的各种语言入门类书,对于有语言基础的同学更是远不如去看语言的API Refs和Manual更高效。

另一方面,市场的大环境摆在这里,让人有买的欲望的书确实不那么多了。至少小说君觉得想看的书,要么是几年前图书电商火起来的时候已经开卖的中译书,要么是已经出版十几年,没有而且也不太会有中译的英文原版。

前几年每次买书满减的时候,去图灵翻一翻新书目录,随便就能凑出几单。写这篇文章的时候翻遍了图灵16年新书,发现竟只有一本《GC Handbook》的中译本能看。大部分是看到标题就不想再点进去,小部分点进去看了简介或者目录默默关掉。比如有本叫《魔力Haskell》,有一句简介是这样:

...照函子→应用函子→单子的顺序介绍Haskell中核心的三大类型类,并以列表单子、Reader单子和State单子...

——不如老老实实去看英文电子书。

当然,书商肯定要有市场导向,这两年出的书整体氛围是什么都要扯上大数据,按照这种比业界晚个两三年的规律,明年出的书可能又要充斥VR和深度学习了。这样一想,又省了不少买书钱。

而且,阅读技术书籍,确实也不是一件轻松的事情。

  • 一方面,技术书籍对 「局部性」的要求非常高。读文学作品,一个周末没看完,放半个月再看都没太大问题。但是技术书籍的上下文切换成本就高得多,很有可能隔个一周再看就需要翻到前面好几个章节重新熟悉。

  • 另一方面,技术书籍的 「弃坑率」也很高。比如说一本讲Redis源码的书,很多人刚接触的时候会喜欢Redis源码中一些精巧的数据结构,一鼓作气看完这部分,然后周末过去了,再想起来已经提不起兴致,后续更有魅力的章节也就作罢。

所以,这也是文章标题没有提 「书单」的原因。阅读既可以是看纸质书,也可以是看电子书,看PPT,看博客,看公开课讲义,看paper,甚至看源码。

虽然今年小说君阅读量少得可怜,但是也还是想就一些印象深刻的给各位做个推荐。

首先是推荐一本书,《代码之美》。

2017 年,从阅读开始

小说君13年就买了这本书,一开始以为跟《代码大全》是一种类型的,就没怎么翻过。直到有一次偶尔翻到其中一篇讲svn diff的API设计,看了一会儿,发现确实是好书。

这本书很特别,三十多篇文章,三十多个作者,每篇有独立的主题,各有特色:

  • 有的基于代码片段比如基本算法的优化trick、快速撸一个单元测试框架、py的dict设计思路;

  • 有的谈理念比如讲系统设计中的分层思路、讲各种并发的取舍等等。

特点是都比较短,非常适合闲暇的周末看上一篇。

类比到通俗文学,这本书应该称为一本 「散文集」 。每篇散文的作者都是特定领域的大牛,围绕特定主题阐述设计思路,看起来很形而上但又不太形而上。

然后是推荐一篇blog。标题:

The Log: What every software engineer should know about real-time data's unifying abstraction

博主是Kafka的主要作者,文章主题其实就是Kafka。

blog先讲了 「log」这种 分布式系统中的基础数据结构—— 此log非我们平时接触最多的应用层log或者debug log,而是比如说mysql中的binlog,或者commit log。

然后讲Kafka的设计思路,从痛点出发,先run一个简单方案,不断提高抽象程度,最后基于log+消息系统设计出了Kafka。这也 小说君认为最有价值的部分,虽然主题跟大部分同学包括小说君自己的领域都不太对的上,但是其中的设计思路非常值得借鉴。小说君 强烈建议 对system design有兴趣的同学仔细研读。

最后收尾就是Kafka的一些优化。

这篇文章非常长,虽然只是一篇blog,但是阅读价值远大于很多书。小说君也是从看完这篇文章开始,更多的阅读精力放在了一些英文blog上,比如说linkedin的技术团队博客,ibm的developer works,质量比国内的技术团队博客确实要好太多。

最后是推荐一门历史相当悠久的公开课,MIT6.824,主题是分布式系统。

这门课程小说君也跟很多同学推荐过,没看过的同学可以看一下课程主页的Schedule,有详细的课程安排。

课程本身由浅入深,从GFS和MapReduce入门,接着讲分布式一致性,核心部分是介绍商业分布式KV的系统设计,课程设计是自己用Go实现一套分布式KV。

小说君认为,每位后端,不论是做游戏的,做web的,写逻辑的,写增删改查接口的,还是写 「框架」 的,都应该跟一遍这门课程。

计算机的每一个小圈子,都有相应的 「入圈 」必读。MIT6.824之于分布式系统,就像是TCP IP Ilustrated之于网络编程,UNP/APUE之于UNIX系统编程,RWH之于Haskell,高程之于前端。

写到这里,小说君不得不说,今年的阅读量实在少得可怜,写了这三个推荐已经是绞尽脑汁了,实在想不起其他。

所以阅读推荐就暂时这么点,接下里小说君分享下个人的2017阅读计划,督促下自己,希望明年不要再像今年,阅读各种半途而废。

这个计划分成三部分。

第一部分的主题是 「查缺补漏 」。

软件开发这个行业已经形成相当规模,底层设施日益完善。即使是做基础设施相关工作,直接跟OS内核或者TCP协议栈打交道的机会也已经是越来越少了。

小说君之前看过的很多书,现在也大多只能回忆个大概轮廓,去年参加校招面试的时候,就发现很多细节知识已经记得不太清楚了。非现场面的时候小说君甚至要先搜一下相关概念,才有底气作为题目问出来。

这部分的知识在日常开发工作中接触的很少,但是在关键时刻想起来又特别有用,因此需要定期阅读巩固。

对于工作党来说,阅读的选择也不需要太功利,尽量跟着自己的兴趣去做选择,因此计划如下:

首先是操作系统、体系结构相关的。

阅读的内容包括《程序员的自我修养》这本书,是一本相当难得的国产上乘之作,主要讲的是win和linux的操作系统基础——想象一下把CSAPP跟操作系统相关的章节提取出来,再配套一个win版本,糅合对比,就成了这本书。

还有就是同样出名的在线课程MIT6.828,主题是操作系统实现。 跟完 这个课程的课后习题和大作业,就相当于写了个小型操作系统。即使是没有时间精力,只过下讲义,也能加深对操作系统的细节把握,远比从头翻一遍现代操作系统之类的大部头有趣味的多。配合配套的xv6 pdf(只有几十页)阅读可能效果更佳。

然后是语言基础,以及虚拟机的一些基础知识。

现在是做web的用Java和Python的人多,做游戏的用C#和Lua的人多。这些语言本就有很多相似之处,而且随着语言发展共通之处越来越多,因此对于一些特性(比如lambda和闭包,promise/协程/async等异步机制)来说,是完全不存在语言隔阂的。而且这些都是虚拟机语言,虚拟机相关的基础知识就更普适了。

但是这部分小说君并不了解有什么成体系的书,特别是那种不限定语言的。所以小说君的阅读计划只能是去看知乎上的R大(知乎用户RednaxelaFX,上千纯技术干货回答,几乎全是关于语言特性和虚拟机相关的基础知识)和蓝色的回答合集。小说君在群里也经常分享R大的知乎回答,确实平均质量要比其他所谓 「技术大V 」高了几个档次(btw,宣传下技术交流群,现在人数过百没法扫码进群,请加小说君个人微信fingerpass拉你进群)。

至于每门语言各自的 权威大部头,小说君认为就没什么看的必要了。毕竟大部分程序员并不以这些语言入门,有编程基础再去大部头里看比官网老N个版本的语言细节和Framework意义不大。

阅读计划的第二部分主题是 「技术欠债 ,这就稍微有点personal了,跟个人兴趣关系比较大。

小说君大二的时候做了个.Net项目,把玩了一两个月的Linq做增删改查,后来也一直念念不忘lambda,直到去年不知道什么契机看到了那篇why fp,于是开始探索fp的魅力。

然后就顺理成章的看RealWorldHaskell,看Monad,看ParseC,于是你看到了小说君之前用Haskell做演示的 「 编译器 」,看到小说君写的一个相对比较完善的 类Scheme风格的DSL以及相应的编译器

但是这块内容小说君当时也看的不成体系,是为 「技术欠债 」。

相关的书倒是有很多经典,比如说(为方便对话题感兴趣的同学检索,列下全称):

TAPL,types and programming languages

PLAI,programming languages: application and interpretation

PLLC,programming languages and lambda calculi

EOPL,essentials of programming languages

其实相关的书还有很多, 为避 「报菜名 」之嫌,小说君就不再列举了。PL这领域的书有很多 经典,不过由于圈子小众,而且这题材既不热门也不功利,国内的出版社似乎都没什么引进的意愿。

小说君也不求新的一年能看完这几本,只要能通读其中一到两本,阅读计划的这部分也就达成的差不多了。

技术欠债的另一部分主题是system design。

system design其实更加玄学。设计是一种非常主观的东西,而且相当经验主义。每个程序员在接盘别人的项目的时候第一反应往往都是 「这是什么狗屎设计 」,然后要么重构要么修修补补,最后甩给其他人接盘的时候又会发生同样的事情。

老人喷新人的设计时常说的是 「我见的多了,告诉你点人生经验 」;新人喷老人的设计时常想的是 「vision太差,水平比知乎大V不知低到哪里去了 」。

那我们应该怎么办?

很简单,多看优秀的设计而不闭门造车,多充实理论基础以备突如其来的撕逼。小说君的阅读计划里就有一本书是介绍system design,《a system of patterns》。

这本书讲的不是被国产书扯个没完的设计模式,而是讲patterns。讲协议设计中的patterns,讲架构设计中的patterns,讲对象关系管理中的patterns,讲具体代码片段中的patterns。

pattern也是很玄学的东西,你可以说Observer设计模式是一种pattern,可以说MVVM是一种pattern,可以说生产者消费者是一种pattern,甚至可以说Kafka的设计理念也是一种pattern。

这本书小说君一直是想读未读,相信读的时候结合zguide,在 「设计撕逼 」中会更有竞争力。

最后是第三部分,新领域知识。

不得不说,我们现在确实地处于一个技术爆炸的时代。而且,信息科学确实地成了技术爆炸的核心。

幸运的是,对于程序员来说,从移动互联网,到手游,到深度学习,到VR,领域切换的成本已经足够小。优秀的程序员理应有 「自由切换雇主 」,甚至是 「自由切换行业 」的能力。做到这点的前提就是在保证自己当前专业深度的前提下,能赶得上技术发展趋势。

远如Jeff Dean,做搜索引擎,做分布式基础设施,现在做TensorFlow,做人工智能。

近如网易杭研的一位大牛,十年前在云风的4031工作室做游戏引擎,然后搭起了杭研前端的基础设施,后来又一手搭起数据部门的数据挖掘框架。

当然,这些经历离不开历史的行程,但是更重要的是个人奋斗。

说了这么多废话,其实现在就是几块小说君暂未接触的领域,比如机器学习,区块链,流计算,前端,小说君也很难有大片的时间段与动力去建立一个比较清晰的脉络以及知识体系,希望在新的一年里有相应的收获。

个人订阅号:gamedev101「说给开发游戏的你」,聊聊服务端,聊聊游戏开发。

2017 年,从阅读开始

原文  http://mp.weixin.qq.com/s?__biz=MzIwNDU2MTI4NQ==&mid=2247483779&idx=1&sn=91493349276dc46ccb18c4dbd90cb24b&chksm=973f0f69a048867f49921b0af4cd58f057c9b4e368cc8650eeb5a8271c770aa71807671c63ab
正文到此结束
Loading...