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