回顾2017:谈谈过去一年的成长

2017过去了,回顾2017希望能够看清楚现在的自己,在2018遇见更好的自己。前不久支付宝的年度账单刷屏朋友圈,作为一名程序员,我也来晒晒我的2017年度技术“账单”。

2017年度成长“账单”

Github89 stars, 37 forks

spring-boot-learning-examples: 62 stars, 27 forks

java-skill-graph: 27 stars, 10 forks

博客21篇

java开发问题汇总:4

框架学习:15

架构设计:2

职业生涯开始带新人,成为团队核心

随着对业务的熟悉和技术能力的提高,开始成为团队核心,并开始带新人

算是上级对个人能力的认可,2018继续加油。

技术成长砥砺前行,进阶高级开发

工作后发现进步明显没有在学校快,一方面是没有了大把空闲的时间去学习了,另一方面是系统化的学习越来越少,所以更多的技术方面的成长主要来源于在工作中学和周末时间的利用。

总结起来,技术成长可以概括为3块:架构设计、问题排查、框架学习

架构设计:

  1. 设计了一种分布式系统的水平扩展方案,方便系统进行扩容;
  2. 设计一种分布式缓存本地化的解决方案;
  3. 部分核心接口进行了全缓存改造,让dubbo远程调用更快;
  4. 自主研发了服务治理平台,集成配置中心、性能诊断和流量压测

问题排查:

  1. 使用BTace进行线上问题定位,btace的一大优点是安全性和无侵入性
  2. 线上CPU很高排查
  3. log4j同步日志造成的死锁,线上一定要用异步日志

框架学习:

  1. Kafka
  2. RocketMQ
  3. Dubbo
  4. Sharding-JDBC
  5. Mockito
  6. Elesaticsearch
  7. Disconf
  8. Redis
  9. Cache: Ehcache + Caffiene

在架构方面做一些总结的话,我觉得可以概括为如下几点:

  1. 做好系统的监控,包括性能指标、业务指标
  2. 缓存是提高性能的利器,包括分布式缓存和本地缓存(本地缓存失效问题要考虑)
  3. 多个dubbo接口调用尽量采用异步,一种方案是使用线程池 + Future
  4. 单个批量查询接口如果批量的数目比较大,可以采用分页 + 异步的并行方案

提高效率

提高工作效率有很多方面,这里包括时间管理、知识管理、沟通协作、提前设计、谨慎修改、使用插件

(1)时间管理

在日常工作中总是不免会被各种事情干扰,比如测试突然给你反馈一个问题、产品突然需要上线一个紧急需求、PM突然让你开个会、leader突然找你谈个话。。。诸如此类,作为程序员的我们只想安静地写写代码,有那么难吗。上面这些相信程序员都深有体会,为了更好处理这些事情,我一般会给这些事情设个优先级,哪些是要马上做的(不做可能会造成更大的问题,比如线上突然出现问题)、哪些是可以稍后在做的(比如测试反馈一个问题)。每天用Google Keep今天要做哪些事,技术的、业务迭代的

(2)知识管理

程序员需要不断学习,我一般使用使用印象笔记进行管理,在碎片时间看到好的文章收藏到印象笔记里面,设置一个标签,方面后面进行搜索和管理。设置标签可以很好地进行归类,现在很多人把文章收藏到印象笔记后就懒得看了,一个很重要的原因就是很乱,没有看的欲望。

(3)沟通协作

一个需求经常会跨部门协作,积极主动找接口人沟通问题和细节可以尽早发现问题,程序员沟通都比较实在,不要只知道闷头写代码,多通沟通可以了解更多上下游的细节,对我们自己开发也是很有帮助的

(4)提前设计

一个需求评审完后,其实就可以开始开发了,一般我不会马上急于开发,而是事前设计好实现方案,想好可能会出现的问题,包括设计的改动会有哪些、哪些业务会涉及到、如何上线、是否有不一致的问题(特殊场景)、如何回滚。当我们把这些细节想清楚后,其实开发的时间会大大缩短,而且实现的代码质量也会比较高。

(5)谨慎修改

刚才提到提前设计,为什么还要提谨慎修改呢?有一些需求或者重构你一看就知道应该改哪些以及怎么改,这种就没必要进行详细设计了,一般可以直接改代码。改代码过程中要谨慎、思路清晰,切忌不懂原来代码逻辑凭主观理解去修改代码。忌:永远不要去猜代码!

(6)使用插件

