转自云狄 阿里高级技术专家的一篇文章
阿里妹导读:技术主管,又叫「技术经理」,英文一般是 Tech Leader ,简
称 TL。随着工作经验的不断积累,能力的不断提升,每个人都有机会成为 Team
Leader。然而在机会到来前,我们必须提前做好准备,对 TL 的工作职责有一定了
解。当然,这也会为当下更好地配合 TL 工作打下基础。
阿里巴巴高级技术专家云狄将结合自己多年的经验,从开发规范、开发流程、技
术规划与管理三个角度出发,分享对技术 TL 这一角色的理解与思考。
「技术主管」是开发团队中的某位程序员需要对一起创建系统的整个开发团队负
责时所承担的角色。通常他既要对最终交付的软件系统负责,另外也会像一个程序员
一样去开发实现系统。
一个技术主管的 60% ~ 70% 的时间可能花在了开发任务分解分配、开发实践、
技术架构评审、代码审核和风险识别上,而余下的 30% ~ 40% 的时间则花在为了
保障系统按时交付所需的各种计划、协作、沟通、管理上。和团队管理者不同的是,
技术主管的大部分管理工作都是针对具体研发任务和技术事务的。
接下来基于我在技术 TL 这个角色上,在开发规范、开发流程、技术管理与规划
等方面我的一些心路历程,和大家共勉。
我当时负责的业务是集团收购一家子公司的业务,在整体技术标规范上与集团的
技术标准存在很大的差异。开发规范可以说是我来到这个团队干的第一件事,我当时
面对的问题是 API 接口格式混乱,没有标准的 RPC 服务化,代码没有统一标准的开
发规范,技术框架组件非标准化等一系列问题,作为一名业务上的新人,我第一时间
制定了一套相对标准、全面的技术开发规范,边写代码边梳理开发规范,引领团队走
向统一标准化开发道路。
针对团队研发规范暴露的上述问题,主要制定了如下规范:
我自己非常注重搭建项目结构的起步过程,应用命名规范、模块的划分、目录
(包)的命名,我觉得非常重要,如果做的足够好,别人导入项目后可能只需要 10 分
钟就可以大概了解系统结构。
具体规范包括包命名、类的命名、接口命名、方法命名、变量命名、常量命名。
约定了 IDEA/Eclipse IDE 代码的统一模板,代码风格一定要统一,避免不同开
发人员使用不同模板带来的差异化以及代码 merge 成本。使用 IDEA 的同学可以安
装 Eclipse Code Formatter 插件,和 Eclipse 统一代码模板。
所有二方库、三方库的版本统一定义到 parent pom 里,这样来所有业务应用工
程统一继承 parent pom 里所指定的二方库、三方库的版本,统一框架与工具的版本
(Spring、Apache commons 工具类、日志组件、JSON 处理、数据库连接池等 ),
同时要求生产环境禁用 SNAPSHOT 版本。这样以来升级通用框架与工具的版本,
只需要应用工程升级 parent pom 即可。
基于 Angular Commit Message 规范生成统一的 ChangeLog,这样一来对于
每次发布 release tag 非常清晰,Mac 下都需要安装对应的插件,IDEA 也有对应的
插件,具体可以参考阮一峰老师的《Commit message 和 Change log 编写指南》。
此刻忽然想起 Linus 面对 pull request 里的骚操作所发的飚:
Get rid of it. And I don’t ever want to see that shit again. ——Linus
代码的 commit 的规范对团队非常重要,清晰的 commit 信息生成的 release
tag,对于生产环境的故障回滚业非常关键,能够提供一些有价值的信息。
统一 Rpc 服务接口的返回值 ResultDTO, 具体代码如下:
/**
* Created by honins on 2019/9/26 14:50
* @author honins
*/
public class ResultDTO<T extends Serializable> implements Serializable {
private String errorCode;
private String errorMsg;
private Boolean success;
private T module;
@Override
public String toString() {
return "ResultDTO{" +
"errorCode='" + errorCode + '\'' +
", errorMsg='" + errorMsg + '\'' +
", success=" + success +
", module=" + module +
'}';
}
}
success 代 表 接 口 处 理 响 应 结 果 成 功 还 是 失 败,errorCode、errorMsg 表
示 返 回 错 误 码 和 错 误 消 息,module 表 示 返 回 结 果 集, 把 ResultDTO 定 义 到
common-api 顶层二方库,这样以来各个应用不需要来回转换返回结果。
Http Rest 接口规范约定同 ResultDTO 相差无几,需要额外关注一下加解密规
范和签名规范、版本管理规范。
异常处理不仅仅是狭义上遇到了 Exception 怎么去处理,还有各种业务逻辑遇
到错误的时候我们怎么去处理。service 服务层捕获的异常主要包括 BusinessException( 业务异常 )、RetriableException ( 可重试异常 ) 到 common-api,定义一个公共异常拦截器,对业务异常、重试异常进行统一处理,对于可重试的异常调用的服务接口需要保证其幂等性。
另外其他业务层有些特殊异常不需要拦截器统一处理,内部可以进行自我消化处
理掉,根据场景对应的处理原则主要包括:
早期的时候源码的版本管理基于 svn,后来逐步切换到 git,分支如何管理每一
个公司(在 Gitflow 的基础上)都会略有不同。
针对分支开发规范,指定如下标准:
日志是产品必不可少的一个功能,具备可回溯性、能够抓取问题现场信息是其独
一无二的优点,尤其在生产系统上问题定位等方面具有不可替代的作用。
这里着重强调一下针对异常的日志规范:
表的设计和 Api 的定义类似,属于那种开头没有开好,以后改变需要花 10x 代
价的,我知道,一开始在业务不明确的情况下,设计出良好的一步到位的表结构很困
难,但是至少我们可以做的是有一个好的标准。
对开发过程中所用到的公共组件进行了统一抽象与封装,包括 dao 层框架
mybatis、cache 组件 jetcache、httpclien t 组件、common-tools ( 公共工具 ),
同时抽取出全局唯一 ID、分布式锁、幂等等公共组件,把以上公共组件进行集成到各
个应用,进行统一升级、维护,这样以来方便大家将更多的精力集中到业务开发上。
目前团队的开发模式还是基于传统的瀑布开发模式,整体开发流程涉及需求评
审、测试用例评审、技术架构评审、开发与测试、验收与上线,这里主要基于 TL 的
角度从需求管理、技术架构评审、代码评审、发布计划评审几个关键重点环节进行探
讨,欢迎拍砖。
美国专门从事跟踪 IT 项目成功或失败的权威机构 Standish Group 的 CHAOS
Reports 报导了该公司的一项研究,该公司对多个项目作调查后发现,百分之七十四
的项目是失败的,既这些项目不能按时按预算完成。其中提到最多的导致项目失败的
原因就是变更用户需求。另外从历年的 Standish Group 报告分析看,导致项目
失败的最重要原因与需求有关。Standish Group 的 CHAOS 报告进一步证实了与成
功项目最密切的因素是良好的需求管理,也就是项目的范围管理,特别是管理好项目
的变更。
产品因需求而生,在产品的整个生命周期中,产品经理会收到来自各个方面的需求,但是每一个需求的必要性、重要性和实现成本都需要经过深思熟虑的分析和计划,避免盲目的决定需求或者变更需求,这样很容易导致工作混乱,技术 TL 如果不能正确的对需求进行把控,会导致整个项目偏离正确的轨道。
很多时候需求的变更或增加是因为我们面临太多选择和想要的太多,没有适当的
控制自己的欲望,并以自己的喜好来决定需求,这些因素很容易导致产品没有明确的
方向、团队成员疲于奔命,但是却没有实际的成果。所以技术 TL 一定要能够评估出
重新审视产品和筛选需求的优先级,识别每一个需求的必要性、重要性和实现成本。
通过深思熟虑给团队明确方向并专注,聚焦资源的支配,确保团队的精力都聚焦在产
品的核心需求上。
互联网时代,大家提倡敏捷迭代,总嫌传统方式太重,流程复杂,影响效率,什
么都希望短平快,在扁平化的组织中,经常是需求火速分发到一线研发,然后就靠个
人折腾去了,其实技术架构评审这同样是一个非常重要的环节。架构评审或技术方案
评审的价值在于集众人的力量大家一起来分析看看方案里是否有坑,方案上线后是否
会遇到不可逾越的重大技术问题,提前尽可能把一些事情先考虑到提出质疑其实对项
目的健康发展有很大的好处。
基于架构评审,我们的目标核心是要满足以下几点:
架构评审需要以下几点:
代码质量包括功能性代码质量和非功能性代码质量,功能质量大多通过测试能
够去发现问题,非功能性代码质量用户不能直接体验到这种质量的好坏,代码质量不
好,最直接的“受害者”是开发者或组织自身,因为代码质量好坏直接决定了软件的
可维护性成本的高低。代码质量应该更多的应该从可测性,可读性,可理解性,容变
性等代码可维护性维度去衡量,其中 CodeReview 是保证代码质量非常重要的一个
环节,建立良好的 CodeReview 规范与习惯,对于一个技术团队是一件非常重要核
心的事情,没有 CodeReview 的团队没有未来。
每次项目开发自测完成后,通常会组织该小组开发人员集体进行代码 review,
代码 review 一般 review 代码质量以及规范方面的问题,另外需要关注的是每一行
代码变更是否与本次需求相关,如果存在搭车发布或者代码重构优化,需要自行保证
测试通过,否则不予发布。
CodeReview 我会重点关注如下事情:
涉及到 10 人日以上的项目,必须有明确的发布计划,并组织项目成员统一参加
项目发布计划 review,发布计划主要包含如下几点:
我在带技术团队的这些年,对团队一直有一个要求,每周都要做系统健康度巡
检,未雨绸缪、晴天修屋顶,避免在极端场景下某些隐藏的 bug 转变成了故障。
为什么要把系统健康度巡检放到技术管理里,我觉得这是一个非常重要的环节。
像传统的航空、电力、汽车行业都要有一定的巡检机制,保障设备系统正常运转,同
样软件系统也同样需要巡检机制保障业务健康发展。
随着业务的不断发展,业务量和数据量不断的上涨,系统架构的腐蚀是避免不了
的,为了保障系统的健康度,需要不断的考虑对系统架构、性能进行优化。
系统的监控与报警能够一定程度发现系统存在的问题,系统存在的一些隐患需要
通过对系统的巡检去发现,如果优化不及时在极端情况会导致故障,巡检粒度建议每
周巡检一次自己所负责的业务系统。
系统巡检重点要关注如下几点:
这里的技术规划包括如下几点:
大家不知道有没有类似的经历,某个时间段突然一些线上故障频发,各种技术
债、业务债被业务方穷追猛打要求还债,如果出现这种现象很大程度这个 TL 已经失
位了,这个团队失控了。也曾经有人跟我吐槽他的 TL 把活都分给他们,而 TL 自己
什么都不干!这个技术 TL 真的什么都不干?曾经有一段时间我也在思考技术 TL 的
核心职责到底是什么?技术 TL 应该具备哪些素质?
如果他不是一个业务架构师,不是一个能给团队指明更好方向的人,他最终会
沦为一个需求翻译器,产品经理说怎么做就怎么做。他更多的只是负责保证产品的质
量、开发的速度,最终被肢解成一个很琐碎的人。一旦团队上了一定的规模,团队就
会从单纯的需求实现走向团队运营,而运营是需要方向的,业务架构就是一个基于运
营和数据的一种综合的能力。
关于技术层面,技术 TL 需要具备如下素养:
技术 TL 除了管人和管事之外,其他还有很多事情要做包括建立团队研发文化、
团队人才培养与建设、跨部门协调与沟通等,这样以要求技术 TL 也同时也需要具备
良好的沟通和管理能力,以上观点仅是个人的一些思考和观点,仅供参考。