天天说架构师,到底什么样的程序员能称为架构师?
我曾问过很多自称热爱代码的程序员的发展规划,大多都回答说期望成为一名架构师。而在招聘一方,有的团队会过滤掉多次提起架构一词而一点不提具体内容的简历。可见,虽然在大多数程序员眼里,架构师是神圣的,但又不得不承认事实是:“架构”和“架构师”是最常被滥用的。那些写能 PPT 而不能写代码的人,只做和事佬而不考虑软件快、稳、便捷的人,都称不上做“架构”更别提“架构师”。
那么什么样的人可以称为“架构师”?
据称架构一词源于建筑行业,架构师这个职位,不管是前端还是后端,职责是相同的。而用规划一次房屋的装修来描述架构师这个职位的职责是非常合适的。
建立一套 Web API 就像在定装修风格。要选择注重重 CRUD 的 RESTFul 式,还是请求自定义性更强的 GraphQL 式,又或者是简单的 JSON-RPC 式,这就像装修风格是选要简洁的日式、粗犷的美式还是奢华的欧式。定方向和选型这件事无处不在,架构师必须根据实际需求,做各种决策,为后面各部分整体结合打好基础。
灯光、墙面、家具等各个部分都需要根据风格精心设计、执行和不断修正,才可能达到原定目标,架构也一样。拿光线控制来说,施工人员可能会忽略你注重的一些细节:暖色的书房氛围;明亮且能切到影院模式的客厅;装在合适位置才不会刺眼的背景灯。在每个环节的执行上,架构师既要设计,又要保证对每个角色充分理解,必要时不排除动手编写重要环节的功能,而在经验或考虑不足的点上一旦出现问题就必须迅速调整。空有一个好的设计而没有好的执行,是非常让人惋惜的。
值得一提的是,选用最好的卫浴用品、最贵的过滤器并不是获得最佳洗浴室体验的关键点。同样,软件架构并不是说把每个部分做到最好再拼凑起来就能达到佳效果。最好洗浴室体验的关键点在于折中和妥协。例如,在水压不是特别高的情况下,把过滤器安装在总闸虽然能让用水达到最健康的状态,但会导致淋浴的水压不够,进而使体验大打折扣。把过滤器安装在厨房出水口可能是最佳的平衡,既保证水压又保证了用水的健康。分成多个部分是解耦,而协作的平衡是内聚。低耦合、高内聚是架构师处理软件各部分协作的终极目标。
装修有很多细节,例如,若不喜欢晾衣服且生活在有“黄梅天”的上海,可选洗烘一体机;房子面积不大,可选扩展型家具;对通风质量要求比较高,可安装新风系统。软件架构也需要考虑很多细节,例如客户需求、实际环境、技术可用黑科技之类、安全、重用、扩展等。而这些细节方面的考虑,并不是一个刚入门的新人能做到的。
总的来说,称得上架构师的人,必须是具备丰富系统设计经验且能保证设计执行的设计师和决策者;必须参与设计、开发执行和测试但又不局限于一个角色。也许架构师并不一定全是这样,这仅代表个人看法和期望。
Java 架构师需要会的技能
既然 java 架构师,首先你要是一个高级 java 攻城尸,熟练使用各种框架,并知道它们实现的原理。jvm 虚拟机原理、调优, 懂得 jvm 能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池...:;java 反射技术,写框架必备的技术,但是有严重的性能问题,替代方案 java 字节码技术;nio,没什么好说的,值得注意的是 "直接内存" 的特点,使用场景;java 多线程同步异步;java 各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如 hashmap 的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用 api 而已, 离会用还差的远。
熟练使用各种数据结构和算法,数组、哈希、链表、排序树...,一句话要么是时间换空间要么是空间换时间,这里展开可以说一大堆,需要有一定的应用经验,用于解决各种性能或业务上的问题;有时间再补充。
熟练使用 linux 操作系统,必备,没什么好说的 。
熟悉 tcp 协议,创建连接三次握手和断开连接四次握手的整个过程,不了解的话,无法对高并发网络应用做优化; 熟悉 http 协议,尤其是 http 头,我发现好多工作五年以上的都弄不清 session 和 cookie 的生命周期以及它们之间的关联。
系统集群、负载均衡、反向代理、动静分离,网站静态化 。
分布式存储系统 nfs,fastdfs,tfs,Hadoop 了解他们的优缺点,适用场景 。
分布式缓存技术 memcached,redis,提高系统性能必备,一句话,把硬盘上的内容放到内存里来提速,顺便提个算法一致性 hash 。
工具 nginx 必备技能超级好用,高性能,基本不会挂掉的服务器,功能多多,解决各种问题。
数据库的设计能力,mysql 必备,最基础的数据库工具,免费好用,对它基本的参数优化,慢查询日志分析,主从复制的配置,至少要成为半个 mysql dba。其他 nosql 数据库如 mongodb。
还有队列中间件。如消息推送,可以先把消息写入数据库,推送放队列服务器上,由推送服务器去队列获取处理,这样就可以将消息放数据库和队列里后直接给用户反馈,推送过程则由推送服务器和队列服务器完成,好处异步处理、缓解服务器压力,解藕系统。
想学习以上技术可以加入 JAVA 高级架构:705127209 群里面有阿里,百度,点评,架构师直播指导,针对工作 1--5 的 Java 程序员提升自己,还有架构学习资料,jvm,手写 springmvc,分布式,高可用,高性能,数据结构,springcloud,springboot 获取。
以上纯粹是常用的技术,还有很多自己慢慢去摸索吧;因为要知道的东西很多,所以要成为一名合格的架构师,必须要有强大的自学能力,没有人会手把手的教给你所有的东西。
想成为架构师不是懂了一大堆技术就可以了,这些是解决问题的基础、是工具,不懂这些怎么去提解决方案呢?这是成为架构师的必要条件。
架构师还要针对业务特点、系统的性能要求提出能解决问题成本最低的设计方案才合格,人家一个几百人用户的系统,访问量不大,数据量小,你给人家上集群、上分布式存储、上高端服务器,为了架构而架构,这是最扯淡的,架构师的作用就是第一满足业务需求,第二最低的硬件网络成本和技术维护成本。
架构师还要根据业务发展阶段,提前预见发展到下一个阶段系统架构的解决方案,并且设计当前架构时将架构的升级扩展考虑进去,做到易于升级; 否则等系统瓶颈来了,出问题了再去出方案,或现有架构无法扩展直接扔掉重做,或扩展麻烦问题一大堆,这会对企业造成损失