虽然年度总结每年都在我的 Todo List 上面,但是我从来没有真正的写过年度总结。去年写过好多草稿,最后都删掉了,原因是写的过于具体会像流水帐,写的过于抽象又容易矫情。今年好不容易鼓起勇气再次尝试,希望能对得起过去的 2019。

Living

今年最大的变化就是有了女朋友,运气太好以至于难以相信灵魂伴侣能如此轻易的找到。努力的追了大半年,终于在年底的时候在一起了。我们官宣的文案是:“从横版过关变成塔防了。”跟她在一起的这段时间很累,但是非常开心非常充实。一起看了好多电影,一起看了好多美剧,一起深夜加班,一起凌晨漫步。饥荒玩的最久的世界已经满365 天了,过上了穿熊皮背心,拿步行手杖,提触手尖刺,喝肉汤吃大肉的幸福生活。晚上会打开 Just Dance 一起手舞足蹈,为每一次 Perfect 欢呼。最近一起养了一条狗子,名字叫阿Piu。

虽然她每天都叼着我的拖鞋到处跑,拉屎奇丑无比,还会尿在新买的地毯上,但是我们很爱她。

有了女朋友对我来说意味着崭新人生阶段的开始,要接受另外一个人进入自己的生活,个人的独处和社交时间减少,双方的情绪也不可避免的互相影响,做任何决定都是双人份的压力和负担,要学会感知和体会他人的情感,肩上的责任也变得更重。这些对我来说都是全新的领域,我努力的在适应和调整,也感谢我的女朋友一贯以来的容忍和包容。但愿新的一年我们还是能够开开心心的在一起。

其次就是朋友 P 离职。我在青云做的第一个正经项目就是他带我做的 QingStor SDK,之后是跟他一起做 Anybox 网盘项目。如果没有他言传身教的话,想必我至今还是一个市场部的乱搞脚本 Boy。他的离去使我感到孤独,少了一个想养猫而不得每天只能云吸猫,爱讲冷笑话,每天鼓吹微软大法好,在群里接我的各种冷门 Geek 梗的他让我倍感孤独。但是天下没有不散的宴席,再怎么志同道合也不可能一直在一起工作,希望他在 Serverless 的道路上越搞越好。

Coding

今年明确了自己的职业方向:效率研发工程师,具体到工作上能分为团队,工程和用户几个方向。

团队

团队的效率问题更多的是沟通问题,而沟通问题能划分为内部沟通和外部沟通,其中内部沟通最突出的问题是信息冗余,而外部沟通则恰好相反——信息不足。

为了解决信息冗余的问题,我提出并构建了 QingStor Infrastructure 项目,将团队内部的所有服务和工具重新整理并通过容器化的方式来部署。设计并构建了 Info Center,通过 RESTful API 的方式对外暴露了团队内可公开的信息,包括每个人的联系方式,各个环境的信息,每个人归属的项目等。设计并指导团队成员 C 实现了 QingStor Robot,支持在 Skype 内获取每个人的信息,并实现每日的工单值班提醒功能。期间还提出过统一各个环境的命名方式和域名,进行版本化管理等,但是由于种种原因夭折了,此处不展开了。

而外部沟通的信息不足则涉及到跟其他部门的沟通问题,具体到我需要解决的问题是工单值班的问题。青云的工单值班主要分为 L2 和 L3,L2 是服务团队 24 小时轮流值班的人员,他们会负责处理一些简单的常见问题,而复杂的技术问题则会交给每日值班的研发团队的同事。对于 QingStor 对象存储来说,问题的复杂性在于流程很长,从用户浏览器到网络到对象存储服务,每个流程都有可能出错。L2 工单的同事越来越倾向于将问题转发给研发同事,而不是自己解决。一方面是很多问题确实解决不了,另一方面是过去解决过的工单没有积累起来,不像 IaaS 有一个很大的数据库。为此,我跟 L2 服务团队的负责人沟通,推动建立起了全公司的工单库,将 QingStor 对象存储的工单也放在里面,期望能够开始积累起工单,减轻工单值班的压力。

团队这个方向的工作不好做,尤其对于我来说,要跟很多陌生的人沟通, 需要耗费额外的精力,很多时候都会觉得麻烦不如自己直接搞一个。今年有努力克制这种欲望,包括工单库也是选择直接使用公司现有的 Confluence 而不是自建一个。有进步,没明显成效,虎头蛇尾,大概只能评个 6 分。

工程

