2022年3月26日星期六

物件導向

編程語言,由最初第一代的機械語言發展至今,經歷了多次「革命」,眾多的編程語言之間互相參長補短,到今天,絕大部份的編程語言都加入了物件導向(Object oriented)的元素。物件導向編程語言,相比之前的非物件導向編程語言,能令程式員更容易建立複雜、更高質素的軟件,而物件導向這個概念,亦能給我們反省現今的主流思想是什麼。

物件導向的核心概念,是在電腦內以軟件模擬現實世界裡的一些事物,跟著程式員便把事物的關係和互動,以程式表達和執行出來,進而執行了我們期望的運作,和得出我們期望的解答。電腦內軟件化的物件之間,互不相干,便以訊息互相要求另一物件執行某運作。就這個概念來看,便好像現代的主流思想,每個人都是不同的個體,有著不同的思想和價值觀,如果你想别人去為你做些什麼,便要跟他發出要求,之後被要求的便會執行你的要求,最後將結果交給你,期間便不要過問被要求者怎樣去做。由此可見,物件導向的概念,和現今的個人主意一致,不謀而合。

如果某一編程語言可以稱為物件導向,便要具備三項特質:繼承性(Inheritance)、封裝性(Encapsulation)以及多型性(Polymorphism)。

物件導向所提出的繼承性,是一個新類别可以基於一現有類别而發展出來,概念便和父子相傳相似,例如父親有某些特性或做法,其子便亳無疑問繼承了所有特性和做法,有需要時更可以進一步改變或自行修改。某些編程語言支援多重繼承,而某些則只支援單一繼承,如果是多重繼承的,便好像一個孩子同時由父母繼承其特點和做法。

至於封裝性,在編程來說便是某一個運作的內部運作,不應讓外界得知,旨在令內部運作不會被外界影響,令軟件出現問題。而封裝性給我們的反省是,我們做某些事時,我們都不希望我們的做法讓其他人知道,就算我們是被其他人要求去做某件事,我們做好了便是,除非必要,我們都不想把細節告訴别人,也許這便是現代人的個性吧。

而多型性更是有趣,其意思是當軟件運作時,某一軟件化的物件被要求執行某個運作,該物件是可以根據自己預設的做法去執行,要求者未必知道該物件實際上是怎樣做的。這件好像當一部門主管要求不同同事去做同一件事情,每位同事都可能用不同的方法去做,例如某些的做法是在某時某地方所學的,某些則可能是自學,每一位同事的做法從何而來不是重點,主管只須知道每個人都可以把事情做好便是,試想如果每位同事的做法都要由主管監督,整個部門能做到的事情也有限了。

明白物件導向的概念,可令我們反省我們現代人的思想,檢討一群人合作時的情況,而如果學生要明白為何物件導向為何如此定義,先想想真實世界的情況,便可以有更深入的了解。

2022年3月19日星期六

何謂安全

近年資訊科技界經常被廣泛報導的,是一次又一次的資訊安全事故,因此,我們必定要對資訊保安科技有更深入的認識。

在資訊保安的範疇裡,有三個很基本的要點,包括機密性(Confidentiality)、完整性(Integrity)和可用性(Availability)。簡單來說,機密性指資訊不能被不受授權者使用,完整性是指資訊不能被修改或修改後便能立即被發覺,最後,可用性是指某資訊可被使用的程度。用最簡單的語言來解釋,機密性是指資訊能否被别人偷看或偷到,完整性是指資訊能否還原和不被修改,而可用性則指是否方便使用資訊。

這三個要點有趣的地方是互相牽制,實際上只能盡量令他們平衡,意思是如果某一要點提高了,其他一個或兩個要點便會被拖低。例如如果想要高度機密性,生活上便是把該資訊或東西放在高度設防的地方,例如「夾萬」裡,但可以想像要使用時便更加麻煩,即可用性便降低了,同樣,如果想提高一部電腦的機密性,最明顯的方法便是停止了這部電腦的網絡,既然電腦長時間是離線,當然是最安全,但是可用性便接近零。

讀者未必涉足資訊科技界,但是其實我們每個人都要使用電腦(包括手機),有時也要處理一些機密的資料,所以我們的得考慮這三個要點。通常完整性的問題不大,要考慮的便是要平衡機密性和可用性,如果可用性高,機密性便會低,反之,如果機密性高,可用性便會低。

我們做某事情時,如果覺得這做法很機密,便要問一問自己,這樣機密,會否不方便使用。而我們現在經常遇上的情況是,我們能很方便地使用電腦、手機以及資訊,其實機密性便會低,是很危險的。最明顯的例子便是手機,我們把我們的信用咭輸入至手機,每當我們購買App時便不用再輸入,很方便,另外,手機裡的Facebook,電郵用戶名稱和密碼都儲存在手機裡,而且手機裡的App隨時可以使用,跟著如果手機由閒置回到使用模式時,不用輸入密碼便最方便,近年網上的雲端硬盤可以同步電腦和手機中的檔案,方便得很。但是有否想到,手機裡有信用咭號碼,用戶名稱密碼,電腦裡的檔案等等,其實用戶所面對的保安危險很高,機密性很低。

