坎德人的小包包

欧剃,游荡的坎德人,在他的旅途中收集了许许多多有趣的东西。

发表日期:2019-05-06

成为优秀开发者之前,这 9 本书你一定得读透

—— 通往优秀程序员世界的作弊码都写在这些书里呢。

作者:Khalil Stemmler


不管你是刚入门的新手,还是已经有了一定经验的程序员,你一定早晚会意识到,在某一个岗位上干了多长时间,并不是一个评判程序员是否优秀的好指标——因为这既不能反映出一个人的真实水平,也不能真正体现出ta工作经验的多少(是,这句话该说给hr听🤫)。

一个人能否在编程领域获得成功,最具有决定性的因素,其实就隐藏在你业余时间所做的事情中,隐藏在你如何主动学习新知识的过程中。

要想提高你的编程技术,有许多很棒的办法,比如结对编程、在线学习、线下聚会,以及额外的工作经验、项目构建经验,还有找一个好导师

我个人最喜欢的学习方式,是翻开一本好书,品味字里行间闪烁着的智慧光芒,吸收多年经验积淀而成的宝贵知识。


以下的九本书,是我个人强烈推荐给每一位开发者(特别是新手)值得一读的好书。这些书在业内都已经产生了强烈的反响,有着广泛的好评,有可能对你的工作、学习都产生深远的影响。

和你想的不一样,这些书并不都是专注在纷繁复杂的技术细节上,而是更多地倾向于提供一些实用的引导,帮助你处理好人际关系、提升专业水平,最终成为一名优秀的开发者。

译注:原作者 Khalil Stemmler 推荐的书籍均为英文版,为方便国内读者,译者在亚马逊等站寻找评分较高的对应中文译本,但还是鼓励有能力的读者阅读原版。

1. 代码整洁之道

Clean Code
作者:罗伯特·C.马丁 (Robert C. Martin) ,昵称“鲍勃大叔”

中文版: https://www.amazon.cn/dp/B0031M9GHC
英文版: https://www.amazon.ca/gp/product/0132350882

在克服了编程的基本挑战并熟悉如何编写代码来解决问题之后,看看这本书是个好主意。事实证明,第一次让代码正常工作实际上只是最容易的那部分。而困难的部分是让你的代码容易阅读,以便其他人能够理解它并在将来对它进行改进。

想想看,如果你不得不阅读像下面这样的代码,那是一种什么体验?

function calculateIt (a, b) {
 if (a.delta < b.element.x) {
   var x = b.element.x;
   return x - b.delta.x
 } else {
   var y = b.next.y;
   var h = b.element.y * 2;
   return y - h
 }
}

源码见:hell-code.js

谁知道它到底是做什么的。像这样的代码可能会起作用,但是当我们需要修改它时,我们不得不希望代码的原作者既没有跳槽,也没有进 ICU,并祈祷他们能够以某种方式“破译”自己多年前写下的东西。

如果不小心注意编写易于阅读和维护的代码,我们最终会得到像这样“让人不敢碰”的代码。如果某天它不工作了,那我们就会有大麻烦了。

鲍勃大叔的《代码整洁之道》将教你认识干净的代码,鉴别出“坏”的代码,并教你如何将其转换为优秀的代码。像这样的任务对大多数人来说听起来微不足道,但当你将这几条简洁的软件设计原则转化为工作习惯之后,这些习惯能让你更加高效地编写出更专业和可扩展的代码。

你知道,我们就是软件行业的手工匠人。构建软件的原则,和建设房子的原则没有什么太大差别——我们都需要注意细节,否则如果第一次没有做好,将来都要花费昂贵的代价去修复之前犯下的错误。

2. 代码整洁之道:程序员的职业素养

The Clean Coder
作者:罗伯特·C.马丁 (Robert C.Martin)

中文版:https://www.amazon.cn/dp/B01LZJ8L9J
英文版:https://www.amazon.ca/gp/product/0137081073

这本书其实并不算是一本技术书籍,因为它是一本教你如何成为这个行业专业人士的书。专业人士在面对挑战、不确定性和压力时,将继续将软件开发视为一种手工艺,并将不懈地坚持他们的专业价值观。

这本书在评估、重构、测试、处理冲突、时间表、避免职业倦怠等方面提供了大量实用建议。这些都是来自几十年来一直在做这些事情的人的,值得信赖的建议。

它教给我们的最棒的东西之一,就是如何做一名诚信的开发者,何时该说“不”以及如何去说。

亚马逊网站的编辑推荐语是:“汇聚编程大师40余年编程生涯的心得体会”。

3. 重构:改善既有代码的设计

Refactoring
作者:马丁·福勒 (Martin Fowler)

中文版: https://www.amazon.cn/dp/B07PKP87K5
英文版: https://www.amazon.ca/gp/product/0134757599

马丁·福勒是我最喜欢的作家之一。原因之一是他很搞笑,他编写的软件书籍无疑有着个人的强烈风格。另一个原因是他非常擅长用简单的方式来解释复杂的主题,而不会让你疲惫不堪。

