架构设计贵在务实

(本文是我给温昱先生新书写的读后感节选。)

我最早听说“软件架构”这个概念以及UML的名字,是在1999年的水木清华BBS上。当时有一篇文章介绍了软件架构作为一个相对独立的领域的发展情况,顺便提到在此前一年被接纳为OMG标准的UML。该文作者断言,UML的出现将能“彻底”改变软件开发的工作方式,甚至“若干年之后,不通UML者无法染指软件开发”。三年之后,《程序员》杂志专访Ivar Jacobson时,UML已经是尽人皆知。记得Jacobson在那次采访中劝告中国的开发者,赶快去学习RUP。从那时候起,越来越多的人顶上了“软件架构师”的头衔,张口模式闭口架构,一时间好不风光。然而最初的热乎劲过去之后,人们发现,“不通UML者无法染指软件开发”的预言似乎落了空,而一些软件架构师们似乎也并不那么神乎其技,很多时候反而不如那些实实在在写代码的人管用。他们所宣传的那些架床迭屋的抽象层,那些复杂精致的模式设计,看上去精美无比,柔性十足,然而实践当中一个出乎意料的小变更,便常常能把这一切打得粉碎。他们乐谈的松耦合,小接口,往往只是说起来好听,实际很难落实,或者代价过高,有的时候,反而是反其道而行之,才更“管用”。

为什么会出现这种情况?我想这里有客观和主观的原因。

就客观原因来说,软件开发毕竟还是年轻的行业,各方面还在剧烈发展和变化中。如果把软件技术做一个层次划分的话,软件架构及设计属于上层建筑,而像程序设计语言、技术平台、数据管理技术、网络体系结构等,均在其之下,属于基础。这几年随着互联网的飞速发展,基础尚且在剧烈变化当中,上层建筑自然会摇摇晃晃,甚至赶不上趟。具体来说,当今的软件体系结构设计总体上是基于面向对象思想,而且是强类型语言时代的面向对象思想,而动态语言的出现和流行,实际上很大程度上颠覆了传统面向对象思想的一些原则。例如,人们曾经认为封装非常重要,对象成员能够隐藏便应当尽量隐藏,但是Python和Ruby中public是常态,private反而是变态,实践当中也工作的很好,甚至更好。再例如,几年来人们津津乐道的设计模式,其中有很多在动态语言里毫无必要。而很多在关系数据库时代被视为秘笈的数据存储与访问模式,比如层次关系的表达,反规范化的经验,放到后关系性数据库里就没有多大意义了。再诸如应用的Web化、RIA、SOA等基本思想的变迁,都是能引起整个软件技术格局强烈震荡的大事件,所有这些进行中的剧烈变化,不可能不对软件架构的设计产生影响,从而使得很多关于架构设计的思想迅速过时或者必须调整。如果架构师们不能够充分重视实践,与时俱进,那么就很有可能做出不合时宜的设计。

 就主观原因来说,很多软件架构师走入了一个误区,即一旦升级为架构师,就可以脱离具体的代码实践,可以阳春白雪了。事实上,由于下层技术的变化迅速,架构师一旦脱离代码实践,脱离现实应用,很快就会与实实在在的软件开发工作产生距离感,忘却一线开发者需要面对的现实问题,做出一些不切实际的设计决策。这样的设计,或者执行不下去,或者执行下去也代价巨大,该解决的问题没解决,却在无关紧要的问题上大做文章。毫无疑问,这样的设计得不到一线开发者的衷心支持,得不到好的结果。架构设计跟开发发生矛盾,谁有问题?多半是架构设计出了问题。因为开发直接面对实践,直接从事实践,开发出了问题,那就是实践在向自以为是的伪真理宣战了。然而,一部分架构师不去检讨自己脱离实践的设计,却搞起本本主义,硬拿书本教条死扣实际。另一方面,如果开发者对于架构设计的原则和尝试缺乏了解,不愿意提高对于软件架构设计的认识和理解,不愿意付出对长远有利的代价,也不理解,不支持,甚至消极抵制架构师的决定,那么同样会引起架构设计与开发之间的矛盾。结果往往是,两个必要的角色之间产生矛盾。开发者抱怨架构设计华而不实,架构师抱怨开发者不严格按设计行事,进而相互质疑对方角色的必要性。开发者认为架构师就是吃干饭的文人,根本应该人间蒸发,没有存在的必要,而架构师则觉得开发者是一群无组织无纪律的骄傲的野猫,幻想有朝一日自动代码生成器能把这帮不听话的开发者赶出山门。

