模块化思想与最小可工作案例法
1 模块化思想
长期以来,关于模块化思想,我们中国人已经听得耳朵生茧了吧。但问题却是我们中国人真的理解模块化思想了吗?
模块化思想是将要解决的问题分解为若干独立的、可替换的、具有预定功能的模块,每个模块实现一个功能,各模块通过接口组合在一起,形成最终要解决的问题。
对于简单问题,可以直接构建单一模块。而对于复杂问题,则可以先创建若干个较小的模块,然后将它们组装、链接在一起,从而构成复杂的系统。
模块化具有以 下优点:
- 易设计:较大的复杂问题分解为若干较小的简单问题,使我们可以从抽象的模块功能角度而非具体的实现角度去理解要解决的大的复杂的问题,从而整个问题的结构非常清晰、容易理解,在设计之初可以更加关注系统的顶层逻辑而非底层细节。
- 易实现:模块化设计适合团队开发,因为每个团队成员不需要了解系统全貌,只需关注所分配的小任务。另外团队可以灵活地增加人手,新人只需直接接手某个模块, 不会影响系统其他模块的进展。
- 易测试:每个模块由于是独立开发的且结构简单的,因此,不但可以独立开发,也可以独立测试,最后组装时再进行联合测试。
- 易维护:如果需要修改或者扩展系统功能,只需针对特定模块进行修改或者添加新模块。
- 可通用:很多模块都可以不加修改地用于其他相似问题。
比如,编程中的函数就是一个功能模块。首先,每个函数都是为了满足特定功能。其次,函数的设计应该尽可能简单,从而方便设计和测试。再次,函数内部的变量具有局部性,从而避免与外界其他内容的相互影响,从而使函数真正成为独立的模块。作为一种模块化构件,函数就像“黑盒”一样,其内部细节应该对外部不可见。同理,函数内部也不应直接使用外界的东西。如果函数需要外界的数据,正确的做法是通过参数来传递给函数。也就是说,函数的参数除了用于表示可变数据、增强函数的通用性之外,还应作为外界向函数传递数据(即使是一个固定不变的数据)的唯一渠道。而函数这个特定功能模块与其他模块之间则通过调用等逻辑关系实现。
从上面,我们可以看出,一个大的复杂的现实问题可以分解成多个小的简单的具体的功能模块。而每一个小的简单的功能模块就是一个个最小可工作案例或由多个最小可工作案例组成的功能模块。
2 什么是最小可工作案例(Minimal working examples)
在编程中,最小可工作案例(简写为MWE)是包含了源代码程序及其他数据文件的能满足特定功能的最小集合。这个集合还可以演示或重现特定问题。最小可工作案例的重要特点是能够解决特定具体问题,却又没有多余信息使其结构和内容足够简单,从而使当事人可以轻松掌握其内容并解决问题。
From wikipedia: In computing, a minimal working example (abbreviated MWE) is a collection of source code and other data files which allow a bug or problem to be demonstrated and reproduced. The important feature of a minimal working example is that it is as small and as simple as possible, such that it is just sufficient to demonstrate the problem, but without any additional complexity or dependencies which will make resolution harder. A minimal working example may also be referred to as minimal reproducible example or short self-contained correct example.
以写一篇文章为例。如果不对其进行模块化分解,写文章就会成为一个要写图文并茂的数千字的逻辑清楚的这样的大问题,而导致难以执行,从而造成拖延,甚至放弃。但如果对写文章进行模块化分解后,我们就可以将写文章大体分解成构思-写作-完善(美化或查缺补漏)三个大的步骤。
构思部分主要包括确定主题(what,写大标题和摘要)、确定文章逻辑(why)、确定文章结构(how,写提纲)等部分。
写作部分则包括写章节小标题(确定写作架构中的意群组成及其逻辑)、写每个章节里的主题句和完成每个主题句下的段落。
完善部分是在通读全文后,修改错别字和错误句子,修改不清楚的地方或增加注释使文章内容清楚或自成独立完整的有用文章,增加与章节内容相同的或起支撑作用图表以利于读者更快更轻松地把握主题。
如此,写一篇数千字的文章便变成了由多个只需要约10分钟就可以完成的多个小的写作模块组成的了,从而将原本复杂的问题变成了每一个阶段都容易完成的小模块了。同时,由于流程清晰,因此,如果哪里没做,哪个地方出了问题,都会很容易查找和修补。
3 我对模块化思想和最小可工作案例思想的理解和应用
过去我做事没有章法,总是试图一次性就把事情做好。结果或者因为一口气吞下整个问题,困难太大,吓的我总是拖延,最后匆忙应付或不了了之,或者因为困难远大于最初构想,而以失败告终。
而当我掌握了模块化思想和最小可工作案例思想后,我再不是试图一口气吞下整个问题,而是先快速概览或分析整个问题,了解其全貌和结构,之后按照其结构模块,找出每个模块中的最小可工作案例,之后按照整个问题的结构地图,一个一个地解决最小可工作案例。由于每次都可以解决至少一个具体的完整(小)问题,因此,很有成就感。同时由于已经掌握了全局的结构,因此,虽然解决的问题小,却可以不慌不忙,心中有数地解决当下的小问题。通过这种解决每个具体问题的成就感和根据“结构地图”产生的确定感,我将原本的恐惧和焦虑变成了可以量化可以专注当下享受当下的工作量(或时间)的积累,从而非常容易执行,成功率大大上升。
比如软件学习。过去我是总是采用平推的方法学习软件,以为自己读完全部文档资料后就能掌握这个软件。但结果由于全部文档资料在我眼中是没有区别的,是一体的,特别是由于不知道其各部分间的联系,所以读起来艰涩异常,索然无味。现在的我,则会从最简单的实例(tutorial)开始。先按照实例说明,完成一个最简单的例子,掌握这个软件的主要功能和步骤。在掌握主要功能地图后,按照逻辑和主次顺序,再具体到一个功能模块中学习其中一个个的小的功能。如此,按照重要性一个个地学习和掌握每个模块。最后,再按照自己的理解重新做一遍实例。这样的学习过程,让我每一步都充满成就感和确定感,从而让学习成了一种享受,从而容易执行。
4 小结
基于模块化思想和最小可工作案例思想,可以将原本复杂的无从下手的大问题最终都可以分解成一个个具体的容易解决和执行的特定的具体的小问题(最小可工作案例),从而将不可解决的问题变成多个容易解决的小问题。最小可工作案例内容和结构足够简单,使当事人解决问题的难度或试错的成本最低,因此,可以快速地尝试不同的方法以研究和解决问题。最小可工作案例,虽然小却可以可靠解决特定问题,同时由于其内容和结构足够简单易懂。因此,对于解决我们生活和社会中遇到的问题非常有效和方便使用。