30条架构原则

本文作者叫Srinath,是一位科学家,软件架构师,也是一名在分布式系统上工作的程序员。他是Apache Axis2项目的联合创始人,也是Apache Software基金会的成员。他是WSO2流处理器(wso2.com/analytics)的联席架构师。Srinath撰写了两本关于MapReduce和许多技术文章的书。他获得了博士学位。来自美国印第安纳大学。

Srinath通过不懈的努力最终总结出了30条架构原则,他主张架构师的角色应该由开发团队本身去扮演,而不是专门有个架构师团队或部门。Srinath认为架构师应该扮演的角色是一个引导者,讨论发起者,花草修建者,而不是定义者和构建者。Srinath为了解决团队内部的架构纷争和抉择,制定了以下30条原则,这些原则被成员们广泛认可,也成为了新手架构师的学习途径。


 1 

基本原则

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

原则2:YAGNI(You aren’t gonna need it)不要去搞一些不需要的东西,需要的时候再搞吧。

点评:speculative development的例子可谓俯拾皆是。程序员们对自己说:“我肯定以后会需要这项额外的功能,所以现在就提前把它实现了吧”。其实这是最考验功力的地方,不能闭门YY需要的功能,架构上又要洞察趋势。

原则3:爬,走,跑。换句话说就是先保证跑通,然后再优化变得更好,然后继续优化让其变得伟大。迭代着去做事情,敏捷开发的思路。对于每个功能点,创建里程碑(最大两周),然后去迭代。

点评:快速反馈,一个“拍脑袋的里程碑”也好过没有里程碑……

原则4:创建稳定、高质量的产品的唯一方法就是自动化测试。所有的都可以自动化,当你设计时,不妨想想这一点。

点评:一切自动化也要考虑ROI,比如对于特别易变的页面层……

原则5:时刻要想投入产出比(ROI)。就是划得来不。

原则6:了解你的用户,然后基于此来平衡你需要做哪些事情。不要花了几个月时间做了一个DevOps用户界面,最后你发现那些人只喜欢命令行。此原则是原则5的一个具体表现。

原则7:设计和测试一个功能得尽可能的独立。当你做设计时,应该想想这一条。从长远来看这能给你解决很多问题,否则你的功能只能等待系统其他所有的功能都就绪了才能测试,这显然很不好。有了这个原则,你的版本将会更加的顺畅。

原则8:不要搞花哨的。我们都喜欢高端炫酷的设计。最后我们搞了很多功能和解决方案到我们的架构中,然后这些东西根本不会被用到。

点评:老板喜欢PPT?

 2 

功能选择

原则9:不可能预测到用户将会如何使用我们的产品。所以要拥抱MVP(Minimal Viable Product),最小可运行版本。这个观点主要思想就是你挑几个很少的使用场景,然后把它搞出来,然后发布上线让用户使用,然后基于体验和用户反馈再决定下一步要做什么。

原则10:尽可能的做较少的功能。当有疑问的时候,就不要去做,甚至干掉。很多功能从来不会被使用。最多留个扩展点就够了。

点评:产品经理可能是听不进去的,最好采取数据度量说话……

原则11:等到有人提出再说(除非是影响核心流程,否则就等到需要的时候再去做)。

原则12:有时候你要有勇气和客户说不。这时候你需要找到一个更好的解决方案来去解决。记住亨利福特曾经说过的:“如果我问人们他们需要什么,他们会说我需要一匹速度更快的马”。记住:你是那个专家,你要去引导和领导。要去做正确的事情,而不是流行的事情。最终用户会感谢你为他们提供了汽车。

 3 

服务端设计和并发

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

原则14:要了解Amdhal同步定律。在线程之间共享可变数据会让你的程序变慢。只在必要的时候才去使用并发的数据结构,只在必须使用同步(synchronization)的时候才去使用同步。如果要用锁,也要确保尽可能少的时间去hold住锁。如果要在加锁后做一些事情,要确保自己在锁内会做哪些事情。

原则15:如果你的设计是一个无阻塞且事件驱动的架构,那么千万不要阻塞线程或者在这些线程中做一些IO操作,如果你做了,你的系统会慢的像骡子一样。

 4 

分布式系统

原则16:无状态的系统的是可扩展的和直接的。任何时候都要考虑这一点,不要搞个不可扩展的,有状态的东东出来,这是起码的。

原则17:保证消息只被传递一次,不管失败,这很难,除非你要在客户端和服务端都做控制。试着让你的系统更轻便(使用原则18)。你要知道大部分的承诺exactly-once-delivery的系统都是做了精简的。

原则18:实现一个操作尽可能的幂等。这样的话就比较好恢复,而且你还处于至少一次传递(at least once delivery)的状态。

原则19:知道CAP理论。可扩展的事务(分布式事务)是很难的。如果可能的的话,尽可能的使用补偿机制。RDBMS事务是无法扩展的。

点评:new SQL了解一下……