事实上,开发者和架构师都是软件开发中必不可少的角色,即使在单人开发的项目中,开发者本人也需要经常在这两个角色之间切换。两个角色的相互理解,和谐协作,才能够共同克服现实困难,开发成功的软件。在促进这种和谐的过程中,开发者应当积极学习架构设计的理论并充分实践,而架构师则需要本着务实的态度贴近一线。

因为从事技术媒体工作,我也确实结识了几个优秀的架构设计师,他们身上的共同特点就是务实。这些架构师都具有多年的软件开发经验,对软件本质的理解相当深入,本身就是开发高手。与一般开发高手不同的是,他们充分实践,但不宥于实践,而是积极地学习软件架构的理论,尝试用理论来指导实践。而与整天高谈阔论的理论架构师不同的是,他们掌握了理论之后,一定要亲自落实,用实践来检验。当理论与实践产生矛盾的时候,他们既不会轻易否定理论,更不会教条主义般地削足适履,而是认真分析矛盾产生的原因,研究可能的对策。在反复思考和实践之下,他们敢于做出“离经叛道”的结论,敢于质疑大师偶像的论断,更能够在错综复杂的实际做出简单、可靠、灵活而便于实现的设计,并且向开发者传达意图,答疑解惑,实现整个团队的思想一致。他们做出的设计,开发者看得懂,做得出,自然会得到衷心的拥护。


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

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

相关文章

php mysql删除失败_php+MySQL实战案例【七】数据编辑、删除

​本节内容中讲解用户管理模块中的修改用户信息和删除用户。修改用户信息:可对选择的用户记录进行编辑,可修改用户名、密码、性别、手机、邮箱和地址信息。删除用户信息:将列表中指定的用户进行删除操作。二、编辑用户信息编辑用户信息&#…

前端每周清单第 34 期:Vue 现状盘点与 3.0 展望,React 代码迁移与优化,图片优化详论...

作者:王下邀月熊 编辑:徐川 前端每周清单专注前端领域内容,以对外文资料的搜集为主,帮助开发者了解一周前端热点;分为新闻热点、开发教程、工程实践、深度阅读、开源项目、巅峰人生等栏目。欢迎关注【前端之巅】微信公…

1.three.js世界的4大要素

一、三大组件 在Three.js中,要渲染物体到网页中,我们需要3个组建:场景(scene)、相机(camera)和渲染器(renderer)。有了这三样东西,才能将物体渲染到网页中去。…

架构设计 例子和实践

系统设计说明书(架构、概要、详细)目录结构 虽然这些文档一般来说公司都是有模板的,但我写这些文档以来基本上是每写一次就把目录结构给改一次,应该说这是因为自己对这些文档的理解开始加深,慢慢的越来越明白这些文档的作用和其中需要阐述的东…

activiti 批量 mysql_Activiti6系列(3)- 快速体验

一、部署启动activiti####1、部署,将两个war包拷贝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、启动tomcat,访问http://127.0.0.1:8080/activiti-app默认账号密码:ad…

【启动】Windows上启动图形化软件,报错: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll...

今天在安装了jetbrains官网上的ToolBox软件后,没有办法启动起来,报错如下: 无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-1-1-0.dll 尝试重新安装了并没有什么用,现在来解决方法: 直接找到官方的…

论文: YOLO9000-Better,Faster,Stronger

论文阅读: YOLO9000-Better,Faster,Stronger YOLOv2 是经过改造之后的YOLO Batch Normalization:在所有的conv layer后加了BN之后提高了2% mAP,BN可以帮助regularize模型,这样的话就可以放弃 dropout。 High Resolution Classifi…

怎么ie取消要打开或保存来自_取消认证后,发票抵扣就这么简单!

点击标题下「中财讯集团」可快速关注3月1日起,取消增值税发票认证的纳税人范围扩大至全部一般纳税人。一般纳税人可以自愿使用增值税发票选择确认平台查询、选择用于申报抵扣、出口退税或者代办退税的增值税发票信息。具体如何操作呢?掌握以下步骤&#…

