今天给大家带来一篇自己翻译的干货《软件架构师之路》。本周Github上升很快的项目。其内容对致力于成为软件架构师(不论前后端)的同学应该都会有极大的帮助。
中文地址 https://github.com/gamedilong/SoftwareArchitect-CN
原文地址 https://github.com/justinamiller/SoftwareArchitect
如果有看完英文原文,发现本文翻译内容中存在问题或者错误的欢迎到中文Git地址PR,如能够对大家起到一定的帮助也欢迎star
软件架构可以被抽象的分为几个层次,不同的层次对技能的要求不同。对层次有很多不同的划分,我最喜欢如下这三种划分:
有时架构师也被看作是不同利益相关者之间的“粘合剂”。 三个例子:
要了解架构师所需的必要技能,我们首先需要了解架构师平时主要干什么。以下是我认为最重要的一些工作内容:
注意: 架构是一项持续的工作,尤其当项目采取敏捷开发的模式,上述工作应该也是反复迭代进行的。
为了支撑上述工作需要很多重要的能力。就我个人的经验,每个软件架构师应该具备如下十项技能:
* 设计能力
* 决策能力
* 化繁为简能力
* 编码能力
* 文档架构能力
* 沟通能力
* 评估能力
* 平衡能力
* 指导、答疑能力
* 营销能力
什么是好的设计?这可能是最重要和最具挑战性的问题。要把理论和实践区别开来。根据我的经验,两者兼而有之是最有价值的。让我们从理论开始:
了解基本的设计模式: 设计模式是架构师设计开发可维护、可扩展系统的一项最重要工具。通过设计模式你可以设计解决通用问题的可重用方案。 由John Vlissides,Ralph Johnson,Richard Helm,Erich Gamma撰写的《设计模式:可重用面向对象软件的要素》一书每个从事软件开发的人都有必要阅读一番。尽管上述模式发布于20多年前,其仍然是现代软件架构的重要基础。例如,本书描述了模型-视图-控制器(MVC)模式,该模式应用于许多领域,也是一些新模式(如MVVM)的基础。
深耕模式和反模式: 如果你已经知道了所有的基本GoF模式,那么可以用更多的软件设计模式扩展你的知识. 或者深入你感兴趣的领域。我最喜欢的应用程序集成相关的内容之一是Gregor Hohpe编写的“企业集成模式”一书。本书适用于两个不同环境的应用程序需要交换数据时,无论是一些传统系统的旧式文件交换还是现代微服务体系结构。
了解质量测量: 定义架构远不是终点。指引手册和编码标准的定义、应用和管理是有原因的,这么做是因为质量和非功能性需求。你想拥有一个可维护、可靠、可适应、安全、可测试、可扩展、可用等的系统,而实现所有这些质量属性的一个方法就是应用好的架构工作。你可以在维基百科上了解更多关于质量衡量的信息。理论很重要。如果你不想成为一名站在空中楼阁上的架构师,那么实践同样重要,甚至更重要。
尝试了解不同的技术栈: 这是成为一个更好的架构师的一项重要工作。尝试新的技术栈并至上而下的学习他们。不同的技术可以给你带来不同的设计理念和模式。对新技术的学习最好不要浮于表面,应该去多实践深入感受解决的痛点和其存在的问题。架构师不仅需要涉猎广泛,在某些领域也要有深厚的知识。 当然并不需要掌握所有的技术,你需要对你所在领域最核心的技术有扎实的了解。 你也可以尝试其他领域的技术,例如, 如果你深入SAP R/3,你就应该也去尝试一下JavaScript,反正亦然。时刻保持好奇心并付诸实践。还可以去试一些你讨厌了很多年的技术。
分析和理解应用模式: 看一下当前的任一比较流行的框架,例如Angular。 可以在实践中研究很多模式,例如“观察者模式”。 尝试了解它如何在框架中应用,为什么要这样做。 如果真的很有时间且认真,可以更深入地了解代码并了解其实现方式.
加入一些用户组. Meetup
架构师需要能够做出决策并将项目或整个组织引导到正确的方向。
请记住Occam剃刀的解决问题的原则,它表示更喜欢简单。我把这个原则解释为:如果你对这个问题有太多的假设要解决,那么你的解决方案可能是错误的,或者导致不必要的复杂解决方案。为了得到一个好的解决方案,应该减少(简化)假设。
即使作为一个企业级架构师,最抽象的架构层次,你仍然应该知道开发人员每天都在做什么。如果你不明白这是怎么做到的,你可能会面临两大问题:
1. 开发者不会接受你的嘴炮。
2. 不了解开发人员的实践需求和面临的困难.
有一个辅助项目: 这样做的目的是尝试新技术和工具,以了解当今和未来的开发方式。经验是观察,情感和假设的结合(Kurt Schneider的“软件工程中的经验和知识管理”)。阅读教程或一些利弊是好的。但这仅仅是“书籍知识”。仅当你自己尝试事物时,才能体验到情绪并建立关于事物好坏的假设。而且,使用某项技术的时间越长,你的评估就会越准确。这将帮助您在日常工作中做出更好的决定。当我开始编程时,我没有代码完成,只有一些实用程序库可以加快开发速度。显然,在这种背景下,我今天会做出错误的决定。今天,我们拥有大量的编程语言,框架,工具,过程和实践。只有您对主要趋势有一定的经验和粗略的了解,才能参与对话并引导开发朝正确的方向发展。
找到合适的东西去尝试: 您无法尝试所有内容。 这根本是不可能的。 您需要一种更有条理的方法。 我最近发现的一种来源是ThoughtWorks的Technology Radar。 他们将技术,工具,平台,语言和框架分为四类:采用,试用,评估和保留。 通过这种分类,更容易获得新事物的概述及其准备情况,以更好地评估下一步要探索的趋势。
* 采用: “已经准备好提供企业级服务”
* 试用: “能够在一个承担一定风险的项目中尝试”
* 评估: “还需进一步评估其对业务的影响”
* 保留: “谨慎处理“
架构文档有时更重要,有时则不重要。重要的文档例如体系结构决策或代码指南。在开始编码之前通常需要初始文档,并且需要不断改进。其他文档可以自动生成,因为代码也可以是文档,例如UML类图。
根据我的观察,这是最被低估的技能之一。如果你在设计上很聪明,但不能传达你的想法,你的想法可能会影响较小,甚至无法成功。
学习如何传达你的想法:
在会议上进行协作时,知道如何正确的沟通传达你的想法,将其同步到你的同行是至关重要的。 我发现《 UZMO-用笔思考》是提高我在这一领域技能的好资源。 作为架构师,你通常不仅会参加会议,而且通常需要主持并主导会议。
大型的演讲: 将你的想法呈现给小型或大型团体应该对您来说可行。 如果对此感到不舒服,请开始向你最好的朋友介绍。慢慢扩大小组。 这是你只能通过离开自己的舒适区来学习的东西。 请耐心等待,此过程可能需要一些时间。
找到合适的沟通方式: 不同的利益相关者有不同的利益和观点。它们需要在各自的层面上用不同的方式单独解决。在你交流之前,退后一步,检查你想分享的信息是否有正确的层次,关于抽象性、内容、目标、动机等。例如:开发人员通常对解决方案的非常小的细节感兴趣,而经理则更喜欢知道哪个选项能节省最多的钱。
经常沟通: 如果没有人知道,再香的架构也是毫无意义的。定期在每个组织级别上分发目标体系结构及其背后的思想。安排与开发人员、架构师和管理人员的会议,向他们展示所需或定义的方式。
透明: 定期交流只能部分缓解缺少的透明度。 您需要使决策背后的原因透明化。 特别是,如果人们不参与决策过程,则很难理解和遵循其背后的决策和理由。
随时准备发表演讲: 总有人有疑问,你想马上给出正确的答案。尽量把最重要的幻灯片放在一个统一的集合里,你可以展示和解释。它为你节省了很多时间,也给你自己带来了安全感。
了解基本项目管理原则:
作为架构师或首席开发人员,您经常被要求估算实现您的想法:多长时间、多少人、多少人、哪些技能等。?当然,如果你计划引入新的工具或框架,你需要对这些“管理”问题有一个答案。最初,你应该能够给出一个粗略的估计,如天,月或年。别忘了,它不仅仅是关于实现,还有更多的因素要考虑,比如需求管理、测试和Bugfix。因此,您应该了解所使用的软件开发过程中的工作。通过过去的使用数据,你可以得到更好的评估,并从中得出你的预测。如果你没有过去的数据,你也可以尝试一些方法,如巴里W鲍姆的COCOMO。如果你被分配在一个敏捷项目中,学习如何正确地进行评估和计划:Mike Cohn的《敏捷评估和计划》一书提供了这个领域的一个坚实的概述。
评估“未知”架构: 作为架构师,您还应该能够评估体系结构对于当前或未来上下文的适用性。这不是一项简单的任务,但是您可以通过手头的一组问题来准备,这些问题对于每个架构都是常见的。它不仅关乎体系结构,还关乎系统的管理方式,因为这也让您了解了系统的质量。我建议总是准备好一些问题并准备好使用。一般问题的一些想法:
1. 设计实践: 架构遵循哪些模式?它们是否得到正确使用?设计是否遵循红线或是否存在不受控制的增长?是否有明确的结构和关注点的分离?
2. 开发实践: 制定并遵守规范指南?代码的版本是怎样的?部署实践?
3. 质量保证: 测试自动化覆盖范围?静态代码分析到位且效果良好?同行评议到位?
4. 安全性: 有哪些安全概念?内置安全?渗透测试或自动安全分析工具到位并定期使用?
在咨询和辅导方面,积极主动可能是最好的选择。如果有人问你,那就太晚了。架构重构是尽量要避免的。你需要以某种方式预见未来几周、几个月甚至几年,并为下一步做好准备。
你的想法很好,你已经很好地沟通了,但是仍然没有人愿意追随?那么你可能缺乏营销技巧。
2. 视频: 与“无聊的PPT”不同的是,你还可以播放一段视频,展示你的想法或至少方向。
但请不要过度营销:从长远来看,内容是王道。如果你的话没有实现,从长远来看,这将损害你的声誉。
* Refactoring. Improving the Design of Existing Code by Martin Fowler
* Enterprise Integration Patterns written by Gregor Hohpe
* Design Patterns: Elements of Reusable Object-Oriented Software by John Vlissides, Ralph Johnson, Richard Helm, Erich Gamma
* Experience and Knowledge Management in Software Engineering by Kurt Schneider
* Clean Code by Robert C. Martin
* UZMO — Thinking With Your Pen
* Agile Estimating and Planning by Mike Cohn