Java 开发工作者每天在做什么?
淘系技术2021-12-07

有很多新入行的网友提问:Java 开发工作者每天在做什么?我刚从学校毕业/刚做完 Java 培训,很想知道在真实的工作环境中,我们的工作场景和任务,有没有前辈能指点一下呢?

作为 Java 界赫赫有名的阿里淘系,今天我们邀请了 3 名淘系技术的工程师,结合他们真实的工作感受和项目经验,给大家分享一些 Java 开发者的日常,希望能够对你有帮助。

松香

松香,基础服务团队后端开发工程师,工作3年,在百万级消息扩散并发处理、发布-订阅模型、直播消息推送等场景有较多的经验。

作为一名阿里巴巴普通java开发工作者,从工作模块和职责的角度,给大家分享一下我的具体工作范围,从个人经验角度也给出一点对新人的建议。

在阿里巴巴,像我这样的一个普通java开发工作者的工作时间普遍是早上9点到晚上8点。

具体工作内容可以分为开发,运维,答疑,每一项工作的时间占比对于不同岗位职责的同学比例也有所区别,在一个成熟的中间件或者是运维团队可能答疑运维的时间和工作量会多很多,而在一个初创的刚起步的业务团队可能开发工作会占绝大部分比例。

我的具体工作内容如下——

开发工作

广义的开发工作的内容非常复杂,涵盖的范围也非常广,从最基础的开会讨论环节(例如需求评审或者是设计评审)到狭义的开发环节即代码Coding实现到测试和上线都是属于开发工作的一部分,详细来说开发工作包含了如下内容:

需求评审

在项目中,需求分析是最开始的工作,同时也是最重要的工作。在这一步骤中,开发人员需要和产品经理,测试等人员就有关于项目目标,需求理解,系统原型和术语定义等达成一致。

系统设计

在理解项目的目标之后就可以开始作系统设计,其中包含了技术选型(项目使用什么语言,使用什么框架,数据持久化选用sql/nosql,数据库又该选用什么),模块拆分(大到网关/入口/功能/基础设施的架构分层设计,小到具体功能间的耦合拆分设计),细节设计(通过诸如时序图,类图等描述某个功能或者设计的关系与流程,定义交互协议的数据格式),设计评审(通过团队内外评审的方式查缺补漏看看设计是否有错误或者是不恰当的地方)。

这一步在整体开发工作中有着至关重要的作用,一个好的系统设计可以非常有效地减少编写代码时的思考量和工作量。

代码实现

在完成系统或者是方案设计后,就可以按照预先定义的流程进行代码编写和实现,在完成编写后需要邀请1位以上的同学进行CodeReview评审代码的质量与逻辑的完备性。

测试回归

对于开发人员来说,测试主要是代码层面的和功能实现层面的测试,前者主要是编写unit test单元测试以方法或者类的维度验证代码的正确性,后者是功能编写完毕后进行全链路的测试从入口开始编造流量看整体效果是否和预期一致,通常这步也需要专业的测试人员介入,在出现异常问题时,需要进行debug和问题修复。

功能上线

任何一个功能或者是系统上线都是比较复杂的,引入流量前需要配置关键业务节点上的监控,发布过程中最开始先beta灰度并进行功能验证,确认功能正常,指标监控平稳后可以开始作分批发布(如果是大规模的系统集群),在发布过程中与完成后需要实时紧盯监控指标以防止出现线上问题。

效果验证

项目上线后就可以通过服务端的埋点日志数据进行筛选统计,查看上线后整体功能是否满足预期的目标。

文档记录

写文档是一个开发人员工作的本职工作,上述的每一个开发步骤都应该在项目文档或者是系统文档中予以记录。

运维工作

运维工作包括了日常运维包括系统容器的状态的管理(重启/置换/扩容/缩容),大促运维(预算申报,预案管理与演练,重保节点配置等)。

举我本人为例,我负责的是淘宝直播互动消息扩散架构,在每次大促活动或者是头部主播(如薇娅或者是李佳琪等)有搞大活动,都会需要作直播间相关信息的提前配置与准备,确认容器状态都正常,这些都是系统运维相关的工作。

答疑工作

