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

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

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

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

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

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

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

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

见山是山,见水是水

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

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

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

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

见山不是山,见水不是水

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

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

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

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

见山只是山,见水只是水

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

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

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

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

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

_____________________________

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


推荐阅读
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • 2020年腾讯PCG后端开发实习生面试经历分享
    本文详细记录了2020年腾讯平台与内容事业群(PCG)后端开发实习生岗位的面试过程,包括初试和复试的主要内容和技术考察点。 ... [详细]
  • 本文详细记录了一位Java程序员在Lazada的面试经历,涵盖同步机制、JVM调优、Redis应用、线程池配置、Spring框架特性等多个技术点,以及高级面试中的设计问题和解决方案。 ... [详细]
  • 本文介绍了如何使用Workman框架构建一个功能全面的即时通讯系统,该系统不仅支持一对一聊天、群组聊天,还集成了视频会议和实时音视频通话功能,同时提供了红包发送等附加功能。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • 利用Git GUI将本地项目同步至GitHub的方法
    GitHub作为开发者不可或缺的工具,不仅提供了丰富的开源项目资源,还极大地便利了个人项目的管理和版本控制。本文将详细介绍如何使用Git GUI工具将本地开发的项目上传至GitHub。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • 本文详细介绍了Python中的流程控制与条件判断技术,包括数据导入、数据变换、统计描述、假设检验、可视化以及自定义函数的创建等方面的内容。 ... [详细]
  • 设计模式系列-原型模式
    一、上篇回顾上篇创建者模式中,我们主要讲述了创建者的几类实现方案,和创建者模式的应用的场景和特点,创建者模式适合创建复杂的对象,并且这些对象的每个组成部分的详细创建步骤可以是动态的变化的,但 ... [详细]
  • 深入解析轻量级数据库 SQL Server Express LocalDB
    本文详细介绍了 SQL Server Express LocalDB,这是一种轻量级的本地 T-SQL 数据库解决方案,特别适合开发环境使用。文章还探讨了 LocalDB 与其他轻量级数据库的对比,并提供了安装和连接 LocalDB 的步骤。 ... [详细]
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 本文详细探讨了如何根据不同的应用场景选择合适的PHP版本,包括多版本切换技巧、稳定性分析及针对WordPress等特定平台的版本建议。 ... [详细]
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社区 版权所有