为何90%的“码农”作不了软件“架构师”?

写代码和作架构是两个不一样的事情。前端

什么是架构师,架构师要作什么事情,为何Java的领域里,会更注重架构师?

很早很早以前,我对于架构的概念一点都不理解,依稀记得,架构( architecture)这个词,来自于建筑领域。程序员

这对于我这个没写过几行代码的人来讲,瞬间就有了一种“不明觉厉”的崇拜感。算法

架构,感受好厉害的样子,从名称上来讲,好像是设计根骨,设计底层,设计最核心的东西的人。sql

架构师,必定很NB,我何时能成为架构师呢?数据库

后来懂了一点点代码,去写增删改查,更是体会不出来架构的概念,不就是Sql语句吗?明明DBA更厉害啊,作各类的慢Sql优化,全部的Sql都要让DBA审核,DBA对于Mysql,或者是Oracle的各类性能调忧很厉害,而熟悉业务的开发人员又经常能写出几万行的SQL语句。编程

我看到这些头都要炸了好么?设计模式

什么是架构

因此,倒底什么是架构?整个系统只有一个WEB,Spring MVC+Spring+Hibernate搞定一切,开始作需求分析,实际上就是设计表结构而已,剩下的就是查查查,改改改,删删删。缓存

直到某天,我知道一个词,缓存。安全

缓存这玩意儿,在很早以前学习各类基础课程的时候,了解过一些,一级缓存,二级缓存什么的,LRU我好像也懂一点点,可是,在系统里,缓存算是什么?性能优化

在公司里,那个架构师,画了一张图,告诉咱们,这台机器上,放了一个Memcache,然而咱们都不懂,他只解释了一句,这个Memcache是缓存。

个人第一个困惑就是,全部的请求都要再次转发到另外一台机器上,把数据取出来,单个请求可能不算什么,天天有几十万次请求,这中间的损耗不大么,为何不把Memcache放到本地机器上呢?

他没解释,只告诉我说,不大,Memcache就是要放在另外一台机器。

在当时,我不清楚内网和外网的差异,也不清楚访问Memcache的请求倒底是须要多少MS,更不理解,把Memcache放在和业务层一台机器,或者是分开放的差异倒底是什么。

但这个问题一直困惑着我,简单来讲,这其实算是一点点架构师要作的事情的萌芽,一个系统中,若是拆解出来了不少模块,倒底应该部署在哪些机器上?架构师会解决这些问题。

 

后来,到了搜狐以后,我忽然间发现了我以前学到的东西,在搜狐的技术大神面前,直接被轰成渣。

负载均衡是什么?热备又是什么?

穿透DB是什么意思?怎么我取数据库里取一个值,数据库里没有,这种空数据的请求会把DB打跨?我还要把这些为Null的请求单独缓存起来?

本地缓存作为一级缓存,Memcache作二级缓存?

“对缓存来讲,最关键的设计就在于失效策略是什么。”大神镇定的看着我。

我很惶恐,感受能把失效策略设计出来,很不容易。

不一样的应用场景,对于缓存的要求不同,对实时性的要求也不同。榜单这种一天更新一次的,天天晚上定时生成一次就行了。后台更新,可是要注意,必定要直接生成,直接切换,不能让前端用户访问的时候,再去生成。

对于名字这种东西,用户改完以后,必须马上更新缓存,包括本地缓存和远程缓存。

 

这算不算架构中的一部分,根据不一样的应用须要,去设计不一样的策略,同时把这些场景规范化,成为一整个团队都要去遵循的标准?

 

我不知道,我只知道,能Hold住团队里全部人的那我的,技术必定很是NB,团队里的每个人,都会质疑,若是你Hold不住全场,怎么能推行下去?

当时近30的技术团队里,每个都是神同样的存在啊,谁能Hold住30多个神。

 

并且,原来不该该把全部的代码放到一个WEB里,原来分布式是这么回事儿,原来一个系统,是由多个子系统构成的,原来还要分层,原来封装和抽象是这么个意思。

WEB层是一层,一般能够经过LVS部署两台到三台,或者是更多的,Service一层用来处理业务逻辑,缓存层用来扛并发,必定要藏在Service里面,Controller调用Service的时候,并不须要知道,数据倒底从哪来的,每个Service使用什么样的缓存策略,彻底不须要Controller层知道,持久化,对,对于大型应用来说,Mysql只能用作是持久化,Mysql的单条访问速度并不查,只是在并发能力太差,扛不住。可是,有可能数据量过亿啊?

 