記著,越方便,越應該擔心。

2022年3月12日星期六

適者生存

科學家創造電腦的原因便是為人們解決問題,而計算機科學便是不斷提出新的算法,希望可以幫助人們能有效的解決問題;而當中有一個很有趣的算法便是遺傳算法(Genetic Algorithm)。 

不用給這個算法的名字嚇怕,其實說穿了,其背後理念便是基於大自然的遺傳和進化的理論,大自然在變,生物置身其中便是要盡力生存下去,方法便是由上一代遺傳了求生本能,而在上一代交配所生產的下一代,便選擇性從父一方或母一方遺傳最適合生存下去的基因或本能,最後,新一代亦有可能會突變,令新一代更適應和更有能力生存下去。

遺傳算法便是採用大自然這套適者生存的理念,希望能找到某問題最適合的解答。做法是先有一個客觀的方法決定某解答的適合度,跟著在開始時,便有某個數量,不同的預設解答,之後便逐一解答去計算適合度,如果解答已達某適合度,便當找到了解答,否則,如果沒有一個解答達適合度,某些過於不適合的解答便會被放棄,之後某些存下來的解答,便會由一對對的解答推算出新一個解答,可視為下一代,而某些新一代更會突變,即解答的某一小部份給改變了,跟著這一代便會再次為每一個解答找適合度,一代一代的找下去,直到找到達合適度要求的解答為止。

遺傳算法給我們的啟示是,原來生物能適應環境的轉變,便是因為有遺傳,交配生產更出色的下一代和突變的能力,另外,同一個問題未必只得一個解答,如果我們對某個問題有固有的解答或想法,我們應看看别人會否有另外的解答或想法,如果有,我們應嘗試基於自己和别人的解答或想法,想想有否互補不足的地方,從而得到一個更好的解答或想法。所以,我們任何時候都應保持開放的心態,不要固執自己的想法。

另外,就算沒有其他的解答,我們也可以間中想想自己的解答或想法,會否有可以改善的地方,便好像生物的突變一樣,可能得出來的解答或想法是更好的,更適合現況呢!

計算機科學看似高深莫測,其實很多都和其他範疇的知識互補不足,只要明白其他範疇的實際情況,對應的計算機科學理論其實並不難理解。

2022年3月5日星期六

異常人生

在編程的世界裡,異常是指程式運行中出現一些異於尋常的處境,例如記憶體不足,沒有權限來連接網絡,想讀入的檔案不存在等等。程式語言讓程式員宣告某些運作有機會產生某些異常,而如果程式須要實行這些運作,程式便要預先宣告如果異常真的出現時,將會怎樣處理。而處理的方法主要有兩個,第一個便要宣告如果這異常出現,程式便會執行某些補救運作,又或這個實行這個運作的程式,便要宣告自己同樣會出現這個異常。以上的描述好像很複雜,但是這做法其實在我們的日常中也有類似的處境,聽罷便會想到,原來編程和實際生活原來很相似。

試想辦公室裡經理交托秘書影印文件,但是秘書很忙,所以她再交托辦公室助理去影印,跟著她發現原來這個助理影印,有機會變成了去碎紙,這個有機會拿文件去碎的,便是生活裡的異常。因此秘書會去想,如果真的要交托這助理,便要有心理準備會有碎紙的異常,如果助理正常地去影印,當然沒有問題,秘書也可以正常工作,但是如果這助理真的發生了碎紙這異常,秘書便有兩個選擇,第一個選擇是想辦法去補救,例如另有版本可以找來影印,另一個選擇便是秘書要向經理宣稱交托她去影印,(因為她再交托助理)也是會有機會變成碎紙。對於經理來說,如果秘書是前者,經理可以放心讓秘書去影印,因為不論有問題與否,秘書也會解決;如果秘書是後者,經理也是交托一個有機會影印變碎紙的秘書,所以同樣,如果秘書能正常的影印文件回來,經理便可以如常工作,但是如果秘書真的發生了影印變碎紙(雖然是助理所為),經理也有兩個選擇,一是當異常發生,他便自行去影印好了,又或他自己也宣稱有機會影印變碎紙。對於現實中的經理,影印變碎紙可能對工司的運作影響不大,但是對於程式,運行中的程式便會因異常終止了。

由此可見,原來編程中的異常處理,和現實世界中將事情交托關係是很相似的。當我們明白現實世界的運作時,我們便可以更清淅的了解編程裡的理念。反過來說,編程中的異常處理,給我們的啟示是,如果我們要交托一些事情給別人去完成時,我們便得預先想想所交托的人會否有機會出錯,如果會的話,我們能否補救,如果不能,我們才身想做的事便做不到,可以嗎?又或我們能否向交托我們做這件事的人預先聲明,我們有機會不能完成呢?

千言萬語

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