如何學習 Linux

Aug 2001 重新整理

也許這篇講義的標題應該叫做 「資訊人如何有效學習」 比較恰當, 因為這些觀念與方法也適用於很多其他學習情境, 甚至於其中所建議的軟體也都是跨平臺的; 只是在 Linux 與 *BSD 等自由作業系統的環境下, 這些學習方法與工具更好發揮而已. 所以即使你不是為了學 Linux 而來到這個網頁, 也不妨耐心看完.
培養組合的力量, 讓新舊知識發揮相乘的效果

經常聽到資訊相關科系的學生抱怨 "長江後浪推前浪, 前浪死在沙灘上": 大一時所學的軟體到了大四就快退流行了; 剛畢業的學弟妹比當完兵回來的學長更符合軟體公司的專長需求. 原因是軟體工具的汰舊換新太快了. 資訊人的「成就階梯」真的必須每兩三年重新歸零一次嗎?

筆者邀請大家想想看我們是如何學國文, 英文, 數學的. 有多少人可以 背 出一百萬個英文句子呢? 但是看過以下提示後, 有高中英文程度的讀者, 應該都知道如何 寫 出一百萬個英文句子:

四則運算用到多少符號, 又能解決多少類不同的問題? 出售 100 種不同食品的自動販賣機需要用幾個按鈕來操縱? 火車站的自動售票機有幾個按鈕, 又能印出多少種不同的票? 樂高積木有多少種元件, 又能組合出多少種不同的作品? 裝潢師的工具有限, 為什麼卻可以創造出那麼多種不同的室內景觀?

[[那一種學習曲線值得長遠投資?]]

筆者在學習軟體時, 喜歡挑那些與其他軟體溝通良好, 有很通暢的資訊接駁管道 (姑且稱之為「高組合性」) 的軟體: 這套軟體是否可以在各種不同的軟硬體平臺使用? 是否可正確讀/寫公開檔案格式? 是否全力支援公開通信協定? 所以我兩年前學一套具有 5 個功能的軟體, 一年前再學一套具有 5 個功能的軟體, 今年又學一套具有 5 個功能的軟體, 最後可以解決的問題不是 15 個, 而是 125 個. 另一方面, 有些軟體強調的是花俏, 操作簡單, 多功能聚集於一身, 但卻忽略甚或 刻意阻絕 與其他軟體接駁資訊的管道 -- 我們姑且稱之為「低組合性」的軟體. 我那些學習低組合性軟體的同儕, 或許一開始很快就會覺得有成就感; 但是經年累月下來, 我解決問題的能力卻是隨時間成指數曲線成長, 最後遠遠超過他們! 當然上述情況有點理想化過頭; 但是讀者應該可以了解筆者這個誇張的比喻所要強調的重點: 學習組合軟體, 需要記的東西少; 可以用的場合多.

學習高組合性軟體還有另外一個優點. 資訊科技進步迅速, 而資訊市場更是變化驚人, 我們很難預測那些軟硬體未來會有較佳的就業市場. 學一套多功能聚集於一身但與他人溝通不良的「萬能」軟體, 就像是把所有的雞蛋放在同一個籃子裡一樣危險. 反之, 學習一群組合性高的軟體, 當中如果有元件退流行了, 我們只需要重新學習一個元件就好了, 因為這個新元件可以與其他沒有變動的舊元件組合使用. 我們對於環境變化的適應力會強很多. 家庭劇院當中的 LD 要升級成 VCD, 需要把喇叭和電視一起換掉嗎? 舊電燈想改用省電燈泡, 需要把燈體一起換掉嗎? 有人說學 Linux 的人都是高手, 所以把他們丟到 MS Windows 的環境下他們還是 活得下去; 反過來就不一定了. 我認為學 Linux 的人未必真的有多厲害, 但他們習慣選用跨平臺, 高組合性的軟體, 適應力自然比只習慣 Wintel/Office/VB 文化的人來得強. 如果將來出現一個更高強的新作業系統來取代兩者, 猜猜看那一個族群的人會先被淘汰? 文書處理, 程式語言, 資料庫... 亦是如此. 學習組合軟體, 比較不怕資訊科技快速變化.

