2013年11月24日 星期日

某某權

最近的某些討論讓我覺得談「某某權」實在是個容易引發混淆的說法。例如「女權」、「人權」、「動物權」、「環境權」、「性權」、「生存權」、「財產權」、 「居所權」、「公權」、「路權」。(最近相當流行的「某某自由」、「某某自主」、「某某解放」也是。例如「言論自由」、「危險性行為自由」、「吸菸自 由」、「女性自主」、「財產自主」、「性解放」。行文方便下述只使用「某某權」囊括。)

「某某權」至少引發幾種混淆:

1. 「某某權」這個詞彙似乎是指某種抽象存在的事物。
2. 「某某權」這個詞彙似乎是某種被建構的詞彙而已,並未指任何事物。例如:我可以說我有「男權」,儘管這個詞彙似乎並未指任何事物。
3. 「某某權」所指的事物似乎和某些事物具備從屬關係。例如:我具備性權。
4. 這個從屬關係似乎是必然的。例如:必然地,我具備人權。
5. 這個從屬關係似乎不是必然的。例如:我的公權可以被褫奪。
6. 「某某權」似乎是原初的、不能再被分析的。例如:「人權」。
7. 「某某權」似乎是可以再被分析的。例如:「女權」是指女性和男性具備相同的「某某權」。
8. 某事物具備「某某權」,似乎是說該事物選擇某某行為是無責的。例如:我具備「財產權」,則我選擇擁有財產是無責的。
9. 某事物具備「某某權」,似乎 不是 說該事物選擇某某行為是無責的。例如:我具備「工作權」,然而我選擇殺手當作我的工作是有責的。
10. 「某某權」之間似乎能夠比較優劣。例如:「生存權」比「財產權」優先。
11. 「某某權」之間似乎無法比較優劣。例如:「人權」和「生存權」無法比較。
12. 「某某權」具備程度。例如:我的「性權」提昇。
13. 提倡「某某權」能夠導致另個「某某權」降低。例如:提倡「人權」導致「財產權」降低。
14. 「某某權」之間是可以交換的。例如:我可以讓渡「財產權」交換「生存權」。
15. 「某某權」之間是不可以交換的。例如:我不可以讓渡「人權」交換「居住權」。
16. 「某某權」的「某某」未必指具備該權的事物,抑或該事物能夠選擇而無責的行為,抑或該事物能夠擁有而無責的其他事物。前者例如「人權」是指具備該權的事物是人,其次例如「性權」是指人們能夠選擇性行為而無責,後者例如「財產權」是指人能夠擁有財產而無責。

因為上述混淆,八卦板的酸民可說是左右逢源、戰力滿點。
例 如:「是啊我也承認人權是很重要的,可是你提倡那些死刑犯的生存權,等於是降低普羅民眾的生命財產權耶!生命財產權重要,還是生存權重要?人權也不過是人 類社會搞出來的東西啊,可以褫奪公權當然也可以褫奪人權好嗎」、「靠,那些女消防員在那邊喊什麼女權,我就沒有男權嗎嗎?我還有言論權勒,你能用女權壓迫 我的言論權,我也能用我的言論權壓迫你的女權」、「愛滋病患哪有什麼隱私權啊,隱私權是正常人才有的好嗎。愛滋病患領取這麼多政府的補助,當然就是用隱私 權換得生存權的啊」......
 
https://plus.google.com/104482216409980467197/posts/itLYSCUgqSQ

某某權

最近的某些討論讓我覺得談「某某權」實在是個容易引發混淆的說法。例如「女權」、「人權」、「動物權」、「環境權」、「性權」、「生存權」、「財產權」、 「居所權」、「公權」、「路權」。(最近相當流行的「某某自由」、「某某自主」、「某某解放」也是。例如「言論自由」、「危險性行為自由」、「吸菸自 由」、「女性自主」、「財產自主」、「性解放」。行文方便下述只使用「某某權」囊括。)

「某某權」至少引發幾種混淆:

1. 「某某權」這個詞彙似乎是指某種抽象存在的事物。
2. 「某某權」這個詞彙似乎是某種被建構的詞彙而已,並未指任何事物。例如:我可以說我有「男權」,儘管這個詞彙似乎並未指任何事物。
3. 「某某權」所指的事物似乎和某些事物具備從屬關係。例如:我具備性權。
4. 這個從屬關係似乎是必然的。例如:必然地,我具備人權。
5. 這個從屬關係似乎不是必然的。例如:我的公權可以被褫奪。
6. 「某某權」似乎是原初的、不能再被分析的。例如:「人權」。
7. 「某某權」似乎是可以再被分析的。例如:「女權」是指女性和男性具備相同的「某某權」。
8. 某事物具備「某某權」,似乎是說該事物選擇某某行為是無責的。例如:我具備「財產權」,則我選擇擁有財產是無責的。
9. 某事物具備「某某權」,似乎 不是 說該事物選擇某某行為是無責的。例如:我具備「工作權」,然而我選擇殺手當作我的工作是有責的。
10. 「某某權」之間似乎能夠比較優劣。例如:「生存權」比「財產權」優先。
11. 「某某權」之間似乎無法比較優劣。例如:「人權」和「生存權」無法比較。
12. 「某某權」具備程度。例如:我的「性權」提昇。
13. 提倡「某某權」能夠導致另個「某某權」降低。例如:提倡「人權」導致「財產權」降低。
14. 「某某權」之間是可以交換的。例如:我可以讓渡「財產權」交換「生存權」。
15. 「某某權」之間是不可以交換的。例如:我不可以讓渡「人權」交換「居住權」。
16. 「某某權」的「某某」未必指具備該權的事物,抑或該事物能夠選擇而無責的行為,抑或該事物能夠擁有而無責的其他事物。前者例如「人權」是指具備該權的事物是人,其次例如「性權」是指人們能夠選擇性行為而無責,後者例如「財產權」是指人能夠擁有財產而無責。

因為上述混淆,八卦板的酸民可說是左右逢源、戰力滿點。
例 如:「是啊我也承認人權是很重要的,可是你提倡那些死刑犯的生存權,等於是降低普羅民眾的生命財產權耶!生命財產權重要,還是生存權重要?人權也不過是人 類社會搞出來的東西啊,可以褫奪公權當然也可以褫奪人權好嗎」、「靠,那些女消防員在那邊喊什麼女權,我就沒有男權嗎嗎?我還有言論權勒,你能用女權壓迫 我的言論權,我也能用我的言論權壓迫你的女權」、「愛滋病患哪有什麼隱私權啊,隱私權是正常人才有的好嗎。愛滋病患領取這麼多政府的補助,當然就是用隱私 權換得生存權的啊」......
 
https://plus.google.com/104482216409980467197/posts/itLYSCUgqSQ

集體注意力在互聯網上的流動(四)網絡的黏度

集體注意力在互聯網上的流動(四)網絡的黏度
計算士 發表於 2012-2-1 12:52:14
 

