The two most important days in your life are the day you were born and the day you find out why. -Mark Twain

#55 當兵,我的 IT 人生起點

這一篇文章講的是將近二十年前的人生故事 - 當兵,我的 IT 人生起點

當兵,這是一個身為台灣男人都避免不了的過程.除非身體上有不適合的,不然每個男人都得去當兵.對許多人來說,當兵都是很辛苦的,可能是在辛苦的步兵連或每天要顧著大砲的砲兵連,甚至是在特種部隊.不管是在那裡,每個人所經歷的辛苦都是不同的,每個人所留下最深的回憶絕對不是退伍那一刻的光榮或快樂,最深的回憶往往是那些被操的最辛苦的時候.如果你也當過兵,我想你也會同意我這樣說.然而,當兵對我來說卻是我的 IT 人生的起點.雖然也是辛苦,但卻不是身體上勞累,而是承受較多的心理壓力.故事是這樣開始的....

在大學剛畢業沒多久後,我收到區公所的通知要去抽籤,那一天只有兩個人需要參加抽籤,我是其中一個.當時我覺得奇怪,怎麼只有兩個人而己.到現場了之後,有位長官就拿著一個小布袋,聽的出來布袋裡有很多的籤,然後他拿起了一些海軍陸戰隊的籤丟到小布袋裡,同時提醒我和另一個仁兄說,這布袋大約有十多個海軍陸戰隊的籤,然後就祝我們好運了.另一個仁兄先抽,他抽起來後,其中一位長官說: "海軍陸戰隊!".我當時心想,天呀,才剛放進去就被抽起來,有這麼神準嗎? 接下來換我抽,手進去攪拌了一下然後拿出一個籤,"空軍".又是一個天阿,我沒想過我會抽到空軍.結果這時那位長官就說,怎麼前一個跟後一個差這麼多,我想這是一個緣份吧.接著過了一個月左右,我就坐上火車專車到新兵中心報到了.在新兵中心大約一個月之後就要分發部隊了.因為我大學的主科是機械系,所以就被安排到台灣某個空軍基地,也就是某一個機場.如果我的記憶沒錯的話,我那一梯大約有二十多人都被分發到同一個空軍基地.到了基地之後,我們就被安排到一個會議室裡等待基地裡不同單位的長官來挑選.不知你們有沒有過那種等在那邊被挑選的感覺,心情是上上下下,因為被挑走之後,未來將近二年的生活就確定了.我估計我應該會被修飛機相關的單位挑走,畢竟我大學主修是機械系,所以當時就沒有想太多.後來,一切發生的事情就只能用緣份來形容.那時進來了一位年輕少尉軍官,感覺上只是大我個二三歲而己,他進來後就說他是資訊單位的,要挑選會電腦的阿兵哥.我一聽就馬上報名參加他的面試.接著他對每個阿兵哥都做簡單的面試,會問我們對電腦懂多少,有什麼經驗,有沒有當過 BBS 的版主之類的.後來,輪到我時,我跟他說我是機械系畢業,但我會 C 語言,也會用太陽作業系統 (Sun Solaris),而且也會做 HTML 網頁,BBS 也非常熟,並且我中文打字很快.也許我是幸運的,在那一稊的同學中沒有人是資工系畢業的,於是那位年輕的少尉軍官就挑選我了.我就獨自一個人跟著他到他的單位去報到.

這個單位蠻特別的,人不多,但是裡面絕大部份都是職業軍人,而那位年輕的少尉軍官其實是一名資訊預官,他是某間國立大學資工所畢業的,專長是網路工程.整個單位裡只有我跟他是義務役來當兵的.後來我都稱呼這位預官叫崇哥.也許是工作環境與個性的關係,崇哥並不會以軍隊裡學長的姿態來壓榨我,反而幫助我很多.他跟我說之前我這個缺的阿兵哥在我來之前才退伍不久,而他跟我是念同一家大學畢業的但不同科系.想想,這一切應該都是緣份吧.

一開始我在單位上的工作很簡單,由於我是唯一的阿兵哥,其他人都是軍官,所以單位上所有粗重或下等的工作都是我做,例如所有的清潔工作,不管是掃地掃廁所倒垃圾等等.單位裡的老大是一位中校軍官,也是盯我盯的最緊的人,因為他非常注重乾淨.在這單位工作唯一的好處是這些軍官們到了下班時間後就會回家了,所以晚上也是我唯一可以比較輕鬆的時光.