原则20:分布式一致性无法扩展,也无法进行组通信,也无法进行集群范围内的可靠通信。理想情况下最大的节点限制为8个节点。

原则21:在分布式系统中,你永远无法避免延迟和失败。

点评:嗯,对,面向fail设计。但是你的考虑你的用户,你的服务提供SLA。是真的需要724365吗?


 5 

用户体验

原则22:要了解你的用户和清楚他们的目标。他们是新手、专家还是偶然的用户?他们了解计算机科学的程度。极客喜欢扩展点,开发者喜欢示例和脚本,而普通人则喜欢UI。

原则23:最好的产品是不需要产品手册的。

原则24:当你无法在两个选择中做决定的时候,请不要直接把这个问题通过提供配置选项的方式传递给用户。这样只能让用户更加的发懵。如果连你这个专家都无法选择的情况下,交给一个比你了解的还少的人这样合适吗?最好的做法的是每次都找到一个可行的选项;次好的做法是自动的给出选项,第三好的做法是增加一个配置参数,然后设置一个合理的默认值。

原则25:总是要为配置设置一个合理的默认值。

原则26:设计不良的配置会造成一些困扰。应该总是为配置提供一些示例值。

原则27:配置值必须是用户能够理解和直接填写的。比如:不能让用户填写最大缓存条目的数量,而是应该让用户填写可被用于缓存的最大内存。

原则28:如果输入了未知的配置要抛出错误。永远不要悄悄的忽略。悄悄的忽略配置错误往往是找bug花了数小时的罪魁祸首。


 6 

艰难的问题

原则29:梦想着新的编程语言就会变得简单和明了,但往往要想真正掌握会很难。不要轻易的去换编程语言。

点评:“技术极客”是听不进去的,不如把“个人修炼”和“项目采用”分开看待……

原则30:复杂的拖拉拽的界面是艰难的,不要去尝试这样的效果,除非你准备好了10人年的团队。

点评:我一直不太相信整体性的代码生成,比如MDA,或者拖拉拽建模代替写代码……如果说有成功的,或者是在比较狭小的领域。

最后,说一个我的感受。在一个理想的世界里,一个平台应该是有多个正交组件组成-每个组件都负责一个方面(比如,security,messaging,registry,mdidation,analytics)。好像一个系统构建成这样才是完美的。

但不幸的是,现实中我们很难达到这样的状态。因为在项目初始状态时,很多事情是不确定的,你无法做到这样的独立性,现在我更倾向于在开始的时候适当的重复是必要的,当你尝试铲除他们的时候,你会发现引入了新的复杂性,分布本身就意味着复杂。有时候治愈的过程要比疾病本身更加的糟糕。

点评:不同阶段采用不同的做法,照抄往往会东施效颦。


 7 

总结

作为一个架构师,应该像园丁一般,更多的是修剪花草,除草而不是去定义和构建,你应该策划而不是指挥,你应该去修剪而不是去定义,应该是讨论而不是贴标签。虽然在短期内可能会觉得也没什么,但从长远看,指导团队找到自己的方式会带来好处。

如果你稍不留神,就很容易让架构成为一个空洞的词汇。比如设计者会说他的架构是错误的,但不知道为什么是错误的。一个避免这种情况的好办法就是有一个原则列表,这个原则列表是被广泛接受的,这个列表是人们讨论问题的锚点,也是新手架构师学习的路径。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gartner:2018年前沿技术预测

本文转载自科技中国,作者:孟海华(上海市科学学研究所),首发刊载于《科技中国》杂志2018年3月 第3期 预测。一、人工智能全球领先的信息技术研究与顾问公司Gartner认为,2018年将是人工智能大众化应用的开始,将影响到企业…

Scrapy源码阅读分析_5_Scrapy-settings源码分析

From:https://blog.csdn.net/weixin_37947156/article/details/74972642 The global defaults are located in the scrapy.settings.default_settings module and documented in the Built-in settings reference section. 设置 Scrapy 设置允许您自定义所有 Scrapy…

@font-face

问题描述: 产品展示的界面上有个产品编号,由后台程序动态生成,如图 而"875"的字体是特殊字体,如果客户端系统上没有安装该特殊字体,就达不到原设计效果。 解决办法(我认为的三种):1。通过FLASH实…

Java8 Stream详解~Stream概述

Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极大的便利。 那么什么是Stream? Stream将要处理的元素集合看作一种流,在流的…

matlab7.0安装说明

注册码:14-13079-17698-23560-45609-07352-05352-05350-56924-06021-29849-49518-65460-21329-16030-08711-42918-36765-10752-22284-40230-60254-23812-15890-10926-28557-33310-64529-52031-44719-51491-31733-52511-04580 安装方法:1. 系统环境变量 , administrator的TMP改为…

扎克伯格|在美国国会数据门听证会上的证词-中英文全文