每个人负责的系统应该都只是一个系统链路的一部分,这种时候对于你的业务方就需要提供答疑工作: 帮助完成系统接入,帮助排查问题,解答功能细节等等,现在在阿里巴巴内部这部分工作逐渐转为由自动化答疑和排查工具来完成,但是还是免不了会出现疑难杂症需要开发人员介入来解决。

工作外的充电

阿里巴巴内部有一个ATA的技术分享论坛,在其中能看到各种系统设计介绍,疑难问题的排查亦或者是思维方法论等等,我们在闲暇时间都会在论坛上学习他人的分享,采坑记录或者是成功经验。

我们团队内部也经常会有技术分享和文章书籍介绍,例如《领域驱动设计》《重构》《Designing Data-Intensive Application》等等,这些必要的充电对于个人能力的提升也是非常巨大的。

对了,最后,作为先入行的前辈,给一点自己的经验和建议——
对新人的建议

一般情况下,团队内来了新人后会有一段时间来适应工作环境和内容,团队也会给新人配备一个mentor的角色,在阿里巴巴则称之为”师兄“来负责入职后的适应阶段。

新人做的第一件事情就是熟悉环境,包括同事间的相处风格,公司技术栈,中间件等等。在适应完成后一般主管会给你分配一些简单的任务比如一个模块功能的实现,新人就需要通过这样一个任务去落地,包括功能效果的实现,团队和上下游业务的熟悉了解等等。

最后给新人的一些建议就是要在工作中要多沟通交流,刚入职的时候对整体的业务和技术栈甚至包括自己担任的职责和负责的范围等等都会有疑惑,这是非常正常的一件事情。这种时候多和主管或者是mentor作沟通交流不断明确你的工作的目标和当前的进度情况,这样新人落地也会更加顺利一点。同时有时候新人同样在技术实现上也会遇到一些困难,这种时候除了需要靠自己多思考学习外同样需要多和同事讨论,向资深员工学习请教也会让你工作更加顺利。

萨摩

萨摩,商家生态供给-智能设计应用后端开发工程师,在阿里巴巴工作5年,负责淘系商家端智能设计及内容化,专注于图片、视频等多媒体内容相关技术和业务。

作为一名在阿里巴巴5年的工作者,从工作工具角度和技巧角度,给大家分享一下我的心得。

生产力有两项,一项是人,一项是工具。工具是由人创造的。——毛泽东

“资深”Java工程师的一天,早上来到公司,保温杯里接满热水泡上枸杞,打开IDE,然后心中默念加油打工人,美好一天开始了。

选择一个高效的IDE对程序员来说极其重要,Java IDE目前IntelliJ IDEA已经稳坐头把交椅,个人也比较推荐使用。并且经过多年的沉淀,IDEA的插件生态已经变得非常强大,篇幅所限推荐两个提高效率的插件:

  1. Maven Helper:Java开发最令人头疼的事情之一就是包冲突,此插件可以交互式的查看maven依赖,冲突原因一目了然,且可快速排除。另外,如果想要排除掉某个依赖包,推荐使用上传version为999-not-exist空包的方式,因为maven机制所限,此方法才可一劳永逸。
  2. Key promoter:使用快捷键是提高开发效率的重要方式之一,还在用鼠标点点点的同学请自觉回去背诵快捷键列表。此插件会在用鼠标进行操作时,用醒目且丑陋的对话框提示你操作的快捷键是什么,逼着你下次不得不用快捷键,非常赞。

而且最近IDEA的插件生态逐渐VS化,现在在IDEA里不仅可以上网、看书、刷题、炒股,甚至还可以写代码!

最后需要注意的是社区版可免费试用,但Ultimate版需要付费,而且在商业公司使用付费的个人版,理论上也是不可以的哦。

熟练的在IDE中编写Java代码只是一个开始,如果想成为一名合格的开发工程师,学会如何让编译器能懂你的代码之后,下一步就是学习如何让人类看懂你写的代码。因为写代码做项目是一项团队活动,就算是一个人完成的项目,也需要有backup同学,或者也要防止离职后被接盘的同学诅咒吧[再次狗头]

