思维多元化
我们平时大部分的后台开发人员都是在做 CRUD,用一些别人封装好的易用的框架去写业务代码。有的人日复一日反复在重复这样的工作,有的人却在工作中思考。我今天想和大家说的就是,要把眼光、格局放的大一些。比如:你虽然是个后台开发人员,但是不要沉浸在技术当中,要多去了解一下业务背景、软件开发的整个流程、项目管理等这些软技能。当你接触的东西多了以后,思维就比较发散,不会局限于一个维度去看待一个问题,而是从多个维度去思考这个问题。我觉得只会技术,可能会增加你解决一个问题的复杂度。解决一些问题并不是一定需要从技术上,可能其他方面解决会更好、复杂度更低。 这与数学中的博弈论类似,当我们的视野比较窄时,自以为解决一个问题得到了最优解,但其实这只是个局部最优解。往往拥有宽阔的视野,才可以得出一个全局最优解。
我们做业务开发,实际上就是在解决一个个问题,解决一个问题会有很多种方法,如何找到那个最优的方法?这就需要我们不断的学习,提升自己的知识储备。有了知识储备后,解决一个问题时,你可以在多种解决方案中经过一定取舍和折中(比如:时间换空间,还是空间换时间,AP 还是 CP(分布式理论中的 CAP ),局部损失一些性能换全局性能最佳等等)选择出最适合你的方案。
如何学习一个新技术
首先一个新技术一般都会有官方文档,文档是最好的学习资源(权威)。看文档是一种很好的学习方式,然而却常常被我们忽视。
学习的原则要遵循:
- 先了解新技术相关的概念(理清概念)。
- 然后从新技术的设计思想上把所有的概念串起来(理清脉络)。
参考链接:https://zhuanlan.zhihu.com/p/21307896
接下来跟大家聊聊我是如何学习一个新技术的。
步骤
- 新技术是什么?它的生态圈是什么?
- 了解这个新技术解决了哪些问题。
- 为了解决这些问题它使用了哪些巧妙或者好的方法。
- 它与其他类似的技术的区别。
- 它的优缺点。
- 它的架构图,先理解它的核心概念(比如:Spring 的核心概念就是 IOC、AOP)。
- 理解核心接口的作用,从接口或类的命名中去知晓其职责。
一般优秀的框架都会对类的职责划分做的不错,所以根据类名就可以知其意。
- 去思考它是如何根据核心概念去进行扩展的。(比如:Spring 的核心概念就是 IOC、AOP,那它是怎么做出那么多的模块呢?根据 Bean 的生命周期进行展开留下了多处的地方可以扩展。)
- 在学习新技术的过程不要觉得它是独立的,多去和你已有的知识体系中的技术去关联、去类比。
比如:分层的架构思想,在计算机网络、MVC、MySQL 数据库、tomcat 中都有它的体现。
- 有没有最佳实践。
以消息队列为例,我觉得当你学完一个技术后,头脑中应该有以下的一个思维导图:
此图来源于极客时间专栏(消息队列高手课)。
值得花时间去学习的内功
1. 数据结构
一些基础的数据结构,比如:栈、队列、数组、链表、B+ 树等,这些常见的数据结构还是要去知道他们的优缺点。
2. 操作系统、计算机网络
这是重之之重,熟悉了操作系统,更有利于你对语言的深入理解。比如:你熟悉了操作系统之后去看 Java 虚拟机,会发现很容易理解。
计算机网络我就不说了,大部分 WEB 服务器、应用服务器都间接的跟网络有关,知道一些网络知识对你学习中间件、以及后面的分布式组件都有帮助。
3. 框架源码
3.1 Spring 源码的设计(重点关注 IOC、AOP 的实现即可)
锻炼架构设计的能力、设计模式的灵活运用、面向对象思想(三大特性、六大原则)的最佳实践。比如:接口怎么定义、类名怎么起才有意义,怎么设计抽象类和接口会使得系统扩展性好等。
3.2 netty 源码的设计
锻炼 Java NIO 的最佳实践,对并发、网络、内存的性能优化。
4. 每天刷几道算法题
锻炼把具体问题转化为代码实现的思维。
诀窍
一个人现在不厉害并不代表什么,最可怕的地方在于他可以去承认别人比他强,而且去学习别人的优点,不断的调整自己的一套学习方法论、认知等。这样的人成长更快,更厉害。
总结起来就一句话,多去关注优秀的人的优点,少关心人家的缺点。 关注别人的优点使你强大,关心别人的缺点只会使你看待问题更极端化。
微信公众号:Java知其所以然
我现在也是一个正在学习的程序猿,希望和大家一起进步。
后续还会继续补充,今天就写到这里。