安装与反安装--软件的彼得定律对系统的意义

今天要来讲的东西,主要是来自笔者以前看过很喜欢的文章(https://www.ithome.com.tw/node/59884 ),今天特地仔细研读查了资料,跟自己的经验比对,来汇整各方意见和案例给大家看看,所以是时候要来讲古的时候了哈哈


前言

初起呢,是小时候想从家里的电脑砍掉一个程序,於是就去C:\Program Files找到那支程序把他删了,後来被曾学过一点资料处理爸爸发现,虽然他对现在电脑一窍不通(他停留在DOS时代XD),但他那时告诉我:

这个安装软件是像锁螺丝钉一样,要拿螺丝起子顺时针转才会锁紧,拔掉的时候要照逆时针转回去才可以完整拿掉,这是一个固定的程序步骤,如果直接砍掉资料本身,会像是把这钉子拔出一半,是不会完整移除的。

当时对这句话半信半疑,还是会乖乖地在解除安装的时候去那个软件的资料夹找uninstall.exe来解除安装,直到有天我心血来潮在思考,uninstall.exe做的只是把他的资料夹砍掉吗?或者更正确地来说,安装档做的只是把程序资料载到特定资料夹这麽简单?直到有天我听说登录档这回事,上网查了一下,才知道程序安装反安装才没有这麽简单勒~~~

不过当然,有些小程序就真的就是很简单,他常常是我们自己写出来的,例如今天我们写个java把他编译完的.class档,这个.class只要有jvm环境移到哪都可以执行,或是像笔者以前一堂课一上课就要开好几个网页,自己写个.bat档一键开启,这些程序没有所谓的安装。

然後有些是可携式(protable)的绿色软件,通常是一个压缩档,解开後也没规定要放哪,里面包括一些组件,直接开启主程序就可以用了,几乎不会写入登录档,Windows内的程序集也看不到他,更精确一点可以说是在HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\子键下找不到,本身规模很小很单纯,也可以直接从随身碟开启,大部分不会对系统造成什麽影响。

应用程序的内容

那真正需要安装的应用程序规模又有多大?下面分几个项来讨论:

1. 程序主体

通常是主程序.exe档,双击可以开启程序,会在C:\Program Files那支程序的主目录下,连动很多元件一起运行,但越是大型的软件常常会开多个资料夹放各种元件在里面,安装完多出来的资料夹可能四处散落,甚至还要安装一个Hub来版控分配旗下的软件,开头引述的文章作者严立群就形容这叫「关系复杂」、「支离破碎」,常常主程序打开像是一个呼叫器,会呼叫其他所有需要运作的程序一并开启。
这对效能有什麽好处倒不一定,常常是开发上设计需求,例如同厂牌的软件可以一起共享的功能就额外摆出来等等,对往後的更新维护有时候是更方便,没有深谋远虑的设计逻辑就可能是更困难。

2. 动态连结程序库

(之前有说对DLL的认识可以参考andyfu44大大的铁人赛https://ithelp.ithome.com.tw/users/20125938/ironman/3047 )
通常是一些共享功能,这也算是物件导向,例如安装Word有写入一个开启档案的功能,那再安装Excel的时候就可以指向那个dll的位置沿用他不用再重复写一次,省空间也好管理…….
等等,好管理吗?
例如我们可以在C:\Program Files\Common Files\microsoft shared下找到一些微软共享文件,里面也有一些dll和其他各式各样的共享资源。
Imgur
想像你是个高中老师,你上课需要用一只粉笔,你可以自己带,当然也可以从教室黑板板沟找,当你发现教室没有,可能自己放一支新式无烟但很容易断的环保粉笔,你不知道数学老师上课习惯用耐用烟很多的旧式粉笔,下堂课数学老师上课看到可能换成他喜欢的,也可能不爽就不上课了,如果他换回旧式粉笔可能明天换你不开心,更别提如果哪天教学观摩你们一起出现的话。

今天一个安装档也是,当他执行去你电脑看,他可能要先判断这里是不是有他需要的功能档,如果有,跟他的版本相符吗?没有的话他要创建这个功能该写在这里还是自己的软件目录?更可怕的是更新的时候该把他覆盖掉吗?

或许可以读取登录档数数多少程序也共用这个档案,但我们不一定保证更新後其他程序也可以用这个版本的,这样是覆盖还是不覆盖好!?怎麽装个软件可以这麽纠结啊啊啊~但是软件会有自己的选择方式,久而久之你也不确定系统会被写成怎样,所以前面严大大也说:

有时不只是「技术」问题而只是「机率」问题罢了。

3. 设定档

有些是程序的配置文件或组态档,纪录你使用者自定义的设定偏好,有时候是要写入登录值,把设定记在HKCU\SOFTWARE下等等,也让系统知道有这个软件的存在,後来也有软件用XML格式把设定以资料库的形式储存。

所以你现在知道应用程序的东西很多,不只复制主目录而已,安装程序的运作就不是那麽简单。我们引文的严大大说:「这是一个精巧──但脆弱的过程。」随者你装过的东西越来越多,某天突然当机或是装不了某套软件都有可能发生,只是这个时代下正在慢慢改进,我觉得身为一个资讯相关背景人士,总该试着了解这些,对自己用的系统有认识,以古为镜注意自己写的程序。


软件安装

所以回归正题,安装应用程序到底在你的电脑发生什麽事,通常我们就是一直按是、同意、下一步就完成了,比较琐碎的可能会问你一些选择性功能要不要安装,要装到哪里,要不要件建立捷径或加入环境变数,还有要同意终端使用者授权合约等等,但在你看不到的地方,他大概是在做:

  1. 把安装包解压缩或是上网载资源到使用者暂存资料夹
  2. 把要用的实际程序资源复制到你的安装路径资料夹内
  3. 把动态连结程序库档放到某些位置,这个通常要看厂商的设计,有时候也会建一个厂牌资料夹把自家的.dll都丢进去,总之大家放的地方不固定。
  4. 写入登录档注册这个应用程序以及写入一些设定档到本机的某些位置,有些会在程序第一次执行才写入。
  5. 建立捷径跟在开始功能表写入资讯。
  6. 把一开始的暂存档案删除,但有些程序会不处理这点,或是安装失败就会继续留着,或是放到Winodws会定期清理的暂存夹等时间被删除。
    另外,还有些程序会互相合作提供捷径给对方,例如Adobe Acrobat是pdf产生器,除了跟自家Adobe的软件搭配,也可以跟Office系列软件搭配使用,会去Office的资料夹留下一些工具捷径等等。

然而有些程序安装後需要重新启动电脑有几个原因,例如需要替换复写的.dll档正在被其他程序执行,只能告诉Windows在电脑刚开机还没执行其他程序前把他换掉,或者下载来的暂存资源正在执行这个安装程序没办法自己删除自己,或是一些登录档设定需要重启才可以作用等等。


软件反安装

至於我们要解除安装软件则会需要用到该软件的uninstall功能,从控制台的新增/移除程序按解除安装也会执行,这是因为安装软件写入的登录档有记录下反安装档的位置,他在我们前面说的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\的软件子键下,的UninstallString登录值。
Imgur

那直观来讲,反安装所要做的就是跟安装倒过来,把写入的东西写回原本的样子嘛,我们可以在安装的时候写一个log纪录他做了什麽,反安装的时候就知道要怎麽倒回去,但这也不容易,比如前面的.dll档究竟是删好还是不删好,我们不一定知道自己的电脑有哪套软件还共用他,另外,一些设定资料和登录档的内容应该全部清除吗?说不定哪天你又载回这套软件又需要同样的设定怎麽办,有些软件解除安装後装回来你会发现还是你之前配置的视窗,甚至有时候反安装完你发现桌面的捷径还寻挂在原处。

笔者曾经见过的一个例子就是SQL Server Management Studio 18跟Visual Studio的关系,他们互通VS 2017 shell,我们载载卸卸VS的时候不晓得装了什麽又卸了什麽,VS 2017 shell最後有没有被更新或是随着VS卸载而移除,最後SSMS就出现神秘现象不能用了,详情可以参考这篇:https://docs.microsoft.com/en-us/answers/questions/100131/can39t-open-sql-server-management-studio-18-34mru.html。

这就是不建议常常反覆装卸软件的原因,如果是小程序也可以装protable版的,影响系统小,他会尽量把要用的资源都包在自己身上用自己的,写入的登录档的内容也很少,甚至不留下什麽设定档,有可携式的特性,这样的软件很受人青睐,也有人开发程序专门把软件绿化,不要用就直接砍掉整个资料夹就好,但不注意还是可能留下资料,里如笔者先前安装一个绿色软件,我们开机自启动的选项勾起来,後来有天砍掉程序後,工作管理员还是写着开机要启动他,这也就是先前提过的无用的登录档垃圾之一。


软件彼得定律

於是最後我们导出这个结论,除了升迁制度外,有人认为软件也有个彼得定律,随着软件不断开发越来越强大越来越新颖的功能,往往追求不断提升性能却忽略一些一开始可以忽略的问题,可能不是bug,也许是一种习惯,没有深谋远虑,最终我们的系统将充斥着很好很强大的软件,但问题也多的程序,他们可能互相依赖却不知道哪天会产生矛盾,造成所谓「系统不稳定」这个概括又抽象的词汇。最後我们引用引文作者严立群大大的结论做结尾:

这就是为何很多人都会说:「能少装一点软件就别装」,因为有时并不是软件本身的问题──因为「安装」这行为就是个问题。这问题无解,我们只能尽量避免而已。

今天讲了很多,因为那篇文章我常常拿出来看,也综合了其他知识,希望可以综合整理完整的心得笔记,从软件的安装和反安装来看软件对系统的读写操作,对系统稳定性的影响。经过这几篇文章过来,我们对在Windows上的问题有了一点头绪,时时刻刻都在写硬碟改登录档,如果在反覆装卸软件,这样的系统长时间下来常常有问题,最後要走上重灌这条路。於是下篇开始,我们就正式进入下个环节,开始介绍一些Windows系统级常识,谈谈各种系统夹的意义,还有权限问题等等,做我们之後来Debug的先备知识吧。

Imgur

参考资料:
https://www.ithome.com.tw/node/59884
https://blog.csdn.net/jia_xiaoxin/article/details/2923217
https://support.microsoft.com/en-us/topic/how-to-manually-remove-programs-from-the-add-remove-programs-list-49494159-d215-07b2-e4c7-050457b38352
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/503685/
https://www.ithome.com.tw/node/60091


<<:  Day.15 「条件设定好~让程序判断!」 —— JavaScript 条件判断式

>>:  08 - fd - 快速查找档案与目录

Day 27 | 等待的时间不无聊 - loader

今天想要分享的是这一个 Youtube 影片做出来的等待画面, 我只有挑他的其中一个写, 其他可以看...

【第二十六天 - Dijkstra 介绍】

Q1. Dijkstra 是什麽? 一种利用 Dynamic Programming ,与 Floy...

Android Studio初学笔记-Day5-TextView

基本元件介绍-TextView 接下来会开始介绍android studio一些基本的元件,这些元件...

DAY4 Python基础教学(二)

DAY4 Python基础教学(二) 前言 今天要介绍一些基础运算式,不过最简单的加减乘除就不赘述了...

找LeetCode上简单的题目来撑过30天啦(DAY25)今天国庆放假啦

好啦,今天国庆日,我不想逼迫自己咩,其实是我今天写不出来,写不出的题号是56. Merge Inte...