技术人人都是xx
父文章 人人都是面试_个人渣记录仅为自己搜索用的博客-CSDN博客
相关文章 架构师好书推荐_个人渣记录仅为自己搜索用的博客-CSDN博客
目录
什么是架构,如何画架构图
什么是架构 架构图_个人渣记录仅为自己搜索用的博客-CSDN博客
架构师是什么
基于ddd的再理解:
首先架构分为四层, 业务架构,技术架构,应用架构,部署架构.
业务架构一种是跨应用,跨业务, 一种是应用内, 本质都是领域实体的设计,基于此的模块封装. 先小再大. 先大再小,直接抽象成 账务,对象,订单,供应链,支付,营销 履约,
架构师就是解决痛点, 业务破局, 架构破型的那个人. (之前高级工程师那些也要知道,要能知道高级工程师,培养高级工程师,有些框架类的活,需要有人来干, 数据分析的活,需要有人来干,具体的活,或者只想方案,具体干活总是会有各种问题,代码必须具体.)
架构师中台思维
架构师的kpi
kpi = 面向未来的业务破局,规划 + 业务破局技术支持( 架构师就是产品经理 ) , 面向痛点的架构能力(考察架构师的知识体系,本团队没有的新技术,新框架,新系统,新平台引入落地解决实际痛点问题, 包含稳定性建设(方案改进,流程指定执行,优化方案指定并让开发执行), 少量业务支撑
前提是:
你要是流程专家,概要设计专家,流程专家
要深刻理解活动图,流程图和时序图的不同之处? 详见
技术人人都是好的需求评审专家- 如何需求评审,需求评审评什么.
人人都是好的软件开发设计师_技术设计金字塔_个人渣记录仅为自己搜索用的博客-CSDN博客
熟悉各个行为链,熟悉各个角色,熟悉各个角色下的场景, 或者能够思考出新的场景. 痛点可以从整个价值链(行为链)的各个阶段改进.业务破局是可以从各个阶段破局.也可以从角色角度破局,依赖角度破局.
必备技能之架构图
人群分类, 客户依赖分层
画架构图:
包含了模块之间的交互协议,有无状态(扩展性),以体现技术性. (架构图还有部署架构图等)
参考产品: 一张图讲清楚产品架构,手把手教你画产品框架图 ( 产品架构图) .另外一篇文章"以红包雨的需求为例,问题域是这样一个集合". 架构图静态,最好有交互action,数据流. 层级一致: 1. 系统级,每个框里可能都有(h5,服务端等角色) 2. 端和服务端分开的架构图. 会复杂,但是对开发来说明确,透明.
架构= 模块图 + 模块流程图(启动 和 主流程 ,可以用拟物 tag) 或者 模块时序图) 懂得平台思想,user-biz core层.
平台思想: 就是表面上的互相调用,看出内部本质的共同部分. 底层组件互相是独立的.这样子才能实现上层业务的快速组装.
必备技能之业务了解能力
两个公式, 人群分类
如何接手一个业务域.
熟悉现状:
1.角色行为链
开发 1. 熟悉各个阶段,行为链(开发,单测,发布,联调,测试,预发,灰度)如何操作
2. 业务本身.
通过鹰眼,存储的insert,update分析. 整理出表结构关系图.对代码静态依赖,动态业务和代码入口有比较熟悉的了解. 动态+静态 . 对象很重要,模块很重要. 从产品角度,用户很重要
架构师的文档能力
并发能力
仔细看看concurrentHashMap 的 扩容相关部分和 java并发框架里涉及到的 公平锁等. 结合数据库的锁互斥概念.
大量阅读别人的系统实现文章
代码开发
[理论]领域驱动设计 DDD 是啥,cqrs是啥_个人渣记录仅为自己搜索用的博客-CSDN博客_cqrs ddd
设计模式
架构师之设计模式_个人渣记录仅为自己搜索用的博客-CSDN博客
设计原则6大原则解读--_边界设计原则_个人渣记录仅为自己搜索用的博客-CSDN博客
监控
安全生产 - 稳定性建设的方法论 架构师应该做什么? []_个人渣记录仅为自己搜索用的博客-CSDN博客
管理- 稳定性治理和管理 - 脏活累活 - 多租户 - 权限管理
容量/流量评估
最好能做成自动化巡检. 链路很关键.
思维目录
架构师的架构思维目录_个人渣记录仅为自己搜索用的博客-CSDN博客
治理系统
根因分析
防抖
JavaScript 防抖 架构 _个人渣记录仅为自己搜索用的博客-CSDN博客
附录
业务静态动态融合自动报表系统
1.结合odps源表和odps表元数据,自动化得到枚举字段(null,有值).
2. 对维度表进行整理,整理出字典表 , 把业务分类.
3. 流量记录
4. 将流量traceId结合唯一主键相关的业务表,得到业务维度信息.
5. 所有入口流量都有了业务维度信息.
6. 重放这些流量(需要记录随机函数值,同时mock掉这些随机函数). 执行到的if else点 (需要在线下,把执行了哪些类,行信息记录下来结构化), 和外部接口交互, 内存配置交互都记录下来.
6.1 设置好几个重要的维度, 可以把支付回调和支付统一时序图自动画出来.(包括数据库等交互)
6.2 ide插件工具. 阅读代码的时候,一方面了解if else决策字段的值来源 (能力视角),另外方面反向知道哪些大维度业务执行了(业务视角), 扩展到其他业务是否够通用.
7. ide插件工具. 每个配置的值,入参的枚举参数可能不一定在本系统用,只需要文档注释. 在对应的class的那个字段上
7.1需要维护一份 日志的class信息, 配置读取的class信息. 这样才能在看代码时反查含义.
流量回放问题,如果改了代码流程. 就会出问题. 先进行按顺序的mock,然后按接口uk_Id mock和校验(需要手动写插件). 多线程的话, 需要将thread排序,每个顺序的外部接口调用是明确的.
架构师的架构思维目录-blog
脑图不需要按空格,收缩行
https://www.processon.com/view/link/58c7cbbfe4b020bb58b2e0d6
deadLine和荣誉感是最大推动力. 拆解和推进.
模块划分,职责清晰. 做的好不好.
P7,P8要求 :
规划能力-抓手(有时候抓手都可以让对应的同学完成. 头脑风暴一下, 沟通,分赃会) : 6大设计原则,设计模式. 抽象出来几个字. 需求方要求,准,快.
需求分析能力: 人,系统, 流程,(功能性,非功能性),做一个最担忧什么? 技术方案,边界交互,可靠性(宏观上的). 细节字段(业务上的)
优化能力: 结构化异常信息的分析归类,拆分能力.
架构师角度,面梳理,依赖工具见下治理,统筹安排.
普通开发角度,基础知识
管理角度:流程管理,人员培养,内部 case 学习,每日值班制度.
软性:
职责明确能力:
鼓励能力:
选型能力: - 可靠性,扩展性,可用性,压测和性能瓶颈.
改进能力: 错误问题
我理解的架构师需要掌握的知识
1. 用例收集能力,业务模块切分能力.领域设计能力.
功能设计,非功能设计 . 如何保证架构设计的灵活性与可扩展性
人人都是好的软件开发设计师_技术设计金字塔_个人渣记录仅为自己搜索用的博客-CSDN博客
没有用例图的实体图就是耍流氓.
实体生命轴
对于builder设计模式,其实就是基于用例抽象出方法后自然就实现了. 对复杂的代码,1.看理解,2.思考行为,用例.3.补全testCase,再重构. 三步法.
* 规划能力,分解能力,抓手和指导能力.
人角度切割(乘客,客服,司机,运营),视图层业务. 将用户角度的视为前台主业务.
基础服务抽取的时候,存储和计算分离也很自然. 积分和积分计算,帐户和营销加款
2. 类设计和编程落地能力. 能写高可读和应对变化,可维护代码.
熟悉java锁源代码,readwritelock.
缓存策略代码写. 分层.
jvm各命令含义. jmap -heap jstack
jvm paral cms g1垃圾回收算法.特别是g1
锁力度
for 1w问题
分页问题,两次查询分库分页.
方法同层次
try 重试. 单次可用性,dubbo check
tcp nagle . http://blog.csdn.net/ithzhang/article/details/8520026 .
国际路线问题,数据双活.
type类化,字段类化(map等)可带走一大堆相关逻辑到对象中.
3. 看别人代码能力,可重构点能力. 分层不合适,方法抽取, 重复代码合并下层 ,类型接口化. 见面向领域设计p203的闭合运算重构
3. 承担系统重构和切分的方案和项目推进落地.
dao不动,先动service.
各层次接口化,杜绝依赖.
包依赖插件检查.
4. 高可用,高并发,可扩展性.各场景方案的了解.
稳定性(n个接口1个失败) 链路error日志统计归类,基于结构化日志.,可用性(). 可靠性(持续一段时间不可用是最悲剧的)
单行极限和可用性互斥. 高并发的方案就是拆拆拆.
zk不可扩展.把他认为是单机.前面搭建一个proxy 一致性hash集群.
超时解决方案是环.(超时30秒,格30个,误差1秒),两各数组切换.误差 30-59秒.(从启动,到切换,再切换,三次画图可知.)
分布式自增id .
架构. ngnix前面是智能dns. 双活和cdn基础.
SNow(并发太高可能重复)和腾讯的序列号自增方案.
高并发io相关技术,io中断多核并行.达到几万tps. 不然才1w tps. io超时回收, 环.
算法,B+树,hadoop排序(数据预清洗). mysql 多行高并发和单行高并发改造.
AB Test指标可配置接口化系统,流式计算接口化系统.
一键降级系统
低耦合配置系统(低耦合,依赖本地文件存储) kdiamond 开源其他
中台策略点业务配置系统. 先流程切割,再领域实体. 结构化. 而不是仅一层.
配置中心是如何实现实时推送的:长轮询_进京务工小卢的博客-CSDN博客
全链路压测,
计算同城双活(跨城专线通信,增加用户体验),数据同城双活(类version,cas保障,虚拟ip可随时切换.),依据人变动可切换该人主数据的双活.
可伸缩的DBproxy中间件,codis.
弹性计算云,kubernoter coker
kop
redis进化为zk. 同时复制两台. 客户端1访问redis1,客户端2访问redis2.无法解决,zk通过master来解决.
中国开源软件评选 http://www.oschina.net/project/top_cn_2016?sort=1
5. 业务growth能力和对应体系了解和搭建能力.
AB TEST平台.
6. 系统见识,引入新的技术能力/框架
kop 规则引擎 流程引擎
快速开发框架 crm快速web设计系统.
异地多活 ldc , global czone(商家分库id) rzone(用户分库id)
阿里技术专家甘盘:浅谈双十一背后的支付宝LDC架构和其CAP分析(含phil补充)_个人渣记录仅为自己搜索用的博客-CSDN博客
T5+(P6+)
1、实现一个带超时功能的connect函数
考察点:linux网络编程、non-blocking、select/poll/epoll的使用、对底层库的了解程度
默认的connect为阻塞,通过设置socket为non-blocking、监听写事件来做到非阻塞超时connect。
参考点:大多数网络库都有相关或类似实现,最直接的可以看golang net库源代码,其DialTimeout的底层实现即是此问题。
引伸点:
(1)若面试者能答出用select或epoll实现,进一步考察select、epoll工作原理,如epoll是如何存储fd的,如何做到用“回调机制”将就绪的fd返回,select和epoll区别等;
(2)linux网络编程的其他要点或其他函数的使用,如shutdown、reuseaddr,进而可引伸出TCP协议状态机、TCP协议粘包处理、TCP协议滑动窗口机制、TCP包重发机制等;
(3)IO多路复用处理并发网络连接的基本模型、要点;
(4)对boost asio、libevent、libev或其他库的了解程度;
(5)线程池的实现以及要点。
2、实现一个简单的内存池管理,要求在多线程环境中高效使用
考察点:内存模型、内存分配过程、内存碎片处理、对tcmalloc之类的库的了解程度、对STL了解程度
参考点:主要可参考tcmalloc实现,golang内存分配和gc机制也是类似原理。
引伸点:
(1)若面试者能大概答出tcmalloc的架构,可进一步考察用户空间如何从内核空间申请内存,包括相关的系统调用;
(2)默认的库函数malloc/free(new/delete)的不足之处在哪?为什么要引入这样的东西?STL默认的内存分配器是如何工作的,有没有什么问题?
(3)若能答出golang或其他语言的内存分配和gc的类似机制,进一步考察对实现细节的了解程度;
(4)可引伸至fork、vfork、copy-on-write、无锁队列等问题进一步考察。
3、实现一个线程安全的单例模式
考察点:c++基础、设计模式、多线程编程、各种同步机制
参考点:遍地可找到,如果此问题都答不出,在架构组基本不用考虑继续面
引伸点:
(1)单例模式的“懒汉”和“饿汉”的区别,如其实现的是“懒汉”模式(通常答的都是这个),考虑让其以“饿汉”模式实现,可以适当提示,同时,两种模式各有什么优缺点?
(2)进一步考察c++基础问题,考察其对c++的理解程度,包括RTTI、c++对象模型、虚函数工作原理、虚表结构等问题;
(3)基于(2),进一步考察如java语言或go语言都填了c++的哪些坑,这样做的目的是什么?
(4)c++的一些经典内存问题,如构造函数异常、非线程安全的析构等,进一步可引伸出智能指针的原理及使用要点;
(5)进一步考察其对boost、c++0x等对此问题相关的支持及面试者的了解程度;
(6)进一步考察多进程、多线程的各种同步机制及其差异,可进一步要求其实现一个经典的生产消费者模型;
4、实现hash表动态扩容缩容的过程
考察点:经典数据结构、多线程编程、“双缓冲buffer”的类似思想
参考点:redis的hash table动态扩容缩容过程
引伸点:
(1)此问题通常是面试者提到“了解、熟悉甚至精通redis”的情况下问出,如其能答出,进一步考察redis其他核心实现的要点,如事件驱动机制、如何写rdb,redis如何做持久化,持久化的时候又有什么问题?进而的解决方案是什么?
(2)进一步可引伸出redis代理,如twemproxy、codis的相关原理及实现;
(3)进一步了解其对底层数据结构的掌握程度,如跳跃表、RB树、B树等各种对比,进一步可引伸出LSM树和基于LSM树的各种DB,如level DB,列式存储等,进一步可考察mysql架构、mysql各种存储引擎的对比,mysql如何做分库分表、sharding、主从同步以及不足之处在哪?为什么MyISAM会比Innodb的查询速度快。 btree 和 lsm(hbase) ,cola 树(tokuDB)选型和原理_个人渣记录仅为自己搜索用的博客-CSDN博客_myisam为什么比innodb查询快
1.8 leveldb vs rocksdb 优劣分析 对 write stalling stal 的调优_个人渣记录仅为自己搜索用的博客-CSDN博客
(4)进一步了解其对其他第三方开源组件的了解程度,如常用的消息队列。
分布式事务
5、实现一个简单的3份数据冗余同步复制过程或双机热备主从同步过程
考察点:分布式存储经典问题、分布式原理、各种分布式协议
参考点:hadoop的相关实现
引伸点:
(1)GFS及类似GFS的分布式存储系统的架构及其实现,NWR、CAP、paxos、raft、二阶段提交等协议,以及这些协议到底解决了什么问题?
(2)可引伸出类似zookeeper、etcd等分布式协调服务的同步、选举过程
(3)如何做基于tcp长连接的心跳服务?
(4)实际工程中使用这些分布式系统的经验及了解程度
6、求和的绝对值最大的连续子序列 如{-5,4,-20,16,-2,-3}
考察点:算法
参考点:遍地是
引伸点:
(1)通常能给出O(n^2)算法即为OK,可进一步提示其优化至O(n )算法;
(2)进一步考察常用的算法分析方法,即分治、动态规划、回溯等,可进一步考察某些排序算法,如快排,但如果问到了快排,可进一步考察各种库如何实现了快排,做了哪些优化来避免最坏情况的发生?
(3)分析问题能力,是否用比较合适的方法来解决一个问题。
======其他人见解====
转至元数据起始
1.意识(下意识,条件反射式的修养,训练成与生俱来的能力)
(1)化繁为简(抽象建模,模型)
- 主要体现在对系统的控制力上,能够一针见血的发现系统主要问题并给出具体可行的方案
- 高级抽象能力(利用生活中的例子来思考与理解面临的各种问题),高速公路中通停车道划分(系统上线后维护时一部分服务器保持现状,一部分服务器进行维护,一点一点地完成系统的修改)
- 至繁----->至简(抓住主要问题,能够使用简单的方法实现就绝对不会把系统复杂化)
(2)运营(保证系统的可持续发展)
- 不管系统UI好不好、代码结构好不好,只要能够满足基本功能需求,就先把系统搭起来并上线,然后慢慢的优化一步步地调整,这充分考验了架构师设计架构考虑问题的预判性与专业性
- 根据产品、运营与市场的动态功能需求与变化,需要实现对系统整体结构进行不断地调整,决定了架构的设计需要满足可变化的要求
- 产品再上线运营以后功能以及策略随时都会发生变化(游戏里面策划就经常改变主意,这是由产品的用户体验导向性决定的,因为用户对产品的感觉是难以一步确认的,需要在交互的过程中不断的改变),持续改进
- 没有做过运维,做不好运维的架构师不是好架构师
(3)有损(意外随时都会发生)
- 应该对一切不可抗力做好万全准备,因为任何事情都有可能发生,所以要做好系统服务的降级准备,保证最基本的功能可用性(最高级别对应最强方案),保证用户能够忍受灾难对系统的影响
- 要努力平衡好自尊心与事实情况,什么事情都不能说的太过于绝对,因为没有人能够保证自己不是犯错,也不敢保证可能性非常低的事情不会发生,虽然概率只有0.001%,但它也有发生的可能性
- 有用法则:倾尽全力(对待系统面临问题的态度,尽量避免所有情况对系统造成的打击,做好充分的容灾,在意外情况下可以降低体验,但是一定要保证系统可用) 高可用的基本原则
2.能力(是量的积累与升华沉淀的过程,需要不断的回顾与总结) 基本功,是一切的根源
(1)技术能力
初级:
- 网络编程
- IPC通信
- Posix(信号量、线程同步)
- 数据结构(理论与经典实现的代码阅读)
- 面向对象思想(保证代码结构设计的可控)
- 数据库(掌握基本原理,完整性、范式)
- 操作系统(文件系统,主要瓶颈就在I/O)
中级:
- 网络知识(物理拓扑、网络协议原理、设备理论及相关算法)
- 内核态(操作系统,内存管理、时钟中断(定时器、红黑树实现大批量)
- 设备管理(字符设备、套接字、文件等)、进程调度管理(switchto文件))
高级:
- 机器学习算法(浅层算法的实现原理及代码阅读,以分类为例,贝叶斯、极大似然相似、决策树) 互联网(工程(计算机应用)+科学(人工智能算法,数学理论性强))
(2)架构能力
初级( 达到上线水平):
- 性能(刚性需求,主要体现在系统的抗打击能力上)
- 安全(意识和想法,尽量减少安全漏洞和隐患,安全机制健全(4联单))
- 过载(服务能力,保证系统在高流量冲击的情况下可以有序解决流量冲击)
- 灰度(先让一部分用户优先体验并验证有无问题,即所谓的公测,利用他们充当测试工具)
中级:
- 平滑扩容(做到后可达到初级架构师水平,一般来说添加master,上线过程中不停机不停服务实现服务能力提升)
- 部署(通过为产品制定的策略、制度等来反推架构、配置甚至代码,也包括系统的部署方案)
- set模型(要对系统进行规划,实现有序的发展,将系统划分成很多可以描述整个系统的独立单元,麻雀虽小五脏俱全,集装箱)
- 染色(能够将一组操作旁路出来,抽取具有异常行为的特定用户,跨机Debug、4联单、区分用户行为,以搜集具有不良行为的用户样本,分析应对方案。做到数据流与信令流(信号流转switch doNext,回调机制(好莱坞模式)、c++ ddget(委托))分离)
高级:
- 分布(机房、地域,具体到不同行业分别需要以不同的方法来处理) 、
- 柔性(应对意外情况,对系统功能进行优先级标记,优先级高的功能采用最强方案,实现倒金字塔服务应对方案)
(3)产品能力(产品意识,对产品的敏感程度,抓大去小)
- 主次矛盾(如果没有一个很好的产品,架构会做得非常复杂,良好产品可以更好的帮助架构师做取舍,而架构师的主要能力则体现在取舍上)
- 理解产品诉求的能力,选择合适的交互次数以缓解用户的厌烦程度
- 当系统不可用之时,首先给一个替代方案(甚至可以采用善意的谎言,制定一定的假象都可以,滴滴可以虚拟几车辆让用户以为运气不好叫不到车),缓解用户的心理落差(平缓一下用户的激动情绪)
- 让用户多试几次也无妨,对一些不太重要的数据没必要保证系统的强一致性,可以提供操作接口让用户主动去刷新,使得系统更加稳健,简化系统所要处理问题的复杂度
- 要真正地作为一个用户去使用产品(更好的体验产品的真正诉求,通过角色转换能够更好的做好各方面的取舍)
(4)行业认知(对通用架构的补充)
- 首先要具有广泛的互联网产品使用,以提取通用的精华的策略流程等内容,学习并体会人家的取舍过程与结果
- 跨域快速学习(在陌生领域具有无限的上升空间)
(5)管理能力(技术管理)
- 团队融合沟通、自我认识与管理(抓细节还是抓大放小,放不放权,对细节了然)
- 团队认知(团队的匹配程度,如何平衡各成员实现最合适的搭配,都是牛人反而不好管理)
3. 胸怀
(1)大局观(前瞻性)
- 保证系统的可控,对系统具有极强的驾驭能力
(2)大将之风 (无畏,气度)
- 遇事沉稳(因经历太多而锻炼出来对于处理重大问题的丰富经验,快速成长,遇事不慌,敢于尝试)
- 遇到未曾遇到过的重大问题,能够将强的熬过去(强大内心,能够熬过去非常重要),积极尝试解决方案,结果导向,一切要以解决问题为形式之根本原则
(3)好学(不耻下问)
敢于向职位级别低的人讨教问题
(4)乐于分享(成就他人)
突破个人天花板的关键,因为在分享的过程中才能发现自己到底有没有掌握,而且互相分享以后自己能力的提升速度会变的快
4.经验
(1)过载应对方案(学习海关)
- 蛇形阵(多加几个简单的流程,保证流量的均衡分载)
- 限流(先承认自己响应不过来,提醒用户服务器忙稍后再试,给服务器增加缓冲时间)
- 预期(根据总量及当前访问人数,大致预先判定不良后果,提醒用户有可能出现的结果,通过减少非急迫访问需求用户来降低访问流量)
注:队列也是一种方法,不过队列有可能超时(想象一下在银行取钱时排到自己时取款机没钱时或者打饭时轮到自己就没饭了是一种什么样的感受)
要敢于丢弃应付不过来的流量,并且提供一个很好的UI来减少用户的烦躁与忧虑感,提升用户的忍耐程度
流量控制(类似于TCP,流量越大则队列长度应该越短,以防系统处理不过来造成拥堵)
(2)下一层永远不相信上一层,上一层要充分保护下一层(即优先在最前端机绝大部分问题,越往后处理的代价就会越大)
(3)协程
(4)协议及通讯不受易购系统的影响
(5)边重构边生活是架构师的常态(要勇于重构,勤于重构,以防积重难返导致重构难度巨大)
(6)MCP