浅谈敏捷设计
在软件开发过程中,都避免不了进行概要设计、详细设计等过程,这和软件测试过程中进行测试计划测试方案设计很类似。
这篇博客,就说说敏捷设计的一些内容,以及拙劣设计对软件应用的严重影响。
我们日常接触到的软件项目是一个抽象的概念,它和程序包括形状、结构以及每一个模块、类和方法都有关。可以通过很多媒介和语言去描述它,但它最终体现为源代码——源代码就是设计。
应该知道的一件事是:软件都是有生命周期的。当出现以下任何一点时,就表明软件正在步入声明晚期。
一、拙劣设计的表现
1、僵化性(Rigidity)
僵化性指的是难以对软件进行改动,即使是简单的改动。单一的改动可能会导致有依赖关系的模块出现不可预知的变化,可以将其称之为:业务和技术的屏障!最常见的具体表现为:需求变更!
2、脆弱性(Fragility)
脆弱性指的是进行一个改动时,程序的许多地方可能会出问题。常见的表现是出问题的地方与改动的地方并没有概念上的关联,修正这些问题就会引起更多的问题,这样会导致技术负债不断变大!
3、牢固性(Immobility)
牢固性是指设计难以重用。比如设计中包含了对其他系统有用的部分,要将其从系统中剥离出来所需要的努力和风险太大。
PS:这也是这几年微服务和DevOps越来越流行的原因。
4、粘滞性(Viscosity)
粘滞性有2中表现形式:
①软件的粘滞性:对软件进行改动有很多方法,有些可以保持设计,有些会破坏设计。当可以保持系统设计的方法比生硬方法更难以使用时,就表明系统具有较高的粘滞性。
敏捷设计的目标是:软件设计应该可以容易的进行那些保持设计的变动。
②环境的粘滞性:开发环境的迟钝、低效,就会产生环境的粘滞性。比如编译花费时间长,比如代码管理需要花费几个小时去check in仅仅几个文件,这样都很难保持项目中的软件设计。
敏捷设计目标是:创建易于保持系统设计的软件环境。
5、复杂性(Complexity)
复杂性则指的是设计中包含了当前没有用的组成部分。它还有不必要的复杂性。我们在进行软件设计时经常为了保持代码的灵活性和扩展性,而设置本次迭代并不会用到的结构设计,这样会使得
软件变得复杂,并且难以理解。
6、重复性(Repetition)
滥用重复的代码,这是软件设计重复性表现最频繁的方式。代码设计应该是抽象、简洁的。当系统中重复的代码较多时,会使得系统难以改动,且难以阅读,出现问题时也需要对其进行一一修正。
但每个重复体之间都有细微的差别,所以修正的方式也不同,这样会导致大量重复的工作,降低了工作效率。应该努力做正确的、产生更多价值的事情,而不是造轮子。
7、晦涩性(Opacity)
晦涩性指的是模块难以理解。如果模块代码难以理解阅读,随着时间变化而代码进行演化,会变得越来越难以理解。所以,编程是一门艺术,代码应该是优雅、易读的。
二、为什么设计会变得拙劣?
需要知道的一点:需求是项目中最不稳定的因素。如果我们的软件设计由于持续的、大量的需求变更而变得拙劣,那就表明我们的设计和实践本身是具有缺陷的。
三、保持尽可能好的设计
敏捷开发人员应致力于保持设计尽可能的适当、干净。不断优化设计,不是几周甚至几个月才进行一次的事情,而应该贯穿与软件的整个项目周期,经常性的去优化。
源代码是设计最重要的指表示,所以它同样要保持干净。这也是一种职业素养。
四、什么是敏捷设计
敏捷设计时一个过程,不是一个事件。它是一个持续的应用原则、模式以及实践来改进软件的结果和可读性的过程。它致力于保持系统设计在任何时间都尽可能的简单、干净以及富有表现力!