大家都知道Java的规范是使用英文驼峰命名的方式。千万不要小看命名这件事,对类、方法或变量的命名体现了对其的定义和理解,甚至扩展性和对业务的理解也可以从命名中体现。对自己有要求的话,单复数和时态也不要搞错哦。所以一个好用的英语词典也是必不可少的,Mac原生的词典添加一本牛津就不错啦。其他的就看个人喜好,主要是词库解释得清楚一点即可。

无论是英文命名还是设计模式,本质上都是要保证团队的同学在同样的语境下,降低沟通的成本。架构图也是一样的道理。

如果遇到复杂的需求,技术方案文档也是必不可少的。阿里内部目前基本都是使用语雀在线编写文档,方便团队内组织和整理,对外分享也很方便。如果在本地,可以使用Typora等markdown格式的文档编写软件。

画架构图的话,Windows毫无疑问最好用的是Visio,macOS可使用OmniGraffle(付费),Keynote也能画出清晰且好看的架构图,不过Keynote毕竟不是专门画图的,操作可能稍微复杂一些。有些在线作图工具也很好用,比如ProcessOn,非常易上手,而且个人也比较喜欢其配色风格。但其制作内容是保存在云端的,商业使用要注意公司相关规定。同样是在线作图,draw.io则可自行选择保存到本地或Github等,避免了云端存储的问题。draw.io尤其画时序图等UML图时比较方便,而且Windows和macOS都有桌面版可以使用。

所有这些工具都是为了提高效率,选择一款适合自己的即可,切勿本末倒置。在淘系大部分是电商业务团队,所以学会如果通过技术带来业务价值或商业价值,才会给所用的技术和自己带来更大的发挥空间。最后,让我们打开音乐播放器,开始高效的工作吧,加油Java人!

子遥

子遥,曾在硅谷斯坦福学习工作创业,19年回国,在阿里巴巴工作两年半,擅长图像视频处理、智能设计生产技术领域。

从客户需求角度与事件紧急性角度出发,思考商家、消费者的潜在需求,同时关注其他技术领域,保持学习热情。

在阿里我们常说客户第一,作为淘系电商平台的Java开发者,我们的客户是广大商家和消费者,虽然我们未必有机会像客服或者一线运营小二那样面对面地接触商家或消费者,但是我们开发的平台软件系统直接会影响到商家与消费者的体验。因此日常首要关注的就是各类服务端系统的稳定性,每天都需要定时关注相关的监控、报警以及业务数据报表,如有异常,必须放下手头的代码、暂缓会议,第一时间处理解决任何可能影响商家或者消费者的线上问题。
应急事件的处理是每个淘系Java开发者必须首先学习的能力,当然为了尽可能避免线上问题的出现,更多的功夫应该花在平时对于代码架构设计上。我们在日常会接触到来自合作方产品、运营团队的各种开发需求,我们需要对每一个MRD、PRD以及视觉稿都进行仔细的评审,并做好相应技术方案的设计与评审,在不确定的情况下,及时和团队内更有经验的同学请教或者和主管报备,在方案确定下来之后,就是同学们很熟悉的代码开发环节。代码开发环节是每个Java开发者都需要不断学习与时俱进的,除了同学们过去在学校或者其他公司学习到的代码开发技巧,淘系电商平台有其特殊性,尤其在高并发高可用的系统设计上,我们必须要充分考虑各类热点、限流瓶颈,准备好容灾、降级方案,最终目标要保证交付给到商家、消费者的体验质量。
在淘系业务技术团队,创造业务增量价值是我们代码开发永恒的目标。所以在代码开发之外,我们也需要日常去思考现在商家、消费者有什么样的潜在需求?现在又有哪些新的技术能够去满足客户需求、创造价值增量?特别是当下AI、AR等新兴技术的发展,也要求我们Java开发同学不仅仅关注在Java开发领域,也需要了解其他技术领域。在淘系内部有大量技术分享,只要有时间感兴趣,希望同学们能积极参加,也许就会有惊喜,会诞生新的工作方法和合作机会。

结语

大多数情况下,Java工作者的工作现状与其他人没有太大区别。只是在不同阶段,几项工作的时间配比不同。

你觉得呢?