附帶而來的好處, 就是 學習組合軟體, 知識的壽命長, 經驗可以累積..

[[組合軟體]]

能夠拿來與其他知識組合運用的知識, 才是投資報酬率高, 生命週期長的知識. 眼光放遠, 慎選所學軟體, 培養組合能力, 讓你的新知識與舊知識發揮相乘的效果, 讓生產力曲線成指數成長! (感謝 GNU 文件的啟發, 本文觀念來自 info -f textutils "Opening the software toolbox" 一節; 也請參考我的 linux 講義當中 「組合的力量」 當中的具體操作實例.)
多用程式, 少寫程式

把組合的觀念用在個人的知識, 我們會將自己的舊知識盡量拿出來重複使用; 同樣的觀念用在人類的集體知識, 我們應該盡量使用既有的程式來解決我們的問題, 也就是要 "站在前人的肩膀上", 而不要一直 "重新發明輪子", 甚或像某些軟體公司一樣, 老是 "踩在前人的腳趾頭上".

在 著手寫程式 之前, 你可曾用心地從下列資源當中 尋找可用的程式, 來減輕你的工作份量?

1. 手邊現成的應用軟體.
要把 X-Window 上的某個視窗印出來嗎? RedHat 或 CLE 的 CD 上本來就有一個 xwpick 可以用 (轉換檔案格式要配合 libgr-progs 內的工具). 要限制部分網頁的瀏覽權限? 在 apache 內只要設定數個 Auth* directives 就可以了, 不必寫 cgi 程式. 要把整個目錄下所有的 .shtml 檔改成 .html 檔? 可以用 find 和 sed 啊! (對不起, 我只舉得出 Linux 上的例子; 不過我相信 MS Windows 下的程式一樣還有許多待人發掘的特異功能; 你知道光是 MS Word 的巨集功能就可以做多少與文書處理不相關的事嗎?)
2. 網路上現成的應用軟體.
Linux Software Map 內或許可以找到你要的程式, 甚至已有 現成的 rpm 檔 可以直接拿來使用. (自己編譯核心或應用程式當然也是一個很好的練習方式; 但初學者為了趕快上手多用編譯好的程式不也是 "站在前人的肩膀上" 嗎?) 要把你的 html 檔案好好地整理乾淨? 有 tidy 可以用. 要作複雜的線性代數, 甚至迴歸分析或統計學的運算? 何不試試 octave 或 rlab 以及 R. 要畫 (離散數學當中的) graph 嗎? dia, xfig 和 angela! 都可以的.
3. 你所使用的語言內所附的標準程式庫.
要用 C 語言排序嗎? 在 stdlib 當中有 qsort. 要用 C++ 寫 symbol table 嗎? 在 STL 當中的 map 就是為此而設計的. 要用 perl 寫 CGI 程式嗎? 何不直接 use CGI;
4. 現成的外掛程式庫.
要在文字模式下移動遊標, 改變顏色, ...? 不妨試試 ncurses. 要寫漂亮的圖形界面? 只要你選用的語言不是一個 evolutionary deadend, 一定可以與 Tk 連結. 剛才矩陣運算的問題, 如果真的有必要在這麼低階的層次做的話, 可以考慮 libblas, liblapack, ... 等等. 要把程式目前的狀態存入檔案中嗎? 在 perl 內有 Data:umper 可以用.

而且所謂 "可用的程式" 可能遠比我們想像的更要無所不在. 很多時候限制一個軟體使用範圍的, 可能不是程式本身, 而是使用者的想像力與對該軟體的了解. C 的標準程式庫當中既已提供了 qsort, 實在不需要再自己重寫排序程式; 眾多應用程式都支援 regular expression, 有很多場合實在不需要再用滑鼠辛苦地重複剪貼工作. 尤其像是 perl 這類 scripting language, 乍看之下似乎與我們要解決的問題無關, 但事實上卻經常是最簡單的 "可用程式". 例如想要分析一天當中, 每個小時上我們網站的人次, 可以下:

