2022年1月29日星期六

緩衝之道

在電腦的硬件和軟件的設計上,也會應用到一個很簡單的概念,便是使用緩衝區。簡單來說,緩衝區便是一個特別的地方,通常是設於兩個不相容的部份之間,作為這個部份的中間人。

最明顯的是電腦的處理器內便有一種特別的記憶體,通常名為Cache,它便是設於處理器的運算部份和電腦的主要記憶體之間。處理器的運算部份運作得很快,但是如果每每到主記憶體去提取資料,記憶體的運作速度是跟不上處理器的速度,如果這個問題不能解決,高速的處理器運算部份,便會被主記憶體拖慢,電腦的整體運作效率也因此大大降低。為了解決這個問題,電腦科學家便提出使用一種比主記憶體為快,但價錢較高的Cache記憶體,放置在電腦處理器之內;因為這種記憶體成本高,所以容量不大,通常由1M到8M之間,相對於主記憶體的容量由4G到32G之間,容量實在不是很高。

當電腦處理器運算部份處理數據時,數據會先由主記憶體抄到處理器之內的Cache,之後處理器的運算部份便只會處理這裡的數據,處理完成之後,Cache內數據便會抄回主記憶體內。主記憶體和Cache之間的數據運送速度,比每次由處理器直接到主記憶體提取的速度為高,而Cache的設計和位於電腦處理器之內,令處理器內的運算部份能高速提取數據來處理。由此可見,Cache同時以最好的運作模式和主記憶體和運算部份整合,間接令這兩個部份「看似」一同運作。

軟件的開發方面也有應用差不多的技巧。例如某一軟件要將數據寫到硬盤上的某一擋案,如果軟件寫每一個位元(byte),電腦也真的將它寫到硬盤上,硬盤要轉動磁碟,移動讀寫頭,這個運作相對電腦的運作來說是非常慢的,所以這樣做會大大降低電腦的效率。因此,在開發作業系統時,每當應用軟件要開啟某個擋案來讀寫,它便會在記憶體內設置一個緩衝區給這個檔案。如果軟件要寫數據到檔案去,作業系統便會先把數據寫在記憶體之內,直到這個緩衝區也寫滿了,又或軟件要求作業系統把數據寫到硬盤上,作業系統才真正將整個緩衝區內的數據寫到硬盤上。這樣,軟件既不用等硬盤的運作,作業系統亦可以把每次讀寫的數據量盡量提高,從而改善電腦整體的運作。

其實在我們日常的生活裡,也有不少例子是運用了緩衝區的理念。最明顯的便是我們的錢包。我們的錢放於銀行之內,如果我們每花一元,也要到銀行或提款機去提款,那麼我們每天不知要花多少時間在銀行之內。因此,我們身上便有一個錢包,每次我提款,便提取能足以花某一段時間的金額,期間我們便只會從我們的錢包拿錢出來花。我們從我們的錢包拿錢出來,效率很高,而每次我們走到銀行或提款機拿錢,之後放在錢包內,所花的時間也是有限的。由此可見,我們本身和銀行或提款機之間,我們的錢包其實便是一個緩衝區。再宏觀一點,我們作打工仔的,錢是從顧主而來,我們不可能每次花錢的時間,才走到顧主「出糧」,在我們和顧主之間,這次銀行便是兩者之間的緩衝區了。

緩衝區的應用能令兩個不相容的東西連結在一起,試想想我們的人生,是否也在某些方面也需要某種緩衝呢?對於在職人士,尤其是自顧人士,他們的收入可能是不穏定,但是他們每天的開支卻是差不多固定的,所以在這兩者之間,我們也得找一個緩衝的方法,而想一想,這個緩衝區便是我們的儲畜了,我們能否平穏生活,還是朝不保夕,便要看我們這個緩衝有多大了。我們在工作上被要求以少做多、提高效率,而在私人家庭生活裡,我們卻期望能舒服一點、節奏慢一點,所以我們也得去想想,在這兩者之間,我們能怎樣緩衝,也許我們得善用交通時間,在上班時漸漸將自己的節奏加快,而到放工時,我們也要好好善用時間給自己放鬆下來,如此,我們的工作和家庭生活才不會互相影響。

人生的緩衝也許不是只為了提高效率,而是要讓我們生活得更舒適、更長和更健康。如果覺得生活得不太理想,試想想有否需要找個方法來緩衝吧。

2022年1月22日星期六

知識之源