置身於人類的交通輸運系統,把自己想象成隨機游走的粒子,來觀察思考這個系統,會得到許多有趣的發現。 
上圖左是香港的地鐵,右是上海某商場。問這兩個系統有何本質不同? 
答,前者的目標是最大效率地將客流輸運出系統,後者的目標是最大程度地將客流保持在系統內。 
香港地鐵有一個亮點,就是它便捷的換乘機制。在各個主要換乘站(不同顏色的路線交接的地方),同一層平台的另一邊月台並不是同路線的回程車,而是另外一個路線的列車。符合常識地,我們可以假設80%在換乘站下車的旅客都是為了去另外一個路線(而不是往回坐),這種換乘設計使得這些乘客只要走幾步到另一端月台等候就可以。如果兩端的列車差不多同時抵達,乘客甚至不必在地鐵站內逗留。 另外20%有其他需求的旅客則需要付出較多的成本,走樓梯或者坐電梯去另外一層平台候車。 
奇怪的是,雖然這幾年北京的新建地鐵參考了香港的設計(背後是京港地鐵公司),例如月台上的玻璃門等等,但這種最核心的設計卻沒學到手。不管是換乘站還是普通站台,同一層平台的另一端月台一律是回程車。這樣大部分換乘站下車的乘客都要走樓梯才能去其他線路(因為電梯又往往是壞的或者不開) ,造成了地鐵內部,尤其是樓梯口的極端擁堵。而至於像西直門(已經有三年沒回去了,不知道現在是不是還是這樣)這樣換乘要先出站再進站,轉個車動輒花掉半個小時的糟糕設計,其形成機制完全超出了正常人類的想象。 
與地鐵這類輸運系統相反,商場內部輸運系統的設計遵循截然不同的價值觀。如上圖(左)所示,我們見到的大部分商場,往往是上樓的電梯聚集在商場的一端,下樓的電梯聚集在另一端(未顯示在圖中) 。這是為了強迫顧客經過商場的各個櫃台。有些極端不友好的商場,故意把電梯藏在迷宮般的一大堆櫃台裡面,顧客顧客不繞遍所有櫃台就找不到離開的路。 
如果我們對一個輸運系統定義一個變量,叫做「黏度」,我們就可以定量地比較不同系統的輸運效率。如何計算黏度?考慮公式M~F^\gamma。F代表系統的流,例如在北京地鐵系統達到平衡態時(進=出)進出地鐵系統的人員數量;M代表系統的存,例如平衡態時停留在地鐵系統內的人員數量,\gamma就是黏度。對商場也可以計算類似的指標。 
香港地鐵的黏度很小,上海商城的黏度很大。到底是黏度大好還是黏度小好?取決於系統的目標。如果系統把隨機游走的粒子(地鐵內的乘客)的時間看做成本,要盡量降低成本,就要低黏度;如果系統把粒子的時間看做是收益(商場裡的顧客),要盡量增加收益,就要提升黏度。我們可以對粒子計算平均逗留時間t。它測量粒子從進入系統到離開系統所停留的平均時間。顯然,系統的黏度與粒子的平均逗留時間是正相關的。 
從演化的視角來看,隨著系統的進化,它的黏度應該是越來越接近最優目標。例如地鐵的黏度越來越小,商場的黏度越來越大。 

本系列的前幾篇文章指出,我們可以把互聯網看做是一個集體注意力在信息資源之間流動的網絡。那麼,從輸運系統的角度看,互聯網的黏度究竟是高一點好,還是低一點好呢?  
早期的互聯網研究指出,互聯網是一個「小世界」。小世界的說法源於美國心理學家Milgram的一個實驗,他讓隨機抽樣的一批美國人通過自己的熟人給隨機抽樣的另一批美國人傳遞信件,發現平均只要傳遞6步信件就可以抵達對方手中。Watts,Barabasi等人驗證了互聯網上的小世界規律,即雖然網絡的規模在以幾何方式急劇擴大,但網站之間的平均超鏈接路徑的程度只以代數級別增加。後來Kleinberg,Page等人繼承這個傳統,研究了在一個小世界的互聯網結構中搜索資源所需要的最短時間。 
從小世界的傳統出發,互聯網的黏度是越低越好的。因為這種思路把用戶的時間t當做成本,希望能盡量降低用戶在互聯網上搜索信息的時間成本。 
那麼,從互聯網建成以來,20年過去了, 用戶在互聯網上的平均逗留時間是在不斷降低嗎? 

顯然不是的,根據我們每個人的經驗,用戶在互聯網上的平均逗留時間是越來越長了。所以,這種「小世界」的觀點並沒有理解互聯網的本質。 
我們認為互聯網的成長依賴於用戶的注意力流。進入web2.0時代後,這個趨勢更加明顯了。每天Facebook,Youtube等網站要增加以TB為單位的信息,這些都是用戶時間所帶來的。所以,互聯網不是一個地鐵,而更像是一個商場。它希望能盡量地留住用戶不要下線。與商場不同的是,互聯網上不存在「找不到電梯」的問題,用戶隨時都可以關閉網頁。所以,互聯網必須不斷提升自己的好玩性,新奇性,來吸引用戶。我們看到,作為一個系統,互聯網的黏度其實是越來越大了。 

最後,以一個有趣的小故事結束本篇。  
就好像實際的股票操作員並不一定依賴定量金融模型做決策一樣,計算機科學家們的「小世界」理論也並不一定被網站管理員接受。我曾經向一個有建設商業網站經驗的同學抱怨,許多機構的網站上很難找到該機構的電話熱線等聯系方式。這個同學的回答一語驚醒夢中人: 
「要是讓你這麼簡單就找到電話號碼,而改用打電話的方式了解信息,那建設網站的目的何在呢?」 
聽完這個回答,我一下子想到了網站地圖、商場結構、電話語音導航*之間的秘密聯系。 這一類高黏度輸運系統的目的,本來就是將用戶盡量留在系統裡面。** 



*你是不是曾撥過信用卡的熱線,結果沮喪地發現根據語音提示選了無數次「1」,「2」,「3」後,還是找不到人工服務?   
**值得一提的是,北京地鐵的設計也許並不一定像看起來那麼愚蠢。先進的技術無法使用,往往有著其社會現實基礎。在地鐵運力不夠(例如月台的大小,列車車廂數目)的情況下,如果一味降低黏度,加速客流, 很容易出現事故。這個時候讓大多數乘客到另外一層平台換車,實際上相當於以爬樓梯的方式強迫乘客在地鐵裡排隊,取得增加黏度的效果。這種強迫排隊的手段,我們在旅游景點的高峰期的售票點門口也常常能看到。同時,香港的某些系統也有令人惱火的時候,由於人工服務成本的高昂,在香港撥打移動運營商或者銀行的客服電話,要在迷宮般的語音導航中找到客服代表的難度要比大陸的同類服務難度大很多。 

互聯網數據分析師joeghwu稱黏度為「網站迷失度」,發過一篇有趣的博客討論過這個問題。

http://www.swarmagents.com/bs/forum/viewblog.asp?id=17708&%40order%2Alastdate%2Bdesc

網站的迷失度度量

網站的迷失度度量

2011年5月10日 由 joegh   留言 »
measure-of-lostness  在博客之前的文章——優化網站信息架構我曾經提到過關於迷失用戶(Lost Visits)的定義,以及如何使用Google Analytics的高級群組(Advanced Segment)去區分出這批用戶。最近在看《用戶體驗度量(Measuring the User Experience)》,發現自己實在太嫩了,人家Smith早在1996年就對迷失度Lostness)有了定義,同時給出了迷失度L的計算公式,這裡借花獻佛,分享給大家。
Lostness-expression
即,L = sqrt[ (N/S-1)2 + (R/N-1)2 ]
L:迷失度
N:訪問的不同頁面數(Unique Pageviews)
S:訪問的總頁面數(Pageviews)
R:完成任務必需的最小頁面數
  Smith同時給出了迷失度的評定標准:最佳迷失度為0,迷失度小於0.4時,用戶不會顯示任何可觀察到的迷失特征;迷失度大於0.5時,用戶顯現迷失特征。
  結合公式,我們可以看到這裡對迷失度的定義主要考慮到的是:1、重復訪問相同的頁面,2、沒有能夠用最簡單的方式完成任務,過多地在網站中徘徊。其實第一眼看去這個公式有一定的道理,但細想一下其實也存在著不合理的地方。通常我們需要去獲取知識,閱讀和總結他人的經驗,但如果只是一味地套用書本或者別人的東西,那麼你就輸了,尤其是在發展如此迅速的互聯網領域。那麼我們來看看這個公式有何不妥:
  我們先思考這樣一個問題:迷失的用戶會表現怎樣的特征?顯然,當用戶在網站中找不到自己需要的東西的時候會來回地點擊各種頁面,頻繁地返回首頁或者索引頁面,那麼從這個角度看,顯然這個公式是成立的,迷失用戶的表現特征就是頻繁地重復瀏覽同一頁面,並且瀏覽的頁面數會比正常訪問多得多。但再換一個角度思考,逆向思考下前面的問題:一個正常的用戶會不會出現重復瀏覽同一頁面或者瀏覽頁面數較多的情況?顯然也是可能的,簡單的例子,如果你對我的博客非常感興趣,看了一篇文章後還想看另外的文章……於是你來回於博客的文章頁面和文章專題推薦或者網站地圖頁面之間,於是這些列出了文章索引的頁面被一次又一次地重復訪問著;再如,如果一個用戶上電子商務網站的目的不是購物,而是閒逛,看看有沒有便宜貨,或者只是針對某類商品比對下商品的好壞及價格的差異,以伺機下手,那麼這個時候這些用戶的訪問頁面數就會異常的多,但他們其實都沒有迷失。所以,上面的公式無法為你從所有的用戶中挑出那些迷失的用戶,最多只能對已知的迷失用戶計算他們的迷失度,哪些是低度迷失,哪些是高度迷失。
