星期五, 5月 25, 2007

現實

面試,總是那麼現實!
不論再有熱沉、多麼誠墾,人家要的是你的能力,是你的表現。
因此,被選上的總是那批人。


能者不斷進步,不長者少了許多磨練的機會。

每次沒應徵上工作人員,心情總是那樣低潮,恨自己無能,也怨別人為何不給自己機會。
可是,反過來想,在我應徵上網管、系統組工讀生時,那些沒應徵上的,感受又何嘗不是如此呢?

知識是我的長處,也許別人會羨慕我的能力。但,我又何嘗不羨慕別人呢?
每當他人說得幽默、接話接得漂亮、風趣、展現出逼真的演技,我總是自嘆不如。我也很想輕易地取悅他人阿!我也想表現出風趣的一面阿!

只是,誰教過我這些呢?

從小到大,只有人教我怎麼讀書,該有的態度是什麼,諸如此類。
沒錯,我做到了!可是,這些代表了什麼?

人與人之間的應對,更為實際,也更加重要吧!

我真的覺得,只會讀書,真的不算什麼!
能夠一展自己的才華,才是最重要的吧!

那麼,又何必要求孩子一定要認真在書本上呢?

那的確的義務,是身為學生的責任。但是,該學的,不是只有知識阿!
但父母教給了孩子多少他們的經驗呢?

星期三, 5月 16, 2007

ADT - Abstract Data Type

受到 C# 的薰陶,一時間忘了 ADT 另一層的函意。今天在《Fundamentals of Data Structure in C++》中看到一段話:



The specification, which must be contained inside the public portion of the class definition of the ADT, consists of the names of every public member function, the type of its arguments, and the type of its result (This information about a function is known as its function prototype). There should also be a description of the function does, which does not refer to the internal representation or implementation details. This requirement is quite important because it implies that an abstract data type is implementation-independent.


一個完整的 ADT ,不僅要符合 Data abstraction 及 Encapsulation;更重要的是,它必須與實作無關。

ADT 著重於形態的抽象概念,而不是如何實踐此概念,因此 ADT 每一個 member function,只需說明此 function 能做什麼、該做什麼,而不必明定此 function 該如何做。

譬如說,一個 bignumber ADT 包含 add 此 member function。設計者只管以註解說明它的功用(對兩個 bignumber object 做相加),至於如何相加,相加後如何維護,皆與設計者無關。這些實作上的細節,是為實踐這些抽象概念的 programmer 才需關注的。

總之,ADT 是一種概念的陳述、一種規格的規範。它提供下一層設計者一些概念、一些介面標準,有助於設計者完成此 Type。但 ADT 絕不必提供任何實作上的資訊,就好像某 ADT 的使用者,絕不必了解它如何被實作出,只管此 ADT 代表什麼概念、提供了哪些功能。

星期四, 5月 10, 2007

[轉貼]立場不必中立,態度必須公正

孫效智老師上課時曾說過這句話「立場不必中立,態度必須公正」(impartiality does not imply neutrality),解釋如下:


為接近慎思明辨的理想,生命教育的時事評論必須秉持「立場不必中立,態度必須公正」的原則。前者是說,倫理思考者不應該害怕採取立場,彷彿不認同任何立場就是最好的立場。事實上,這樣的立場與鄉愿無異。生命教育觀點在倫理議題上必須有立場,而且其立場在不該含糊的地方就不應含糊。不過,有立場不表示永遠固守特定立場。這就談到了「態度必須公正」。公正的意思是說,人雖然應該有立場,但對於另類的思想也應該保持傾聽的態度,並對自己所採取的立場保持一種允許反省的距離。人能反省,就不會僵化固執;能傾聽,就有機會明白不同立場背後的論據或動機,而這樣的態度使我們在自己原本的立場與別人不同的立場之間,比較能保持動態的平衡而更接近倫理的真理。

星期一, 5月 07, 2007

delegate

delegate 是 C# 中宣告函式形態的機制。也就是說,我們可以自訂一種型態,用來儲存一個函式。這樣一來,我們就能把函式當成參數,在 function﹝method﹞ 之間傳遞。


