岁月划过生命线(16.02 ~ 10 -提前转正)

岁月划过生命线(16.02 ~ 10)

提前转正

标签 : coder


10月9号收到了提前转正通知后就想写些总结, 总结在微店的一年里见过的人、读过的书、做过的事儿, 不然怕很多有意思的细节以后都忘了. 但一直找借口迟迟懒得动笔, 这篇总结断断续续竟写了一个月…

9月28号动态中心的全部代码部署上线后去听了公司关于晋升的分享会. 很多细节已经模糊, 但get到了以下两点讯息:
1. 府笛分享的晋升的关键- 主动性: “以P7的视角完成P5的工作, 那你离P6还远吗?!”
2. 敏洁分享的提前转正: 新同学表现优异的可申请提前转正.
虽然自己毕业才3个月,未满6个月试用期, 但由于在前段时间的新人总结中老大康瑜给予了充分的肯定, 因此第二天便提出了提前转正的申请, 并在十一过后收到通知, OA状态已变为正式.

由于15年的大部分内容已在 从阿里到微店 中涉及到, 因此不再赘述, 只总结16年的自己的个人提升工作总结以及未来计划.


个人提升

想要成为一名优秀的开发者/研发工程师, 我认为不光要有过硬的技术实力分析和解决复杂问题的能力优秀的架构设计能力, 还要有对生活的感悟、对技术的品味以及良好的身体素质. 因此这部分我将从 人文* 、技术健身 三个角度来谈个人提升.

这部分对我启发很大一本书是 软技能: 代码之外的生存指南, 建议每一位身在职场和即将步入职场同学找来读下, 绝对收获很大.


1. 技术

通过15年在 阿里微店 实习时的基础沉淀和查漏补缺, 工作中常用的技术已基本掌握, 因此在16年我将技术的重点放到了对基础知识的梳理巩固和一些感兴趣的技术上:

  • 基础梳理部分包含 Servlet 与 MVCSpringJDBC与MyBatis设计模式前端技术等.
  • 感兴趣的内容有: Redis与MemcachedLua语言Nginx网络与RPC 等.

2. 人文

一年多来这方面读了/看了很多优秀的小说/影视作品, 也遇到了像大学之路软技能这样优秀著作, 下面我将从偏技术、纯人文、影视作品和其他四方面聊聊:

  • 偏技术:
    这方面读了 代码的未来大型网站技术架构:核心原理与案例分析 两部出色非常书: <未来> 中松本行弘老师以一名语言设计者的角度讲述了从语言的经典特性讲述到技术潮流中的新思想:多核、通信、现代存储等多个主题, 对我们这些“可能最早与未来接触的人”可以产生深刻的启发. 而 <大型网站> 一书从架构师的角度讨论高性能、高可用性、高安全性的大型网站设计、架构原则, 有时一部让人大呼过瘾的好书.

  • 纯人文:
    今年有幸成为东野圭吾的粉丝: 嫌疑人X的献身白夜行解忧杂货店恶意宿命(不推荐) 东野圭吾对人性的刻画, 对逻辑剖析让人不忍释卷. 而三体(三部曲)则以宏大的视角、几百亿年的时间跨度彻底打开了人们看待事物的宽度和广度.

  • 影视:
    山影的几部作品琅琊榜欢乐颂伪装者绝对是业界良心, 演员的敬业以及对人物的刻画不禁让人肃然起敬. 而电影就有太多可以讲述, 感兴趣的同学可以参看我的豆列-翡青.

  • 其他
    有时间还涉猎了一些经济学心理学历史的内容, 但较为浅显也就没什么好说的了.


3. 健身

从16年年后回到杭州起, 就一直有计划的健身: 跑步游泳羽毛球骑行.
截止到开始写这篇博客的时间, 已经累计跑步123天(平均每天6公里)、羽毛球也拿到了公司羽毛球赛的男双冠军和混双季军. 而体重也从年初的89Kg减到了现在的75Kg. 附上十一在西湖的一张自拍:

颜值不够, 风景来凑(⊙﹏⊙)b.


工作总结

在微店的一年里(15.9月底~16年.9月底)做的东西可以简单总结为七个项目, 三个框架.


项目

