Make还是buy?这是个问题
在工程与应用性质的大公司中做算法开发其实是颇为尴尬的。虽然美其名曰“开发”,但做的大都是集成 与测试 工作——即,用“胶水”语言(如Python、Matlab等)将不同的库与功能模块串接起来——通常都是闭源的商业软件,从而难以深入其中学习与研究——必要时再加上一个简单粗糙的界面,采集点数据再做些简单的分析,完成项目需求便可。总的来说,都是非常肤浅与皮毛的。
比这个工作再高级一点的,就是能够直接为公司已有的底层算法与软件框架贡献代码,然而也多是些局部的修补与改进。不过对于外企来说,即便是这样的工作,也很难轮到其在中国设立的研究中心。这是由于,一方面外国人不愿将核心技术暴露太多;另一方面, 国内的项目经理与对其考核的上级毫无耐心去等待底层开发的开花结果。他们宁可放弃一件事情不做,也不愿意为持续积累、打磨精品买单。总之,虽然大公司对外宣扬的是创新、革新,但已成型的一整套观念与考核机制,使其在面对make还是buy的问题上总是毫无例外地选择后者。
对于个人需要持续学习与积累的技术上,也面临类似make还是buy的问题。当然,限于个人有限的资金,这里的buy更多的是指直接使用已有的开源代码库和框架,比如Github上的丰富资源。具体说来,二者其实各有利弊。
完全自己做则需要大量的时间开发,难以立刻形成生产力。而且在初期阶段,代码无法做到非常优化。然而,自己做的好处也是显而易见的,那就是通过大量底层开发的实践,从根本上提升自身的理论与技术水平,训练逻辑思维和抽象能力,并得到设计(相对来说)大规模算法流程与软件架构的宝贵机会。同时,这也是一个不断打磨与精雕细琢的迭代过程。随着持续积累的知识与代码越来越多,在采用的编程语言具有强大的表达与抽象能力以及设计架构合理甚至是优美的前提下,后期的开发效率会越来越高,乃至产生以一顶百的效果。
若基于已有的代码库尤其是大规模的框架做开发,做一些简单的应用与概念验证还是很方便的,跟着教程走一遍就可以快速上手,而且这也是一个模仿他人良好的设计思想与编码风格的学习机会。然而,若想对其底层功能进行修改,甚至是添加新的模块,则需要阅读手册、学习API、写测试代码,绝非轻而易举的事。而且,毕竟原始代码不是我们自己写的,其中的文档与注释也未见得详尽、准确,学习与摸索的过程中必然免不了对代码逻辑与机理的猜想和推测。而为了验证这些理解,还要自行设计理论模型与算例。同时,也有可能因为根本看不懂某些技术环节,而无助地卡在那里,停滞不前。还有一种非常危险的情况是,一旦他人在算法和代码中犯下了任何或大或小、有心或无意的错误,就会形成耗费时间的无底洞。这更会沉重地打击我们的信心和积极性,甚至对个人能力产生怀疑。
总之,make还是buy,这个问题对于身处大公司的开发者来说,很容易被迫地选择后者,以至于除了为公司的短期利益碌碌外,难以获得自身技术实力的提升。对于个人学习与研究来说,则需要将两种开发方式有效结合起来,在实力提升与开发效率之间做好平衡。首先充分、细致、较为全面地了解已有软件包的各个功能模块。其次,以之为基础大胆设想、谨慎实践,编写自己的扩展算法。既不能仅仅成为已有软件包的简单使用者或者集成者,也不要妄自尊大,什么都自己做,不相信他人的成果。