Ruby on Rails 的作者曾经说过,你应该“在写下另一行代码之前先阅读”《重构》这本书。在书中,福勒会指导你重构一个简单的应用程序,以此向你介绍他在多年的职业生涯中积累和归纳出的一些技巧。

福勒在书中展示了如何在写代码和重构代码之间进行切换,应该多久提交一次代码以及何时编写测试等经验之谈。强烈推荐。本书的最新版本已更新,添加了大量 JavaScript 的范例,这对我来说是一个额外的加分项,因为 JavaScript 是我最喜欢的语言。

4. 设计模式:可复用面向对象软件的基础

Design Patterns: Elements of Reusable Object-Oriented Software
作者:Erich Gamma、Richard Helm、Ralph Johnson 以及 John Vlissides

中文版: https://www.amazon.cn/dp/B001130JN8
英文版: https://www.amazon.ca/dp/0201633612

这是关于设计模式的开创性著作。你问什么是设计模式?设计模式是针对软件开发中的常见问题,提出广为人知的解决方案。如果你熟悉这些模式,你将能够大大减少为这些问题提出解决方案所需的时间。

如果你熟悉设计模式,你还能与其他开发人员更加有效地沟通这些问题的解决方案。

“没错,我就是用一个门面对象覆盖了数据库适配器从策略模式中载入的东西。”
“啊!我明白了。”

对,这本书是有点年头了。但它仍然是最棒的参考书籍之一。如果你希望阅读一些关于这个主题的更新、更友好的书籍,我也推荐你阅读 Eric Freeman 的《深入浅出设计模式》(Head First Design Patterns: A Brain-Friendly Guide)。

5. 领域驱动设计:软件核心复杂性应对之道

Domain-Driven Design: Tackling Complexity in the Heart of Software
作者:埃里克·埃文斯(Eric Evans)

中文版:https://www.amazon.cn/dp/B01GZ6T12K
英文版:https://www.amazon.com/dp/0321125215

为了使大型代码库得以继续扩展,我们需要在逻辑上将代码分成不同的部分。我们的想法是以某种方式对代码进行分区,使得单独的团队可以在不影响其他任何人的情况下处理系统的不同部分。

能够让代码库往这个方向发展,其基本概念被称作“领域驱动设计”(Domain-Driven Design,DDD)。这是一种软件开发方法,我们将存在于“问题域”(现实世界)中的问题建模到若干个解决方案域之中。

当代码库大到一定程度的时候,DDD 就显得尤为重要了。许多大型企业公司采用 DDD 的方法,以便分配不同的团队到公司代码库的某些部分。


贫血模型很快就变得臃肿而繁琐。(图片来自 Vladimir Khorikov 的课程《将贫血领域模型重构成富有模型》)

埃里克·埃文斯创造了“无所不在的语言(Ubiquitous Language)”这一术语,这个词用于在开发人员、领域专家以及领域中的任何其他用户或参与者之间建立一种通用的、全覆盖的“语言”。通过使用这种无所不在的语言进行沟通,就可以确保最重要的领域概念得到很好的理解,并在软件中得到实现。

这本书比我要介绍的其他书更具技术性,也更有挑战。但如果你能熟悉这些概念,就将充分了解当今最大的那些企业是如何保持代码库的可管理性和可扩展性。

最后,这本书是因为封面是蓝色的,往往被人称为蓝皮书。如果你觉得它对新手来说过于艰深,你也可以试试弗农 (Vaughn Vernon) 的《实现领域驱动设计》——这本书在业内被称为“红皮书”,它用更加简明易懂的方式描述了领域驱动设计的概念及其实现方式。

6. 软技能:代码之外的生存指南

Soft Skills: The Software Developer’s Life Manual
作者:约翰·森梅兹(John Sonmez)

中文版:https://www.amazon.cn/dp/B01IB086H4
英文版:https://www.amazon.ca/gp/product/1617292397

作为软件开发人员,我们应该努力保持一种完美的平衡状态。不幸的是,大多数人并没有把“平衡”这种特质和软件开发者联系在一起。而事实上,这种身心的平衡对一个人的学习、健康和整体状态都是非常重要的。

“软技能”是关于实际编程技术之外的重要能力,比如创造力、职业目标和个人理财等。作者还讨论了个人投资,如何在 33 岁退休,健身中的额外技巧,以及如何维持人际关系——这些可不是你在编程社区里能得到解决的问题。

它独特的章节编写方式使得每章的内容相对独立,你可以任意选择适合你的章节开始阅读。

7. 架构整洁之道

Clean Architecture
作者:罗伯特·C.马丁(Robert C. Martin)

中文版:https://www.amazon.cn/dp/B07HN66S4D
英文版:https://www.amazon.ca/gp/product/0134494164

啥?鲍勃大叔写的书就是好,不行吗?

