时间过的很快,2019 年过去了,迎来了崭新的 2020。
今天做一个 2019 年终总结,算是对 2019 年的一个交代。
主要总结下 2019 年技术上的 成长、读书、理财、时间管理 方面的东西。
技术
关于 Kotlin
翻开 2019 年第一篇博客,竟然是 2019-1-2 晚上 1:27 发表的,真不敢想象 2019 年初还这么作,不把健康放在心上。现在呢,嗯,10 点半就得睡觉了。
2019 年初系统的学习了下 Kotlin 相关的技术,写了 3 篇关于 Kotlin 的文章。
虽然只有 3 篇,但是有几篇的文章字数是 3-4 万。其实这 3 篇如果进行细分的话可以写很多博客,形成一个体系。
文章的数量不重要,重要的是质量。我习惯一篇文章,把所有的事情讲完。
这些文章基本涵盖了 Kotlin 基本的语法和常用的特性。
我们知道 Kotlin 编译后也是 class 字节码, 在介绍 Kotlin 语法糖的时候不仅仅介绍怎么用,还介绍了它背后的实现原理,语法糖对应的 Java 是什么?
这样对于熟悉 Java 的开发人员来说,可以更快、更加深入的掌握 Kotlin。让我们写的每一行 Kotlin 代码更加自信。
这三篇文章分别为:
然后 2019 年 6 月份,在 CSDN 开了一个关于 Kotlin 的课程,希望通过视频的方式向初学者介绍 Kotlin,由于各种原因没有更新完,2020 年更新完。
关于 JVM
今年还系统的学习了 Java 虚拟机相关的技术。一听到 Java 虚拟机可能觉得是高深的技术,或者和我们开发没有什么太大的关系,或者觉得这只是用来面试的技术。
其实不然,首先 Java 虚拟机肯定是一门高深的技术,这是无数大师汇聚的心血,你一个人不可能掌握其中的所有细节,但是不妨碍我们去学习它,而且市面上也有很多相关的资料。
其次,学习 Java 虚拟机技术和我们开发的关系很大。我个人觉得,系统的学完之后,会对代码的感受力不一样的,会让我们明白写的每行 Java 代码对应的字节码是什么?不同的编写方式,JVM 会怎么区别对待。
系统的学习了下 Java 虚拟机让我明白:
写的 Java 类对应的 class 字节码是由哪些部分组成的。学完 class 字节码文件后,会让我们从字节码的层面分析内部类内存泄漏的原因。什么时候应该用 + 号拼接字符串,什么时候不应该使用。会让我们更加深入理解装箱与拆箱,避免开发中容易遇到的坑。会让我们具备使用开源框架如 ASM、Javassist 实现修改 class 字节码的能力,例如我在路由框架中使用了 gradle plugin + ASM 在编译时自动注入字节码的方式达到自动初始化的目的。
可以看出,Java 虚拟机技术还是和我们开发息息相关的,class 字节码还只是 Java 虚拟机的一小部分。
有了 class 字节码,那么 Java 虚拟机是如何加载它的呢?学习完这方面的知识后,我们会明白:什么时候才会加载一个 class,加载的时机是什么?类的加载过程是什么?什么是类加载器?什么是双亲委派机制?什么又是非双亲委派机制,非双亲委派机制有什么用?Java 为什么使用双亲委派?如何自定义类加载器?Java 1.7 之前 ClassLoader 的死锁是如何产生的?
知道了 Java 虚拟机如何加载 class 字节码后,那么虚拟机时是如何执行它的?执行 class 字节码,肯定要分配内存,所以我们要搞清楚 Java 虚拟机的内存结构。执行方法的时候,JVM 如何定位到这个方法,执行方法的时候涉及到的局部变量表、操作数栈、动态连接等。
Java 是面向对象的,我们无时无刻不是在创建对象,那么一个对象占用多少内存,一个对象的内存布局是什么,如何打印一个对象的内存布局,以及不同的虚拟机参数会对对象的内存占用有什么影响?Java 虚拟机是怎么判断一个对象可以被回收的。一个新创建的对象会分配在哪里,什么时候进入 Eden 区,什么时候进入 Survivor 区,什么时候进入老年代?以及不同的 Java 版本对垃圾回收做了哪些改动?
我是根据上面的路径来学习 Java 虚拟机的:从静态的 class 字节码文件开始,再到 Java 虚拟机加载这个 class,然后到如何执行 class,最后到垃圾回收器。然后形成了这个系列文章:
- 深入理解 Java 虚拟机(一)~ class 字节码文件剖析
- 深入理解 Java 虚拟机(二)~ 类的加载过程剖析
- 深入理解 Java 虚拟机(三)~ class 字节码的执行过程剖析
- 深入理解 Java 虚拟机(四)~ 各种容易混淆的常量池
- 深入理解 Java 虚拟机(五)~ 对象的创建过程
- 深入理解 Java 虚拟机(六)~ Garbage Collection 剖析
虽然上面 Java 虚拟机的文章不多,但是也有 11 万字,也是花费了非常多的时间和精力,但是得到的也很多。
为什么要写作?我个人写博客的过程不是将学到的东西复述出来,而是把学过的东西重新梳理,会有新的思考,新的疑问。所以写作的过程比较慢,写作又是一次学习加深的过程。
从整个学习过程来看,我个人总结的是:如果只是看几本 Java 虚拟机相关的书、博客、视频,不去联系实际的项目或正在使用的语言,这样学习到的 Java 虚拟机理论知识收益不大,而且很容易忘记。没有内化成自己的东西,最后都会还回去。个人建议是:理论结合实际,然后就是整理成笔记或者博客进行输出,随着成长,如果对以前知识有更加深入的理解或者感悟,可以修改笔记或者博客。
设计模式
除了 Java 虚拟机,还对设计原则、设计模式进行系统的学习。
设计模式很简单同时又很难。简单的是任何一个设计模式,我们在学习的时候就是由几个类组成的而已,难的是我们不知道什么时候用,或者很难把它用好。
有的时候,我们使用这个模式好像也可以,使用那个模式似乎也行,我们该使用哪一个?有的时候,遵循了这个设计原则(SOLID),却违反了另一个设计原则,这个时候我们怎么办,怎么抉择?有的时候是不是觉得设计模式、设计原则很玄学。
在学习的过程中参考很多的资料和书籍,其中有:
- 《设计模式之禅》
- 《Java设计模式及实践》
- 《Java设计模式深入研究》
- 《设计模式(Java版)》
- 《Java与模式》
- 《Head First 设计模式》
- 《Effective Java》
参考这些书籍主要目的有两个:一个是看看模式的基本原理;另一个最主要的是看看作者对该模式的见解,这个才是最重要的。
所以在学习的过程中,也是需要将理论集合实际项目,然后形成自己的见解,只有这样才能把设计模式、设计原则内化成自己的一部分。而不是照本宣科的把该模式说一遍。
经典的有 23 种设计模式,有些模式,确实没用到过,但是知道 JDK 中哪些源码用到了,但是自己在项目中没有用到,或者没有过多的见解,于是就没有成博客,因为感觉意义不大。对有些设计原则或者模式有自己的见解或者项目中使用到了,就汇总成了博客记录下:
- 设计模式 ~ 面向对象 6 大设计原则剖析与实战
- 设计模式 ~ 模板方法模式分析与实战
- 设计模式 ~ 观察者模式分析与实战
- 设计模式 ~ 单例模式分析与实战
- 设计模式 ~ 深入理解建造者模式与实战
- 设计模式 ~ 工厂模式剖析与实战
- 设计模式 ~ 适配器模式分析与实战
- 设计模式 ~ 装饰模式探究
- 设计模式 ~ 深入理解代理模式
学习设计原则和模式后最大的收获是:在编写代码的时候,设计类的时候会自动的向设计原则和相关模式靠拢。在重构 MRouter 代码的时候会有体会和感觉。
对学习设计模式总结:个人感觉是一定要思考思考在思考,思考的过程一定要结合项目,或者以前在编写代码的时候遇到的痛点,是不是可以用这个模式解决?在实际项目中使用设计模式或者设计原则的时候,一定要不断的反思,使用这个设计模式或面向对象设计原则,是不是代码更好维护,是不是违反其他设计原则、对工作量的影响有多大等等,经过这些灵魂发问,会慢慢形成属于自己对设计模式设计原则的见解。使用它一定要有理论支撑,而不是靠感觉。
框架的学习
今年对框架的学习不多,只学习了 Retrofit 网络框架。
我学习框架的思路是:分两个阶段,第一个阶段是学习它的用法,而不是一头钻进源码中。第二个阶段是阅读源码,看看每个用法的实现原理。
Retrofit 是网络框架,学习它最好有个服务器,我搭建了一个 Tomcat + Servlet 来充当服务器,这样可以更好的调试 Retrofit 框架
在进行图文上传的时候,会出现乱码,为什么会乱码,这还牵扯到一点 Web 相关的知识,也可以从 Retrofit 源码中找到答案。
这样可以更加全面的学习 Retrofit,有的东西还是不能偷懒,特别是网络框架,最好能有服务器进行调试。
在学习基本用法的时候,就会有很多疑问,这些疑问,我们都可以记录下来,然后在后面阅读源码的时候统一解决。
对框架源码学习的总结:阅读源码一方面是看基本的 API 实现原理,另一方面也可以学习相关的设计模式,学习设计模式的时候,不应该只是知道这个框架使用了这个设计模式,然后就没了。而是思考它为什么使用这个模式?使用这个模式解决了什么问题?试着站在设计者的角度去思考问题,可能会让我们受益更大,搞清楚这个问题后,我们遇到类似的问题或需求时,也自然而然会使用这样的设计模式来解决问题。
Flutter
关于 Flutter 只是学习了 Dart 语言和 Flutter 一些基础的东西,也在实际项目中做了一些尝试,但是还需要继续学习。
- (一)Flutter学习之Dart变量和类型系统
- (二)Flutter学习之Dart展开操作符 和 Control Flow Collections
- (三)Flutter学习之Dart函数
- (四)Flutter学习之Dart操作符、控制流和异常处理
- (五)Flutter学习之Dart面向对象
- (六)Flutter学习之Dart异步操作详解
- (七)Flutter 学习之开发环境搭建
- (八)Flutter 和 Native 之间的通信详解
- (九)Android 项目集成 Flutter 模块
- (十)Flutter FutureBuilder 优雅构建异步UI
其他
在技术上还有其他一些零零散散的东西,比如 MVP 架构的一些改造、NDK、Repo 等:
- Android MVVM 架构 Data Binding 的使用
- Android NDK ~ 基础入门指南
- Android NDK ~ Java 和 Native 交互
- 使用 repo 管理 Android 组件化项目
读书
2019 年读了30-40 本书吧,在微信读书上大部分是非技术类。年初制定的是一个月 2 本书,基本上完成了。
但是在读书方法上,还是有很多可以改善的地方。在微信读书上的英语相关的书挺方便,可以很容易查询某个单词在书中的使用,或者全书中哪些地方用到了该单词等,非常便于检索。下面是 2019 年微信读书上的统计:
理财
2019 年也开始学习了一些关于理财方面的知识,开始尝试一些基金理财方面的尝试。
时间管理
在时间管理上也有一些小小的心得就是每天写日报,这可能算不上时间管理。但是个人觉得还是挺有帮助的。
在晚上,一天快要结束的时候,记上一两句话,问问自己,这一天有什么东西可以值得去记录的,自己都干了哪些事情。
日报不见得是要规定多少个字,几句话也行,几百个字也行,不要将其任务化,否则很难坚持。
只要今天进步一点点,都可以写在日报上。用一句话总结来说就是:你今天比昨天更博学了吗? 这是奇葩说杨奇函的口头语,挺发人深省的。
如果没有什么可以写,说明我们可能在浪费光阴。日报的还有一个好处是我们在年末的时候,可以对这一年的每一天都可以复盘,也是一件挺有意思的事情。
最近,我们公司在执行周报,日报汇总一下就成周报了。个人觉得日报最主要的还是给自己看的,虽然做不到一日三省吾身,但一天一省还是有必要的,与所有人共勉 ~
2019 年也浪费了许多时间,有很多地方可以改进,希望 2020 年更加聚焦,在时间管理上更加有效率。
最后,祝所有人,元旦快乐 ~
转载:https://blog.csdn.net/johnny901114/article/details/103792493