从最初实习时的跟师兄一起做动态迁移, 到后来自己负责一个“好店再来”模块“动态后台”开发, 再到后面正式入职之后的feedcenter-push新功能后台重构push重构全球购动态迁移, 一直到最后师兄转岗, 自己独立承担一个包含三个应用的feedcenter系统, 为微店买家版全球购两个App提供近三十个dubbo接口, 每天上百万次的请求. 一路走来, 一方面使得自己对Java这门优秀的编程语言越来越得心应手, 另一方面, 自己的抗压能力, 对整体架构设计能力, 对系统性能瓶颈分析都能感到有明显的提升. 由于大部分的业务系统对开发人员的考验并不在技术这一关(感觉要对Java语言、异步、并发、分布式缓存、分布式消息队列、RPC、分布式数据框架、集中式配置中心有较深的了解, 相对更偏重的是使系统设计的更加简洁和可扩展, 而这一点很多业务系统是想通的), 且由于公司的内部信息不方便公开, 因此就只着重于总结下自己做的几个小框架: cache-annotationscript-enginTouch.


三个框架

Cacher

最初产生要开发这个工具的idea是由于北京的Redis集群经常宕机, 我们不得不将所有的缓存切到杭州集群, 但同时我们又不想写一堆先查缓存, 未命中再去查DB, 然后写入缓存傻瓜式的代码, 因此我们就了开发一款基于注解的缓存框架, like this:

@Override
@Cached(expire = ONE_HOUR)
public AuthorFeed getAuthorFeed(@CacheKey(prefix = "feed_id:") long id, String authorId) {
    return dao.selectAuthorFeed(id, authorId);
}

只要添加了@Cached注解, 我们的框架便会根据@CacheKey内的定义拼装出一个缓存的Key先去查询缓存(可以是HashMapGuavaLocalCache, 也可以是RedisMemcached专业的缓存服务). 如果未命中再去执行方法并将方法结果缓存. Cacher的优势还在于还支持批量的缓存查询(相比于Spring-Cache等产品), 如果有部分key未命中, 则将用这部分key去执行一次方法并缓存, 然后将两部分结果合并返回, 如:

@Cached(expire = TWO_HOUR)
public Map<Long, List<String>> getLikeUsers(@CacheKey(prefix = "feed_id:", batch = true) List<Long> feedIds) {
    Map<Long, List<String>> userIdMap = new HashMap<>(feedIds.size());
    for (long feedId : feedIds) {
        List<String> userIds = feedLikeDAO.getLikeUsers(feedId);
        userIdMap.put(feedId, userIds);
    }
    return userIdMap;
}

该框架我和师兄共同设计, 并由我全部开发, 但由于gitlab挂在了师兄名下, 且原先的设计跟微店的Redis集群绑的很死, 因此我将其重新设计开发, 现在已经处于测试&优化阶段, 后面我会陆续发布到这个git地址下:https://github.com/feiqing/Cacher .


ScriptEngine

一个线上脚本执行引擎, 现在支持在服务器上跑JavaScript和Groovy两种脚本. 只要在项目环境中配置了一个SpringBean, Engine便会跟随应用一起启动一个RMI服务, 然后就可以在Engine的后台向这个应用发送JS、Groovy脚本执行, 为了提高框架的易用性, 在脚本执行前会将Spring内所有Bean作为全局变量导入到脚本环境供脚本调用, 因此非常适合做线上数据订正、手动加载等后门操作, 其开源地址如下:https://github.com/feiqing/ScriptEngine. 不过现在Engine的后台Web界面只着重于实现功能, 因此界面不太美观, 且由于我自己前端功底较弱, 希望看到这篇博客的前端同学有时间可以帮我优化一下, 在此先谢过了O(∩_∩)O.


Touch

开发这个框架的原因是由于动态中心的黑名单加载改造: 原先的黑名单加载由微店的统一调度框架调度加载, 但这个框架有个问题是每次只会调度到一台, 而我们线上有多台机器, 因此我就自己用Timer实现了一个统一调度框架, 为定时任务分配固定的执行时间片, 所有的任务当时间到后会被统一调用, 这样就没必要每一个定时任务开启一个线程. 但这样还未解决定时任务手动触发的问题, 如果运营将一条动态拉黑, 它就必须等待一定时间才能生效, 而他又想立即生效. 于是在一次睡午觉前, 我看着线上代码, 想着能不能在系统上线之后我直接用手摸到线上代码, 于是 Touch 的名字和想法就这样产生了: 只要给你的一个方法打上@Touch注解:

你便可以在浏览器上手动执行你的方法:

这样一方面可以使你在系统运行时手动执行一些任务, 而且还可以节省大量测试接口(如Dubbo、HSF)开发的Servlet、Controller测试代码. 这个框架从产生idea到设计、开发, 到测试、buf-fix、发布, 再到文档编写一共用了不到二十个小时, 经历了一天半时间. 当释出了第一个版本之后便引发了部门内部激烈的讨论, 并获得一致好评. 目前已经发布了5个大版本: 修复了大量bug, 提升了性能, 增加了包扫描的功能, 也加入了基于ZK开发的安全控制. git地址为: https://github.com/feiqing/Touch.目前在微店内部使用的最新版本是0.3.2, 其相比0.2版本大幅度优化了性能、内存占用以及简化配置(去除了@TouchArg参数, 动态获取泛型参数类型), 但现在github上的版本还在0.2版本, 等一有空闲时间我会马上更新上来, 当然也欢迎感兴趣的同学提出想法&加入.


