美文网首页
模型思维基础 —— 以软件开发元模型为例

模型思维基础 —— 以软件开发元模型为例

作者: 子回 | 来源:发表于2015-06-24 23:33 被阅读269次

    不知道你有没有想过,公共澡堂里面淋浴头之间的距离是如何被决定的?现在我们假设自己是承包澡堂项目的工程团队,尝试用最简单的方式来确定这个数值。

    最直观的想法是:假设将直立的人内嵌在一个圆柱体里面,可以得到这个圆柱体的半径d。我们通过调查,获得一部分人的d值,取其平均值,设为Avg(d)。那么,Avg(d)加上一个特定距离就可以是淋浴头之间的距离。这里我们先假设这个特定距离是1米。

    于是我们得出一个很简单的模型

    淋浴头之间的间距 = Avg(d) + 1
    

    这里我们利用模型对一个问题做出了决策。先不评价它的好坏,它确实针对这个问题给出了解决方案。

    生活中利用模型解决问题的例子无处不在。单纯从工程上来说,所有问题都是要用模型来解决的。

    对于模型的定义有很多,我在这里给出我的一家之言。模型是过往经验的集合,用于帮助针对当下问题做出决策。举个大家都比较熟悉的例子,统计学里面的线性回归就是根据很多收集到的过往的数据点建模,得出参数x和值y的线性关系。通过建立出来的模型,可以评价、选择参数x

    模型的正确性

    天底下没有正确的模型,所有的模型都是错的。模型只有好与坏的区别。因为过往经验的产生(例如数据)是伴随着各种各样不同的因素产生的,其中包括内在因素和外在因素两种。而在几乎所有情况下,我们是无法严格证明所有因素已经被我们所考虑了的。

    例如,在刚才的淋浴头模型里面,我们是否考虑到了:

    • 人在洗澡这个特定环境下时,周围人与他的距离多远才算舒适?
    • 性别对这些数值是否有影响?
    • 年龄呢?

    就算这些都被考虑了,被根据数据统计出来了的,我们还是无法严格证明我们穷举了所有的因素。另外,我们还面临着

    • 精度丢失问题
    • 样本不足问题
    • 数据真实性问题
    • ……

    所以,我们是找不到正确的模型的,只能找到更好的模型。例如,考虑了性别的情况下,得出的淋浴头之间距离的模型应该会比我们最初得出来的模型好。因为它考虑了更多的因素。

    自底向上的模型构建方式

    刚才提到,模型是过往经验的集合。将过往经验看成点,以某种形式连接在一起,就形成了一个模型。

    你应该注意到了,我提到的是以某种形式连接在一起。所以,对于同样的经验集合,我们有很多种连线的方式。即,对于同一个经验集合,我们可以有很多种建模方式。

    一个模型也可以由多个已有模型建立起来。这时候,已有模型也可以看成是点,连接在一起之后,就形成了新的模型。例如,加减乘除可以看做是四个二元运算的模型,那么根据他们我们可以构建二元运算模型。

    a + b, a - b, a * b, a / b 得出 a ? b
    

    这是一种自底向上构建模型的方式。

    自底向上构建模型的方式就是学习的方式,也可以论证为什么基础知识不扎实是无法理解高级知识的。

    拿软件行业做例子。在软件行业里,有一种职称叫做架构师。架构师可能不做实际的编码工作,而是做系统宏观的设计。有些学生就会说,“不就是画图么,我也会”!这是不正确的。

    优秀的架构师都是从基础编码做起的。他们需要有计算机专业的专业基础知识,如计算机体系结构知识、计算机网络体系结构知识、算法基本知识等。这些知识实际上就是我们所说的那些点。他们从最底层做起,一步步地向上建立模型,才能够有能力对一个大规模系统进行建模。可以说,他们的能力提升,就是一个不断建模的过程。

    水平模型建立方式

    对于一个现有模型A,我们可以根据它做修改,产生一个相似的兄弟模型B。

    例如,除法二元运算模型的形态是被除数 / 除数 = 商 ... 余数,那么我们稍加修改就可以得出取模运算模型被除数 % 除数 = 余数,同样也是个二元运算模型。

    水平模型建立方式可以说是很多互联网产品的思路。它们先根据自己的理解找到竞品的模型(先不论它是不是找了差劲的模型),然后分析出该模型的问题,对其进行微调加以改进。

    例如,微信最初可以说就是由WhatsApp的模型修改而来的。虽然到现在他们已经完全不一样了。

    自顶向下的模型建立方式

    对于一个现有模型A,我们可以根据它做细化,产生一个新的子模型B。这时候我们称模型A是模型B的元模型(Meta Model)。与兄弟模型之间的关系不同,元模型可以描述子模型。

    对于熟悉面向对象程序设计的人来说,我需要提醒一下,这里面存在的不是继承关系。继承关系的场景下,子类包含父类。但是在元模型产生的子模型并不能包含元模型,而是元模型的一部分。因此,我们可以说,是元模型细分出了子模型。

    例如,二元运算模型a?b也可以细分出取模运算模型a%b。然而,这次我们得出取模运算模型的方式和之前的方式是完全不同的。

    例子:软件开发元模型

    软件开发流程有许多的模型。例如,瀑布流模型、增量模型、迭代模型、螺旋模型等。

    这些模型有一个共同的元模型,它非常的简单:将普通人类的理解完全正确地翻译为机器的理解

    软件开发元模型:将普通人类的理解完全正确地翻译为机器的理解软件开发元模型:将普通人类的理解完全正确地翻译为机器的理解

    你会发现,瀑布流模型、增量模型之类的模型,都是可以被这个模型所描述的。

    同样,敏捷开发的12项原则也是可以被这个模型所描述的,因为它们都是为这个模型服务的。

    创新的本质:创造模型

    我对创新的描述就是创造新的模型。

    对于采用自底向上法得出的模型,我们可以说是基于大量数据总结得出的创新。大数据是个最好的例子,无数企业在大数据帮助下取得的成功印证了这一点。

    对于采用水平模型建立方式得出的模型,大多“性能”都不太好。因为你可能找错了原有模型存在的问题,并且你的改进可能也不高明。

    对于采用自顶向下法得出的模型,在我看来就是聪明人才能做得出的事情。Facebook就是这样一家在技术上擅长使用自顶向下法来创新的公司。他们所创造出的技术产品遵循着其"Move fast and break things"的原则,总是能创造出截然不同的模型。

    例如,Facebook的React.js这个产品,打破了一个最传统的软件设计理念 —— Separation of concerns(我不知道怎么翻译比较好)。看似是打破现有模型,但是实际上这个突破来自于同一个元模型 —— 模块化设计原则。当然了,每个人的理解角度可以是不一样的,关于这点,我们可以多多讨论。

    总结:从今天开始利用模型思维

    我曾经在Coursera上面完成过Model Thinking这门课,这门课对我的影响可以说超过任何一门学校里面教授的课程。如果大家有兴趣,可以去学习这门课。

    模型可以让人更好地理解、阐述这个世界。模型让你有能力同时快速地掌握多类事物的运作规则,融会贯通之,也由此能产生创新。

    你会发现,那些处于最高层的模型,其实就是哲学。

    相关文章

      网友评论

          本文标题:模型思维基础 —— 以软件开发元模型为例

          本文链接:https://www.haomeiwen.com/subject/koceqttx.html