为了进入专业的编程领域,我们需要认真学习以下三方面的知识。

编程语言。你需要学习C、C++和Java这三个工业级的编程语言。为什么说它们是工业级的呢?主要是,C和C++语言规范都由ISO标准化过,而且都有工业界厂商组成的标准化委员会来制定工业标准。次要原因是,它们已经在业界应用于许多重要的生产环境中。

此外,我推荐学习Go语言。一方面,Go语言现在很受关注,它是取代C和C++的另一门有潜力的语言。C语言太原始了,C++太复杂了,Java太高级了,所以Go语言就在这个夹缝中出现了。这门语言已经10多年了,其已成为云计算领域事实上的标准语言,尤其是在Docker/Kubernetes等项目中。Go语言社区正在不断地从Java社区移植各种Java的轮子过来,Go社区现在也很不错。

如果你要写一些PaaS层的应用,Go语言会比C和C++更好,目前和Java有一拼。而且,Go语言在国内外一些知名公司中有了一定的应用和实践,所以,是可以学习的(参看:《Go语言、Docker 和新技术》一文)。此外,Go语言语法特别简单,你有了C和C++的基础,学习Go的学习成本基本为零。

理论学科。你需要学习像算法、数据结构、网络模型、计算机原理等计算机科学专业需要学习的知识。为什么要学好这些理论上的知识呢?

另外,你千万不要觉得在你的日常工作或是生活当中根本用不上,学了也白学,这样的思维方式千万不要有,因为这是平庸的思维方式。如果你想等我用到了再学也不晚,那么你有必要看一下这篇文章《程序员的荒谬之言还是至理名言?》。

系统知识。系统知识是理论知识的工程实践,这里面有很多很多的细节。比如像Unix/Linux、TCP/IP、C10K挑战等这样专业的系统知识。这些知识是你能不能把理论应用到实际项目当中,能不能搞定实际问题的重要知识。

当你在编程的时候,如何和系统进行交互或是获取操作系统的资源,如何进行通讯,当系统出了性能问题,当系统出了故障等,你有大量需要落地的事需要处理和解决。这个时候,这些系统知识就会变得尤为关键和重要了。

这些东西,你可以认为是计算机世界的物理世界,上层无论怎么玩,无论是Java NIO,还是Nginx,还是Node.js,它们都逃脱不掉最下层的限制。所以,你要好好学习这方面的知识。

编程语言

Java语言

学习Java语言有以下入门级的书(注意:下面一些书在入门篇中有所提及,但为了完整性,还是要在这里提一下,因为可能有朋友是跳着看的)。

前面推荐的几本书可以帮你成功入门Java,但想要进一步成长,就要看下面我推荐的几本进阶级别的书了。

当然,学Java你一定要学面向对象的设计模式,这里就只有一本经典的书《设计模式》。如果你觉得有点儿难度了,那么可以看一下《Head First设计模式》。学习面向对象的设计模式时,你不要迷失在那23个设计模式中,你一定要明白这两个原则:

至此,如果你把上面的这些知识都融汇贯通的话,那么,你已是一个高级的Java程序员了,我保证你已经超过了绝大多数程序员了。基本上来说,你在技术方面是可以进入到一线公司的,而且还不是一般的岗位,至少是高级程序员或是初级架构师的级别了。

C/C++语言

不像我出道那个时候,几乎所有的软件都要用C语言来写。现在,可能不会有多少人学习C语言了,因为一方面有Java、Python这样的高级语言为你屏蔽了很多的底层细节,另一方面也有像Go语言这样的新兴语言可以让你更容易地写出来也是高性能的软件。但是,我还是想说,C语言是你必须学习的语言,因为这个世界上绝大多数编程语言都是C-like的语言,也是在不同的方面来解决C语言的各种问题。这里,我想放个比较武断话——如果你不学C语言,你根本没有资格说你是一个合格的程序员!

对了,千万不要看谭浩强的C语言的书。各种误导,我大学时就是用这本书学的C,后来工作时被坑得不行

在学习C语言的过程中,你一定会感到,C语言这么底层,而且代码经常性地崩溃,经过一段时间的挣扎,你才开始觉得你从这个烂泥坑里快要爬出来了。但你还需要看看《C陷阱与缺陷》这本书,你会发现,这里面的坑不是一般大。

此时,如果你看过我的《编程范式游记》那个系列文章,你可能会发现C语言在泛型编程上的各种问题,这个时候我推荐你学习一下C++语言。可能会有很多人觉得我说的C++是个大坑。是的,这是世界目前来说最复杂也是最难的编程语言了。但是,C++是目前世界上范式最多的语言了,其做得最好的范式就是"泛型编程",这在静态语言中,是绝对地划时代的一个事

所以,你有必要学习一下C++,看看C++是如何解决C语言中的各种问题的。你可以先看看我的这篇文章 “C++的坑真的多吗?” ,有个基本认识。下面推荐几本C++的书。

学习Go语言

C语言太原始了,C++太复杂了,Go语言是不二之选。有了C/C++的功底,学习Go语言非常简单。

首推 Go by Example 作为你的入门教程。然后,Go 101 也是一个很不错的在线电子书。如果你想看纸书的话,The Go Programming Language 一书在豆瓣上有9.2分,但是国内没有卖的。(当然,我以前也写过两篇入门的供你参考 “GO 语言简介(上)- 语法” 和 “GO 语言简介(下)- 特性”)。

另外,Go语言官方的 Effective Go 是必读的,这篇文章告诉你如何更好地使用Go语言,以及Go语言中的一些原理。

Go 语言最突出之处是并发编程,Unix老牌黑客罗勃·派克(Rob Pike)在 Google I/O上的两个分享,可以让你学习到一些并发编程的模式。

然后,Go在 GitHub的wiki上有好多不错的学习资源,你可以从中学习到多。比如:

此外,还有个内容丰富的Go资源列表 Awesome Go,推荐看看。

小结

好了,最后我们来总结一些今天分享的内容。在编程语言方面,我推荐学习C、C++、Java和Go四门语言,并分别阐释了推荐的原因。

我认为,一个合格的程序员应该掌握几门语言。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养,会让你对于未来的新技术学习得更快。

下篇文章中,我们将分享每个程序员都需要掌握的理论知识。敬请期待。

下面是《程序员练级攻略》系列文章的目录。