我們的生活和電腦息息相關,由早上起床開始,我們的一舉一動,其實也會有電腦在記錄,例如我們出門口乘撘升降機的時間,利用八達通使用交通工具,到商店以信用卡或以八達通來付款,我們無論身處何方,我們口袋裡的手提電話便會跟最近的發射站接上,變相是把我們的手機(亦即是我們)的位置留在電訊商的紀錄裡。這次我不是想討論私隱問題,而是想談談當一些機構記錄了我們的行為之後,他們可以做些什麼?

在計算機科學裡,有一門學問便是去從眾多客戶的數據之中,推算出有用的資料,為的是將來能作出更適合客戶的服務。這門學問名為數據發掘(Data mining),近年亦流行了另一個字眼,大數據(Big Data),這門學問便是要在海量的數據量找出知識,所以又有另一個相關的用語,機械學習(Machine Learning)。

數據發掘中的關聯規則(Association rule)便是用以找出數據中的事項的關係,例如著名的星期五買啤酒尿片現象:超級市場利用數據發掘技術,研究客戶購物的習慣,他們發現在星期五當天,很多人同時購買啤酒和尿片,因此,超級市場便可以把售賣啤酒和尿片的位置放在附近。

關聯規則定義了兩個數量,confidence和support。confidence的定義是在所有事項裡,甲事項和乙事項同時出現的次數,在所有事項裡甲事項出現的次數的比例(或百份率)。而support的定義是甲事項和乙事項同時出現,在所有事項中的比例(或百份率),當這兩個數值都是高於某預先設計的值,我們便宣稱甲事項和乙事項為有關。

以下是一個例子,在一千次事項之多,甲出現次數為十次,而甲事項和乙事項同時出現為八次,那麼confidence是80%(八次甲和乙一齊出現,除以甲出現了十次),而support則是0.8%(八次甲和乙一起出現,除以所有事項一千次)。

有沒有想過我們生活之中,其實有時也用了這關聯規則來認知我們身處的世界?例如有一位女性,他的男朋友是一位保險經紀,所以他每天午飯都是和不同的客戶進餐,例如一年之中,便和二百個客戶進午餐,而當中便有一百個女性客戶,另外,當年便和某女性客戶進了兩次午餐,如果以甲事項為男朋友和女性客戶進午餐,而乙事項為男朋友和某女性客戶進午餐,根據以上定義,confidence是2%而support是1%,由此可見,這位女性不用擔心其男朋友和那女性客戶有什麼「關聯」。

但是如果換上另外一些數字,例如那女性的男朋友是一位於辦公室工作的職員,他每天都和同事外出進午餐,一年裡的二百五十個工作天,便有一百五十個工作天只和一位同事進午餐,而當中和同一位女同事進午餐的日子便有一百個工作天,如果用相同甲乙事項定義,男朋友和這位女同事共進午餐的confidence和support分別是66.7%和40%。如此,這女性真的要擔心她男朋友和這女同事是否有什麼關聯。

舉另一個例子,例如某兩個頑皮學生會在課室內搗亂,某學年裡AB兩個學生上了一百堂,都是搗亂了十次,學生A在所有十個科目都會搗亂,而學生B則只在某一科目搗亂,如果以甲事項為學生搗亂,而乙事項為當時為某一科,學生A在某一科搗亂的confidence和support為1%和1%,而學生B在他會搗亂的科目的confidence和support為100%和10%。由此可見,學生A搗亂和上那一科目無關,而學生B搗亂和上那一科目較明顯有相關,至於學生B為什麼會在那某一科目搗亂,則要老師繼續跟進了。

我們的心目中不會真的去計算confidence和support,但是卻會去主觀性以所見所聞去改變confidence和support,到了confidence和support到達某一點時,便會作出某一推論,跟著便會嘗試找出原因。數據發掘便是以方程式量化了我們心中主觀的學習識知模式,相當有趣。

說了那麼多,其實只是一句,數據發掘告訴我們,如果某兩件事偶一出現,只是個別事件,不能代表這兩件事有關,但是如果這兩件事一同出現的次數越來越多,這兩件事定必有其關聯,慢慢我們可以這關聯作為一新知識,至於其背後原因是什麼,則須要當事人去思考了。

2022年1月15日星期六

人生死鎖

相信讀者都曾遇過使用電腦的時候,電腦好像「傻」了,按鍵沒反應,雖然滑鼠能動,卻點擊什麼都沒有反應,最後可能只得重新啟動電腦,但啟動後又好像沒有什麼補救方法,惟有希望同樣的事情不會發生。

當電腦沒反應時,通常有兩個可能原因,第一個原因是電腦正讀寫大量數據到硬盤上,尤其是因為電腦同時間運作了大量軟件,而又需要在不同軟件之間切換,所以作業系統便得不斷將不同軟件所佔的記憶體寫入硬盤或由硬盤讀出。當這現象發生時,電腦的硬盤指示燈會不停閃動。

