一、写在最前面
一年又一年,看着一批又一批的意气风发的同学来到公司,不禁回想起自己刚毕业踏入职场的时光。
是的,整理下去年给入职新人的寄语,也是对自己曾经应届生身份成长路径的一点小结:
1> 对可能些许迷茫的新人提供职场导入经验,虽然是按照 Java 工程师来做要求,但职业早期能力可塑性很强是可以不局限在某个领域的
2> 梳理自己的成长经历,谈不上优秀起码能够稳健发展,技术是门手艺需要长期积累不断精进
3> 帮助需要的新人重拾信心,这不,2023 年史上最强毕业潮的年轻人就要来了
二、第一周
1.重视基础知识,形成体系
以 Java 和 Spring 为例说明。
Java 核心要扎实( JVM 和多线程可以暂时不用深入了解)。除了提到了阿里巴巴开发手册,再补充一个配套的也是同一个团队出品的《码出高效》,几乎涵盖了日常开发中常用 Java 基础知识,使用频率比较高的有 OOP、Class、数据结构与集合等几章。
里面也包含编码规范设计与解读——对于大团队来说很重要,不一定按照他的规范来做,但是要了解他这样设计的目的在哪里。如果觉得看书无聊可以在阿里云做一个编码规约的认证考试,验证下自己是不是真的学到了精髓。
同样,基础知识不能少了 Spring 家族成员,尤其是核心成员 Spring 的学习,熟悉如何借助 IOC、AOP 颠覆了 Java 开发模式与状态,并建立起 Spring 生态。
学习内容提到的 Spring 实战刚出了第五版,建议通读,日常开发的基础设施很多都在里面了。
2.在书中学,在事上练
对于一块知识的理解形成基本体系后,就要拿出来遛一遛检验与矫正认知,就像 TDD(测试驱动开发)一样,不断向目标前进不断修正中间的过程,小步快跑,形成一个闭环。这中间肯定会踩坑,记录下来,定期回顾总结,达成正向增长。
同事的 commit 就可以拿出具体例子,比如这段代码设计的如何有坏味道了怎么办,这个场景使用了这些设计模式是否妥当如何裁决,扩展性和可读性怎样。拿这些例子一起讨论交流,当然前提是经过思考与归纳的,也是对自己解决问题与表达能力的锻炼。
补充一点,对于没接触过的新技术先把握方向,再深入细节。对于新纳入的知识点,可以整理成脑图文稿之类的(最好自己的语言)发出来我们一起讨论纠正偏差,对疑难点也更有针对性。
3.不要忽视软技能
技术人的职业生涯上限不止在技术能力上,当今已不是软件行业早期发展靠单枪匹马就能横扫千军的时代了。
《人件》会告诉我们交付的产物来自计算机,可是我们的工作终究还是面向人的。
软件工程是庞杂繁复的,从软件设计、编码实现、交付运营外,还会涉及团队协作、产品商业化、研发效能、项目管理等等。
三、第二周
继上周回复内容,对新人本周周报又有了些新的想法,不仅是给新人指点方向,也是在梳理自己的成长路径。
那些踩过的坑、爱犯的错、迷茫的点不加整理深化是不会内化的,经历了积累了自然也就成长了,站在前人的肩膀上是幸运的事。
下面截取本周回复内容,撇开具体的问题有些还是值得新手同学共享的。
1.《码出高效》
这本书本身对Java基础做了比较细致的梳理,也有《编码规约》做支撑(可以理解为简化版),将里面一条条的内容平铺列出来一是大多重复了再一个不好回顾。
知识体系建议采用脑图(树形组织)的方式,尤其是搭建Java知识框架的时候,简要的内容可以考虑 markdown 记录,迁移性表达性都很好。
记录内容,要有针对性也要有自己的思考。比如说,某条规约是这么设计的,背后的原理是什么处于什么考虑,是否真的就合适,带着问题去看会更有体会。
举几个例子:
1> NPE 是 Java 领域很容易出现的问题(也会是你进入这个行业必将面对的问题),有哪些场景会触发,规避措施有哪些
2> Java 世界里任意两个对象比较都是怎么做的,有哪些相同哪些不同
3> 类加载器是如何工作的,怎么去自定义一个
4> 创建线程有几种方式,线程同步呢
5> 目前支持 LTS 的 JDK 版本有哪几个,都有什么特性等等
把这样的问题整理起来如果有自己的经历也结合进来这本书也就读透了,至于那个认证也是自然而然的事情了。
这是我要补充的第一点,书可以参考也要有自己的思考,重新组织书中的内容内化为自己的知识结构。
2.《Spring实战》
核心那几个篇章是全书的核心也是 Spring 的核心,看了骑士与恶龙、吟游诗人的故事会发现基本原理其实很简单,却隐藏着厚重的设计哲学。
同样的,不断带着问题来看,就比如J2EE开发中有很多样板僵化的代码,Spring是怎么处理的;同时,看到 JDBCTemplate,RestTemplate,AmqpTemplate 这些后缀相同的接口是不也会自然联想一下他们之间有什么关系,也就了解了一下模板设计模式的应用,顺便也就解决了你所说的对设计模式陌生的问题。
学习这本书侧重 Java 实现,xml 简单了解即可,后面可以比对下 SpringBoot 是如何进一步简化开发做到开箱即用的。
天下没有免费的午餐,虽然可见的一段时间都会是基于 SpringBoot 来做开发,但是了解Spring作为基础提供了哪些核心能力怎样支撑起庞大的家族产业一定是有必要的。
对于不了解底层原理,我的理解是,对于新技术如果没有把握就广度优先来学习,知道个大致原理就像本书内容深度刚好,再想了解它是如何启动的、怎么加载 Bean、嵌入式容器如何牵引进来等等那都是基于对全局心中有数的前提。
不如先定个入职前的小目标,调试下 SpringBoot 启动过程,看下经过了哪些类,他们之间什么关系。
3.触类旁通
技术书籍可以作为参考,是否学到要看自己的神经元之间是不是建立了强连接。
简言之,Talk is cheap, show me the code。
初步了解了 Spring 编程框架,结合数据库、消息队列,看看是不是可以搭建一个提供Rest接口的小应用,把各类技术都串联起来,或是把以前做过的某个项目或者产品用 SpringBoot 翻译过来。
再者,从 Github 或 Gitee 上 down 一个 SpringBoot 项目跑起来看看,能不能调试的动,怎么把其他技术粘合进来的。
从书中学,在事上练,反复迭代,定有所成。
四、第三周
在上周回复的第三点触类旁通后,国内作者在 github 开源的【微人事】项目并部署到了自己的云服务上,执行力很好,下面我再补充几点。
1.做成产品的话
【微人事】这个开源项目如果做成产品的话,你会用怎样的一段话来介绍它,你会如何让这个产品落地;
产品从头脑中到落地有很长的一段路要走,作为研发同学,我的建议是想明白代码为谁而写,代码的价值在哪里,多从产品维度来思考工作价值与产出,脚踏实地也能仰望星空;
同学也不必纠结产品流水线中的细枝末节,就自己已有认知谈谈对产品的看法,就拿这个项目来讲,如果做成产品,产品带给用户的价值,是否可以行得通,功能不在多在于找准定位;
比如,开源项目本身具备的功能在你看来是否都是必须的,换成你还会做出哪些设计;关键流程有哪些,是否可以梳理清楚并画出来;进入公司后,可以详细了解下人事系统核心功能与关键流程,更新业务能力,加深业务理解。
2.如何优化
【微人事】的架构是否完善,你会从哪些方面做出优化;
1> 运维角度看,调试起来是否需要一堆依赖,能否局部验证部分功能;部署上下线是否有自动化流程,可以快捷操作;
2> 如果系统升级,有平滑升级方案嘛,毕竟是公司基础IT系统,几万人的企业 7*24 小时都会有人在使用的,设置个底线不能让服务不可用超过分钟级;
3> 再从可用性角度看,大部分数据都是落盘的,如果数据库出现故障怎么办,是否可恢复,数据做了怎样的备份;如果做数据迁移呢;
4> 又比如,扩展性角度看,公司内部 OA 信息化建设,一定会依赖于基础的人事管理,是要做开放能力的,现有架构是否支持快速提供人力资源服务。
由此可见,做好一款产品「冰山之上」与「冰山之下」都有很多事情要做,不论这个项目本身支持到什么程度,这些问题都是需要去思考的,尝试解决其中几项。
3.基础知识不断夯实
不论是完善知识体系,还是项目产品中踩的坑,都把它记录下来,定期的回顾整理。
由人完成的事情不可避免会犯错,成长的速度很大程度上取决于纠错的能力并预防错误,避免同样的错误再犯,同时将新问题连接并迁移到已有的知识体系上,这会让你很快适应工作节奏,这也是我不断强调强化基础能力的初衷。