计算机专业的人,就算是博士,也害怕装软件,安装软件的过程中遇到各种各样恼人的问题是一件非常普遍的事情。而且不光我自己有这个感觉,著名的硅谷创业教父 Paul Graham 也有,他老人家还专门在一篇文章中谈论过安装软件的痛苦。
安装软件有很多种类型。如果只需要双击某个程序然后一键安装的话,还是比较愉悦的,很少碰到失败的情况,对于大多数应用程序普通人也能完全胜任。然而一旦需要对安装过程进行自定义处理,问题就跑出来了,比如安装某些插件、自定义一些配置,这就不光需要安装的知识,还需要对这个软件甚至一些环境系统有深入的理解。另外还涉及到不同系统、硬件的软件版本问题。举个例子,在 windows 下安装 gcc 并不是一个特别直截了当的事情,上次我安装的时候还阅读了一大堆文档,安装完了之后还要配置环境变量。
然而有打包好的安装包究竟是一件幸福的事情,基本上不会花费太多力气就能解决。真正的痛苦是需要自己编译软件的时候,这种情况在 linux 下最为常见。先不谈论个人放出来的开源代码,即便是有一个大组织维护的很多人用的软件,编译也绝非易事。比如 opencv,有一次我有个学弟花了一个星期,我问他成果是什么,他说终于把 opencv 编译成功了。
Linux 还有一个痛苦的地方就是类似 apt 这种包管理系统,他们不出问题的时候还是好用的,只需要一条简单的命令就能装软件,然而一旦出了状况,大部分人就完全摸不到头脑了,只能借助于搜索引擎。这种包管理系统十分复杂,需要深入阅读很多文档才能独立解决安装问题,不然只能靠 google,会浪费很多时间。
据我自己的观察,我认识的程序员们,从刚入学的研究生到已经工作了几年的工程师,都会觉得编译、安装软件不是一件容易的事情。他们通常会花费一年的时间不断遇到错误、挫折,然后搜索解决问题,然后慢慢有一定经验,对某个领域内的软件编译、安装驾轻就熟。然而,在切换一个领域之后,软件的编译、安装仍然可能是个坑。
产生这个问题的根源其实就在于缺乏标准。不同的软件有不同的依赖项,编译需要不同的库、编译器、编译器版本等等,一个小小的差别就可能导致编译器报错,而在你不熟悉的时候修改源代码是一件很可能会引入 bug 的事情。如果一旦统一了标准,那么安装软件可以变得轻松,比如 App Store,开发者都打包好成统一的格式,方便用户。