工具与方法的选择——从使用GNU/Linux谈起
记得2003年的时候,我有幸读到王垠同学写的那篇著名文章《完全用GNU/Linux工作》。一时间觉得醍醐灌顶、热血沸腾,我便毫不犹疑地投身到了Linux阵营。在整个博士研究期间,我也真就完全用Linux工作了。虽然经历了不少诸如显卡无法驱动、中文乱码、系统无法引导等等麻烦与纠结,但我个人对计算机工作原理的认知水平却因此而不断深入,相关编程技术的掌握也愈加娴熟,从而大大提高了工作效率、减少了大量枯燥乏味的重复操作。而这些经验与技能在方便易用的Windows生态环境下是难以获得的。相比之下,大多数守着Windows系统的用户,由于长期“养尊处优”,以至于丧失了大量接触底层技术的学习与训练机会。因为其没有掌握更为优秀的设计思想和性能更加出色的开发工具,从而永远成为Windows系统及其软件的奴隶,更没有可能开发出更为卓越的产品。
上述情况的背后其实蕴含着这样一个深刻的道理:设计和实现一个产品需要拥有比这个产品所提供的全部功能在机制上更为底层、性能上更加优异、接口开放度更好的工具和方法作为支撑。也就是说,开发产品所需的工具和方法是产品自身功能的超集。
大家可以想想自己手里使用的iPhone、iPad,在上面开发APP所需的技术无论从设计理念,还是所用编程语言的抽象与表现能力,抑或代码的实现质量,肯定没有开发iOS系统自身的要求严苛。对于苹果公司来说,这当然是天大的好事:一方面可以用便捷轻松的开发环境惯着、宠着大量的开发者,使他们为苹果商店源源不断地提供丰富有趣的应用;同时,又可以令其“死于安乐”:因缺乏足够的锻炼与实践机会,便难以和苹果自己的设计师和编码者竞争,从而大大降低了出现能够成为苹果公司有力竞争者的概率。若从数值仿真行业举例也是一样的:很难想象一个熟练使用商业仿真软件(如ANSYS、Hyperworks)且能成功解决实际问题的人,能够拥有比ANSYS自己的算法科学家更为深厚的有限元理论功底,更先进的软件框架设计理念,以及程序编写的技巧。而这就是maker和user所处层次不同的缘故。
那么对于广大从事且热爱技术开发工作的朋友,又该如何选择工具和方法,从而有效提高自身的理论水平和技术能力呢?尤其是在当今迫切需要大量具有工匠精神的科学家和工程师的时代,我们又该在什么样的工具和方法的助推下不断逼近这一至善之地呢?
这里,我总结出如下三个基本思想以供参考:
- 工具与方法应当足够简洁,但是通过其自身的大量重复、组合、应用,可以实现整体上的结构与协调之美。 这就像是自然界中的雏菊,组成它的每一个花瓣都是纯色的,形状是极为简单的几何图形。但是大量简单的花瓣团簇在一起,构成了令人赞叹的精美与和谐。与此类似地,计算机中的每一个逻辑单元毫无感情,过于简单以至于超级乏味。可计算机之所以能够胜任各种复杂的工作,乃至通过声音、图像、虚拟现实等媒介形式的生动呈现成为人性连接与沟通的纽带,正是因为上亿个逻辑单元被组织为复杂结构并协同作用的结果。 另一方面,工具和方法必须足够简洁才能保证组织与重构后的复杂系统拥有良好的效率。举例来说,像MATLAB这种所谓的“高级”语言,其不具备足够的描述现实问题的抽象能力,自身的实现亦是庞大、臃肿、效率低下。因此,若用它构造复杂软件,便难以形成“雏菊”般的精巧与优雅。其应用也就仅适合科学想法的初期验证。
- 工具与方法要具有强大的抽象能力,将孤立的具体问题的解决变成一大类问题的解决。该原则不仅是效率的保证,也是确保人工智能无法超越人类的必要条件——人类理性的力量则在此显现。 数学理论便是高度抽象能力的典范。从距离概念的抽象,不同“空间”的界定,再到集合及其上代数结构的构建,这都是在用理性定义、分类,睿智且高效地解决大问题。正因为强大与极致的抽象能力、严谨缜密的逻辑、分毫不差的计算与执行,我们才会说数学以其自身思想的卓越完全可以凌驾于所有学科之上。这里推荐诸位学习一下C++泛型编程,其中便充分体现了数学中公理化的思想。
- 对于工具与方法的选择,以较为底层与开放的为优。 使用方便的高级工具无异于自我娇惯,长此以往便失去了“独立生存”的能力。这也像是略有小恙的人一上来就用特效药,虽然解决当下的问题效果立竿见影,但是无疑也让自己产生了“抗药性”。
最后,回顾并总结本文的主要观点如下:
- 开发产品所需的工具和方法是产品自身功能的超集。
- 好的工具与方法应该至少满足两个条件: a) 简洁而高效,能够不失性能地进行大规模重组、协同。 b) 具有高度的抽象能力,变解决孤立的具体问题为解决一类问题。
- 不要只图解决眼前问题而选择限制自身长远发展的高级工具。