未来

未来一年~一年半的可以简单用沉淀一词定义:


1. 语言

如今动态语言大热, 感觉不会几门动态语言都不好意思跟人打招呼, 因此在继续巩固自己的饭碗Java的基础上, 还规划学习几门动态语言:

  • Java: JVM原理、Effective Java、Java并发编程的艺术(Java并发编程实战)、Groovy(更灵活的Java);
  • JavaScript: 似乎JS想要一统天下: MongoDB支持、JDK内置的JS解析器从Rhino升级为Nashorn、 Node.js、 Chrome插件开发、React Native以及最近大热的微信小程序.
  • Python: 灵活的脚本, 运维同学的一大杀器, 各类机器学习框架、树莓派、Alfred工作流、Jython, 甚至Sublime编辑器.

3. 存储与大数据

  • 像MySQL、Redis、Memcached这类存储服务我们几乎每天都会接触, 但其实对其的底层知之甚少. 但只有我们深入的了解了他们的底层原理, 才能更高效的使用他们, 比如一条数据是物理删除还是逻辑删除性能更高?对索引更友好? 这方面打算读下这几本书: MySQL技术内幕-SQL编程MySQL技术内幕-InnoDB存储引擎Redis设计与实现大规模分布式存储系统: 原理解析与架构实战
  • 随着Hadoop的成熟、Spark/JStorm的流行, Zookeeper在分布式协同方面的事实标准, 感觉一个Java开发对Hadoop这类大数据框架依赖越来越强. 你不可能总让BI他们帮你跑MR吧. 这方面推荐几本我看过以及打算看的书: Hadoop基础教程Hadoop权威指南(第四版:英文版)HBase权威指南Hive编程 从Paxos到Zookeeper : 分布式一致性原理与实践.

3. 搜索引擎与中间件

作为开发中技术含量最高的两类技术, 虽然日常工作中经常接触和使用, 但并未有很深的理解. 这部分打算读几本书, 但更加深入和实践的内容还需要和专业的团队进行交流和沟通:
这就是搜索引擎: 核心技术详解解密搜索引擎技术实战:Lucene & Java大型网站系统与Java中间件开发实践.


4. 算法与机器学习

算法与数据结构无论何时都不能放下, 但反观自己实习和工作的一年多时间里, 在这方面投入的精力地区很少, 因此在未来的一年里会在这方面以及最近很火的机器学习投入更多的精力. 推荐几本自认为还不错的书: Java数据结构与算法分析算法(第四版)机器学习实战机器学习(周志华).


5. Computer System 原理

如今的RPC/MQ/分布式数据框架/集中配置中心从设计的角度来看不过是对操作系统等底层技术的延伸和封装. 比如RPC其实封装的是Socket和动态代理, MQ是将IPC中消息队列放到了分布式环境中. 因此对系统底层如操作系统TCP/IP等知识的掌握对理解甚至开发的中间件应用都有着非常大的作用. 这方面的好书有深入理解计算机系统TCP/IP详解操作系统设计与实现计算机程序的构造与解释 等.


6. 博客更新

另外还有一个比较有意思的转变是从这周起 翡青的博客 正式更名为 翡青的技术周刊, 从这周起, 我会尽量做到每周更新一篇博客: 每周我会选定一个比较有意思的话题(比如这周的 JVM初探-内存&GC), 在这一周的时间里, 我会每天抽出一到两个小时的时间, 去读书、查资料、做实验、思考, 丰富这篇文章, 然后再每周周五下午六点发出(互联网公司正式下班时间), 供各位开发同学在一个唯一不加班的晚上阅读. 文章的内容还是秉承一贯的风格: 偏实战但又不乏深度. 这篇文字一方面可以看做是一个职场新人一周的学习总结, 另一方面也可以看做是一个开发新人每周交出的一份作业. 欢迎大家到时订阅收看(2017更新: 现已弃用…).


Best Wishes.

  • by 攻城师@翡青
    • Email: [email protected]
    • 博客: 攻城师-翡青 - http://blog.csdn.net/zjf280441589
    • 微博: 攻城师-翡青 - http://weibo.com/u/3319050953

你可能感兴趣的:(coder)