开发软件——尤其是嵌入式软件,是人类最复杂且最耗成本的活动之一。因此,许多团队希望尽量藉由重复使用软件(包括免费的开源软件)来降低复杂度和成本。根据《2019年嵌入式市场调查》(2019 Embedded Market Survey)发现,24%的受访者重复使用了开放来源(open-source)程序代码。乍看之下,采用开源软件似乎是个不错的办法,但归根究底,开源软件有几个特性可能会使其变得“邪恶”。
首先,每个开源程序代码库都附带一项软件授权。软件授权要求开发人员们如何使用以及什么情况下不能使用该软件。如今,许多开源项目都使用MIT授权,让该软件几乎已能免费用于任何项目,而且完全不附带任何条件。遗憾的是,并不是所有的程序代码库都能如此。尽管有些软件授权可以不受限制地用于个人项目。然而,如果将该程序代码作为商业用途,任何更改或有时甚至是新的相关程序代码也必须开源。如果开发人员或经理人员等稍微不留意,很可能就必须合法地开放其IP。是不是很邪恶?
其次,“免费”的软件难道不违背资本主义存在的核心吗?我们都推崇发明家、企业家以及成长为业界领导厂商和巨擘的公司。但如果说有想为软件付费的想法可能会让工程师笑掉大牙。为什么我们拒绝为商业软件付费,反而依赖于开源软件?我在许多公司中看到的情形是,推广使用免费的开源软件并不是因为它的质量更好、上市时间更短或客户体验更佳。据我所见,最大的推动力量似乎是企业对利润最大化的贪婪。当公司不愿意支付、捐赠或作出贡献时,为什么却指望每个人都为其软件付出高昂的代价?这不是很邪恶吗?
最后,开源软件通常功能强大,但不一定十分稳健可靠或经过全面测试,甚至不一定适合每一位开发人员想要的使用方式。例如,业界最喜欢的开源工具库是FatFS。FatFS提供了一个由许多微控制器(MCU)供货商整合的易用文件系统,因而可说是让开发人员拥有一个开箱即用的文件系统。然而,选择FatFS却让我觉得痛苦,因为它虽然在功能上非常完善也很有用。但是,如果您开始深入了解,就会发现许多潜在的质量问题。
图 1:基本 FatFS程序代码分布函数的McCabe循环复杂度范围计数。
例如,如果您分析FatFS的函数复杂度(Cyclomatic Complexity),您会发现函数的复杂度分布如图1所示。整体而言,大多数函数都比较简单,如果进行任何更改后出现bug 或注入bug的可能性较低。但是,它有17个函数的复杂度大于10,其中有5个函数的复杂度甚至大于20!你认为那些是什么功能?开发人员最常使用的那些如表1所示。是不是很邪恶?
表1:循环复杂度为20或更高的FatFS函数。
那么,开源软件真的邪恶吗?我可能会争辩说不;但是,我想提醒想要冲往GitHub以及尽量利用每一个已知开源软件的团队,请先暂停脚步想一想再小心谨慎地继续前进。因为你永远不知道最终会得到什么,你或你的客户最终也可能会变得更糟。至少请预先安排时间来分析您的开源软件并对其进行测试,以确保它能满足您的需求。只是因为有人免费提供给您并不表示它能够满足您的要求。
您认为呢?开源软件邪恶吗?
(参考原文:Is open-source software evil?,by Jacob Beningo;编译:Susan Hong)