为什么需要学UML建模
江湖上最多的是水平一般(平庸)的码农,数量估计超过 2/3,而编程高手在数量上其实属于弱势群体,远不及 1/3。人们常把编程高手称为软件架构师(相当于码师),以区别于一般的软件设计师、程序猿或码农。
那么,普通码农与编程高手,在开发能力和水平上到底有哪些区别?
主要原因
掌握 UML 建模之所以是成为编程高手的一条捷径,主要与 UML 建模的价值和用途有关。
原因一、基于 UML 建模的 OOAD 是 OO 软件架构师的基本功
Visual Modeling(可视化/图形化建模)对于软件开发(尤其拥有大量代码的复杂、大中型系统和产品)非常重要,而利用建模技术有效地进行系统分析与设计,能够有条不紊、从容不迫地应对、解决复杂和棘手的软件设计难题正是编程高手们所擅长的。
软件开发本质上是一种思维游戏(张恂:Software development is a mind game.),程序代码的好坏其实是开发者思维的体现。普通码农与编程高手的主要差别正是在于思维,尤其在抽象思维、空间思维、逻辑思维等方面。编程高手如何编程?拿到一个需求,脑子里一片空白或者乱糟糟的就开始写代码?当然不是。
在思考能力上,针对同一个软件设计问题,架构师常常比一般码农想到的更多,更快,也更正确,而且具有预见性。通过建模来进行系统的分析与设计(如针对 OO 软件的 OOAD,即面向对象分析与设计),在大脑中习惯用高层(high level)、抽象的模型,而不是一行行具体、累赘的代码来进行快速、敏捷地思考和决策,是软件架构师的一项基本功。这不是说代码不再重要,而是因为合格的软件架构师对代码细节、语法技巧等已经烂熟于胸,可以更加超脱、宽广的视野思考一些比代码更为重要的设计。
![](http://umlgreatchina.org/img/ooadp.png)
对于职业的软件工程师与高手们而言,软件不仅仅是平面、具体的源代码,软件还是分层、立体的,具有横向和纵向的抽象多层结构;编程也不仅仅是写代码,还有上层更为重要和关键的系统分析与设计,而代码只不过是分析设计(抽象思考活动)的结果与体现。
而普通码农,由于缺乏思维训练、设计经验和思考能力不足,常常不习惯或不善于抽象思考,难以理解抽象的事物,而更乐于理解低层(low level)细节和具体的事物(如代码),不知道源代码之上其实还有抽象的面向对象设计模型(OOD)、分析模型(OOA)等上层建筑,不知道代码错误常常是由于自己的设计(大脑中的“设计模型”)错误、缺陷所导致的。许多业余和初中级码农不明白,自己的 Java、C# ... 等程序老写不好,老出错,老是要改,其中一个主要原因是因为他们不熟悉或不懂 OOD(包括 OO 程序设计的原则、模式和技巧)。而 OOD 不好,你写的程序 OOP 也不可能好,所谓的精通 OO 编程是假的。
专业程序员学习编程,思维从具体到抽象,从低层到高层,从沉溺实践细节到钻研理论方法,从关心代码实现到关心架构设计,是一个很自然的成长、升级过程。作为 70 后,我是从 1996 年计算机系研究生二年级开始自学的 C++、Java、设计模式,1998 年毕业后又自学的 OOAD 和 UML,当时正是 OOAD 在国外最火的年代,而 OOAD、UML、设计模式这些技术课程在国内大专院校基本普及是 2005 年以后的事吧。
软件开发如何进行 OOAD?最佳手段当然 UML 建模。作为国际标准(ISO、OMG),UML 的一个主要用途正是作为 OOAD 的标准建模语言。如今 20 年过去了,对于一位带领团队负责开发 OO 软件系统的架构师而言,在平时工作中不懂系统分析与设计的方法论,也不会 OOAD,看不懂 UML 图,甚至连在白板上画个规范一点的设计图也画不好,这些都是令人难以想象和接受的。难道作为高级程序员、架构师的他,只会用代码思考?所以我们说,不但建模、系统分析设计是架构师的基本功,OOAD、UML 也是。
然而,15 年来中国的软件江湖上为什么老有一批人强烈地反对 OOAD、UML,甚至一度还成为江湖上程序猿群体的主流意识?原因是多方面的。
原因二、UML 帮你对软件架构和设计进行抽象、全面、敏捷地分析与思考
UML 建模方法通过多种图形(Diagram)和视图(View)提供了多个层次、多个角度分析、观察软件架构的丰富手段和灵活表现形式,例如著名的“4+1 视图”(Use Case View, Logical/Design View, Process View, Implementation View, Deployment View)等。基于这样的思考,软件架构的设计才是全方位、系统化和高质量的。
![](http://umlgreatchina.org/img/4+1view.jpeg)
我认为 UML 最大的价值,在于帮助开发者对软件设计进行敏捷的思考(Agile thinking in UML)。针对一个具体、复杂的软件设计问题,编程高手在开始编码之前常常善于利用各种模型、图形与方法论在自己的大脑中进行深入思考和建模(Mind Modeling),明确需求,评估方案的可行性和有效性,衡量各种可选方案的利弊,必要时也会利用白板、图纸等建模工具进行设计,做到胸有成竹后才动手,结果往往效率高、质量高而差错和返工少。这就是专家们常说的 Quality Before Code。
而普通码农,由于缺乏设计经验和思维训练,常常对一个问题的需求和方案还没想明白就习惯性地、急匆匆地开始编码,思维不成熟、考虑失误的结果必然导致代码错误一大堆,改来改去还老改不对(俗称 code and fix),因此浪费了不少时间和精力,还美其名曰“重构”。
每天动手编码前或在编码过程中进行少量、必要(just enough)的 UML 建模、方案设计与思考,可以避免后期许多的折腾和浪费,这无疑是一种非常敏捷的优秀工程实践。其实像 Scott Ambler、Craig Larman、Martin Fowler 等敏捷大师都一直鼓励和提倡敏捷建模(Agile Modeling)如 UML Sketch(UML 素描)。可惜在敏捷运动的前十年时间里这并未引起大家的足够重视,因此我把 UML 建模(包括敏捷建模、太极建模等)列为 Agile 2.0 的一个重要实践。
原因三、UML 帮你快速、形象、牢固地记忆设计模式和方案
20 多年来,大量成熟的软件设计最佳经验已经被国内外专家与大师们保存在设计模式(Design Pattern)当中。编程高手与普通码农的一大区别就在于掌握软件设计经验和知识的多少,而高手精通大量的软件设计模式,不但脑存储量大,可以信手拈来、随用随取,而且往往能用得恰到好处。
设计模式中蕴涵的软件设计经验都是抽象的知识,它们高于代码,不是代码,所以用 UML 来表现设计模式常常是最佳方式,两者是绝配。当有人念到一个设计模式的名称,如 Observer,你的脑海中是否能很快浮现出这个设计模式的具体结构,有哪几个类或对象,它们之间的静动态关系如何,是如何执行运转的?为了记住一个经典好用的设计,有了 UML 这些抽象、简单的图形符号,我们就没必要再死背一行行的代码,而只需要轻松、有效地记住一个抽象的设计框架和实现重点。
编程高手最厌恶死记硬背,而普通码农常常习惯、依赖于死记硬背。通过 UML 图(如类图、交互图等)来分析、记忆许多设计模式和其他成熟的设计方案,是提升个人软件设计能力的一条捷径。有通过背代码来死记设计模式的吗?这么做是不是有点笨?
原因四、UML 帮你直观、形象、准确地与队友沟通、探讨软件设计
编程高手通常有很强的技术沟通能力。
原因五、画 UML 图是阅读、理解、学习源码的高效手段
编程高手常常通过阅读、学习别人的(开放)源码来提高自己。
你从来都只是干巴巴地阅读源码,靠绞尽脑汁来理解,靠死记硬背来记忆,从来都不画图?这么做有点笨吧。
画什么图?怎么画?
当然最好是用国际标准符号(UML)了。
小结
为什么掌握 UML 建模是成为编程高手的一条捷径?
简单回答,因为 UML 建模是进行 OOAD,学习运用设计模式,精读源代码,敏捷地思考和沟通软件设计方案的一把利剑,也是成为软件架构师的必要条件和技能,而这些是普通码农所不掌握或不屑掌握的。一旦熟练掌握了 UML 建模技术,恭喜你,你已超越了江湖上 70% 的码农!
为什么需要学UML建模的更多相关文章
- 从零开始学架构(三)UML建模
文章大纲 1. 文章介绍 2. UML概述 3. 静态模型 4. 动态模型 5. UML建模的一般过程 一.文章介绍 1.1为什么学习UML (1)UML是一种软件架构的模型表现方法,用于项 ...
- 本节向大家介绍一下UML建模误区
本节向大家介绍一下UML建模误区,这里向大家介绍九个误区,希望通过本节的学习,你对UML建模有清晰的认识,以免在以后使用过程中产生不必要的麻烦.下面让我们一起来看一下这些建模误区吧. UML建模误区 ...
- UML建模工具
UML:Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段 ...
- 你必须学UML之理论篇
1.前言 对于当前社会背景下从事软件开发的工作者而言,"写代码"实际上并不是唯一的工作.特别在一些中小型的企业当中,这些企业往往对于开发者的要求,不单单停留在写代码完成相应功能上, ...
- 三大UML建模工具Visio、Rational Rose、PowerDesign的区别
本文源自http://developer.51cto.com/art/201006/207993.htm UML建模工具Visio .Rational Rose.PowerDesign的比较 RO ...
- UML建模类型(转载)
区分UML模型, UML建模用于不同类型的不同的图.有三个重要类型的UML建模: 结构建模: 系统结构建模捕捉静态功能.它们包括下列各项: 类图 对象图 部署图 包图 复合结构图 组件图 结构模型代表 ...
- 使用Visio进行UML建模
http://www.qdgw.edu.cn/zhuantiweb/jpkc/2009/rjkf/xmwd/Visio_UmlModel.htm#_Toc80417837 内容提纲: 1.VISIO中 ...
- UML建模文章总结
一.为什么要学习UML UML是Unified Modeling Language(统一建模语言)的简称.UML是对软件密集型系统中的制品进行可视化.详述.构造和文档化的语言.制品{Artifact} ...
- 五个免费UML建模工具推荐
UML工具很多是商用的,价格不菲:而免费的UML建模工具,功能完善的很少.以下推荐的是五个免费的UML建模工具,相对而言还算功能比较不错. 1.免费UML建模工具推荐:JUDE – community ...
随机推荐
- Java SSM 整合
从2012年的“用户标签”到2014年的“用户画像”,从2015年的“大数据”到2017年的“人工智能”,大数据正在从神坛走向现实.“标签”到“画像”,代表着数据在数量和维度上,逐渐在丰富:“大数据” ...
- Linux内核分析第五周——扒开系统调用的“三层皮”(下)
Linux内核分析第五周--扒开系统调用的"三层皮"(下) 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.1 ...
- 【bzoj3295】动态逆序对
Portal --> bzoj3295 Solution 虽然说这个可能原本是一道愉快的树套树但是 没有强制在线并且是三维限制那就大力cdq分治啊! 看到"按照某个顺序依次删除 ...
- Python3 字典 get() 方法
Python3 字典 描述 Python 字典 get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: dict.get(key, default=None) 参数 ...
- 《剑指offer》— JavaScript(2)替换空格
替换空格 题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 实现 ...
- laravel5.1 使用中间表的多对多关联
用户表user 标签表tag 中间表user_tag(user_id,tag_id) 在user模型中定义tags关联如下: public function tags() { return $this ...
- Qt ------ QTabWidget
下图: 1.长方形的 objectName 可写可不写,不写就作用于所有 QTabWidget:椭圆形的 QTabWidget#tabWidget 要么四个都要写,要么四个都不写 2.下图的 CSS ...
- WPF系列之一:基于并行任务和MVVM创建响应灵敏和数据驱动的UI
在利用WPF创建桌面应用程序的界面时,经常使用MVVM的设计模式,以减少UI层与逻辑层的代码耦合度. 在MVVM的设计中,最主要的方法和技术是UI中的控件利用Binding来和逻辑层(ViewMode ...
- scrapy 采集网页出现丢失url的问题
url_list = ["http://www.icoat.cc/news/list_18_3.html", "http://www.icoat.cc/news/list ...
- DLL基本知识
一.生成方式: 使用DEF文件定义导出接口或使用__declspec(dllexport)描述接口,编译链接后生成dll+lib,其中lib是导入库,里面只有对导出接口的描述,而没有具体实现. 二.链 ...