过亿怎么办?是用分库,仍是分表?读写分离要不要作?一台服务挂一台数据库,哪些数据库应该放在一个实例里,哪些应该单独拆出去?每台服务器的配置是什么?

我大概知道一点点,架构师要作哪些事情,他就是要把这些大的骨架定好,而后咱们去填充里面的内容。若是骨架定歪了,其他团队必然跟着歪。

 

这时候有了一系列的问题,第一个,Controller和Service之间,Service和Service之间,应该经过什么调用?

RMI,这是唯一的选择。用thrift,或者是ProtocolBuffer,或者是Rest实现的RPC?

 

这是架构师要考虑的事情,若是是用RMI,咱们是要本身实现,仍是要找找是否有好用的开源的框架,在其余的系统里被证实了是有用的?

大神们花了两周的时间,对当时流行的开源框架过了一遍,最终选定了Tuscany,到如今我都以为设计精美,完暴Dubbo的东西,真的是一点都不想切到Dubbo上去,毕竟“曾经沧海难为水,除却巫山不是云”。

 

直到最近几年微服务兴起的时候,我仍是一样的目瞪口呆,这跟2009年搜狐当时作白社会的架构比起来,优点倒底在哪里?差异好像没有那么大啊,并且Tuscany实现的更完美,只是使用的时候要有更强的约束,由于Tuscany太强大了~强大到有一点点重,必需要作简化,并且,Tuscany的开发团队不怎么维护了,白社会当时作的东西,仍是大神花了两周的业余时间写了一个Scallop,增长了Tuscany的负载均衡的功能。

可是,倒底用什么,不用什么呢?除了Tuscany,还讨论过要不要用Hadoop,要不要用ActiveMQ,要不要用Erlang。

每个技术框架的选择,都通过讨论,验证,测试,最终在全团队里推行。

架构师须要的能力

这是否也是架构师的职责?这个架构师太厉害了,他须要从前到后都要懂,他须要制定关键的技术细节,他须要给出最佳实践,他须要了解业界全部流行的解决方案,他须要去猜想Facebook怎么解决问题的,Twitter怎么解决问题的,Google怎么解决问题的,这些解决方案可不能够拿过来,也一样适用于咱们本身的场景。

 

他须要精通分布式,Nginx或者是F5,微服务,缓存,持久化,消息队列,他须要熟悉全部这些技术细节里的最经常使用的解决方案,不能有遗漏,也不能够过分设计,他决定的不是他一我的喜欢的风格,他决定的就是整个团队,在项目死亡以前都必须遵循的规范,如今的团队成员,和将来的团队成员,都必须遵循的体系,并且,若是在将来,这些架构体系有不合理的地方,那就麻烦大了。

 

这样的架构师,还要肩负着一个重大的使命,修复开源软件的Bug。

在很早以前,我一直误觉得开源软件是很厉害的很NB的东西,我一直觉得这是完美的,好久好久以后,才明白,所谓的完美,都是用血和泪塑造而来的。

 

不通过各类各样的验证,环境,使用的测试,很难达到一个上线标准的稳定,即使是上线了,也有可能会出现以前彻底预料不到的问题。

但是,若是你选择了这个框架,出了问题,谁去解决?

 

架构师,他要开源码,理解这些开源框架的思路,而后去找有可能产生问题的地方,再去修复他。

 

我一直都以为,能看懂别人写的代码的人,都是神。

某段时间我去看一个heritrix,看的我神清气爽,各类层出不穷的继承,各类抽象类,连着三天我欲仙欲死,更加坚决了我死也不要,也不容许其余人在项目里使用继承的决心。

 

可是Heritrix从外表看起来特别牛,他的抓取策略也很NB,用的分布式抓取的解决方案很是轻巧。但是我我实在是不想再去读一次了,在当时不读不行,资料太少。

那么,一个架构师,要对这些源码都了解么?又或者是,他必须具有,须要他去读源码,他就必须读源码,并且去优化的能力?这大概比提早懂源码,更神奇。

 

由于是有时间要求的啊,简单来说,他须要在一个有效的时间内,去弄懂全部的底层的东西,说句实在话,当有同事嘲笑我都没有完整的看过TCP/IP协议详解的时候,我真的是无话可说的。

对于特别底层的东西,我确实了解的不够多,但是架构师们不同。

有了这些,就能够称之为架构师了么?

架构师须要懂业务么?是否是就能够天天看技术,写底层框架(好比咱们原来在搜狐用到的DAL,数据访问层,用起来简直是神器的东西)。

没有不懂业务的架构师,全部的架构,都依赖于业务。全部的架构师,也必需要去写业务代码,不把本身设计的东西,用在真正的项目里,恐怕他们本身都不会知道,这种架构设计的合理性在哪里。

在某团购公司上市以前,他们的CTO拿出来了他们的架构图给我看,在给我看以前,全部的技术术语都同样,可是当我认真看了架构图以后,个人困惑。。。。

为何Memcache要放在Controller层被调用? 不该该是放到Service层吗?

怎么会出现你说的,一个Serivce负责维护的数据,也有可能被另外的Service去更改的状况?每个Service对数据的操做,必须是独立的啊,除了这个Service,其余的任何服务都决不容许直接更改DB啊。

并且,怎么Service拆分了,DB不拆分呢?这样的话,压力大的DB会把全站拖跨的啊。

那张架构图我看到以后,感受本身的认知被突破了,原来能够这么作,原来一样的,相似的技术选型,能够作出来如此艰难的东西?

就在我觉得这其实就差很少是架构师的所有的时候。

在最近一段时间,我忽然间发现了一个问题。

为何有的人代码写的这么烂,不少写死的代码,一点儿灵活性都没有,更没有规范,彻底就是堆压。

为何有的人根本不知道怎么去抽象,并不清楚怎么样积累成公共组件,为何他们改一个问题,一般会引出更多的问题?

为何他们的代码里的实现方案,让人看完以后恨的牙痒痒,想改又彻底不能改,毕竟,正常工做的代码才是好代码?

很大程度上是由于,不少程序员,不懂的代码的扩展性,不会面向将来编程。

怎么叫作面向将来编程?

一个好的工程师,在听到需求的时候,能够根据本身的业务能力,判断出来这些需求中,哪些是有可能变化的,哪些是不太可能变化的。

针对这些变化的内容,在编写的过程当中,不会写死,而反复确认不可能会变化的需求,会写的简单一些,防止过分设计引发的复杂度。

简单说,当他拿到需求时,并不单纯是考虑这个需求怎么实现,还会考虑,本身设计的架构体系,扩展性在哪里,在他的眼里,看到的需求会被分解,折分,而后本身的技术方案,会挨个分解,分配。

在完成设计以后,他会很清楚的知道 ,本身设计的系统里,哪些变化是支持的,随便你改,我只须要改动一个很简单的内容,哪些是你绝对不能改的,你要改,我就必须花很大的代价,特别是在已经有线上数据的时候。

并且会拿着本身的架构体系跟PM沟通,讲清楚。

什么样的变化是支持的?短信通道是有可能变化的,而调用短信通道的地方可能会有点多,因此我必须把短信通道抽象,并封装在一个公共接口,若是须要更换短信通道,我可能只须要更改一个配置文件就行了。

那么什么样的变化是不支持的?我不须要不停机就更换短信通道的功能,除非你在后台系统中提早配置好,或者是有明确的须要,我作出这么一个东西出来。每每在前期,不会用到。

为何?

在创业初期,短信通道每每用于用户注册,一旦出问题,就是生死问题,必需要有一个备份,运营商一怒封掉你的通道,很常见。

而重启一次服务,在创业前期,每每没有那么严重。

因此,这些技能,是否是也应该概括到架构师的职责里去?

架构师从开始就要考虑选型,从语言开始,从业务开始,要对这个领域里的开源框架熟悉,了解,要能解决疑难问题,要懂安全,要会备份,要学会面向将来编程,还须要什么?

还须要DevOPS.

在持续集成的年代,在服务器规模愈来愈大,在云服务器的年代,在异地存储,冗灾,在全球化愈来愈快的年代。

运维的重要性已经到了一个很核心的程度了。弹性伸缩,自动扩容,灰度发布等等等概念,要求,都在冲击着架构师这个概念的定义。

若是说以前的架构师,更多的是在系统开发前,如今愈来愈偏于系统上线后。

还包括数据分析,日志分析,等等等等,对了,尚未提到Nosql DB,实时搜索,知识库,算法这一系列的东西。

每个领域都在细分,每个概念都在深化。

简单说,架构师确实和语言无关,可是又绝对和语言有关系。

