重复造轮子有何尝不可?

在软件行业,或者说在程序员这个族群中,流行着这样一句话:不要重复造轮子。相对好的意思是应该尽可能用现有的实现来解决问题,而不太好的意思就是你太笨了,有现成的还要重写,醒醒吧?然而,纵观整个开源社区,几乎每段时间总会有各种各样的轮子被重复的造出来,不管是DI容器也好,还是MVC框架也罢。虽说随着语言的发展,有些新的轮子确实比旧的轮子优秀,然而大部分轮子都很快的销声匿迹了。当作为一个旁观者看到这样一番景象时,“重复造轮子是不好的”这个概念就会在你的大脑中被慢慢的强化,于是渐渐的,你就变成一个轮子的搜寻者,而放弃了作为一个轮子的创造者的机会。

放弃作为轮子创造者的机会?这是什么大不了的事情吗?也许是,也许不是。如果你真的不关心这个轮子,甘愿成为轮子的附庸,那么它确实不是什么大不了的事。然而,如果你愿意仔细的观察轮子,甚至拆开轮子看看里面的内容,那么也许你会惊喜的发现一个轮子设计者的世界,一个不同于程序员的世界(好吧,设计者也是程序员,有点混淆视听的嫌疑)。

在程序员的世界,可以这样说:我们的每一行代码都是设计。这个设计包括两个最基本的特性:正确性和可维护性。就拿我自己来说,写代码的过程其实是人格分裂的过程,第一种人格要求要把自己想象为一个功能的设计者和实现者,第二种人格需要把自己想象成为这段代码的阅读者和维护者。对第一种人格的驾驭是相对简单的,只要功能实现,通过测试,运行正确就算完成了。然而,第二种人格却要求更高的代码质量,更明晰的代码结构和更好的扩展性。想要成为一名合格的程序员,对这两种人的驾驭是必须修炼的课程。

而在轮子设计者的世界,又至少多了一种人格:轮子的使用者。当你有幸成为轮子的设计者并转换到这种人格时,应该考虑什么问题呢?-- 就是为什么要用你的而不用别人的,你的轮子要表达的是什么。更确切的说是你的轮子应该具有怎样的态度,即想要传达的设计理念以及你的坚持和取舍。这就要求你需要考虑:设计应该是大而全还是小而精?是Based On Configuration还是Convention over Configuration?是明确的告诉使用者Please stop, you are doing wrong!!还是OK, I can handle it for you,等等。当前,很多成熟的框架或者语言,它们都有自己相对明确的态度,比如,Spring就是为了解决J2EE的问题而生的,所以它不仅仅是一个IoC的容器,不仅仅是一个MVC的框架,它需要覆盖J2EE的各个方面;而Guice,就是要成为一个轻量级的DI容器,抛弃烦人的XML文件,转而采用了代码即配置的方式;再如Go语言,它是在语言界难得的愿意去做减法的语言(对比Java语言的发展以及又裹了一层语法糖的Java8…)。所以,即使你是完完全全的重复造一个轮子,那么沿途的风景也是十分诱人的,想象一下在你大脑中三种人格的不停切换以及无休止的争吵是不是会让你兴奋?

最后,来看看伟大的数学家和哲学家笛卡尔是如何看待造轮子这件事的。笛卡尔在他未能完成的遗作《思维指导法则》(Rules for the Direction of the Mind)写到:“年轻时,每当我听到一些精妙的发明,我就尝试自己来发明它们,甚至是在没有读过那个作者的文章的情况下。在这样做的过程中,我逐渐发现我自己正在使用某些法则。”。程序员们,选择一个你们喜欢的轮子,重复造它一次吧!

Written on May 19, 2013