前言

安安静静地写代码不知不觉已经十几年,这期间偶尔会有同龄的程序员朋友对我倾诉:他变得不喜欢编程啦,又或者因升为领导而沾沾自喜——总算不用编程了。我听了挺难过的,一个你不喜欢的高强度脑力工作,还吭哧吭哧干了十多年,这该多么痛苦啊。我遇到更普遍的老程序员的态度是:不喜欢也不讨厌,就一份工作而已。

我发现自己对于编程的兴趣曲线似乎与众不同,是从一开始的既不喜欢也不讨厌,到现在的越来越喜欢,算是后知后觉型。为什么会有这样的变化?除了天赋有限,我觉得和自己内心深处的兴趣点密切相关。

我也在不断追逐技术潮流,但更感兴趣的始终不是新框架带来了哪些新概念,而是背后那些最朴实、最基本的代码结构的本质,是那些最通用的编程技巧。跟随并学习潮流技术只是我的手段,能不断补充属于我的编程技巧才是最终目的。渐渐地,对软件编程的很多困惑,在我坚持了十多年后纷纷得以解答。这正是我的兴趣曲线不降反升的原因。

所以呢,我的程序员生涯并不完美,始终慢别人一拍地去学习。也有沮丧也有迷茫,还好我一直清楚自己最想要的是什么:在能满足温饱的同时,我要解答自己最想知道的那部分疑惑。坚持到现在,也足以让我写本书与大众分享了。

我总认为代码所描述的世界,也有它的哲学内在,这个世界有自己的运行规律,有属于自己的世界观。每次我理解完一个新东西,总是试图往规律或内在方面去挂钩。哪怕是一些简单技术,也要琢磨一下它的本质到底是什么。

比如,我认为编程中组织代码的能力,说白了就是将各种API串起来的能力,无论是针对新鲜的、高大上的API,还是已经淘汰的API。最近层出不穷的新技术,比如搜索、云计算、区块链等,要使用它们,不可能自己去从头开发。那些基础设施,牛人们一般已经给你开发好了。作为一名普通的程序员,你面对的终究还是一堆一堆的API,然后以业务需求为基础,去组织这些API。如何能让凌乱的代码组织得更好,正是本书要讨论的重点内容。

因此,本书所讲的基本都是编程的通用知识点,它们是10年甚至20年都不会淘汰的编程技术,也是每个人都会遇到且思考过的问题。而决意写这种题材的编程书确实需要勇气。

网上当然有很多相关资料,但太分散。其中很多都是初学者自己学习时的体验心得,但初学者总结的规律往往缺乏厚度。可当你有足够多的实战经验,可以总结更有价值的内容时,却在忙着学习其他新知识,并不会特意花时间分享你早已掌握的知识。这就是现实情况:很多真正有价值的东西,仅在高手的脑子里,而得不到传承。

另一方面,这些10年甚至20年都不会被淘汰的编程知识,市面上也极少有将它们综合起来并讲得有意思的书。我按照自己的理解和领悟,把许多知识点汇入到这本书里。它们都不是潮流的知识点,而是厚重的基础知识,因此,本书值得保存在你的书架里很多年。

我不敢推测大家是否喜欢这本书,但是如果是我自己,刚工作3~5年时看到这本书,一定会非常喜欢。

我力图让“本书处处充满干货”这句话落到实处。如果你工作了3~5年,我相信这本书会对你的技术提升有立竿见影的效果。如果你才开始工作,它能帮你建立良好的代码世界观,更容易理解代码的世界。

我深知,充分理解这些技术的过程是枯燥的。为了保持易读性和趣味性,我尽量让书里的每段代码都足够短,代码难度尽量低。书里还有大量的比喻,每一句都是仔细斟酌过的,自认为类比蛮贴切的。我一直认为类比推论如果相似度不高,其实会起反效果,那还不如不用。所以每当我想出了一个绝好的比喻时,可能比想通一个技术难点还开心。

为了保证原创性,我尽量避免看同类的文章和书,生怕思路被带走。虽然这样做,有些结论可能失之偏颇,但我认为值得。所以请每一位读者带着怀疑的态度来阅读本书,这样能让你们受益最多。

最后,总结一下本书的几个要点。

 编程最基础的是语法,但语法仅仅是编程最底层的强制性约束。在这之上还有很多需要自我约束的规则,而这些规则正是本书要讲的重点。比如:

■ 如何面向抽象编程和面向接口编程;

■ 耦合的本质,解耦的原则;

■ 用面向对象的方式看世界,以及对象之间的关系;

■ 把变化抽象成数据;

■ 把容易变化的逻辑,放在容易改变的地方;

■ 隐式约定和显式约定。

 本书的代码并没有局限于某种特定语言,基本上是针对某种场合,哪种语言描述最合理、最简洁,就采取哪种。有的知识点即使不是所有语言都支持的,但肯定也是绝大多数语言都支持的功能。而且,我也相信一个程序员一生不可能只用一种编程语言。

 很多知识点阐述的角度可能与一般人不同。我喜欢见微知著,从小往大讲。所以书中会从简单的if...else语句深入到开闭设计原则,从static关键字深入到类扩展,从bool变量深入到描述业务的规约,从散列表深入到控制反转原则,从数据化过渡到反射。我相信一个技术哪怕你懂了,当换个角度去理解它时,还是能收获很多新东西。

 每一种技术都会对应着各自的应用场景,不熟悉它们的应用场景,就存在滥用的风险。而这些只能靠多年的经验去积累。所以本书极其强调需求背景,也就是应用场景,这也是它区别于其他书最重要的特征。套用一句话:“一切不以应用场景为背景去探讨设计优劣的,都是耍流氓。”本书有大量我经历的真实案例,里面都描述了详细的需求背景。你看书的时候,就像身边有一位老程序员,隔着时空,把他多年的实战经历和思考的结晶对你娓娓道来。

 本书包含了很多编程之外的章节,即“武戏”之余还添有“文戏”,例如:

■ 编程就是用数学来写作;

■ 语言到底哪种好;

■ 程序员的精神分裂;

■ 程序员的组织生产;

 程序员的技术成长。

这些章节和写代码并没有直接关系,但我认为这些都是代码世界观的延伸,都是为了更好地去理解代码世界。我相信,很多程序员对这些话题也会很感兴趣,这些内容值得一看。

目录

  • 前言
  • 第1章 程序世界的两个基本元素
  • 第2章 用面向对象的方式去理解世界
  • 第3章 面向抽象编程——玩玩虚的更健康
  • 第4章 耦合其实无处不在
  • 第5章 数据的种类——生命如此多娇
  • 第6章 数据驱动——把变化抽象成数据
  • 第7章 对象之间的关系——父子、朋友或情人
  • 第8章 函数的种类——迷宫的结构
  • 第9章 面向接口编程——遵循契约办事
  • 第10章 if...else的多面性
  • 第11章 挖掘一件神秘武器——static 
  • 第12章 把容易变化的逻辑,放在容易修改的地方
  • 第13章 隐式约定——犹抱琵琶半遮面 
  • 第14章 异常,天使还是魔鬼
  • 第15章 多线程编程——在混沌中永生 
  • 第16章 单元测试——对代码庖丁解牛 
  • 第17章 代码评审——给身体排排毒
  • 第18章 编程就是用代码来写作 
  • 第19章 程序员的精神分裂——扮演上帝与木匠
  • 第20章 程序员的技术成长——打怪升级之路
  • 第21章 语言到底哪种好——究竟谁是屠龙刀
  • 第22章 程序员的组织生产——让大家更高效和亲密
  • 第23章 程序员的职业生涯——选择比努力更重要