给你再一次做选择的机会,平凡还是卓越?自在悠闲,还是猛啃书本,不破楼兰终不还?遵循你内心的选择,偷偷告诉你,我选的是后者。
有了选择,方向就有了,剩下的你需要做的就是朝着这个方向努力就行。
需要解决几个问题:
需要明确几点端正一下态度:
学习建议:
资料书籍:
像 Python 和 JavaScript 这样的动态语言用着是很爽,但是,只有像 C、C++ 和 Java 这样的静态语言才可以让你真正地进阶。
到这里,估计你最少也要花 1-2 年左右的时间,已经是一个 “ 全栈工程师 “ 的样子了,相信你可以找到至少年薪
20 万以上的工作了,而且你的知识面算是有不错的广度了,但是深度还不够,这个时候,是一个比较关键点了。
建议:
选择一个方向开始深入。因为你并不知道你未来会有多大的可能性,也不知道你会成为什么样的人,所以为什么不再更努力一把呢?
程序员的自我修养:
《97 Things Every Programmer Should Know》
问问题的能力—提问的智慧,有两个著名的缩写 STFW(Search the fxxking web)以及RTFM(Read the fxxking manual)就是出自本文
程序员的自我修养更多的决定了这条路你到底能走多远
《Java 核心技术:卷 1 基础知识》,这本书本来是 Sun 公司的官方用书,是一本 Java 的入门参考书。对于 Java 初学者来说,是一本非常不错的值得时常翻阅的技术手册。书中有较多地方进行 Java 与 C++ 的比较,因为当时 Java 面世的时候,又被叫作 “C++ Killer”。而我在看这本书的时候,发现书中有很多 C++ 的东西,于是又去学习了 C++。学习 C++ 的时候,发现有很多 C 的东西不懂,又顺着去学习了 C。然后,C -> C++ -> Java 整条线融汇贯通,这对我未来的技术成长有非常大的帮助。
有了上述的入门后,Java 的 Spring 框架是你玩 Java 所无法回避的东西,所以接下来是两本Spring 相关的书,《Spring 实战》和《Spring Boot 实战》。前者是传统的 Spring,后者是新式的微服务的 Spring。如果你只想看一本的话,那么就看后者吧。
接下来,你需要了解了一下如何编写高效的代码,于是必需看一下《Effective Java》(注意,这里我给的引用是第三版的,也是 2017 年末出版的书),这本书是模仿 Scott Meyers的经典图书《Effective C++》的。Effective 这种书基本上都是各种经验之谈,所以,这是一本非常不错的书,你一定要读。
《Java 并发编程实战》,是一本完美的 Java 并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则,如何将小的线程安全类组合成更大的线程安全类,如何利用线程来提高并发应用程序的吞吐量,如何识别可并行执行的任务,如何提高单线程子系统的响应性,如何确保并发程序执行预期任务,如何提高并发代码的性能和可伸缩性等内容。最后介绍了一些高级主题,如显式锁、原子变量、非阻塞算法以及如何开发自定义的同步工具类。
了解如何编写出并发的程序,你还需要了解一下如何优化 Java 的性能。我推荐《Java 性能权威指南》。通过学习这本书,你可以比较大程度地提升性能测试的效果。其中包括:使用JDK 中自带的工具收集 Java 应用的性能数据,理解 JIT 编译器的优缺点,调优 JVM 垃圾收集器以减少对程序的影响,学习管理堆内存和 JVM 原生内存的方法,了解如何最大程度地优化 Java 线程及同步的性能,等等。看完这本书后,如果你还有余力,想了解更多的底层细节,那么,你有必要去读一下《深入理解 Java 虚拟机》
《Java 编程思想》,真是一本透着编程思想的书。上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java。这本书和 Java 核心技术的厚度差不多,但这本书的信息密度比较大。所以,读起来是非常耗大脑的,因为它会让你不断地思考。对于想学好 Java 的程序员来说,这是一本必读的书。
《精通 Spring 4.x》,也是一本很不错的书,就是有点厚,一共有 800 多页,都是干货。我认为其中最不错的是在分析原理,尤其是针对前面提到的 Spring 技术,应用与原理都讲得很透彻,IOC 和 AOP 也分析得很棒,娓娓道来。其对任何一个技术都分析得很细致和全面,不足之处就是内容太多了,所以导致很厚,但这并不影响它是一本不错的工具书。
当然,学 Java 你一定要学面向对象的设计模式,这里就只有一本经典的书《设计模式》。如果你觉得有点儿难度了,那么可以看一下《Head First 设计模式》。
学习设计模式的时候,不要迷失在那23个设计模式当中,明白两个原则:
有了以上的铺垫,你已经是一个高级Java程序员了,可以进到一线公司,是高级程序员或者初级架构师的水平。
其他语言及参考书籍资料:
C 语言太原始了,C++ 太复杂了,Go 语言是不二之选
算法书籍资料:
学习软件设计的方法、理念、范式和模式,是让你从一个程序员通向工程师的必备技能。
有品位的程序员和没有品位的程序员所写出来的代码,所做出来的软件,差距非常大,而且价值也差别很大。
软件设计这个事,并不是一朝一夕就能学会的,也不是别人能把你教会的,很多东西需要你自己用实践、用时间、用错误、用教训、用痛苦才能真正体会其中的精髓的。所以,除了学习理论知识外,你还需要大量的工程实践。
软件设计的相关原则:
宜家(IKEA)简约、高效的家居设计和生产思路;微软(Microsoft)“所见即所得”的理念;谷歌(Google)简约、直接的商业风格,无一例外地遵循了“KISS”原则。也正是“KISS”原则,成就了这些看似神奇的商业经典。而苹果公司的 iPhone 和 iPad 将这个原则实践到了极至。
Program to an interface, not an implementation,这是设计模式当中最根本的哲学,接口是抽象是稳定的,实现则是多种多样的。还有一条原则叫 Composition over inheritance(喜欢组合而不是继承),这两条是那 23 个经典设计模式中的设计原则。
You Ain’t Gonna Need It (YAGNI),这个原则简而言之为——只考虑和设计必须的功能,避免过度设计。软件开发是一场 trade-off 的博弈。
Law of Demeter,迪米特法则 (Law of Demeter),又称“最少知识原则”(Principle ofLeast Knowledge)
面向对象的SOLID原则
SRP(Single Responsibility Principle)- 职责单一原则,单一职责,通常意味着单一的功能,因此不要为一个模块实现过多的功能点,以保证实体只有一个引起它变化的原因。
OCP(Open/Closed Principle)- 开闭原则,其核心的思想是:模块是可扩展的,而不可修改的。
LSP(Liskov substitution principle)- 里氏代换原则,简化为一句话:Subtypes must besubstitutable for their base types,里氏替换原则 LSP是使代码符合开闭原则的一个重要保证。正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下就可以扩展。
ISP(Interface Segregation Principle )- 接口隔离原则。接口隔离原则的意思是把功能实现在接口中,而不是类中,使用多个专门的接口比使用单一的总接口要好。举个例子,我们对电脑有不同的使用方式,比如:写作、通讯、看电影、打游戏、上网、编程、计算和数据存储等。
如果我们把这些功能都声明在电脑的抽象类里面,那么,我们的上网本、PC 机、服务器和笔记本的实现类都要实现所有的这些接口,这就显得太复杂了。所以,我们可以把这些功能接口隔离开来,如工作学习接口、编程开发接口、上网娱乐接口、计算和数据服务接口,这样,我们的不同功能的电脑就可以有所选择地继承这些接口。
DIP(Dependency Inversion Principle)- 依赖倒置原则,高层模块不应该依赖于低层模块的实现,而是依赖于高层抽象
CCP——当因为某个原因需要修改时,把需要修改的范围限制在一个最小范围内的包里。
CoC(Convention over Configuration)- 惯例优于配置原则 ,简单点说,就是将一些公认的配置方式和信息作为内部缺省的规则来使用。当你执行 mvn -compile
命令的时候,不需要指定源文件放在什么地方,而编译以后的 class 文件放置在什么地方也没有指定,这就是 CoC 原则。
SoC (Separation of Concerns) - 关注点分离,实现关注点分离的方法主要有两种,一种是标准化,另一种是抽象与包装