软件架构师在软件开发团队中扮演着高级的角色,这一角色需要时间和经验的积累,需要跨职能的技能和知识。除了技术方面的挑战,还要求架构师具备良好的社交能力。在开始考虑成为软件架构师的计划之前,我们先来看看典型的软件架构师类型:
Software Architects are senior level actors in software development team. It takes time and experience to become the one. The skills and knowledge that you need to accumulate are cross-functional. Besides having challenges first of all in technical sphere, this position also demands from architects to have a well-established social skills. Before starting to look at master plan for becoming a software architect, let us have a glance at typical types of software architects:
解决方案架构师/软件架构师(Solution Architect/Software Architect) —— 低级架构师,通常由之前或现在的高级软件工程师担任,负责与业务人员沟通产品的技术设计和架构,开发人员通常都可胜任。
企业级架构师(Enterprise Architect) —— 高级架构师,把控产品“大局”,但很少关注细节。这个职位大多出现在非常复杂的大型软件产品中,有时甚至直接汇报给CTO。
领域架构师(Domain Architect)—— 这是比较流行的软件架构师类型,在很多公司都可以看到。这个职位的目的是成为特定用例或技术栈的架构师。例如:云架构师负责特定的云供应商,数据架构师负责数据库的操作、设计、协调,移动架构师负责软件产品的移动版本等……
业务架构师(Functional Architect) —— 这类架构师主要负责业务方面,对技术世界了解较少,大多是经验丰富的业务分析师,设计并领导软件产品的业务逻辑。
Solution Architect/Software Architect— low-level architect that is usually previous or active senior software engineer. He/She is in charge of technical design and architecture of a product with link to business people. Often leads developers.
Enterprise Architect — high-level architect that has overall “Big Picture” of a product with less information in details. This position mostly appears in very big complicated software products even sometimes just right after CTO.
Domain Architect — this is a popular form of software architects that are seen in multiple companies. The purpose of this position is to be an architect of specific use case, tech stack. For Example: cloud architects are responsible for a given cloud supplier. Data Architects are in charge of database operations, design, coordinations. Mobile Architects are taking care of mobile version of a software product. This counting can be very long…
Functional Architect —this type of architects are mainly in charge of business side, being less informed about technical world. Mostly this people are experienced business analysts that design and lead business logic of a software product.
我们可以进一步扩展这个列表,每个公司可能对某个特定职位有不同的名称。上述给定的软件架构职位的角色和职责可能因公司而异,但本质是相同的。请看下面的图表,以便更好的理解不同架构师角色在技术/业务技能和知识方面的关系。
We can extend this list further, since each company might have different name for a specific position. The roles and responsibilities of above given software architecture positions can vary from company to company but essence is the same. Take a look at following graph to have a better understanding in which relation different architect roles stand in respect to technical/business skills and knowledge.
One thing should be till now crystal clear: Software Architects are Super Senior Developers (usually…) except those who really come from business background. I tried to list different topic areas out, in which software architects should be comfortable:
Introduction To Algorithms is the perfect allrounder book to master DTs and Algos.
数据结构和算法 —— 基本的编程原理对软件架构师来说应该不成问题,包括数组、队列、栈、链表、不同类型的树、图等数据结构,软件架构师不仅应该熟悉,而且应该能够识别出在什么时候应该使用哪个数据结构。优秀的软件架构师应该知道不同的算法,如搜索、排序、递归、动态规划等。在日常生活中,没有架构师会从头开始编写“合并排序”算法,或者发明新的数据结构。
1.Data Structures and Algorithms — the very basic fundamentals of programming should be no problem for Software Architects. DTs such as Arrays, Queues, Stacks, LinkedLists, different types of Trees, Graphs should not only be familiar to a Software Architect, but he/she also should be able to recognise right moment where to use which DT. Well established Software Architect should know different algorithmic techniques like Searching, Sorting, Recursion, Dynamic Programming etc. In daily life, no architect writes for example “Merge Sort” algorithm from scratch, or discovers a new data structure. But knowing basics help them to make a right technical decision in especially pull request reviews.
技术栈 —— 无论是后端还是前端,软件架构师必须非常了解当前使用的技术栈。学习特定编程语言的语法是最简单的方法,但需要时间积累经验。不同的库和框架也是值得了解的宝贵资产。
2.Tech Stack — whether it is backend or frontend, Software Architect must know currently used tech stack very well. Learning syntax of a specific programming language is the easiest think. But gaining experience is what it takes time. Different libraries and frameworks that software product bases are also valuable assets to know.
简洁的编码 —— 让软件系统工作并不是软件架构师的最终目标。每次评审代码时,他/她首先想到的问题是: 我能使这段代码更高效吗? 我能让代码占用更少内存吗? 简洁的代码标准是否被正确应用? 我可以使用不同的OOP技术吗? 《代码整洁之道》无疑可以帮助我们提高重构技能。
3.Clean Coding — getting a software system to work is not the ultimate goal what Software Architect targets. Every time Software Architect makes a code review first questions that come to his/her mind are: 1. Can I make this code more performant? Can I make this code to take up less memory? Do clean code standards are applied correctly? Can I make use of different OOP techniques? Bonus: Clean Code will definitely help you improve your refactoring skills.
OOP —— 面向对象编程帮助我们可以构建更灵活、高效、可读性高的软件系统。有经验的软件架构师会经常使用这些技术(如果技术堆栈合适……)。
4.OOP — Object Oriented Programming offers great possibilities to make software system more flexible, effective and readable. Experienced Software Architects are using those techniques regularly. (if tech stack suitable…)
软件设计模式 —— 说到面向对象,不应该忘记不同的设计模式的重要性,它们首先是由GoF[2]收集和引入的。了解这些设计模式肯定会帮助我们更好的利用软件系统的面向对象设计。
5. Software Design Patterns — speaking of OOP, we should not forget the importance of different Design Patterns that where firstly gathered and introduced by GoF. Knowing these Design Patterns will for sure help you make your software system better use of object oriented design. Bonus: take a look at this book for more information.
从R.C.Martins的著作《架构整洁之道》( Clean Architecture )中可以学到如下原则。
Bonus: following principles can be acquired from R.C.Martins famous book: Clean Architecture.
S.O.L.I.D.原则 —— 这一组件原则是软件组件设计中需要考虑的基本技术。有经验的软件架构师如果掌握了这些原则,可以很快识别出代码中的违规行为。
高内聚/低耦合原则 —— REP、CRP、ADP等原则对于软件架构师来说非常重要,尤其是在构建、整合/解耦插件时,这些技术可以处理更高级的设计。
6. S.O.L.I.D. Principles — these component principles are fundamental techniques that need to be taken into account in software component design. Experienced Software Architect will quickly recognise violations in code, if he/she mastered these principles.
7. Cohesion/Coupling Principles — Principles like REP, CRP, ADP etc. are vital principles for a Software Architect especially when constructing, bundling plugins together/apart. So these techniques copes with more high-level design.
Software Architecture in Practice
系统设计 —— 有很多软件体系架构模式,如:主从、客户端-服务器、微服务、MVC、单向体系架构等,需要根据不同的前后端项目做出选择。当然不太可能有人能够掌握所有这些模式,但是根据项目的不同,软件架构师应该精通底层设计,领域驱动设计可以作为最基本的出发点。
8. System Design — There are plenty of Software Architecture patterns like: Master-Slave, Client-Server, Microservices, Model-View-Controller, Unidirectional Architecture depending on backend or frontend projects. Of course it is impossible to know all of them. But depending on a project, Software Architect should be master of underlying design. The very basics starting point is Domain Driven Design. Bonus: take a look at this book for more theory.
文档 —— 这是软件架构师日常工作中的重要环节。绘制不同的UML图,ARC42文档是这个职位不可避免的工作。这方面有很多工具,如:
9. Documentation — this is a vital point in Software Architects daily work. Drawing different UML Diagrams, ARC42 documentation is inevitable part of this position. There are plenty of tools such as:
draw.io — free and easy-to-use tool
plantUml — plugin for IDEs like Eclipse, Intellij. Very useful and my favourite tool, drawing through scripting.
yEd — handy tool, available as a desktop app.
MS Visio — rich functionalities, but not Free!
证书 —— 对于软件架构师来说,没有太多的认证选择,但国际软件架构资格认证委员会(iSAQB®)提供了Certified Professional for Software Architecture(CPSA®)认证计划,该认证得到全球认可。
10. Certificates —There not much certification alternatives for Software Architects that are globally renown but nevertheless, there is the International Software Architecture Qualification Board (iSAQB®) that offers the Certified Professional for Software Architecture (CPSA®) certification scheme. CPSA® certifications are globally recognised.
正如从上面的列表中可以看到的那样,成为软件架构师需要付出时间和精力,但这绝对是可行并且值得的:)。
如果想要了解更多软件架构方面的主题,请参阅下面的列表。
So becoming a Software Architect takes time and effort, as you can see from above list. But it is pretty doable :).
If you are interested in more Software Architecture topics take a look at below list.
Relevant Articles:
Software Architecture Patterns for Front-End Development
Software Architecture Cheat Sheet for Daily Usage
How to apply Component Cohesion Principles to Spring Boot Application
How to apply SOLID Software Design Principles to Spring Boot Application
References:
[1] Master Plan for becoming a Software Architect: https://azeynalli1990.medium.com/master-plan-for-becoming-a-software-architect-be7ba13f0999
[2] Design Patterns: https://en.wikipedia.org/wiki/Design_Patterns
[3] draw.io: https://draw.io
[4] PlantUML: https://plantuml.com/
[5] yEd: https://www.yworks.com/products/yed
[6] MS Visio: https://www.microsoft.com/en-ww/microsoft-365/visio/flowchart-software
[7] Software Architecture Patterns for Front-End Development: https://azeynalli1990.medium.com/software-architecture-patterns-for-front-end-development-9e43e43cdfb3
[8] Software Architecture Cheat Sheet for Daily Usage: https://azeynalli1990.medium.com/software-architecture-cheat-sheet-for-daily-usage-9923922ea75b
[9] How to apply Component Cohesion Principles to Spring Boot Application: https://azeynalli1990.medium.com/how-to-apply-component-cohesion-principles-to-spring-boot-application-12d932be7282
[10] How to apply SOLID Software Design Principles to Spring Boot Application: https://medium.com/geekculture/how-to-apply-solid-software-design-principles-to-spring-boot-application-part-1-6b886f6d943e
System Architecture — System Design Materials[1]
Medium上的这篇文章介绍了作者学习系统架构的一些在线资源,可以帮助架构设计的初学者尽快了解架构的基本设计原则,了解常见场景的设计方案。
子曰:“工欲善其事必先利其器”。
今天通过这篇文章跟大家分享一些系统架构设计方面的学习资料,让我们一起成长。
System Design Tips and Introduction (中文, Youtube)[2]
The System Design Primer (中文/英文, Github)[3]
Intro to Architecture and Systems Design Interviews (英文, Youtube)[4]
Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems (中文版《数据密集型应用系统设计》, Book)[5][6]
system design interview questions (英文, Github)[7]
System Design Interview – Step By Step Guide (英文, Youtube)[8]
Distributed Systems (英文, Book)[9]
Distributed systems for fun and profit (英文, Book)[10]
6.824: Distributed Systems (英文, Course)[11]
Concurrent and Distributed Systems (英文, Course)[12]
15-440: Distributed Systems Syllabus (英文, Course)[13]
CS244b: Distributed Systems (英文, Course)[14]
CSE 490H: Distributed Systems (英文, Course)[15]
Apache Hadoop (Open source, Github)[16]
SeaweedFS (Open source, Github)[17]
MinIO (Open source, Github)[18]
TiDB (Open source, Github)[19]
etcd (Open source, Github)[20]
Apache ZooKeeper (Open source, Github)[21]
Apache Spark (Open source, Github)[22]
Apache Flink (Open source, Github)[23]
Ray (Open source, Github)[24]
Notes on Distributed Systems for Young Bloods (英文, Blog)[25]
Distributed systems theory for the distributed systems engineer (英文, Blog)[26]
分布式系统 (中文, Blog)[27]
Distributed Systems Reading Group (英文, Paper)[28]
awesome-distributed-systems (英文, Github)[29]
Grokking the System Design Interview (英文, Course)[30]
Tech Dummies Narendra L (英文, Youtube)[31]
Design video sharing platform (英文, Blog)[32]
System Design Basics (英文, Youtube)[33]
code karle (英文, Youtube)[34]
System Design Introduction For Interview (英文, Youtube)[35]
Distributed Systems (英文, Youtube)[36]
System Design (中文, Gitbook)[37]
CS6213 Special Topics in Distributed Computing (英文, Course)[38]
分布式系统
基本问题: 时间问题,一致性问题,容错技术,共识算法,并发控制
基本定理: CAP, PACELC, FLP
CAP theorem (英文, Wikipedia)[39]
PACELC theorem (英文, Wikipedia)[40]
Consensus (英文, Wikipedia)[41]
生产系统: MapReduce, Spark, GFS, Dynamo和Cosmos
MapReduce (英文, Wikipedia)[42]
Apache Spark (英文, Wikipedia)[43]
Google File System (英文, Wikipedia)[44]
Dynamo (英文, Wikipedia)[45]
Cosmos (英文, Wikipedia)[46]
系统架构设计需要考虑的问题
可靠性(Reliable)
可扩展性(Scalable)
可维护性(Maintainable)
存储与检索(Storage and Retrieval)
冗余备份(Redundancy/Replication)
分片分区(Fragmentation/Partition)
事务(Transactions)
一致性(Consistency)
共识(Consensus)
批处理/流处理(Batch processing/stream processing)
如何准备系统设计面试
找相关的博客学习
坦率的说,面试不会问得非常深入,不过如果有机会解释清楚,就能给面试官留下更好的印象
试着设计一些东西,写下功能性/非功能性的需求,画出设计图、数据流、流程流,并考虑商业模型从而帮助系统盈利,并考虑如何各个组件如果崩溃需要如何处理。
明确设计的取舍
保持自信
不要试图炫耀,你可能只是了解了某一方面,但其他方面你并不了解。
注意观察面试官,如果发现面试官对这部分不感兴趣,就不要花太多时间。
不要轻易放弃自己的意见,面试官质疑候选人是常规操作。不要因为面试官的挑战、质疑就觉得自己错了。
References:
[1] System Architecture — System Design Materials: https://jinlow.medium.com/system-architecture-system-design-materials-52705af6c155
[2] System Design Tips and Introduction: https://youtu.be/th_73AVA4dY?list=PLAd5bt5mn3V3TrrJFBpnu4PH9e8KZMvNA
[3] The System Design Primer: https://github.com/donnemartin/system-design-primer
[4] Intro to Architecture and Systems Design Interviews: https://youtu.be/ZgdS0EUmn70
[5] Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems: https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321
[6] 数据密集型应用系统设计: https://book.douban.com/subject/30329536/
[7] system design interview questions: https://github.com/jaychsu/FreemanZhang-system-design
[8] System Design Interview – Step By Step Guide: https://youtu.be/bUHFg8CZFws
[9] Distributed Systems: https://www.distributed-systems.net/index.php/books/ds3/
[10] Distributed systems for fun and profit: http://book.mixu.net/distsys/index.html
[11] 6.824: Distributed Systems: https://pdos.csail.mit.edu/6.824/schedule.html
[12] Concurrent and Distributed Systems: https://www.cl.cam.ac.uk/teaching/2021/ConcDisSys/materials.html
[13] 15-440: Distributed Systems Syllabus: https://www.cs.cmu.edu/~dga/15-440/S14/syllabus.html
[14] CS244b: Distributed Systems: http://www.scs.stanford.edu/20sp-cs244b/
[15] CSE 490H: Distributed Systems: https://courses.cs.washington.edu/courses/cse490h/11wi/
[16] Apache Hadoop: https://github.com/apache/hadoop
[17] SeaweedFS: https://github.com/chrislusf/seaweedfs
[18] MinIO: https://github.com/minio/minio
[19] TiDB: https://github.com/pingcap/tidb
[20] etcd: https://github.com/etcd-io/etcd
[21] Apache ZooKeeper: https://github.com/apache/zookeeper
[22] Apache Spark: https://github.com/apache/spark
[23] Apache Flink: https://github.com/apache/flink
[24] Ray: https://github.com/ray-project/ray
[25] Notes on Distributed Systems for Young Bloods: https://www.somethingsimilar.com/2013/01/14/notes-on-distributed-systems-for-young-bloods/
[26] Distributed systems theory for the distributed systems engineer: https://www.the-paper-trail.org/post/2014-08-09-distributed-systems-theory-for-the-distributed-systems-engineer/
[27] 分布式系统: https://www.qtmuniao.com/categories/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/
[28] Distributed Systems Reading Group: http://dsrg.pdos.csail.mit.edu/papers/
[29] awesome-distributed-systems: https://github.com/theanalyst/awesome-distributed-systems
[30] Grokking the System Design Interview: https://www.educative.io/courses/grokking-the-system-design-interview?affiliate_id=5749180081373184
[31] Tech Dummies Narendra L: https://www.youtube.com/channel/UCn1XnDWhsLS5URXTi5wtFTA
[32] Design video sharing platform: https://leetcode.com/discuss/interview-question/system-design/496042/Design-video-sharing-platform-like-Youtube
[33] System Design Basics: https://youtu.be/xpDnVSmNFX0?list=PLMCXHnjXnTnvo6alSjVkgxV-VH6EPyvoX
[34] code karle: https://www.youtube.com/channel/UCZEfiXy7PmtVTezYUvc4zZw
[35] System Design Introduction For Interview: https://youtu.be/UzLMhqg3_Wc?list=PLrmLmBdmIlps7GJJWW9I7N0P0rB0C3eY2
[36] Distributed Systems: https://youtu.be/UEAMfLPZZhE?list=PLeKd45zvjcDFUEv_ohr_HdUFe97RItdiB
[37] System Design: https://xunhuanfengliuxiang.gitbooks.io/system-desing/content/
[38] CS6213 Special Topics in Distributed Computing: https://ilyasergey.net/CS6213/index.html
[39] CAP theorem: https://en.wikipedia.org/wiki/CAP_theorem
[40] PACELC theorem: https://en.wikipedia.org/wiki/PACELC_theorem
[41] Consensus: https://en.wikipedia.org/wiki/Consensus_%28computer_science%29
[42] MapReduce: https://en.wikipedia.org/wiki/MapReduce
[43] Apache Spark: https://en.wikipedia.org/wiki/Apache_Spark
[44] Google File System: https://en.wikipedia.org/wiki/Google_File_System
[45] Dynamo: https://en.wikipedia.org/wiki/Dynamo_%28storage_system%29
[46] Cosmos: https://en.wikipedia.org/wiki/Cosmos_%28operating_system%29
原文:https://jinlow.medium.com/system-architecture-system-design-materials-52705af6c155
System Architecture — System Design Materials
Confucius told us “If a worker wants his work well done, he must first sharpen his tools.”
Now, I would to share my learning materials. I also hope you can share your learning materials so that we can grow together.