Web 1.0  但其實Smith沒有錯,錯的是這個高速發展的時代,這也是我為什麼說尤其在互聯網領域不要直接照搬一些東西來直接應用於自身的原因。1996年,很明顯還處於WEB1.0時代,完全沒有現在網站的那些復雜交互和多樣的功能,當時的網站大部分做的只是信息的單向發布,而用戶訪問網站的任務也是單一的,可能就是查找到自己想要的那個信息頁面。所以我反而覺得這個迷失度公式在當時絕對是適用的,而且Smith在當時就能總結得出這個的度量公式足見其對如今大熱的「用戶體驗」的先知先覺以及對用戶體驗度量的智慧。同時這個公式對於當前網站的迷失度衡量也不是完全無效,如果是用戶體驗的小組在做可用性實驗,為實驗設定的情景是需要用戶在網站中完成一個特定的任務,那麼這個公式完全是有效的,所以總結起來就是這個公式對復雜的多任務的網站迷失度衡量無效,而對基於單任務的簡單網站或者實驗環境是有效的。
  既然這個公式對於當前的網站大部分時間不適用,我們就需要對其進行改良,使其適用於普遍的網站。再觀察下這個公式,我們會發現其實它跟數據挖掘裡面的歐幾裡得距離度量的計算方式十分相似,可以理解為所有的比例為1時是最理想的狀態,公式計算的結果就是每個樣本點與這個1的理想點的距離,距離越近迷失度越低,距離越遠迷失度越高。所以這個思路完全可以借鑑,但顯然只考慮瀏覽頁面的這些度量還不夠,我們需要加入其他的網站分析度量。
  對於現在的大部分網站而言,功能是多樣化的,用戶使用網站的任務不再是單一的,所以無法為不同任務的用戶確定一個統一的完成任務的最小訪問頁面數,而公式的前半部分依然有效,我們嘗試用其他度量來替換後半部分。於是自然而然的想到了停留時間,當用戶沒有迷失時他們會在自己感興趣的頁面停留一段時間,那麼頁面平均停留時長(Avg. Time on Page)不會很小,所以改進後的公式如下:
Lostness-expression_imp
即,L = sqrt[ (N/S-1)2 + (T/R-1)2 ]
L:迷失度
N:訪問的不同頁面數(Unique Pageviews)
S:訪問的總頁面數(Pageviews)
T:訪問頁面的平均停留時間(Avg. Time on Page)
R:網站正常的頁面平均停留時長(既定值)
  這個公式同樣有幾點需要注意,首先N/S和T/R要保證小於等於1,這樣迷失度L計算的結果才會落在[0,sqrt(2)]之間,才有評定是否迷失的可行性。N/S可以保證小於等於1,但T/R無法保證,所以再套用公式之前需要做一步數據篩選的工作,也就是過濾那些可以被簡單認定不是迷失的訪問(建議過濾訪問頁面數小於3或者頁面平均停留時間大於R的所有訪問),篩選後的所有訪問即是需要去認定是否具有迷失傾向的訪問,同時有保證了T/R小於等於1這個規則。至於R的值如何確定,可以先看一下你自己網站的幾個數據:
determine_R
  從近一個月的數據觀察,我的博客的頁面平均停留時間(Avg. Time on Page)為2分鐘半左右,所以我暫定公式中的R(網站正常的頁面平均停留時長)為2分鐘,用高級過濾器查看所有Time on Page小於2分鐘的訪問大概佔到了網站所有訪問的45%。同時,上圖給出的3個指標恰恰就是公式中需要用到的上需要用到的3個指標,結合剛剛給定的R值,公式中所有需要的變量我們都已經可以拿到了,下面來看看幾個示例:
序號NSTRL
145601200.5385
258251200.8760
345201200.8570
  上表中計算得到了3個訪問樣本的迷失度度量L的值,很顯然我們當前沒法判定到底哪個迷失了哪個沒有,所以還缺少一個判定基准(Benchmark),正如上面Smith給出的0.4和0.5,因為公式的變更我們可能需要重新定義這個基准。當然,如果你要用非常嚴謹科學的態度去定義這個基准線的話,這個過程完全可以作為一個研究課題,進行可用性的實驗,觀察實驗用戶的迷失情況,結合每個實驗用戶的指標數據最終給出一個迷失度的判斷基准。當然如果你有興趣,這個完全可以作為你的畢業設計或者學校科研課題去展開研究,我這邊沒有時間和資源去完成這個龐大的項目,只能按照經驗值進行預估,針對我的博客,我認為當用戶的重復訪問頁面比例超過1/3,並且頁面平均停留時間不到30秒時,用戶可能已經表現出一定的迷失傾向,將這個數值代入公式得到的迷失度L的值約為0.82,那麼這個就可以作為衡量用戶迷失的一個基准線,當L大於0.82時用戶表現迷失的傾向,小於0.82則為正常訪問。
  當然我這裡提出的迷失度度量公式同樣存在優化空間,如果你有更好的想法,可以一起交流,歡迎在評論裡面提出你的想法。
  可能這篇文章的中間寫了一大堆「廢話」,主要是自己當時看到這個公式時思考如何將它有效地應用到實際的一個過程,實在沒有耐心的朋友可以直接跳過,不影響文章的整體實現思路,不要抱怨:「怎麼不早說,現在才提,我看都已經看下來了」,如果你看完了,就證明你有一顆足夠淡定的心。其實我自己覺得在獲取信息的時候(無論是看書還是看網上的文章)思考過程才是最重要的,這是對信息的一個有效過濾的過程,只有思考之後你獲取的信息才是優質的,才是被你真正吸收的。但也有一個弊端,就是發現自己看書實在太慢太拖沓,現在手上正在閱讀的有4本書,都是現在進行時,每本書的進度在1/3到1/2不等,涉及數據分析、用戶體驗、數據挖掘和報表展現,精力不夠集中,一段時間不能同時兼顧太多呀,反而拖慢進度。

 » 本文采用 BY-NC-SA 協議,轉載請注明來源:網站數據分析 » 《網站的迷失度度量》

http://webdataanalysis.net/personal-view/measure-of-lostness/

一個網絡生長實驗

一個網絡生長實驗
樹大 發表於 2012-2-4 14:18:49
此實驗類似於那種無聊郵件——「請將此郵件轉發給n個人,你會獲得好運」
我沒有轉發過,我不想被激將和愚弄。但還是可以看到有大量的轉發,甚至兩年前收到的一個郵件,再次收到了,不知是不是這個郵件通過漫長的途徑再次找到我。
我關注的問題是,如果有技術手段可以跟蹤這種郵件傳遞的整個路徑,將得到一個什麼樣的結構。不難想象,開始的結構是樹狀的,那些願意傳播郵件的人會成為父節點,我這樣不理會的人會是死胡同或葉子節點。整個結構就像是一個多叉樹,在時間和空間上壯大。如果在任意時刻考察整個網絡,都可以得到一些參數,比如葉子節點的平均深度(即距離始作俑者隔了幾個中間節點),或者後代數量分布(統計所有節點的後代數目),等參數。當網絡進一步生長,郵件的發出者可能會再次收到郵件,這時的網絡就不是樹狀了,開始出現大大小小的環。這個再次收到郵件的人可能會再次發出該郵件,網絡變得更加復雜。
得到這個網絡有什麼意義呢?首先,它是一個自動演化的產物,結合郵件內容可以評價傳播范圍內的文化狀況;其次,可以識別出網絡中節點(郵件用戶)的各種屬性,用以指導廣告的定向投遞(無恥的應用),等;最後,可以在某些程度上研究文化傳播規律。
那這個實驗如何開展呢?想繪制這個網絡,就要記錄每一次「郵件」傳遞的時間和對象,這樣,用普通的郵件是不能得到這個網絡的。可以借助社交網絡平台,並開發一個工具來實現生成傳遞報告。我並不具有這個技術基礎,所以寫在這裡,看看有沒有同樣興趣的人來討論