另一個原因,便是因為某一運行中的軟件正在等候另一電腦內的事件發生,例如另一個軟件使用完某硬件,或完成其工作,但是又等不著,又不知要等多久,所以電腦既沒反應,硬盤指示燈亦不會閃動。但是為什麼這軟件等不到那件事件發生呢?可能那事件亦在等另一電腦的事件發生,一個軟件等另一個軟件的完成,如此類推,可能最後一個軟件所等的事件,便是為首的第一個軟件完成工作。換句話說,電腦內的某些軟件互相等待另一軟件完成或其運算結果,最後是當中所有軟件都是在等另一個軟件,結果是沒有任何一個軟件可以開始運作,所有軟件都停下來了。在計算機科學裡,這現象稱為Deadlock(死鎖)。

試想我們人生之中,是否在某個時空,也是處於一個「死鎖」的情況下?例如有人會這樣說:「我想如果我買不到樓,我便不能結婚;同時,如果只是我一個人的力量,我也買不到樓,所以我相信我要和我另一半一同工作,才有能力儲到首期和有能力支持供款。」細心去想想這句說話,結婚的先決條件是買樓,但是買樓的先決條件卻是結婚,那麼這個人會怎樣,而結果又會是怎樣呢?你可以想像得到,這個人既買不到樓,又結不到婚,什麼都不做,但卻每天都跟自己說他不是不做,只是等「情況許可」下才開始做。

那麼當我們遇上「死鎖」的情況時,我們可以怎樣做呢?作業系統的知識教導我們,解決「死鎖」的方法有兩個,「避免」和「打破」。「避免」的方法是,如果當電腦某一個運行中的軟件需要等待另一件軟件完成或運作結果,電腦會先檢查如果讓這軟件去等待,會否形成「死鎖」,如果不會,電腦會讓這軟件去等,否則,電腦便會禁示這軟件去等,很大機會這軟件便會顯示錯誤訊息,告訴使用者,這樣做雖然會令某些軟件不能正常運作,但這至少不會令電腦「死鎖」。另一個方法是電腦經常性檢查是否有部份軟件已形成「死鎖」,如果有,便會終止其中一個軟件,這樣其他軟件便可以順序啟動運作而最終完成,這至少令大部份軟件可以運作。

將以上解決方法應用到人生之上,也可以避免人生出現「死鎖」的。例如當一個人在計劃去做一件事前,如果是有先決條件,便看看那先決條件是否另有先決條件,如此類推,到最後會否反而在等現在要去開始做的一件事,如果是,眼前這件事是不應開始的,自己的想法也有問題,要看看每件事的先決條件是否必要的,找出一件事的先決條件是不合理和不需的,便開始去做。例如以之前所提的「買樓、結婚」來說明,當想到「要另一半一同合作才能買到樓」時,便要去想,其實這兩件事的先決條件是否必然的,「買樓才結婚」和「結婚才買樓」。如果跟情人談過,其實不買樓也可以結婚吧,那麼便先結婚,之後才合力開始儲錢買樓,又或原來自己一個人也可以買一個較小的單位,那麼便努力先買一個小單位,才去想結婚的事。

至於「打破」的方法,是當你覺得人生有很多事情想做,但是卻苦無頭緒如何開始,想想是否已經出現「死鎖」的情況,如果是,想想那一件事的先決條件是不合理,或至少可以放棄的。又以以上「買樓、結婚」的例子,當想到自己正處這兩難時,這兩件事都有先決條件,便要去想那一件的先決條件可以改變或放棄的。

人生走入「死鎖」的情況,可能便是我們常說的「走入了死胡同」或「鑽牛角尖」,是很浪費心力和時間的。如果你覺得你正處於「死鎖」,想想如何去解決吧,否則,你永遠都是原地踏步。

2022年1月8日星期六

一心二用

我們希望電腦能有更高的效率,電腦科學家便不斷提高電腦處理器的運作頻率,但是在當時的物理極限令電腦的處理器不能無止境的提高,因此,電腦科學家便想到以下的這一句話:

如果不能令電腦快一倍,令它同一時間做兩件事。

這個做法背後有一個假設,便是當電腦同時處理兩件事時,處理每件事的效率不會因此有明顯的影響。意思是如果電腦只處理這一件事,需時十秒,如果同時處理多另一件事,需時理論上是會增加的,但絕不能是因此花多一倍時間,否則便失去意思了,例如多花一秒半秒是可以接受的。

