论工具

中学的历史课本上曾经讲过,

学会制作工具,是人类进步的标志。


我深以为然。

可是现实生活中,存在着对工具很多的误解


有的人,认为制作工具浪费时间和精力,做了不必要的事情,

有的人,认为既然有现成的工具可用,为什么还要自己造轮子。

有的人,认为应该专门区分开制作工具的人和使用工具的人。


这些看法,在各自的角度来讲,都说的通,

可以没有对工具有个全面的认识。


下面,我们仔细分析一下,

看能不能从更高的角度来看待它,

做好工具,用好工具。


工具就是解决方案

无论是日常生活中,还是在软件开发中,

我们经常有直接解决问题的场景,

貌似并没有使用工具。


这就给了人们一种假象

那种特意找来的才叫工具,

用了别人的东西,才叫用了工具。


其实不然。

一个解决方案,实际上就是一个具体的工具了,

只不过它只能用来解决那个问题罢了。


好的解决方案,就好比适用的工具,

用最直接的办法解决了问题,

不拖泥带水,不带来附加的问题。


不得已而造轮子

着手实施的过程,

实际上就是将目前的项目问题还原成历史上已经解决过问题的过程。


这个阶段,我们在进行问题求解。

为了尽可能的少耗费精力,我们总会优先选择已经成型的工具,

在软件开发中,相当于找到各种类库,框架来用。


可是,市面上广为流传的那些通用工具,

并不一定非常切题,我们必须做出调整,甚至废弃一部分功能,

这个时候,就有点造轮子的萌芽了。


随着业务的发展,业务模型逐渐清晰起来了,

没有趁手的工具,也无法跟得上业务的发展需要了,

只能从基础开始,借用各种工具的设计思想,让工具和业务共同发展。


此之所谓,重新造轮子。


这样不好吗?

在项目初期,诚然不太合适,

但是,全程中我们的目的都是为了找到合适的工具解决问题呀,

并没有偏离主题,并没有为了造而造。


这也是不得已而为之的事情。


工具的创造者和使用者

在大多数人眼中,

工具都是一些人造出来,给另外一些不同的人来使用的,

这里就又有误区了。


其实不必强制如此,

一个能工巧匠,必然有自己的一套工具箱,

这些工具箱中都是他趁手的工具。


这些工具,全是跟别人一样的吗?

未必啊。

有雷同的,有调整过的,更有自创的。


工具完全可以自己造给自己用,是为了给自己的工作助力

在软件行业,这有一个名词叫『dog fooding』,

很多软件公司都深谙此道。


比如,Visual Studio本来只是Microsoft内部使用的一个编辑器,

随着不断完善,它完全可以作为一个产品来卖了,

那么就可以拿出来了,面向普通大众开放了。


再比如,Facebook很多项目都主张尽量开源,

首先解决本公司自己的问题,

再通过解决社区的问题逐渐完善,同时也降低了维护成本。


此外,如果不事先限定工具的未来使用者的话,

还会促进人们对工具进行更好的设计。


另一方面,有些人喜欢写工具给别人用,

但是,眼高手低,只是解决一些假想的问题,过于理想主义。


不能解决问题的工具,还不如没有,

它会造成解决方案的混乱,加大原始问题的难度。


因此,工具的创造者和使用者,必须紧密合作。

工具才能发挥它最大的作用。


业务逻辑并不啰嗦

有些人不喜欢写业务逻辑,说是因为它繁琐。

我觉得这是对编程认识的偏见


因为编程就是用代码解决问题的,

业务逻辑繁琐,本身就是一个问题。


我们完全可以写一个业务逻辑的管理器,

把这些复杂业务逻辑分离开,然后用这个管理器统筹规划,

非常干净清爽了,不是吗?


因此,这种情况下,代码要做的事情不是关键,

关键在于,怎样写,用什么样的策略来写,

没有注定繁琐的代码,只有不合理的繁琐表述。


工具还可以用来制造工具

只要存在问题,我们就可以想到借助工具来解决它,

那么假设这里有好多人需要斧子这种工具,

就要造出那么多斧子来吗,好累啊。


其实,这引出了另外一个问题,

那就是如何制造多个斧子的问题。


我们可以造一个机器,它用来生产斧子,

这个机器,就是用来制造工具的工具

而制作这个机器所用的道具,同样也是工具。


原来,世界这么奇妙,

工具可以组合,还可以互相影响。


学会别人的设计思想

当我们定位问题后,怎样将适用工具制造出来呢?

现存的解决方案是怎样想出来的呢?


这就得求助历史了,求助于同行们前辈们的经验教训。


我们要先找到类似的工具,

看它是如何解决问题的,用了什么办法,它的作者是怎么想的。


学会了这些,抓住思考问题的方式,

我们就能随机应变,灵活处理,做出趁手适用的工具来。


其他工具中任何有用的部分,都可以借来,只要能达到目的。

即,目的明确后,方法可以灵活多变。


结语

过分的依赖工具和过度的排斥工具,都是盲目的。

做到正视一个事物,是非常困难的。


jQuery的作者在《Secrets of the JavaScript Ninja》中所言,

很多人都被教导说,不要使用eval,这是不对的,

相反,我们应该学会它,从而才有能力善用它。


对于其他事物也是如此啊,

全盘接受和全盘否定,都会丢掉半壁江山,

我们要深入理解,目的是把它用到可以用的地方,发挥它的作用。


不理解它,怎么做到在需要的时候使用呢?


君子生非异也,善假于物也。

——荀子《劝学》