2008年9月18日 星期四

見人說人話, 見鬼說鬼話

剛出社會時, 朋友送了句話給我, "見人說人話, 見鬼說鬼話", 當時我覺得, 這句話沒什麼, 只覺得是朋友提醒我剛出社會, 朋友要我圓滑一點, 不要得罪人...
工作沒多久, 想起這句話, 才覺得它的含意更多, 工作上會遇到不同的人, 對於不同的人, 的確要用不同的 "話" 來說同一件事情. 一件事情, 對老闆必須要讓他快速了解原因, 結果, 影響. 對同事, 則要詳細說明過程, 處理方法, 和配合事項. 對下屬 則要讓他們了解執行步驟, 需要的結果...後來發現, 同一件事, 對同一個人, 如果時間地點不同, 說法也應該要不一樣...
後來轉去做業務, 這句話更是適用, 不同的客戶銷售方法一定不同, 這句話就跟性格分析 DISC的銷售方法, 不謀而合. 而同一個客戶對象不同, 銷售的方法也是大不相同, 簡單說, 你跟客戶主管銷售時, 主要應該是這個產品可以帶來的好處, 利益, 效能. 而不是技術規格, 詳細功能等等....
但是業務看多了, 也看到一些爾虞我詐, 某個程度來說也是這句話的應用, 一但這樣, 就很難了解對方真正的想法, 一個偶然, 在雜誌上看到一個短文, 裡面有一句話 "見山不是山, 見水不是水", 這句話打到我心坎裡, 如果能夠了解到對方說的 "話' 的最終含意, 而不只是表面上的話, 那麼才是有用的....這幾年不斷在學習...

最近這幾年,  隱約的看到些不同處, 似乎 "見山是山, 見水是水", 直接看透事情的本質, 利害關係, 才能夠更清楚的了解事實的真象. 後來我才了解 "見山是山,見水是水;見山不是山,見水不是水;見山仍是山,見水仍是水", 是禪學裡的一句. 
第一階段, 看見的是事情的表面(象), 所以"見山是山, 見水是水".
第二階段是反覆的追詢, 了解, 查証進一步了解事情的內含, 所以"見山不是山, 見水不是水"
第三階段是已經能夠直接了解事情本質, 不被外界不實言語迷惑.

傳統--實驗室的猴子

有朋友寄封Mail給我, 仔細想想...自己也常常陷入"傳統"的思維, 而不自覺, 就像那些猴子一樣, 只知道跟隨著前人的腳步, 而常常沒有去了解為什麼...

五隻猴子關在一個籠子裡,籠子上頭有一串香蕉,實驗人員裝了一個自動裝置:若是偵測到有猴子要去拿香蕉,馬上就會有水噴向籠子,這五隻猴子馬上會被淋濕。
首先有隻猴子想去拿香蕉,馬上水噴出來,每隻猴子都淋濕了;每隻猴子都去嘗試了發現都是如此。於是,猴子們達到一個共識:不要去拿香蕉,因為有水會噴出來。
後來實驗人員把其中的一隻猴子換掉,換一隻新猴子(稱為A猴子好了),關到籠子裡,這隻A猴子看到香蕉,馬上想要去拿,結果被其他四隻舊猴子海K了一頓,因為其他四隻猴子認為新猴子會害他們被水淋到,所以制止這新猴子去拿香蕉。這新猴子嘗試了幾次,被打的滿頭包,還是沒有拿到香蕉,當然這五隻猴子就沒有被水噴到。
後來實驗人員再把一隻舊猴子換掉,換另外一隻新猴子(稱為B猴子好了),關到籠子裡,這隻B猴子看到香蕉,當然也是馬上要去拿,結果也是被其他四隻猴子K了一頓,那隻A猴子打的特別用力,(這叫老兵欺負新兵,呵呵!)B猴子試了幾次總是被打的很慘,只好作罷。
後來慢慢的一隻一隻的,所有的舊猴子都換成新猴子了,而噴水裝置也關掉了,但大家還是都不敢去動那香蕉,但是他們都不知道為什麼,只知道去動香蕉會被人扁。

傳統不去反省它,就沒有價值!

"傳統" 並不是不好, 而是如果只知道跟著做, 而不知道為什麼要這麼做, 少了這樣的思考, 就沒有辦法改進, 沒有辦法有變化, 或許人類就不會再進步, 看過 "基地" 小說的人一定知道, 偉大帝國最後就是這樣的下場.
很多人可能都會覺得, 應該沒有這麼嚴重, 我又不是猴子, 不會這麼呆.... ^_^
可是事實上, 因為教育的現況, 和社會的影響, 每個人都有那些猴子的影子在, 不相信...那我舉幾個例子....

