程序员,练就哪些技能才胜任架构师?

系列前序文章索引:html

  1. 程序员为何必需要懂架构?
  2. 架构究竟是什么,你知道吗?
  3. 架构都有哪些,我该怎么选?
  4. 架构师都干什么,你知道吗?

 

架构师,咱们程序员打怪升级的主要方向,它不像某些技能报个培训班就能得到。胜任架构工做须要具有许多技能,既有硬技能还有软技能。俗话说:一口吃不成胖子。从程序员到架构师也没法一蹴而就,它是一个按部就班、稳步提高的进阶过程,每一个阶段都有每一个阶段要掌握的技能,多项技能之间还存在前后顺序。若是想尽快转型升级至架构师,那你必须在平常工做中有意识地储备这些技能,接下来老兵哥结合亲身经从来分享一下:程序员

架构师之硬技能

  • 1. 硬技能

不像产品、管理等条线更加倚重通用技能,从技术条线转产品或管理,入门相对容易一些。但从产品或管理很难转型至架构,架构师必须从开发测试岗作起,在工做中不断提高专业技能和积累实践经验,从一个模块开始,到一个子系统,再到整个系统,最后到多个系统,这是一个按部就班提高硬技能的过程,也能够当作构建架构师硬技能“点线面”。面试

  • 1.1 点

老兵哥我刚入行时的岗位就是开发工程师,跟其余几个毕业生一块儿被安排在自动化测试平台项目组,整个系统由部门资深同事设计的,咱们分别负责开发其中某个子系统的几个模块。这个阶段我主要关注函数、类和模块这个粒度,为了作好工做我要钻研编程语言 C/C++,以及熟悉 Visual C++ MFC、Socket 等代码库的使用。每周咱们还会举行代码评审会议,邀请同事点评本身写的代码,那时候的本身年轻气盛,无论收到正面或负面的评价都会极大地激励本身。通过这个阶段的历练,个人编程技能得以较大的提高,也养成了较规范的编码习惯,掌握了如何设计好一个函数、类和模块。编程

这个项目先后作了两年左右时间,后面半年还作了些系统推广培训相关的事情。随后,咱们又启动了采用脚本语言 Python 做为自动化测试脚本的自动化测试脚本,在这个项目我负责预研 Python 脚本解释引擎和开发测试代理子系统,这段项目经历让我跃升到子系统这个粒度。我须要考虑这个子系统在整个系统当中须要承担什么职责,以及跟其余子系统或被测系统之间的交互机制。同时,我还要负责这个子系统设计,肯定它由哪些模块构成、每一个模块内部包含哪些类等。浏览器

这个阶段让我具有了构建单个子系统的能力和信心,在后面的工做当中我还使用不一样类型的编程语言构建过许许多多不一样类型的子系统,但其实都是在强化构建单个点的能力,关联技能树包括:操做系统、编程语言、应用容器、开发框架、多线程等。缓存

  • 1.2 线

对于稍具规模的系统,它都免不了要划分红几个子系统,子系统之间或者与外部系统之间就须要链接通讯,这至关于把两个孤立的点链接起来,即连点成线。这个过程跟开发单个子系统所须要的技能有所不一样,它须要网络编程相关的知识技能。在老兵哥我刚参加工做的那些年,Web 应用尚未成为主流的应用形态,浏览器/服务器(B/S)架构尚未兴起,HTTP 协议还没有被普遍使用,当时最流行的就是客户端/服务器(C/S)架构,IP/TCP 才是最主要的通讯协议,我就是在这个阶段积累下网络编程相关知识技能的。安全

最先咱们要开发客户端或服务器程序,就须要熟悉掌握 Socket 网络编程,包括绑定监听端口、接受链接请求、并发处理请求等,从无到有所有本身编写,这些经验对于我后来理解网络通讯机制有很是大帮助。为了知足子系统之间的交互需求,咱们要基于 IP/TCP 协议来定制专门的应用层协议,包括制定报文头和报文体两层结构,虽然比 HTTP、FTP、SMTP等协议要简单,但这段经历让我对 HTTP 这类应用层协议的实现原理有了深入的理解。另外,咱们还要考虑报文内容过长时的分包组包、网络发生异常时的丢包重发,以及报文内容的编解码等。服务器

所以,有志于在技术线发展的程序员都有必要补上这块技能。在近十五年的技术从业生涯中,老兵哥我前先后后解决过无数现网问题,其中有许多复杂的问题都跟系统交互通讯有关,借助各类网络抓包分析工具抽丝剥茧,最后定位问题的根源都是没有正确使用网络协议,因此我很庆幸本身在过往的工做中有这段经历。微信

