架构师必须了解的30条设计原则

前言

众所周知,架构师的角色,更偏向于策划、而非指挥,塑造、而非支配,其存在的意义,在于引导大家讨论、而非自己主宰一切。

但是,具体应该如何执行呢?本文作者整理了 30 个公认的架构原则,来帮助大家解决此问题。也许有的原则,你从未听说,但你看完就能快速学会。

基本原则

原则1

KISS (Keep it simple,sutpid) 和保持每件事情都尽可能的简单,用最简单的解决方案来解决问题。

原则2

YAGNI(你不需要它)原则 ,只在需要时构建。

原则3

先学会爬,然后再学会走,最后学会跑。换句话说,先保证能够正常运行,然后优化它使其更好,最后逐渐让它变得完美。使用迭代开发,采用敏捷开发模式。为每个功能制定一个开发周期(最多2周),然后不断迭代。

原则4

自动化测试是构建稳定、高质量产品的唯一方法。通过自动化测试提升创造力,所有一切都可以自动化!在设计时应当好好考虑自动化。

原则5

注重投资回报率(ROI)并将最多的注意力放在最重要的地方。

原则6

了解用户并相应地平衡资源。大多数产品都有数千个最终用户,大致需要20个开发人员和100个 DevOps 人员。不要花费数月的时间来构建一个不太可能使用 DevOps 的用户界面(他们更喜欢脚本)。这是原则5的特例。

原则7

功能的设计和测试尽可能独立。如果在设计时考虑到这一点,长远来看,它将省去很多麻烦,否则只有一切构建完成时你才可以开始测试整个系统。此外,遵循这个原则,版本发布也会更加顺利。

原则8

警惕搜索引擎中花里胡哨的架构方案。我们天生都喜欢令人夺目的设计。如果你按奈不住, 就可能把太多根本不需要的功能和解决方案引入到你的架构中。

功能选择

原则9

想要准确知道用户如何使用我们的产品是很难的。所以我们要推行MVP(最小可行产品)。该理念的核心在于:先制定一些用例,完成用例所涉及的相关功能,立即发布产品,然后根据反馈和经验对产品进行优化。

原则10

尽可能减少功能,如有疑问则将其删除。许多功能可能从未使用,你只需为其留一个扩展接口即可。

原则11

听取客户的意见,看他们想要什么功能。

原则12

当客户要求的功能影响到其他模块时,要勇于和客户辩论。从大局出发,尝试找到另一种方法来处理问题。就像 Fords 所说的那样“每当我问顾客需要什么的时候,他们总是会说需要跑得更快的马”。请记住,你才是专家。你应该主导一切,做出正确和专业的决定。虽然用户可能当时有些疑惑,但最终他们会感谢你的。

服务端设计和并发

原则13

要知道一个server是如何运行的,从硬件到操作系统,直到编程语言。优化IO调用的数量是你通往最好架构的首选之路。

原则14

遵循 Amdhal 的同步定律。线程之间共享的可变数据会降低程序速度。如果可以,请使用并发数据结构,并且仅在必要时使用同步。尽可能少地使用锁。如果你打算在线程锁期间阻塞,请确保自己足够了解具体细节,因为这里存在极大的隐患。

原则15

如果你的设计是基于事件驱动的非阻塞架构,那就不要阻塞线程或者在线程中执行 IO 操作。一旦这样做,系统将慢如蜗牛。

分布式系统

原则16

无状态系统具有良好的扩展性。我们要尽可能了解和使用无分享架构。

原则17

除非你能够掌控客户端和服务器的所有代码,否则消息传递失败的情况在所难免。尽量减少你的系统依赖的因素(例如使用原则18)。

原则18

尽可能实施幂等操作。这样它就很容易恢复,你至少可以保证交付没问题。

原则19

了解 CAP 定理。可扩展的事务(分布式事务)是很难的 。尽可能使用补偿,基于 RDBMS 的事务很难扩展。

原则20

分布式系统共识不支持扩展,也无法进行组通信,不支持群集范围内的可靠消息传递。其最大节点限制大约是八个节点。

原则21

在分布式系统中,你很难隐藏分布式系统中的延迟和故障。(参见分布式计算的谬误解释 )。

