工作两年后,我有什么感受
工作两年后,我有什么感受
从24年7月正式工作到现在(26年4月底),其实距工作两年还差一些,不过我毕业前还有十个月的实习生涯,姑且算是工作两年了吧。那么正式工作两年后,我有什么感受?
过去
大学期间,我主要是按照遇见狂神说的 Java 路线学习,一路跟了数十个视频,以为 Java 开发就是注入 Mapper,写写 sql,说出来不怕人笑话,我当时真的连 Bean 是什么,以及默认扫描 Bean 只扫描启动类下的文件都不知道。
好在看了那么多视频,“照葫芦画瓢”的能力倒是学了一些,还是很轻松的完成了数据库、Java Web、 Django 这样的课程设计,也导致一段时间被大家认为技术好,代码强。有点印象的是最开始写网络编程,对着视频写完还是一脸蒙圈,怎么这样写个 Socket 就通信上了,什么叫阻塞,为什么这样的一行代码就能卡住进程呢?对于中间件的了解也很空洞,知道在项目中怎么用,对背后的实现一无所知,面试也是临时找了点八股文。
机缘巧合之下,大四进入超聚变(至少我了解到的是算力领域全国第二)实习,遇到了一批优秀的人(导师制,我导师是上海大学的本硕,PL 是西交的硕),加上超聚变本身是华为子公司拆分出来,有比较完善的规章制度和开发流程。优点提完了,缺点我就不提了(我PL原话:从这里出去,90%的公司你都能很快适应),总之最后虽然给我发了 offer 我还是交违约金离开了,这里提高了我对云原生知识的掌握,代码质量的要求,但项目进度比较紧张,没有学很多新的知识。
顺便一提,因为实习和饮食、作息习惯的原因,实习期间还动了个小手术,也是我决定要离开的原因之一。
成长
校招还是拿了几个 Offer 的,最后选择来了这里。刚来的时候由于实习一直在用 go 语言,Java 有点不会写了,给我分第一个小需求的时候我还写成 Feign 调用的了,领导就给我时间学习,抽空重新学了 Spring 系列(丁雪丰老师的 Spring 全家桶),看丁雪丰老师课的时候,我觉得他好厉害,对 Spring 的各项知识点侃侃而谈,还补充了很多小的知识诸如 EventListener,Docker 轻松运行各种服务(Mysql、Redis、Kafka、Consul 等)。当时只觉得老师技术很厉害,后续去搜才知道还是美团研究员,腾讯云TVP。
慢慢的我已经可以做一些简单的业务了,公司发公告说软考可以开始报名了。我问了下同事,了解了公司的职称补贴,觉得报名费也不贵就报名了,详情可以看:谈谈我的软考经历,总之就是连着考过了中、高级。当时高级本来觉得过不了,在办公室查成绩前我给办公室其他人说:这次要是能过,在座的各位一人一份 KFC,最后虽然花了钱还是很开心的。
软考的过程中免不了遇到不会的知识,于是我就各种补充知识点,同时通过考试的良好反馈也让我更有兴趣去学习了。
因为好奇一个 Web 请求从浏览器发出到 SpringBoot 中是如何处理的,于是我去学习了 Tomcat。后来证明这不是一个很好的选择:一上来直接给我整懵了。第一个遇到的问题就是 IO 模型,几种模型给我绕进去了,又扯上 Reactor,费了一段时间才懂。后来看代码结构只觉得写的很好,经常是一个抽象类,然后多种实现,充分的利用多态走不同的逻辑,后来才知道原来这是模板设计模式,就开始补设计模式。
补了一些设计模式后,我意识到能写功能是一回事,能优雅的写好功能是另一回事。所谓的优雅一方面是指代码风格(诸如单行尽量不超过 120 那个IDE分界线,函数功能不要超过 100 行,参数不要超过 5 个),另一方面则是业务规范(诸如异常如何处理(无论如何不能生吞异常,有遗留代码 catch 完直接丢出自定义异常了,日志都没打印),线程池该如何选择,null 和空的处理,数字的运算使用 BigDecimal)。这些主要来自对 Java 业务开发常见错误的学习。
当然这段时间也学习了一些其他的知识模块:Stream、Optional 的使用,Oauth2 的四种授权模式,guava 高性能工具包等。
看到项目中也在经常使用 Redis,我就想着去深入学习一下,找到了张铁蕾老师的博客,张老师当时主要有 Redis 源码解读系列和分布式系列,学了 String、Hash、Set 等结构的实现,才觉得 Redis 这么流行不是没有原因的,高效的数据结构一点也不夸张,对于 cache line 的考虑,渐进式哈希等都很精妙。除此之外,也通过一些资源学习了 cluster 集群,缓存区的异步复制。学完这些,其实软考里关于 Redis 的部分几乎没有问题了。
看了 Redis 这样的设计,我对性能优化感兴趣了起来(想必做开发的都知道被评价代码写的性能又好又易读的成就感吧)。首先去学习了通用的一些性能优化,包括但不限于 计算机硬件(cpu、内存、磁盘)、网络通信(RPC、序列化、Tcp)、数据库(索引、锁、事务)和分布式(一致性哈希、NWR、CAP)。在学习性能优化的期间,也免不了要去补四大件(数据结构、计算机网络、操作系统和计算机组成原理)。
但是在看了性能优化后,摆在我面前的问题是,你都找不到性能问题在哪怎么优化?我又去看了些网络相关的知识和监控工具。网络相关的主要是指 tcpdump 语法,通信协议演进,监控工具诸如 arthas,火焰图。
业务开发中有次遇到性能瓶颈是通过 Nginx 解决的,我就又去学习了 Nginx。大概知道了处理请求的 11 个阶段,常见的参数,编译和升级流程,负载均衡配置等。
做 Java 开发的自然免不了要去啃 JVM 这个山,也拜读了周志明老师的深入剖析Java虚拟机,这本书确实很经典,但类的字节码格式那部分还有编译优化的部分我没有很理解。字节码格式我不认为现在的我需要掌握,编译优化则是诸如标量替换,方法内联,锁优化锁消除更像是告知读者 JVM 做了什么优化,让读者在开发时可以主动关注,而非让读者如何优化 JVM。
近期正在学习高性能网络编程框架 Netty,一方面业务开始涉及一些 IOT 领域,可能需要报文解析,另一方面对 Netty 的大名也早有耳闻,它在内存使用,锁,网络编程部分代码也非常出色,借这个机会深入学习一下。
除上述内容外:我对大名鼎鼎的 “削峰填谷” 一词自然也有所耳闻,也去学习了下 Kafka,但业务中用的主要是 RabbitMQ,所以没有太多的实践机会,只是自己测试了下基本功能,了解了核心概念。ES 也是,项目中确实在用,只是了解了下倒排索引,写过几个接口,未进入深入研究。
学习哪有不走弯路的,有硬去啃发现确实啃不动的(例如操作系统代码),有啃完不实战依旧云里雾里的(例如Kafka),但总体来说收获还是蛮多的。
不足
我这个人是有点懒的,又对很多东西都感兴趣,导致列了很多计划又完不成(electron、神经网络等)。
有些东西只求看完,至于有没有真正理解透彻,那就是另一回事了。
还有的时候属实觉得自己天赋一般,别人很轻松讲出来的我要仔细思考后才能领会,有的还没办法领会。
疑问为什么网上刷到那么多人,校招的时候就能对各个中间件对答如流,在我看了 Redis 和 Netty 的一些源码后,真的觉得能熟练掌握一个中间件是很费时间的事。
致谢
首先感谢下我的领导,看我在需求少的时候吭哧吭哧看笔记,刷网站也不责怪我,还允许我在项目中实践自己的一些方案。
其次感谢下互联网上的诸位老师吧,学习过程中的很多内容都来自于老师的奉献,印象比较深刻的是:丁雪丰老师、陶辉老师、张铁蕾老师和朱晔老师,他们严谨的态度和专业的知识给了我很多帮助。当然也还有很多老师未曾提及,感谢。
最后感谢下我自己。