0%

再见创业

人生如逆旅,我亦是行人

这是3月的最后一天发给下属的告别信的标题。

创业五年,从上海西站的一个出租屋到三地办公室,百人规模的公司,经历了太多太多,休息了一个月之后我打算把这些故事写下来。今天是开篇,总结一下过去五年的得失。

从时间线来看,

  • 2017,和 CTO 两个人完成了产品原型并在拿下第一个客户之后正式商用。
  • 2018,扩大研发团队规模;将单体服务拆分成了多个微服务;搭建了最初的大数据应用。
  • 2019,微服务全面容器化;交付了第一个百万级别的定制项目。
  • 2020,疫情爆发;大数据从 Spark 向 Doris 迁移 (事后证明是我的决策失误);在上海搭建大数据团队并重构大数据业务。
  • 2021,发布元数据驱动的准实时 OLAP 系统,半年内完成了多种报表分析功能以及标签系统;救了一个危在旦夕的大客户项目。

值得一说的

综合来看,我大概做了这么三件事,一是从0到1的搭建了 OLTP 和 OLAP 两套系统的服务端框架;二是帮公司交付了两个很重要的项目;三是带出了 Web 和 Big data 两个后端团队。

系统搭建

在 OLTP 的演化道路上大概做了这么几件事

  1. 坚定的把最早期的基于 Grails 的系统用 Spring boot 重写,并不是说 Groovy 不好,而是为后期技术普适性和团队扩张打基础。
  2. 引用消息中间件形成事件驱动的执行框架。
  3. 构建了元数据驱动的 User-Behavior 模型。
  4. Spring boot 的单体服务拆分成基于 Spring Cloud 的微服务架构,并与运维配合在 kubernetes 上全面容器化。

OLAP 的演化故事就相对曲折很多,最早期是离线从 MySQL 全量拉取数据生成 Parquet 文件,再通过 Spark SQL 获取报表结果。之后走了一次弯路,用 Apache Doris 替代了 Parquet 和 Spark,由于业务数据有更新的需求并且查询数据量不可控,经常造成线上故障,这也是后续专门组建大数据团队的一个原因,可能很难想象在此之前我们的大数据工程师只有 2 个人。因此值得一提的都是下决心搭建数据团队之后的事情

  1. 梳理了报表/标签/分群的控件规则,按照指标(measure),维度(dimension)和条件(condition)的粒度统一以 JSON 形式进行表述。
  2. 搭建了基于 Flink CDC 的实时业务数据平台(其实使用 canal 也可以,但就是希望团队的技能栈更丰富)。
  3. 基于元数据的数据存储,存储时我们并不知道客户定义的字段叫什么是什么类型的,全靠元数据定义。
  4. 基于 Presto 的 Ad-hoc 查询引擎,因为 Presto 是无状态的所以横向扩展非常方便。我们也开发了相当数量的 UDF / UDAF,目标是让所有查询规则都可以转换成一次 SQL 的请求(一次请求不代表是一条 SQL,可能会有多条 SQL 并发查的情况)。

项目交付

经手的项目肯定不止这些,不过下面两个项目是个人起到相对重要作用的

  1. 公司首个过百万的项目,甲方也是500强企业,并且需要我们驻场开发。所以基本上19年的整个夏天和秋天都是泡在上海的。在甲方公司附近租了房子,披星戴月地干。结果还是很好的,也受到了甲方的肯定。其中比较有趣的是,甲方集团内部有新建立的CI/CD平台以及云环境,但整套基础设施业务部门并不熟悉。在摸索了几个月以后,我还给甲方业务部门的研发团队做了技术分享,介绍如何使用集团的这些基础设施。
  2. 一个外资甲方的项目,同样也是金额很大。做了半年之后出现了严重的问题,甲方天天投诉,项目组人员频繁离职,甚至有不交接工作直接离职的情况。我临危受命处理这个大坑。由于之前的人员变动,产品需求已经几经转手,代码和需求文档很难匹配的上。所以基本上是边看代码边问,再重新梳理需求和客户确认,期间大概写了几十个文档去描述业务。之后带了一个小分队进场,把之前的代码推翻了重写。要知道动工的时候就已经是8月初了,系统正式上线日期是8月22日。这么短时间怎么也不可能来得及,所以顶着压力先让之前有问题的版本先上,毕竟刚上线用户使用量还不高,重写后的版本放在9月中旬再上。这么看是争取了一些时间,但也意味着我们不光需要重写项目,还需要一套迁移工具让两个版本能够平滑过度,这些都要在1个半月内完成。这也是我第一次也是唯一一次强制开发人员加班,每天跟进进度。在大家的共同努力下,这个奇迹实现了,并且甲方也对重写之后的系统稳定性和可维护性表示了认可。

团队建设

其实搭建团队的难度更甚于搭建系统

  1. 实线 + 虚线汇报给我的大概小 30 人,由我直接面试进来的差不多超过一半。
  2. 花了相当大的功夫在招聘,在不依赖 HR 的情况下,完全靠自己出笔试题,筛简历,约面试。创业公司没有光环,候选人能来往往就是看面试官有没有水平是不是专业,所以这些时间都是花得值得的。
  3. 早期面试进来的两个同事现在都可以自己带团队了。
  4. 数据团队每个模块都做到了二级梯队,没有一个模块是有单点问题的,所以哪个工程师不在都有人能够顶上。
  5. 因为数据团队是我一手组建的,不谦虚的说是全司最团结也是最能打的团队。我本身不是搞大数据出身,技术上的硬实力可能还不如团队里的年轻工程师。开发过程的疑难问题或是线上的紧急问题,很多都是他们自己解决,我的作用无非是提供一点思路和经验。所以老板应该是给团队兜底的,而不是应该是团队的天花板。
  6. 技术氛围最好的团队,给 Apache 的三个项目提交过代码。
  7. 司内文档最多的团队,最全的编码规约和入门指引,刚进入公司的小白都可以按照文档开始工作,不用浪费人力手把手教。同时也鼓励开发多写文档沉淀知识,包括但不限于需求的概要设计,线上排障手册等等。

遗憾

说了值得骄傲的,也要说说遗憾

  1. 极少给团队做技术培训,我甚至给甲方爸爸的工程师都做过架构培训,却没有给自己的同事讲过。每次都是由于一些突发事情打断,但不管怎么说,我都觉得是自己的失职。
  2. 带队做紧急任务的时候,开过不少空头支票,比如项目奖金一类的。
  3. 在任务非常紧急,我自己压力也很大情况下,会对下属要求非常严苛,很多时间没有控制好自己的情绪。这其实也是我想休息一下的一个很重要的原因。
  4. 还有很多做了设计,但没能实现的功能。没能实现的原因也很多,就不展开细聊了。

过去五年我花在工作或者说花在团队上的时间大概是放在家人身上的数倍,公司唯一一次360评价下属们都给我打了很高的分,我觉得这是一种相互尊重,相互成就的结果,我也非常感谢能有这样一个机会带领一帮相信我的人做成一些事情。但人的精力是有限的, 如果说这个产品是我的孩子,我也不反对,但这个产品还有很多父母,而我真正的孩子只有一个父亲,我选择花更多的时间回归家庭去陪伴他。当然离开的原因是综合性的,后续我也会谈一谈对国内 SaaS 行业的一些理解。

希望对你有帮助,分享或是请我喝杯咖啡吧~