對剛接觸某一領域的萌新來說,學習軟件使用、配置軟件環境經常是第一件頭疼事。從網上搜的教程看的半懂不懂,自己操作還容易出現很多別人很少遇到的問題,導致瀏覽器變成遞歸式學習的棧。本篇文章希望通過多個軟件配置的例子,從軟件設計的角度看待軟件配置,總結出一般經驗,提煉出一些常用的知識。也希望后來人少踩些過來人踩過的坑吧。
最近更新時間:2019-07-13
Part 1.關於軟件的目錄
首先我們通過幾個例子直觀地認識一下軟件目錄:
(JDK安裝目錄)
(Apache Tomcat安裝目錄)
(MySQL安裝目錄)
通過以上例子以及平時安裝軟件的經驗,不難發現很多軟件的目錄命名有一些相同點。這很好理解,如果你是軟件設計師,一定希望自己的軟件文件夾有意義明確且簡略的名字。正是基於這種思想,軟件文件夾的命名比較“約定俗成”。當然,不同軟件的各種文件夾名字可能不盡相同,但由於大型軟件設計的方式比較類似,所以文件夾的意義應該是差不多的,總結經驗時應該從文件夾的意義入手。下面對幾個常見的名稱進行分析:
- bin文件夾:大多數的軟件都有這樣一個文件夾。bin也就是binary,二進制。我們知道計算機只能識別由0和1組成的(二進制的)機器語言,所以想要計算機執行命令,必須把它們通過各種手段變成0和1的組合。因此,bin目錄一般用於存放可執行(executable)文件,后綴名經常為 .exe , .bat等。打開軟件,常常就是執行bin目錄下的一系列可執行文件。
- conf文件夾:即config,配置的意思。軟件的配置文件,就像是一個遙控器,通過它可以定義軟件的一些外觀和行為。為什么要使用配置文件這種形式來修改軟件呢?對於一個簡單的程序,在代碼中設置if,變量等足以修改程序的行為;但對於一個大型軟件,使用這種方式既不方便他人(程序員、用戶)修改,也將修改與程序邏輯雜糅在了一起(耦合性高),容易出錯。所以作為一種最佳實踐,配置文件應運而生。配置文件實際上就是一個“字典”(python中的字典,c和java中的map,json的設計思想),或者說“鍵值對”。程序通過“鍵”在配置文件中找“值”,把“值”賦給變量,完成從配置文件到程序的數據傳輸。
- lib文件夾:即library,圖書館,引申為庫的意思。在計算機領域,庫是寫好的現有的,成熟的,可以復用的代碼。我們在屏幕上輸出文字,並非用匯編語言在屏幕緩沖區編輯數據,而是直接調用printf函數,就是因為函數封裝好了一系列復雜的行為。因此程序設計強調“子程序”,軟件工程強調“可復用性”。基於這種思想,軟件設計者將代碼需要用到的其他代碼放入“庫”中,想要使用的時候include一下或import一下就好了。從廣義上來講,可以被重用的“東西”就可以放入庫中,不一定是可執行文件。
- log文件夾:即存放了各種程序的日志。日志是對軟件完成了某些處理、經歷了某些操作或出現了某些錯誤的記錄。大多數日志是給人分析的,所以應該擁有良好的可讀性(當然前提是你對這個軟件的功能有一定的了解)。也有一些log使用其他格式編寫,打開可能是亂碼。log的名稱標示着它的作用,比如error.log,install.log 等。
- temp文件夾:即temporary,暫存文件。緩存是一種典型的“空間換時間”策略,這也是環境變量Path的存在思想。比如我們有一張混亂的查找表,正常遍歷一遍需要O(n)的時間復雜度,但如果你要尋找的那個“鍵”之前找過了,被記錄了,那么下次我先尋找那個記錄,一下子就匹配上了。這也就是使用記錄的一點內存去換取遍歷的時間,這種思想在數據結構的設計和操作系統中非常常見。很多電腦衛士、手機衛士清理內存的方法就是刪除這些temp文件,從產生temp文件的意義的角度來看,這種行為可能不太合理。因此,這個文件夾一般不需要我們操作。有時我們對軟件進行了誤設置,(廣義上的)刪除temp文件也可能是一種解決方案。
- resource(source、res、src)文件夾:存儲了程序的資源文件。資源是一個很寬泛的概念,圖片視頻是資源,排版布局的格式(XML、CSS),甚至字符串數字等等都屬於資源。軟件講究“資源與代碼分離”,提高軟件的可維護性,降低耦合性。舉個例子:如果想把植物大戰僵屍的豌豆改成子彈,並不需要修改游戲邏輯,只需要在資源文件夾中,用子彈的圖片替換相應的豌豆圖片就可以了。
- plugin文件夾:存放一些程序的插件,即對程序現有功能的擴展。文件夾本身沒什么好說的,而“擴展”的實現則依賴於良好的設計模式了。軟件與生活中一般產品產品的最大區別就在於易於更改,使用軟件的用戶的需求也常常反復多變,這就要求軟件設計要有良好的可擴展性。如何制作高性能、用戶友好、易於擴展、易於服用、易於審查... 的優質軟件,就是軟件工程師們所要研究的課題。
對文件夾的意義初步了解后,順便看看常見后綴名的文件都是做什么的:
- .bat文件:批處理文件,就是一個腳本,用於簡化用戶操作。比如我打開軟件有一個固定的格式:【1.打開bin目錄的init。2.打開bin目錄的start。3.打開plugin目錄的ext】,就可把這些操作按照一定的格式寫入批處理文件,讓它幫我完成這些固定的操作。
- .conf,.properties文件:上文提到的配置文件。
- .dll,.lib文件:動態庫和靜態庫文件。dll全程Dynamic Link Library,與靜態庫的lib相對。將匯編生成的目標文件.o與引用到的庫一起鏈接打包到可執行文件中,這種鏈接方式稱為靜態鏈接。但設想:如果我有10000個調用了printf函數的程序,它們每個都要打包一個靜態鏈接庫,是非常浪費空間的。動態鏈接機制就是為了解決這個問題而生:重復的代碼在計算機中只存在一份,程序運行時才進行動態地載入,而不是鏈接時一起打包。這樣處理既規避了空間浪費問題,也解決了靜態庫對程序的更新、部署和發布頁會帶來麻煩的問題。用戶只要按需更新動態庫即可,增量更新。
Part 2.環境變量那些事兒
如果你是一台計算機,想要執行一個確定的可執行文件,你需要得到哪些信息?
- 文件路徑
- 文件名
也就是一個文件的確切位置。在Windows系統控制台中,可以通過在文件所在目錄中,輸入文件名來執行它。
有時我們要執行的程序分散在各處,挨個尋找它們的路徑是非常麻煩的。而對於操作系統而言,“用戶”可不止人類一個:程序還會向操作系統發送各種指令。比如我點擊了Eclipse中的Run按鈕,Eclipse會去執行javac ,java等命令,而Eclipse這個程序可不知道我們把Java安裝到了哪里。想要隨時隨地運行一些常用的程序,又不想讓操作系統遍歷整個文件系統去找(事實上操作系統根本不會去找,而是直接告訴你沒有發現)就需要環境變量Path了。
環境變量的設置是一種典型的空間換時間的策略。當我們輸入一個執行文件的命令時,系統會先從當前目錄尋找此文件,如果找不到就會從環境變量之中尋找。我們將一些常用的程序的目錄添加到環境變量之中,就可以(讓我們自己或者應用程序)隨時隨地執行那些文件了。
為哪些目錄配置環境變量?這要看應用程序和個人的需求。
比如:通過對Tomcat的批處理文件分析發現,它需要Tomcat的安裝目錄,並且用CATALINA_HOME去引用此目錄。
所以我們應該在環境變量中添加鍵為CATALINA_HOME,值為你的tomcat安裝目錄的一項。這是環境變量設置的程序基礎,事實上,配置環境變量時,只要按照網上的教程一步一步來就可以了,不需要自己分析源碼。
環境變量的設置網上一抓一大把,這里就不多說了。(Java的配置:https://www.runoob.com/java/java-environment-setup.html)
__未完待續__