http://www.swarmagents.com/bs/forum/viewblog.asp?id=17719&%40order%2Alastdate%2Bdesc

洞察力

洞察力 蔡志浩

在產品與服務設計的脈絡中,洞察力指的是以可以客觀觀察到的行為與環境線索為證據,以大量關於使用者與環境的知識為基礎,推論出無法直接觀 察到的使用者認知歷程與表徵的能力。若使用者與環境的互動在觀察時已結束,也能夠藉由可以觀察到的行為痕跡與互動結果推論原始的互動過程。洞察力很難學 習,但很多人感興趣。我在這篇文章中說明洞察力的特性,並提出一些培養洞察力的建議。

我先描述兩個現象當作例子:

Two Ways to Solve a Problem

Two Ways to Solve a Problem

這些年下來,我反覆觀察到一個現象:程式員各有一套慣用的方法來克服自己遭遇到的問題,這些解題習慣可區分成兩種,工程師多只專精其一,只有少數能任意在兩者間自在地切換。
在很多情況下,無論程式員採用哪種作法,都可輕易把問題解掉;但是另有一些問題,卻不是這樣隨性而為就解得掉的--這就值得我們好好玩味了……
以 1..n 的正整數相加這個例子來說,我知道程式員應該利用現成的副程式,以爬說語來寫,應該要長成這樣:
  1. n = 100  
  2. y = sum(range(1, n+1))  
假裝我們沒有現成的,像 sum 這樣的副程式可用。那麼,一種可能的寫法如下:
  1. y = 0  
  2. for i in range(1, n+1):  
  3.     y += i  
這是標準的合成(Synthesis)法。以這個例子來說,如果不考慮時間複雜度要 O(n) ,這個方法其實沒什麼不好,畢竟它非常直覺,寫起來也很簡單。
大部分資訊背景的,甚至其他工程背景的,都傾向以這種「合成」的策略來克服問題。
由於這是個已經爛掉的例子,我們當然知道有個時間複雜度只要 O(1) 的作法:
  1. y = (1+n)*n/2  
這是典型的以分析(Analysis)手段來解題的例子。通常數學或物理等理科背景的人,比較慣用這種「分析」的手段來解決問題。
大部分的工程問題都牽連太廣、太複雜了,很難找到分析解;所以工程師們很習慣採用 trial and error 的合成策略,只求找到一個可行的作法。
這種「先兜出一個作法,看著它如何失敗,然後再兜另一個作法試試,不行的話再兜另一個……」的合成策略,陪伴我們度過無數個夜晚,也解決了不少問題,但如果每次「歪打」都沒有任何「正著」甚至「歪著」的跡象,這種策略就完全失靈了。
在合成策略無效或顯得白費功夫時,也許可以學著適應理科背景的慣用手法:「靜心分析問題,用數學精確地描繪出問題,建立模型,擴充內容,增大視界」,據此提供新的想法和嘗試的途徑。

推薦文選:

Labels: , , 
Posted by York at 1:43:00 PM

1 comments:

Wallace said...
我認為工程師風格和個性及所經歷的學習程序有關。
個性上積極性高的人,會先做了再說。
而個性保守的人,會先調查好了再做。
學數學及物理的人,會測試完了再做,因為其學理上是由理論一層層堆起來的。
學醫學及化學的人,總是先投藥做了再說,因為經驗才是真的,新發現是由新組合找到。
所以其實和所面臨的事有些關係才選擇方法。
不過現在面臨的東西複雜了,確實要混合使用。例如做embedded如機器人等,一方面對於使用電腦則要有如數學家一般清楚的頭腦,才會了解那一段程式的功能及分類。一方面又要對付Sensor所給定的不知名狀況,只能先試了抓到資料再分析。動作後又會面臨新狀態。
了解所面對的問題的類別及了解解決問題比較符合的方法,就比較可以在兩者之間做較好的切換。
以上為個人心得,提供參考。
6/26/2008 10:11 AM

程序員每天該做的事

程序員每天該做的事
1、總結自己一天任務的完成情況 
最好的方式是寫工作日志,把自己今天完成了什麼事情,遇見了什麼問題都記錄下來,日後翻看好處多多 
> >   好記性不如爛筆頭。呵呵 
2、考慮自己明天應該做的主要工作 
把明天要做的事情列出來,並按照優先級排列,第二天應該把自己效率最高的時間分配給最重要的工作 
> >   WORKLIST。計劃很重要啊。
3、考慮自己一天工作中失誤的地方,並想出避免下一次再犯的方法 
出錯不要緊,最重要的是不要重復犯相同的錯誤,那是愚蠢 
> >   時時總結。
4、考慮自己一天工作完成的質量和效率能否還能提高 
一天只提高1%,365天你的效率就能提高多少倍你知道嗎?   (1+0.01)^365   =   37   倍 
> >   每天進步一點點。不斷提升自己才是關鍵。
5、看一個有用的新聞網站或讀一張有用的報紙,了解業界動態 
閉門造車是不行的,了解一下別人都在做什麼,對自己能帶來很多啟示 
> >   知已知彼,百戰不殆。
6、記住一位同事的名字及其特點
你認識公司的所有同事嗎?你了解他們嗎? 
> >   人際的成功是事業成功的重要因素。
7、清理自己的代碼
今天完成的代碼,把中間的調試信息,測試代碼清理掉,按照編碼風格整理好,注釋都寫好了嗎? 
> >   溫故而知新。還應按分類整理好,方便重用。
8、清理自己的桌面 
當日事當日畢,保持清潔干勁的桌面才能讓你工作時不分心,程序員特別要把電腦的桌面清理干淨 
> >   專致是成功的關鍵。集中火力,做好當前最重要的一件事。其他事——完成之後再做。/color]
程序員每周該做的事

[color=Orange]1、向你的老板匯報一次工作 
讓你的老板知道你在做什麼,這很重要。可以口頭、書面、郵件,看你老板的工作方式而定 
> >   確保在正確的方向上。不要浪費生命而到頭來全是無用功。
2、進行一次自我總結(非正式)
這周之內自己表現得怎麼樣?該加分還是扣分? 
> >   一周總結。常修常悟。
3、制定下周計劃 
把下周要做的事情列出來,一樣要分清楚優先級 
> >   又是計劃。可見計劃之重要。此乃短期計劃,指揮近期工作。
4、整理自己的文件夾、書櫃和電腦文件 
把桌面以外的地方也要清理干淨,電腦的文件夾,收到的郵件,把過時的垃圾全部清理掉 
> >   條理性是有效利用時間的保證;也使之更能投入工作。
5、與一個非公司的朋友溝通 
他山之石,可以攻玉 
> >   要——但要作有益之交流,不作無益之討論。別人的時間也很寶貴。
6、看一本雜志 
找一本適合自己的專業雜志 
> >   找一本合適的周刊。
7、糾正自己或同事一個細節上的不正確做法 
《細節決定成敗》看過了嗎?沒看過強烈建議先看看 
> >   細節。天下精品必作於細。養成習慣就好。
程序員每月該做的事  

