架构师训练营第 1 期 -Week1 架构方法学习总结
架构师训练营1期在9.15晚上开营,这周因为工作的原因,一直等到周末才有时间去学习,匆匆忙忙,没有理解透彻,以后有时间还是要在回顾下的。本周的作业一(食堂参考系统设计)应该写成一个架构设计文档的,但是因为时间原因只是画了部署图、组件图、组件时序图、用例图。以后再完善。
本周共分为五个章节:架构师JD解读、架构师面试题解读、视图模型(软件开发的本质是什么?)、软件架构建模的一般方法和工具、架构设计文档。
第一节:架构师JD解读
课程根据架构师需要的能力进行设计
第二节:架构师面试题解读
常见面试题:
1.什么是软件架构?如何写一个架构文档,文档中应该包含哪些方面的内容。
2.子类override父类的方法后,想要修改抛出的异常,那么子类方法抛出的异常类应该是父类方法抛出异常类的子类还是父类?
3.Spring是如何实现单例的?和设计模式中的单例实现方式有什么不同?
4.淘宝这样的大规模分布式互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?
5.什么是CAP原理?请描述某个你数学的NoSQL产品是如何解决CAP问题的.
6.如何进行性能测试,性能测试的流程是什么? 性能测试的主要关注指标有哪些?
7.为什么在系统性能测试的时候,随着并发请求书的逐渐增加,错误响应(或者响应超时)的比例快速增加?青葱操作系统的线程与进程调度原理以及计算机内部资源使用的角度进行分析。
8.为什么支持异步I/O的web服务器(比如Nginx)要比阻塞式的Web服务器(比如Apache)性能好很多,前者要比后者可以出来的并发连接多几十甚至数百步?清楚异步I/O的线程阻塞特性进行分析。
9.给定一个key,为什么可以在Hash表款式查找到value?
10.数据库索引是如何存储的
11.Java虚拟机的垃圾回收原理是什么?
12.你怎么理解领域驱动设计DDD?DDD的优缺点是什么?
13.导致系统故障无法正常访问的原因有哪些? 保证系统稳定高可用的方案有哪些? 请列举并简述。
14.如何保护数据库中存储的用户密码,请用时序图用户密码加密存储于登录验证的过程。
15.Spark为什么比MapReduc快?
16.淘宝,头条这样应用会针对不同用户推荐不同的商品和内容,他们是如何做到的? 用了哪些算法?
17.Goole搜索结果页面是如何排序的,正好使用用户最想看到的页面排在前面?
18.区块链是如何保证数据无法被篡改的?
19.什么是边缘计算?
20如果你觉得系统需要进行重构,但是老板和团队成员都觉得没必要,你如何说服大家?
架构师的主要能力
编程能力:算法、数据结构、设计模式
基础技术掌握能力:操作系统、数据库、网络、虚拟机、算法、数据结构
常用技术产品的理解与应用能力:分布式:消息队列、缓存、数据库、NoSQL
性能优化与分析故障的能力:性能测试,解读性能测试报告,根据性能测试优化
常用架构模式与框架的理解与应用能力
建模以及设计文档方法和能力:如何把这个系统的架构设计出来,如何表达自己的设计意图。
业务理解与功能模块及非功能模块拆解能力
快速学习能力
沟通与领导力能力
没有深度,就没有广度。如果从来没有在某方面,达到一定的深度(知识全面,理解透彻),你对任何事物的理解都是比较浮于表面的。知识越多,表面性越强。一定要有深度,有没有深度,对事物的认知差异很大。认知事物的根本规律,才能触类旁通。
找到自己擅长的突破点,深入学习,不断的思考,发现背后的本质规律,构建自己的知识体系,成为这个点的高手,然后触类旁通,扩展自己知识体系的广度,成为全才。
软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
架构师的职责是在软件系统遇到问题,发展的时候,解决技术细节, 解决软件持续发展的问题。架构师职责的核心是让其他工程师能够写好代码。架构师是做架构设计、对系统架构负责的那个人(而不是一个头衔,项目中的技术负责人)。
构师要有1套自己的方法论,成体系的工作。
架构师是一顶帽子,而不是一把椅子(title);架构师是一个角色而不是一个职位。谁做架构设计,谁带这顶帽子。
架构师要真正的去落地,去解决问题,要让开发团队信任架构师,要让大家依赖你!真正的去架构设计,为架构落地负责,推动团队开发出项目。
架构师成长的核心是实践,在团队中夺得主动权,建立自己的技术影响力,逐渐向一个架构师发展。
沟通的根本不在于沟通,而是在于认知背后的规律,沟通的表象是在沟通,沟通的背后是你对事物规律的认知。你只有认知到事物背后的规律,你才能找到合适的解决途径,才能在沟通过程中达成目标
沟通的本质:如何认知问题,如何发现问题,如何发现问题,如何解决问题。
虚的能力(非技术上的能力,比如沟通、组织、协同等)实际上表现了你的真实的技术能力和你对事物的认知。
如何成为一名合格的架构师:架构方法、架构模式、关键知识点可以训练,但是架构一定要实践,一定要关注场景。通过例子,总结模式,通过模式(本质上的东西),构建知识体系。如:分布式缓存的架构设计,通过对这些架构师设计的理解,寻找架构后面的规律,架构设计的方法和思路。这些思路和方法更有共通性,当这些共通性的知识越多的时候,就构建了自己的知识体系了,当遇到问题时,就可以设计自己架构体系。你就成为一个高手了。
第三节:视图模型-软件开发的本质是什么?
在大学的《软件工程》课程中明确的指出,软件开发的本质是映射,用户的需求,经过需求分析师的整理映射成需求文档。需求文档经过评审,经过架构师的设计,映射成概要设计文档、详细设计文档,最终用户的需求经过层层映射,将用户的需求转换成一个软件系统。
模型是一个系统的完整的抽象,人们对某个领域特定问题的求解及解决方案,对它们的理解和认识都云汉在模型中。构造模型的关键在于抽象
通常,开发一个计算机系统是为了解决某个特定问题,问题的求解过程,就是从领域问题到计算机系统的映射。
建造传统模型的目的
为了证明某件事物能否工作
前提:
建造软件模型的目的
为了与它人沟通
为了保存软件设计的最终结果
软件架构 = {元素,形式,关系,约束}
软件架构要用多种视图,多个视角进行描述,单一视角是无法表达软件架构的。
4+1架构视图:逻辑视图,开发视图,物理视图,过程视图,场景视图
每种视图都包括:相关方法、视角、主要元素、用途等信息
软件架构设计的常用表达工具是UML(Unified Modeling Language)统一建模语言
UML可以用来描述:
某个问题领域
构思中的软件设计
描述已经完成软件实现
何时画图:
讨论,交流时
最终设计文档:只保留少量的,重要的图;避免设计过多的内容和实现细节
何处画图:
白板
绘图工具,如Visio,Astah
draw.io
第四节:UML-软件架构建模的一般方法和工具
UML是一个语言,那么它就是用于表达的。先有设计后有代码,那么UML就是设计的表达语言。设计的表达语言不止UML。
UML共有10种图,常用的7种图,不常用的3种图(包图)。可以分为两类:静态图和动态图。
静态图:用例图、类图、对象图、组件图、部署图
动态图:状态图、活动图、时序图、合作图
UML的10中图,并不是完全孤立的,图可以相互去描述
没有设计文档就没有软件设计;没有软件设计就没有技术进步;写文档的过程就是思考设计的过程。
在什么样阶段画什么样模型, 表达什么样的意图。这个更重要
需求分析阶段:用例图、时序图、活动图、子系统的时序图
概要设计阶段:时序图、活动图、部署图(第一张图,自顶向下的话这里是顶)
详细设计阶段:类图、时序图、活动图
模型元素与模型元素直接的连接关系也是模型元素
常见关系:泛化、依赖、聚合、组合、关联
泛化:连接(connect) 模型元素及连接(link)实例。
依赖:表示一个元素以某种方式依赖于另一种元素
聚合:表示异步与特色的关系,即一般元素是特殊关系的泛化
组合:
关联:
第五节:架构设计文档:软件架构设计文档写作模式
架构师的工作输出是架构设计文档。
架构设计师层层抽象,自顶向下逐步分解(从大到小,从粗到细)的过程。不能一步直接到详细设计。
版权声明: 本文为 InfoQ 作者【鲁小鲁】的原创文章。
原文链接:【http://xie.infoq.cn/article/42a7fcb4839e8c09230c83c1d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论