Simple Made Easy
https://www.infoq.com/presentations/Simple-Made-Easy
这个talk的确不错,尤其是清晰地区分了Simple和Easy. Simple != Easy, Easy并不意味着Simple,但是Simple的东西却可以变得Easy.
Rich Hickey是Clojure的作者,这也让我非常好奇,他在talk里面的ideas是如何体现在Clojure这门语言上的。
有兴趣的话可以看看 slides, 强烈推荐结合infoq.com上面的talk一起观看,不然可能不知道作者的思路。
给simple, easy, complex下定义。
simple通常意味着单一责任/任务/实体,没有和其他东西纠缠在一起。
而easy则是离我们非常近的东西,比如离我们的认知很近(我们很熟悉它),或者是离我们手头很近(我们可以很容易就使用它)。easy是相对的,作者那小提琴和德语来打比方,小提琴和德语对某些人来说很容易,但是对于不懂音乐或者是不会说德语的人来说,则不那么容易。
complex则是从complect发展过来的,complect的意思是缠绕。所以复杂本身就来自于将很多东西缠绕在一起,这是我们在一开始就要避免的。想象Fig1和Fig6是两份功能完全一样的代码,那么Fig1则简单,Fig6则复杂。
如果忽视Simple和Easy之间的区别会有什么问题呢?下图则说明了这个问题
Easy的东西初期开发会非常快,但是超过一定时间,因为系统复杂度不断地提升,开发速度就会下降,你需要花费更多的时间在考虑这些纠缠/复杂性上。
可是Simple的东西虽然初期不是很快,但是因为可以有效地控制复杂性,优势在后期则开始显现。
当然对于简单的项目来说,还是easy比较好点(这里说的easy就是对你来说,你熟悉的语言。可能并不是真正适合这个项目,但是你非常熟悉)
大多数情况下,easy的标准如下
- 容易安装使用
- 容易尝试学习
- 对于你来说非常熟悉(知识领域以及心智层面)
作者用下面这句话,批评了当下浮躁的软件开发风气
这句话原本是说Lisp代码可读性非常好(可以很容易地知道计算值),但是花费计算成本高。作者在talk里面是这样解释这句话的:现在软件开发者,总是看到某个软件的好处,觉得对自己来说非常easy, 但是却没有想过这个软件的复杂程度如何,使用它潜在成本有多少。
在系统设计中有哪些东西是complex, 哪些是simple的呢?
为什么这些complex东西为什么complex(将什么纠缠在一起了)?, 而simple的东西为什么simple呢(如何可以通过单一的东西表达出来)?
如何为simplicity做抽象?作者从6个w分别给出了几个建议。6个w是(who, what, when, where, why, how). 在ppt里面有好几页就不截图了。