活在一個繁忙的的世界裡,其實我們都要求自己或被要求用更少的時間來完成更多的工作;我們只是人,不是電腦,不可能把效率不斷的提高,所以以上的這句說話便正好給我一點啟示。如果我們不能再提高效率,把手上的事盡早完成,我們便同一時間做兩件事吧。我們明白,我們實際上是不能同時間處理兩份文件,看兩份報告,所以我們實際上是以另類的方法來同時做兩件事。

我想到第一個例子,是我小時候家中浴室內安裝了一部電儲水式熱水爐,用法是要預先啟動熱水爐,它便會把儲在爐內的水加熱,大概要花十分鐘左右的時間才能把爐內的水加熱到足夠洗澡一次;所以我當時試過做完功課之後,便去發啟熱水爐,再等十分鐘便開始洗澡,每日便要白白的浪費十分鐘來等,不久,我便想到,在完成功課前十分鐘,我便去啟動熱水爐,如此我做完功課便不用等,即時便可以洗澡。其實這個做法,我便是同一時間做兩件事,一是做功課,二是等熱水爐準備好。

為了預先啟動熱水爐,我得在做功課期間,抽時間到浴室啟動熱水爐,所以我會因此遲了一點才能完成功課,即做功課的效率會因此而稍稍降低了。電腦其實也是一樣,因為電腦要在不同工作之間往返交接,所以效率上也是降低了一丁點,但是因為能完成的工作多了,所以也是值得的。

所以,要同時間做兩件或更多的事的方法,是盡早令其他人或事物開始去做我們的事,就像在我的例子裡,我要提早「告訴」熱水爐令它開始工作一樣。所以我們可以想想,在任何時候,我們是否有一些事可以盡早通知别人去做,盡早啟動某機制來開始運作,甚至是一些我們要等待它完成的工作,就讓這些事一同發生,我們將來要等待的時間便越少,我們的工作效率也間接地提高了。

但是記著這做法的先決條件,是每件同時做的事都是互不影響。所以如果有人以此來反對「學生不應談戀愛」,因為同時便可以完成兩件事,那麼你便得去問,學業是否和戀愛互不影響了。

2022年1月1日星期六

慾望無限

在資訊科技的發展歷史中,有兩位先驅說了兩句互相矛盾的說話,這兩句說話是,

Moore: "the number of transistors on integrated circuits doubles approximately every two years."

Bill Gates: "640K ought to be enough for anybody."

前者間接說電腦的運算能力會不斷增加,後者卻說當時的記憶體容量已足夠。事實證明,現代的科技足以實現摩爾定律,但想想由數十年前到今天,當時電腦的處理能力遠比今日的電腦低,我們不是同樣對著熒幕處理文書,究竟分別在那裡呢?

想當年,早期的電腦熒幕是單色的(尤以綠色為多),顯示是以文字模式為主(即熒幕分成某個數量的行和列顯示文字),使用者在鍵盤上按一個鍵,改變了記憶體裡一個記憶位置,便可以改變熒幕上一個字,而到打印出來時,和熒幕上所見到的完全不同;但是到了今天,文書處理軟件支援「所見即所得」(WYSIWYG : What you see is what you get),即是使用者在熒幕上看到什麼,便非常接近打印出來的樣式,另外,現代電腦全以視窗模式操作,界面優美,易學易用,另外,現代電腦可以讓使用者同時執行多個軟件,例如同時間看著電影,檢查電郵等等。

到了今天,電腦的處理能力更可以同時間執行多個作業系統,換句話說,一部電腦可以摸擬多部電腦。最近,Linux其中一個發展商Ubuntu,便正在開發一個新的手提電話系統,特别的地方是它利用現今手提電話的強大運算能力和連接顯示器的可能性,讓用戶將隨身的手提電話随時變成一部電腦。

由此可見,隨著電腦的處理能力不斷增強,人們便期望它可以處理更多的數據,完成更多工作,可見人們的慾望是無限的,而這個慾望便是推動著各方面的科技的發展。

我們生活在一個發展得快至難以想像的世界,亦沒有空去為將來思考,我們所能做的,便是順應世界的發展,抱著開放的心態去迎接未來,看看人們的慾望能帶我們走得多遠。

千言萬語

 電腦這個詞語,給我們的感覺是一件像我們人類腦袋的東西,擁有記憶,懂得思考,但是在英文原字Computer,其實只指是一部懂得運算的設備而已,能令一部只懂得運算的設備變成一部像我們人類般思考,懂得完成無數的工作,是隨著電腦發展而被研發出來的程式語言。到了今天,已經有數以千計的程式...