岁月划过生命线(2016 年终总结)
-季度之星
标签 : coder
年假结束, 明天就要回到杭州, 回到我fighting的战场. 回首过去的2016, 放纵了许多, 但也收获了很多: n个项目、n个框架、第一个季度之星、头像第一次登上CSDN以及第一个年度超越预期的KPI、一位愿意懂你并能够真正懂你的人…
回顾2016, 有两个人不得不感谢: 团队老大-康瑜@康康, 曾经的师兄-周盼@盼爷. 因为康康, 我最终选择了微店, 选择了杭州业务技术部一个温馨的团队, 同时在工作上给予我支持和我鼓励. 因为盼爷的信任和帮助, 可以让我放心、放手去干, 去胜任一份可以从中获取成就感的研发工作.
还好有时常总结的习惯, 2016年2~10月份的内容(如自身提高、项目、开源框架等部分内容)已经在岁月划过生命线(16.02 ~ 10)中提到, 在此就不再赘述.
I. 工作 - 代码
随着独立负责整个动态中心系统的时间愈久, 对项目开发/管理也愈有感觉, 处理线上/线下问题也越来越顺手, 但所做的事情也越来越复杂、越来越零碎.
以前一个业务过来, 总会有师兄将项目按模块划分然后分配下来, 我只需要做好我负责的模块并跟其他同学协调/联调好就可以了. 当师兄转岗和组内一个实习生离职, 整个动态中心系统由内到外, 由上到下全部的责任都压在了自己身上, 不再有人帮你划分模块, 不再有人在旁叮嘱提醒, 任何鸡毛蒜皮的小事(产品经理需要了解下实现原理、运营同学需要开通下权限)、任何线上问题(如线程池满、连接池满、Full GC频繁)都需要你一力承担, 24小时on call等待线上报警、客户投诉.
1. 项目
除了年底接了一个一元夺宝项目, 参与开发抽奖、开奖等功能之外, 几乎没再接其他大型的项目. 反而是已经已经接手很长时间的动态中心: 需要不断的重构架构、优化实现才能满足不断增长的用户量、数据量以及新业务的接入. 这段时间遇到了很多比较有意思的问题: 缓存连接池满、MQ消费速度过慢导致消息堆积、MQ消费速度过快导致MySQL压力过大、MySQL压力大/响应缓慢导致线程池满触发任务拒绝策略、线程池满导致新请求无法及时响应、单台Redis缓存由于数据量大导致响应缓慢必须切换为集群等问题. 由于这些问题只会在线上环境暴露, 因此解决起来非常棘手且紧急, 有时需要连续几天加班/周末不休息地去尝试新的解决方案. 在传统的解决方案解决不了的情况下很多激进的优化方案也会被放到线上测试.
很多优化方案由于公司保密原因在此无法展出, 但有很多的思想借鉴了Java并发编程实战、深入理解Java虚拟机以及Java并发编程的艺术等几本书, 感兴趣的同学可以参考下.
2. 框架
除了曾在岁月划过生命线(16.02 ~ 10)一文中提到过的Cacher原cache-annotation)、Touch、ScriptEngine三个框架在16年的最后一个季度都有非常大的升级改动外, 还将常用的业务/功能组件抽取/集合成一个类Guava的通用类库组件jbox、基于JMX开发了一款VM监控工具-VMX, 不过由于后来在网上找到了Apache Sirona, 他能够提供功能更强大、界面更简洁、配置更简单的监控方案, 因此也就没有再继续推VMX.
Cacher(原cache-annotation)
最新版的Cacher借鉴了spring-cache很多特性: 基于SpEL表达式的条件缓存、多缓存产品管理、常量key缓存、统一key前缀…, 同时3.1版本的cacher默认支持从in-heap-cache到off-heap-cache到off-process-cache到disk-cache一直到cluster-cache的九款缓存实现, 真正做到拆箱可用.上图
ICache
实现为微店内部版本, 开源版本可能会有部分出入.
project: https://github.com/feiqing/CacherTouch
最新版的Touch除了删除了基于web.xml的配置、开始支持基于classpath:touch.xml、http://www.vdian.net/touch.xsd的配置、支持属性映射修改等功能外, 没有其他大方面的功能性改进. 而是致力于在保持配置简洁、对原代码低侵入的同时提升Touch的性能以及降低对原系统应用的影响.project: https://github.com/feiqing/Touch
ScriptEngine
最新版的ScriptEngine不再依赖一个统一的后台, 而是开发了一款Idea插件, 可以在IDE内书写JavaScript、Groovy、Java代码直接发送到线上执行并拿到返回结果, 由于没有了统一后台的权限校验, 因此在数据传输的过程中添加了加解密规则、使用Zookeeper提供服务自动注册/发现, 在提升易用性的同时提升安全性.jbox
定制的线程池(扩展Executers
、ThreadPool
接口)、性能监控工具(Trace、RT、QPS)、对象字节大小SizeOf, 反射工具(List转Map、List属性抽取)、flood AB简易测试框架、通用调用框架等.project: https://github.com/feiqing/jbox
最后公司年会又一次在三亚举办, high了几天…
II. 非工作 - Body-Building
由于工作的压力这段时间的读书和body-building时间被压榨殆尽, 但也利用周末和年假空闲读了几部经典, 并稍事锻炼.
1. 读书
- JVM
我一直主张每位开发同学都要了解一些系统底层知识, 如JVM 、计算机系统原理… 哪怕不像撒迦(莫枢)那样可以深入到HotSpot VM内部代码实现, 但如果能够了解其底层实现原理(如内存分配、GC原理、JMM对程并发的优化等), 则可以让我们写出对VM更加友好的代码(提供更高性能).
这方面我推荐深入理解计算机系统(未读完(⊙﹏⊙))、深入理解Java虚拟机:JVM高级特性与最佳实践两部书以及并发编程网、InfoQ、ImportNew等网站的文章/视频, 以及自己亲手做实验验证、总结. 经过两个多月的努力, JVM方面终于得以入门, 结合线上Server的配置以及曾经遇到过的问题组织了团队内部的分享, 并总结出博客发表出来, 收到了不错的反馈. 详见我的博客JVM分类.
年会无聊时又发现一部VM相关书籍Java性能优化权威指南. 这部书将着眼点放了性能调优方面, 介绍了很多性能监控、分析、调优方法, 虽然也有JVM相关内容, 但行文方式与深入理解Java虚拟机有很大不同, 可以结合一起阅读.
- Effective Java
了解JVM可以写出对VM更友好的代码, 而了解与Java语言深度结合的实践经验则不光可以写出更高性能的代码, 还可以使其更易于阅读、易于扩展, 而Effective Java则将Java语言的最佳实践经验总结并展现在我们眼前(作者是Java Collections Framework作者, Google 首席Java架构师, 详见你应当知道的Java牛人 v2.0). 虽然以前断断续续读过其中部分章节, 但一直未能从头至尾的吸收其精华, 因此就利用闲暇时间和年假假期好好的精度了一遍. 其中大部分章节(如类和接口、泛型、通用程序设计、异常等)讲解精彩绝伦, 但也有部分章节拖沓冗长、过于追求理论上的完美, 但瑕不掩瑜, 仍是非常值得一读.
不过本书的中文版翻译实在拙劣, 错字连篇, 让我误以为亚马逊开始卖盗版书, 甚至几位中文译者是不是存心毁了这本书? 但翻阅原著, 发现原文行文也确实有些蹩脚难懂.
2. 锻炼
由于天气渐冷、工作渐忙, 坚持了8个月的跑步没有再继续下去, 虽然也办了健身卡, 但也只去跑了几次步就没有坚持下去了. 不过每周陪室友去学游泳倒让放下许久的游泳又坚持了下来, 放松的同时也趁机也学会了自由泳. 年会在三亚一起游泳时也让同事惊讶于一年前还什么都不会的我最近一年来的进步(~ ̄▽ ̄)~.
另外我还竞选了团队“体育委员”一职, 虽然自己的羽毛球球技一直以来未曾进步, 但在工作的间隙组织团队与其他部门同学联谊打球, 推动团队body-building, 大家在一起抛开工作说说笑笑, 也让团队气氛更加融洽.
早晨起来称一下体重, 由于几个月来的辛(hao)苦(chi)工(lan)作(zuo), 已经从74kg涨到了79kg, 因此在新年目标中又增加了一项: 体重从79降到72.
III. 季度之星
微店每个季度会从不同的方向(技术、运营、产品、客服、行政….)评选出一批优秀员工予以奖励 -是为季度之星. 虽然是一名毕业不久的应届生, 但对这一隆重奖项也觊觎良久, 但也从想过这么快就能够得到. 当得知自己获奖的一刻, 意外 & 激动 溢于言表, 感谢团队成员和公司的肯定.
IV. 规划 - 未来(2017.01 ~ 2017.04)
其实我是来给书做广告的 ╮(╯_╰)╭ …
现在以及未来的5个月初步计划要完成下列内容的学习(1~3 必须完成, 4~6视情况而定):
1. Java基础
- Effective Java
- 深入理解Java虚拟机(复习)
- Java多线程编程的艺术(Java并发编程实战)
- Java性能优化权威指南(HotSpot实战)
2. 分布式 & NoSQL
- Zookeeper: 从Paxos到ZooKeeper.
- 大型网站系统与Java中间件实践.
- 分布式消息队列MQ: RabbitMQ实战(RocketMQ的实践 & 设计理念).
- Redis设计与实现
3. Spring实战 & 原理
- Spring实战
- Spring揭秘
附: 人文
- 文明之光(第2册: 从牛顿到航天)
- 彷徨之刃(当法律无力逞凶, 人们该去往何处?)
*4. 算法
- 算法之道
- 算法(第4版)
- 算法设计与分析基础(第3版)
*5. 存储: MySQL & 分布式
- MySQL技术内幕 - SQL编程
- MySQL技术内幕 - InnoDB存储引擎(MySQL调优)
- 大规模分布式存储系统:原理解析与架构实战(OB存储核心)
*6. 大数据
- Hadoop(MR/HDFS): Hadoop基础教程(Hadoop权威指南)
- HBase: HBase权威指南
- Hive: Hive编程指南
*附. 其他
- 原理: TCP/IP、操作系统、计算机系统
- 搜索引擎、机器学习入门
- 脚本语言: Node.js、Python、Groovy
给时光以生命, 而不是给生命以时光.
- by 攻城师@翡青
- Email: feiqing.zjf@gmail.com
- 博客: 攻城师-翡青 - http://blog.csdn.net/zjf280441589
- 微博: 攻城师-翡青 - http://weibo.com/u/3319050953