对于IDE,可以使用插件提高开发效率,比如使用Maven Helper分析项目依赖,这笔敲mvn dependency:tree快多了。常用代码构建Maven命令保存下来,比如mvn clean installmvn clean source:jar deploy等,将常用的运行脚本保存下来,下次执行就可以从列表选择

写得一手好代码

相信很多程序员或者说好的程序员都对写得一手好代码情有独钟,好代码就像读优美的文章一样让人心旷神怡,感觉很舒服。代码是给人看的,我自己对写得一手好代码也有一些浅显的理解:

(1)每个函数的职责清晰

如果一个方法很长,那么很可能这个方法做了太多事情,读起来会非常难受,可以把不同的功能封装到单独的函数,函数最好能够见文知义

(2)手动创建线程池

可以更加明确线程池的运行规则,规避资源耗尽的风险。说明:Executors各个方法的弊端:newFixedThreadPool和newSingleThreadExecutor的主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。

(3)包名统一小写

(4)多线程下使用ThreadLocalRandom实例获取随机数

(5)使用Log4j2

Log4j2、log4j、logback性能对比:log4j2 > logback > log4j。优先使用log4j2的异步日志

(6)CountDownLatch.await避免无限等待

使用CountDownLatch要注意避免无限等待,如果有线程超时或者异常可能会造成无法执行countDown()方法,造成await无限等待,从而让线程卡死。

(7)属性copy尽量使用纯setter方式

Apache BeanUtils性能较差,不要使用!优先使用Spring BeanUtils, Cglib BeanCopier,其中Cglib BeanCopier性能优于Spring BeanUtils。

(8)序列化方式选择

MQ消息序列化可以使用FastJSON、Redis序列化可以使用Jackson或者Google Protocol Buffer

(9)定时任务优先使用Spring Task,简单易用

避免在多线程下使用TimerTask,如果有一个线程抛Exception其他任务也会终止。

(10)DO、VO、DTO命名

DO:数据库传值对象

VO:前端展示对象

DTO:外部接口返回值

(11)善用快捷键

善用快捷键可以大大提高工作效率,每天练习使用下IntellJ IDEA的快捷键,可以让你受益颇多

学习、心态、职业规划

这里谈谈自己关于学习、心态和职业规划的感受。

(1)保持好奇心,持续精进

相信工作了一段时间的朋友都会感到瓶颈出现,不知道下一步怎么继续走下去,我觉得保持好奇心很重要:听到新名词自己下去了解下其功能和使用场景;在公司自己一个mvn deploy就部署上去了,那么是不是可以研究下怎么把代码部署到maven的中央仓库;公司在用Disconf,那么其实现原理是怎么样的,如果让自己设计怎么做到高可用,自己是不是可以搭建一个环境加个配置就搞定;公司使用Sharding-JDBC进行分库分表,自己是不是也可以做个demo学习下,万一后面用到了呢。

(2)技术建议先深后广

虽然今年人工智能很火,各种再不学Python你就Out的话不绝于耳;最近又出了个牛逼的框架,该不该学些呢。现在技术更新发展很快,如果不掌握背后的规律很容易弄得自己很浮躁,我建议是与其浮躁不如静下心来好好看书。不管是以后的职业发展还是跳槽面试,总是深度优先的。这就要求在Java方面必须有自己的特长,不管是业务经验还是技术经验,JVM、问题排查、架构设计都可以。只要有一项你牛逼就够了。

(3)系统化学习

系统化学习最好的方式还是看书。工作以后发现没有大块的时间让你去学习,但是我们可以把零碎时间利用起来。比如想深入学习JVM,可以给自己列下学习提纲,每个提纲找相应的学习资料,利用去公司做公交的时间、中午午休的时间、晚上睡前的时间。。。

(4)谦虚做人,认真做事

在公司通常会有很多比你厉害的人,可以向他多多请教学习,比如某A很擅长排查线上问题,可以请教怎么快速进行线上问题定位;某B很擅长看源码,可以和他多多交流看源码的心得

(5)多研究源码

看源码的好处不言而喻,学习好的设计,也是写得一手好代码的重要途径。可以看看JDK的源码、Dubbo的源码、RocketMQ的源码、Mybatis的源码

(6)向技术专家方向进阶

本人不止一次想过以后的职业发展,是继续在技术方面深造还是转型做管理都想过不少。我对以后自己的设想是往技术专家方向发展,带带团队,写写代码,如此甚好!我之前在Github开源的java-skill-graph就是希望自己在Java方面能够继续深造下去,成为这方面的专家级程序员。

展望2018

新的一年,希望自己不忘初心,保持好奇心,持续精进!

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页