perl -ne 'print "$1\n" if /\d+):/' /var/log/httpd/access_log > x
sort x | uniq -c | perl -pale '$_=join " ", reverse @F' > y

然後進入 gnuplot 下

set data style lines
plot "y"

就完成了. 究竟多花一些時間寫程式比較值得呢? 還是多花一些時間學用程式比較值得呢? 學寫完整的程式容易呢? 還是學用程式容易呢? (註: 嚴格來說應該只計算讀取成功的部分. 上例中比對字串處應修改如下: ... if /\d+):.*"(GET|POST).*?"\s+200\s/ ... 但再怎麼改, 這個 "命令" 的長度還是比相同功能的 java 或 c 程式短很多.)

有人說我們一般人的大腦只使用了十分之一不到; 隨著軟體越來越多, 越來越複雜, 我們對既有軟體的使用程度可能遠在這個數字之下, 甚至不知道找了好久的功能其實就在自己每天隨身攜帶的 CD 當中, 甚至就在自己天天使用的某個軟體之中! (我自己的切身經驗啦 ...) 換句話說, 我們這個社會真正最缺乏的其實並不是專門製作 "全功能應用程式" 設計師, 而是懂得把既有的數個應用程式適當設定, 重新組合, 完成連這些程式作者都沒想像過的工作, 這種會思考的使用者.

目前有許多企業僱主的思考方式依舊是: "花錢買軟體的使用權" 而不是 "花錢僱人幫我善用或小幅修改既有軟體", 所以這種人才的就業市場或許還不是很成熟. 告訴這些僱主 "擁有得多, 不如使用得巧" 正是我未來的工作重點之一. 不論社會大眾何時覺醒, 我們資訊從業人員都應該把眼光放遠, 及早開始做長遠的學習投資, 用有效率的學習方式, 學習可以活用組合的知識. 希望有一天, 社會大眾終於會知道: 僱用一位 會思考/選擇/組合既有程式的使用者, 比買一套具有漂亮使用者介面的 "全功能應用程式" 更能幫助自己解決切身獨特的問題; 希望有一天, 社會大眾終於會知道: 身邊有一位 會思考/選擇/組合既有知識的讀書人, 比擁有一套印刷精美的 "宇宙真理全集" 更能幫助自己解決切身獨特的問題.

當然筆者並非反對寫程式, 只是說寫程式之前要三思 (然後認真找過). 什麼時候該寫程式呢?

1. 寫程式不是手段, 而是目的: 例如純粹為了興趣而創作 (就像很多人畫圖, 寫歌, 寫詩, ... 純粹為了興趣而創作一樣). 以興趣為動機而創作的人, 是最幸福的人. 不論你寫的程式有沒有用, 盡量寫吧!
2. 為了要練習, 為了要了解. 例如寫老師出的作業, 寫課本與參考書上的習題. 就像數學系的學生要不斷地重複證明前人已證過的定理一樣, 練習是學習過程當中很重要的一個環節.
3. 你需要解決的問題確實沒有人解決過, 而且這是一支「組合性」低的程式: 它只適用於此時此地, 專為滿足這位主管或客戶的要求所設計; 換個應用場合就必須看得懂程式的人再進入加以修改. 例如網頁設計或資訊管理系統等往往是這樣的狀況. 這當然非自己寫不可; 但是其中經常仍有不少地方可以撿現成的程式庫來組合. (順便一提, 寫這種程式並不是靠版稅賣錢, 而是靠服務賺錢; 與自由軟體的觀念並不衝突.) 通常最適合這種狀況的語言是某種 scripting language
4. 你需要解決的問題確實沒有人解決過. 而且這是一支「組合性」高的程式: 它的功能介定非常明確, 操作或使用的介面與實作的細節非常獨立, 可以讓很多不了解細節的人在不同的場合使用. 如果你首先寫出來這樣的程式, 不僅可以解決自己眼前的問題, 說不定還可以參與 CLE 計劃 之類的計劃, 把你的成果以 GPL 或 XFree86/FreeBSD 等方式公開授權給大家使用, 成為受一位大家尊敬的駭客.