中秋節剛過, 相信都有吃到月餅, 但是為什麼中秋節大家都吃月餅 ??
在工作上, 也常常有很多不成文的規定或做法, 前輩總是告訴你, 照著做就對了 ?
走路要靠右走, 吃飯不能敲碗.....?? 
這些你可能天天都照做, 但是是否有想過...為什麼??

想看看下面更嚴格的看法...
系統工程師是不是常常只知道下了某個指令或是乾脆重開機, 系統就可以正常 ...?
程式設計工程師, 是不是現在都只用黑盒子, 而不再去了解黑盒子裡的運作 ...?
只知其然, 而不知所以然, 持續的這樣下去, 少了思考, 變化, 就少了創造, 而整個人的想法就會被限制住, 無法前進!!

2008年9月9日 星期二

JAVA 基本常數與變數

常數
Java中是透過關鍵字 final 來定義常數.
如:  final in example_int=123

變數
(1) 變數名: 區分大小寫, 不能以數字為開頭, 亦不能為保留字.
(2) 變數型別: 請參考下面不同型別之變數說明.
(3) 生命週期(作用域): 通常變數的作用域在 { } 段內. 作用域可分為, 局部變數, 類別變數, 方法參數, , 例外處理參數.
變數宣告格式如下: 
type identifier[=value][,identifier[=value]… ];

##ReadMore##

整數常數
十進制表示: 如 123, -456, 0...
八進制表示: 以 0 為開頭之數字, 如 0123, -0456
十六進制表示:  以 0x 或 0X 為開頭之數字, 如 0x123, -0X456
如需表示長整數之常數, 則可在數值後面加上 l 或 L 如, 123l,  -456L

整數變數
整數變量的類型有byte, short, int, long 四種.
byte: 長度為 1 byte.
short: 長度為 2 bytes.
int: 長度為 4 bytes.
long: 長度為 8 bytes.

浮點數常數
有下面二種表示方法,
(1) 由十進制數字加上小數點表示, 如: 0.123,  -4.567.
(2) 由科學表示法, xxxEyyy 或  xxxeyyy  其中, xxxx為數值, yyy需為整數值.
(3) 浮點數常數一般為高精確度的 double 值(64 bit), 若需表示為低精確度 float 值, 則可在數值後面加上 f 或 F, 如 0.123f, -4.567F.

浮點數變數
有float 和 double 二種, 下面表示他的精確度,
float 32 3.4e-038~3.4e+038
double 64 1.7e-308~1.7e+308

字元常數
(1)字元常數是用單引號刮起來的字元如, 'a', 'B',  支援脫逸字元如, \n, \r, \t...
(2)字元常數是以 2 bytes (16 bit)來表示 Unicode 而不只有表示 ASCII Code. 
\ddd 以八進制來表示字元.
\uxxxx 以十六進制來表示字元.
\\ 表示 '\' 字元.
\r 表示 return 字元.
\n 表示 跳行 字元.
\f 表示 下一頁 字元.
\t 表示 tab 字元.
\b 表示 backspace 字元
 
字元變數
字元變數的型別為 char, 佔 2 bytes (16 bit), 範圍為 0~ 65535.
但有趣的是 Java 的字元變數是可以做運算的, 雖然不清楚如何利用, 但如下例子所示.
int five=5;
char two='2';
char seven=(char)(five+two);//seven='7'

字串常數及變數
字串常數及變數於String類別再行介紹.

布林變數
布林變數只有二個值 "true"及"false", 並非為數值的 1與 0.

2008年9月3日 星期三

JAVA 的特點

Java是一個廣泛使用的網路程式設計語言。

首先,作為一種程式設計語言,它簡單、物件導向、machine independent的架構、具有可攜性、安全性、具有很高的性能。

其次,它利用了網路, Java的小應用程式(applet)可在網路上傳輸, 而不受CPU和環境的限制。另外, Java還提供了豐富的類別庫, 使程式設計者可以很方便地建立自己的系統。

下面我們分別從這三個方面來討論Java的特點, 透過Java與C, C++ 相比, 進一步指出它所具有的優點。

##ReadMore##

一、Java語言

Java語言有下面一些特點: 簡單、物件導向、分散式、保護性、解釋執行、安全、系統結構中立、可移植、高性能、多線程以及動態性。