過沒多久後,崇哥丟了一本 “網路通訊” 的書給我,要我把書念一念,因為接下來他要分配一些他的工作給我.他只剩一年就退伍,我猜想他是要我接他的工作吧.那時沒想太多,崇哥要我做什麼,我就做什麼.每天有空的時間就讀那本網路通訊,看了之後才明白基礎的網路原理,包括了網路的類型,區域網路廣域網路等等,還有不同的材料,如同軸電纜或光纖,然後也介紹許多設備,如 Hub, Switch, Router 之類的.最後還介紹 TCP/IP 協定,看完之後讓我對網路有基本的了解,也才知道電腦之間是如何溝通的,也才知道不同的環境下有那些網路連線方式.接下來的幾個月裡,崇哥也會帶我到機場裡不同的單位去拜碼頭,認識不同單位的長官,而其中更重要的是他帶我去看每個單位的網路是如何連接以及相關的設備在那裡.對我來說,這是個很有趣的學習,除了可以從課本上得到知識外,還可以親眼看到那些課本裡講的網路線材以及設備.我想這是開啟我 IT 人生的第一步,而崇哥就是幫助我走上第一步的貴人.

除了遍布整個機場的網路以外,在單位上還有一個相當重要的電腦機房,裡面有一些大型主機執行著一些空軍的電腦系統.漸漸地,我也慢慢被安排做一些日常的機房工作,例如換磁帶等等.我在機房裡看到太陽作業系統的電腦,心裡想這也許是崇哥會挑我進這單位的原因.日子就這樣過了幾個月,依然每天做打掃工作,每天睡覺前去倒垃圾,整理好辦公室,會客室以及長官的辦公官,沒做好的話,隔天早上又被會單位老大罵了.就在崇哥準備退伍前一二個月左右,這時總部來了一道公文,配合新一代戰機,整個空軍的所有電腦系統與設備會進行提昇.其實當時我根本還不知道那些東西是要做什麼的,我還記得當時單位上的軍官們都在恭喜我,我有很多工作要做了,顯然不是件涼差事了.

過沒多久,這項專案就開始了,每天有許多的工人到機場裡面來,在規定的路線上挖土埋管.這是一樣很硬的工程,我是個監工者,每天就跟著這群工人們在大太陽底下工作,每天寫著我的工作日誌.那段時間,我記得我曬到我的耳朵都脫皮了. 還記得有一天傍晚正好在機場的跑道尾端工作,當時滑行道上正好有三架 IDF 戰鬥機緩緩地滑行到主跑道,整齊的編隊,其中一架引擎點火,迅速地衝出去,過沒多久之後就飛上天空,接著另外兩架也依序地升空.當時的我剛好在跑道的尾端看到這一幕,那麼近距離地在戰鬥機後面看到戰鬥機點火並且迅速升空,這真的是一件很酷而且很有視覺震憾的事情.

埋管的工人們完成埋管工程之後,便換來了另外一批佈線的工人,從室外光纖到室內的網路線,我還是都一路跟著跑遍機楊的每個地方.最後換成一批比較高級的工人,我稱他們為工程師,他們架起網路設備,設定 Switch 和 Router,因此那時我也學會基本的 Cisco router 設定.當初崇哥在我一進來時丟給我那本網路通訊一書,在這個專案的過程中可說是發揮的淋離盡致.這個專案前後執行了數個月,在開始沒多久後崇哥就退伍去竹科上班,所以機場裡的網路工程就剩下我這個小兵一肩扛起來.現在回想起來,年輕就是年輕,才有這種勇氣和衝勁.雖然如此,整個單位還是只有我一個阿兵哥,所以我還是得負責單位上的清潔工作.有時在餐廳裡遇到同梯時,有人都表示他們很羨幕我可以在資訊單位工作,上班還可以吹冷氣等等.但我都跟他們說,我們來一年了,你們現在一定都比較輕鬆了,因為你們後面都有學弟一直進來,但我不是,單位上只有我一個阿兵哥,即便是我們來一年了,我還在掃廁所.聽了之後,我的同梯也覺得有好必有壞.但我知道,其實我自己是很幸運的,因為就算是資工系畢業的學生,我想他們網路工程的實務經驗絕對不會有我多,也拜了這次專案之賜真的讓我學了最真實的 IT 工作.這也就是我為什麼說我的 IT 人生起點就是在當兵的時間了.