1、至少和一個同事一起吃飯或喝茶 
不光了解自己工作伙伴的工作,還要了解他們的生活 
> >   開闊視野;增加閱歷。
2、自我考核一次
相對正式地考核自己一下,你對得起這個月的工資嗎? 
> >   自我評估(價)。總結。
color=Orange]3、制定下月的計劃,確定下月的工作重點   [/color]
> >   中短期計劃。方向性質的計劃。
4、總結自己工作質量改進狀況
自己的質量提高了多少? 
> >   每月總結。
5、有針對性地對一項工作指標做深入地分析並得出改進的方案 
可以是對自己的,也可以是對公司的,一定要深入地分析後拿出自己的觀點來。要想在老板面前說得上話,的成事,工作上功夫要做足。 
> >   投入與深入。
6、與老板溝通一次 
最好是面對面地溝通,好好表現一下自己,虛心聽取老板的意見,更重要的是要了解老板當前關心的重點 
> >   又是方向。不要迷失或走錯方向。

程序員每年該做的事  
1、年終總結 
每個公司都會做的事情,但你真正認真地總結過自己嗎? 
> >   認真地(全面)——總結。
2、兌現給自己、給家人的承諾
給老婆、兒子的新年禮物買了沒有?給自己的呢? 
> >   工作只是生活的一部分,還有很多更重要的。
3、下年度工作規劃
好好想想自己明年的發展目標,爭取升職/加薪、跳槽還是自己出來干? 
> >   規劃。
4、掌握一項新技術
至少是一項,作為程序員一年要是一項新技術都學不到手,那就一定會被淘汰。掌握可不是看本書就行的,真正懂得應用,最好你能夠寫一篇教程發表到你的blog 
> >   真正地掌握。我以為是「想怎麼用就怎麼用——正確而高效」
5、推出一種新產品
可以是一個真正的產品,也可以只是一個類庫,只要是你創造的東西就行,讓別人使用它,也為世界作點貢。當然如果真的很有價值,收點注冊費也是應該的 
> >   積累。日積月累。
6、與父母團聚一次
常回家看看,常回家看看 
> >   別因工作忘了生活的重點。  

面向模式構建系統架構

面向模式構建系統架構
2007-08-26 16:17
架構是一個軟件系統中的核心元素,是系統中最難改變的部分,也是構建軟件系統中其他部分所依賴的基礎,因此系統架構的好壞會從根本上決定基於這個架構所構 建的軟件系統的質量。系統架構的構建一直是軟件開發過程中的一項重要工作,同時也是一項很困難的工作,即便對於很有經驗的系統架構師也是如此。但是,模式 以及模式語言的提出給出了一條構建系統架構的有效途徑,本文將對此進行深入的論述,並以一個著名的單元測試工具JUnit為例進行說明。

概念分析
首先,對架構(architecture)和模式(pattern)這兩個概念進行簡單的介紹。前面已經講過,架構是一個系統中的核心元素,是該系統中最 本質的部分。系統的各個組成部分正是通過架構所描繪的方式協同工作共同完成系統的功能,從而表現出一個完整的系統。由於系統的本質是不容易變化的,所以如 果一個架構構建的正確,也就是說能夠真實的反映出系統的本質,那麼就可以使基於該架構構建的系統具有比較長的生命力,否則該系統的質量就會逐漸的降級,直 至崩潰。如果以建築領域來作類比可能會比較好理解一些,試想如果一個建築物構建在一個在結構上有問題的混凝土骨架上,那麼該建築的壽命可想而知是不會長久 的。

什麼是模式呢?模式是在某種特定的場景(context)下某個不斷重復出現的問題的解決方案。模式本身並沒有任何的創新性,它僅僅是對於一些已經被證明 為優秀的解決方法的歸類、總結,目的是為了重用該解決方案而又不用做重復的勞動。其中,"特定場景"和"重復"兩個限定詞非常關鍵,"特定場景"給出了什 麼時候以及為什麼使用一個模式,"重復"說明了模式的可重復性從而可以被重用。參考文獻〔4〕中總結了23個經典模式,非常值得讀者朋友細心研讀。

架構搭建的難點
既然架構是一個系統中最核心、最本質的部分,要想構建一個正確的架構當然不會容易,為什麼呢?下面將從幾個方面進行分析。

首先,由於架構是一個系統中的本質的反映,因此架構一般是由系統中不容易改變的部分組成,這些不容易改變的部分往往是系統中的一些抽象的概念。但是,我們 在構建系統的架構前僅僅有一些用戶的需求以及對於用戶業務流程的用例(use case),如果缺乏有效的指導原則,很難從這些信息中提取出反映問題領域本質的概念來。關於這一點,參考文獻〔3〕中給出了一個很有效的方 法:Commonality/Variability(公共性/可變性)分析。它的核心思想是針對問題領域中的概念進行分類,把那些看上去不同但本質上屬 於一類的概念用一個抽象的概念來表示,然後基於這些抽象的概念構建架構。Commonality/Variability分析方法在發現系統中的抽象概念 方面確實很有效,但是前面已經說過,系統架構不僅僅是一些系統中的抽象概念,而且還描繪了這些抽象概念間的關系,僅僅使用 Commonality/Variability分析方法不能十分有效的發現抽象概念間的關系。

其次,即使確定了抽象概念間的關系,構建起了一個系統架構,在這個架構的指引下,我們還是很有可能陷入困境。為什麼呢?因為該架構可能會缺乏對於我們進一步工作的指引,缺乏後續發現對象的有效手段。也就是說,架構可能過於空泛,缺乏延伸性。

最後,一個經驗豐富的系統架構師可能成功的構建了一個系統的架構,成功的基於該架構完成了系統,但是他的經驗、心得體會可能會很難為其他的系統架構師所理 解,從而在解決同類問題時可以有效的被重用。因為,這些心得體會如果表現的過於抽象,可能會顯的空泛從而指導意義不大;如果表現的過於具體,有可能陷入細 節從而失去通用性。

正是由於上述原因使得系統架構的構建非常的困難,往往必須由資深的系統架構師來完成。但是隨著模式的提出以及對模式研究的深入,這種局面正在逐步的改變。下面讓我們先來對模式進行一番深入的認識。

深入認識模式
讀者對於模式的認識大都是從《設計模式》(由參考文獻[4]翻譯而來的)一書的出版開始的。該書中描繪了23個經典的模式,每一個模式都給出了一個精制優雅的解決方案,為每一個程序員所沉迷、拍案叫絕。但是由於經驗的不足往往會造成對於模式的誤解。《設計模 式》一書的作者John Vlissides為此專門寫了一片文章進行闡述,詳見:http://www.research.ibm.com/designpatterns /pubs/top10misc.pdf。本人在對模式進行深入的研究以及實踐的基礎上,把對於模式的認識劃分為三種境界,下面一一進行說明。

第一層境界:認為模式就是一種解決方案,一般剛剛接觸模式的人都處於這個認識層面。確實是這樣,剛剛見到模式時很容易被它所提供的精制的解決方案所吸引, 由於缺少經驗反而容易忽略模式的其它的重要方面。這樣做非常容易造成對於模式的誤解、誤用。比如:為了使用模式而使用模式以及過分的使用模式等。這種境界 僅僅認識到模式怎樣(How)去解決一個問題。

第二層境界:除了解模式提供的解決方案以外,還能夠認識到模式背後的一些指導原則。《設計模 式》一書的第一章對於模式背後的一些指導原則進行了詳細的論述,比如:針對接口編程;優先使用組合而不是繼承;發現變化、封裝變化等。不過缺乏經驗的人可 能對此理解不會深刻,甚至忽略了這些原則,需要不斷的實踐、體會方能理解。不過體會到這些原則之後就會對面向對象的思想的理解提升一個層次,提高自己的面 向對象分析、設計能力。參考文獻[2]中對於這些原則有深入細致的講解,相信會對讀者有非常大的幫助。

