工程师的两难困境

科学家与科学方法

科学家是一个泛称,广义上指使用系统化的活动来发现新知识的人。


这种系统化的活动,通常被称之为科学方法,它涉及以下几个步骤:

(1)细致的观察真实世界的特点,通常还要有精确的测量

(2)根据观察结果提出假设模型

(3)根据模型预测未来的事件

(4)继续观察并核实预测的准确性

(5)如此反复直到确认预测和观察一致


科学方法中一条关键的原则就是,实验必须是可重现的,否则别人无法自行验证,

此外,所有的假设也必须是可证伪的,否则我们就无法排除哪些假设是错误的。


爱因斯坦说:

“再多的实验也不一定能够证明我是对的,但只需要一个实验就能证明我是错的。”

因此,科学理论只是暂时性的假设,我们只能验证它与当前观测的一致性。


工程师不是科学家

工程师,是指那些在工程专业领域的人,

他们使用科学知识来驾驭技术以解决实际问题,并以此为职业。


工程师和科学家往往容易混淆,

科学家努力探索大自然,以便发现一般性法则(general principles),

工程师则遵照此既定原则,从而在数学和科学上,解决了一些技术问题。


科学家探索世界以发现普遍法则,但工程师使用普遍法则以设计实际物品。


科学家研究东西,工程师建立东西,

Scientists ask why, engineers ask why not?


工程师追求多样性

科学家喜欢把不同的东西统一看待,工程师则更喜欢构建多样化的产品


普适性与多样性,各有所长,拥有不同的喜好完全和人们的目的紧密相关。


越普遍规律性就越强,容易分析且应用面会更广,科学研究的价值就更大,

越具体的事物,使用起来就越方便,应用成本降低,产品的价值更大。


软件必须是适用的

工程师应该着眼于具体的场景和外界约束,构建出完全适用的定制化产品,

现实世界千变万化,因此,保持多样性是不得已的选择。


当我们提供的产品不能解决用户问题时,

并不是定制化方法出了问题,因为普适的产品是不存在的。

我们应该调整产品的适用范围,对用户需求重新调研。


一个合格的软件,可以不是通用的,但至少应该是适用的。


代码的通用性如何保证

编写软件是一件复杂的事情,因为必须同时考虑通用性与适用性。


软件工程师的一个任务是,通过程序来避免重复劳动

因此,程序必须具有一定通用性。


软件工程师的另一个任务是,在具体的场景中,解决用户多方面的需求

因此,程序必须具有一定的适用性。


所以,对于程序本身而言,它既应该是通用的,还应该是适用的。

软件工程师们不得不左右权衡。


一个好的策略是,不要一开始就建立抽象,也不要一开始就期望软件具有通用性,

而是先定制化的解决多个场景中遇到的问题,并让解决方案足够具体,

最后,在保持方案多样性的同时,考虑代码的通用性


重造轮子的真实含义

在软件开发或其他工程领域,

重造轮子是指重新发明一个已有的事物,或是重新创造一个早已被优化过的基本方法。


“重造轮子”一词的由来,是因为轮子自从被发明后,

在使用上没有太大的缺陷,足以应付多数需求,

原则上后人只需要直接应用即可,重新再发明一次轮子不但没有意义,

浪费时间,还会分散研究者的资源,使其无法投入更有意义及价值的目标。


在软件行业中,重造轮子的情况很常见,大量相似的事物俯拾即是,

这是一个不好的现象。

然而,一个更不好的现象是,人们担心可能会重造轮子,而不去创造。

不能解决问题的产品到处都是,适用的产品却几乎没有。


所以,重造轮子有了两重含义,

重复发明一个已有的事物,且不能解决现有的问题


无疑,能不能解决问题才是人们最关心的。


总是努力改进不够好的地方

用户需求未必是全新的,它往往体现在现存方案中不够好的地方,

事实上,寻求软件解决方案的用户,在之前也有一套非软件的解决方案。

因此,软件工程师的任务总是在改进而不是在发明,这才是编程的良好驱动力。


发现问题是最难的,

我们可能发现了一个事实上不存在的问题,

也可能发现了一个没有价值的问题,

更有可能发现了一个已经被充分解决的问题。


找到问题之后,选择解决方案也是困难的,

是使用一个通用方案,进行具体化的应用编码,

还是重新构建一个定制化的专有方案,

都是值得商榷的。


结语

编写软件需要考虑的事情很多,

而且十分不幸,它们都是难以衡量的。


深思熟虑,可能会避免灾难发生,但是从结果来看,人们未必知道,

善战无功,善医无名,

坚持做正确的事情,才是真英雄。


参考

维基百科 - 科学家

维基百科 - 工程师

维基百科 - 重造轮子