写点什么

01 架构方法

用户头像
escray
关注
发布于: 2020 年 09 月 18 日
01 架构方法

架构师训练营第1周学习笔记



TL;DR



如何获取大厂架构师 Offer ?



看了一下大厂架构师招聘的 JD,自己的确还有很多短板需要弥补。



我觉的按照自己的年龄和资历,估计是很难拿到大厂的架构师职位了,不过我本来参加训练营的目的也不是为了立刻就拿到架构师的 Offer,而是希望做一些技术储备,了解一下架构师的知识体系,暂时的目标是做一个好的程序员(找到工作)。



我有一个疑问,现在各种课程和训练营都是以互联网大厂为目标的,为什么没有针对那些 ToB 的软件企业呢?是因为名望不够,还是因为薪水不高?



会不会有一种可能,随着互联网发展到了一定的高度,其实下一个蓝海有可能是 ToB 市场?也就是那些传统行业的软件系统升级改造,极客时间已经有一门《To B市场品牌实战课》,而且似乎一些互联网大厂也在试图做 ToB 或者是 ToG 的产品。



架构师面试题



  • 什么是软件架构?

  • 如何写一个架构文档,文档中应该包含哪些方面的内容?

  • 子类 override 父类的方法后,想要修改抛出的异常,那么子类方法抛出的异常应该是父类方法抛出异常类的子类还是父类?

  • Spring 是如何实现单例的?和设计模式中的单例实现方式有什么不同?

  • 淘宝这样的大规模分布式互联网应用系统使用了那些技术方案和手段,主要解决什么问题?

  • 什么是 CAP 原理?请你描述某个你熟悉的 NoSQL 产品是如何解决 CAP 问题的。

  • 如何进行性能测试,性能测试的流程是什么?性能测试的主要关注指标有哪些?

  • 为什么在系统性能测试的时候,随着并发请求数的逐渐增加,错误响应(或者响应超时)的比例快速增加?请从操作系统的线程与进程调度原理以及计算机内部资源使用角度进行分析。

  • 为什么支持异步 I/O 的 Web 服务器(比如 Nginx)要比阻塞式的 Web 服务器(比如 Apache)性能好很多,前者要比后者可以处理的并发连接请求多几十甚至数百倍?请从异步 I/O 的线程阻塞特性进行分析。

  • 给定一个 key,为什么可以在 Hash 表中快速查找到 value?

  • 数据库索引是如何存储的?

  • Java 虚拟机的垃圾回收原理是什么?

  • 你怎么理解领域驱动设计 DDD ?DDD 的优缺点是什么?

  • 导致系统故障无法正常访问的原因有哪些?保障系统稳定高可用的方案有哪些?请列举并简述。

  • 如何保护数据库中存储的用户密码,请用时序图用户密码加密存储与登录验证的过程。

  • Spark 为什么比 MapReduce 快?

  • 淘宝、头条这些应用会针对不同用户推荐不同的商品和内容,他们是如何做到的?用了哪些算法?

  • Google 搜索结果页面是如何排序的,正好使用户最想看到的页面排在前面?

  • 区块链是如何保证数据无法被篡改的?

  • 什么是边缘计算?

  • 如果你觉得系统需要进行重构,但是老板和团队成员都觉得没必要,你如何说服大家?



看了一下这些面试题,大部分都不会,有的也许能够说出一点自己的理解,但是也不知道自己的思路是否正确,希望通过训练营的学习,能够把这些题目搞明白。



架构师的主要职责



  • 编写架构设计文档

  • 开发编程框架

  • 重构软件代码

  • 设计系统架构

  • 进行技术选型,解决技术应用中的问题

  • 优化系统性能

  • 模块分解与微服务架构重构

  • 保障系统安全与高可用

  • 大数据应用

  • 技术创新

  • 沟通管理



在这其中,我比较感兴趣的是重构软件代码、设计系统架构、技术选型和解决技术问题这三个模块。



开发编程框架的部分,从学习安排上看主要讲的是一些面向对象的设计原则,比如 SOLID 原则,对我而言算是温故知新,另外我比较缺少的是实际联系,希望老师的案例可以弥补我的短板。



对于沟通管理我比较好奇,一方面我相信沟通能力是可以锻炼出来的,熟能生巧;另一方面想要提高自己的沟通能力又很困难,本性难移。



架构师主要能力



  • 编程能力

  • 基础技术掌握能力

  • 常用技术产品的理解与应用能力

  • 性能优化与分析故障的能力

  • 常用架构模式和框架的理解与应用能力

  • 建模以及设计文档的方法和能力

  • 业务理解与功能模块及非功能模块拆解能力

  • 快速学习能力

  • 沟通与领导能力



