2020年程序员/工程师必看的三本编程书籍

简介: 因为新冠肺炎疫情,很多同学都宅在家中,所以有大把的时间进行学习和充电。作为程序员或工程师的你,想要在代码方面更精进一步的话,应该看哪些书?

因为新冠肺炎疫情,很多同学都宅在家中,所以有大把的时间进行学习和充电。作为程序员或工程师的你,想要在代码方面更精进一步的话,应该看哪些书?我们特地邀请 支付宝研究员王益来分享他的书单。顺带说一下,王益是 SQLFlow项目和ElasticDL项目的发起者和负责人,其中机器学习工具SQLFlow在GitHub上短时间内就获得了很多Star数,是一个人气很高的开源项目。 

下面我们一起来看看,这位资深程序员最喜欢的编程书籍是什么?


前几天,同事问我如果用平时通勤的时间来充电,应该看什么书。我回忆了一下对我影响最大的三本编程书。

图片3.png

《Structure and Interpretation of Computer Programs》

第一本是《 Structure and Interpertation of Computer Programs》,简称为 SICP,这本书有在线版本:https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html 。这是曾经 MIT 计算机系本科生的教材,用 Lisp 的一种极简的方言 Scheme 语言作为初学者编程语言 —— 而不是常用的 Java、Python、C —— 是不是很反智?实际上,这正是这本书的精髓。

大部分程序员如果被问到一个问题:如何把一串整数顺序颠倒过来,大家会考虑用一个数组存储这些整数,用两根指针分别从数组两段向对面扫描,依次交换两根指针指向的整数,直到两根指针相遇。其实类似的问题,这样的解决思路,在美国公司的面试里也经常碰到。它让程序员充分利用内存是 randomly accessible 的特点,来选择高效率的数据结构,设计高效的算法。

SICP 不管效率。SICP 不管效率。Scheme 语言本身也不提供数组(有些 packages 提供),只有 list(链表)。用链表存储的一串数字如何倒序?其实也有效率很高的解法 —— 比如可以递归。递归是一种程序的写法,一种表达方式 —— SICP 训练的是大家如何表达 —— 这更像语文课,而不是编程课。可是换一个角度思考,编程不就是用编程语言表达的一种语文吗!

SICP 通篇介绍两种表达的艺术—— 抽象(abstraction)和构造(composition)。定义一个递归函数是一种抽象,递归过程解构(decompose)链表,回溯过程重构链表(compose)—— 这是设计大型软件的核心思维方式。MIT 本科课程中,在用 SICP 启蒙之后,还是要学习数据结构和算法的。只是这个顺序 —— 先识大体,再纠缠细节 —— 很重要。

SICP 是我读博士的时候,我的同学王垠推荐我看的。其实至今没有通篇读下来。但是读了的部分,已经在我的职业生涯里给了我很大的帮助。我记得第一次读的时候我感叹“为什么我不是由这本书启蒙的!”

《The Art of Unix Programming》

第二本书是 《The Art of Unix Programming》,也有在线版本:http://www.catb.org/~esr/writings/taoup/html/。Unix 有很多设计的智慧。其中我印象最深刻松耦合(loss coupling)—— 是 SICP 中强调的抽象(abstraction)和构造(composition)的具体做法 —— (de)compose 时 components 之间的耦合要送,abstraction是要保证界面(interface)窄(简洁)。

Windows 用户用 Word 的时候,可以在文档里嵌入 Excel 点子表格,用的 OLE、COM 这类插件技术。如果 Excel 的 COM 组件有 bug,运行的时候出错,那么 Word 也会 crash。这是一个紧耦合导致系统稳定性下降的例子。人非圣贤,总会写bug,系统设计要限制 bug 导致的糟糕结果的扩散。

在 Unix 的世界里,每个程序都只专注做一件很小很具体的事情,比如 ls、sed、awk;同时提供很多机制(shell、shell script、pipes、environment variables),把这些程序组织起来 —— 组织方式灵活又宽松。用这些简单的基础单元,大家很容易组合(compose)出很复杂的系统。

我在做 code review 的时候,经常看到的一个问题是一大段程序同时解决好几件事情。或者发一个修改了很多文件的修改(pull request),修复好几个问题。其实都是属于没有认真解构(decompose)得到基本单元,然后以松耦合的方式组合(compose)的例子。

《Paul Graham's Essays》

Paul Graham 是硅谷著名的工程师、创业者、和投资人,创办了 Y Combinator —— 是的,就是陆奇老师加入,并且在中国独立融资和运营的那个。在他的主页上有一系列著名的文章:http://www.paulgraham.com/articles.html,其中最有名的可能是 Hackers and Painters(黑客和画家)。其实这些文章解答了大部分程序员常问的问题,每一篇都值得认真阅读和思考,甚至和同事朋友们讨论。