来源:网络法前哨美国时间2018年4月10日至11日,Facebook公司CEO马克-扎克伯格(Mark Zuckerberg)将在美国国会就“剑桥分析丑闻”作证。4月10日,扎克伯格已经参加了美国参议院司法与商业委员会举行的听证会。4月11日&…

Scrapy-Link Extractors(链接提取器)

Link Extractors 中文文档:https://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/link-extractors.html Link Extractors 英文文档:http://doc.scrapy.org/en/latest/topics/link-extractors.html 利用爬虫Scrapy中的LinkExtractor(链接提取器…

Java8 Stream详解~Stream 创建

Stream可以通过集合数组创建。 1、通过 java.util.Collection.stream() 方法用集合创建流 List<String> list Arrays.asList("a", "b", "c"); // 创建一个顺序流 Stream<String> stream list.stream(); // 创建一个并行流 Strea…

php: eclipse 编辑 php

http://wiki.eclipse.org/PDT/Installation 按照上面的一步步来&#xff0c;就可以将之前不兼容php的eclipse&#xff0c;打造成可以搞php的eclipse了&#xff0c;嘿嘿 so easy 转载于:https://www.cnblogs.com/forward/archive/2010/05/04/1727453.html

一张图:AI领域里各领风骚的BAT三巨头

来源&#xff1a;网络大数据近日&#xff0c;国内人工智能初创企业商汤科技完成6亿美元融资&#xff0c;由阿里巴巴集团领投&#xff0c;创下目前为止人工智能领域最大的一笔单轮融资。其实在过去两年里&#xff0c;BAT(百度、阿里巴巴、腾讯)就已在人工智能领域里纷纷交出了漂…

Scrapy - Request 和 Response(请求和响应)

Requests and Responses&#xff1a;http://doc.scrapy.org/en/latest/topics/request-response.html Requests and Responses&#xff08;中文版&#xff09;&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/request-response.html 请求 和 响应 通常&am…

一篇文章了解生物特征识别六大技术

来源&#xff1a;赵松科学网博客生物识别技术&#xff0c;通过计算机与光学、声学、生物传感器和生物统计学原理等高科技手段密切结合&#xff0c;利用人体固有的生理特性&#xff08;如指纹、脸象、虹膜等&#xff09;和行为特征&#xff08;如笔迹、声音、步态等&#xff09;…

Java8 Stream详解~遍历/匹配(foreach/find/match)

Stream也是支持类似集合的遍历和匹配元素的&#xff0c;只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配非常简单。 // import已省略&#xff0c;请自行添加&#xff0c;后面代码亦是public class StreamTest {public static void main(String[] args) {List<…

Scrapy-Item Pipeline(项目管道)

Item Pipeline&#xff08;英文版&#xff09;&#xff1a;http://doc.scrapy.org/en/latest/topics/item-pipeline.html Item Pipeline&#xff08;中文版&#xff09;&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html Scrapy 1.3 文…

Java8 Stream详解~筛选:filter

筛选&#xff0c;是按照一定的规则校验流中的元素&#xff0c;将符合条件的元素提取到新的流中的操作。 「案例一&#xff1a;筛选出Integer集合中大于7的元素&#xff0c;并打印出来」 public class StreamTest {public static void main(String[] args) {List<Integer>…

Scrapy-Item Loaders(项目加载器)

Item Loaders&#xff1a;http://doc.scrapy.org/en/latest/topics/loaders.html Item Loaders&#xff08;中文版&#xff09;&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/loaders.html 项目加载器 Item Loaders&#xff08;项目加载器&#xff09; …

《全球人工智能产业地图》发布(附PPT图片)

来源&#xff1a;中国信息通信研究院CAICT摘要&#xff1a;工业和信息化部、电子信息企业、人工智能企业、互联网企业、电信运营商、研究机构、社团组织、高校等代表参会&#xff0c;一致对《全球人工智能产业地图》表示高度肯定和认可。2018年4月10日&#xff0c;在工业和信息…

程序员如何追女孩

我是女生&#xff0c;看到有的男生想追自己喜欢的女孩子又不敢追&#xff0c;还想人家倒追她&#xff0c;我很反感. 从一个女生的角度&#xff0c;我比较了解女孩子的心理。女孩子大多不会主动出击&#xff0c;去追求自己喜欢的男孩&#xff0c;除了确实太喜欢了或者是那种比较…

Scrapy-spiders(爬虫)

Scrapy Spiders&#xff08;中文版&#xff09;&#xff1a;http://doc.scrapy.org/en/latest/topics/spiders.html Scrapy Spiders&#xff08;中文版&#xff09;&#xff1a;https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/spiders.html Scrapy 1.3 文档&#xf…

Java8 Stream详解~聚合(max/min/count)

max、min、count这些字眼你一定不陌生&#xff0c;没错&#xff0c;在mysql中我们常用它们进行数据统计。Java stream中也引入了这些概念和用法&#xff0c;极大地方便了我们对集合、数组的数据统计工作。 「案例一&#xff1a;获取String集合中最长的元素。」 public class S…