昨天公司的软件被报告了一个bug, 我一查, 原来是由添加一个新的功能引起的. 新的功能解决了问题A, 但是在一个很隐秘的地方带来了问题B. 在我解决问题A的时候, 我是完全没有想到竟然会出现问题B, 而且测试也没有测出来. 但是问题B出现之后, 这一切又是如此地显而易见.

于是我手到病除地解决了问题B, 然后软件继续愉快地运行了.

作为一个uzhi青年, 当然不会只停留在这. 于是我想是不是之前的框架设计的不够好呢. 但是我发现, 很多时候, 你为了解决一个问题, 从而引发了另一个问题. 而系统就在不断解决问题的时候, 变得复杂, 甚至是难以维护.

这样做有问题吗? 有没有一个完美的解决方案?

以我现在的理解, 我认为是没有. 完美之所以称为完美, 就是说达不到那种状态, 我们只能去追求完美.

我想到了前几天看到的一篇文章: 人类身体里面的十个设计缺陷 Top 10 Design Flaws in the Human Body

它副标题是这样的: “From our knees to our eyeballs, our bodies are full of hack solutions.” 里面提到了各种由于进化的原因, 人体自然产生的为了适应环境或生存而不得不产生的_有缺陷_的设计以及各种专家提出的解决方案. 文章很有意思, 解决方案更有意思. 比如说为了让脊椎更强更不容易受损疼痛, 专家建议我们可以借鉴狗的脊椎的设计, 并且回到爬行状态.

文中有句话我印象比较深刻, 大意是, 进化, 不会产生完美, 而只会产生实用的设计.

那么, 实用的设计算不算好的设计? 什么才是好的设计呢?

我认为:

  • 设计, 首先是一个解决方案. 是要解决一个问题的.

  • 而由于问题其实是一直在变的, 设计应该也是一直在变化, 在进化.

  • 好的设计, 就是适应当前需求的优雅简单的解决方案.

最近在学习UX设计, 那么就以UX设计为例子, 好的UX设计, 其实也是cover了这些点的:

  • useful (解决方案)
  • usable (简单)
  • desirable (优雅)
  • findable (简单)
  • accessible (适应)
  • credible (好吧, 这个我是没想出来)
  • valuable (解决了一个问题)

User Experience Honeycomb

那么, 现在问题来了, 怎么才能产生一个好的设计呢?

反观人类身体的进化过程 (我认为人类的身体这么复杂, 能做这么多事情, 当然是一个很好的设计), 你会发现, 一个好的设计, 简化出来是这样来的:

  1. 试错: 通过交配来基因重组或者是基因突变来创新, 然后在环境中试错
  2. 反馈: 被环境选择, 得到反馈, 要么适应这个环境, 要么就是被环境淘汰
  3. 迭代: 重复1-2

其实, 大到物种进化, 小到自我发展, 都可以看成这样一种思路. 平时我们讲的软件工程, UX process里面的快速迭代, 精简创业等, 也是同样的道理.

当然, 这不是说随便创造一个东西出来, 让它去适应然后加各种hack, 各种补丁.
在我们设计的时候, 是要站在前人的基础上, 通过总结和反思, 去创新的.
而且, 一个好的设计, 比如软件的构架, 是可以在一定程度上去应对变化的.
软件工程里面不是有一句话么, 牢记唯一不变的就是变化.

好的设计, 都是进化出来的, 而不是设计出来的.
而进化过程中, 必然会有那种野蛮残酷的淘汰.
就如功夫一样, 什么才是最强最好的功夫?
叶问做了解答: 功夫,两个字,一横一竖,错的倒下,对的站着。
就是这么简单, 粗暴, 野蛮, 有效.

万物, 野蛮生长.