1.簡單性

Java語言是一種物件導向的語言, 它通過提供最基本的方法來完成指定的任務,只需理解一些基本的概念, 就可以用它編寫出適合於各種情況的應用程式。Java省略了運算符重載、多重繼承等模糊的概念, 並且“自動垃圾收集”簡化了程式設計者的記憶體管理工作。另外, Java也適合於在小型機器上執行, 它的基本直譯器及類別的支援只有40KB左右, 加上標準類別庫和線程的支援也只有215KB左右。

2. 物件導向

Java語言的設計集中於物件及其介面, 它提供了簡單的類別機制以及動態的介面模型。物件中封裝了它的狀態變數以及對應的方法, 實現了模塊化和資訊隱藏;而類別則提供了一類物件的原型, 並且通過繼承機制, 子類別可以使用父類別所提供的方法,實現了代碼的重複使用。

3.分佈性

Java是網路導向的語言。通過它提供的類別庫可以處理TCP/IP協議, 用戶可以通過URL位址在網路上很方便地存取其他對象。

4.保護性

Java在編譯和執行程式時, 都要對可能出現的問題進行檢查, 以消除錯誤的產生。它提供 “自動垃圾收集”來進行記憶體管理, 防止程式人員在管理記憶體時容易產生的錯誤。通過整合物件導向的例外處理機制, 在編譯時, Java提示出可能出現但未被處理的例外, 幫助程式人員正確地進行選擇以防止系統的Crash。另外,Java在編譯時還可辨識類型宣告中的許多常見錯誤, 防止動態運行時不匹配問題的出現。

5.安全性

用於網路環境下的Java必須要防止病毒的入侵。Java不支援指標, 一切對記憶體的存取都必須通過物件的變數函數來實現, 這樣就防止程式人員使用"特洛伊"木馬等欺騙手段存取物件的私有成員, 同時也避免了指標操作中容易產生的錯誤。

6.系統結構中立

Java直譯器生成與系統結構無關的字節碼指令, 只要安裝了Java runtime library, Java程式就可在任意的處理器上執行。這些字節碼指令對應於Java虛擬機中的表示, Java直譯器得到字節碼後, 對它進行轉換, 使其能夠在不同的平台執行。

7.可攜性

平台獨立的特性使Java程式可以方便地被移植到網路上的不同機器。同時, Java的類別庫中也實現了與不同平台的介面, 使這些類別庫可以移植。另外, Java編譯器是由Java語言實現的, Java執行時系統由標准C實現, 這使得Java系統本身也具有可攜性。

8.直譯執行

Java直譯器直接對Java字節碼進行解釋執行。 字節碼本身攜帶了許多編譯時資訊, 使得連結過程更加簡單。

9.高性能

和其他直譯執行的語言如BASIC、TCL不同, Java字節碼的設計使其能很容易地直接轉換成對應於特定CPU的機器碼, 從而得到較高的性能。

10.多線程

多線程機制使應用程式能夠並行執行, 而且同步機制保證了對共用資料的正確操作。通過使用多線程, 程式設計者可以分別用不同的線程完成特定的行為, 而不需要採用全域的事件循環機制, 這樣就很容易地實現網路上的即時交互行為。

11.動態性

Java的設計使它適合於一個不斷發展的環境。在類別庫中可以自由地加入新的方法和變數而不會影響用戶程式的執行。並且Java通過介面來支援多重繼承, 使其比嚴格的類繼承具有更靈活的方式和擴展性。

二、JavaApplet

Java語言的特性使它可以無限地利用網路。Applet是Java的小應用程式, 它是動態、安全、跨平台的網路應用程式。JavaApplet嵌入HTML語言, 通過主頁發布到Internet。網路用戶訪問伺服器的Applet時, 這些Applet從網路上進行傳輸, 然後在支援Java的瀏覽器中運行。由於Java語言的安全機制, 用戶一旦載入Applet,就可以放心地來生成多媒體的用戶介面或完成複雜的計算而不必擔心病毒的入侵。雖然Applet可以和圖像、聲音、動畫等一樣從網路上下載, 但它並不同於這些多媒體的檔格式, 它可以接收用戶的輸入, 動態地進行改變, 而不僅僅是動畫的顯示和聲音的播放。

三、豐富的類別庫

Java提供了大量的類別以滿足網路化、多線程、物件導向系統的需求。

