LuckyHu Blog

首页 产品 工作室

部分推荐书

20 Oct 2020

最近半年在一个全员公开邮件中,陆续给公司研发部的同事们做了一系列的好书推荐,基本接近尾声,好书太多了,推荐不完,工程师的实际工作中最重要的一些领域,还是需要集中从经典书籍中建立知识体系,才能更好地在实际开发工作中发挥作用,而很多由基础知识扎实带来的好处,在四五线互联网公司的一线leader或者工程师心目中,并没有认知,任重道远。


《深入理解计算机系统》

之前跟大家面谈的时候,有些工作时间不太长的同事提到能不能推荐一些觉得比较好的书,这个后来我一直在想,一直还没推荐,因为感觉稍微措辞操作不当就变成我在装逼指点别人,所以很纠结到底怎么弄,想来想去,只要推荐了,免不了有这个感觉的,所以还是得搞,如果能帮到一些工作不久的工程师少走弯路,也是极好的。推荐的书,都是我确实读过也觉得很不错,有些甚至有一种醍醐灌顶的感觉,所以会陆续推荐几本给大家,希望有余力的同事,尤其是非科班出身或者自己感觉对计算机的基础不太好的,一定要仔细读,再提一下系统性地读书是为了建立一个完整的知识体系,平时遇到问题百度或者google,只能用来解决一些细节问题。

这次推荐这本叫《深入理解计算机系统》,网上大家喜欢叫csapp,因为他的英文名叫Computer Systems:A Programmer’s Perspective,直接翻译就是从程序员的视角来看计算机系统。

我个人不是科班出身的程序员,如果只能给非科班出身的程序员推荐一本书,那我一定推荐这本。

读这本书之前,最好有些c语言的基础,里面很多例子都是以c语言来说的,尤其是中间讲汇编的那一部分,这本书是从硬件出发,给你讲解计算机程序是怎么在硬件上运行的,如果哪位同事现在的知识结构只停留在计算机某个语言层面,那这本书就太适合你跳出单纯语言这个圈子,从更基础的角度去看平时我们在语言层面讨论的东西,到底是在讨论计算的哪些部分。以前我有个同事,面试一定会问多线程的东西,但如果你只能从语言角度去描述多线程,基本都会被他挂掉。读过这本书,你能了解更多线程在底层得到的支持,在硬件的表现,那无论是在面试答题,还是在做一些更底层的性能优化,就会更有方向。

这本书一共有700多页,读起来可能会比较痛苦,很容易放弃,我建议过程中如果遇到特别枯燥的小节,可以直接跳过,但跳过之前,一定要知道这个小结在讲什么细节的内容,方便你知道自己不知道什么,这样可以在你的知识体系中,留一个可追溯的空白。

后面网络那一章可以跳过,基本讲的是类unix系统的网络api,有很多文档和书对这个细节讲得更好,没必要看这个。

如果大家有推荐的好书,也欢迎回复这个邮件和我还有大家一起分享。后面我会继续回复这个邮件推荐一些其他的计算机好书。


《计算机网络自顶向下设计》

推荐另外一本非常经典的书,对相关领域比较陌生的工程师可以读一读

《计算机网络自顶向下设计》

全方位学习计算机网络一定要看的书,七层协议都涉及到了,从软件到硬件,从顶层到最底层,对客户端的同学来说,可以让你知道当你使用某个http网络库向服务器请求数据的时候,数据是怎么一步一步到达服务端又把结果返回给你的,基本上任何关于计算机网络的面试问题都能说个大概了。

相比《tcpip详解》系列,我觉得这本书更实用一些,《详解》讲了太多细节,字节排序包头几子节写什么之类的,看过就忘记了,但这本书可以让你对计算机网络,一点点拆解开来看,对全景更有认知。

最重要的是,这本书写作的视角和手法更有趣,更容易坚持读完,完全没有教科书的感觉


《Unix环境高级编程》

今天推荐一本一些人当作工具书用的书

《unix环境高级编程》(《Advanced Programming in the UNIX Environment》)