随着互联网的蓬勃发展,Web 应用成了最主要的应用形态,与此同时 HTTP 这种更人性化的网络通讯协议成了最受欢迎的交互协议。从开发客户端/服务器(C/S)应用转到开发浏览器/服务器(B/S)应用的过程当中,老兵哥我专门花时间学习了 HTTP 协议,了解其运行原理和控制机制,尤为是协议头中每一个字段做用,包括请求方法、编码格式、超时机制、缓存机制等。印象最深入的就是 Roy Thomas Fielding 博士发表了 REST 的论文《Architectural Styles and the Design of Network-based Software Architectures》,即《架构风格与基于网络的软件架构设计》,让我对 HTTP 有了全新的认知,这些知识技能对于理解掌握云计算时代的服务化架构很是有帮助。网络

除了 IP/TCP、HTTP 这两类协议以外,老兵哥我以为还须要掌握消息队列(Message Queue)相关的协议,这类型协议更适合构建事件驱动架构的系统,不只仅支持同步还支持异步。我曾经负责一个移动互联网的系统,其中有个子系统负责维护各类手机终端型号和设备信息,合做伙伴须要从这个子系统及时地获取最新信息,最初咱们用 HTTP 协议轮询拉取的方式实现,但随着合做伙伴数量和信息更新频次的增长,这种信息同步机制就遭遇瓶颈了,后来咱们经过引入消息队列中间件优雅地化解这个问题。

  • 1.3 面

从点、线开始修炼,随着连线愈来愈多,最终将会造成平面,即分布式系统,这是咱们程序员通往架构师路上必然通过的站点。刚开始咱们仅仅利用互联网来发布搜索信息,接着咱们的即时通讯和社交也搬到了网上,再后来购物差旅等事情也能够经过互联网来完成了,如今跟咱们衣食住行相关的全部事物都开始被互联网化了,这至关于虚拟世界被构建的愈来愈庞大越复杂。原先咱们开发的软件系统复杂度仍是有限的,它自己顶多被划分红几个子系统,须要关联交互的外部系统数量也很是有限。但随着业务愈来愈丰富,单个系统的复杂度也急剧增加,与之关联的外部系统也很是多,逐渐演变成一张纵横交错的网,也就是咱们所说的“面”。如何在这样复杂的网络当中维护好复杂度,以及确保系统依旧知足易用性、性能、可靠性、稳定性、安全性等质量属性,这就须要程序员修炼分布式系统相关的技能。

老兵哥我在从事移动互联网相关系统研发的过程当中遇到了更高复杂的场景,当时咱们要构建一个苹果应用商店相似的生态体系,咱们负责的系统自己由六七个子系统组成,它还须要跟许多上下游合做伙伴的系统对接交互。若是跟每一个外部系统的对接都采用各自不一样的标准,随着接入系统的数量愈来愈多,那对接相关的复杂度最终走向失控。另外,像应用订阅购买等典型业务场景都须要多个系统协做完成,其中涉及到分布式事务,怎样保证数据一致就是很大的挑战。按照常规逻辑,随着系统的复杂度不断提高,那么系统出现问题宕机的几率就会提高,但对于用户来讲,他们依旧但愿系统能够提供 7*24 小时的服务,不要出现服务超时或失效等异常状况,这就是“面”带来的挑战。

从那个阶段开始,我有了学习和实践分布式架构的机会。最先就是面向服务架构 SOA,即 Web Service、SOAP 等技术标准,站在如今回看那时候,这套技术栈是偏重偏繁琐的,但当时分布式系统对于整个业界都是全新的挑战,这套解决方案是由 Compaq、HP、IBM、Lotus、Microsoft、SAP 这些传统软件巨头们提出的。它经过 Web 服务描述语言 WSDL 来标准化分布式系统中的每一个服务,再经过简单对象访问协议 SOAP 来规范服务之间的交互,从某个角度来看,越大规模的协做必须依赖统一的标准和规范。

但传统软件巨头不多有在互联网第一线实践的经验,不像 BAT 他们对互联网分布式系统的挑战有那么真切的感觉,阿里巴巴就在实践中孵化出了比 Web Service、SOAP 更加轻量化的 Dubbo,它也是依托面向服务架构 SOA 这套理论,只是是线上更加接地气。这段工做经历让我对分布式架构有了体系化的认知,虽然近些年分布式技术从面向服务架构 SOA 演进至微服务架构 MicroService,技术中间件从 Dubbo 更替为 Spring Cloud,但我依然能够套用这套知识体系去理解新技术。

 

  • 2. 软技能

