前言
我在 2014 年入职 ThoughtWorks 后,做了近 4 年的人才培养。在 2018 年底,我开始从事对外咨询和培训工作,然后又带着一群新技术顾问去对顾问要求比较“严苛”的客户那里做咨询。在这个过程中,一个让我割舍不掉,并且在潜意识中也无法停止思考的问题就是:怎么培养人?
尤其是与教毕业生和 Junior 的员工如何写代码和做项目相比,带 Senior 的人做咨询工作是有非常大的不同的。
这篇文章,就围绕我所精挑细选的“新技术顾问必读的十本书”出发,来给大家分享我在培养“通用型软件技术顾问”的过程中的一些思考。
也希望能够以这篇文章开始,将“如何培养软件技术顾问”这个问题进行不断的探索和总结,来补全我们过去一直以来所进行的“软件人才培养”的研究。以期日积月累,最后成书。
通用型软件技术顾问的基线能力
首先,我需要对我所指的“软件技术顾问”做一个约束,即:通用型软件技术顾问。
所谓“通用型软件技术顾问”,我给出一个定义,就是:
具备软件技术咨询基线需要的技术知识广度,同时基于自身过去的积累和沉淀,在某一专项领域有知识深度的技术顾问。
PS:在这里,我主要聚焦的是“知识广度”,而非“知识深度”,并不是说知识深度不重要,而是知识深度这件事儿,取决于每一个领域知识的具体内容,在做基线化要求的时候,将会非常的专项和细节,这些属于未来进行专项基线化的内容,在此就不赘述。
对于通用型软件技术顾问来说,软件工程的端到端实践知识是其非常重要的能力基础。换句话说,如果不知道,也没有亲自实践过一个软件是如何通过现代的软件开发方法论开发出来的,那么就无法从全局视角出发,在为客户实施技术咨询服务的时候,进行全局分析和思考,非常容易陷入某个非常狭窄的局部问题出不来。
在这里,我把上面这句话拆成三个关键词:
现代软件工程
端到端实践经验
端到端知识体系
首先,我们来说一说什么叫“现代软件工程”。所谓“现代”其实就是相对于我们这个行业,尤其是国内的广大“传统”IT 组织来说的。现代的软件工程方法论,一方面以当下最火的 DevOps 运动为代表,该运动以跨部门和角色协作、持续交付、敏捷/精益思想以及构建生机型文化为核心,通过对软件研发过程的全局性优化,加速 IT 组织的响应力。另一方面,以设计思维(Design Thinking)和领域驱动设计(Domain Driven Design)的日趋火热为代表,强调通过协作设计来消除传统软件工程部门墙(角色墙)高筑的工作方式。
PS:这里需要强调的是,对于一个技术顾问来说,不光要知道现代的方法怎么做,更需要知晓方法的演变历史,和不同方法在其特定历史时期的优势和劣势。
其次,来说一说什么叫“端到端实践经验”。其实就是一个技术顾问,是否在过去的工作中,从事过并熟悉软件开发从需求分析、设计、实现、测试、上线及运维的全过程。通常来说,一个工作经验在 5-8 年左右,并且担当过开发团队技术负责人(Tech Lead)的全栈软件工程师(至少是要在了解一定前端开发知识的基础上,熟悉后端开发。这里不是对前端开发有什么偏见或者歧视,主要是我遇到过的绝大多数纯粹的前端开发工程师都不太了解系统架构知识,或者都不太具备系统架构的经验),理应在实际项目中实践过并具备这些能力。
最后,来说一说什么叫“端到端知识体系”。其实就是说:“干过很重要,但是干过却不能系统化的说出来为什么这么干,那就是纯粹的片面经验主义,是缺乏体系支撑和说服力的。”——这个是软件技术顾问与普通软件技术开发人员最为关键的区别之一,也是本文“必读的十本书”的核心理由。我相信,但凡是善于总结抽象,并且通过长期的实践、思考和总结,很多优秀的软件架构师或工程师都能够形成一套自己的体系化思想和方法。但是与其“自己重复造轮子”,不如“站在巨人的肩膀上”,如果能够阅读足够多必要的经典书籍,那么就能够快速的积累和匹配自己的经验和思考,一方面降低知识总结和沉淀的成本,另一方面则能够与业内的绝大多数人统一语言和认知,通过引经据典等方式更好的提升咨询过程中的说服力。
而对于一个通用型的软件技术顾问来说,其应该具备的知识体系,就好比应该了解如何能够建一座大楼:
知道如何画图纸:知晓现代的系统架构能力
知道施工的流程:知晓现代的工程实践能力
知道施工的工艺:掌握现代的编码基本手艺
根据我在技术咨询工作中的经验和观察,我将这三个维度的基线能力定义如下(如图所示):
总结一下,对于一个通用型技术顾问来说:
应当能够在云原生的背景下,通过领域驱动设计的方式,基于业务边界进行架构,选用以微服务架构和分层架构为代表的,不同层面的恰当架构风格承载架构设计,结合康威定律或逆康威定律实现组织与架构相匹配,最后利用演进式架构的思想,对架构进行度量、守护和演进。
在帮助客户落地架构设计的过程中,需要构建全功能团队,落实 XP(极限编程)、Scrum、Kanban(看板方法)等以价值交付为核心的软件工程实践,通过持续交付的方式交付可工作的软件,最终匹配 DevOps 所倡导的研发运营一体化价值观。
最后,“Talk is cheap, show me the code.”——在代码级别应用适合的编程范式及其原则,帮助客户应用测试驱动开发实现增量式设计减少冗余,并将重构植入开发团队的 DNA 变成编程的基本功,最终达成整洁代码的要求。
通用型软件技术顾问必读的十本书
当我们定义了通用型软件技术顾问的基线能力后,就可以针对这些基线能力应该具备的基本知识寻找相应的书籍来学习和构建相应的体系化知识了。
这里,我结合了我的阅读体验和对实际工作需要的观察,精挑细选出来了 10 本我认为通用型软件技术顾问必读的书,并按照基线能力进行分类,在这里推荐给大家。
在实际带领新技术顾问进行咨询工作的过程中,经过验证,如果一个新技术顾问能够认真阅读(并且真正领会)过书单中的 5 本左右的书籍,那么在理论层面上,就能够具备相当丰富的知识储备。结合其在项目上所积累的经验和特长,就能够很好的应对客户现场的大多数问题和挑战,从全局出发思考和分析问题。
PS:当然还有一个屡试不爽的方式,就是当我去面试和判断一个人是否适合做技术咨询工作的时候,我只需要快速的问一下他读过书单上的几本书,然后针对读过的书问他的总结和理解就基本上能够快速过滤掉绝大多数的不胜任者了。
同时,我也在豆瓣上,通过豆列的方式记录了这些书籍,为了也会根据实际需要进行持续的更新或增减:
https://www.douban.com/doulist/119965864/
编码能力
在编码能力方面,我们的关注核心为重构(Refactoring),因为重构是能够将面向对象设计原则(OOP)、测试驱动开发(TDD)、整洁代码(Clean Code)、设计模式(Design Patterns)等关键编程基本手艺串起来的主线,同时重构也是技术顾问最为关键的咨询内容,以及验证咨询师编码基本功的法宝。
所以,我在这里为大家推荐了两本书(按照阅读的递进顺序):
《重构 2:改善既有代码的设计》
《数据库重构》
而至于设计模式,我的建议是别看重量级的书了,推荐个我觉得非常不错的网站便于速查,言简意赅还配备伪代码和多种语言的示例代码(当然也包括中英文版在线内容和付费电子书):
https://refactoringguru.cn/design-patterns
《重构 2:改善既有代码的设计》
无需太多赘述,《重构》一书作为 Martin Fowler 所编著的程序员圣经级书籍,是每一个程序员都应该阅读的。如果没读过的话,那么很遗憾,基本上我觉得也不太能把代码写好。
这里需要注意的是,作为《重构》一书的第二版,老马同志在减少了大量现在已经不太常见的重构手法的同时,用 JavaScript 改写了所有的代码示例。作为普通的程序员来说,直接看第二版问题不大,但是作为一名技术顾问来说,还是需要把第一版和第二版都看一遍的,尤其是要知道两本书对比调整了什么,而且也便于与很多读过第一版的客户进行交流。
《数据库重构》
除了代码本身之外,不论是现在的云原生、微服务还是代码重构本身,一个永远绕不过去的问题就是:数据库如何进行迁移和重构?这本书会为你补全重构在数据库层面的方法。
幸运的是,很多重构相关的书里,老马等人都提到过《数据库重构》这本很多年前出版的书,这也是目前市面上能够找到的少有的数据库重构相关的书(中文版的纸质版也已经绝版了,只能买二手或者下载到 PDF 的扫描版)。同时也比较幸运的是,数据库,尤其是关系型数据库的基本理论也已经非常稳定和成熟,所以老书依然不过时。
架构能力
在架构能力方面,我们需要关注的维度和层次非常多,这也是一个系统架构师和普通软件工程师的关键能力区别。
我在这里为大家推荐了六本书(按照阅读的递进顺序):
《领域驱动设计模式、原理与实践》
《架构整洁之道》
《微服务架构设计模式》
《演进式架构》
《数据密集型应用系统设计》
《企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战》
《领域驱动设计模式、原理与实践》
为什么要推荐这本名不见经传的《领域驱动设计模式、原理与实践》,而不是更加有名的《实现领域驱动设计》呢?
是因为这本书相对于《实现领域驱动设计》来说更新一些,体系和理论更加完善,并且配图和解释也很经典,我知道很多做 DDD 的顾问都很推荐这本书,我的很多疑惑也是在看这本书的时候得到了解答。所以如果只推荐一本书的话,我肯定则只推荐这一本,只是这一本的中文翻译水平实在是太差,而且中文纸质版也已经绝版了(也还是能下载到扫描版),最好的方式是弄本英文原版 PDF 对照着看。
当然,如果你是一个准备深耕 DDD 的技术顾问,我还是建议 DDD 有过的书都看一遍,这样能够了解其中很多概念的演变,以及不同作者的不同理解,以便形成自己的思考。有关于概念上的混乱问题,我写过一个相关文章请见:
https://huhao.dev/posts/58fe0824/
《架构整洁之道》
人称“Bob 大叔”的 Robert C. Martin 堪称实践出真知的“我辈楷模”,《代码整洁之道》、《敏捷软件开发:原则、模式和实践》、《UML:Java 程序员指南》等书都堪称程序员必看书籍。而《架构整洁之道》这本书则记录了 Bob 大叔对于架构设计,尤其是耦合关系的处理的思考。是分层架构思想方面不可缺少的重要读物。
当从 Clean Code 再到 Clean Architecture,是一个非常重要的程序员自我追求的关注视角从代码向架构的转变,也能够补充解答很多在阅读 DDD 相关书籍后,对于分层架构实现方面的疑惑。同时,2019 年,Bob 大叔出版了他的 Clean Agile 一书,视角再次转向了软件开发过程,也可以作为补充阅读。
《微服务架构设计模式》
微服务的概念自从老马在 2014 年以博客的形式炒火之后,相关实践和经验已经有了突飞猛进的发展。如果希望以一本书来全面了解微服务比较新的理论和实践,那么《微服务架构设计模式》这本书是非常适合的。
抛开书中作者夹带了一些自己的私货不谈,这本书最令我印象深刻的是作者将微服务架构的关键方面抽象为模式,然后介绍了各种模式的适用场景和优劣势,以及相互之间的关系。这种将经验抽象为模式,再用模式去匹配和解决所遇到的问题的方式,是每一个技术顾问最需要具备的能力,希望本书能够给你以启发。
《演进式架构》
作为业内端到端交付能力的典范 ThoughtWorks,以 Rebecca Parsons 和 Martin Fowler 为代表的业内方法论的倡导者,提出了演进式架构(Evolutionary Architectures)的思想,通过“适应度函数”、“增量变更”和“架构耦合”三个维度,为我们介绍了如何能够以业务运营指标等多维度对我们的系统架构进行基于持续交付的度量和评估,从而实现架构的持续演进的思想。
虽然这本书所承载的演进式架构思想非常的高阶,还缺乏一些可操作的具体指导,但是对于一名技术顾问来说,则已经能够指导我们去思考如何对我们辛辛苦苦做的架构设计进行守护和演进了。这本书也是为了给技术顾问的知识基线拔高一个层次。
《数据密集型应用系统设计》
是的,如果说重构要有数据库,架构更要有数据库相关的书籍!那么这本中文版刚刚上市不久的《数据密集型应用系统设计》就是一本能够较为全面的学习和了解数据处理和应用相关知识的必读读物。(如果想更多的了解数据库的话……考虑下《七周七数据库》?)
这本书和我前述所推荐的众多架构书籍一样,都是超脱了具体技术栈或工具,专注讲理论和思想的书籍,是通用型技术顾问透过实现细节,了解背后完整思想体系的好书。
《企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战》
如今做咨询,尤其是在中国做软件咨询,完全绕不开“中台”这件事情,几乎所有的客户都在建“中台”(至于大家理解和做的到底是不是中台,那是另外一件事儿……)。如果没有阅读过中台相关的第一本书,你就很难去将铺天盖地的中台相关文章和资料联系起来,去伪存真的理解中台到底是个什么东西,所以这也是一本非常典型的市场需求拉动的读物。
当然,这本书里有关中台的思想主要集中在前几章,后面大量的篇幅都在讲阿里巴巴在实践中台过程中所实践的技术解决方案和产品的由来。所以,在看完这本书之后,我还是强烈推荐大家阅读我的同事王健所写的《白话中台》系列,便于快速的获取和更新中台相关的思考和认识。
工程能力
在工程能力方面,我们更聚焦技术侧所关注的内容,这里面就是以持续交付为核心,以 DevOps 来拔高,至于敏捷/精益相关的管理侧书籍,由于非常多,所以暂时不纳入,未来我会写另一个管理侧的书籍推荐。
我在这里为大家推荐了两本书:
《持续交付:发布可靠软件的系统方法》
《DevOps 实践指南》
《持续交付:发布可靠软件的系统方法》
都在说持续集成和持续交付,如果没有看过《持续交付》这本书的话,就别谈什么持续集成和持续交付了……
这本书可以说是持续交付的基础理论读物,好比“语数外数理化”,是每一个软件开发工程师的必读书籍。这本书也是下一本书《DevOps 实践指南》的前置读物,如果不能打好基本的理论基础,将很难理解 DevOps 的很重要的一个理论基础。
《DevOps 实践指南》
《DevOps 实践指南》是《持续交付》的作者 Jaz Hamble 与其他人一起合著的 DevOps 代表性书籍,也是横向的向大家介绍了 DevOps 的思想和相关的知识。换句话说,如果没看过《持续交付》和《DevOps 实践指南》,就别给我提 DevOps 了……
PS:需要注意的是,这本书的中译本最后部分被夹带了某公司 DevOps 认证的私货,正如 DevOps 被炒的非常火爆一样,我们还是在阅读的时候关注其核心内容,不要被认证课程带偏了。
总结
在这里,把以上十本书再罗列一下(按照推荐阅读顺序):
编码能力类
《重构 2:改善既有代码的设计》
《数据库重构》
架构能力类
《领域驱动设计模式、原理与实践》
《架构整洁之道》
《微服务架构设计模式》
《演进式架构》
《数据密集型应用系统设计》
《企业 IT 架构转型之道:阿里巴巴中台战略思想与架构实战》
工程能力类
《持续交付:发布可靠软件的系统方法》
《DevOps 实践指南》
如果记不住没关系,再提醒一下,我将这些书收录到了我的豆瓣豆列中,并在未来会持续维护:
https://www.douban.com/doulist/119965864/
而很多时候,我相信对于很多人,最大的挑战来自于:“我坚持不下去读书啊!”
针对这个问题,推荐你阅读我曾经写过的一篇文章《44天读8本书——习惯养成不能靠信念和鸡汤》,对于想要成为一名技术顾问的朋友,我也就只能帮你到这里了,是走是留都是你自己的事情。
最后,我还是要强调这样一句话:
“Talk is cheap, show me the code.” - Linus
读书和理论固然重要,实践和实操不可分。大家切莫忘了去将自己所学到的知识进行实践,或者刻意练习。
愿你做一名又会讲理论又会写代码的技术顾问,不要做只会靠说的技术顾问,也不要做不会说的技术顾问。
希望本文对希望成为技术顾问的朋友有所帮助。
作者介绍:
胡皓
ThoughtWorks 首席咨询师。十年以上软件开发工作经验。从士兵成长起来的软件技术顾问,从事过广泛的业务分析,项目管理,全栈软件开发、培训和技术咨询等工作。当前,作为 ThoughtWorks 中国区咨询 BU 数字化架构能力团队的负责人,正深耕于以演进式架构、领域驱动设计、云原生微服务为代表的数字化架构能力,帮助客户实现软件工程能力提升和数字化转型的目标。
原文链接:
https://huhao.dev/posts/56bcf73b/
评论