一个人寻求知识总是很痛苦的,如果有良师益友相伴,那将会事半功倍。从菜鸟程序员到高级架构师,需要走几步路?要成为别人可以依赖的技术专家,需要付出多大的努力?本文将为大家带来一份程序员发展路径图,但你要知道,世界上没有放之四海而皆准的真理,具体问题要具体分析,实践才能出真知。
建筑师的“内在技能”
《从零开始学建筑》专栏已经全面更新,在专栏里给大家讲述我完整的建筑设计方法论,包括建筑设计的概念、原则、步骤、技巧、模式等等,这些内容都是我多年学习、实践、思考的精华。《王婆夸》说专栏相当于一本《九阳真经》,如果按照武功秘笈的方法去练,自然比站在村口大树下打木人效率高很多。不过,要成为高手,光会招式是远远不够的,更重要的是内功和判断力,能够一眼看出对手的弱点或破绽,知道“什么时候用什么招式”,“遇到什么对手用什么招式”才更重要。
以架构设计原则中的“适用性原则”为例,专栏讲了架构设计应该如何遵循“适用性原则”,不做过度设计。这一点非常关键,可以避免在架构设计时盲目超前设计。但是,我们在设计具体的架构时,到底什么是“适用性”呢?专栏无法给出一个明确的、可以放之四海而皆准的标准,因为“适用性”和很多因素有关:业务发展、团队规模、技术实力、领导喜好等等。这时候,什么是“适用性”,就取决于架构师的“内在实力”。很有可能在同一个团队中,架构师A认为解决方案X适用,架构师B认为解决方案Y适用。原因就在于不同的架构师“内在实力”不同。
我认为,架构师的内功主要包括三部分:判断力、执行力、创新力。简单的解释如下:
判断力:准确判断系统复杂程度的能力,就像武术大师能准确地找出对手的缺陷和弱点一样。
执行力:能够运用适当的方案解决复杂问题,就像武术大师能够选择正确的动作或方法打败对手一样。
创新:能够创造出解决复杂问题的新方法,就如武术的世界里,较小的创新就是创新的动作,而武术大师可以创造出新的武术或心法,比如张三丰创造了太极拳。
所以,要成为一名优秀的架构师,需要不断提升自己这三个方面的内在能力,而这三种能力主要来源于经验、视野、思维。
经验:架构师设计的系统越多,系统越复杂,内功就越强。无论是成功的架构还是失败的架构,无论是踩坑的经验还是填坑的经验,都会成为架构师内功的一部分。
视野:掌握的知识和技能越多越深,建筑师的内在力量就越强大。可以借鉴别人的经验,站在巨人的肩膀上看得更高更远。
思考:经验和视野是外界的输入,类似于我们吃的食物,但光吃了还不够,还需要我们去消化,把它变成自己的营养,这就是思考的作用。思考可以把经验和视野中的规律、判断、选择、技巧等提炼出来为己所用,思考也能促使我们产生新的想法和灵感。
结合上面的分析,从程序员到架构师的成长之路,总体的指导原则就是:积累经验、开拓视野、深入思考。遵循这个总体原则,我们来看看从程序员到架构师的成长过程该如何实践。
我把程序员到架构师的技术成长路径分为几个典型的阶段:工程师-高级工程师-技术专家-初级架构师-中级架构师-高级架构师。虽然大体的指导原则都是一样的,但是具体的做法方法却有很大的不同。如果在正确的阶段采用了错误的方法,可能会出现事倍功半的问题。
工程师
阶段描述
成为一名合格的工程师需要1~3年的时间,典型特征就是“在别人的指导下完成开发”,这里的“别人”主要指“资深工程师”或者“技术专家”,通常资深工程师或者技术专家负责需求分析讨论、方案设计,工程师负责编码实现,资深工程师或者技术专家会指导工程师编码实现。
增长指引
工程师阶段是最原始的“基本技能积累阶段”,主要积累基础知识,包括编程语言、编程工具、各类系统的基本使用等。以 Java 后端工程师为例,工程师阶段需要积累的经验和技能有:
工程师阶段最好的学习方式是找到经典书籍,系统地学习,而不是遇到问题再上网搜索,然后解决问题。就拿Java来说,《Java编程思想》、《Java核心技术》、《TCP/IP协议》等大书一定要通读,即使其中很多内容并不适用于你现在的工作。
高级工程师
阶段描述
成为高级工程师需要 2 到 5 年的时间,典型特征是“独立开发”,包括需求分析、方案设计、编码实现等。需求分析和方案设计已经包含了“判断”和“选择”,但范围比较小,更多的是在现有架构下进行设计。以 Java 后端工程师为例,高级工程师需要完成的工作包括:
增长指引
从普通工程师成长为高级工程师,需要“积累解决方案设计经验”,简单来说就是业务目前使用到的相关技术的设计经验。以高级 Java 后端工程师为例,这包括:表设计经验、缓存设计经验、业务流程设计经验、接口设计经验等。当接到业务需求时,高级工程师可以结合这些设计经验,最终实现业务需求。
高级工程师阶段与工程师阶段有两个典型的区别:
关于技术深度,我的建议是系统地学习,包括看书和研究源码。比如研究Java虚拟机,可以读《深入理解Java虚拟机》,研究MySQL,可以读《MySQL技术内幕:InnoDB存储引擎》,研究Memcache,可以读它的源码。
至于设计理论,由于涉及的点比较多,没有一本书能涵盖这么多的设计点,所以我们更多的是依靠网上搜索资料来学习。那么我们如何知道哪里有设计理论呢?简单来说,就是假设每个设计环节都有设计理论,然后用这个假设去搜索验证,看看是否真的有熟悉的设计概念。
技术专家
阶段描述
成为一名技术专家需要 4 到 8 年的时间,典型特征就是“某一领域的专家”,一般来说,只要是这个领域的问题,技术专家都能解决。例如:Java 开发专家、PHP 开发专家、Android 开发专家、iOS 开发专家、前端开发专家等。通常“领域”的范围不能太小,比如我们可以说“Java 开发专家”,但不会说“Java 多线程专家”或者“Java JDBC 专家”。
技术专家与高级工程师的一个典型区别是,高级工程师主要在现有的架构框架下完成设计,而技术专家则会根据需要对架构进行修改、扩展和优化。 例如,同样是 Java 开发,高级工程师关注的是如何优化 MySQL 的查询性能,而技术专家可能会考虑引入 Elasticsearch 来完成搜索。
增长指引
从高级工程师成长为技术专家,需要“拓展技术广度”,因为一个“领域”必然会涉及到很多技术层面。以 Java 后端开发为例,要成为 Java 开发专家,需要掌握 Java 多线程、JDBC、Java 虚拟机、面向对象、设计模式、Netty、Elasticsearch、Memcache、Redis、MySQL 等多项技术。拓展技术广度的常见方式有:
需要注意的是,拓展技术的广度并不代表只知道一个技术名词,而是要深刻理解每一项技术的原理、优缺点、应用场景,否则你就会成为传说中的“PPT技术专家”。比如以Java开发为例,知道Netty是一个高性能网络库是远远不够的,还需要学习Netty的原理,以及如何使用Netty开发高性能系统。
初级建筑师
阶段描述
成为一名初级架构师需要 5 到 10 年的时间,典型特征是能够“独立完成一个系统的架构设计”,可以是从 0 到 1 设计一个新系统,也可以是将架构从 1.0 重构到 2.0。初级架构师负责的系统比较简单,比如后端管理系统、某个业务下的子系统、100 万 PV 的网站等。
初级架构师与技术专家的典型区别在于,架构师在完善的架构设计方法论指导下进行架构设计,而技术专家则更多基于经验进行架构设计。简单来说,即使是同一个方案,初级架构师可以清晰地解释架构设计的理由和原因,而技术专家可能会选择某个设计方案,因为他们以前做过或者看过别人做过。
但在实际工作中,技术专家和初级架构师的区别并不是很明显,实际上很多技术专家其实承担的是初级架构师的角色,因为在系统复杂度比较低的情况下,架构设计的难度并不高,不同的备选方案最终都能很好的完成系统设计。比如设计一个日 100 万 PV 的网站,MySQL + Memcache + Spring Boot 就能很好完成,MongoDB + Redis + Nginx + php-fpm 也能很好完成。备选方案的设计和选择并不太难,更多的取决于团队熟悉哪种技术。
增长指引
从技术专家成长为初级架构师,最重要的就是形成自己的“架构设计方法论”。我的架构设计专栏其实讲的是完整的架构设计方法论,包括架构设计的目的、架构设计原则、架构设计步骤、架构设计模式等。类似的架构设计方法论还有《合适的软件架构:风险驱动的设计方法》和《领域驱动设计》。
形成自己的架构设计方法论,主要的手段有:
中级建筑师
阶段描述
成长为中级架构师需要8年以上时间,典型特征是“能够完成复杂系统的架构设计”,包括高性能、高可用、可扩展、海量存储等复杂系统。比如设计比肩Kafka性能的消息队列系统、将业务改造为多点活跃、设计总共100人参与开发的业务系统等。
中级架构师和初级架构师的典型区别就是系统的复杂度,中级架构师面对的系统复杂度要高于初级架构师。以开源项目为例,初级架构师可能通过引入一个开源项目就能完成架构设计,而中级架构师可能发现其实并没有合适的开源项目,需要开发一个全新的项目。事实上,很多开源项目都是这样诞生的。
增长指引
从初级架构师成长到中级架构师的关键是“技术深度和技术理论的积累”,例如:
很多同学可能对此会有疑问,这些技术理论和技术深度不是应该在高级工程师阶段或者技术专家阶段积累吗?为什么说是中级架构师阶段的成长关键呢?主要原因是,即便在高级工程师或者技术专家阶段学习了这些技术,其实也很难理解透彻,更难有机会去应用,很多时候只是知道有这个技术点而已;而到了中级架构师阶段,面对一个高度复杂的系统,很多时候就是几个关键的技术细节决定了整个架构设计的成败,或者某种设计方案在理论上是行不通的。如果没有对理论和相关关键技术点的深入理解,是很难设计出优秀的架构的。
就拿我做过的多站点双活设计来说,我很早就知道CAP理论,但只知道几个概念,在真正做多站点双活的时候,一开始走了很多弯路,想做一个完美的多站点双活系统,最后发现这其实是不可能的。有一天我突然意识到CAP理论已经明确指出了这一点,但在我刚开始学习CAP理论的时候,很难有这么深刻的理解。
高级建筑师
阶段描述
成为一名高级架构师需要花费10年以上的时间,其典型特征是“创建新的架构模式”,例如:
高级架构师与中级架构师的典型区别就是“创造力”,高级架构师可以创造出新的架构模式,开辟新的技术趋势。
增长指引
坦白说,对于如何从中级架构师成长为高级架构师,我并没有太多的指导。一个原因是我目前认为自己最多只能算是中级架构师。另一个原因是,一旦涉及到“创造力”,它其实和艺术挺像的。创造力其实很难学,也很难被老师传授。它更多的是一种天赋,或者在某个场景下灵感的迸发。
参考科技界的几个创意架构案例,我总结了可能催生创意架构的几个背景条件:
总结
关于如何在专业领域进步,有一个著名的“一万小时定律”。简单来说,想要成为某个领域的顶尖专业人士,需要不断练习一万小时。比如小提琴、足球、象棋、围棋等领域,无一例外都遵循这个定律。我认为技术人员的成长也基本遵循这个定律。在这篇文章中,我试图提炼出一条通用的成长路径供大家参考,但其实最重要的是技术人员对技术的热爱和持续的投入,包括学习、实践、思考、总结。
最后你可以统计一下自己从头到尾认真读过的技术书籍有多少,系统学习过多少个开源项目,然后自我评估一下自己目前处于一个什么水平,看看有什么发现?
特殊福利
订阅专栏,一次性获取完整专栏,另加一份《架构师成长技能图集》
老用户每邀请一位好友购买,即可获得24元现金返还,不设上限、可立即提现。
用户交流群已开通,新老用户均可申请入群,申请方式请扫描二维码查看专栏介绍。
今日推荐文章
点击下方图片即可阅读
Netflix 在高系统可用性方面的经验