不知不觉,从去年9月份入职到现在的公司,已经过去一年了。这一年付出了很多,也收获了很多,在此想把这一年的经历做一下简单的总结。
团队的问题
在我到公司之前,团队有两个人:一个是混日子的老员工gy,一个是未毕业的实习生。团队管理一塌糊涂,几乎没有任何管理可言。下面我列举了一些典型的问题(排序不分先后):
- 1.
Git分支缺乏基本的管理规范。
随意提交,随意合并,大多数修改都是直接操作master分支,代码冲突和覆盖是常有的事。 - 2.
没有基本的代码规范
,成员变量很多都是public的,Bean定义中夹杂着大量业务逻辑,各种内部类嵌套使用。像这种问题可以轻松列出20条。 - 3.
shell和python脚本部署的到处都是
,很多代码都找不到了。gy很喜欢用脚本,估计在他看来,没什么问题是脚本解决不了的,如果解决不了,那是因为脚本还不够多
。 - 4.
几乎看不到文档
,仅有的几篇还是以前离职的员工留下的,想知道什么都得问gy,他还各种不耐烦,从gy那里只能学点儿皮毛,剩下的都得自己看代码。 - 5.
代码几乎没有注释
。所有的注释加起来估计连200字都不到(一点儿不夸张)。 - 6.
管理后台做的惨不忍睹
,属性名称全部是一堆似乎是英语的不知名的、自创的单词。用户宁愿用脚本操作训练,也不愿意用我们的管理后台,我用了两个月都不知道怎么用(估计是我太笨吧)。 - 7.
缺乏基本的新员工培训方案
。第一天上午安装好工作环境,下午gy给讲了一下项目的概况,后面就让自己看代码了。文档没有,注释没有,就那么干啃。如果对于有机器学习经验的新人来说,可能还稍微轻松一些,对我这种只听说过“机器学习”这个名词的人来说,真的是十脸懵逼。 - 8.
技术方案严重不合理
。举个简单的例子吧,居然用Redis存储了100多万条数据,每次查询时把Redis中的所有数据加载到内存中,按照条件遍历筛选,然后再做计算。Redis啊,你啥时候这么牛逼都能做复杂条件筛选了呢。每次调用需要10分钟以上,gy还很自豪。后来我和gy在讨论另一个需求《离线Metrics》模块设计
的时候,gy强烈坚持要用的方案居然是:把100亿条数据的分析交给Spark去做,计算出所有的可能性,然后把结果存下来。并且还很自豪的说自己之前的项目就是这么做的,开几十个个任务并行执行,每个任务分配10G内存,半个小时就能出结果
。我当时就懵逼了,大哥你家里有矿吗?你家内存都是矿里挖出来的,不要钱吧?后来我知道gy所说那个项目早就被下线了,我这才才能把下巴收回来。 - 9.
工作效率很低
。团队搞成这样,效率能高估计所有项目管理和软件工程的书都得重写了。gy到公司两年了,手头的东西基本都是从离职员工手里接手的,他秉承着不做就不会错
的原则,自己平时就维护维护,过一天算一天,两年也就这么过来了,所以项目这两年基本没有什么进展。至于实习生,倒是想学点儿东西,但也没人带没人教,基本也只能跟着打打酱油。 - 10.
线上事故频发
。我到公司两个月,发生了三次重大事故(其中一次直接把公司近两周的训练模型给弄丢了,线上指标直接跌30%),小问题更是每天都有。奇怪的是居然没有任何人需要为这些事故负责,这要是在我之前的公司,直接就会全员通报批评,再从底层员工罚到部门总监,这个季度的绩效就别想了。 - 11.
团队目标不明确
。哪些事情要做,哪些事情不做,团队的目标是什么,没有人说得清楚,经常为了某个功能要不要做讨论半天。 - 12.
集群混乱
。gy管理集群的方式和他平时的做事风格如出一辙,非常混乱。我至少和他确认过4次我们都有哪些集群,每次得到的答复都是”就这些,没别的了“。然而过段时间后,必然会人拿着一个我完全没见过的集群过来找我解决问题。后来数了数,mesos集群总数达到7个,marathon集群达到14个
。 - 13.
没有监控
。俗话说没有监控的系统就等于裸奔
。整个系统几乎没有任何监控,问题发现几乎都靠用户反馈。 -
缺乏自动化运维
。运维几乎全靠人力,一周宕机10几次都是常事,经常要手动清理磁盘,浪费了太多时间。
-
真的是我工作以来见过的最差的团队和员工了,没有之一。不管怎样,既然来了,我就得想办法做好
。
制定团队目标
一个没有目标的团队,就是无头苍蝇。
通过和领导讨论,以及团队内部多次讨论,我提出一个一站式机器学习管理平台
的团队目标,得到了领导的认同。
基本制度建设
从上面的各种问题来看,根本原因是缺乏基本的管理规范,所以团队才会这么混乱。所以我就首先制定了一些管理规范(包括Git分支规范、Java编码规范、测试规范、发布规范
等)。为了便于推行,我制定的这些规范都非常简单且实用。比如Git分支管理:
- 不可以在master分支上直接修改,所有的修改需要另行拉分支,或在已有的非master分支操作。
- 上线成功后的代码需要合并到master分支,从而保证master分支始终和线上代码一致,可以随时做到添加补丁或版本回滚。
- 上线后如发现bug,需从master拉取新分支,bug修复后将代码合并到master分支。杜绝将未测试的代码直接上线。
还参照阿里巴巴Java代码规范制定了一套极简版的Java代码规范,并在团队内推行,确保每个团队成员都能正确理解。
文档化管理
文档的缺失是团队管理的重大失误,也是团队的头号风险。
我在入职后第一步就开始边看代码变完善文档,一个月后就把大面上的文档基本都完善了,写了十几篇,一篇一篇与gy确认。gy每次都是“差不多”、“基本就是这样”几句评论,我就拉上领导一起看
,多次修改确保自己真正理解正确。
我本来想在团队内推广文档规范,gy完全不配合,领导多次督促,gy也压根儿不当回事儿(遇到佛系员工,CEO来了都不好使
),为了避免引起矛盾,我就自己主动替他完善文档(付出终究会有回报的吧,我是这么认为的)。
技术建设
技术架构
在我加入团队之前,团队有个简单的管理后台,是基于Spring Boot开发的,虽说是一个Spring Boot项目,使用方式却非常的low,连基本的多环境支持都没有,更别提微服务架构了。
所以,我就抽时间去设计项目的技术架构,解决了一系列技术问题后,基于Spring Boot开发出一套包括(不限于)如下功能的微服务架构:
- 异常处理
- 环境分离
- 服务发现
- 服务调用
- 服务部署
- 测试发布
在此架构的基础上,我将原来的代码进行拆分,合理地拆分成几个微服务,并对这几个服务进行独立部署和维护,bug数量下降非常明显。
也正是得益于这套微服务架构,开发速度提升了至少3倍
,我后来一个人仅用了一个月就把项目做了重新设计和实现,后来又用了两个月开发了很多实用的功能,用户反馈非常好。
重写管理后台
最初的这个管理后台,用户体验只能用一个字惨
来形容,连比我早来3个月产品同学都不知道怎么用(一点儿不夸张),更别说用户了。所以,很多用户宁愿用脚本也不愿意用这个管理后台
。
另外,平台上的所有操作都无记录,实验归属也非常混乱,很多都没有负责人。
针对这个问题,我和gy讨论过很多次,他都坚决不做,还自认为自己做的已经非常好了,没必要修改(通过后来对他的了解加深,其实他根本就是不想做,只要不让他干活就行)。
和他讨论了几次,他都以各种理由拒绝。我本着以数据说话
的原则,把用户的操作记录下来,并输出了图表,这样就一眼能看出用户的使用频率和使用习惯。图表的结果比我预期还差,用户平均每天操作次数不超过10次
。
有数据后,我再此找gy讨论,他态度不再强硬,但依然什么都不想动。讨论无果后,我只好拉上领导一起讨论
,领导对我的想法非常赞成,也表达了对现状的不满。gy看到推脱不了了,就直接撂挑子不干了
,说这块让我来负责,以后自己就不管了,从大局考虑,我就果断接受了。鉴于他那些让人无语的编码风格,我也实在不敢让他写代码,就自己动手去做。
于是,我推翻了之前混乱的设计(如果这也算设计的话),做了全新的设计,重新编码。用了两个月的时间,把用户平均操作次数从不足10次,提升到了100次以上
。
我主要的策略是:
- 完善操作记录,做的操作可追溯
- 完善训练错误收集方式,将错误排查时间由半小时缩短到3分钟
- 明确责任人,每个实验都可以找到责任人
- 简化训练启停流程,简化配置,一键启停,快速查看日志,快速创建训练,一键保存模型等功能都大受欢迎
- 接入其它平台页面,努力实现”一站式“的目标
- 配置项尽量改成中文,并配上说明文字
- 主动挖掘和收集用户需求,尽快支持上线
后来由增加了对TensorFlow训练的支持,用户纷纷点赞,目前平均每天用户操作总次数超过2500次,较之前提升了15倍
。
资源优化
最初对资源的分配处于一种几乎完全无管制的状态,用户可以随意申请资源,经常用户启动训练时没有资源,而实际资源利用率不足30%,造成大量资源浪费,经济损失超过200万元人民币。
详见:机器学习平台——资源优化之路
在短短两个月的时间里为公司节省了43台高配物理机,经济价值超过120万元
。
监控报警
监控实在太重要了,可以帮助我们快速发现系统中存在的风险和问题,从而可以快速响应,消除风险,解决问题。所以,我就给系统添加了负载监控(磁盘、内存、CPU)、进程监控、各种业务监控。使问题发现时间缩短到3分钟以内,问题响应时间缩短到10分钟以内。
自动化运维
借助ansible实现了自动化运维,使每周人工运维时间从20小时缩短到不到0.5小时。宕机次数从20+次/月减少到1次/月
。
摒弃非核心业务
在很长一段时间内,我们的团队几乎是处于与世隔绝、完全独立的状态,整个系统所有的外部系统都是自己来搞,redis、mongodb、监控系统都是自己搭建和维护。这些系统的建设花费了不少的时间,但没给我们带来任何收益。所以,gy离职后,我就逐步下线这些外部系统,积极与公司已有系统进行对接。这也节省了一定的时间。
总结
经过一年的努力,我的团队创造了一下收益:
- 1.形成了良好的规范
- 2.有了清晰的团队目标
- 3.实现了文档化管理
- 4.实现了一套实用且易用的微服务架构
- 5.每日用户操作次数增长了15+倍
- 6.为公司节省了43台高配物理机,经济价值超过120万元
- 7.实现了全方位监控,问题发现时间缩短到3分钟以内,问题响应时间缩短到10分钟以内
- 8.实现了自动化运维,每周人工运维时间从20小时缩短到不到0.5小时。宕机次数从20次/月减少到1次/月
这一年是充满挑战和收获的一年。
网友评论