至於如果寫程式的動機是販售程式使用權, 那恐怕就要三思了. 哺乳動物時代來臨之後, 地球上還是有爬蟲類; 不過那畢竟是少數. 在自由軟體時代來臨之後, 或許還是會有軟體公司能夠持續以版權私有軟體方式生存, 但恐怕也是少數.
從錯誤訊息當中學習

身為一個長期的自由軟體使用者 (我從 DOS 與 OS/2 的時代就開始使用這些平臺上的自由軟體), 我第一次面對在 MS Windows 「保護」之下長大的世代, 感受到最強烈的文化衝擊是: 為什麼大家都忽略錯誤訊息呢?

高手與常人的第一個差別在於 "偵探小說" (注意線索) 的學習法 vs 盲目的 "嘗試錯誤" 學習法. 對於自由軟體豐富的錯誤訊息不但不要抱著害怕的態度, 更要把它當成改正下次行為的珍貴線索. 來自 MS Windows 世界的人經常忽略這些非常重要的學習資訊. 這可以理解: 因為 Windows 和上面的許多 proprietary software 在印錯誤訊息時必須非常小心, 不要把過錯攬到自己身上; 而 Windows 的使用者在習於看到沒有意義的錯誤訊息 ("請與程式設計師聯絡" -- "可是我到那裡去找程式設計師的電話號碼啊? 而且, 就算我查得到...他會理大補帖的使用者嗎?") 之後, 便很自然地養成了忽略錯誤訊息的習慣. 但 Linux 和其上的自由軟體則大不相同, 錯誤訊息的目的在於幫助使用者找出問題所在, 那怕是必須承認程式自己的極限或錯誤也無所謂. 對於 server 類的程式, 往往無法直接看到錯誤訊息, 因此 log 檔 也非常重要.
其他有助於學習的方式

1. 習於略讀 各種文件:
Linux 上的文件多到不可能讀完. 你有興趣的文件可以細讀; 其他文件都可以略讀或只讀與眼前問題相關的章節.
2. 加強基本英文閱讀能力, 走出臺灣狹窄的資訊空間:
閱讀技術性文章不會很困難的, 尤其不需要把術語當做英文來敬畏, 而要把術語當做數字代號或線索來協助我們在相關文件檔當中搜尋 我們要的資訊. 對於不了解觀念的人而言, 「水管」一詞會比「pipe」 更容易記嗎?
3. 勤作筆記:
學習新語言的測試程式, 花很多時間才試出來的命令/才解決的安裝問題, 各種設定檔, URL, 同學的經驗, bbs 上看到的小技巧, 高手指導的 e-mail, ... 以上種種, 都應該小心保存, (何不乾脆用電腦做筆記?) 不要太相信自己的記憶力.
4. 珍惜學習成果, 勤作備份:
我每天把最近一年來的工作成果備份到學校電腦, 磁片上, 家中電腦, ... 一天要備份數次. 只要你選對工具, 檔案格式 (例如 避免使用 .doc 檔) 並挑好真正該備份的東西, 這絕對不是神話. 設定檔中不用的設定還是要保留 (comment 掉就好).
5. 善用網路資源:
從前人那裡可以得到的, 不只是程式, 還有很多資訊. 綜合地說, 就是要善用網路上既有的資源.
1. *.org 網頁
2. 搜尋引擎 (你們比我還清楚; 我長大的世代屬於下面 ...)
3. 新聞群組的常問問題集: 你有興趣的問題, 很可能別人老早就已經問過了. rtfm (newsgroup FAQ) 裡面的資訊由有興趣的人士共同提供編纂, 資料經常比搜尋引擎更豐富有系統. 或許可以從 現有 newsgroup 或 常問問題答案 開始找起.
4. 如果你知道要找的資料可以用 ftp 取得, 且大約知道檔案或目錄名稱當中的幾個字母, 可以用 archie(1) 尋找. 現在似乎全都變成 web 介面的 archie 了
5. bbs 精華區: 像 紅色魔鬼電腦技術精華區 就是一個資訊豐富的 bbs 精華區.
6. 養成良好的使用習慣, 避免使用 root 帳號:
Linux 再怎麼好, 再怎麼不怕病毒, 一碰上不小心 (或新手) 的 root 使用者, 一切優勢都喪失了. 我的 root 帳號幾乎不 customize, 所以很難用. 我又在 .cshrc 中加了一句:
set prompt = "%U%{\033[41;37m%}%m:%~%#%{\033[0m%}%u "
讓 root 的提示符號變得很刺眼. Bash 的使用者可在 .bashrc 中加上
PS1="\[\033[4;41;37m\]\h:\w\$\[\033[0m\] "
(螢幕控制字串請見 「反樸歸真: 文字模式下的程式設計」).