上半年的大多数时间都在琢磨如何提高工程效率。经过一段时间体验,我认为我们团队的工程效率短腿集中在两个地方:其一是依赖管理,其二是测试管理。

我们团队用 Go 比较早,当时还没有完善的版本管理方案,我们的做法是自己写了个 Python 的脚本,直接 go get 到本地,放在 GOPATH 中。大家,尤其是新入职的同学要话很多时间来处理依赖问题。为了解决这个问题,我在 Go 1.11 发布后便开始推动大家使用 Go Modules,还进行过 Go Modules 内部分享。为了解决大清国情的问题,我使用 athens 搭建了团队内部的 Go Proxy,还开发了 go-mod-redirect 用来重定向我们的项目名。到目前为止,几乎还活着的 Golang 项目都已经切换到了 Go Modules 来管理依赖,为后续的 CI/CD 和可重现构建算是打了一个比较好的基础。

为了能够更好的组织测试,避免一个环境一个 Jenkins 的现状,我在 QingStor Infrastructure 中搭建了一个 Jenkins 并推动大家使用 Pipeline 而不是脚本的方式来定义 CI 逻辑。理想很丰满,现实很骨感。这个计划在初次执行的时候就遇到了很大的问题:由于历史原因,项目缺乏真正的单元测试,想测试的话需要一整套的环境和各种组件才可以。如果想做到我期望的那种即创建即销毁的动态测试,我还需要一个服务编排系统,为此,我们期望可以上 K8S。当时 K8S 上没有一个优秀的测试平台,再加上我的兴趣点转移,所以这个也被暂缓了。

工程效率第一次做,还算是有点成果,测试的事情推动到了一半,没有执行完,评个 7.5 分。

用户

用户的效率提升也是我工作的重要组成部份,这也是我为什么一直在负责 QingStor 对象存储用户工具生态的原因:如果我们的服务不能提升用户的效率,那它毫无价值。

到下半年的时候我被要求支持一下 qsctl 2 的开发工作,最开始只是希望我搭个框架,但是后来我的野心越来越大,除了想做 QingStor 迄今为止最好的命令行应用之外,还希望将 qsctl 2 的底层抽象为一套数据操作框架,这套框架将用于后续我们青云自己的 Data Sync 服务。所以我花了很多时间去设计这个抽象的数据操作框架,直到年底的时候才算基本完成,并从 qsctl 中剥离出来,命名为 Noah。2020 年 Q1 末的时候希望能够正式的向大家介绍它。

在 11/07 时候 qsctl 2 发布了首个 Beta 版本,一个月后发布了第二个 Beta。整个开发持续了半年,期间另外一个小伙伴还需要负责公司的另外一个项目,感谢他的投入和支持。同样是 2020 年 Q1 末,我期望能向大家介绍 qsctl 2 的第一个稳定版。

qscamel 支持了腾讯云对象存储这种小事就不展开了,期间还对接了一波 Ceph 的 S3,不支持 v4 的签名,不支持 v2 List Objects 带来了不少麻烦,好在都在用户的配合下解决了。明年 Noah 稳定后,可能会重构 qscamel 的底层,并优化 qscamel 的使用体验,期望能提升大家迁移数据时的效率。

用户侧的效率提升从我进入 QingStor 团队的第一天开始就在做,今年感觉得到了足够的资源和支持,使得我能够大胆的实现我的想法,因此也给我自己大胆的评个 9 分,希望 19 年孕育的种子到 20 年能结果。

Writing

今年博客写了 28 篇文章,其中 Code 分类 16 篇,Daily 分类 5 篇,Travel 分类 7 篇。上半年的时候集中写了一波旅游日志,下半年的时候技术相关的东西比较多。

2019 年全年有 40732 名用户访问了我的博客,其中有 40584 名新用户,为我带来了 70026 次页面浏览。跟往年相比大概少了 10%, 每次访问停留时间减少了 17%,跳出率提高了 2%。这大概就是怠惰和写水文的惩罚吧(

2019 年,大家看的最多的还是我 2014 年到 2015 年写的几篇文章,这让我有些沮丧,并鞭策自己产出更好的内容。

此外还有一些有趣的数据,比如访问我博客的浏览器比例

Chrome 不出意外的以 80%+ 的比例高居榜首,但是第三名的 UC 浏览器是为啥?Opera 跟 IE 打了个平手,看来确实凉了。

以上数据均来自 Google 分析


明年继续加油,提前祝大家新年快乐~