第三層境界:認識到模式其實是一些關系,用來舒緩系統內部的"沖突力"。這一點僅僅從模式提供的解決方案實例中就可以看出。其實,不管你如何去做,最終的 解決方案肯定是一些模塊通過彼此的交互、建立一種關系來完成所需的功能。為什麼模式提出的方法就是好的呢?就是因為模式給出的關系舒緩了系統內部的"沖突 力",使人感受上去舒服一些。另外,模式並不是簡單的給出了一些概念間的關系,它進一步為我們提供了一個場景,提供了進一步工作的指導。是不是太抽象了, 我們來舉一個例子來說明一下:面向對象設計中 有一個著名的原則:SRP(Single Responsibility Principle),即一個類僅僅需要一個職責。如果一個類有多於一個的職責有問題嗎?實現起來當然沒有問題,但是經驗豐富者馬上就會感覺到職責間關系 的這種"沖突力",從而感覺到不舒服。反映到實現層面上就是本來毫無關系的模塊間依賴過於強,導致代碼僵化,牽一發而動全身。"高內聚,松耦合"堪稱軟件 領域處理模塊間關系的首要指導原則,但是它沒有告訴我們對於一個問題具體該如何去做,模式的出現填充了這個空白,如果我們知道一個模式可以解決我們手頭的 問題,那麼我們就可以非常感性的認識到如何達到"高內聚,松耦合",因為模式已經給出了這些關系。這一層境界非常抽象,很難達到,有興趣的讀者可以閱讀參 考文獻[1],相信會有更進一步的認識,更加深入的理解。

下面我們就來談談模式為什麼能夠為系統架構的構建帶來有效的幫助。

面向模式構建系統架構
前面介紹了構建系統架構時的難點,本小節將講述一下模式如何能夠有效的解決這些難題,使得系統架構的構建變得有章可循。

前面曾經提到過,Commonality/Variability分析方法可以有效的發現反映問題領域本質的概念,但是不能十分有效的發現抽象概念間的關 系。如果Commonality/Variability分析方法和模式結合起來,就能夠有效的解決這個問題。上一小節也說過,模式其實就是一些關系。如 果我們有一些需求,並且我們知道有針對該需求的模式,那麼我們就可以通過Commonality/Variability分析方法發現反映問題領域本質的 概念,然後根據可用的模式去建立這些概念之間的關系來實現我們的需求。這樣我們就可以通過模式有效的克服不能有效確定概念間關系的難點。

模式本身並不僅僅簡單是一些關系,它還具有深刻的內涵。它具有自身的意圖、動機、適用性以及核心解決方案等眾多的內容。一旦我們確定使用了一個模式,那麼 這個模式就為我們搭建了一個內容豐富的場景,這個場景可以非常有效的指導我們進一步的工作,啟發我們發現新的對象。這樣,基於模式構建的系統架構就變得抽 象(模式本身就是一些抽象的關系)而不空泛並且具有很好的延伸性。

模式也提供了一套公認非常有效的記錄方法,可以把自己經過反復驗證的解決方案記錄下來傳授給其他人重用,即模式具有可傳授性。這樣,有經驗的系統架構師就可以把自己的一些心得體會通過模式的方法記錄下來,就可以克服經驗無法有效傳授的問題。

其實很多模式本身就是針對系統架構提出的,比如:MVC(Model-View-Controller),它是專門針對交互系統提出的,所以如果我們要構 建一個交互系統,那麼我們就可以直接應用MVC模式,然後在該模式所搭建的場景的啟發下去發現Model、View以及Controller,在這個大的 場景的指導下根據其它的需求(模式)構建一些小的場景對系統進行有效的分化。細心的讀者會發現,模式和系統架構有很大的相似性,都是處理一些抽象概念間的 關系,但是二者還是有很大的不同的,模式是領域無關的,它是解決一些抽象問題的,但是系統架構是針對我們要解決的實際問題的,是領域相關的。我們可以通過 對問題領域的分析、分解,找到和我們要解決的問題匹配的模式,對該模式進行定制應用到我們的系統中來。把模式結合在一起構建起整個系統架構來。

面向模式構建的系統架構在需求發生變化時還會使我們處於一個非常有利的位置。為什麼呢?因為模式是針對一個反復出現的問題的優秀的解決方案,它的方法就是 發現變化、封裝變化。它本身已經充分考慮了變化的情況。模式采用了一種不同的對待變化的方法,它不是預先考慮會如何變化,而是考慮哪裡可能會變化,然後隔 離,所以當變化發生時我們就處於一個有利的位置上。

最後讓我們來看看模式論壇研究、探討的一個焦點論題:模式的生成性。模式的生成能力是指模式創建最終行為的能力。有人認為,模式系統可以形成一種語言,即 模式語言。模式既是模式語言的要素,同時又是模式語言的規則。象數學證明一樣,可以通過模式的推導、演繹生成系統架構。當然,目前的模式語言遠遠還不完 備,還不具有如此強大的生成能力。不過,至少為我們的軟件開發的永恆解決方法提出了一個美好的希望,讓我們大家共同來為此努力。有興趣的讀者可以到 hillside.net獲得更多有關模式語言的信息。

JUnit架構一覽
前面講了這麼多,本小節我們將結合一個實例進行說明。我所選擇的是JUnit,一個很著名的單元測試工具,選擇它作為例子主要有兩個原因:其一是 JUnit相對比較簡單,這樣我可以集中於要論述的主題;其二是JUnit中大量使用了模式,這樣大家可以對於上面的論述有一個感性的認識。下面對於 JUnit的說明會比較粗略,讀者可以到http://www.junit.org/去了解有關JUnit的更加詳細的信息。

JUnit是一個單元測試工具,所以它就要滿足使用者對於單元測試工具的需求。讓我們一一來進行說明,首先測試用例的書寫必須要容易,只有這樣大家才可能 會使用該測試工具。要迎合這一點,我們可以通過把測試用例表示為對象的方式來完成,對象的概念和人思維中的概念最為貼近,表示起來也最為自然。 Command非常符合我們的要求,看看它的意圖:將一個請求封裝成一個對象,從而對請求進行排隊或者記錄日志…。另外,測試工具要為使用者做它能夠做的 最多的事情,盡量減少使用者的工作量,我們必須對測試的一般流程進行分析,歸納出一個模板流程,這樣就可以使使用者僅僅關注自己所需要的具體步驟而不用考 慮如何去組織這些步驟(一般的測試都分為測試准備即setUp,運行測試即runTest以及結束清除即tearDown階段),Template Method模式正好能夠幫上忙。另外,測試工具應該能夠統一處理單獨的用例以及多個用例的組合,這樣也可以大大減少使用者的工作量,是不是馬上就想到了 Composite模式,不錯,就是它。

下面根據上面的論述,在我們所得出的模式場景的指導下,給出JUnit系統架構的UML圖表示:


Junit本身提供了源代碼,有興趣的讀者朋友可以參閱。不過如果了解了系統的架構後在去看源代碼的話,相信會有不同的感受。

結論
本文從宏觀上探討了系統架構、模式以及模式在構建系統架構方面的的有效性。限於篇幅,其中有很多重要的內容沒有做十分深入的論述,關於這些內容准備在後續 的文章中作為獨立的主題來講解。希望本文能為讀者朋友帶來一些啟發。最後我就以模式的提出者Christopher Alexander的一段具有深刻內涵的話作為結束:"以一種松散的方式把一些模式串接起來建造建築是可能的。這樣的建築僅僅是一些模式的堆砌,而不緊 湊,這不夠深刻。然而另有一種組合模式的方式,許多模式重疊在一個物理空間裡,這樣的建築非常緊湊,在一小塊空間裡集成了許多的內涵,由於這種緊湊,它變 得深刻。"

參考文獻

The Timeless Way of Building, Christopher Alexander
Design Patterns Explained: A New Perspective on Object-Oriented Design, Alan Shalloway and James R. Trott
Multi-Paradigm Design for C++, James O. Coplien
Design Patterns, Gamma, et. al.,
 
http://hi.baidu.com/jiljil/blog/item/48a12338fd990126b9998f32.html

到底要不要讀計算機研究生!!!!!!

到底要不要讀計算機研究生!!!!!!
2010-03-11 1:56

http://huangmoyue-gmail-com.javaeye.com/blog/542863

