本文为【程序员年入百万指南】系列之VOL.四 从小白到架构师/科学家之路
作者:胡嵩
今天我们来聊聊技术人员的技术进阶:小白如何才能成长为架构师/科学家。
高阶到底高在哪里
开篇之前咱们再来做一个小测试, 你认为高阶工程师/架构师/科学家 和 初阶工程师最大的区别是什么:
A. 编码实现能力更强
B. 系统架构设计能力更强
C. 工程经验更丰富
D. 更会写PPT, 忽悠老板
嘿嘿, 很多一路追更过来的同学已经猜到了答案。
那就是:
以上全错!
高阶工程师与低阶最大的不同, 在于解决问题的能力:能直接面向开放而复杂的业务问题, 提出解决方案,并在技术上指引团队落地执行。
解决问题的能力是集领域经验、业务认知力、系统思维能力、沟通能力为一体的综合能力,它超越了具体的语言特性、框架算法,更高阶的架构师/科学家甚至可以做到跨问题域的自由迁移。
这才是高阶之所以为高阶,值钱的水果之所以值钱的原因。
因为定义和解决问题, 是直接承接业务和产品需求, 在整个技术体系中,是价值创造链条的上游,自然也能分到更多的价值。
再来回顾一下几个干扰选项:
编码实现,这个应该很少同学选。毕竟大部分架构师/科学家的主要工作不是做实现。 但他们都应该具备非常扎实的功底,一眼就能看出各种实现上的问题。
系统设计能力,这个干扰性最强,但是任何脱离业务需求的系统设计都是耍流氓, 很多不太合格的架构师/科学家 问题就出在这里, 片面追求设计的优雅,脱离业务的阶段和资源的限制。
工程经验丰富,这个也有一定的干扰性。毕竟大家都喜欢打怪经验值累积升级这个简单粗暴的模型, 但是现实世界跟RPG游戏不同, 打一千一万个小怪(明确业务需求的简单系统设计), 也没法帮助你晋级, 这是很多受业务限制发展的同学的困境。
写PPT向上沟通,这个确实是高阶的必备技能之一,但是光沟通不能落地解决问题,那这个高阶迟早也要被开掉。毕竟老板是要看结果的。
一个实际的例子
说这么抽象的东西,很多刚入门的同学可能很难GET到点。下面我们来举一个栗子:
从前有一个小白,刚毕业来到一个互联网小厂。
首先他经历了入门:
1.用C实现一个完整的多线程抓取器
2.实现2G大小文本中的topk 关键词提取。
在这个过程中,他从Linux基本命令开始熟悉,学习使用vim gcc gdb(工具链);从malloc和free开始搞内存管理(语言特性);从0开始码hashtable,从socket开始实现http client和各种协议码解析,使用pthread多线程和信号量互斥同步(基础库熟悉)。
这样一个明确需求的子功能实现走下来,他具备了最基础的工程能力,能在指导下进行具体功能的开发。
因为入门练习表现还可以,组长让他接手一个核心的存储系统,单机存储数千万级的网页,支持高性能的随机存取和顺序读。规模大概几W行纯C。
花了一段时间把这个子系统啃下来之后,小白对这个系统进行了若干次升级,解决各种诡异bug,编码和解决问题的能力突飞猛进。在存储系统领域,他达到了能设计实现一个完整的子系统。
搞定存储子系统之后,小白进一步得到了credit(部门同事和leader的认可)。 他的下一个任务是升级和扩展一个完整的抓取系统。和入门练习做的抓取器不同,这个完整的抓取系统(又称Spider)是工业级的,需要每天抓取数百万站点完成数千万的网页抓取量,还需要考虑不能把站点抓down机、历史网页如何分配抓取配额实现有效的更新、垃圾网页处理、去重等等诸多现实的问题。整个系统大大小小十来个模块,十几万行C代码+shell脚本。
小白发现很多模块内部都有不少实现不尽如人意的地方,但是由于系统接口定义的非常好,模块之间容错性强,整个系统还是很健壮的。
这促使小白思考系统级的架构,最需要关注的重点是什么:良好的结构远胜于细节的雕琢。理解了接口定义和系统结构重于实现细节,小白迈出了成为架构师的第一步。
把这个完整的系统理顺玩6之后(出任何的问题立刻能反应出在哪, 有业务需求来能很快给出设计方案), 小白达到了能维护升级一个完整的系统。是一个合格的高级工程师了。
这时产品经理一直反馈线上死链太多影响用户体验,追查下来发现根源是累积抓取的网页数太多,每日更新的配额分配不过来,导致系统中大量网页在互联网上已经404但仍然会进到线上被检索出来。
通过调研分析,小白发现互联网上绝大部分网页并没有定期更新的价值,属于不变的内容或者叫archive页面,而死链存在站点或目录级聚集的现象(这个其实很好理解,一个网站无力维护了,自然就全部挂掉,目录级很可能是网站改版了,或者一个子频道关闭了)。这样的问题域的规律,有重大工程价值。
基于调研发现的规律,小白设计了一个独立的死链检测系统。上线效果很不错,检查死链的流量开销降低到原来10%,网页库中死链还下降了。
到这里, 小白达到了能搭建一个中等规模系统,解决较明确业务问题。成为资深的高级工程师,具备有一定架构师的能力。
这个时候小白已经成长为老白了,他开始关注系统的整体设计, 这时业界开始出现分布式系统的浪潮,如何利用分布式基础框架改造系统,让系统更健壮、维护开发更灵活方便(以及用更廉价的硬件給公司省钱),成为公司上下关注的重要问题。
老白主导了整个抓取系统和建库系统的分布式改造,重新设计一个新的大系统。此时需要考虑方方面面,如何逐步升级兼容原有系统?如何保证功能的完整性?原有设计中有一些不合理的地方,如何利用这次迁移同步改造?他完成了整体的概要设计,并指导了多名高级工程师完成子系统的设计和开发。
主导完这样一个全新的复杂系统之后,老白完全达到了架构师水平。
之后老白进一步梳理了整个搜索引擎的技术架构, 提出并组建了一个新的部门,这个部门将所有web数据挖掘的工作集中到一起, 用现在的行话说, 就是一个中台部门, 提供给各个业务应用方。 这样可以将数据挖掘的专业知识积淀下来,更加高效,也更加利于工程师的成长。
设定完这个全新方向的技术体系之后, 老白达到了自己技术晋阶的顶点,成为这个大厂(当年的小厂已成为大厂)的高级架构师(和老白同级不超过7个,再之上就是首席科学家了)。
熟悉嵩哥的同学早就猜出来, 这就是嵩哥自己的亲身经历。
所以,到底该怎么做?
在每一个层级,晋升需要解决更开放、更复杂的问题, 下面再回顾一下:
从小白到能独立干活的工程师, 需要熟悉环境、掌握语言、工具、框架(学习各种新鲜框架都是在点这个层次的技能点), 在高阶的指导下,完成明确需求,明确接口的模块级开发。基础不差的小白入行一年左右,都能成为及格的工程师。
从工程师到高级工程师, 需要扩展自己的技术视野,承接更完整、大块的需求, 可以在已有的系统框架下, 实现较明确的业务需求。 虽然嵩哥的例子是平台开发(也包括了一些策略算法,有见地的同学自然理解),其实大部分应用开发工程师、算法工程师工作3~7年甚至更久都在这个水平。(关于工程师的职业路径参见系列三)
从高级工程师到架构师, 需要更进一步的接触业务, 遇到没有成熟解决方案的业务需求时,能深入理解业务问题, 发掘问题域的规律,明确主次优先级, 在有限资源下寻求适合的解决方案。 还需要兼顾业务可能的发展变化,为将来的需求留下扩展的空间,这就是架构师的预见性。
从架构师到更资深的高级架构师,需要全面理解业务需要,主动推进设立新的技术方向,包括技术目标设定,技术人员的成长路径设定等, 这个有些超纲,很多公司的CTO也未必有这个水平。
每一级要打的怪是不一样的。
如果在的实际工作中, 就是没有合适的机会怎么办?
不建议大家为了进阶而创造出问题给自己解决(很多多余的系统都是这么搞出来的,包括各种不顾业务需要的大规模重构)。这些非业务驱动的技术项目,最后没有实际需求的检验,往往都是各种空中楼阁、各种烂尾。
给大家一句忠告:自己的成长方向, 一定要把握在自己手里。
如果你在某一个级已经打了很久的重复小怪(注意关键字,每个层级都需要一定的时间巩固,不要为了进阶而进阶), 建议你先跟你的直属leader坦诚沟通, 合格的技术管理者需要兼顾业务目标和团队成员的成长,他有责任和义务解答你的困惑, 如果得不到解决,可以再上一级寻求帮助。
如果当前平台就是没有合适的机会, 那么到外面看看是你必备的选项。
员工和企业之间的雇佣关系, 本来就是双向选择的市场行为。不关注员工成长的企业,也不值得员工的忠诚。
每个人的成长际遇不同,可能并不是所有的朋友都能在自己成长的关键期得到合适的机会,所以平台的选择至关重要, 如何选择好的平台,这又是另一个话题,值得我们单开一章来细说分解。
一起踏上财务自由之路