热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

设计的三个境界:见山三部曲

青山禅师在回顾自己的参禅经历的时候这样说:“三十年前未参禅时,见山是山,见水是水。及至后来,亲见知识,有个入处。见山不是山,见水不是水。而今得个休歇处,依前见山只是山,见水只是水……”这段

青山禅师在回顾自己的参禅经历的时候这样说:“三十年前未参禅时,见山是山,见水是水。及至后来,亲见知识,有个入处。见山不是山,见水不是水。而今得个休歇处,依前见山只是山,见水只是水……”

这段话是典型的中国式的智慧,只可意会不可言传。参禅如此,设计不也是如此嘛。对禅学我是非常不通,要我解说更是容易招来大师的指责。不过既然和设计相通,我却想借用见山三部曲来衡量设计的境界。

王国维在《人间词话》说:古今之成大事业、大学问者,必经过三种之境界:

  1. 昨夜西风凋碧树。独上高楼,望尽天涯路
  2. 衣带渐宽终不悔,为伊消得人憔悴
  3. 众里寻他千百度过,蓦然回首,那人却在,灯火阑珊处

这三个境界也同样适合我们软件工作者。可是也正是因为有前人那么精辟的话在,我来贸然解释,非常惶恐。如有偏差,望大家多多批评。

见山是山,见水是水

这个时候,我们对设计都是一些简单想法。从直接编程到先设计后编程,我们往往非常惶恐。我第一次设计的时候,真的不知道从何入手。和同事小祝两人的直观想法就是画静态类图。那时对我们来讲,将数据结构转换成类结构,就是设计了。幸好,后来公司也意识到这个情况,派了高手过来,带着我们过河。

不过由于那次是我们公司第一次大规模设计,所以很多东西也不是很明白。对于很多业务,也不是我们设计者非常理解的。所以设计的很多时候,都是在询问其业务意义。再加上一些简单设计模式的理解。再加上我们那个奋力拼搏非典的春天。第一个设计就是这样完成的。

可以想象,这个设计中存在的问题并不在于它不能解决问题。说得不好听,没有设计,我们照样可以做软件。我们只是比之前的盲目状态稍微好点。但只是意识到了,思想还没有跟上。这时候,面对的问题,都是就着问题解决问题。大部分都停留在表层。这个系统基本就是简单再现了原有系统的框架结构。

此种情况下,山在架构师眼中,就是山上的地貌。而设计出来的系统,也就像工笔画一样。

见山不是山,见水不是水

人们在学习软件设计的过程中,抽象是最容易被提及的技术和方法。包括类的抽象、系统的抽象、框架的抽象。对于类的抽象我们一般比较擅长。可是真正在业务上的抽象并不是那么容易的。

这个时候,很多设计者容易躲避繁杂的业务,而去从核心上抽象整个系统。我也有这样的经历。设计的时候,将系统看成一个简单的模型,比如:业务流模型,MVC模型等等。从这个模型入手,再解决几个系统的重要问题。剩下的很多业务问题,都交给程序员完成。

据说这个模式,现在还比较流行。我想这也许是因为很多设计者在这方面比较相像。将系统的设计分成两部分:第一、系统架构,也就是前面说的。第二、模块设计,也就是交给程序员或者组长继续设计模块。华为的研发模式好像就是这样的。我对这个模式没什么意见,毕竟,适合人的模式,才是有效的模式。

在这个设计中,系统往往已经不再是业务系统,而变成一个抽象的系统。业务都是抽象系统上的枝叶。

见山只是山,见水只是水

此山已经非彼山了。当系统架构师将业务概念融会贯通的时候,虽然存在抽象模型,但是系统的重点仍然是业务本身。这样的系统才是业务系统。这样的系统才是完整的,这样的系统才是系统的。

我在这方面只能说有朦胧感觉,不敢说自己有什么心得。

要用业务的概念来描述整个系统,那么系统看上去还是业务的。在架构师眼里,系统是一个完整的系统,他们不会只关系核心而忽略更为重要的业务,这样更容易真正从系统的角度来思考整个业务系统。

山,在他们眼里,是系统的山。他们能发现其中的地势,哪里攀爬困难,哪里适合建房。也能理解内部的地质结构,哪里是实心的,哪里存在溶洞。哪里有地下泉水。还知道哪里容易发生泥石流之类的地质危害。

面对业务系统,我们不是也该如此吗?抽象的框架是为了更好地理解系统,但是理解业务中真正的变化部分才是设计的重中之重。要不我们为什么一直在高呼“可维护性和可扩展性”呢?正是因为难以做到,才更证明这是一个比较高的境界。

_____________________________

很多时候,境界的理解,是因为个人的环境以及个人的修养。一些浅显的见解,只是在这方面做一些尝试。希望对大家能有些许的帮助。


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文讨论了同事工资打听的话题,包括同工不同酬现象、打探工资的途径、为什么打听别人的工资、职业的本质、商业价值与工资的关系,以及如何面对同事工资比自己高的情况和凸显自己的商业价值。故事中的阿巧发现同事的工资比自己高后感到不满,通过与老公、闺蜜交流和搜索相关关键词来寻求解决办法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
author-avatar
手浪用户2602906465
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有