为了进入专业的编程领域,我们需要认真学习以下三方面的知识。 **编程语言**。你需要学习C、C++和Java这三个工业级的编程语言。为什么说它们是工业级的呢?主要是,C和C++语言规范都由ISO标准化过,而且都有工业界厂商组成的标准化委员会来制定工业标准。次要原因是,它们已经在业界应用于许多重要的生产环境中。
  • C语言不用多说,现今这个世界上几乎所有重要的软件都跟C有直接和间接的关系,操作系统、网络、硬件驱动等等。说得霸气一点儿,这个世界就是在C语言之上运行的。
  • 而对于C++来说,现在主流的浏览器、数据库、Microsoft Office、主流的图形界面、著名的游戏引擎等都是用C++编写的。而且,很多公司都用C++开发核心架构,如Google、腾讯、百度、阿里云等。
  • 而金融电商公司则广泛地使用Java语言,因为Java的好处太多了,代码稳定性超过C和C++,生产力远超C和C++。有JVM在,可以轻松地跨平台,做代码优化,做AOP和IoC这样的高级技术。以Spring为首的由庞大的社区开发的高质量的各种轮子让你只需关注业务,是能够快速搭建企业级应用的不二之选。
  • 此外,我推荐学习Go语言。一方面,Go语言现在很受关注,它是取代C和C++的另一门有潜力的语言。C语言太原始了,C++太复杂了,Java太高级了,所以Go语言就在这个夹缝中出现了。这门语言已经10多年了,其已成为云计算领域事实上的标准语言,尤其是在Docker/Kubernetes等项目中。Go语言社区正在不断地从Java社区移植各种Java的轮子过来,Go社区现在也很不错。 如果你要写一些PaaS层的应用,Go语言会比C和C++更好,目前和Java有一拼。而且,Go语言在国内外一些知名公司中有了一定的应用和实践,所以,是可以学习的(参看:《[Go语言、Docker 和新技术](https://coolshell.cn/articles/18190.html)》一文)。此外,Go语言语法特别简单,你有了C和C++的基础,学习Go的学习成本基本为零。 **理论学科**。你需要学习像算法、数据结构、网络模型、计算机原理等计算机科学专业需要学习的知识。为什么要学好这些理论上的知识呢?
  • 其一,这些理论知识可以说是计算机科学这门学科最精华的知识了。说得大一点,这些是人类智慧的精华。你只要想成为高手,这些东西是你必需要掌握和学习的。
  • 其二,当你在解决一些很复杂或是很难的问题时,这些基础理论知识可以帮到你很多。我过去这20年从这些基础理论知识中受益匪浅。
  • 其三,这些理论知识的思维方式可以让你有触类旁通,一通百通的感觉。虽然知识比较难啃,但啃过以后,你将获益终生。
  • 另外,你千万不要觉得在你的日常工作或是生活当中根本用不上,学了也白学,这样的思维方式千万不要有,因为这是平庸的思维方式。如果你想等我用到了再学也不晚,那么你有必要看一下这篇文章《[程序员的荒谬之言还是至理名言?](https://coolshell.cn/articles/4235.html)》。 **系统知识**。系统知识是理论知识的工程实践,这里面有很多很多的细节。比如像Unix/Linux、TCP/IP、C10K挑战等这样专业的系统知识。这些知识是你能不能把理论应用到实际项目当中,能不能搞定实际问题的重要知识。 当你在编程的时候,如何和系统进行交互或是获取操作系统的资源,如何进行通讯,当系统出了性能问题,当系统出了故障等,你有大量需要落地的事需要处理和解决。这个时候,这些系统知识就会变得尤为关键和重要了。 这些东西,你可以认为是计算机世界的物理世界,上层无论怎么玩,无论是Java NIO,还是Nginx,还是Node.js,它们都逃脱不掉最下层的限制。所以,你要好好学习这方面的知识。 # 编程语言 ## Java语言 学习Java语言有以下**入门级的书**(注意:下面一些书在入门篇中有所提及,但为了完整性,还是要在这里提一下,因为可能有朋友是跳着看的)。
  • 《[Java核心技术:卷1基础知识](https://book.douban.com/subject/26880667/)》,这本书本来是Sun公司的官方用书,是一本Java的入门参考书。对于Java初学者来说,是一本非常不错的值得时常翻阅的技术手册。书中有较多地方进行Java与C++的比较,因为当时Java面世的时候,又被叫作"C++ Killer"。而我在看这本书的时候,发现书中有很多C++的东西,于是又去学习了C++。学习C++的时候,发现有很多C的东西不懂,又顺着去学习了C。然后,C -> C++ -> Java整条线融汇贯通,这对我未来的技术成长有非常大的帮助。
  • 有了上述的入门后,Java的Spring框架是你玩Java所无法回避的东西,所以接下来是两本Spring相关的书,《[Spring实战](https://book.douban.com/subject/26767354/)》和《[Spring Boot实战](https://book.douban.com/subject/26857423/)》。前者是传统的Spring,后者是新式的微服务的Spring。如果你只想看一本的话,那么就看后者吧。
  • 前面推荐的几本书可以帮你成功入门Java,但想要进一步成长,就要看下面我推荐的几本进阶级别的书了。
  • 接下来,你需要了解了一下如何编写高效的代码,于是必需看一下《[Effective Java](https://book.douban.com/subject/27047716/)》(注意,这里我给的引用是第三版的,也是2017年末出版的书),这本书是模仿Scott Meyers的经典图书《Effective C++》的。Effective这种书基本上都是各种经验之谈,所以,这是一本非常不错的书,你一定要读。这里需要推荐一下 [Google Guava 库](https://github.com/google/guava) ,这个库不但是JDK的升级库,其中有如:集合(collections)、缓存(caching)、原生类型支持(primitives support)、并发库(concurrency libraries)、通用注解(common annotations)、字符串处理(string processing)、I/O 等库,其还是Effective Java这本书中的那些经验的实践代表。
  • 《[Java并发编程实战](https://book.douban.com/subject/10484692/)》,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容。最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。
  • 了解如何编写出并发的程序,你还需要了解一下如何优化Java的性能。我推荐《[Java性能权威指南](https://book.douban.com/subject/26740520/)》。通过学习这本书,你可以比较大程度地提升性能测试的效果。其中包括:使用JDK中自带的工具收集Java应用的性能数据,理解JIT编译器的优缺点,调优JVM垃圾收集器以减少对程序的影响,学习管理堆内存和JVM原生内存的方法,了解如何最大程度地优化Java线程及同步的性能,等等。看完这本书后,如果你还有余力,想了解更多的底层细节,那么,你有必要去读一下《[深入理解Java虚拟机](https://book.douban.com/subject/24722612/)》。
  • 《[Java编程思想](https://book.douban.com/subject/2130190/)》,真是一本透着编程思想的书。上面的书让你从微观角度了解Java,而这本书则可以让你从一个宏观角度了解Java。这本书和Java核心技术的厚度差不多,但这本书的信息密度比较大。所以,读起来是非常耗大脑的,因为它会让你不断地思考。对于想学好Java的程序员来说,这是一本必读的书。
  • 《[精通Spring 4.x](https://book.douban.com/subject/26952826/)》,也是一本很不错的书,就是有点厚,一共有800多页,都是干货。我认为其中最不错的是在分析原理,尤其是针对前面提到的Spring技术,应用与原理都讲得很透彻,IOC和AOP也分析得很棒,娓娓道来。其对任何一个技术都分析得很细致和全面,不足之处就是内容太多了,所以导致很厚,但这并不影响它是一本不错的工具书。
  • 当然,学Java你一定要学面向对象的设计模式,这里就只有一本经典的书《[设计模式](https://book.douban.com/subject/1052241/)》。如果你觉得有点儿难度了,那么可以看一下《[Head First设计模式](https://book.douban.com/subject/2243615/)》。学习面向对象的设计模式时,你不要迷失在那23个设计模式中,你一定要明白这两个原则:
  • **Program to an ‘interface’, not an 'implementation’**