架构师备考的一些思考(二)
前言
以我的视野来看,部长或技术总监这种岗位还是比较难竞争的,换言之,程序员的上升空间比较窄,如果想要拿到高级岗位,最好的是工作三五年后就转项目经理,然后再往上爬。
架构师倒是也能晋升高级岗位,但就效率而言,是非常低的。就我的经验而言,架构师系的高级职位通常是技术管理一手抓,但这也代表着,责任更大,也就是锅更大。
所以架构师系的高级职是非常不稳定的,非常累,非常容易坚持不下来,尤其在你结婚生子后,就更难坚持下来。
所以,选择大于努力,如果想拼命向上走,还是尽快入坑项目管理才是上策,不想拼命或者做不到拼命的,那就无所谓选择了。
就算是同样的架构师,java系架构师也相对更好,生态好意味着java系架构师就相对学的不用那么多,也就不用那么累。
举个简单例子,java架构师可以不会安卓和鸿蒙,但net架构师必须会winform和wpf。
所以,还是那句话,选择大于努力,能入坑java还是尽早入坑java,这样你会少走几年弯路,而且如果你躺平了,能让你35岁以后能继续用技术吃饭,还吃的不错的,就只有java的生态。
当然,java系还有细分的,能选大数据就走大数据,大数据是一个工作内容异常简单,工作量异常少的一个岗位,而且大家还觉得你工作内容很神秘,会比较有尊严。
就我的个人学习flink的经验而言,学习flink的难度只有学习java的难度的30%,但你的工资可能高于java,加班也会少于java。
下面回到正题,架构师备考。
架构师备考——记忆难点
其实所谓的记忆难点,就是我们的理解和扯淡描述之间的转换比较难。
原型模式(property)
通过copy对象属性,或者clone获得新对象,就是DTO转实体的那个对象属性映射。
要能通过下面定义分析出他在描述的是原型模式。
用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。运行对象在不了解创建对象的确切类以及如何创建细节的情况下创建自定义对
象。
Builder(生成器模式)
就是java里常见的builder创建对象,或者理解为注解@Builder。
注:其他语言没有这个模式,其他语言开发,就理解为构造函数创建对象即可。
要能通过下面定义分析出他在描述的是生成器模式。
将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。
Abstract Factory(抽象工厂模式):
通过不同的接口来获取不同对象。
注:抽象工厂模式与工厂模式的区别是,工厂模式是通过入参来获取不同的对象。这两种模式在其他语言中是随手写的代码,所以没有形成概念结构,这里要学会区分。
要能通过下面定义分析出他在描述的是抽象工厂模式。
提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。
仓库风格架构
- 集中存储:就是说数据都在一个数据库里。
- 数据驱动:就是说数据一更新,查询该数据就马上得到最新数据,因为都在一个库。
- 数据处理方式:就是存储到数据库
- 扩展性:可以增加插件扩展功能。
- 性能:可并行处理,性能高。
管道过滤器风格
- 这个主要是考察servlet的机制,所有的题型往servlet里靠即可。其他语言开发就把他像成一堆filter即可。这个一般情况是架构中的一个小环节,纯用管道过滤器做出来的组件还是很少见的。
- 特点:数据流动,功能单一,组合灵活。
- 扩展性:可以灵活增加filter。
- 性能:可并行处理,性能高。
规则风格
- 特点:通过修改规则修改系统。
- 扩展性:通过修改规则应对新情况
- 性能:支持并发,性能高。
面向对象
- 特点:封装,继承,多肽
- 扩展性:利用继承和多胎进行扩展
- 性能:操作封装在一起,支持并发,性能高。
风格代表
数据流风格:批处理序列、管道-过滤器
调用/返回风格:主程序/子程序、面向对象、层次结构。
独立构件风格:进程通信、事件驱动系统(隐式调用)
虚拟机风格:解释器、基于规则的系统(医疗诊断系统),
仓库风格:数据库系统、超文本系统(博客系统)、黑板系统(语音识别,chatGPT都是使用声学模型、语言模型等多个模型来处理问题)。
数据驱动机制
数据驱动机制就是数据驱动的方法,有几种:数据库驱动应用,配置文件驱动应用,脚本语言驱动应用。这个有点IOC的感觉,控制翻转,反向以数据为中心驱动应用的表现。
页面变换表
这个是必背的,一定会有1 ~ 2空,即这1 ~ 2分是必拿的。
虚拟内存:虚拟内存就是物理内存和部分硬盘(辅助存储)组合起来,供cpu调用的。
虚拟页面:在虚拟内存系统中,程序所使用内存,被细分成多个内存块,这些内存块就叫虚拟页面。
页帧/物理块:就是虚拟内存对应的物理内存和硬盘的地址。
页面变换表:就是用于记录虚拟内存中的页帧/物理块之间的对应关系。
存在位(Present Bit):表示该页面是否当前在物理内存中。如果存在位为 1,表示该页面在物理内存中;如果为 0,表示该页面不在物理内存中,需要从辅助存储中调入。
访问位(Access Bit):记录该页面是否被访问过。操作系统可以根据访问位来决定哪些页面是最近使用过的,以便在需要换出页面时进行选择。
修改位(Modified Bit):表示该页面是否被修改过。如果修改位为 1,表示该页面在被调入物理内存后被修改过,在换出时需要写回辅助存储;如果为 0,表示该页面未被修改过,可以直接丢弃。
保护位(Protection Bit):用于指定该页面的访问权限,如只读、读写、可执行等。
页号 | 物理块号/页帧号 | 状态位 | 访问位 |
---|---|---|---|
0 | 1 | 1 | 0 |
1 | - | 0 | 0 |
2 | 3 | 1 | 1 |
3 | 8 | 1 | 1 |
逻辑地址16位:3148H,第一位5表示虚拟页面地址,页内地址是148H,查表,3对应的页帧是8,所以转换物理地址为8148H。
如果访问1页,因为1页状态位0,所以是没有在内存的,所以要淘汰一个在内存的页,为这次访问提供位置,那么淘汰0页,因为0页在内存,且近期未被访问。
质量属性
质量属性的含义如下:
性能(响应时间),可用性(宕机恢复),可修改性(修改时间短),易用性,可靠性(容错、健壮性),安全性(验证逻辑,阻止非授权用户)
- 提高性能——资源调度(就是负载均衡)
- 提高可用性——心跳(考试里的可用性是专指——服务查询(nacos)的心跳体系,通过心跳上线下线服务)
- 提高可修改性——信息隐藏(这个比较难记难理解,我猜测是他们认为一个表单修改的内容减少了,就提高了可修改性,这个要特殊背一下,有点反逻辑)
- 易用性——这个就是用户使用难易度。
- 可靠性——容错、健壮性。在意外或错误使用的情况下维持软件系统的功能特性的能力。
- 提高安全性——追踪审计,就是记录日志和溯源。
安全性在考试里应该是特指java的Security和Auth2,他这套逻辑还是挺难理解的,尤其是结合了java的控制反转的结构。(java现在搞的组件设计都是控制反转,而其他语言都是正向开发)
非java系开发可以参考下面文章理解。
其实,如果是我们正常的、手工搭框架,我认为即便是java架构师也会把Security和Auth2踢出局,因为他这个模式有问题,不过,考试里很多题都会参考这个出,非java系开发,这块就只能蒙了,确实不好理解。
SpringBoot的Security和OAuth2的使用
构件类别
这个构件体系,就是spring的体系,因为整体是IOC,所以,就一个一个的构件往里注入。
由于我们大部分开发都是做应用开发的,而这种构件模式,虽然有,但相对还是比较少见的,非java开发可能工作20年也没这么开发过软件的可能性是很高的。
非java开发可以把这个构件模式想象为docker。java开发就比较幸福了,下面的定义一看,马上就可以联想到spring的各种组件了。
- (1)独立而成熟的构件。独立而成熟的构件得到了实际运行环境的多次检验,该类构件隐藏了所有接口,用户只需用规定好的命令进行使用。例如,数据库管理系统和操作系统等。
- (2)有限制的构件。有限制的构件提供了接口,指出了使用的条件和前提,这种构件在装配时,会产生资源冲突、覆盖等影响,在使用时需要加以测试。例如,各种面向对象程序设计语言中的基础类库等。
- (3)适应性构件。适应性构件进行了包装或使用了接口技术,把不兼容性、资源冲突等进行了处理,可以直接使用。这种构件可以不加修改地使用在各种环境中。例如 ActiveX等。
- (4)装配的构件。装配(assemble)的构件在安装时,已经装配在操作系统、数据库管理系统或信息系统不同层次上,使用胶水代码(gluecode)就可以进行连接使用。目前一些软件商提供的大多数软件产品都属这一类。
- (5)可修改的构件。可修改的构件可以进行版本替换。如果对原构件修改错误、增加新功能,可以利用重新“包装”或写接口来实现构件的替换。这种构件在应用系统开发中使用得比较多。
构件的分类方法
构件分类方法可以分为三大类,分别是关键字分类法、刻面分类法和超文本组织方法。
关键字分类法:就是写几个词描述构件,然后词分类。
刻面分类法:就是写几个段落描述构件,然后段落分类。
超文本组织方法:就是写个文章描述构件,然后文章分类。
然后看这道题:
基于构件的软件开发中,构件分类方法可以归纳为三大类:()根据领域分析的结果将应用领域的概念按照从抽象到具体的顺序逐次分解为树形或有向无回路图结构;( )利用 Facet描述构件执行的功能、被操作的数据、构件应用的语境或意其他特征;()使得检索者在阅读文档过程中可以按照人类的联想思维方式任意跳转到包含相关概念或构件的文档。
答案是:超文本,刻面,关键字。
中间件
这里考的中间件是特指kafka和redis和nacos,其他语言就用rabbitMQ和redis和consul思考即可。
连接与通信:考试中认为,中间件是客户端与服务器的连接与通信(连接与通信是中间件的一个属性,在考试里认为它是主要属性,我个人感觉这么定义是有点怪,但还是能给与一定理解)
交易管理机制保证交易一致性:这个应该指的是用redis构件的分布式锁。
负载均衡和高可用:这个指的是nacos,一个内部组件Load Balance(低版本的是Robbin)实现负载均衡,一个是心跳实现高可用。
关系模式 R(U,F)
这个主要是要记一些名词。
在 “R(U,F)” 中:
“R” 表示一个关系模式(Relation Schema)。
“U” 是属性集(Attributes Set),即关系模式中所有属性的集合。例如,一个学生关系模式可能有属性集 U = {学号,姓名,年龄,班级号} 等。
“F” 是函数依赖集(Set of Functional Dependencies),用于描述属性之间的约束关系。例如,F 中可能包含函数依赖 {学号}→{姓名}、{班级号}→{辅导员} 等。
- 如给出关系R(U,F),U={A,B,C,D,E,F={A→BC,B→D,D→E}。
则有【依赖传递】,A→B,B→D,D→E。
根据依赖传递,可得新依赖关系,A→D,A→E - 如,U1={A,B,C)、U2={B,D,E},则分解p()。
这个问题是问拆表,把U表拆成俩表,然后字段是U1={A,B,C)、U2={B,D,E},这个拆表,比较好理解,我们经常拆,题中的拆法,是正确的拆法,所以什么也不影响,所以【无损连接并保持函数依赖】。
无损连接就是没丢字段。
数据库分布式模式
这个数据库模式是针对java系的mysql数据库设计的,在java项目中,有时候会使用现有的开源项目,这些项目大多数是微服务模式的。
然后这些开源项目,通常会把表拆到8到20个数据库中,因为一开始起步时表和库就过多,所以之后,随着开发,表和库的混乱就是指数倍的增加,库表越多操作就越复杂,所以一些平平无奇的项目,也会有一些和淘宝京东这种大系统一样的困难要去面对。
也因此,有一些概念,本来是要到特定的环境下才需要学习的,但在java系统,就变成了常用概念。
- 全局外模式:
兽语:是对分布式数据库的最高层的抽象。
人言:全局外模式是一个图。就是是把分布式数据库看成集中数据库,集中数据库就是一个数据库。然后用一个图描述数据库结构。 - 全局概念模式:
兽语:是分布式数据库的整体抽象,包含了系统中全部数据的特性和逻辑结构描述分布数据库全局数据的逻辑结构,是分布式数据库的全局概念视图。
人言:全局概念模式是一个图,分布式数据库的整体、详细的逻辑关系图。 - 分片模式:
兽语:描述全局数据逻辑划分的视图,是全局数据的逻辑结构根据条件的划分;每一个逻辑划分就是一个片段或称为分片。
人言:不是图,他是拆分数据库,就是横向,纵向拆分,比如按字段拆,按日期拆。 - 分配模式(分布模式):
兽语:描述局部逻辑的局部物理结构是划分后的片段(或分片)的物理分配视图;是全局概念层的内容。
人言:是一个图,就是记录上面的数据分片的逻辑关系图。 - 局部概念层:
兽语:由局部概念模式描述,是全局概念模式的子集;全局概念模式经逻辑划分后被分配在各局部场地上。
人言:局部概念层是个图,分布式数据库会有多个库,这个局部概念图就是节点库的逻辑描述图。
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!