最後,整個專案的硬體部份完成之後,總部的長官們來視察成果.單位的長官們忙著接待總部來的長官們,然後也派我跟著某個軍官做檢查.這位軍官就說他要進行抽查,到他指定的地點去,然後看所有的電腦與設備是否都正常運作.我就陪著這位長官從機場頭到機場尾,最後抽查完成後,這位長官就拍拍我的肩膀說: "幹的好,辛苦了".那時我心裡有一種爽快的感覺,心裡正盤算著我應該可以放假了吧! 但也有另一種想法湧上來,這網路線連一連,設備設定好,電腦設定好,不就都可以通嗎 ? 難道有人會抽查不過的嗎 ? 後來我請教了這位抽查的軍官,他跟我透露有些單位還真的有遇到網路不通的.沒通也是件蠻神奇的事.在整個專案的執行過程中其實有太多搞笑以及太多辛酸的事情了.搞笑的是常常跟著那些埋管工人們一起工作,聽他們說一堆五四三的事情,一起喝那個對我來說超級難喝的保力達 B, 他們都是做粗重工作的工人,跟他們相處起來卻是最輕鬆,最有人情味.辛酸的是在工地裡騎單車掉到坑裡,受傷不能靠腰,然後無線電的某一個開關保護套掉了卻被長官罵到臭頭.總之,這就是當兵,這就是人生.

故事還沒結束.過沒多久之後,總部又來一個公文,要求每個基地都要架設自己單位的網站.當時我被通知這個消息之後,深刻地覺得崇哥實在太有遠見了,挑選我進來真的是想過的.也許這一切只是巧合,或許是一個緣份.整個單位裡十來人只有我知道怎麼做 HTML 網頁,所以這項工作就由我來執行.當時我就用了一台 PC 裝了 Windows NT Server 做為網站伺服器.那時我對 Windows NT 懂的很少,所以當時有一段學習困難的時間,還好最後也搞定了,最後網站也上線.沒多久後,單位老大說能不能做出像留言版那種東西,可以讓路過網站的人留下一些建議等.我也只能答應老大的要求.因為以前沒有寫過這種東西,不太確定要怎麼寫,還好以前有一點 Perl 經驗,所以就用 Perl 試試看.但寫來寫去,覺得 Perl 超級麻煩,很多內建元件都沒有,許多功能都要自己寫,而且有些東西我也不會寫.於是,就開始找其他的方式.那時,剛好 Microsoft 推出了 ASP.我找了一些 ASP 的資料,試著了解它之後發現這東西實在是太酷太好用了.它內建了許多元件,所以幫助我可以容易地寫入和讀取檔案內容.於是最後決定用 ASP 來做.後來,組長發現我能寫了之後就開始到其他單位去包 “工程” 了,比如到氣象單位去幫他們做一個氣象網站,讓飛行員與其他長官可以很容易地透過瀏覽器就可以看到氣象資料.所以就在那一系列包工程的過程中,我把 ASP 做的很熟練了,而且還學了簡單的美工以及用 Javascript 做一些簡單的動畫效果.

也許最後你想要問的是,我是不是一個人做打掃工作做到退伍.答案是接近了,即便是我升到下士了,我還是得掃廁所.若你當過兵,你應該很少看過下士在掃廁所的吧.即便是我的工作感覺上越來越重要了,但我還是得每天掃廁所倒垃圾,一直到離退伍的二個月左右,單位裡才來了一位士官班剛畢業的年輕新人.因此,我退伍前是有人幫助我的.我這樣的當兵經驗應該是相當少見,不僅學到了網路工程也熟練了寫網頁程式,更利害的是掃了近二年的廁所和清潔工作.至少我這樣的際遇沒有發生在跟我同梯的朋友上,近兩年的當兵生涯,身體勞累不敢說有,心裡壓力比較大,因為你不會希望在重要的時刻來個主機當機或是網路斷線.現在回過頭來看,當兵這段時間真的是我的 IT 人生起點,也是把我從機械系的畢業生變成是一個 IT 人的起點.

Share:

#54 資料庫的 Transaction (交易) - ACID 基本介紹

