20 KiB
为了进入专业的编程领域,我们需要认真学习以下三方面的知识。
编程语言。你需要学习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个设计模式中,你一定要明白这两个原则:
-
- 使用者不需要知道数据类型、结构、算法的细节。
- 使用者不需要知道实现细节,只需要知道提供的接口。
- 利于抽象、封装,动态绑定,多态。符合面向对象的特质和理念。
- 继承需要给子类暴露一些父类的设计和实现细节。
- 父类实现的改变会造成子类也需要改变。
- 我们以为继承主要是为了代码重用,但实际上在子类中需要重新实现很多父类的方法。
- 继承更多的应该是为了多态。
- 这里尤其推荐,已故的C语言之父Dennis M. Ritchie和著名科学家Brian W. Kernighan合作的圣经级的教科书《[C程序设计语言](https://book.douban.com/subject/1139336/)》。注意,这本书是C语言原作者写的,其C语言的标准不是我们平时常说的ANSI标准,而是原作者的标准,又被叫作K&R C。但是这本书很轻薄,也简洁,不枯燥,是一本你可以拿着躺在床上看还不会看着看着睡着的书。
- 然后,还有一本非常经典的C语言的书《[C语言程序设计现代方法](https://book.douban.com/subject/2280547/)》。有人说,这本书配合之前的 [The C Programming Language](https://en.wikipedia.org/wiki/The_C_Programming_Language) 那本书简真是无敌。我想说,这本书更实用,也够厚,完整覆盖了C99标准,习题的质量和水准也比较高。更好的是,探讨了现代编译器的实现,以及和C++的兼容,还揭穿了各种古老的C语言的神话和信条……是相当相当干的一本学习C语言的书。
- 《[C++ Primer中文版](https://book.douban.com/subject/25708312/)》,这本书是久负盛名的C++经典教程。书是有点厚,前面1/3讲C语言,后面讲C++。C++的知识点实在是太多了,而且又有点晦涩。但是你主要就看几个点,一个是面向对象的多态,一个是模板和重载操作符,以及一些STL的东西。看看C++是怎么玩泛型和函数式编程的。
- 如果你想继续研究,你需要看另外两本更为经典的书《[Effective C++](https://book.douban.com/subject/5387403/)》和《[More Effective C++](https://book.douban.com/subject/5908727/)》。 这两本书不厚,但是我读了10多年,每过一段时间再读一下,就会发现有更多的收获。这两本书的内容会随着你经历的丰富而变得丰富,这也是对我影响最大的两本书,其中影响最大的不是书中的那些C++的东西,而是作者的思维方式和不断求真的精神,这真是太赞了。
-
学习C/C++都是需要好好了解一下编译器到底干了什么事的。就像Java需要了解JVM一样,所以,这里还有一本非常非常难啃的书你可以挑战一下《深度探索C++对象模型
》。这本书是非常之经典的,看完后,C++对你来说就再也没有什么秘密可言。我以前写过的《[C++虚函数表解析](https://coolshell.cn/articles/12165.html)》,还有《[C++对象内存布局](https://coolshell.cn/articles/12176.html)》属于这个范畴。 - 还有C++的作者 Bjarne Stroustrup 写的 [C++ FAQ](http://www.stroustrup.com/bs_faq.html) ([中文版](http://www.stroustrup.com/bsfaqcn.html)),也是非常值得一读的。
- 我认为,C语言是必须学习的语言,因为这个世界上绝大多数编程语言都是C-like的语言,也是在不同的方面来解决C语言的各种问题。
- 而C++虽然复杂难学,但它几乎是目前世界上范式最多的语言了,其做得最好的范式就是"泛型编程",这在静态语言中,是绝对地划时代的一个事。尤其要看看C++是如何解决C语言中的各种问题的。
- Java是我认为综合能力最强的语言。其实我是先学了Java,然后又去学了C++,之后去学了C语言的。C -> C++ -> Java整条线融汇贯通,这对我未来的技术成长有非常大的帮助。
- 在文章最末,我推荐了Go语言,并给出了相关的学习资料。
- 入门篇
Favor ‘object composition’ over 'class inheritance’
至此,如果你把上面的这些知识都融汇贯通的话,那么,你已是一个高级的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四门语言,并分别阐释了推荐的原因。
我认为,一个合格的程序员应该掌握几门语言。一方面,这会让你对不同的语言进行比较,让你有更多的思考。另一方面,这也是一种学习能力的培养,会让你对于未来的新技术学习得更快。
下篇文章中,我们将分享每个程序员都需要掌握的理论知识。敬请期待。
下面是《程序员练级攻略》系列文章的目录。