Linux 生态分析
Linux下软件不够用,这个问题大家都明白是一个鸡与蛋的问题。另外一个比较突出的是“软件依赖”问题。
Linux生态的问题
deepin在刚刚完成第一个版本DDE后就曾试图解决这个问题,到目前为止已经不再愿意去试图解决它。
从最开始思考并研究现有解决方式到现在,我们越发认为”软件依赖”这个问题在目前的Linux生态环境下是无法解决的。因为这个完全不是技术问题,而是生态问题。
Linux为何有如此多的发行版? 比较片面的回答是:“Linux不是windows,不同发行版是把自由选择的权利留给用户”。我们不否认这个回答,但任何社会现象一定都是由利益驱动形成的。“自由选择”是果,不是因。
Linux的发展目前由两个群体在推动:
1. 社区的开发者,凭着爱好或理想,为了满足自我精神追求。这个群体是Linux生态规则的奠基人。
2. 商业行为的开发者,由商业利益驱使。这个群体是Linux今日的引擎。
目前Linux绝大部分贡献的背后都是商业公司,然而不论是否是商业行为,大家都遵循社区最初奠定的自由精神。自由精神已经在Linux生态里根深蒂固。
回到“非依赖”问题上,更准确一点来说应该是期望实现以下目标:“用户可以轻松的安装任何一款合法的软件。”
解决“软件依赖”问题的方式目前有两类:
1.拆分组合方式
将需要的组件分门别类,运行时动态组合起来,以满足软件的依赖关系。 类似Mac的bundle机制。Linux下的代表实作为flatpak(xdg-app), snap,这两者其实更侧重解决安全问题。
2.路径欺骗方式
Linux下的代表实作—— nix 。
这两条可以看到的路都已经有人实现了,大大小小的实现方案不下10种,也都已经能将桌面环境跑起来。并且有理论基础,有配套设施。但都没有起到任何效果,没有一个方案真正让普通桌面用户收益。
这也是我不愿意再谈及“软件非依赖”计划的原因,因为我不相信可以在技术上还能提供什么突破性的贡献。
然而“用户可以轻松的安装任何一款合法的软件”这个合理的需求怎么办?
要解决这个问题,我先解释下为何我说这个问题不是技术问题,而是生态问题。
我是07年开始使用Linux的,和大家一样,跟团旅游般,走马观花,将各种Linux走了一圈。 那时网上的很多教程,在涉及安装软件时,还停留在上一个阶段,即—体验非常差的手动处理包依赖。还好我接触Linux比较晚,那时大部分发行版已经全部是包管理器自动处理这一堆事。
过了几年iOS、Andorid开始火起来,普通用户才了解到软件商店的概念。 最初几年我一直都觉得Linux安装软件要比其他系统方便的多。要安装什么软件只需要在命令行下search一下 关键字就能列出“世上所有”相关的软件以及评分(AUR),并且会从最近的镜像源用最优的速度帮你下载下来。完全不用去找软件,下载的时候也不用仔细甄下载链接,安装的时候也不用处处留心。除了软件不够用这个致命缺点,安装体验绝对是完爆其他平台。 但过了快10年Linux的软件生态几乎还是老样子,早已被其他平台甩开了一截,现在不仅是软件不够用这一个缺点了。
Linux软件生态圈
在Linux生态圈里,面向软件这个实体角度来说,分为三类角色:
1. 软件开发者
2. 软件分发者
3. 软件使用者
与其他平台最大的不同在于“软件分发者”。这类角色就是各发行版的维护者,是他们让Linux越来越可用。
一个主流的发行版本大概有3万多个包需要维护,而一个发行版往往有多个版本多个CPU架构,需要维护的包在10万级别。
·软件开发者:让大家都能使用上我写的软件。软件至少要能安装、能运行。而现代软件都是构建在更底层的库之上,这些底层库逐层的封装了硬件、软件资源。底层库是一层一层搭建起来的构成最终应用软件运行的必备软件栈。
而这些软件栈就是由发行版提供的,他们大体相同,然而千差万别,不同发行版很多时候是要给 用户提供不同的软件栈组合。
软件开发者往往只能测试少量几个发行版所对应的软件栈与应用软件的匹配情况。然而用户量可观的发行版少说也有10+个,实际要面对的情况远远大于10+(发行版) * 2+(架构) * 3+(版本) = 60,而且这里每个维度的取值都很小而且没有算上软件发布后出现的那些运行环境。
所以软件开发者几乎无法提供一个可直接交付的软件,只能由软件分发者加工后再交付给用户。这无形中伤害了开发者的利益,现在的用户已经几乎忘记软件开发者这个角色了,因为他们面对的只有“apt-get install”。早些年sf上还能经常看到软件的贡献者链接,但现在发行版做的越来越好了,已经几乎没有机会去看到这些信息了。
·软件分发者:为用户提供更多的可安装包。
这些人面对的问题更加棘手。
软件包可以抽象为一个由(包名、版本)组成的二维向量(为了简化概念这里不考虑架构等实际因素)。 其中包名不会变动,但随时可能会衍射出新的版本(软件开发者这个不确定因素在活动)。
发行版是通过软件仓库来为最终用户提供服务的。软件仓库可以抽象为由N个软件包组成的N(N大概为3万)维向量(软件包1、软件包2、软件包3、软件包N)。
大家可以想象一下3万多个元素一字拉开,而每个元素都会随机的上下窜动的场景。而且为增加一个元素或删除一个元素都可能导致崩溃。
发行版维护者需要不断的测试各种组合带来的影响,而可悲的是,往往没有任何一个组合能解决所有人的问题,每一种组合选择都只能解决一些问题,同时引入一些新的问题。(试想一下针对特定发行版都无法解决的问题,光靠一个新技术能解决吗)
·软件使用者:能使用上需要的软件。
得益于软件开发者的创造以及软件分发者的辛苦工作,现在Linux下的用户安装使用软件并没有太多的困难。相对于前两者他们的遇到的困难似乎微不足道。
虽然不同发行版提供了不同选择,但在安装软件上面,对用户来说这些方式并没有什么本质区别(非技术上),都是在做同样的一件事。这是众多发行版共同对用户造成的伤害。 软件的传播并不方便,因为软件名≠包名,而Linux上只能安装包,而不能直接安装软件。
除了操作系统与软件协作运行导致的环境复杂性这个无法避免的原因外,还有一个非常重要的原因就是 Linux发行版造成的软件环境“分裂”。我们这些人能用上Linux是因为发行版的付出,然而这种因为“自由选择”导致的环境“分裂” 也是发行版造成的恶果。
从另一个角度来看,Linux的生态是什么样的呢?
1. 软件开发者只会考虑到有限的几种运行环境,所以只会对少量的运行环境进行支持;
2. 分发者时时刻刻都面对着数不清的需要更新的软件。毕竟永远有成堆的bug以及新的用户需求要靠更新这些软件来解决;
3. 使用者用着分发者见都没见过的硬件运行着他们提供的软件组合。
这个问题的解决绝对不是一个技术能解决的,首先必须有足够的硬实力,其次还要顺势而为。
第一次联手
首先我先站个队,我认为“Linux的发展,各发行版功不可没”。
但“软件环境分裂”对大家造成的伤害(包括发行版自身),发行版需要承担很大的责任。所以2011年,包括Debian、SUSE、Ubuntu、Redhat、 Mandriva等联合发起了appstream项目。
其核心工作就是定义了一套描述软件元数据的规范,建立起软件描述、截图,与包名的对应关系之类的数据库。appstream不仅建立了非常完善的spec,而且也实现了配套的基础设施库,并且Gnome、Ubuntu等商店已经迁移到它上面, Redhat、Debian等仓库也对其进行了支持。
然而让人失望的是,这场持续至今的运动并没有对普通用户带来一丝影响。
真正的问题
appstream的失败在于,这些发行版始终不敢打破“自由选择”这种“政治正确”。
appstream技术上是完善的,在解决软件描述统一性这个问题上简直绰绰有余。然而实际运作起来,却依旧是“自由选择”每个发行版有自己的一套东西,不同的商店,不同的变种,在技术上是兼容的,然而对普通用户来说并没有什么改变,对开发者来说仅仅也只是多了一个新的软件描述方式(也就是多了一个负担)。
deepin期望的是创造一种新的包格式以及配套的工具(开发端以及运行端)来解决这个问题,这个目前来看比appstream更加困难。
Linux发行版众多是“自由选择”导致的,是根深蒂固的,我不相信其能被“解决”,因为它本身不是一个问题。 应用软件运行需要软件栈来支持,依赖问题是不可避免的,无非是谁来消化这种复杂性。
Android、iOS靠重新打造一个封闭的独立新生态,将问题的出现拖延并缓解了。
Windows靠封闭以及强大的话语权将软件环境的变动减少到最小,即使有变动也是计划性变动,会有准备周期。
而从最开始Linux在这个问题上就没有什么规划或限制,导致如今已经无法单纯通过技术来解决这个问题。 尝试取代deb或rpm系无非是再创造了一个PKGBUILD系。
如何解决
这种无奈的格局目前是无法打破的,但我们可以做整合资源,而且其代价非常小。
因为这个问题里最困难的部分,软件组合复杂性,每个发行版都已经控制住了。不论你使用archlinux、ubuntu还是deepin只要按照官方提供的方式基本不会出现什么大问题。
发行版最基本的是需要独立人格,其中很大一部分是由这些软件栈的组合来体现的,并且需要持续不断的完善这些软件栈。
那我们还要做什么呢? 我觉得需要分别从3个方向来看待:
1. 给用户提供统一友好的界面 (普通用户需要的是统一友好的预期行为);
2. 在尊重不同发行版的原则的前提下减少其对用户的负面影响 (同时提供有价值的反馈信息);
3. 拉近开发者与最终用户的距离 (开发者需要更多的用户影响力)。
只有让Linux生态中重要的3个角色都能获益才能进入一个正反馈的循环。
具体要做的事有:
1. 分离深度商店软件与深度软件仓库,建立一个对应关系数据,并维护其他发行版的对应关系;
2. 以深度商店为原型,逐步移植到各大发行版,并建立软件包与商店软件的对应关系;
3. 在商店中提供更多软件作者的信息,如项目主页、作者信息、软件捐款链接等;
4. 培养用户习惯,建立用户习惯→软件→深度商店的一个循环。但这个前提一定是开发者以及普通用户切实收益于深度商店才可能实现;
5. 提供更换的软件管理体验,比如软件安装情况云端记录;
6. 提供更完整的软件数据。所有Linux的软件不论是否在仓库中都应该出现在软件商店中。数据完整不是错,为了减少信息杂乱对用户的 不良干扰,完全可以通过交互设计来隔离。
总结来说,努力给用户更好的体验,努力给开发者更多的宣传,尽力尊重各发行版的原则。 只有这样才有可能在另外一个层面上建立起一个统一的环境,才有进行真正技术革新的硬实力。
【相关链接】