在關聯式資料庫 (Relational Database) 裡,Transaction 是一個極為重要的特性,或許也可以稱為功能.若我印象沒記錯,Transaction 在台灣的書藉裡普遍翻譯成 "交易".雖然覺得用 "交易" 來表示蠻奇怪的,但也只能將就這情況,畢竟這翻譯詞已存在很久了.基本上而言,一個 Transaction 是指用戶端傳送給資料庫引擎所要執行的動作.這些動作通常是以 SQL 語法組成,然後再由資料庫引擎來解析語法,轉成各式各樣的動作來執行.比如,用戶端傳來了一個 Update Table1 set Column1='some word',這個語法是告訴資料庫引擎去尋找 Table1 的表格,然後將這個表格裡 Column1 欄位的內容改成 'some word'.這個語法本身就是一個 Transaction,其本身的特性需要有足夠的單獨性,一致性,持續性以及不被干擾的特質,也就是市面上書藉裡常提到的 ACID.這些特性是在 1980 年代一位著名的學者 Jim Gray 所提出,後來再經由其他學者加以擴展而成現在所看到的 ACID.

  • Atomicity: 這指的是單獨性.比如,一個 Transaction 裡有一個 Update command,一個 Delete command.如果 Update command 成功了而 Delete command 失敗了,則這個 Transaction 便是失敗的,所以 Update command 必須回復修改過的資料.
  • Consistency: 一致性代表的是在 Transaction 執行前後,資料皆處於合乎所有規則的狀態.例如,某個欄位具有 foreign key 的關係,其資料的內容不是能隨意產生的,必乎符合 foreign key 的關係,所以 transaction 在執行後,這樣的關係必需持續下去.
  • Isolation: 這指的是不同的 Transaction 之間執行時不能被彼此干擾.假設有兩個 Transaction 在同一時間對相同的一百筆資料進行更新動作,而其中一個 Transaction 在更新到一半時產生錯誤,於是進行資料回復.然而,另一個 Transaction 是完成的.可想而知最後的資料狀態一定是無法預測,因為不清楚那些資料是失敗的 Transaction 做資料回復的,還是成功的 Transaction 所更新完成的.
  • Durability: 我將它稱之為資料的耐力.資料庫引擎必須要保證一旦 Transaction 完成後,不論發生任何事情,如系統當機或電力中斷等,運作後的資料都必須存在於儲存媒介中,也就是在硬碟裡.

一個商業化的關聯式資料庫都必須提供這些特性,因為一個強大的資料庫引擎需要服務很多的用戶端,因此這些特性不只要提供,而且得做的夠好才能夠在市面上生存.未來的文章裡將會介紹更多的主題來說明資料庫引擎是如何達成這些功能.

接下來,讓我們用一些符號來說明 Transaction.

一般來說,使用 T 來表示 Transaction,而RT(O) 代表 T 要對 O 進行讀取的動作,WT(O) 就是代表 T 要對 O 進行寫入的動作,其中 O 代表的是資料庫裡某個儲存單元,例如表格.

Transaction 的完成的結果只有兩種,一個是成功 (Commit),另一個是放棄 (Abort).Commit 代表的就是 Transaction 裡的每一個資料的讀取和寫入都是成功的,而 Abort 代表的是 Transaction 裡並不是有所有的資料讀取或寫入都是成功的.在符號上則使用 CommitT 來代表 T 是 Commit 結果,用 AbortT 來表示 T 是 Abort 結果.也許你查不同的書藉會有不同的表示方法,但這不會造成影響.介紹這些符號的目的是為了未來說明 Transaction 的動作時,可以用簡單的符號來代表一些事情.例如,


這代表了系統裡有兩個 Transaction, T1 和 T2,其中 T1 進行的動作是讀取A,寫入A,讀取B,寫入B,最後的結果是 Commit.表格裡的每一行代表同一時間上所做的動作.因此,這一個例子是不合法的,因為不能有兩個 Transaction 在同一時間對同一個物件做寫入的動作,這違反了 Isolation 的特性.

一個資料庫引擎的效能往往也由它對 ACID 特性的執行速度來決定.你可以發生問題都是發生在寫入的動作上.因為寫入代表刪除或更新,這將改變了資料庫內的資料狀態.如果你有一個資料庫只需要提供讀取而沒有寫入,那麼 ACID 特性對資料庫引擎而言就沒什麼意義了.
Share: