1、大型互联网系统
特点
- 高并发:通过设计保证系统能够同时并行处理很多请求,响应时间、吞吐量,每秒查询率QPS,并发用户数等;
- 高可用:HA,高可用的核心是冗余,7*24不间断的服务
- 大数据:为了做用户画像,用户行为分析,实现精准操作
- 迭代周期短:越是大型的系统,越不能闭门造车,1到2周就需要产生一个迭代成果
- 用户量庞大:系统支持的用户服务
- 可持续发展:任何一个系统都需要不断升级
- 安全级别高:系统只要上线,用户量增大,访问量增大,安全就格外重要。后门,漏洞,XSS,CSRF
- 可弹性,可伸缩:流量是动态的,系统如果不能解决突发流量(如秒杀活动),就非常危险。
设计思想
- 解耦:MVC,项目解耦-逻辑流程上解耦,架构解耦-是基于业务的
- 集群:解决基础服务能力
- CDN:是一种加速的服务,按照流量收费,OSS
- 缓存:Redis,对我们核心数据库进行保护
- 分布式系统:解决单一节点的应用瓶颈
- 异步:Ajax, MQ
- 业务分离:按照业务进行拆分,然后相应团队进行维护
- 容灾:数据上的灾备,这个更重要。
我们要站在未来看现在,而不是现在看未来
找出自己的问题,然后记录下,慢慢改正
2、架构师的内功
主要包含三个部分:
-
判断力
能够准确判断系统的复杂度在哪里,就像武侠高手一样,能够准确的看出对手的破绽和弱点
-
执行力
能够使用合适的方案解决复杂度问题,就像武侠高手一样,能选择合适的招式或者方法打败对手,见招拆招。
-
创新力
能够创造新的解决方案解决复杂度问题,就像武侠世界里,创新招式如独孤九剑,武学宗师能够创立新的武学或者心法,如张三丰创立太极拳一样。
你要完整的体会过一个项目的诞生,就能锻炼上面三个能力
要成为一个优秀的架构师,就需要不断的提升自己这几方面的内功,这三方面的能力主要来源于经验、视野、思考。
-
经验
设计过的系统越多,系统越复杂,架构师的内功也就越强,不管是成功的架构,还是失败的架构,不管是踩坑的经验,还是填坑的经验,都将成为架构师内功的一部分。
-
视野
掌握的知识和技能越多、越深,架构师的内功也就越强,他山之石可以攻玉,站在巨人的肩膀上会看得更高更远
-
思考
经验和视野都是外部输入,类似于我们吃的食物,但光吃还不行,还要消化,将其变成我们自己的营养,这就是思考的作用。
思考能够将经验和视野中的模式、判断、选择、技巧等提炼出来为我所用。
思考能够促使我们产生新的创意和灵感。
结合上面的分析,从程序员到架构师的成长之路,总的指导原则是:积累经验,拓宽视野,深度思考
按照这个总指导原则,我们看看程序员到架构师的成长过程中,主要分为6个经典阶段:
工程师 -> 高级工程师 -> 技术专家 -> 初级架构师 -> 中级架构师 -> 高级架构师
## 3、打怪升级路线
工程师
阶段描述
成为一个合格的工程师需要1-3年时间,其典型特征是“在别人的指导下完成开发”,这里的“别人”主要是高级工程师或者技术专家。
通常情况下,高级工程师或者技术专家负责需求分析和讨论、方案设计,工程师负责编码实现,高级工程师或技术专家会指导工程师进行编码实现。
成长指导
工程师阶段是最原始的“基础技能积累阶段”,主要积累基础知识,包括编程语言、编程工具、各类系统的基本使用。
以java后端工程师为例,工程师阶段需要积累的经验和技能有:
- java语法,基本数据结构的使用
- Idea、Maven、Linux 命令行等各种工具
- 数据库crud,缓存的基本使用等
- 业务系统的基本流程
工程师最好的学习方法就是:找经典的书籍系统地学习,而不要遇到一个问题到网上搜索解决了事。以java为例,《java编程思想》、《java核心技术》、《tcp/ip 协议》这类大部头,一定要完整的看一遍。
高级工程师
阶段描述
成为一个合格的高级工程师需要3-5年时间(只是个大概,有些人可以通过学习快速达到),其典型特征是“独立完成开发”,包括需求分析、方案设计、编码实现。其中需求分析和方案设计已经包含“判断”和“选择”,只是范围相对来说小一些,更多的是在已有架构下进行设计。
以java后端工程师为例,高级工程师需要完成的工作包括:
- Mysql 数据库表如何设计,是设计成两个表还是三个表?
- 是否要用缓存,key/value如何设计(String,list,hash,set,zset),缓存的更新策略是什么?
- 产品提出的需求是否合理?是否有更好的方式来满足?
成长指导
从工程师成长为“高级工程师”,主要需要“积累方案设计经验”,简单来说就是业务当前用的相关技术栈的设计经验。
以java后端工程师为例,包括:表设计经验、缓存设计经验、业务流程设计经验、接口设计经验等。当接到一个业务需求的时候,高级工程师能够组合这些设计经验,最终完成业务需求。
比较
普通工程师和高级工程师阶段,有两个典型的差异:
-
深度
工程师知道How,高级工程师知道Why。如Java的各种数据结构的实现原理,因为只有深入掌握了这些实现原理,才能对其优缺点和使用场景有深刻理解,这样在做具体方案设计的时候才能选择合适的数据结构。
-
理论
理论是前人总结出来的成熟的设计经验,如数据库表设计的3个范式、常用的设计模式、缓存设计理论。
针对技术深度,我的建议还是系统的学习,包括看书和研究源码。例如,研究Java虚拟机可以看《深入理解Java虚拟机》,研究Mysql可以看《Mysql技术内幕:InnoDB存储引擎》
针对设计理论,涉及的点很多,没有一本书是能够涵盖到的,假设每个设计环节都有设计理论,然后带着这种假设去搜索验证
技术专家
可以通过努力达到,程序员需要有一定的活跃度,社区、公司、个人博客。目的:建立一些影响力
阶段描述
从高级工程师进阶到技术专家,更多的是思想和眼界的转变
成长为技术专家需要4-8年时间,其典型特征是“某个领域的专家”,通俗的讲,只要是这个领域的问题,技术专家都可以解决,如Java开发专家、PHP开发专家、Android开发专家、前端开发专家
高级工程师与技术专家的一个典型区别就是:前者主要是在已有的架构框架下完成设计,而后者会根据需要修改、扩展、优化架构。例如,同样是Java开发,高级工程师关注的是如何优化Mysql的查询性能,而技术专家可能就考虑引入Elasticsearch来完成搜索。
成长指导
从高级工程师成长为技术专家,主要需要“拓展技术宽度”,因为一个“领域”必然会涉及众多的技术面。
以java后端工程师为例,要成为一个Java开发专家,需要掌握Java多线程、JDBC、Java虚拟机、设计模式、Netty、Elasticsearch、Memcache、Redis、Mysql等众多技术。
研究业界的经验分享,如BAT等大公司的经验,可以通过参加技术大会的方式近距离了解。
拓宽技术宽度,是要深入理解每个技术的原理、优缺点、应用场景。以Java开发为例,知道Netty是个高性能网络库说远远不够的,还需要学习Netty的原理,以及具体如何使用Netty 来开发高性能系统。
初级架构师
阶段描述
成长为初级架构师需要5-10年时间,其典型特征就是能够“独立完成一个系统的架构设计”,可以说从0到1设计一个新系统,也可以说架构从1.0重构到2.0。初级架构师负责的系统复杂度相对来说不高,例如后台管理系统,某个业务下的子系统,100万PV量级的网站等。
初级架构师和技术专家的典型区别是:架构师是基于完善的架构设计方法论的指导来进行架构设计的,而技术专家更多的是基于经验进行架构设计。同样一个方案,初级架构师能够清晰的阐述架构设计的理由和原因,而技术专家可能就是因为自己曾经这样做过,或者看到别人这样做过而选择设计方案的。
但在实践工作中,技术专家和初级架构师的区别不明显,因为系统复杂度不高的情况下,架构设计的难度不高,用不同的备选方案最终都能较好的完成系统设计。
成长指导
从技术专家成长为初级架构师,最主要的是形成自己的“架构设计方法论”,包括架构设计目的、架构设计原则,架构设计步骤、架构设计模式(参考上一节课的文章),类似的架构设计方法论还有。架构师都是野生的,一定要有自己的实践经验。
要形成自己的“架构设计方法论”,主要手段有:
- 系统学习架构设计方法论,包括订阅专栏或者阅读书籍等
- 深入研究成熟开源系统的架构设计,技术专家阶段主要聚集于如何更好的应用开源项目,初级架构师聚集于学习其架构设计原理和思想,例如kafka的文档中就有关于消息队列架构设计的分析和取舍。
- 结合架构设计方法论,分析和总结自己团队、公司的各种系统的架构设计优缺点,尝试思考架构重构方案。如果在这个基础上真的能够推动架构重构,那就更好,能够实践自己的架构设计方法论,同时积累经验,又能够展现自己的技术实力,拿到成果。
- 多画架构图,多去了解不同的业务,4个层级的架构:业务架构、应用架构、数据架构、技术架构,6个维度:解耦、拆分、抽象、集成、复用、治理
中级架构师
大多数技术人员的瓶颈
阶段描述
成长为中级架构师需要8年以上时间,其典型特征是“能够完成复杂系统的架构设计”,包含高性能、高可用、可扩展、海量存储等复杂系统(大型互联网系统),例如设计一个和kafka性能匹敌的消息队列系统,设计一个100参与开发的业务系统等。
中级架构师与初级架构师的典型区别在于系统复杂度的不同。以开源项目为例,初级架构师可能引入某个开源项目就可以完成架构设计,而中级架构师可能发现其实没有哪个开源项目是合适的,而需要自己开发一个全新的项目,事实上很多开源项目就是这样诞生出来的。
成长指导
从初级架构师成长为中级架构师,最关键的是“技术深度和技术理论的积累”。如
-
技术理论,CAP、BASE 是异地多活的设计理论基础,Paxos是分布式一致性的基础算法,2PC两阶段提交协议和3PC三阶段提交协议是分布式事务的基础算法。
-
技术深度,kafka用磁盘存储还能高效是因为磁盘顺序写,Disruptor 高性能是结合CPU预读取机制,缓存行,无锁设计等基础技术;Storm的高效异或确认机制,Flink的分布式快照算法。
很多同学对这点可能有疑问,这些技术理论和技术深度不应该是高级工程师或者技术专家阶段就应该积累的吗?为何到了中级架构师反而是成长的关键了?
因为高级工程师或者技术专家阶段即使学习了这些技术,实际上也比较难理解透彻的,更加难有机会去应用,更多的时候只是了解这个技术点而已;
中级架构师阶段,面对高复杂度的系统,很多时候就是几个关键技术细节决定了整个架构设计的成败,或者某个设计方案理论上就是不可行的,如果不深刻理解理论和相关的关键技术点,很难设计优秀的架构。
以异地多活设计方案为例,之前很早我就知道CAP理论,但也仅仅只是知道几个概念而已,C一致性,A可用性,P容错性,只能满足CP或AP,不能同时满足CAP,试图做一个完美的异地多活系统,最终发现这其实是不可能的,某天突然顿悟:其实CAP理论已经明确指出来了这点,但最初学习CAP理论的时候,很难有这样深刻的理解。
高级架构师
很需要机遇,有充足的准备,足够的能力
阶段描述
成长为高级架构师需要10年以上时间,其典型特征是“创造新的架构模式”。例如Doug Cutting 根据谷歌大数据论文,创造了分布式存储架构HDFS、分布式计算MapReduce 架构、列式存储架构,开创了大数据时代。后来在有MapReduce(离线计算)分布式计算架构的背景下,Storm 又创造了流式计算架构。
在虚拟机很成熟的背景下,Docker创造了容器化的技术潮流(容易,轻巧,简便)。
高级架构师与中级架构师相比,典型区别在于“创造性”,高级架构师能够创造新的架构模式,开创新的技术潮流。
成长指导
成为高级架构师,需要“创造性”,和艺术比较类似,很难由老师教会,更多的是天分,或者某种场景下灵感爆发。
参考技术界几个创造性的架构案例,我总结出几个可能诞生创造性架构的背景条件:天时地利人和!
-
足够复杂的业务场景
例如谷歌的大数据、阿里的双十一、facebook的海量用户,业务场景越复杂,给技术带来的挑战更多大,更有可能产生创造性的技术突破。没有挑战,就没有进步!
-
足够强大的技术团队
绝大部分创造性的架构都来源于大公司,没有技术实力支撑,想突破也是心有余而力不足。
-
不满足于现状的态度
例如虚拟机很成熟但资源占用太多,所以发明Docker;MapReduce难以做到实时运算(离线运算),所以创造Storm流式运算。
-
尊重技术价值的文化
创造性的东西往往需要投入大量的人力和时间,而且刚开始一般都不会很成熟,如果完全结果导向,KPI导向,创新技术很可能在萌芽阶段就被否定了。
总结
- 工程师,在高级工程师或技术专家的指导下完成开发,主要是积累基础知识;
- 高级工程师,独立完成开发,包括需求分析,方案设计,编码实现。方案设计更多的是在已有架构下进行设计,主要是积累方案设计经验;
- 技术专家,某个领域的专家,如Java领域,能解决领域内问题。主要是“拓展技术宽度”,深入理解每个技术的原理、优缺点、应用场景;
- 初级架构师,独立完成复杂度不高的系统架构设计。主要是系统学习“架构设计方法论”,研究开源系统的架构设计,了解公司的各种系统的架构设计,多画架构图。
- 中级架构师,独立完成复杂系统的架构设计,包括高并发、高可用、可扩展、海量存储的系统。主要是“技术深度和技术理论的积累”
天上飞的理论,一定要有落地的实现
4、架构师的成长
三大问题
要成为架构师,我们自己要面临三大问题:
- 找准自己的定位
- 怎样做好架构师
- 如何搭建架构师知识体系
这里面就是做事方法论:目标 -> 方法 -> 执行
什么是架构师
百度百科:
- 系统架构师是一个最终确认和评估系统需求,给出开发规范,搭建系统实现的核心架构,并澄清技术细节,扫清主要难点的技术人员。
- 主要着眼于系统的“技术实现”,因此他说特点的开发平台、语言、工具的大师,对常见应用场景能给出最恰当的解决方案,同时要对所属的开发团队有足够的了解,能够评估自己的团队实现特定的功能需求需要的代价。
- 他负责设计系统整体架构,从需求到设计的每个细节都要考虑,把握整个项目,设计的项目尽量效率高、开发容易、维护方便、升级简单。
在初创公司的野蛮生长阶段:业务场景和需求边界很难把握,有时候根本不需要架构师,产品需要快速迭代和实现,需求频繁更新。如果公司成长以后,这个阶段会欠下很多技术债,埋下很多坑,如果人员流动频繁,后期系统维护成本巨大。
在公司成长稳定阶段:业务场景和需求边界已经比较清晰,这个时候需要架构师,对线上业务进行模块划分,系统拆分重构,并做好相关高可用的措施,以保证系统的稳定、安全、高效地运行。
架构师实际上就是软件的总体设计师,比如某个工程的总设计师,他一定是在实践工作中积累起来的。
纸上得来终觉浅,觉知此事要躬行。
架构师职责
你要替代你的领导,你得知道他在做什么!
从两个维度来说明架构师的职责
按软件开发过程维度来说
1)需求阶段
架构师主要负责理解和管理非功能性系统需求,如软件的可维护性、性能、复用性、可靠性、可测试等。架构师还要经常审查客户和市场人员提出的需求,确认开发团队提出的设计,审查方案设计。
2)架构设计阶段
架构师负责对整个系统架构设计,制定开发规范、开发计划,指导整个开发团队完成这个计划;
3)开发阶段
架构师成为详细设计者和代码编写者的顾问,并且经常性举行一些技术研讨会、技术培训班(讲师=技术专家);
4)测试交付阶段
架构师协调做好相关测试和部署;
5)维护阶段
架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策;
按职能维度来说
1) 确认需求
架构师要理解用户真正想要什么,和分析人员不断沟通,反复确认需求规格说明书,以此来保证他精准清楚用户需求。
2)系统分解(重要)
在架构师认可需求规格说明书后,他已明确用户需求是什么,这时便看他的分解能力了。
系统分解包括纵向分解和横向分解
-
横向分解是对系统分解成不同的逻辑层,确定层与层之间的关系,常见的分层:
应用层:主要负责具体的业务逻辑处理
服务层:提供可复用的服务
数据层:负责数据的存储和访问
-
纵向分解是将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,有助于软件开发和维护,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
3)技术选型
系统分解后,架构师会最终形成软件整体架构,接下来就是技术选型:
- 前端到底用瘦客户端(只有网页)还是富客户端(网页+小程序+app)?
- 数据库是用MySQL还是其他?
- 技术选型是非常重要的环节,因为需要了解每种技术的优缺点,架构师会提供参考信息给项目经理,然后项目经理从预算、进度、人力、资源等各方面情况权衡,最终确认。
4)制定开发规范
架构师在项目开发过程中是【灵魂人物】,要具备协调组织能力和懂得人员分工
在制定技术规格说明阶段,架构师要协调所有的开发人员,使用技术规格说明书让开发人员理解他们负责的模块,确保开发人员能够按照架构意图实现各项功能。
必备技能
-
方向规划
有想法和技术展望目标,制定短期目标
-
架构设计
集思广益来设计,归类总结,根据讨论结果制定规范
-
技术攻关
将问题集中化解决,提供平台化解决方案以及选型决策
-
解决疑难问题
定期做总结归纳分析问题,解决问题。发现各类问题,通过规范、演讲、绘图等方式解决隐患
-
互动沟通
架构通过团队的沟通总结出方向,部门之间沟通、开发之间沟通、产品之间沟通、市场沟通,产出图形化文档及设计
-
开发规范
确保系统秩序,统一,规范,稳定,高效地运行。
架构一定是团队做出来的,所以要有团队精神。
总结:
1)架构师:架构通过团队的沟通总结出方向
2)RD:研发人员经常提出自己碰到的问题,并分享给大家,思维碰撞促进发展
3)PM:产品经常提出设想和分析,能够使得架构符合未来发展
4)OP:运维经常提出隐患及分析,使架构快速拆分模块
架构师:定期做总结归纳以此分析问题,解决问题。
团队:团队成长,就是每个人的成长;团队的成功就是产品的成功,就是公司的成功陪你
架构师分类
其实架构师就是个title,每个公司称呼都可能不一样
在中小公司很多架构师都是全能的,公司规模和体系越大,分工会越细
-
解决方案架构师
与客户探讨业务需求,将业务、市场,与技术产品结合起来,为客户提供解决需求方案,如阿里云针对大客户都有解决方案架构师
-
系统架构师
最终确认和评估系统需求,并将业务转换为技术,为开发人员制定核心框架与技术规范,澄清技术细节,扫清技术障碍。服务器负载,可靠性,伸缩,扩展,数据库切分,缓存应用。
-
平台架构师
-
业务架构师
已经开始脱离技术层面了
-
网络架构师
-
移动架构师
-
前端架构师
-
大数据架构师
具备的素质能力
1)精通某项技术,能够从本质上类比,触类旁通其他技术
2)对等所有技术,只有合适和不合适,没有喜欢和不喜欢
3)视野开阔,了解不同技术的优缺点,知道视野某项开源技术实现某项业务需求,避免重复造轮子
4)精通设计模式,但又不泛用,23种设计模式,一定要看到对应的场景,才去学习
5)把系统拆分成多个子系统或模块,模块之间尽量松耦合,使得原先串行的开发任务变得可以并行发展。
6)能清楚系统的瓶颈在什么地方,不断的定位技术难度,开发进度,性能,内存等多个方面的瓶颈,不断的调整骨干力量解决瓶颈,在风险爆发前消除隐患。
7)能做好前瞻性设计,预判需求可能产生的变化
架构师职场攻略
架构师需要处理好个人、团队、公司的利益,需要不断在工作中发现问题、解决问题、提升工作经验,知识技能和核心竞争力。扩大自身影响力,达成工作绩效。
1、发现问题,寻找突破
作为一个新人,从局外旁观者的视角看待,自然发现很多问题,如果新人急于表现自己,证明自己,往往是事与愿违,四处碰壁,因此新人要先融入团队,等熟悉情况,了解问题深浅,再寻找突破口,择机而动。
2、提出问题,寻找支持
给上级提封闭式问题,给下属提开发式问题
上级一般上做决策的,因此给上级提问需要给出建设性的方案或者建议,然后希望得到他的支持,如:你觉得A和B哪个方案更好?
给下属则相反,用开放式的问题启发他去思考,寻找创新的解决方案,如:jacob,这个问题你怎么看
提出问题,而不是批评人
如果遇到问题,不要责问他为什么出现问题,而是说问题的紧迫性和解决的优先级。
用赞同的方式提出问题
如果人们遇到“你这里有问题”可能会本能自我保护而拒绝你的建议,所以可以这么说“我赞同你的方案,但是我个小小的建议”
3、解决问题,达成绩效
在解决我的问题之前,先解决你的问题
架构师必备技能
比你牛B的人比你还努力,你还有什么资格不去奋斗!
如下图:
1、首先是技术实力,每个好的架构师,都是NB的程序员
架构师的主要价值在于“落地”过程,而不是“指点江山”
1) 解决方案
2) 架构设计和技术实现步骤
3) 编写核心模块
4) 部署上线和完善流程
系统出版实现了,架构师要和开发团队、测试团队、运维团队一起,完成各类测试,协助解决最困难的bug,和团队一起完成线上部署,排除上线初期系统的故障
2、业务理解和抽象能力,驾驭概念的技能是最高潜力
-
业务理解
架构师需要理解业务,并转换为可被开发人员理解的实现方案,
-
抽象能力
抽象能力是指对业务的理解转换为系统实现的模型,善于把实物概念化并归类,抽象很多时候承担了分解清楚多个团队的职责,分工清晰化。“逻辑思维,抽象思维”比“编码的时间”对架构师而言更重要,如果你不能让某个非IT人员明白某个概念在说什么,这个架构师注定说失败的。
抽象思维分为两点,将实在的事物概念化和将模糊的感觉数量化,比如面对一个大型的B2C网站,能够快速抽象为采购->运营->前台搜索->下单->履单这几大块,对系统分而治之,庖丁解牛。
3、技术深度,透过问题看本质,解决问题和绕过问题
比如看一段java代码,知道它在JVM如何执行,一个跨网络调用,知道数据说如何通过各种介质到达目标(操作系统->网卡端口->电磁介质)
什么是本质
将世界万物理解为原子,整个互联网理解出0和1,从问题看本质,其实就是一个从表层逐步深入的过程。
在《技术的本质》书中,主要表达了三个核心观点:
-
几乎所有技术都来自于此前已经存在的技术,如C、Java语言就是调动了多个功能最终实现一个功能。
-
技术都是由技术形成的,如火车的发明其实包含了多种技术,比如蒸汽技术,燃料技术,动力技术
-
技术和生物一样会进化,生物的进化来自变异,技术的进化则来自由不同技术组合所发生的变化。
计算机技术,本质都要求具备良好的算法和数据结构,在此基础上不断衍生出许多新技术
程序员=算法+数据结构(多刷题,多看牛人的解题思路)
挖掘本质
架构师要将“业务需求”转化为“技术需求”的能力,这是一个本质的挖掘。业务层面看到的是一个“电子商务网站”,架构师看到的是一个多人在线,并发交易,需要保证数据一致性的站点,功能、性能、扩展性、维护性、安全性,可用性这些字眼会惯性的跳到架构师的脑子里。
4、技术广度
全面了解各个层面的知识,了解主流公司的系统设计,碰到实际问题,很快有多种方案可供评估
如果只是在一个领域内的知识烂熟于胸,那仅仅只是一名技术专家。要想更近一步,需要对APP层面,服务层面,数据层面要了解(系统分层),要对研发、测试、运维、安全有所了解(职能)
5、沟通能力
参与项目开发的全过程:确认需求、系统分解、架构设计、技术选型、制定技术说明、系统实现、集成测试、部署上线。
有一定的绘图能力,人对图形的理解远大于对文字的理解
6、系统性的思考,权衡利弊,只有合适没有喜欢
5、走正确的路,高效的学习
三个核心
一、必须学习好面向对象知识
面向对象的概念:类、方法、抽象类、接口
明白面向对象的目的:
- 降低软件开发的复杂度
- 提高软件开发的效率
- 提高软件质量:可维护性、可扩展性、可重用性,具体就是代码的松耦合,高内聚,面向对象就是为了解决这个问题。
二、学习好设计模式,并且完成对应的博客文章
这个我有在做了个专题“23种设计模式”,后面还会把《重学设计模式》这本书的例子做一遍
设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图, 可用于解决代码中反复出现的设计问题。图文并茂的学习设计模式:https://refactoring.guru
三、学习重构
推荐书本《重构-改善既有代码的设计》,在整个开发过程,需求变更过程中不断的重构现在的代码,才能让程序一直保持良好的设计。所谓重构:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构,重构的目标,就是设计模式,更本质的讲就是使程序的架构更趋合理,从而提高程序的可维护性、可扩展性、可重用性
四、工作中用上设计模式和重构
工作中用面向对象的思维考虑问题,推荐书本《重构与模式》,结合实战深入理解重构和模式
五、没有终点,只有坚持不懈的努力
经过了几年的坚持,终于学会类灵活的运用各种模式,我们不需要去可刻意的想用什么模式,怎么重构。程序的目标,就是可维护性,可扩展性,可重用性,都已经成为了一种编程习惯,一种思维习惯,就像我们练习了几年游泳后,我们不用刻意去考虑,如何让自己能在水上漂起来,仰泳和蛙泳的区别。
大牛的法宝-不断实践总结
法宝一:牛人爱惜自己的时间
想办法提高自己的做事效率,看看《时间管理:小强升职记》
法宝二:牛人善于总结
建议有自己的个人博客网站,写文章,总结自己的知识,理解它,时不时还翻回来看看,修改补充知识点,加深对它的理解。
法宝三:牛人懂得专注
专注某个技术领域,比如Java领域,也就是技术要有一定的深度,要能拿得出手
法宝四:牛人注重动手能力
“纸上得来终觉浅,绝知此事要躬行”
只学习不动手,是成不了牛人的。学以致用。
6、架构师要懂哪些知识
1)架构师有优秀的编码能力,解决开发人员无法解决的难题
2)架构师对系统的大数据容量高性能、高并发、高容错的网站架构设计和开发经验
3)架构师对操作系统、数据库、服务器各种软件使用的配置比较了解,比如linux、web负载均衡、反向代理、数据库集群、容灾等比较了解
4)架构师对软件开发过程有清晰明确的认识,能把需求进行分析、建模
5)架构师学习能力很强、喜欢关注和接触各种新的技术
6)架构师沟通能力很强
7)架构师对从事的行业的业务有深刻的了解
换个角度说明
第一条要求你是个优秀的程序员
第二、三要求你懂DBA、运维
第四要求你是个项目经理
第五要求你学的要深、要广
第六、七要求你熟悉公司业务
简直不要太难,相当于1个人要学6个的知识,并且要达到专业水平,意味着你的领悟能力、学习能力要高于常人,所以说,成为架构师需要天分。我觉得自己能成为Java领域的技术专家,已经很牛了,至少不用再担心收入了,所以要努力啊,没有人能替你努力。
成为优秀的程序员,需要学好的知识
- 面向对象编程、画图、设计模式,代码重构
- 常用ORM工具
- 高性能代码,比如静态化、MemCached手段
成为DBA,需要学好的知识
- 常用数据库:MSSQL、mysql、oracle,性能调优熟练,备份,负载均衡、集群、容灾
- 大数据量处理熟练
- 各种数据库监控软件
成为运维,需要学好的知识
- 各种Web负载均衡的硬件,比如F5,负载均衡的软件,比如Nginx、HAProxy的配置
- 反向代理加速
- 操作系统,Linux是必须懂得
- 各种性能监控软件
成为产品、业务、项目经理,需要学好的知识
- 沟通和理解能力
- 该行业和本公司的业务逻辑
- 软件工程的知识
- 质量控制,进度控制,人员组织等
学习中,采用先深后广的策略是明智的选择,一门学深了,其他知识很可能都会融会贯通,那样学起来会比较快。
Web架构师深度上要深入学习编程的知识、软件架构的知识,有了这个基础后在大数据量、高并发、高负载、高容错方向再有所了解和涉及,再反过来促进我们对软件架构的思考,这种深-广-深的模式是我们学习的方法,只要坚持不懈努力几年,做真正合格的Web架构师是没问题的
7、构建自己的知识体系
学习的时候先总览全局,然后逐个部分击破,最后形成思路,了解具体细节。
通用技能表
1、做事方法论:目标、方法、执行
我是谁:不将就认真做事的人
如何做事:
- 整体把握,找到方法论(解决方案)
- 思路:分而治之,优先排列,计划进行
- 及时沟通,反馈,勇于承担责任
- 团队意识
成长:
- 和优秀的人在一起
- 不断学习充电
做一个靠谱的人:“凡事有交代,件件有着落,事事有回音”
2、思维结构
金字塔原理、结构化思维、系统思维
3、文档能力
写概要设计、详细设计相关技术文档,落地方案
4、团队协作、沟通能力
5、业务能力:该行业和本公司的业务逻辑
6、计划推进能力
质量控制、进度控制、人员组织、资源协调
能够有效的组织各类资源,通过说服、协调等方式得到相关部门或人员的支持,以使计划顺利的推行下去
7、项目管理能力
架构评审、代码规范、代码review、看板管理、SCRUM、敏捷开发、极限编程XP、结对编程
专业技能
1、Java Core
- java 基础类库、异常
- jvm原理和调优《深入理解java虚拟机》
- 框架
- 并发《java并发编程实践》
- 多线程
2、程序设计
-
高质量编码能力
重用性
低耦合
可扩展性
可维护性
高性能
安全性高
-
面向对象编程
MVC编程思想
掌握建模语言和建模工具UML
面向对象思想
-
设计模式
基础设计模式,设计原则:单一职责,开放封闭原则(开闭原则)
常用设计模式
重构
3、安全知识
-
web安全:xss,sql注入,ddos攻击
-
安全维度:漏洞,风险,事件
-
https协议
-
安全书
《黑客攻防技术宝典-web实战篇》
《白帽子讲web安全》
《web前端黑客技术揭秘》
《web之困》
《sql注入攻击和防御》
4、运维能力
- 监控
- 持续集成:devops、jenkins
- 自动化运维工具:ansible,saltstack
- 虚拟化: kvm,vm
- 容器docker
- 云技术openstack
5、数据库
- 基础理论
- 数据库设计的三大范式
-
mysql原理、mysql优化、mysql引擎
- NoSQL: Redis / mongoDB
6、常用应用软件
-
Web server
-
消息队列
-
RPC:Dubbo、gRPC
-
数据库中间件:DBproxy、HAproxy
-
软件负载均衡
几种负载均衡算法:轮询、权重、负载、最少连接
DNS负载均衡
Nginx
LVS+keepalived实现负载均衡
HAProxy
HAProxy+Keepalived+MySQL实现读均衡负载
7、性能调优
- 容量评估
- CDN网络
- 连接池
- 性能调优
8、大数据
- Hadoop
- MapReduce
- Storm
- Spark
9、工程化
- Maven
- git
- jenkins
- gradle
架构基础知识
1、架构演进
- 单体应用
- 分布式
- 微服务
- 服务网格
2、架构模式
-
分层:应用层、服务层、数据层
-
分割:拆分功能和服务
-
分布式
分布式应用和服务
分布式静态资源
分布式数据和存储
分布式计算
-
集群,提高并发和可用性
-
缓存,优化系统性能
CDN
方向代理访问资源
本地缓存
分布式缓存
-
异步,降低系统的耦合性
提供系统的可用性
加快响应速度
-
冗余,冷备和热备,保证系统的可用性
-
自动化,发布,测试,部署,监控,报警,安全失效转移,故障恢复
3、架构核心要素
-
高性能(灵魂)
性能测试
前端优化
应用优化
数据库优化
-
可用性,保证服务器不宕机,一般通过冗余部署备份服务器来完成
负载均衡,数据备份,自动发布,灰度发布,监控报警
-
伸缩性,建集群,是否快速应对大规模增长的流量,容易添加新的机器
集群,负载均衡,缓存负载均衡
-
可扩展性,主要关注功能需求,应对业务的扩展,快速响应业务的变化,开闭原则,降低系统的耦合依赖
服务化,分布式消息
-
安全性,网站的各种攻击,各种漏洞是否堵住,架构是否可以做到限流作用,防止ddos攻击
xss攻击、sql注入、csr攻击,web防火墙漏洞,安全漏洞,ssi
架构设计
1、设计原则
- 冗余设计
- 回滚设计
- 监控设计
- 故障隔离
- 可独立部署
- 无状态设计
- 成熟技术
- 异步设计
- 禁用设计()
- 服务可降级
- 服务可限流
- 水平扩展
2、接入层设计
- DNS轮询
- 动静分离
- 方向代理,LVS,NGINX
- CDN
- 接入层安全:DNS劫持,限流,防刷
3、应用层设计
- 通信机制:RPC、MQ
- 异步(编程)
- 连接池
- 配置中心
4、数据库层设计
- 高可用数据库架构
- 双主架构
- 主从同步
- 读写分离
- 分表分库
8、如何获取知识
从为什么开始
建立自己的知识体系,就像建一栋安居的房子,你应该先问问自己为什么要这样做?构建自己的核心价值
我什么要去学习
作为一个“功利”的成人学习者,我觉得知识能带给我价值,价值体现在哪里?体现在资源、人脉、金钱还有自信。
“黄金圈法则“
我该怎么学习
在工作中学习:积累处理工作任务,学习同事之间的优秀做事方式和技巧。我对办公室政治的敏感度为零,这样可以专注于工作的处理,避免人事间的消耗。
在工作外学习:利用早上和晚上的时间来学习,这个时间段没有过多干扰,大块的时间可以用来专注做一件事
我要学什么
通过下图的金字塔,我会发现自己现在每天正在学习和坚持的是哪个区间里面
对于成年后的知识工作者,如何提高金字塔的高度是最重要的问题,即知识学习要聚焦,选中一个方向走下去,持之以恒,对于自己不擅长的知识,你就需要知道谁擅长,争取得到别人的协助。因为水平最高的人并非所有方面的水平都最高,只不过因为他们知道自己擅长的是什么,缺少的是什么充分发挥自己的优势,紧密与同伴协作。
知识的获取
- 书本(形成基础知识框架):快速阅读和主题阅读的方式能让我快速掌握某一领域的知识
- 微信公众号(补充完善知识框架):干货文章
- 网课
知识的整理和保存
知识的淘汰更新非常重要,很多信息会在我们收集到手后就已经过期了,所以果断抛弃我们当下用不到的知识,用断舍离的方式提醒我不要囤积“能用”但是当下对我没用的知识垃圾。
对于收集的素材和资料,我会保存在两个地方:
- 本地电脑和远程服务器
- 博客
知识的分享
教是最好的学习,实现90%的知识转化。公司内部培训,文章分享,知乎问答,这些都是校验你到底懂不懂的真正战场。
知识的利用
学习的终极目的:学以致用
如果无用,就是浪费时间
在工作中利用你学到的知识,提高工作效率,验证所学。重视实践,在项目中磨练自己,才是正确的学习之道。
知识内化为自己的智慧
当我们构建出了属于我们自己的知识体系,创新就是在这个知识体系的各个模块前的跨界组合,我们的创新来源于我们的已知世界,你的知识体系越健壮,越丰满,越经常更新,创新就会说一件小事
把智慧升华为世界观和方法论
知识内化成智慧就是不仅要知其然,还要知其所以然,到这个阶段也还仅限于本学科本领域之内,如果把这些智慧再进一步升华,就可以上升到世界观和方法论的层面上,即哲学层面上
建立个人的知识体系,对在学习的和要学习的进行整理。就像一栋大楼的建设一样,先有骨架,然后才有大厦。
- 为什么阶段:锻炼提问能力和逻辑思考能力
- 获取阶段:练习快速阅读和主题阅读,学习大N们的读书方法
- 整理阶段:学习时间管理,精力管理,断舍离,如何做思维导图,如何做笔记记录
- 分享阶段
- 利用阶段:在项目管理中实践,并学习结构思考能力。
- 创新阶段:学习如何建立个人品牌,学习想到一个点子后,如何快速成型,如何去试错,这些点子又如何能应用到你的工作中。
9、技术深度和广度
技术的深度
到底多深才叫有深度,精通层次。学任何的知识都要形成一个体系,才能学得深,记得牢。功利性的,走马观花的学习,很快就会忘记。
学习层次认知
在我们的技术简历上面,经常出现的词汇
了解->熟悉->掌握->精通->专家,这就是由浅入深的形象描述
- 了解:简单的认知和记忆,表示知道,是最低水平的认知学习结果
- 熟悉:清楚的知道概念,侧重于知道的清楚,比了解更进一层
- 掌握:规则,应用规则到实践,是在熟悉的基础上能充分的加以运用
- 精通:高级规则,深入底层
- 专家:扩展创新
技术深入程度
-
了解
这个技术出现的背景,要达到什么目的,要解决什么样的问题。这个问题非常关键,你在学习一个技术的时候,需要知道这个技术的成因和目标,也就是这个技术的灵魂。如果不知道这些的话,那么你会看不懂这个技术的一些设计理念。这歌其实就是回答了“我是谁”、“从哪里来”、“到哪去”的三个哲学问题
-
熟悉
这个技术的优势和劣势分别是什么。适用场景是什么,没有任何一个技术是普适的,所谓的场景是业务场景和技术场景。
-
掌握
技术的组成部分和关键点,这是技术的核心思想和核心组件,也是技术的灵魂所在了。学习技术的核心部分是快速掌握的关键
-
精通
技术的底层原理,关键实现,本质。任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其它技术的关键基础技术。所以,学习这些关键的基础底层技术,可以让你未来很快地掌握其它技术。
-
专家
扩展创新
技术实践和从问题中深入学习
要真正地精通一门技术,最终还要通过实践来深入。在实践中,遇到问题,不仅要解决问题,还要刨根问底,找出问题发生的根本原因,这样可以系统性的修复问题,从而使其永久消失。“打破砂锅问到底”,形象的表达了锲而不舍的精神。
我们遇到问题,逐层分析:
- 问题表象是什么
- 直接原因是什么
- 中间原因是什么
- 根本原因是什么
比如:
问题:java应用超时抖动?
- Java应用出现FGC(jvm调优增大堆内存, -Xmx -Xms内存设置)
- 直接原因:流量激增?长时间运行?代码问题导致占用内存对象不释放
-
中间原因:流量没有做预警?
- 根本原因:JVM的基本原理?GC机制
技术的广度
在快节奏的时代,不进则退,技术人员需要不停的吸纳新知识。如何权衡技术的广度和深度?
-
广度为辅,深度为主
人生时间有限,我们不可能精通所有的技术,但我们可以努力的精通工作相关的、有前景的、感兴趣的技术。
-
基础扎实,深入底层
只是解决工作上的问题是远远不够的,应该在工作之余去学习更底层的技术,所谓知其然还得知其所以然。
-
触类旁通,适度学习
学任何的知识都要形成一个体系,才能学得深,记得牢
如何正确的做一个技术T型人才
“广度”只是“深度”的必要条件,而不是充分条件。挖深坑,需要足够的破土面积,但只要挖几揪就停工,别说能挖多深,恐怕一辈子也挖不出水来。没有明确目标,没有恒心毅力,盲目的追求广度,只能是“摊大饼”,慢慢的把自己变成“纸片人”。
所以,盯着一个目标,开放心态,广开思路,广泛涉猎各种知识,努力拉开自己的既有思维、知识框架,多角度审视目标方向,持之以恒的推动前进,精神境界就会在纵向上不断加深,加深,再加深,直到突破临界点,成功实现飞跃。这应该才是广度与深度在人生追求中应该扮演的角色吧。
什么是T型人才?
T型人才是指按知识结构区分出来的一种新型人才类型。字母“T”表示他们的知识结构特点,横表示广博的知识面,竖表示知识的深度。
如何成为一个T型人才,我觉得应该是在一个技术方向上至少要做到熟练掌握的程度才行,而且要经过1-2年的实践,才能称之为熟练掌握。
总结
- 深度是根基,广度是枝叶,根深才能蒂固,枝繁才能叶茂,十年方可树木
- 根深,事情做到专业,才有崭露头角,施展才华的机会,泛泛之辈,根本没有实践的舞台
- 枝繁,业务掌握全面透彻,才有侃侃而谈,合作无间的可能,井底之蛙,根本不知道飞翔为何物
- 深度是专业,广度是全面,专业才能可靠,全面才能靠谱,百年才能树人。