- 浏览: 326062 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
libaogui777:
前辈,您好, 使用PDFbox 提取内容遇到一个问题,想请教您 ...
java进行pdf解析-----pdfbox -
xin_hany:
提示惊醒了一下,解决了一个让人惆怅的问题,
danga的MemcachedClient的几个缺陷 -
roroyangivan:
牛B啊。。。我觉得 这种 回答。。。阿里的的CTO 都 HOL ...
怎样才是一个好的架构? -
406657836:
今天知道了一个线程创建时会给stack分配1M内存?一个线程默 ...
jvm线程的stack -
linzx0212:
受教了……
danga的MemcachedClient的几个缺陷
关于软件设计的抽象思想
曾经被阿里的某CTO问过一个问题:什么是好的架构?
听到这种最著名的开放式问题,我心里“咯噔”一下,心想:“又来了”。
一个老生常谈,莫衷一是的话题,得与失只在一念之间。
贤哲们的思想,犹如星辰遗落的闪光碎片,美丽零散;正如人生哲理,再著名的编程思想也是一样的细碎不成体系,在现实的复杂性面前会被毫不留情的击得粉碎。但是他山之石可以攻玉,如果不了解那些名词,想必设计思维还会有所欠缺。
下面尝试整理一下我所思考过的那些问题。
架构的原罪:变与不变
软件之所以称为“software”,根本性的原因就在于它是可变的。要修改一个硬件,必须用物理化学手段如高温、高压、强酸、化合等等原子分子级别的操作,而且往往是不可逆的。在计算机发明以前,人类文明几万年的历史,主要是硬件史。更快更简单的造出或掠夺更好的硬件,就是生产力。计算机发明以后,另一个位面:虚拟世界诞生了。在这个位面里,改变衣服的颜色不是先漂白再用着色剂染色,而是修改一个RGB数字;发射子弹不是通过机簧的张力而是一个函数调用;核爆炸试验不需要原子反应而是CPU计算。通过二进制将模拟世界转变换成数字世界,世界的一小部分能通过电磁现象得以模拟,最直接的也是最大的红利就是:相比物质时代,改变的代价变得前所未有的小,促使生产力的爆发性增长。
软件变动的代价再怎么小,我们也仍然觉得麻烦。市场经济下,人类对生产力的追求是无止境的。所以,软件设计的核心追求是:尽可能不变!由于这个潜在的原动力,虚拟位面的造物主开始借鉴现实世界的一切智慧结晶。西方建筑学的计模式(或者我国宋代逆天的《营造法式》?),机械制造的标准件,音乐的结构、曲式、旋律等乐理,社会组织制度,生物,化学,工艺流程,甚至简单到积木和钩子,无一不是造物主们灵感的源泉。(题外话:好程序员应该是博学的,只有精通现实世界才能更好的构造虚拟世界嘛)
为了救赎“变”这个原罪,造物主有个很直觉的思路:
“将变与不变相隔离!”
这句话在软件设计史上的地位相当于原始海洋中细胞膜的诞生,毫不起眼,但是意义无远弗届。统治当代编程思想的面向对象由此发轫。数据和方法一朝碰头,有趣的概念就自然而然的诞生了:类,对象,消息,接口,抽象,继承,多态,封装,复用,多么像一群单细胞生物啊!
造物主当然不会止步于此。类和类可以通过各种设计模式(factory、abstract factory、builder、bridge,command,decorator,flyweight,iterator,mediator,observer,proxy,facade,singleton,chain of responsibility,vistor,state,strategy,template)组成类库或模块,他们遵循的原则包括:“单一职责”,“开闭”,“liskov替换”,“依赖倒置”,“接口隔离”,“重用发布等价”,“共同封闭重用”,“无环稳定依赖”,“稳定抽象”等,到此为止,多细胞生物诞生了!模块一般表现为一个包,为了解决依赖性封装为OSGI、maven、jigsaw或者js的AMD,nodejs的npm,ruby的gem,debian的apt等。
“将变与不变相隔离”,说得fashion一点就是“解耦”,通俗一点就是“把会变的逻辑用设计技巧从稳定的逻辑中抽取出来,使软件设计不用修改就能适应需求的变化”。一个合格的架构师要具备厘清问题领域中哪些是变,哪些是不变,哪些是可能变的洞察力,需要对各种设计技巧和优劣心知肚明,然后才能开始着手设计。这种洞察力在基础软件领域有一些成熟的经验,譬如管道、请求响应、MVC、IOC、代理等等,由于基础应用的需求稳定,所以这种架构的着眼点更关注灵活性、扩展性、性能等方面,学习参考Spring、Jetty、Netty、Nginx。在应用软件领域,这个洞察力就不太靠谱了,因为软件的用户变成了人,逻辑像野草一样不可控起来。费尽心力设计一个优雅的系统,客户的一句话就得改头换面。架构师很痛苦,尤其在web方面,很少见到在逻辑层用上什么设计模式,如果用上了,基本也是吃力不讨好的后果。“变”与“不变”,是架构师需要学习的第一堂课,是指导我们行动的准则。一个逻辑,如果无法判断其稳定性,就不要花费精力设计,否则迟早掉入“过度设计”的坑里。
架构的抉择:选择合适的技术而不是最好的技术
多细胞生物怎么协作呢?模块通过各种纤尘、线程或进程运行,与进程内或进程外甚至远程的其他模块以各种稀奇古怪的方式通信,包括函数调用、共享内存、文件、管道、消息、信号量、socket,这些通信方式有的还涉及到序列化和反序列化,譬如RMI、hessian、xml、json、thrift、protobuf、phprpc、amf、avro等。模块接着整合为应用,在OS或虚拟机上运行,抢夺CPU指令流水,占领内存,处理IO的IN/OUT,把虚拟世界运转起来。应用可以扩张成集群,不管是水平扩展还是垂直扩展,通过代理服务器、负载均衡路由、LVS等方式,IO、Memory和CPU的负载可以得到分流,从而架构出大规模计算集群;反之汇总集群计算结果的方式有map/reduce、集中式存储等。基本从家庭发展到了部落。已经有了生物聚集性,离蚁群的群体智慧还有一步之遥。现在方兴未艾的云平台和开放平台浪潮,则进一步将各个部落开放出来,各个平台通过互联网也具备了整体协作的简单能力。
我们处在这样一个空前复杂的虚拟生态系统之中,能选择的实在太多了。作为架构师,这是一个整合的时代!
选择合适的机房,合适的硬件,合适的平台,合适的语言,合适的框架,合适的数据存储,合适的分布式,合适的协议,
到处都是选择题。怎么选?
如果你头脑惯于发热,或者极度追求高端技术,甚至是为了技术而技术却忘了产品的成功才是你应该追求的目标,你往往会做出一些漂亮的架构,能为简历增光添彩,但却对团队伤害至深。要选择最合适的技术,而不是最好的技术。就像算法的本质是空间与时间的博弈,架构的本质是开发效率和产品目标的平衡。开发快,运行快,可扩展,能重用,好测试,容易部署,便于运维,学习成本低,好招人,甚至公司的中远期规划,这些责任是架构师必须铭记在心。架构师要慎重抉择每一项技术,有针对性的做性能测试,压力测试,代码实现,周边工具调查等实际的劳务。你应该对各种性能参数了如指掌。JVM一次普通方法调用,一次反射方法调用,一个事务插入,索引查询,一次http通讯,一个memcache set操作的耗时这些细枝末节往往是决定架构成败的关键。
在我决定离职的那段时间里,我一直在反思两年中公司所犯下的错误。除了产品的问题,技术架构也是一个决定性的败因。由于未知的历史原因,公司形成了C++,Flash,Java三个技术团队,互不统属,用网络游戏的架构加上千万PV的web架构开发两套互联的产品,技术很复杂,迭代很迟钝。作为java架构师,我也是很缓慢的才觉察到大局的失误。大错已成!到我管理整个技术部时有心杀贼无力回天。这段创业失败的经历教会我很多,其中之一就是:合适的目标加上合适的技术才是王道,不要好高骛远,不要追高求新,在创业初始阶段开发效率和用户体验是第一位的。
相关架构参考:
一个架构已经存在并良好运作了,还有什么要做的?要防止它腐化!与时俱进。这又是个大课题,幸亏有人写得比我好多了:http://www.infoq.com/cn/articles/cjz-architecture-corruption 作者是前yahoo工程师陈金洲,应该还有人记得他写的buffalo框架吧,我很喜欢用。
携程网的架构演化:http://www.infoq.com/cn/presentations/ly-ctrip-on-soa
讲的比较实在和翔实,现实的世界里不只是漂亮的图表,而是要把繁杂的遗留系统优化成井井有条的理想世界。SOA架构,简单的分布式事务,ESB服务,服务治理,携程基本上是一个处于初级阶段的大型系统。
评论
但是通常吃多了就会发胖,一发胖动作就慢了。
所以需要时时的帮架构做运动。
有些大公司专门有这样的职位:模块设计师,架构守护者。
能够被采用的开源项目通常都是优秀的项目,如何维持开源项目的优秀特性和优秀架构就是守护者的责任了。
从这个层面上说,守护架构远远比架构来得任重道远。
发表评论
-
Ruby API代码技巧
2012-05-23 21:53 1132http://www.slideshare.net/ihowe ... -
nginx的编译选项
2012-04-25 17:30 1583下载nginx源码包,编译命令之一: ./co ... -
10 Core Architecture Pattern Variations for Achieving Scalability
2011-11-20 22:00 1098【转载】:http://highscalability.com ... -
wowza doc of multi-bitrate streaming
2011-11-06 11:49 2403http://www.wowza.com/forums/con ... -
今天回首
2011-09-01 22:13 1305突然发觉很久不上javaeye了,仿佛生活中遗忘了这一块。 每 ... -
你的邮件”被垃圾“了吗?
2010-11-30 20:37 1143最近在注册系统中使用邮件激活,用公司的邮箱服务器发送帐号激活邮 ... -
mongodb的map/reduce实属鸡肋
2010-11-24 22:47 1543曾经被mongodb的特性所吸引,没想到map/reduce却 ... -
[老博迁移2005-11-09]TeracMiracle反编译成功
2010-08-12 22:13 902TeracMiracle反编译成功 TM:中国人写 ... -
[老博迁移2005-11-09] 越是官大,越是懒
2010-08-12 22:11 1183越是官大,越是懒 小小的公司里就有官僚了,真 ... -
danga的MemcachedClient的几个缺陷
2010-08-11 16:19 17435最近实际用起来我发现,java版danga的memcached ... -
今天参加RubyConfChina的活动,见识了
2010-06-27 00:27 1230这次是RubyConfChina的 ... -
用中国历史来命名软件版本和开发阶段
2010-04-27 15:11 808有这个想法是因为早晨用apt-get 时看到了lucid,联想 ... -
该死的CXF
2010-04-15 21:20 1188为了连https web services,初步选择以前用得还 ... -
jsp太大编译不了,原来是64k的方法限制
2010-02-11 12:04 2854昨天遇到一个诡异的问题,吓出一身冷汗。 20几个300k ... -
javascript技巧:(function(){})()
2010-02-11 12:03 1212javascript技巧:(function(){})() ... -
lucene搜索引擎简单应用
2010-02-11 12:02 1263还用lucene架了个搜索引擎,对pdf进行全文搜索(联合 ... -
java进行pdf解析-----pdfbox
2010-02-11 11:58 10575对pdf解析有不少成熟技术,经过选型,我最后选定用pdfb ... -
用flash动态上传文件
2010-02-11 11:52 1196用flash写了一个动态的文件上传功能,当然也用了jque ... -
不当家不知道柴米贵,不开发不知道重启费
2010-02-11 11:21 1170话说我开始逐渐脱离群众,开发得越来越少。还好最近做了 ... -
【转】Getting real
2010-02-11 11:18 925【转】Getting real 刚才偶然看到的, ...
相关推荐
在IT行业中,设计一个高并发的系统架构是一项关键任务,特别是在大数据时代,处理大量用户请求的能力成为了衡量系统性能的重要标准。本资料包“45_说说一般如何设计一个高并发的系统架构?”包含了关于这一主题的...
《软件架构设计教程》是一本全面且深入的指导性书籍,专为那些希望在软件开发领域提升自己架构设计能力的人员而准备。该教程涵盖了软件架构设计的核心概念、原则、模式以及最佳实践,旨在帮助读者从宏观层面理解和...
架构漫谈(一):什么是架构? 架构漫谈(二):认识概念是理解架构的基础 架构漫谈(三):如何做好架构之识别问题 架构漫谈(四):如何做好架构之架构切分 架构漫谈(五):什么是软件 架构漫谈(六):软件架构...
C/S架构,全称Client/Server,是一种传统的两层架构,它的核心特点是客户端和服务器端的直接交互。在C/S架构中,客户端包含了大部分的业务逻辑和用户界面,用户通过安装在本地的客户端程序与服务器进行通信。客户端...
#### 三、怎样才是好的架构图? 好的架构图应具备以下特点: - **明确受众**:在绘制之前,首先要确定架构图的目标受众,这样才能更准确地传递信息。 - **自描述性**:图应该是自描述的,即读者可以通过图本身理解...
例如,如果需要支持玩家撤销操作,可以为每个命令对象添加一个“undo”方法,当需要撤销时,调用该方法来恢复之前的系统状态。 总的来说,命令模式在手游后端架构中的应用有助于简化设计,提供更好的可扩展性和控制...
1. 技术的深度和广度:需要对各个技术有足够深的了解,清楚每个技术能解决什么样的问题。 2. 业务理解分析能力:需要对业务进行充分的理解和分析,设计出基于需求的架构。 3. 良好的沟通能力:需要具备良好的沟通...
综上所述,构建一个优质的百度推广账号架构需遵循“整体扁平化”、“分类清晰”和“与业务紧密关联”的原则。通过合理规划账号结构,不仅可以提高推广效果,还能够降低运营成本,为企业带来更高的投资回报率。企业在...
一个自然的系统或人造系统,如软件系统,往往在初期都是有序的。然而,随着时间的推移,系统功能的增加、调用频率的提升,系统内部会逐渐变得碎片化、无序化,系统的熵会不断增加,这在软件系统中体现为代码的杂乱、...
深入高频最深处:高频交易软硬件是怎么架构的? 本文主要探讨高频交易(HFT)软硬件架构的秘密,揭开了高频交易的神秘面纱。文章首先指出,高频交易并不一定是套利算法,而是做市(market making),提供流动性,让...
软件架构设计五视图方法论是一个非常重要的设计方法论,它可以帮助开发团队更好地理解系统的需求和设计,并确保系统的整体性和可维护性。在软件架构设计中,架构师需要结合实际情况选择合适的设计方法论和设计原则,...
三层DLL架构是一种软件设计模式,它将应用程序的逻辑分解为三个独立的层,分别是表示层、业务逻辑层和数据访问层。这样的设计有助于提高代码的可重用性、可维护性和模块化,使得各层之间职责分明,降低耦合度。 1. ...
大数据平台架构的选择是一个关乎企业数据处理能力、业务需求和资源投入的重要决策。在这个过程中,我们需要考虑的不仅是技术的先进性,更重要的是业务的实际需求和现有条件。本文将从业务视角出发,探讨大数据平台...
《大型网站架构说明》是一份深入探讨网站架构的宝贵资料,包含了从基础到高级的多个层面,旨在帮助读者理解如何构建稳定、可扩展且高效的大型网站。这份文档分为三部分,即“大型网站架构系列一”、“大型网站架构...
有人问我,什么是架构师,怎么样才能成为架构师?我回答说:编码,编码,再编码;改错,改错,再改错。当你觉得厌烦的时候,停下来想想,怎么才能更快更好的完成这些工作?架构师就是在实践中产生的,架构师来自于...
11_如果让你来开发一个消息队列中间件,你会怎么设计架构? 12_总结一下消息队列相关问题的面试技巧 13_体验一下面试官对于分布式搜索引擎的4个连环炮 14_分布式搜索引擎的架构是怎么设计的?为啥是分布式的? 15_...
架构师是软件行业中的一个特殊角色,他们通常需要具备一种“上帝视角”,从而能够更好地观察和表达这个世界。在软件行业中,架构师和工程师创造的软件产品服务于人类,满足人们的需求。架构师的工作不仅在于设计和...