你能够说,架构师就是在作选型,可是只会作选型,确定作不出架构师。

Java更须要架构师,由于他自己就是各类开源框架,不对这些框架了解的清清楚楚,你很难作出一个好的选择,而一旦架构被固定,实际业务人员的开发,又会变的简单不少。

说到了如今,我有没有讲清楚架构师是什么?

而你,还想要作架构师吗。

反正,我说本身是架构师的时候,个人心里是羞耻的,我知道 ,我远远没达到架构师的能力。


架构师成长路线

而后,我曾整理过一个中级工程师的发展路线。

一 :科班基础

1.计算机组成原理 

2.计算机操做系统 

3.计算机网络

4.数据结构 

5.数据库

6.算法

推荐阅读这份大牛整理的《程序员必知的硬核知识大全》

二 :语言相关

1.JDk

1.1 JDK

1.2 线程

1.3 Set

1.4 Hash

1.5 GC

1.6 ClassLoader

1.7 lambda

推荐阅读这份《Java JDK学习笔记》

三 :Spring

1.IOC

2.Spring

3.Spring MVC

4.Spring Boot

5.Shrio

初学Spring建议看视频,推荐这套《Spring源码100集》

四 :数据库

1.Mysql 基础

2.DB设计

3.DB调优

4.Mysql 底层架构

5.idcenter

6.经常使用工具

7.索引

推荐阅读两本书籍

  1. 第一本是MySQL经典著做《高性能MySQL(第3版)》;
  2. 第二本一位大牛的笔记《MySQL性能调优与架构设计》;

五 :架构

1.设计模式

2.缓存

3.分布式

4.Key-Value

5.消息队列

6.定时任务

7.微服务

8.RPC

9.高并发

10.性能优化

设计模式建议去实战,经过实战去理解,能够看下面这一套视频:

六: 项目规范

1.接口定义

2.日志规范

3.编码规范

4.最佳实践

推荐阅读《阿里巴巴开发手册》

七 :运维

1.Linux经常使用命令

2.JVM经常使用工具

3.Nginx

4.Resin

5.LVS

6.Iptables

7.Jenkins

8.Ansible

9.容器:dock

10.监控

11.CICD

运维这一块本人并无过深的去研究,只对这一份Linux手册爱不释手,此本笔记共1051页,无论是入门学习,仍是当个工具书都是个不错的选择

八 :经常使用算法

1.一致性哈希

2.gossip

3.paxos

4.Spotsig

5.https

6.MD5

7.auth2

8. Bloom Filte

9.编辑距离

10.TrieTree

11.rete

推荐阅读这本《算法乐趣》本书包含了大量的算法真题与思路解析,对于学习算法颇有帮助;

九 :源码解析

1.Spring

2.Redis

3.memcache

4.Mybatis

5.Log4j

6.Maven

7.Git

推荐同上

十: 开发流程

1.敏捷开发

十一 :场景解决方案

1.金融

2.支付

3.电商

4.直播

5.教育

6.O2O

7.分销

8.会员

9.活动

10.秒杀

Git网站上面有不少已经开源的优秀项目,在筛选了近百个项目以后推荐下面这六个优质商城项目;

十二: 思惟方式

1.自顶而下

2.分层模式

3.抽象

4.落地

5.推测

6.验证

7.组件

8.定制

9.生成


最后再说一下,为何不少程序员作不了架构师。

1 是刚开始就么有奔着这个目标去,比如是动做变形,反而很差纠正了。

2 是思惟没能提高一个台阶,只局限于具体的编码,没有考虑过选型,复用,扩展。

3 是身边没有架构师的引导和培养,环境问题是一个很大的问题。

虽然我我的也常常自嘲,十年以后要去成为外卖专员,但实际上依靠自身的努力,是可以减小三十五岁以后的焦虑的,毕竟好的架构师并很少。

架构师,是咱们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、我的努力(吃得苦、肯钻研)、天分(真的热爱)的三者协做的结果,实践+机遇+努力才能助你成为优秀的架构师。

若是你也想成为一名好的架构师,那或许以上这份学习路线与资料你须要阅读阅读,但愿可以对你的职业发展有所帮助。

也但愿你们可以经过本文提高本身的技术深度和广度,好适应将来社会的发展,不断地走出一条属于本身的人生道路!

以上全部资料已经打包完毕了,点赞此文后添加↓↓↓备注 【架构师资料】免费获取

点赞、点赞、必定要点赞呀!