就我自己的理解,談談我對讀研和軟件學院的看法,不妥之處一笑了之即可。

  如果你有實際開發工作經驗,感覺自己的水平和實力進入了一個高原期,迫切需要從理論上提高,那麼計算機學院是唯一選擇。因為計算機學院才能讓你在理論 上更上一層樓。軟件學院從教學計劃上就沒有把你往這方面帶。當然能不能更上一層樓最終還是完全取決於你自己。需要特別說明的是,工作經驗並不一定等於開發 經驗,我見過很多工作2-3年的人,但是沒有一點開發經驗。

  你說:「他們都有很強的開發能力,只是不太喜歡讀書,也只是希望混個學歷對今後在崗位上晉升有好處」,我可以向你保證,你所說的人絕對不是開發能力很強的人。因為,1)高手不可能不喜歡讀書;2)高手不可能想去混一個學歷;3)高手不可能認為晉升是因為學歷的原因。

  還需要說明的是,考計算機的人未必個個都是高手,嚴格來說,大部分都不會編程序。也就是說,庸庸碌碌之輩仍然佔絕大多數。研究生畢業的師兄只拿 2500 元左右的比比皆是,所以不要寄希望於拿一張研究生文憑出去賺高薪。但是,對於有實際開發工作經驗的人,要想自己在3年之中有一個真正的提高的話,計算機學 院提供了廣闊的平台。就我所知,每一個月拿2萬以上的也有(上海育碧,圖形特效算法設計)。所以,同為研究生畢業,能力的差距是極大的。所以,不要去問 「研究生畢業能拿多少?」,要問「像我這種水平的人,研究生畢業能拿多少錢?」這樣人家才能夠准確地回答你。

  所謂「有實際開發工作經驗」是指你目前已經具備下列能力:1)你已經認為C++和匯編語言都是很簡單的語言,並能夠自如地運用;2)你能夠在30分鐘 之內想到正確的五子棋AI算法設計思路和方向;3)你完全理解STL為什麼這麼重要;4)你能夠獨立地解決所有的編譯與鏈接問題,哪怕你從來沒有遇到的問 題,你也不需要詢問任何人;5)英文網站是你的首要信息來源;6)能夠讀懂英語寫成的國際標准,比如NTFS磁盤格式標准。7)你經常站在集合論的角度思 考算法問題;8)能夠理解一個簡單的驅動程序,能夠理解一個簡單3D交互程序;9)你能夠認識到線性代數和概率論在實際編程工作中的極端重要性;10)你 完全理解COM的設計思想,尤其能夠理解COM為什麼要設計成這樣;11)當我說到虛函數的重要作用時,你不會急著去找書來翻;12)你能夠說出C++為 什麼比其他語言優秀的理由,記住這種理由應該來自於你的開發體會,而不是因為其他人都這麼說。此外還有很多判斷標准,但如果你同時具備5條以上,可以認為 你已經具備相應的開發經驗了。在這種狀態下讀研,你將取得讀研效益的最大值。

  讀研最重要的是要明白你自己要干什麼,不能等導師來告訴你你應該干什麼。研究生的優勢在於理論功底深厚,思維具有穿透力,當然編程能力首先要過關,不 要讀完研究生還不知道MFC程序的WinMain函數在哪裡。所以,研究生期間,你一定要做有理論深度的算法設計,比如大規模數據的搜索算法,性能是首要 考慮因素,不要奢望SQL函數能夠幫你解決問題,所有的問題你都必須自己解決,你必須解決內外存交換的性能瓶頸。再比如極品飛車的3D場景生成,圖形變 換,碰撞檢測,物性模擬,紋理映射,燈光模型等等,這些都是可以保證你能拿到2萬以上月薪的技術。如果你認為這些東西太難,不可能做得出來的話,那麼你就 不適合讀研。真的,要是你認為讀研之後還是要去搞一般的程序設計,如信息管理系統之類的軟件,那麼你讀研的價值就完全不會得到體現,因為這些工作根本就不 需要讀研。

  軟件學院宣稱培養軟件開發人才,恕我直言,我從來沒有看見那個高手是培訓成功的。成為軟件開發高手的路只有一條:自學!軟件開發中需要大量的編程實踐 和獨立思考,只有在此過程中,你才能夠逐步成長起來。軟件學院宣稱培養軟件項目經理,這更是搞笑,在某種意義上這是欺騙行為。學院裡面能夠培養出軟件開發 經理更是十足的謊言,軟件項目經理必須,或者說更強調從戰爭中學會戰爭。沒有實踐經驗的項目經理就是繡花枕頭一個。

  實話實說,軟件學院就是一個蒙錢的機構,公關工作做得很好,善於打廣告,而且都是打著高薪的幌子,就如同外面的什麼北大青鳥培訓班一樣。兩個字:蒙錢!四個字:還是蒙錢!

  總之一句話,如果你只想成為軟件開發高手(比如認為會編驅動程序或殺毒軟件就是高手的那種),建議工作,不要考研;完全沒有工作經驗的,也不建議考 研,你進來了只有瞎混一通。如果你有上述工作經驗且想成為高級軟件工程師(能夠獨立理解並設計出快速傅立葉變換算法的那種軟件工程師)的話,那麼強烈建議 考研。考研讓你有3年放松思考的機會,也有3年讓你思想和技術積累沉淀的機會。非常難得的機會。不考研的話,這種機會就是一種奢侈,可望而不可即的那麼一 種奢侈。

  所以,不管你是哪一種情況,都不建議考軟件學院。除非你是女生,把能夠成為一個研究生當著一生最大滿足的那種女生。

  1)關於讀書的機會成本問題。讀研的機會成本的確是很高。任何人都可以簡單地計算出來。所以,我也不贊成所有的人都去讀研。讀研只適合那些痛感數學在 編程中的極端重要性的人。如果對理論工具和理論思維的極端重要性沒有切膚的認識,那麼讀研的價值幾乎為0;讀研的好處在於:A,把你自己放在一個學術和工 程的交叉點上;B,讓你具備了進入微軟等世界頂級軟件研發機構的可能性;記住只是可能性。但是不讀研這種可能性為0;C,如前所述,如果沒有讀研的機會, 你也就沒有靜下心來好好鑽研幾年理論的機會;一邊工作拿高薪,一邊深入地學習各種理論,諸位認為這可能嗎?我反正認為不可能,我覺得學習鑽研理論最需要的 就是一個長期安靜獨處的環境,一邊工作一邊讀書是不可能有這樣的環境的,你會覺得每天都在疲於奔命。而讀研正好可以提供這樣一個環境。我同時還反對整天跟 著導師的屁股後面跑,這樣會浪費很多時間。讀計算機的研究生,主要依靠自己去查閱最新文獻,自己去研讀文獻,和導師的口頭交流一個月一次就足夠了,前提還 需要導師的水平足夠牛。如果導師的水平不牛,這也沒關系,不理他就是了,自己做好自己的事情即可。

  2)關於研究生教學質量問題。坦白地說,全國都是「洪桐縣中無好人」,尤其在計算科學領域,大牛極少。那為什麼還要去讀研?大哉問!把讀研的收獲寄托 在名校或名師的名我認為氣上,是注定要失敗的。讀研全靠自學,研究生之間的差距全部體現在自學能力上面。又有人問,既然是自學,為什麼非要讀研?回答是: 因為讀研就是為你買一份保險,就是買一份你自學三年之後不會失業的保險。這份保險主要是一種心理上的後盾,讓你在自學過程中經得起誘惑,能夠從容鎮定地去 追尋計算機理論發展的堅實足跡,從歐拉,費馬,高斯,康托,圖靈等巨匠那裡尋找方法論的珠寶。倘若沒有這份保證,你在家裡面自學3個月,保證你會被失業的 壓力壓得喘不過氣來,何談安心學習?

  3)關於實戰經驗與理論學習的優劣問題。這沒有定論,如前所述,管理信息系統,設備驅動開發,工具軟件開發,軟件病毒剖析等等這些工作不太需要創造 性,需要的是耐心和經驗,需要的是對既有規范的准確理解,這類開發工作最適合在實戰中提高,理論學習沒什麼作用。但是在人工智能,模式識別,圖像壓縮,虛 擬現實,巨量數據檢索,自然語言理解,計算機圖形學等等領域,理論學習就佔據著絕對的統治地位!這些領域的突破對人類的生活的影響是極其巨大而深刻的。某 些領域處於一個極其快速發展的態勢之中,比如計算機圖形學,相信諸君能夠從眾多3D游戲的燦爛輝煌中體認到我的這種說法。在這些領域,如果沒有扎實的理論 功底,一切都是那麼遙遠,不管你花了多少時間在編程上面。

  4)關於高級研發人員的知識結構問題。首先聲明,我不是一個純粹理論激進分子,即認為除了理論之外,一切都不重要。我認為,純熟的編程技能是最基本但 也是最必不可少的技能。沒有這個基礎,一切計算機理論就是空談(研究圖靈可計算性理論的研究者除外)。有了這個基礎之後,下列理論學習方向必須重點突破:

  1,科學哲學。這是核心中的核心!可惜國內不開這門課。不但不開課,而且還作為批判對象來引用,實在是遺憾至極!這是一門教你如何「釣魚」的學科,在 一切科學研究中居於最核心的地位。它是古今科研方法和思維方法的集大成者,很難想象一個成熟的研究者沒有一套自己的方法論體系。科學哲學最需要的是領會與 總結,它的思想與啟示會伴隨我們的一生。

  2,康托集合論,矩陣方法,離散結構,圖論方法,群論方法之間的緊密關系。最重要的認識這些理論對實踐的重要啟示和方法引導。我始終認為,如果你學了 一門理論之後,卻不知道這門理論有什麼作用,那麼你的理論就白學了,你什麼東西都沒有撈著。所以,學習任何理論之前,先問自己:它有什麼用?在哪裡用?如 何用?帶著這些問題去學習理論,你才會真正地學到東西。用這三個問題去問你的理論課老師,他的回答就是判斷其實際水平的最佳標准。

  3,思維要有極強的穿透力,學會看透文獻作者沒有寫出來的動機。絕大部分大師都有隱瞞自己最具有方法論啟示意義的思考環節的習慣。牛頓和華羅庚先生都 有這個壞習慣。這讓大家認為他們是天才,因為很多問題他想到了,我們想不到。但是為什麼他們能想到,我們想不到?他們是怎樣想到的?沒有人告訴我們牛頓發 現萬有引力定律時的思考過程,當然,牛頓可以慷慨地把他的思考結果告訴我們,但是,他那可以點石成金的「金手指」卻沒有教給我們。我們的任務就是要培養透 過文章看穿作者背後意圖和動機的能力,在這方面,台灣的侯捷和美國的Donbox是絕佳典范。這兩只老狐狸(呵呵,是愛稱)憑著其獵犬一般的嗅覺,抽絲剝 繭,一個把COM背後的幕後設計動機揭開並暴露到了光天化日之下,另一個把MFC的宏觀架構做了一次完美的外科手術。其非凡的思維穿透力令人驚嘆。

  4,英語。英語本身不重要,但是用英語寫成的文獻就極其重要了。所以,專門把英語作為一個重頭戲列出來。大家不要相信英語無用論的鬼話。對於搞計算機的而言,英語就是你的母語!

  5,其它的具體理論還有很多,但是都不如這三個方面重要,因為我覺得這三個方面是最具有根本性,全局性的能力培養環節。需要指出的是,很多高深理論對你的工作是無意義的,當心時間陷進去。一定要把效率最高的時間段用在最具有決定性意義的理論學習上。

  6)關於讀研之後的出路是否光明的問題。我們應該承認,讀研之後,你的工作機會不是變多了,而是變少了。而且越是高手,他的工作機會和工作范圍就越 少。這是因為,越是搞前沿研發的公司,其數量越少,在這個圈子的人也就越少。你找工作的范圍就越小,試問:如果微軟的OS設計專家出來找工作,能夠讓他選 擇的公司能有幾家?但是,這種公司數量的減少是以工資待遇的急劇上升為補償的,同時,你在工作中所受到的充分尊重也是在一般公司中體會不到的。所以不要擔 心學了高科技用不上,呵呵,你只會越來越感覺自己學的不夠用。相信接到過獵頭公司電話的人會體會得到。真正的高手從來就不會擔心工作的問題,也從來不會到 人才市場上去找工作。既然選擇了理論深入,那麼就應該把眼光放得更遠。

