算法工程师的思考、写代码的时间是怎么分配的?前端工程师每天都在干什么呢?后端工程师衡量工作的重要指标是什么,给谁提供服务?
我们邀请了算法、前端、后端三位工程师,来看看他们的工作日常。
01推荐算法工程师的日常
阅谦
大家好,我是来自大淘宝技术的一名推荐算法工程师。下面以我电脑记录的App使用时间为线索简单分享一个算法工程师的日常~
1. Chrome
Chrome是占用时间最多的App,日常工作中有绝大部分的任务是通过浏览器完成的,主要包含以下4个方面:
查看业务数据报表
每天到公司,我的第一件事情就是查看最新业务数据报表,这包括大盘的数据、AB的数据和各个细分维度的数据。了解最新数据情况可以指导我们下一步工作的展开。算法的优化是一个不断迭代试错的过程,及时获得反馈并进行调整是非常重要的一环。
进行数据分析和建模
在机器学习领域,garbage in garbage out 意味着如果送给算法的数据质量不高,那么得到的结果也不会太好。曾经我就有过因为在准备数据过程中不小心出现样本穿越的问题,导致后续整个的模型训练得到的结果都是不可信的,后来又花了很多时间来排查问题和重新搭建数据链路。除了算法使用的数据外,数据分析的逻辑不合理也会引导我们采取错误的行动,这样的行动很可能对业务是无效甚至是负向优化。重视数据环节可以起到事半功倍的效果。公司一般通过DataWorks网页端进行数据处理代码的编写和定时调度节点的发布,这占用了日常工作的大部分时间。
业务方案和算法模型的部署和发布
推荐算法工程师是需要面对线上流量的,而所有的业务逻辑和算法模型从离线到在线都需要经过一个发布的流程,通常是先灰度,再小流量,然后逐步扩量最后全量。公司的中台团队开发了诸如TPP,BE,RTP等平台,算法工程师可以聚焦于算法和业务本身,工程性的工作由平台完成。在这些平台的网页端,我们可以快速完成业务方案和算法模型的发布工作。
学习充电
公司内部有一个技术分享论坛,可以说是算法工程师的宝藏之地。在这里有各个业务线和不同岗位的同学分享自己的实践经验以及对前沿技术的解读,每次逛都有很大的收获。另外,阅读一些领域相关的paper可以保持对技术的敏感性,如果发现不错的思路可以结合自己的业务场景进行尝试。最后,我还会在github等技术社区看看有没有什么实用或者有趣的项目,作为技术储备或直接进行复用。我自己在业余时间也维护了一些推荐相关的开源项目,感兴趣的朋友欢迎加入一起学习交流~https://github.com/shenweichen/DeepCTRhttps://github.com/shenweichen/DeepMatch
2. DingTalk
DingTalk就是大家熟知的钉钉,在公司里大家都是协同办公,每一个业务模块的迭代都涉及到诸如产品,运营,开发,算法等不同岗位的同学。高效的沟通交流对推动工作前进来说非常重要的。除了协同,日常工作中使用公司内部工具可能会遇到一些问题,这时候也需要和相关答疑同学交流解决。我有时候也会看别人交流,在一些群看别人聊天也有收获。
3. PyCharm
PyCharm是我常用的Python IDE,主要用来编写各种tf的模型代码。也许很多未工作的同学觉得算法工程师的日常就是写模型,调模型,就我自己而言,写模型代码的时间相对并不多(这也得益于公司的强大中台和内部开源代码库)。
4. PowerPoint
团队内部有分享机制,我们分为业务分享和算法分享两大方向,截图的这周正好是我准备PPT的那周,所以花了一些时间写PPT。除了内部分享,在季度末,绩效季末,晋升季等时间点,也会投入一些精力去做工作总汇报的PPT。
5. Intellij IDEA
Intellij IDEA是一个java IDE。除了算法模型和数据处理外,整个推荐系统的链路从用户请求到来到诸如画像获取,召回,排序,重排等模块的串联也是需要算法工程师来实现的。公司里一般通过编写java代码实现,所以给即将入行推荐算法的同学们的建议是除了Python外再学一下java或者cpp吧!
02 前端开发工程师的日常
时川
加入阿里第 6 年,目前负责集团内用户量最大的页面搭建平台:斑马。用户在淘宝浏览各种商品活动页面的时候,中间有很多页面就是通过这个平台发布上线的。我的日常的主要工作就是围绕淘宝的搭建服务能力建设展开。
严格意义上来说,我是一个“围绕前端工作”的工程师,或许叫做“面向运营交付前端页面解决方案工程师”更合理一些,日常工作总的来说可以分为两部分:
搭建平台服务支持
产品建设和技术探索
1. 搭建平台服务支持
大白话讲就是答疑,解决使用平台产品的技术研发同学和业务运营同学遇到的问题,一般会基于自己负责的系统链路,或面向业务运营,或面向技术开发。由于我负责的平台比较特殊,这两部分都有涉及。
面向研发的服务支持
一般从业务的技术选型阶段就会开始介入,提供基于搭建体系的专业技术方案支持,包括基础的前端框架方案、页面的渲染服务(SSR、CDN等)、面向个性化场景的数据网关服务能力等,涉及的面会比较多,因此必须了解整个技术生态和服务体系。在业务技术侧确认好相关的技术方案后,就进入了常规的前后端研发流程,这里一般只需要协助解答一些搭建域特有的技术规范问题即可,直至业务正式发布上线。后续研发侧基本上就进入了一个业务自运营的阶段,在平台能力和业务需求场景没有太大变化的情况下,我们很少需要长时间的持续投入的场景。
运营服务支持
对于运营的服务支持,除去一些基础的功能指引,更多的是业务实际需求场景的问题。这部分对于技术研发来说还是比较有挑战的,因为技术同学的逻辑思维惯性比较大,非常容易把业务的需求过度技术化,面向运营的服务,需要切换到一个完全不同的视角,去消化理解用户的实际诉求,从产品流程层面给到对应的支持。同时收集相关的信息,最终再反馈到后续的产品建设中。
2. 产品建设和技术探索
作为一个平台的产品、技术负责人,从产品的整体发展规划,到面向内部运营的搭建平台研发、面向终端用户的基础渲染方案架构都需要参与,真·全(省)栈(钱)工程师无疑了。
产品规划及演进。基于用户业务场景和需求,不断演进搭建服务的能力,让平台上的业务能够更快的交付上线,同时作为淘宝搭建服务的重要组成部分,斑马也是搭建基础服务和上层业务的桥梁,这期间会持续把业务能力做剥离和抽象,推动底层的基础搭建服务能力进行迭代。大白话翻译就是:我兼职 PD~。当然整个项目组的同学都会参与到这项工作中来,因为都是前端线的技术研发,我们建立了一套基础的产品方案评审流程,从基础的技术方案实现,到产品交互流程优化,按照双周的节奏进行评审、研发、发布。
运营端平台的架构和研发。这部分工作占据了我大部分时间,也比较繁杂,因为要面向众多业务,需要确保平台的架构足够轻巧,不被业务侵入的同时具备足够的灵活性和扩展性。总结几个关键词:Node.js / Midway / Fusion / 飞冰,基本上涵盖整个平台的技术栈,这些多是一些软件工程的基础实践,这里不再赘述。
消费者端渲染方案探索。这是一个技术侧比较纯粹但是关联链路比较多的部分。核心目标是让终端用户更快地访问到页面,目前主要是和大促会场的同学共建,将双十一等大促活动中通过考验的极致方案通用化,覆盖到更多的业务,关键词:Rax / Weex (没错) / FaaS / EdgeRoutine / CDN
3. 除了工作还有什么?
肝原神。每天中饭时间我都会先撸半小时打个日常再去食堂,错峰吃饭还能打个折,精致省钱大佬无疑了(话说最近好不容易攒了 8000 原石想抽个凌华结果歪成了琴团长,还有救么=。=);
奶娃。工作日会争取在 6 点左右下班回家,常规陪玩陪练(我不会告诉你我家学的二胡,每次开练都怕楼上楼下的邻居打进来),双休日条件允许的话一般会周边一日游(家住杭州但是基本不去西湖那种),比较喜欢去野外探索,不仅环境好,还人少,小朋友们也能更多接触大自然;
折腾鱼缸。几年前迷上草缸,后来又添置一个原生缸,虽然缸都不大,偶尔坐在草缸前面看水草冒泡泡其实挺解压的,家里小朋友也喜欢缸里的小鱼小虾,放个照片吧;
03 后端工程师的日常
松香
作为一名阿里巴巴普通java开发工作者,从工作模块和职责的角度,给大家分享一下我的具体工作范围,并从个人经验角度给新人一些建议。在阿里巴巴,像我这样的一个普通java开发工作者的工作时间普遍是早上9点到晚上8点。具体工作内容可以分为开发,运维,答疑,每一项工作的时间占比对于不同岗位职责的同学比例也有所区别。在一个成熟的中间件或运维团队,答疑运维的时间和工作量更多;而在一个初创的刚起步的团队,开发的工作量会更多。我的具体工作内容如下——
1. 开发工作
广义的开发工作的内容非常复杂,涵盖的范围也非常广,从最基础的开会讨论环节(例如需求评审或设计评审)到狭义的开发环节即代码Coding实现到测试和上线都是属于开发工作的一部分,详细来说开发工作包含了如下内容:
2. 需求评审
在项目中,需求分析是最开始的工作,同时也是最重要的工作。在这一步骤中,开发人员需要和产品经理,测试等人员就项目目标、需求理解、系统原型、术语定义等达成一致。
3. 系统设计
在理解项目的目标之后就可以开始做系统设计,其中包含了技术选型(项目使用什么语言,使用什么框架,数据持久化选用sql/nosql,数据库又该选用什么),模块拆分(大到网关/入口/功能/基础设施的架构分层设计,小到具体功能间的耦合拆分设计),细节设计(通过诸如时序图,类图等描述某个功能或者设计的关系与流程,定义交互协议的数据格式),设计评审(通过团队内外评审的方式查缺补漏看看设计是否有错误或者是不恰当的地方)。这一步在整体开发工作中有着至关重要的作用,一个好的系统设计可以非常有效地减少编写代码时的思考和工作量。
4. 代码实现
在完成系统或者是方案设计后,就可以按照预先定义的流程进行代码编写和实现,在完成编写后需要邀请1位以上同学进行CodeReview评审代码的质量与逻辑的完备性。
5. 测试回归
对于开发人员来说,测试主要是代码层面和功能实现层面的测试,前者主要是编写unit test单元测试以方法或者类的维度验证代码的正确性,后者是功能编写完毕后进行全链路的测试从入口开始编造流量看整体效果是否和预期一致,通常这步也需要专业的测试人员介入,在出现异常问题时,需要进行debug和问题修复。
6. 功能上线
任何一个功能或系统上线都是复杂的,引入流量前需要配置关键业务节点上的监控,发布过程中最开始先beta灰度并进行功能验证,确认功能正常,指标监控平稳后可以开始作分批发布(如果是大规模的系统集群),在发布过程中与完成后需要实时紧盯监控指标以防止出现线上问题。
7. 效果验证
项目上线后就可以通过服务端的埋点日志数据进行筛选统计,查看上线后整体功能是否满足预期的目标。
8. 文档记录
写文档是一个开发人员工作的本职工作,上述的每一个开发步骤都应该在项目文档或者是系统文档中予以记录。
9. 运维工作
运维工作包括日常运维,包括系统容器的状态的管理(重启/置换/扩容/缩容),大促运维(预算申报,预案管理与演练,重保节点配置等)以我本人为例,我负责的是淘宝直播互动消息扩散架构,在每次大促活动或者是头部主播搞大活动,都需要作直播间相关信息的提前配置与准备,确认容器状态都正常,这些都是系统运维相关的工作。
10. 答疑工作
每个人负责的系统应该都只是一个系统链路的一部分,这种时候对于你的业务方就需要提供答疑工作: 帮助完成系统接入,帮助排查问题,解答功能细节等等,现在在阿里巴巴内部这部分工作逐渐转为由自动化答疑和排查工具来完成,但免不了出现疑难杂症需要开发人员介入解决。
11. 工作外的充电
阿里巴巴内部有一个技术分享论坛,在其中能看到各种系统设计介绍,疑难问题的排查亦或者是思维方法论等等,我们在闲暇时间都会在论坛上学习他人的分享,踩坑记录或者是成功经验。我们团队内部也经常会有技术分享和文章书籍介绍,例如《领域驱动设计》《重构》《Designing Data-Intensive Application》等等,这些必要的充电对于个人能力的提升也是非常巨大的。
12. 对新人的建议
一般情况下,团队内来了新人后会有一段时间来适应工作环境和内容,团队也会给新人配备一个mentor的角色(阿里巴巴则称之为”师兄“)来负责入职后的适应阶段。新人做的第一件事情就是熟悉环境,包括同事间的相处风格、公司技术栈、中间件等等。在适应完成后一般主管会给你分配一些简单的任务比如一个模块功能的实现,新人就需要通过这样一个任务去落地,包括功能效果的实现,团队和上下游业务的熟悉了解等等。最后给新人的一些建议就是要在工作中要多沟通交流,刚入职的时候对整体的业务和技术栈甚至包括自己担任的职责和负责的范围等等都会有疑惑,这是非常正常的一件事情。这种时候多和主管或者是mentor作沟通交流不断明确你的工作的目标和当前的进度情况,这样新人落地也会更加顺利一点。有时候新人在技术实现上会遇到困难,这种时候除了需要靠自己多思考学习外同样需要多和同事讨论,向资深员工学习请教也会让你工作更加顺利。
工程师的工作日常,没有那么多的轰轰烈烈,大多时候是日拱一卒,反复且平淡。因为拥有目标,拥有方向,所以只需保持认真与专注,然后心无旁骛,一往无前。