前言
2018都已经到Q2了,为什么要写这个?
- 其实总结早就写好并在内部汇报过了。现在搬过来只是为荒芜很久的博客凑个数,抹去了很多工作上的内容;
- 记录下成长过程,方便自己随时回顾,复盘自己,沉淀自己;
- 感觉现在的自己像是在黑夜里打着灯光微弱的灯笼行走,前面是自己没有走过的路,看不到太远的未来,只能慢慢摸索前行。所以,记录过去的过程,也是一种思考。
本篇总结主要有4个部分:
一. 2017做过的事情,列出了一些我认为比较重要的工作;
二. 这一年的收获,软硬技能; 三. 未来计划; 四. 总结的总结。
一. 2017做过的事情
2017主要分上半场和下半场,个人感觉都很有意思。
201701 - 201705:单品页阶段,关键字:精益求精
单品页系统
- 存储拆分:几乎涉及整个后端的重构 - 电子书单品页:业务Coding,很荣幸的改造了京东最后一波的ASP.NET项目,用Nginx + Lua重写了 - 医药城单品页:业务Coding
大家电分区系统
- 山姆限购需求:根据业务特点做了一些有意思且讨巧的设计,通过业务请求异步驱动缓存的刷新,用另一种思路提高了性能
新分区系统
- 独立设计开发了新分区系统,日常TP99 4ms,每分钟调用量400W+ - 做了完整的链路压测,也做了大量的优化,将性能做到了个人所能达到的极致 - 推动京东全站接入
流量监控系统
- 各类url接入:好玩的流式开发思想
201706-201712:EPT阶段,关键字:畜生
负责的业务系统涉比较多,有一小半的EPT业务系统。最后一直在专注搞的是海外商品基础服务系统。
- 基础业务数据完善 有些维度的业务数据是没有的,要补齐基本的功能
- 基础服务能力完善 一个经历了至少3手的系统,很难想象其中糅合了多少质量参差不齐的实现和对业务错误的理解。连续的迭代,慢慢修正了已知问题和逻辑。
- 发号器 因为一些业务原因,无法复用现有轮子,自己搞一个适配自己场景的。目前已经成为公共组件,供多个系统使用。
- 性能提升 绝大多数接口性能都不高,作为基础服务,我认为快速是最基本的要求之一。我花了很大的功夫去提升性能。核心接口的TP99 10ms是我对系统响应时间的最低预期,实际上熬了几个通宵后,响应时间做到了5ms以内。做到这点也不是什么高深的技术,唯用心而已。
- 使用体验提升 别人怎么用你的接口,他都关心哪些数据,他开心么?我比较关注这个。我理想中的API应该力求做到使用优雅、语义明确、出入参结构清晰,并有持续维护的文档方便别人阅读。文档很有用,有一种酸爽是,当有人找你对接时,你什么都没说,并甩给了他一个文档链接。
这段时间跟畜生没什么区别,为什么这么说呢?3个人负责7、8个系统,每个系统至少2个以上的应用,每个应用基本都有提各种需求。有一大部分要么是最高优先级的,要么就是之前已经拖过无法再拖的需求。在被多个产品经理同时催着要排期的同时,要解决各种各样的线上问题,另一波需求之前的方案讨论会议邀请在向你疯狂的挥手。这个时候挑战的不只是个人的技术素养,更多的是个人的抗压能力,对事情协调、规划、推进、整体把控的能力。
当然造成这么辛苦的客观原因是缺人,但是没人会等你完全准备好了才开始,缺人也要干。跟上半年的区别最大的不同是,之前类似于守成,现在是开疆拓土,与创业无差。 每想起这段苦逼岁月,就会想起战壕里的兄弟,一起战斗过的情分很难得。那时在想,如果能决定什么,一定好好待他们。大家经过不断的磨合、碰撞,互相学习,一起成长,到依然一起共事,我觉得他们可能就是人们经常说的团队的“核心”,能被认可的人必然有自己的闪光点。 有句话说的很好:选择大于努力。选择这东西本来就不好区分对错,主要还是看自己要什么。不过只要用心了,相信没有白付出的努力。二. 这一年的收获
下面会从专业技能和软技能两个大的方面总结。
1. 硬技能
- 受益于新分区系统,学会了如何把复杂业务用优雅、高效的代码设计出来;
- 受益于新分区系统,积累了很多调优的经验。比如:JVM的配置、线程池的合理配置、RPC框架的调优等;
- 网站流量监控使用storm开发,维护这个系统的过程中,对storm架构、原理有了全面的了解;
- EPT商品统一接口的上线和缓存系统的建立。从架构设计到数据结构设计,到代码实现,对个人都是一次很大的突破;
- 读了一些源码:JUC、Netty、Tomcat、RocketMQ、Diamond、JSF(公司内部框架,等价于Dubbo的作用)等;
- 读了AQS、NIO的Paper,并结合源码做了相对深入的分析与理解;
2. 软技能
- 抗压能力 在没人的情况下承接很多系统,开始的两个月是我非常难熬的阶段。当时面临一个比较尴尬的境地:1. 没人;2. 不熟悉系统;3. 各种催命连环call,不是在公司加班就是在家加班。我跟领导谈过几次心,吐过几次槽,最终心态平和了很多。这段身心俱疲的阶段很难忘,一路走下来,整个人的神经坚韧了很多,这可能不是今年最大的收获,但是一定是最难获得的那个。
- 学会妥协 当开始接受大家的不同意见的时候,团队变得更融洽,难在真心接纳。
- 有事好商量 这个是主要跟领导学到的一种做事方式。什么事情不是非黑即白的,如果产品跟你说这个项目一定要在某个时间点上线而开发时间根本不够的情况,其实很多情况下是可以折中的,比如换一种实现方式,比如迭代上线。
- 协调规划 之前基本都是自己做事,后面陆陆续续的开始带一些人。当需要协调五六个人的工作的时候,比较捉襟见肘。开始给大家分配工作的时候,事无巨细的跟。到后来实在跟不动了,就粗粒度的放。到现在开始有点懂得把握关键流程节点,关键时间节点。
三、未来计划
1. 完善个人知识体系
没人是完美的,不过可以不断自我进化,持续学习,补足短板是必须的。
- 算法、算法、算法 算法为什么重要,个人认为主要有两点:一是它对工程质量的提升,二是对思路的开拓。大学没有做好的功课,总有一天要付出更高的时间成本。在大学的时候学了B+树,我一直不知道有毛用,当深入研究MySQL的时候才发现可以用来做索引,因为扁平结构,它能有效减少磁盘IO次数,因为机械盘随机读的效率并不高。书本里好像也有提到类似的段落,不过那个时候对MySQL也没什么太具体的概念。
- 操作系统底层原理 科班出身的人都是学过的,不过都是应付考试。毕业刚工作开始主要停留在语言的使用上面,用不到操作系统原理层面的知识。做到一定程度后发现不太一样了。举两个栗子: 1. 之前想做一些优化,想把一些常量数据存到本地,然后通过NIO FileChannel position的方式获取数据以减少一次网络IO期望获取更快的速度,但是经过跟同事讨论和查阅相关资料,发现磁盘随机读的性能还不如直接从远程缓存系统快。 2. 曾经想研究下分布式存储,考虑到存盘的场景的时候,在想是不是要了解下磁盘IO调度是怎么搞的,对应到操作系统能做哪些优化,如果没有这些积累,要花一些额外的时间去了解。
- JVM底层学习 随着工作年限的积累,越来越发现JVM的牛逼,一个这么牛的东西底层是怎么运作的很值得研究。做技术最值得自豪的事情是,可以像去哪儿的刀总一样,凭借实力像推土机一样去解决问题。
2. 完善个人的技术思想
- 多跟优秀的人接触 从工作经历来看,跟老司机聊天,很容易能产生好的想法;对外交流经历来看,跟老司机学习,能接触更广的知识面。
- 提升看待问题的视野 之前研究了很多的技术细节,宏观上有比较多的忽略,应该着重训练。比如2017年做了很多架构上的事,是有一些经验的,是有一些套路的,不过一直没整体归纳起来。
- 方法论 学习科学的方法归纳自己的技能树。
3. 前沿跟进
- 可能的二代微服务架构:Service Mesh
- 史上最慢的分布式数据库:区块链
四、总结的总结
想以自问自答结束总结:
- 总结的目的是什么? 开篇有答,简单讲就是,沉淀过去,思考未来。
- 继续问,学习这么多干什么? 只要愿意取舍,技术已经完全不是职业发展的瓶颈。我内心自问,是因为爱好和好奇。
- 如果有5个选项:1. 前沿技术;2. 有更多私人时间多陪老婆孩子;3. 有套好房子;4. 解决户口;5. 财务自由。在里面挑最重要的2个,其他的3个都舍弃你会怎么选? 这是在跟好友讨论未来方向的时候,他提出来的我个人认为非常典型、非常适合北漂人的问题。我相信大多数北漂人都会有一种想法,不管选择都会有一种叫不甘心的情绪,做这种思考过程里有一些价值观、人性的挣扎,是一个很不太愉快的过程。其实后来我没选,我觉得都不是我想要的。和菜头有篇文章叫《问对问题》,里面有个的问题是:“晚上你想吃火锅还是韩国烧烤?”,我的答案是都不选,我想自己决定吃什么。
早安,北京!