读过csapp以后再看这本会比较容易理解,书中讲了很多具体的系统调用,对线程,进程,io相关的系统调用非常详细,也需要边学边敲代码,各种各样的编程语言对计算资源基本上跑不出这几个范畴,这三个部分可以主要花时间看。无论是服务端,还是ios,android,都适合学习这本书,因为基本都是在类unix系统上工作,很多原理是类似的,web前端的同学因为经常是在浏览器环境中工作,可能读本书的收获会感觉比较小一点。

全书一共700多页,而且有很多实践(我也没全部读完。。。),不太适合一直读,估计会崩溃,可以分阶段结合实际最近的工作去看,比如最近做和进程通信比较多的东西,但不是很熟悉,与其去百度零散的知识点,不如去统一学习一下这本书中关于进程相关的部分,就能形成这个领域的知识体系。


《代码大全》

今天推荐的书,很多同事可能都听过名字或者已经读过,中文名叫《代码大全》,英文名《Code Complete》

我读了这本书后,最大的收获是有了一个评判代码质量和软件工程质量的抽象到具象的标准

评判一个工程师技术好坏的标准有很多,算法好不好,计算机硬件懂不懂,计算机网络是不是了解,代码写的好不好等等等

算法好不好,做一个题可能就看出来了,计算机网络懂不懂,问几个问题也能大概了解,不同的人去考察同一个人,在这些方面的评价通常不会差的很多。但代码写得好不好,不同的工程师可能看法差异会很大,有的人很纠结变量命名,函数命名,有的人很在意代码的复用,更多人甚至都没有代码质量好坏的标准或者说不能用语言表达出来。

如果你现在还处于不知道怎么评判代码质量的阶段,那一定要读这一本书,全书虽然一共有900页之多。。。。但基本上没有需要跳过的部分。

如果你已经有了大量的编码经验,那读这本书的过程中,完全不会感觉无聊,而是会不断有共鸣产生,甚至有一种相见恨晚的感觉,以后你再喷人家代码写得烂,就可以喷得有理有据让人信服。

最后,对所有需要大量写代码的工程师,我会把这本书列为必读书目。


《人月神话》

有一本软件工程领域非常经典且重要的书,推荐所有需要做项目规划的人一读,尤其是各个方向的leader,项目管理相关的人员

这本书中文名叫《人月神话》,英文名《The Mythical Man-Month》

1人干10个月不等于10人干1个月,等于就成了神话。这是本书主要探讨的问题,我理解书名也由此翻译而来。

如果没有统筹项目经验的同事,可能在初读这本书的时候,会觉得比较枯燥或者摸不着头脑,因为书中讨论的话题,都没有设计任何的技术和编程语言,看起来和程序员关系不大,但如果能坚持读完,在今后有操刀主持大型项目的时候,就会更加有思路,在跟不懂技术的老板或者客户去解释,软件产品在团队中的实践时,会更有底气

我第一次读是刚刚开始学习写代码的时候,当时收获并不是特别大,在后来做团队负责人以后,又重读了一次,才更懂书中讨论的问题

全书一共300多页,不存在任何的难点,因为本质上并不是一本技术书,更多是一本管理类书籍,这本书还被软件开发项目管理领域指定为必读书。但无论是否以后有志做管理,只要不是奔着个人开发者去的,本书都值得一读


《Programming in Lua》

今天推荐一本虽然比较小众,但是非常有意思的书《Programming in Lua》,本书的作者就是lua的发明人本尊。发明lua的人写的lua教程,没有比这个更专业的了。(PS:另外还有一本《C语言程序设计》同样也是发明人本尊写的,也非常值得一读)

书本身的内容和一般的语言的教学差别不是非常大,lua这门语言也和javascript非常像,所以前端的同学上手应该会比较快,如果只学过强类型语言的同事,初次上手lua,会有发现新大陆的感觉,基于原型编程给了你非常多的自主性,基本上你可以基于lua再发明一个你喜欢的语言。

lua最有趣的地方是,他的设计初衷有一部分是作为一门嵌入式语言来使用,所以语言设计就会非常简洁轻巧,lua的整个源码包压缩后一共只有300多K,用c语言实现,而且可以很容易得和其他语言结合使用,只需要你这门语言支持与c语言交互,举个网上找的例子:

有这么一段lua代码:

function f (x, y)
  return (x ^ 2 * math.sin(y)) / (1 - x)
end

这里定义了一个lua函数

然后看怎么在c语言里面调用这个lua函数:

double f(lua_State* L, double x, double y) {
  int isnum;
  double z;
  
  lua_getglobal(L, "f");//获取需要调用的Lua函数f
  lua_pushnumber(L, x);//入栈第一个参数
  lua_pushnumber(L, y);//入栈第二个参数

  //调用函数, 2个参数,1个返回值
  if (lua_pcall(L, 2, 1, 0) != LUA_OK)
    error(L, "error running function 'f': "%s", lua_tostring(L, -1));

  z = lua_tonumberx(L, -1, &isnum);//获取返回值
  if (!isnum)
   error(L, "function 'f' shound return a number");
  lua_pop(L, 1);
  return z;
}

脚本语言,或者计算机语言的执行,大部人也就是这样,编译型的语言为了效率,会再去做很多编译优化,但通过这个例子,可以清楚得感受到计算机程序的执行逻辑。

按这个思路,lua也可以反过来调用c,只需要在某个地方处理怎么接受参数,怎么返回,内存怎么处理的问题就行了。

所以lua被大量用在游戏编程,还有会有各种项目把lua作为自己系统的一个控制语言,有余力的同时可以尝试从0开始,把lua嵌入自己常用的语言,我相信对于计算机系统和语言的理解会上一个台阶。


《鸟哥的Linux私房菜》

这次分享的书,在我当时读的时候都还没有成书,只是网络上的一个教程一样的网站,最近几年才成书,内容也比我当时看的时候多了不少,书名叫《鸟哥的linux私房菜》。

鸟哥是台湾人,因为是环境专业转行的,所以写得比较大白话,我记得2012年初读的时候,就算0基础,也能一点点跟着实践,并逐步掌握linux的一些奥妙。

我搜了下,不少人觉得《鸟哥》太厚了,不利于新手入门,其他入门书可以看这个知乎回答:

https://www.zhihu.com/question/30328004

所以推荐这本书,主要是想引出一个话题,我们是不是一定要去学习linux相关的东西,比如平时就是在windows环境下开发Android,或者.net做服务器开发,或者在mac下写写vue的单页应用,真的需要花时间去学习linux吗?

我的建议是,一定要!

img

上图是2016年linux在服务器市场的占有率,可以看到超过80%份额都是linux,还有各种非常小巧的linux发行版,运行在各种手机,嵌入式设备,路由器,智能设备上,也就是说,从广度来说,linux是你在拓展自己知识面的情况下,一定会涉及到的,很有必要特意花时间去学习。

Android的底层也是Linux,osx和ios其实是和linux很像的类unix系统,大量的开源项目,至少都会支持linux系统,无论从哪个角度来说,了解和学习linux,都是一个工程师一定需要尝试的。


《卓有成效的管理者》

今天刚开完和各项目负责人的会议,给大家分享了一本书,我想了下,觉得也有必要给研发部的所有同事分享一下。

这本书是彼得德鲁克的《卓有成效的管理者》

在大公司也好,小公司也好,只要做得不错,都会经历从个人贡献者到管理者的过程,德鲁克的这本书,我觉得可以给所有从个人贡献者到管理者迷茫的同学,提供一个入门式的指导。

但本书也有有很多局限性,比如他是西方管理哲学的抽象和总结,可能会存在水土不服的情况,也不是针对互联网企业的管理书籍,所以不能拿来就用,需要加入更多自己的思考。

阅读本书,我觉得最大的收获并不是,一下子就掌握了管理该怎么做,更多的是,从管理学大师的研究和看待问题的角度,去体会和了解,管理者的思维方式是怎样的,关注的问题是怎么样的,和个人贡献者关注点的区别,通过去思考和理解这个区别,更多的是去转变心态和思维方式,能够帮助自己在日后的工作中,更多地站在团队的角度想问题。