在学校里,我们往往过份关注算法,而不太关注软件设计原则。我认为这可不是件好事,因为实际上,你并不会经常遇到那么多算法挑战。相反,更常见的是,你将面对的是用模块化、灵活、可读的方式来构建代码,以及在需求变化时快速添加新功能的种种挑战。

而《架构整洁之道》中介绍的基本软件设计原则和模式,正是你能够用来应对这些挑战的制胜秘籍。


“整洁”的架构模型,感谢鲍勃大叔!

本书中提出的原则中,最棒的几点是关于依赖产生的成本,稳定代码与非稳定代码的对比,以及“SOLID”原则:编写代码以使其更易理解,更灵活也更易维护的方法。

本书的其他部分中,非常有用的是“尖叫的架构”和“按组件打包”这几个概念,它们将教会你如何更有效地组织你的模块,这样当别人阅读你的项目代码时,这个架构在某种意义上会向读者“尖叫”出项目的全部情况。

本书与“领域驱动设计”密切相关,通过使用“分层架构”或鲍勃大叔称之为“整洁”的架构(也就是所谓“端口”和“适配器”)来实现。对于那些想要提升自己架构知识体系,学习如何有效地在高层对系统进行设计,同时又能在细节层面上优雅地处理依赖的人来说,这是一本很棒的书。

8. 高效的工程师

The Effective Engineer
作者:Edmond Lau

本书未找到中译本。
豆瓣页面: https://book.douban.com/subject/26360716/
英文版: https://www.amazon.ca/gp/product/0996128107

时间是我们生命中最宝贵的资产,我们应该将不断提高时间利用率作为目标。但在现实中,我们往往很容易陷入困境,花费大量时间去修复错误、浪费精力、做重复的工作,等等。而《高效的工程师》就是教你如何在更短的时间内完成更多工作,并避免重复劳动。

我们可以通过一个名为“杠杆(leverage)”的机制来减少在重复性任务上浪费的时间和精力。

“杠杆”可以帮助你鉴别日常的各项事务,挑出那些投入产出比例最差的工作。它是一个可以应用于任何事情的机制,无论是学习、编程、调试……没错,任何事情!

9. 程序员修炼之道:从小工到专家

The Pragmatic Programmer
作者:安德鲁·亨特(Andrew Hunt)和大卫·托马斯(David Thomas)

中文版:https://www.amazon.cn/dp/B004GV08CY
英文版:https://www.amazon.ca/gp/product/020161622X

《程序员修炼之道》是一本应该放在各级开发人员桌面上的书,它以深入浅出、易于理解而著称。 安德鲁和大卫都是程序员,他们不仅在自己的事情上花了很多年时间,还不断地关注他们正在做的事情,并努力确定是否可以做得更好

本书凝聚了他们多年的经验和总结,介绍了程序员职业生涯中要遵循的一些基本哲学理念,比如“程序员应该有‘要么只做一次,要么将它自动化’的理念”。

它包括了许多简明又详尽的建议,在编写另一行代码或启动新项目之前,你应该随身携带,并谨记在心。

结语

作为新手程序员或初级开发者,书籍确实是提高知识和技能的最佳工具,还往往具有很高的投资回报率——你知道学好编程可以赚很多钱吗?😉

这些只是我个人认为 2019 年最好的一些书籍。它们并不是最新的,但那不过是因为“编程”这件事多年来一直保持着相同的一般哲学和最佳的实践做法。作为一名教授,我曾经不得不说,“你只需阅读这些该死的手册,就可以在这个行业赚很多钱”。

那么,亲爱的读者,你读过这些书吗?有没有什么看法可以跟我们分享?如果你发现了其他未提及的好书,欢迎留言告诉我!

拓展阅读

除了上面的 9 本书之外,这里还有一些关于类似主题的额外文章。如果你没有办法腾出时间精读上面的这些书籍(我强烈建议你读一读),那你也可以通过下面这些文章对这些重要概念有所理解,希望这在你的程序员之路上能有所助益。

  • 重构.guru: https://refactoring.guru/
  • SOLID 设计原则: https://stackify.com/solid-design-principles/
  • DRY 原则(Don’t Repeat Yourself): https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
  • NodeJS 及其优秀实例: https://blog.codeminer42.com/nodejs-and-good-practices-354e7d76362
  • 在 Node.js 上实现 SOLID 和“洋葱”架构: https://dev.to/remojansen/implementing-the-onion-architecture-in-nodejs-with-typescript-and-inversifyjs-10ad
  • 利用“整洁”的架构实现更好的软件设计: https://fullstackmark.com/post/11/better-software-design-with-clean-architecture
  • 架构整洁之道官方博客: http://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

继续努力,继续成长,并祝你时刻乐在其中!加油!


图片来源:UnSplash

(本文已投稿给「优达学城」。 原作: Khalil Stemmler 编译:欧剃 转载请保留此信息)

编译来源: https://medium.freecodecamp.org/9-books-for-junior-developers-in-2019-e41fc7ecc586

标签:UdacityTranslate

Powered by Jekyll on Github.io
2022 © 欧剃