具體的學習重點

1. regular expression: 可以用在: less(1), grep(1), sed(1), vi(1), ... 等處
2. pipe and xargs(1)/command substitution (back quote) 這是「組合哲學」的基本動作
3. 下 "info -f fileutils" 命令, 學習 "軟體工具箱哲學" 一文中提到的指令. (我就是從這裡學到「組合哲學」觀念的)
4. 學會操作 readline user interface, 以後不只在 shell 下, 還有在很多應用程式當中 都可以減少打字的負擔.
5. 用 find(1) 找到你要處理的檔案, 然後 ... (組合哲學: 丟給其他命令處理)
6. archie(1), lynx(1)
7. 選一種 scripting languages 來學習.
8. 善用常用環境變數, 一次調整很多應用程式的行為: PAGER, VISUAL, ...

融入新文化, 拓展新「思界」

1. 興趣為創作之母:
為興趣而學習才容易學好, 才容易有真正有價值的創作出現. 如果你不喜歡正在學的東西, 何妨找喜歡的東西來學? 當然也必須要有足夠的耐心渡過學習曲線的「引擎發動區」, 否則永遠找不到喜歡的東西.
2. 享受千分, 回饋一分:
把個人的時間精力回饋一點給自由軟體社會, 讓網路把你的貢獻無限放大. 撰寫程式, 製作文件, 參與中文化工作 (CLE), 協助翻譯文件 (CLDP), 利用自由軟體製作 圖案 / 動畫 / 網頁 / 桌面主題 / 音樂, 出點子, 回報程式與文件臭蟲 (順便拜託回報我網頁上的 bugs, 提供相關 URL's, 謝謝! :-), 甚至參與各項計劃的打雜工作, ...
3. 貢獻者的法律保障:
「革奴大眾公有版權」 "自由的範圍以不侵犯他人的自由為限度"
4. 麵包在那裡?
5. 不要敵視所有商業行為, 要鼓勵合乎自由軟體理念的商業行為:
勸說尚未轉型的資訊廠商, 把 Eric Raymond 的 "The Magic Cauldron" 介紹給他們; 開導「需要使用軟體的非資訊廠商」, 把 Linux 的 (1) 商用實例, (2) 商用實例, (3) 給資訊部門主管的建議, (4) Linux 網路作業系統的現況與應用 等 URL's 介紹給他們; 啟發「與軟體使用幾乎不相關」的紀念品/文具/手機/襯衫/... 製造商, 把不需要付版稅的可愛企鵝圖案與 Linux 標語介紹給他們.
6. 不要迷信 Linux, 不要害怕選擇的自由:
要尊重他人選擇的自由

[[(力求維持) 符合 xhtml 1.0]] [[(力求維持) 無障礙網頁]]

* 本頁最新版網址: http://www.cyut.edu.tw/~ckhung/publi...18learn.shtml; 你所看到的版本: 19-Mar-2002; 這一層 及 上一層 可能也有相關網頁.
* 作者: 朝陽科技大學 資訊管理系 洪朝貴
* 寶貝你我的地球, 請 減少列印, 多用背面, 丟棄時做垃圾分類.
* 在保持全文完整 (含本段註腳) 的前提下, 歡迎複製及散佈本網頁.