用户体验

原则22

了解你的用户以及他们的目标:他是新手、专家还是临时用户?他对计算机科学了解多少?极客看重扩展功能,开发人员关注示例和脚本,普通人则更在乎界面。

原则23

最好的产品应当不需要用户手册,用户应该一看就会用。

原则24

当你无法在两个选项之间做出决定时,请不要通过配置选项的方式来呈现问题。这会给用户和架构师带来麻烦。对于系统如何运作的细节,他们没有你了解,他们怎么能做出决定呢?最好的方案是找到一个每次都有效的选择;其次是自动做出选择;第三个方案是添加配置参数并设置合理的默认值。

原则25

始终具有合理的配置默认值。

原则26

设计不良的配置会制造麻烦,始终配置几个示例值。

原则27

询问用户配置值的时候,注意选择用户无需即可设置的值(例如,不要问用户需要的最大缓存条目数量,而是要问他想要用于缓存的内存数量)

原则28

如果发现未知配置,则抛出错误。永远不要忽视它。在调试过程中,无提示的配置错误会浪费我们很多调式时间。

难点

原则29

尝试新语言很容易,但要正确使用却很难。除非公司愿意组建一个十人团队并花一年的时间来学习,否则尽量不要这样做。如果你仍不死心,请阅读有关语言设计的五个问题后再做定夺。

原则30

可组合的拖放 UI 很难实现,除非团队准备投入10人年的资源,否则不要去做。
最后,谈一下我的感受。在理想情况下,一个平台应当由多个正交组件组成,每个组件负责一个方面(例如,安全性、消息传递、注册、调解、分析,等等)。使用这些功能构建的系统将是最佳的。
不幸的是,现实中我们很难达到这样的状态。因为在项目初始状态时,很多事情是不确定的,你无法做到这样的独立性,现在我认为在开始的时候适当的重复是必要的,当你尝试铲除他们的时候,你会发现引入了新的复杂性,分布本身就意味着复杂。有时候治愈的过程要比疾病本身更加的糟糕。

总结

作为一个架构师,我们应该像园丁一样思考、塑造、策划和去除杂草而不是定义和构建。虽然在短期内,由一位架构师来制定架构的确既快捷又实惠。但是,从长远来看,团队的力量才是最强的。
如果你不够投入和细心,你只指出错误,但是不道明错误原因,那么你的意见可能会让团队感到困惑。避免这种情况的一种方法是拥有一套普遍接受的原则,这些原则是讨论架构时遵循的基本点,也是初学者学习架构的好资源。所以想成为 一名优秀的架构师,还是需要长期的磨练以及时间的验证,当然随时保持学习的状态也是非常重要的。当你学会更多知识,你便会更清晰的解决各种复杂的架构问题。

来源:Java面试那些事儿

原文地址:https://www.cnblogs.com/jimoer/p/11925057.html

时间: 2025-01-07 02:32:49

架构师必须了解的30条设计原则的相关文章

【转】Apache的架构师们遵循的30条设计原则

原文链接:https://mp.weixin.qq.com/s?__biz=MzA5MzQ2NTY0OA==&mid=2650798277&idx=1&sn=97afe157dc1627713b729d9ef058b477&key=ff09d031d7c4257b64b553ffa39ec2898f3acca42bef27d43fca8492dc5c171cd2acfdb8c4f63fd175f61ecaaac0e1fb7e02cc32fce5acd43f598d50f60

.NET 高级架构师0005 架构师之路(4)---面向对象的设计原则

1         OO的设计原则 采用面向对象的分析和设计思想,为我们分析和解决问题提供了一种全新的思维方式.我们在拿到需求之后(略去OOA,以后补全),接下来的问题就是:如何对系统进行面向对象的设计呢? 按照软件工程的理论,面向对象的设计要解决的核心问题就是可维护性和可复用性.尤其是可维护性,它是影响软件生命周期重要因素,通常情况下,软件的维护成本远远大于初期开发成本. 一个可维护性很差的软件设计,人们通常称之为"臭味"的,形成的原因主要有这么几个:过于僵硬.过于脆弱.复用率低或者

阿里P7架构师告诉你Java架构师必须知道的 6 大设计原则

