编程能力|阿里毕玄:程序员如何提升自己的硬实力( 三 )


通常一个编程能力不错的程序员 , 在一定阶段后就会开始承担一个模块的工作 , 进而承担一个子系统、系统、跨多领域的更大系统等 。
我自己在工作的第三年开始承担一个流程引擎的设计和实现工作 , 一个不算小的系统 , 并且也是当时那个项目里的核心部分 。 那个阶段我学会了一些系统设计的基本知识 , 例如需要想清楚整个系统的目标、模块的划分和职责、关键的对象设计等 , 而不是上来就开始写代码 。 但那个时候由于我是一个人写整个系统 , 所以其实对设计的感觉并还没有那么强力的感觉 。
在那之后的几年也负责过一些系统 , 但总体感觉好像在系统设计上的成长没那么多 , 直到在阿里的经历 , 在系统设计上才有了越来越多的体会 。 (点击文末阅读原文 , 查看:我在系统设计上犯过的14个错 , 可以看到我走的一堆的弯路) 。
在阿里有一次做分享 , 讲到我在系统设计能力方面的成长 , 主要是因为三段经历 , 负责专业领域系统的设计 -> 负责跨专业领域的专业系统的设计 -> 负责阿里电商系统架构级改造的设计 。
第一段经历 , 是我负责HSF 。 HSF是一个从0开始打造的系统 , 它主要是作为支撑服务化的框架 , 是个非常专业领域的系统 , 放在整个淘宝电商的大系统来看 , 其实它就是一个很小的子系统 , 这段经历里让我最深刻的有三点:
1).要设计好这种非常专业领域的系统 , 专业的知识深度是非常重要的 。 我在最早设计HSF的几个框的时候 , 是没有设计好服务消费者/提供者要怎么和现有框架结合的 , 在设计负载均衡这个部分也反复了几次 , 这个主要是因为自己当时对这个领域掌握不深的原因造成的;
2). 太技术化 。 在HSF的阶段 , 出于情怀 , 在有一个版本里投入了非常大的精力去引进OSGi以及去做动态化 , 这个后来事实证明是个非常非常错误的决定 , 从这个点我才真正明白在设计系统时一定要想清楚目标 , 而目标很重要的是和公司发展阶段结合;
3). 可持续性 。 作为一个要在生产环境持续运行很多年的系统而言 , 怎么样让其在未来更可持续的发展 , 这个对设计阶段来说至关重要 。 这里最low的例子是最早设计HSF协议的时候 , 协议头里竟然没有版本号 , 导致后来升级都特别复杂;最典型的例子是HSF在早期缺乏了缺乏了服务Tracing这方面的设计 , 导致后面发现了这个地方非常重要后 , 全部落地花了长达几年的时间;又例如HSF早期缺乏Filter Chain的设计 , 导致很多扩展、定制化做起来非常不方便 。
第二段经历 , 是做T4 。 T4是基于LXC的阿里的容器 , 它和HSF的不同是 , 它其实是一个跨多领域的系统 , 包括了单机上的容器引擎 , 容器管理系统 , 容器管理系统对外提供API , 其他系统或用户通过这个来管理容器 。 这个系统发展过程也是各种犯错 , 犯错的主要原因也是因为领域掌握不深 。 在做T4的日子里 , 学会到的最重要的是怎么去设计这种跨多个专业领域的系统 , 怎么更好的划分模块的职责 , 设计交互逻辑 , 这段经历对我自己更为重要的意义是我有了做更大一些系统的架构的信心 。
第三段经历 , 是做阿里电商的异地多活 。 这对我来说是真正的去做一个巨大系统的架构师 , 尽管我以前做HSF的时候参与了淘宝电商2.0-3.0的重大技术改造 , 但参与和自己主导是有很大区别的 , 这个架构改造涉及到了阿里电商众多不同专业领域的技术团队 。 在这个阶段 , 我学会的最主要的:
1). 子系统职责划分 。 在这种超大的技术方案中 , 很容易出现某些部分的职责重叠和冲突 , 这个时候怎么去划分子系统 , 就非常重要了 。 作为大架构师 , 这个时候要从团队的职责、团队的可持续性上去选择团队;
2). 大架构师最主要的职责是控制系统风险 。 对于这种超大系统 , 一定是多个专业领域的架构师和大架构师共同设计 , 怎么确保在执行的过程中对于系统而言最重要的风险能够被控制住 , 这是我真正的理解什么叫系统设计文档里设计原则的部分 。
设计原则我自己觉得就是用来确保各个子系统在设计时都会遵循和考虑的 , 一定不能是虚的东西 , 例如在异地多活架构里 , 最重要的是如何控制数据风险 , 这个需要在原则里写上 , 最基本的原则是可接受系统不可用 , 但也要保障数据一致 , 而我看过更多的系统设计里设计原则只是写写的 , 或者千篇一律的 , 设计原则切实的体现了架构师对目标的理解(例如当时异地多活这个其实开始只是个概念 , 但做到什么程度才叫做到异地多活 , 这是需要解读的 , 也要确保在技术层面的设计上是达到了目标的) , 技术方案层面上的选择原则 , 并确保在细节的设计方案里有对于设计原则的承接以及执行;