iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
Software Development

妄想對自己的Windows優化兼Debug的工程師很正常吧系列 第 15

安裝與反安裝--軟體的彼得定律對系統的意義

今天要來講的東西,主要是來自筆者以前看過很喜歡的文章(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


上一篇
REG檔撰寫—登錄檔腳本其實不難
下一篇
C槽系統目錄--Windows資料夾常識
系列文
妄想對自己的Windows優化兼Debug的工程師很正常吧30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言