互動設計概論

※ 【溝通的藝術】(p.23-26)
• 「美國數學家克勞德•夏農 (Claude Shannon)在1948年10月,發表了著名的(通訊的數學理論 A Mathematical Theory of Communication),這篇論文可以說是現代通訊理論研究的開端,夏農也因此被尊稱為資訊理論之父。
• 夏農在這篇論文中,將資訊系統界定為五大部份:資訊源頭 (information source)、傳遞器 (transmitter)、通道 (channel)、接收器 (receiver) 和目的地 (destination)。夏農的研究重點,在於闡述資訊傳遞時所必須克服的基本問題,並且為通訊的相關研究找出一個合理的概念模型。
tn_claude%20shannon1.jpg
(夏農和他著名的人工智慧電子鼠。圖檔來源:Bell Labs (上圖)。夏農提出的「通訊的數學理論」。圖表繪製:葉謹睿 (下圖))
• 著名的現代設計大師伊姆斯夫婦 (Ray and Charles Eames),在1953年拍攝一部名為《通信入門》(A Communication Primer)的影片,這部影片中,伊姆斯夫婦除了進一步闡述夏農的論述之外,還特別將它的設計與藝術創作結合在一起,討論創作者與觀眾之間的連結。」
tn_ray%20and%20charles%20eames.jpg
(伊姆斯夫婦根據夏農理論所繪製的通訊理論圖表。圖表繪製:葉謹睿 (下圖))
※【心智模式的建立】 (p. 26-29)
• 「心智模式的概念,由蘇格蘭心理及哲學家肯尼斯•克雷克 (Kenneth James Williams Craik) 在 1943年首度提出。
• 在認知科學之中,這個名詞一方面指人類的長期記憶中隱含關於世界的心靈地圖 (Mind Map),另一方面,則是指我們日常推理過程中短暫的理解。長期根深蒂固的信念,會主導短暫的心智模式。短暫心智模式的日積月累,也會逐漸潛移默化影響長期養成的信念。
• 唐納•諾曼 (Donald Norman) 在 1986年,曾經以圖表來解釋互動設計心智模式的三個概念。」
tn_Dondld%20Norman.jpg
(互動設計心智模式的三個層面。圖表繪製:葉謹睿 (下圖))
※【程序與工具-六個方法】(p.60-67)
• 「著名的19世紀德國物理、生理學家赫曼•馮•赫姆霍茲 (Hermann con Helmholtz),曾經將創意發想分成『飽合』、『蘊釀』和『靈光乍現』三個階段。…透過研究調查得來的知識,其實才是創意最好的出發點。
1. 量化評估 (Quantitative Measurement)
2. 問卷 (Survey)
3. 焦點團體 (Focus Group)
4. 面談 (Interview)
5. 實境調查 (Contextual Inquiry)
6. 文化探測 (Cultural Probe)
• 量化評估的結果,比較接近於描述一個社會現象,適合用來表達客觀事實、局外人的觀點、破除迷思和偵測規則性。另一種研究的典型是質化研究 (Qualitative Research )。質化研究比較主觀,與個案緊密連結,也比較能夠表達個人觀點,因此有助於深入瞭解使用者,面談、實境調查和文化探測都是質化研究的典型。」
tn_the%20principles%20of%20interaction%20design%20in%20the%20postdigital%20age.jpg
※ 書目資料:
書名:互動設計概論:後數位時代的網站、介面、產品及軟體設計的原則
作者:葉謹睿
ISBN 978-986-282-001-8,繁體中文
台北市:藝術家
初版;191面; 2010年;
定價:NT$380元

標籤