在 C++ 中,是以 pointer to function 實踐,而函式引數稱之為 function object ﹝functor﹞。就這方面來說,C++ 比起 C# 要來的複雜些,但在概念上大同小異。

至於 delegate 的功用,主要在實踐 function 多樣性的同時,仍維護住 encapsulation。也就是說,不論外部有何更動,都不影響到這些 function 的運作﹝function 內容仍維持不變﹞。

思考以下狀況:沒有函式引數之前,要以一個 sort function 針對不同比對規則排序,該如何做?一個可行的方法是這樣的:先定義好許多 compare function,並給每個 compare function 相對應的代號(字元或整數)。而在使用此 sort function 時,多傳遞一作為代號的參數,而 sorting 時就根據此代號判斷要用哪個 compare function 來 sorting。如此一來,就能達到目的 - 一個 sort function 能針對不同比對規則做排序。

然而,這樣的方式有個重大的缺點:當我們創造出一新的比對方式時(也就是增加了一個代號),我們必須更改原函式(例:增加一個 if),讓它能識別此代號,並使用對應的 compare function 做排序。這樣一來,一旦有新的比對方式產生,不僅原程式需要更改,連 sort function 內部也必須更動,而這大大增加了 maintain 的難度。

因此,我們希望能有一種方法,不論增加了多少比對方式,原 sort function 都能維持不變,而 delegate 正回應了此要求。

delegate 的語法如下:

delegate return_type function_type_name ( parameter );


定義完 function_type 之後,就能以此 function_type 宣告 function 變數。只要某 function return type及 parameter 與 function_type 中的一致,此 function 就能被儲存在此變數中。因此,以 sort function 排序時,只要傳遞此 function_type 的變數,不必經由 if 判斷,就能得知要以哪個 compare function 來 sorting。

舉個例子,假設有個 sort function 要對字串排序,則我們的 compare function_type 應該如下:

delegate bool strcmp (string s1, string s2);


又假設我們有以下幾種 compare function:

bool ascii_cmp (string s1, string s2) { //... }
bool size_cmp (string s1, string s2) { //... }
bool other_cmp (string s1, string s2) { //... }


由於 ascii_cmp、size_cmp、other_cmp 的 return_type 及 parameter 都與 strcmp 一致,它們都可以被儲存在由 strcmp 宣告出的變數之中,如:

strcmp cmp1 = new strcmp (ascii_cmp);
strcmp cmp2 = new strcmp (size_cmp);
strcmp cmp3 = new strcmp (other_cmp);


接著,我們只要讓 sort function 能接收一 strcmp type 的變數,就能達成我們要的比對規則,如下(以簡單的 bubble sort為例):

void string_sort (string[] array, strcmp cmp) {
for (int i = 0 ; i < array.Length ; ++i) {
for (int j = 0 ; j < array.Length - i - 1 ; ++j) {
if (cmp (array[j], array[j + 1]))
swap (ref array[j], ref array[j + 1])
}
}
}


從以上可知,使用 function_type 宣告出的變數就如同使用一般 function。

星期四, 5月 03, 2007

感慨

沒跑資工營,少了許多負擔,也因此我才能在大家忙不過來之時,還大喇喇地玩遊戲。25學分的確不少,但對我而言,還不至於沉重。也許別人修的課不比我多,但資工營加上雜七雜八的活動,時間要來得緊湊。


有時候在心裡想,明知自己應付不過來,為什麼還要跑這麼多活動呢?雖然這麼想,多少還是會羨慕的。

從活動學到的東西,經常多過於從課業上學得的!

最近看同學三不五時就要開會,還有不少作業要做,心裡鬆了一口氣。但回過頭看看自己,是不是過得太悠哉了呢?

早上出門,總是要八九點才能回寢室好好休息,但從八點到十二點,時間還是很多的。加上假日很少回家,充分利用的話,不用擔心事情做不完。而打工,網管平常沒什麼事做;計中系統組事情雖然多了點,但還不至於忙不過來。開學時的顧慮,是多餘的。

該說我善於管理時間嗎?從某方面來說,我的確很會利用時間。也因此在我習慣這生活節奏時,時間又多了!

如果不找點事做的話,會怠惰的!

「悠閒時總是想多找點事做,但一旦忙碌又抱怨事情太多」

人,就是這麼矛盾阿!