Google发布文档数据库Firestore

Google发布了Cloud Firestore,它是用于移动、网络和服务器应用程序的文档数据库。\\去年我们曾报道过Google Firebase,它是一种用于移动和网络开发的数据库,提供实时的和离线的数据访问,与许多Google服务相集成。他们现在推出了一…

好的软件架构设计

什么是架构 前言:软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要决定的作出。在很多公…

HihoCoder 1323 回文字符串

回文字符串 思路 动态规划&#xff1a; 可以有三种修改决策 将开头和结尾字符改成一样在开头加一个和末尾相同的字符在末尾加一个和开头形同的字符代码&#xff1a; #include <stdio.h> #include <iostream> #include <string.h> using namespace std; char …

python线程状态_Python线程

1. 线程基础1.1. 线程状态线程有5种状态&#xff0c;状态转换的过程如下图所示&#xff1a;1.2. 线程同步(锁)多线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时&#xff0c;可能存在数据不同步的问题。考虑这样一种情况&#xff1a;一个列…

JavaScript中错误正确处理方式,你用对了吗?

JavaScript的事件驱动范式增添了丰富的语言&#xff0c;也是让使用JavaScript编程变得更加多样化。如果将浏览器设想为JavaScript的事件驱动工具&#xff0c;那么当错误发生时&#xff0c;某个事件就会被抛出。理论上可以认为这些发生的错误只是JavaScript中的简单事件。 本文将…

文件分割机

文件分割与合并 要求&#xff1a;实现对大文件的分割与合并。 按指定个数切&#xff08;如把一个文件切成10份&#xff09;或按指定大小切&#xff08;如每份最大不超过10M&#xff09;&#xff0c;这两种方式都能够。 程序说明&#xff1a; 文件分割&#xff1a;把一个文件分割…

mysql pow函数怎么用_pow函数怎么用

PHP pow函数表示指数表达式。pow函数怎么用&#xff1f;php pow()函数 语法作用&#xff1a;pow()函数的作用是将一个数进行n次方计算后返回语法&#xff1a;pow(X,Y);参数&#xff1a;X表示要做处理的数字Y表示指定n次方中的n数值说明&#xff1a;返回X的Y次方幂&#xff0c;如…

【IntelliJ IDEA】添加一个新的tomcat,tomcat启动无法访问欢迎页面,空白页,404

第一部分&#xff0c;添加一个tomcat 1.先把Toolbar 和 Tool Buttons显示出来 2.选择Edit Configurations 3.添加一个新的tomcat server进来 解决no artifacts configured问题&#xff0c;就是没有项目加入里面 先添加一个没有的项目 启动之后找不到 页面 第二部分&#xff0c…

回文数-时间变换-判断邮箱

class huiwenshu public class huiwenshu {public static void main(String[] args) {System.out.println("输入...");Scanner in new Scanner(System.in);String number in.next();boolean flag true;for(int i0;i<number.trim().length()/2;i){if(!String.va…

mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql开发 j2ee(一)

在这里是使用eclipse&#xff0b;tomcat&#xff0b;mysql的方式。1、软件下载(1) eclipse我使用的是mac&#xff0c;因为本人是苹果客户端开发者&#xff0c;所以目前只有苹果机器了。首先下载eclipse for mac&#xff0c;选择mac 64位&#xff0c;下载eclipse-jee-kepler-SR1…

社交系统ThinkSNS-plus(TS+)V1.0发布!

2019独角兽企业重金招聘Python工程师标准>>> 需要购买源码的同志们&#xff0c;依然随时可以联系我们手机&#xff1a;18108035545&#xff08;同微信&#xff09;&#xff1b;电话&#xff1a;028-82884828 &#xff1b;QQ&#xff1a;3298713109&#xff1b; 从决…

《软件架构设计》一书目录

第一部分 软件架构概念与思想篇 1 第1章 解析软件架构概念 3 1.1 软件架构概念的分类 3 1.1.1 组成派 4 1.1.2 决策派 5 1.2 软件架构概念大观 5 1.2.1 Booch、Rumbaugh和Jacobson的定义 5 1.2.2 Woods的观点 6 1.2.3 Garlan和Shaw的定义 6 1.2.4 Perry和Wolf的定义 …