2019 年度总结
01 工作
2019 年 7 月换了一次工作,是我毕业工作后第一次跳槽,角色也从 Java Web 后端开发,开始涉足数仓开发。因此回过头来看我这一年,很容易从 7 月划开一笔,一分为二的总结。
上半年,还在做 Java Web 后台开发,主要负责公司电商中的用户画像系统及促销系统。当然了,我接手时项目早已较为完善,只需要做一下迭代跟维护,整体需求属于偏少的情况。那时候自己的一个困境是,身边没有相对有经验的 Java 工程师(公司后端以 PHP 为主,Java 人员较少,沉淀较浅)可以交流学习,日常工作中的架构设计,任务开展,大多是自己一个人构思实践,也不清楚自己这样做的好坏或是否有更优的方案,就迫切想要换份工作,找一个以 Java 为基础的团队进行工作与自己提升。
但找工作的事情也没有很顺利,部分原因是那时自己工作年限刚好是一年,能力与思考的深度,达不到厉害的程度,加上中间有段时间工作很忙,断断续续的,到六月才找到新工作。
本来以为是继续找 Java 后端开发的工作,可阴差阳错,最终在 7 月入职新公司,做的事情是大数据相关,由此算是踏入了大数据的领域。
2019 年下半年,在新公司中,头一个月在做机器学习,具体是文本二分类(聊天语料的问题识别),之后到年底,大部分时间都在做数仓开发,具体来说是离线批处理的 ETL,以及 SQL 报表开发。这段时间自己的 SQL 能力有了很大的锻炼及进步,体现在二维数据处理的思维,常用 SQL 函数的理解及使用,数据库查询优化和索引原理的了解。此外实时计算方面尚未过多接触。当然了,也有继续用 Java 写一些后端服务的接口,可编码量相对少了。直到年末及 2020 年的 1 月,又开始将主要精力放在 Java Web 开发,皆因业务上有部分数据需要开发接口提供,就由零开始参与了我们小组负责的数据服务的开发。
无论怎样,接触过半年大数据领域,对这方面有了整体的认识后,慢慢发觉自己还是喜欢后端架构相关的知识,想深入钻研的,是服务的高可用,高性能,高并发设计及保障。但我也很感激这半年中接触到,学习到的大数据知识,拓宽了我的眼界与认知,让我意识到计算机的世界,能解决的问题是如此丰富。
02 专业知识
这半年我会思考,如果要提升自己的专业能力,要将时间放在哪方面上,当然这不是马上就能弄明白的事情,因为每个人的兴趣不同,选择的路线不同,对不同技能的要求也不同。但是一些基础的知识是哪个方向都需要加强学习的,例如有这几点:
网络
网络是传输信息的基础,重要性再如何强调都不为过,但细想工作上与网络打交道的地方,却又不多,因为其底层属性,已经让操作系统,框架作了很多抽象的封装,只需要直接调用需要用到的 API。目前来讲,我觉得与网络相关,需要平时开发注意的是:HTTP 状态码,依据其判断接口返回情况,进而判断服务的正常情况等。
此外,还可以思考的一点是 HTTP / TCP 协议,HTTP 是七层协议,TCP 是四层协议,更多的层次意味更多的传输耗时,因此不同的业务场景,是否可以考虑不同的传输协议。
数据库
在做了半年大数据相关工作后,了解到数据的重要性,以及不同数据库存储的一些特性。例如,OLTP 是一般业务使用,追求查询效率,而 OLAP 就是专门应用于数据分析,不同的业务场景,需要根据具体情况来进行数据库的选型。
一般的 OLTP 中为了加快查询效率都会为表加上索引,那么索引是什么,它的数据结构又是怎样,如何加快查询效率就需要去了解学习。
此外 OLTP 在建表的时候都会遵循一定的范式,避免数据的冗余,但在 OLAP 中一般都不遵循范式,另采用星形模型,雪花模型等冗余的结构,提高数据分析的效率。
缓存
缓存跟数据库,都是存储数据的地方,都属于数据存储层,那为什么要分开来呢?无非是缓存的两个特点
- 快
- 并发高
相对普通的数据库好,导致需要在某些业务场景上使用缓存。那么假如使用缓存,就要思考如何保证数据存储层的数据一致,也就是数据库跟缓存中相同数据的一致性。
中间件
中间件有很多,例如队列,ES 等,这些中间件都是为了解决某种特定的业务场景来使用的,例如队列可以用来解耦,ES 可以用来做搜索等,对于中间件,目前我需要做的是对常用的中间件知道其应用场景,并对原理有个大体的认识,对工作上十分常用的中间件再做深入的学习。
数据结构
业务上写的代码,在我目前的认识来看,就是在数据结构中玩,以及常用 API 的调用。在 Java 中,需要熟练使用常用的集合容器,对各种业务场景的操作可以快速给出操作思路及实现,而这就是编码量与经验的体现了,需要多刷 LeetCode 来增进。
更高维度
上面说的这些都是各项具体的技术,一旦应用到系统中,又需要思考多个系统间通信、架构的事情了,这里引用一段话来总结一下:
真正的企业级架构就不一样了,其中并不仅仅只是RESTful API或RPC,还有各种配套设施和控制系统,比如:应用网关,服务发现、配置中心、健康检查、服务监控、服务治理(熔断、限流、幂等、重试、隔离、事务补偿)、Tracing监控、SOA/ESB、CQRS、EDA……
03 获取专业知识的途径
说完专业知识,再说说这年来自己获取专业知识的途径。
官网 & GItHub
做技术,最权威的是各项技术的官网了(很多技术的官网也约为 GitHub 主页了),想了解,学习技术,首先要去其官网学习。
业界主流公司的技术博客
这个是今年意识到的新途径,业务主流公司的技术博客及其公众号,不时介绍他们在某些领域中的最新实践,因为是业界主流公司,这些实践肯定是经过了大量的验证,有其参考价值的,因此在开展某领域的工作,或是学习某方面的知识,可以先找这些业务是否被主流公司实践过,是否有相应的资料参考,减少走弯路的时间。
V2EX
一个活跃的技术论坛,不时会有思考上的启发,当然也是摸鱼好去处。
公众号
碎片化的阅读,也有一定的价值。
专业书籍
书籍才是最系统的吸收知识的地方,下半年由于加班比较多,看的书比较少了。
04 软技能
在后半年的工作中,除了技术上的思考,我逐渐意识到程序员的平凡。一家企业中程序员不过是普通的职员,与销售,设计,产品等并无高低之分,只是特定领域下的工作细分罢了。
知道了这点,接着我意识到在其他领域同样有一整套理论与知识,并不比程序的世界简单。但有一项技能是所有部门都通用的,就是管理。人的管理是很难的一件事,各人的观念,能力不同,如何管理好确实是复杂的事情。当然我还没到要管理别人的位置,但提前准备无妨。在我的观察中,若想要做好管理,需要做好下面几件事:
- 管理好自己,有一定的自控力
- 良好的表达自己观念的能力,把自己所想描述出来
- 与别人的沟通能力,能理解别人的观念
- 与别人的合作能力,了解别人的观念,并传达好自己的观念,求同存异,以解决问题的基础上合作
当然因为自己没有这方面的经验,思考得不一定对,新一年也要努力加强这方面的能力。
05 新一年的 FLAG
阅读
先来看看 2019 年看过的书
读完的
2019-08-25 Java 核心技术·卷 I(原书第 10 版)
2019-07-10 RabbitMQ实战指南
2019-03-01 Spring 实战(第 4 版)
尝试过,各种原因导致没读完
深入分析 Java Web 技术内幕
代码整洁之道
Effective Java(第二版,英文版)
Flask Web 开发(第二版)
惭愧惭愧,读过的书不多,新一年要努力才行!
新一年的读书计划
网络是怎样连接的(重读)
计算机网络 自顶向下方法
代码整洁之道
深入理解 Java 虚拟机(第二版)
深入分析 Java Web 技术内幕
MySQL 技术内幕(第二版)
数据结构
此外在数据结构方面的同样要继续锻炼,不能松懈,在 2019 年中,培养起了刷 LeetCode 的习惯,并完成了当中 数组和字符串 的内容,希望来年能完成 LeetCode 探索中数据结构剩余的部分
- 队列和栈
- 链表
- 哈希表
- 树
博客
最后,是坚持写文章,把知识内化成能力,如果要量化成一个目标,那就是输出三篇有价值的博客吧。
END