软硬技能究竟是怎么区分呢?老兵哥我以为一我的靠哪门手艺吃饭,那么这门手艺相关的技能就是硬技能,而辅助硬技能产生更大价值的技能就是软技能,这跟“T”字型人才的要求相似,既要求有足够精湛拔尖的主攻技艺,也要有各式各样的综合技能。硬技能很重要,这点我相信没有人会反对,但也有很多人意识不到软技能的重要性。对技术人来讲,从开发到架构,从架构到 CTO,或者从开发转产品或管理,无论是晋升仍是转型,咱们都是在增强硬技能的同时提高软技能的比重,甚至原先的硬技能变成了软技能,而原先辅助做用的软技能却成了硬技能。接下来,我将结合我的从开发转型架构的经从来谈一谈哪些软技能很重要:

  • 沟通:相对于开发工程师,架构师的工做职责决定了他须要对接更多上下游客户,对沟通技能的要求就要高不少,毕竟不一样角色的思惟模式和立场角度各不相同,架构师必须懂得采用不一样方式跟这些角色沟通互动,换位思考,从而挖掘到真实的需求,而后利用专业技能平衡好各方需求,最终输出各方都满意的架构方案。
  • 写做:作开发岗时,个人主要输出就是代码。虽然偶尔也要写一些技术文档,但一般是供本身看的技术文档或者凑数用的产品操做使用说明。在转型作架构以后,我写代码的比重下降了,为了让各个干系人理解承认个人架构方案,除了口头说明以外,最主要就是靠技术写做,写给他人看的文档跟纯粹记录的彻底不一样。
  • 设计:无论是口头沟通仍是文档传播,语文或文字功底再好,也抵不过搭配上设计图例,图例中包含的信息是多个维度的,也更加直观易懂。一般,我习惯在写技术文档以前先把设计图画出来,画设计图的过程就是理顺思路的过程,在此基础上再来组织文字或语言变得更加简单容易,至关因而看图说话了。
  • 演讲:权力和非职权影响力,架构师开展工做主要依赖于非职权影响力。架构师跟各个干系人之间不存在上下级关系,要让团队及合做伙伴承认并执行你的架构方案,你必需要靠本身的专业能力让对方信服。在以往学校教育或成长过程当中,我自己是缺少这方面的积累的,为了成功转型架构师我刻意训练提高本身这方面的能力。

总结起来讲,为了在架构师这个新平台上作好工做,咱们须要提高本身输入、设计和输出等方面的能力。以往咱们从外界获取信息主要靠阅读文档,如今还要增强立体多方位的沟通。在输出方面,以往咱们的输出形式太过单一,如今咱们要掌握文字、演讲等多媒体方式。固然,最核心的仍是架构设计的专业技能,这个输入输出的中心。

 

  • 3. 知识体系

今天先分享到这里,老兵哥后续还会分享程序员到架构师的进阶指南等,包括每一个阶段须要掌握的软硬技能图谱(如题图所示),文字提纲能够参考文章《从程序员到架构师,有捷径吗?》。若是你对这个主题感兴趣,千万要记得先关注哦!坚持原创不易,若是你以为有价值,麻烦动动手指点下文 「 推荐 」按钮,让更多小伙伴能够看到,老兵哥会更有动力坚持分享的。另外,我后续还会分享职业规划、应聘面试、技能提高、影响力打造等经验,欢迎 关注 本专栏或歪信公主号 「 IT老兵哥 」

 

 

微信公众号「 IT老兵哥 」

关注「 IT老兵哥 」,赋能程序人生!

 

  • 软技能-热门文章:(首发公众号)
  1. 如何在打造影响力的路上「码」不停?
  2. 2020 来了,你的 2019 晒好封存了吗?
  3. “花式”裁人套路深,你知道吗?
  4. 遭遇裁人,如何渡过心理危机?
  5. 程序员“求包养”攻略揭秘

 

 

  • 硬技能-热门文章:
  1. 如何设计出优美的Web API?
  2. 程序员必须掌握的性能调优 X Y Z 
  3. 如何把单体式应用拆解成微服务?【上】
  4. 如何把单体式应用拆解成微服务?【下】
  5. 图解 Spring:HTTP 请求的处理流程与机制【1】