推荐序
既然你翻开了这本关于Go语言的书,那就说明你对Go语言有兴趣,打算学习一下Go语言。不过,在你继续翻阅之前,我先问你一个问题:“你觉得Go语言简单吗?”
简单?不简单?
对于这个问题,有的人会说Go语言很简单,一个晚上就能学完所有语法,也有人会说Go语言不简单,要做到运用自如需要大量磨炼。
为什么会有两个截然不同的答案?因为他们回答的其实并不是同一个问题。真正的问题是:
- Go语言入门简单吗?简单!
- Go语言精通简单吗?不简单!
从入门到精通的路有多远呢?大概相当于从学会说话到写文章发表的距离吧!能说话的人有的是,一般一岁的小朋友就可以做到。但能写文章发表的人有多少呢?即便是在自媒体如此发达的今天,能够利用文字表达自己的也只有少数人,大多数人只能作为信息的接收者。
同样,入门的程序员数量庞大,但真正精通的程序员却为数不多。一个有追求的程序员绝不满足于会写Hello World,他会望向那座叫作“精通”的高峰,但怎样攀上高峰是摆在很多人面前的现实问题。
要精通一门语言,最好的方式是跟着一个已经精通这门语言的人系统学习。然而,并不是每个人都有这样的机会。不是每个人身边都有一位精通这门语言的高手,即便有,高手也不见得有意愿、有能力把自己的知识体系整理出来,倾囊相授。好在这个世界上还有很多高手乐于分享,把知识系统地整理了出来,我们才有机会向他们学习。
从入门到进阶
入门的书与进阶的书有哪些不同呢?入门的书一般讲的是语言本身,按照一个合适的顺序介绍语法规范中的各种细节,最多再增加一些标准库的使用方式就够了。各种语言的差异无非是语法和标准库数量的多寡,基本结构大体类似。
对于编程新手而言,难的并不是掌握这些语法和标准库,而是建立一种思维方式。你只要学会了任何一门程序设计语言,通过了建立思维方式的关卡,再去学习一门新的程序设计语言,就只需要学习具体的语法和一些这门语言特有的知识。所以,程序员通常是“一专多能”的,除了自己最拿手的那门语言,还会使用很多门其他的语言,而更厉害的家伙甚至是“多专多能”的。
那一本进阶的书能告诉我们什么呢?它会告诉我们一个生态。如果说入门书是在练习场上模拟,那么进阶的书就是在真实战场上拼杀。在真实世界中编写代码解决的不再是一个个简单的问题,而是随着需求不断膨胀的复杂问题。我们编写的不是“写过即弃”的代码,所以必须面对真实的问题,比如如何做设计,如何组织代码,如何管理第三方的程序库,等等。这些在很多人眼中琐碎的问题其实是我们每日都要面对的问题,很多技术团队正是因为没有遵循这些方面的最佳实践而陷入了无尽的深渊。而这些内容显然超出了语言本身的范畴,属于生态的范围。
进阶的书很重要,然而,写好进阶的书却不是一件容易的事。一个初出茅庐的程序员就可以写入门书,而只有经验丰富的程序员才能写出进阶的书。这种经验不仅在于写了很多年代码,还在于能够向行业动态看齐。只有这样,写出来的才不是个人偏见,而是行业共识。
如果你是一名Go程序员,而且不满足于在入门水平徘徊,那么这就是为你准备的一本进阶书。
一个高手,一本进阶书
本书的作者白明是一位有超过十年系统编程经验的资深程序员。这里说的程序员指的是那些真正热爱编程,把编程当作一门手艺不断打磨的人。虽然他有着诸如架构师之类的头衔,但骨子里他依然是个不断精进的程序员。
他刚刚开始工作时我们就相识了,那时他就是一个热爱编程的人,时隔多年依然如故。他刚开始用C语言写通信网关这种有着各种严苛要求的软件,但一直在寻找更好的工具。Go的出现让他眼前一亮:一方面,Go与C一脉相承,有着共同的创造者;另一方面,Go引入了一些更加现代的特性,让它更适合大规模开发。于是,白明把自己更多的时间献给了Go。一晃十多年过去,Go由他最初的个人爱好变成了他日常工作中使用的语言。
除了在工作中使用Go,白明还是一位非常积极的分享者,经常在Go社区分享内容。他不仅主导了一个叫Gopher部落的技术社群,还坚持把自己收集到的资料整理成Gopher日报,此外,也在GopherChina这样的技术大会上做过主题演讲。目前,中文社区内最好的Go语言入门教程《Tony Bai·Go语言第一课》就出自白明之手。
如果由一个既有丰富实战经验又有丰富分享经验的人来写一本Go语言的进阶书,这会是Go社区的幸运,而你手上的就是这样一本书。
这本书完全符合我对一本进阶书的定义,在这里你会看到Go语言的生态,你会了解到关于写好Go项目的种种知识。如果说这本书有什么缺点,那就是它太厚了,不过,这恰恰是白明经验丰富的体现。没办法,真实世界就是这么复杂。
如果你能坚持把这本书读完,把其中的知识内化为自己的行动,你的Go项目开发之路将由荆棘密布变成一片坦途,对路上的种种你都会有似曾相识的感觉。
祝你阅读愉快,开发愉快!
郑晔
《10×程序员工作法》专栏作者/前火币网首席架构师/前Thoughtworks首席咨询师