在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义.本文主要将总结这些常见的原则,和具体阐述意义. 开发原则 面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有 迪米特法则和合成复用原则等, 所以在常见的文章中有表示写六大或七大原则的: 除此之外我还将给出一些其它相关书籍和互联网上出现的原则: S单一职责SRP Single-Responsibility Principle, 一个类,最好只做一件事

Java架构师必须知道的 6 大设计原则

序言 在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义.本文主要将总结这些常见的原则,和具体阐述意义. 开发原则 面向对象的基本原则(solid)是五个,但是在经常被提到的除了这五个之外还有 迪米特法则和合成复用原则等, 所以在常见的文章中有表示写六大或七大原则的: 除此之外我还将给出一些其它相关书籍和互联网上出现的原则 1. S单一职责SRP Single-Responsibility Principle, 一个类,最好

【产品规划】张小龙:30条产品原则

没有web的移动互联网产品该怎么做?这对中国IT人来说是全新的课题.见证过各种APP摸爬滚打的真实案例之后,微信创始人张小龙在他的演讲中连出“狠招”,建议皆切中要害,警告则发人深省.基于对人性的丰富理解与对用户心理的分析,他提出需追求极简,保持笨拙,宁缺毋滥,做小做精.PPT要点,条缕清晰,毫无赘余,适合深思. 手机是肢体的延伸,和人是一体的(通过各种传感器);而PC是外物,即外部环境.移动互联网产品不是简单的PC到手机的移植.下面整理出的30条原则中,可以看到一些对于APP产品设计和推广的清醒

高级系统架构师必知的经纪人Broker设计

什么是经纪人(Broker)解决方案 每个网络节点的本地Broker 代表系统中的领域对象进行协商并实现进程间通信的功能.远程领域对象的显式接口采用Client Proxy(客户端代理)的方式在其客户端的地址空间实现,并处理所有与Broker 之间的交互. 此外,无论是本地的对象还是远程的,Broker 都为领域对象提供注册其网络位置和所公开的显式接口的功能,并允许它们获取其它所有己注册的领域对象的显式接口. 因此,在分布式系统中,通过使用一系列的Broker,可以从应用的功能中,隔离并封装通信

一个让人痴迷的网站教给你的四条设计原则

每天上班的时候,我允许自己上几次网,放松一下.Tumblr.Gawke对我的吸引力就像糖果对孩子的诱惑. 有一家网站是我从来都不会错过的,那就是<每日邮报>的网络版Mail Online.这家英国小报的网络版充斥着各种明星绯闻和道德败坏新闻的报道.当然,这家媒体吸引的不仅仅是我.目前,在独立访问用户方面,Mail Online已经超过<纽约时报>.<卫报>等其他网络媒体.去年的营收达到4000万美元,比2008年增长500%.我经常思考,为这么这家既不十分 漂亮又不因深

【JAVA进阶架构师指南】之一:如何进行架构设计

前言 ??本博客是长篇系列博客,旨在帮助想提升自己,突破技术瓶颈,但又苦于不知道如何进行系统学习从而提升自己的童鞋.笔者假设读者具有3-5年开发经验,java基础扎实,想突破自己的技术瓶颈,成为一位优秀的架构师,所谓java基础扎实,比如: ??1.java语言三大特性. ??2.java语言八大基本类型及其表示范围. ??3.为什么float和double存在精度丢失? ??4.publish/private/default/protected表示的范围? ??5.static/final的用

Java架构师之路:从Java码农到年薪八十万的架构师,最牛Java架构师进阶路线

从Java码农到年薪八十万的架构师,资深架构师大牛给予Java技术提升学习路线建议,如何成为一名资深Java架构师? 对于工作多年的程序员而言,日后的职业发展无非是继续专精技术.转型管理和晋升架构师三种选择.架构师在一家公司有多重要.优秀架构师需要具备怎样的素质以及架构师的发展现状三个方面来分析 程序员如何才能晋升为优秀的高薪架构师? 希望通过本文让程序员们了解架构师的市场行情,了解架构师的发展前景,并帮助你更清晰地做出职业规划. 架构师在一家公司有多重要 架构师在公司中担当着「IT架构灵魂人物