0. 引子
又到了一年一度的写年终总结的时候了,今年总体给我的感觉可以用“压力+赶路+成长”这三个词的组合来概括——总感觉眨眼间,新的一年就过去了。回望年初的自己,不知是否知道一年后的自己是什么样呢;现在的自己,回望一年前的自己,又是否还能记起当时的心境与盼望呢?所以,在动笔写24年的年终总结时,我回顾了一下23年年终总结时自己的期盼
职业以及技术栈上,“大而全”一定需要让位于“专精”的发展。因此24年的目标之一就是让自己专精地去深入一个领域,定的目标是后端,包括数据库、网络、OS、以及各类中间件和框架的原理了解。
职业规划和技术成长一定不能闭门造车,同行的conference可以多去参加,发挥互联网的力量多找人咨询,之前知乎咨询认识的大V以及交流群的资源用起来,前期认知以及方法论要正确树立。
如此看来,总体而言,24年还是行进在23年所企盼的道路中的。
对于24年的回顾,我想从下面这几个角度来剖析和审视一下自己过去一年的生活:
- 工作
- 理论与技能
- 视野与方法论
最后,再提出我对25年的自己的新的愿景。
1. 工作
还记得23年的时候,对自己的期许是“专精”,从这一点上来看,24年确实专精了不少。年初的时候接手了一个中间辗转了好几个团队维护的项目,到我手上已然是“烫手山芋”。但索性最后还是抗住了压力,维护过程中也积累了不少实践经验:
脚本、容器与自动化部署:特别是这种维护周期长,迭代次数多,人员流动频繁的项目,有部署相关的文档和脚本会省力许多,否则连本地起一个环境都十分费力;
线上可观测性:通过prometheus全家桶来打造可观测性系统。可观测系统的好处在于预防和复盘,前者搭配告警系统使用可以很好地防患于未然,后者则是复盘bug的利器,通过对关键指标在事前事中事后的走势的分析,可以做到更好地定位问题,以及评估该类问题对系统的整体影响;
案例:曾经遇到一个问题,场景大抵是OA系统申请最后一天,大量用户登录系统进行填报,结果出现了部分用户反馈系统接口502的情况。当时通过prometheus观测到,在用户反馈前半小时左右,JVM的线程数快速达到了一个峰值,在5分钟过后出现了频繁的full gc,所以我的判断是应用资源不足导致的线程数耗尽不可用。当时的临时做法是关闭系统内其它次要服务,然后调大该OA系统启动脚本中的Xmx参数,再次重启后就没有遇到相同的问题了。
后来复盘时需要排查根本原因,最后排查下来是一个查询用户信息和组织信息的接口在方法里for循环调用了一个Utils类的方法,但这个Utils类的方法是一个远程调用,它调用了用户服务,会去查数据库并返回用户信息。而在for循环里走远程调用导致了慢接口,平时用户量不大的情况下就没问题,但是一旦出现了这种临近关闭申请的场景时,用户量激增把线程数和内存打高,然后JVM启动参数又限制了最大堆内存,结果就一边频繁full gc,另外一边卡在慢接口,外部还有请求堆积,三管齐下导致系统出现了部分用户502的情况。最后调整的方法是,根据用户信息属于热点数据,且场景是读多写少这样一个情况,在远程调用前增加了一层redis缓存,先查缓存,缓存中没有用户信息的情况下再查接口并写缓存。改造后该接口rt下降超50%,同样启动参数的情况下,再也没有出现过系统不可用的情况了。
维护这个项目的时候,我才感觉到能把业务实现出来是最基本的,但决定是代码越写越多,bug越修越多;还是代码越写越少,bug越修越少的,往往在于架构抽象以及devops上花的工夫的多少。良好的抽象和分层,清晰透明和一致的测试与部署,以及完善的监控告警体系,才是一个应用“可用性”的关键。
随后在开发一个老项目的新模块时,我更加坚定了质量把关需要提前做,详细做,好好做的信念。这个项目也是一个类似OA流程的系统,其最关键的就在于“申请-下单”这两个链路的履约。对于履约性质的业务,业界已经有很多成熟的方案了,经过调研后,我认为“状态机”这种基于“状态”与“转移”的建模方式,特别适合这种事件驱动的履约业务的描述,所以我选择了使用基于Spring状态机的实现来完成履约链路的编码。其次,该模块有面向C端的部分,而经过上一次C端OA系统在临近关闭时存在“有流量峰值的可能性”的这一场景的拷打,我决定应该要在实现时就把“可能会存在一定并发量”的情况考虑进去。在这一类OA履约系统中,最重要的就是数值上的一致性——申请的数量,下单的数量,发货的数量必须保持一致性,否则如果影响到了现实中用户的下单和商家的发货,再走补偿成本就会很高了。因此,为了兼容并发场景下的一致性,我在涉及到“申请-下单”链路的所有的表中都添加了乐观锁,同时新增记录也做了幂等性校验的处理,以及事务这种基操性的处理。只是目前来看系统使用量并不大,还没有遇到除了接口压测外的高并发的考验(笑。
最后,临近年底时分配到了数仓开发的任务,场景主要是需要做数据集成,同时涉及到实时和离线,前者主要是物联设备的数据上报、分析、告警;后者是第三方接口定时任务以及部分表同步任务。考虑到实时业务里面国内最流行的框架是flink(主要是我认为用框架风险更小,自己写的话很多涉及到可用性和可靠性的东西如果要深入考虑,至少也得实现一遍这些框架就有的功能,比方说快照容错、精确一次等),所以我采用了flink来实现数据的etl。同时为了兼容实时和离线,我选择在etl前增加一层接入层,通过统一将数据发送到kafka来整合实时的物联设备数据以及第三方接口的定时任务,然后在数据etl层用kafka+flink来实现数据的统一清洗和写入。表离线同步的部分则通过xxl-job+datax来实现。最后同样上了prometheus全家桶来作为可观测系统。这个项目中我的任务虽然业务上没有复杂的,但在中间件方面确实着实是用得最多的一次——缓存、mq、流处理框架、调度框架以及监控。一方面确实感慨于中间件的带来的效率与稳定性,另一方面也感受到了引入中间件后系统复杂性的提升以及监控的重要性。
总结下来,24年工作上给我的感觉就是,擦的屁股够多,遇到的问题也够多,但同时自己的思考以及应对措施也在这些问题的逼迫下进行了很多。概括而言,那就是,要保证一个应用的可用性,前期的规划设计,核心链路的抽象和建模,系统整体的架构,实现时的分层,以及一致和透明的部署、以及监控和告警体系,是最为关键的部分。
2. 理论与技能
技能,或者说“技术”吧,拜工作所赐,感觉自己在Java Curdboy的道路上算是迈出自己的步子了。但是更多的是在碎片时间了解方案,工作时即用即学的方式,主打一个摸爬滚打现学现卖,并没有很好地理解这些技术背后关键的insight以及infrastructure,私以为知乎上有一个问题“计算机的哪些学科是被建议在本科阶段学掉的?”下面的回答很好
你必须知道计算机科学几乎所有的领域基本的想法是什么。比如 tcp 怎么维护虚拟链接传递信息,如何做微观的拥塞控制;编译器怎么 parse 出来 ir,如何对 ir 优化;分布式算法如何协调工作;流式计算里面 unbounded data 怎么做 window/trigger;机器学习里面各种模型是如何拟合数据的,为什么需要不同的拟合方式;mysql 中事务怎么做,行锁怎么设计的;linux kernel 的进程调度怎么设计、异步 io 怎么设计……
有了这些视野之后,你要把它们从具体的领域中抽象成概念。
对比国外顶尖大学的CS教学,就会发现越是顶尖的学校,在教学时越强调insight和intuition的作用,很多时候我们会遗忘细节,但是只要能够记住这么做的动机,也总是能做出一些殊途同归的实现的。因此,在理论和技能这一块,在学习过程中也不要忘了去高屋建瓴地抽象出动机和机制。
另外由于4月份面阿里诚云的时候算法面没过,备受打击,所以算法也刷了一些,截至12月31日top100里通过了81道,还有19道未通过,惭愧…
3. 视野与方法论
这一块在今年7月份参加asf asia 2024时,看蚂蚁集团的Nadia的公开演讲时深有感触。她提出了“零散思考-体系化方法论-标准化流程/工具”的三步走框架,通过高频输出倒逼自己将零散的思考整合成体系化的方法论,再通过落地将方法论转化为标准化的流程和工具,来形成职业领域的输出的闭环。通过我个人的观察,发现大多数人都停留在“零散思考”这一层级,能够将零散思考转化为方法论的已经是人才了,倘若还能进一步落地成标准化的流程和产品工具,那就是人才中的精英了,这里面每一步都需要大量的观察思考和实践总结。
另外,我通过各类会议还发现了这样一个现象,那就是“汇报(或者叫演讲)”所起到的作用也十分重要,这就涉及到“影响力”的环节了。如果只能把一项技术方案/编码实现输出给机器,那么你的工作的影响力最多只能停留在团队内部,最多就是公司范围内;但是如果能把一项技术方案/编码实现不仅输出给机器,更能输出给台下的人,那么你的工作的影响力就不仅仅是停留在团队内部了,而是会辐射到整个行业内——后者将帮助你在个人的职业生涯中获取更多的机会。通过观察一些令我印象深刻的演讲人的技术分享,我发现他们共通点就是思维缜密,层次分明,且熟练运用STAR法则——从问题入手来剖析场景,找出关键矛盾,然后指定针对性的方案,最后输出落地的成果,有些则会补充未来的规划等。这样做的好处就是说服力强,能够让人印象深刻,下次遇到了类似的场景,马上就会回忆起演讲者及其分享的方案,从而推动技术模式的推广以及个人的影响力的建设。
4. 愿景
新的一年——2025年里,我对自己的愿景是技术上,可以在计算机科学领域更加深入,去补上自己原有在大学课堂里缺失的教育,包括操作系统、网络、数据库、编译原理、以及机器学习和深度学习,最重要的是insight和动手操作;生活上,少熬点夜,养成健康且可持续的生活习惯,同时在身材管理上可以再接再厉(忘记说今年减重10斤了哈哈);工作上,可以进入一个更大的平台来学习、成长和输出。人么,终归还是要多折腾,才有进步的。
PS:其它
除了工作内容上的输出,年中的时候本人所在的公司还经历了一波人事变动,绝大多数人都被干掉了,和我同期的几个转正的实习生只剩我了,原来的leader和所在的组也基本全军覆没。不知道是不是我太过于牛马,以至于让公司觉得性价比太高,所以才让我留下来的呢?想来俗话讲“没有对比就没有伤害”,好像觉得自己无形之中为这些人的离去起到了一些推波助澜的作用。如果那一次我也在裁员名单上的话,也许我现在就在准备润的事宜了吧。