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

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

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

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

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

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

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

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

见山是山,见水是水

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

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

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

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

见山不是山,见水不是水

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

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

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

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

见山只是山,见水只是水

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

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

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

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

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

_____________________________

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


推荐阅读
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 通过与阿里云的合作,牛客网成功解决了跨国视频面试中的网络卡顿问题,为求职者和面试官提供了更加流畅的沟通体验。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • Windows 系统下 MySQL 8.0.11 的安装与配置
    本文详细介绍了在 Windows 操作系统中安装和配置 MySQL 8.0.11 的步骤,包括环境准备、安装过程以及后续配置,帮助用户顺利完成数据库的部署。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在Windows系统上安装VMware Workstation 2022的详细步骤
    本文将详细介绍如何在Windows系统上安装VMware Workstation 2022。包括从官方网站下载软件、选择合适的版本以及安装过程中的关键步骤。此外,还将提供一些激活密钥供参考。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
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社区 版权所有