1.語言包提供的支援包括字串處理、多線程處理、例外處理、數學函數處理等,可以用它簡單地實現Java程式的運行平台。

2.實用程式包提供的支援包括Hash Table、Stack、可變陣列、時間和日期等。

3.輸入輸出包用統一的 Flow模型來實現所有格式的I/O, 包括檔案系統、網路、輸入/出設備等。

4.基礎網路包用於實現Socket程式設計。

5.圖形用戶介面包實現了不同平台電腦的圖形用戶介面物件, 包括窗口、菜單、滾動條、對話框等,使得Java可以移植到不同平台的機器。

6.網路包支援Internet的TCP/IP協議, 提供Internet的介面。支援URL連接, WWW的即時存取, 並且簡化了Client/Server的程式設計。

四、Java和C、C++

對於變數宣告、參數傳遞、操作符號、流程控制等, Java使用了和C、C++相同的傳統, 使得熟悉C、C++的程式員能很方便地進行程式設計。同時,Java為了實現其簡單、保護、安全等特性, 也摒棄了C和C++中許多不合理的內容。

1.全域變數

Java程式中, 不能在所有類別之外定義全域變數, 只能通過在一個類中定義公用、靜態的變數來實現一個全域變數。例如:

ClassGlobalVar{

publicstaticglobal_var;

}

在類GlobalVar中定義變數global_var為publicstat-ic,使得其他類別可以存取和修改該變數。

Java對全域變數進行了更好的封裝。而在C和C++中,依賴於不加封裝的全域變數常常造成系統的崩潰。

2.Goto

Java不支援C、C++中的goto語句, 而是通過例外處理語句try, Catch, final等來取代C、C++中用goto來處理遇到錯誤時跳躍的情況, 使程式更可讀且更結構化。

3.指標

指標是C、C++中最靈活, 也是最容易產生錯誤的資料類型。由指標所進行的記憶體位址操作常會造成不可預知的錯誤, 同時通過指標對某個記憶體地址進行顯式類型轉換後, 可以存取一個C++中的私有成員, 從而破壞安全性, 造成系統的Crash。而Java對指標進行完全的控制, 程式人員不能直接進行任何指標操作,例如把整數轉化為指標, 或者通過指標釋放某一記憶體地址等。同時, 數組作為類別在Java中實現, 良好地解決了數組存取越界這一C、C++中不作檢查的錯誤。

4.記憶體管理

在C中, 程式人員通過庫別函數malloc()和free()來分配和釋放記憶體, C++中則通過運算符new和delete來分配和釋放記憶體。再次釋放已釋放的記憶體塊或未被分配的記憶體塊, 會造成系統的Crash; 同樣, 忘記釋放不再使用的記憶體塊也會逐漸耗盡系統資源。而在Java中,所有的資料結構都是物件, 通過運算符號new為它們分配記憶體。通過new得到物件的處理權, 而實際分配給物件的記憶體可能隨程式運行而改變, Java對此自動地進行管理並且進行垃圾收集, 有效防止了由於程式人員的誤操作而導致的錯誤, 並且更好地利用了系統資源。

5.資料類型的支援

在C、C++中,對於不同的平台, 編譯器對於簡單資料類型如int,float等分別分配不同長度的字節數,例如:int在IBMPC中為16位,在VAX-11中為32位, 這導致了代碼的不可攜性, 但在Java中, 對於這些資料類型分配固定長度的位數, 如對int型別, 固定占32位, 這就保證了Java的平台獨立性。

6.類型轉換

在C、C++中,可以通過指標進行任意的類型轉換, 常常帶來不安全性, 而Java中,運行時系統對對象的處理要進行類型相容性檢查, 以防止不安全的轉換。

7.標頭文件

C、C++中用標頭檔來宣告類別的原型以及全域變數、庫函數等, 在大的系統中,維護這些標頭文件是很困難的。而Java不支援標頭檔, 類別成員的類型和取存許可權都封裝在一個類別中, 執行時系統對存取進行控制, 防止對私有成員的操作。同時, Java中用import語句來與其他類別進行通訊, 以便使用它們的方法。

8.結構和聯合

C、C++中的結構和聯合中所有成員均為公有, 這就帶來了安全性問題。Java中不包含結構和聯合, 所有的內容都封裝在類別中。

9.預先處理(Preprocess)

C、C++中用巨集定義的代碼給程式的可讀性帶來了困難。在Java中,不支援巨集,它通過關鍵字final來宣告一個常數, 以實現巨集定義中廣泛使用的常數定義。