我能说,这些能力我想要么?其中对我来说最重要的可能是编程、基础技术和快速学习。



什么是软件架构?



软件架构,是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计——维基百科



其实我觉的还是英文版说的更清楚一些:



Software architecture refers to the high level structures of a software system and the discipline of  creating such structures and system. Each structure comprises software elements, relations among them, and properties of both elements and relations. … Software architecture is about making fundamental structural choices which are costly to change once implemented.



另外还有李运华老师的版本:软件架构指软件系统的顶层结构。架构需要明确系统包含哪些个体(子系统、模块、组件);架构需要明确个体运作和协作的规则;顶层架构是为了表明架构层次,与子系统架构区别开来。



什么是架构师?



架构师是做架构设计、对系统架构负责的那个人。

架构师是一顶帽子,而不是一把椅子;架构师是一个角色,而不是一个职位。



我觉的其实这一段是本周课程比较打动我的地方,并不是说你获得了架构师的职位,你就会成为一个“架构师”,而是你做了架构师的工作,你就会成为架构师。即使是一个菜鸟程序员(或者是一个大龄程序员),其实也可以去做架构师的事情。



4+1 架构视图



4+1 视图模型仍然是软件开发中不可或缺的方法论,也许不那么明显,有时候可能没有形成文档,但是在架构师或者程序员的脑子里,应该是有的。



我觉的场景视图可能是 4+1 模型的核心,也可以看做是用例,或者敏捷开发中的用户故事。当然这一部分可能不是架构师的主要职责,而是产品经理或这是需求工程师的工作,但是架构师无疑是要理解用例场景的。



UML:软件架构建模的一般方法和工具



UML 的主要功能适用于沟通和思考。之前经历的一些项目,可能过于看重 UML 的精确程度,以至于花费了不少时间在画图上,而不是沟通和思考上。我感觉一张密密麻麻的 UML 图,其实很难做到“一图胜千言”的作用。



我感觉类图不太实用,如果能够画出类图来,那么基本上代码也就写的差不多了。而且可能会遇到代码已经修改,但是设计文档中的类图已经过时的问题。好像也够工具可以直接从代码生成类图,以前 Visual Studio 就可以生成类图。



部署图估计是每一分架构设计里面都会有的,不过专栏里面画了两个立方体有点奇怪,我之前看到的至少会把数据库画成圆柱体。



用例图是我认为最有用的,特别是在需求分析,以及概要设计阶段。做一个项目,不论大小,至少应该先有一个用例图吧。



设计架构文档



李智慧老师在课程中讲了两个自身经历的与 UML 相关的小故事。



在第一个故事中,一方面是因为李老师的主动作为,另一方面还是和技术储备有关系的。可能画出 UML 的架构设计图并不是特别困难,但是后续带团队做出开发框架,就需要有一定的技术能力了。另外,李老师的快速学习能力令人印象深刻。



两个小故事其实都在说“一图顶千言”,但是能够把图画好,让别人一目了然并不容易。



以前比较抗拒写文档,后来想明白了,发现自己并不是不愿意写文档,而是不愿意写那种比较空洞的设计文档。文档作为沟通方式,或者是保存思考结果,本身还是有意义的。



在《从零开始学架构》的专栏里面,也给出了一个架构设计文档的模板,也可以参考一下。



参考书目



做了一个豆列,方便大家查找:极客时间架构师训练营参考书目



  • 程序员修炼之道

  • UML 精粹:标准对象建模语言简明指南(第3版)

  • 敏捷软件开发原则、模式与实践

  • 大型网站技术架构核心原理与案例分析

  • 互联网创业核心技术:构建可伸缩的 Web 应用

  • 企业应用架构模式

  • 实现领域驱动设计

  • 架构整洁之道

  • 程序员的思维修炼

  • 你的灯亮着么?

  • 成为技术领导者

  • 不懂带人你就自己干到死



参考资料



  1. 极客时间《后端技术面试38讲》08 | 软件设计的方法论:软件为什么要建模?

  2. 极客时间《后端技术面试38讲》09丨软件设计实践:如何使用UML完成一个设计文档?

  3. 极客时间《从零开始学架构》50 | 架构实战:架构设计文档模板

发布于: 2020 年 09 月 18 日阅读数: 48
用户头像

escray

关注

Let's Go 2017.11.19 加入

大龄菜鸟项目经理

评论

发布
暂无评论
01 架构方法