比如,创业公司应该雇佣 Java 程序员(因为人多,所以容易找到员工)还是Go 程序员(小众,人少)?Paul 写这些文章的时候,Go 还没有被发明出来。不过在多篇文章里,他提到他用 Lisp 语言创业获得第一桶金的经历 —— 创业公司不可能靠大众水平反超巨头,要找高手出奇制胜,应该用小众语言、人才、技术和商业模式。

这也间接解释了为什么 MIT 一度用 Scheme 语言和 SICP 来启蒙程序员 —— 因为能考上 MIT 的都是高手,要训练他们掌握 abstraction 和 composition 这样思考能力,从而能设计和组织一般人主持不了的大规模系统的研发。 

再比如很多人问编程语言重要吗?我甚至听过一种论调:所有语言都是实现的图灵机的能力,都一样。那为什么大家不用汇编写程序呢?也有人改称:高级语言都是提供顺序执行、选择分支、循环、函数调用这些控制结构(control flows),没有区别。可是 Lisp 还有 coroutine、Go 还有 goroutine 哦。而正是 coroutine 和 goroutine 使得这两种语言在开发后台应用的时候,可以用比 C++ 和 Java 少的多的代码,高效率地描述复杂的逻辑。在 https://zhuanlan.zhihu.com/p/48181202 这里,我转述了 Paul 的观点。


2月19日—2月26日 ,蚂蚁金服将开展“共战‘疫情‘,技术破局”数字课堂线上直播。想要了解更多蚂蚁金服技术,欢迎扫描下方二维码,进入直播间观看。

直播海报.png

相关文章
|
弹性计算 tengine 负载均衡
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
2835 0
云原生 - 负载均衡(SLB)配置 HTTPS 访问设置
|
机器学习/深度学习 人工智能 算法
图解机器学习 | KNN算法及其应用
KNN算法(K近邻算法)是一种很朴实的机器学习方法,既可以做分类,也可以做回归。本文详细讲解KNN算法相关的知识,包括:核心思想、算法步骤、核心要素、缺点与改进等。
5158 1
图解机器学习 | KNN算法及其应用
|
10月前
|
Kubernetes Cloud Native Nacos
nacos3.0
Nacos 3.0实现从配置中心到云原生控制面的跃迁,通过引入JRaft提升集群性能与稳定性,支持gRPC和xDS协议,打通服务网格生态,构建统一、可扩展的多集群服务治理平台,成为云原生基础设施的核心控制中枢。
什么是单项式
单项式是代数式中的一种
|
监控 网络协议 视频直播
UDP协议(特点与应用场景)
UDP(用户数据报协议)是传输层的一种无连接协议,具有简单高效、低延迟的特点。其主要特点包括:无连接(无需握手)、不可靠传输(不保证数据完整性)、面向数据报(独立传输)。尽管UDP不如TCP可靠,但在实时通信(如语音通话、视频会议)、在线游戏、多媒体流媒体(如直播、点播)及网络监控等领域广泛应用,满足了对速度和实时性要求较高的需求。
1826 19
|
消息中间件 Kafka RocketMQ
Kafka分区副本与RocketMQ队列的区别
最近在学习 Kafka,发现其核心概念与 RocketMQ 还是存在一定的差别,下面我来说下 Kafka 分区 与 RocketMQ 队列之间的区别。
1206 1
Kafka分区副本与RocketMQ队列的区别
|
域名解析 弹性计算 负载均衡
阿里云——超大流量网站的负载均衡
阿里云——超大流量网站的负载均衡
999 0
|
机器学习/深度学习 PyTorch 算法框架/工具
SE 注意力模块 原理分析与代码实现
本文介绍SE注意力模块,它是在SENet中提出的,SENet是ImageNet 2017的冠军模型;SE模块常常被用于CV模型中,能较有效提取模型精度,所以给大家介绍一下它的原理,设计思路,代码实现,如何应用在模型中。
6357 0
|
存储 关系型数据库 MySQL
Docker中MySQL的安装与实践
MySQL 是世界上最受欢迎的开源数据库。凭借其可靠性、易用性和性能,MySQL 已成为 Web 应用程序的数据库优先选择。我们在写 Demo 项目或者学习的时候,都经常会使用到 MysQL 数据库或集群,使用 Docker 能方便随时随地的搭建数据库环境。
1039 0
Docker中MySQL的安装与实践
|
存储 消息中间件 监控
释放Trace的价值-SLS OpenTelemetry新功能直击痛点
SLS在2021年4月份正式发布了对OpenTelemetry Trace 1.0版本的支持,完全兼容OpenTelemetry Trace1.0版本的所有字段,提供了Trace显示、分析、拓扑展示等功能。在功能发布后,众多客户开始接入SLS Trace并深度使用,其中对我们也提出来非常多的建议和需求。从中我们提取出了呼声最高的一些功能和优化点,加入到了SLS的Trace方案1.1版本中。
2245 1