subroutines

As other languages do, Perl has the ability to make subroutines, which are user-defined functions. The subroutine name comes from a separate namespace, so Perl won』t be confused if you have a subroutine called &fred and a scalar called $fredRead the rest

弱者的悲哀

3月31號,去大江東考場練習科目三,包括自己在內一共五個學員,早上七點半就到場地了,那時候還沒有多少人。我是第四個上車的,那時大約到九點了。我前面那個女學員不知是因為剎車太急還是轉向燈沒開的問題,被教練逮到機會一頓辱罵,說什麼沒帶腦子,說了多少次還記不住,之後都是很難聽的話。中間我曾想制止和反擊教練,不過轉念一想,我若是替她鳴不平,教練肯定會說跟我在罵她,跟你沒關係什麼的。於是,我決定等待。到我了,上車掛一檔的時候,感覺這車的檔位和上次開的車的檔位手感不太一樣,於是重掛了幾次,又問教練是不是掛對了。教練這時開噴了,說你問什麼,叫你不要問,聽着就行了,接着又開始了他的習慣性辱罵。沒等他說完,我就以兩倍的音量回擊他。他先是怔了一下,應該是沒想到會有學員反駁他,接着跟我吵。不過明顯語氣減弱了許多,說什麼這樣是為你們好,讓你們記住云云。同車的學員也都勸我,少說兩句,教練也是為你好之類的。… Read the rest

Scalar Data

Numbers

All Numbers Have the Same Format Internally

Internally, Perl computes with double-precision floating- point values. This means that there are no integer values internal to Perl—an integer constant in the program is treated as the equivalent floating-point value. Examples:… Read the rest

Bad design

最近項目中有個需求是關於下載進度條的。原來我們在 cloud 上面下載文件,點擊下載之後,實際上要先計算出要下載哪些文件(因為可能包含文件夾,文件夾內的文件需要網絡請求才知道),然後開始真正的多線程下載。我們把之前的計算階段稱為 calculating 階段或 preparing 階段,後面的下載階段稱為 downloading 階段。如下兩幅圖所示:… Read the rest

我與地壇

上個周末讀了史鐵生的《我與地壇》,對他的北京話印象深刻。北京方言和河北方言差不多,讀他回憶的那些故事,不覺間想到了自己的童年。摘錄其中的幾段暫作為讀書筆記吧。

我的夢想

  • 也許是因為人缺了什麼就更喜歡什麼吧,我的兩條腿一動不能動,卻是個體育迷。
  • 我希望既有一個健美的軀體又有一個了悟人生意義的靈魂,我希望二者兼得。

好運設計
史鐵生20歲時雙腿癱瘓,很不走運。所以他常常在床上想如果有來世,自己會有一個什麼樣的命運。他設想了一個完美的命運,一個完美的人,最好生在一個普通知識分子家庭。在鄉下不好,在貴府名門也不好。下面這段對於生在農村的我來說感觸很深。

  • 降生在什麼地方也是件相當重要的事。二十年前插隊的時候,我在偏遠閉塞的陝北鄉下,見過不少健康漂亮尤其聰慧超群的少年。當時我就想他們要是生在一個恰當的地方他們必都會大有作為,無論他們做什麼他們都必定成就非凡。但在那窮鄉僻壤,吃飽肚子尚且是一件頗為榮耀的成績,哪還有餘力去奢想什麼文化呢?所以他們沒有機會上學,自然也沒有書讀,看不到報紙電視甚至很少看得到電影,他們完全不知道外面的世界是什麼樣子,便只可能遵循了祖祖輩輩的老路,日出而作日入而息,春種秋收夏忙冬閑,日復一日年復一年。光陰如常地流逝,然後他們長大了,娶妻生子成家立業,才華逐步耗盡變作純樸而無夢想的漢子。然後,可以料到,他們也將如他們的父輩一樣地老去,惟單調的歲月在他們身上留下註定的痕迹。而人為什麼要活這一回呢?卻仍未在他們蒼老的心裏成為問題。然後,他們恐懼着、祈禱着、驚慌着聽命於死亡隨意安排。再然後呢?再然後倘若那地方沒有變化,他們的兒女們必定還是這樣地長大、老去、磨鈍了夢想,一代代去完成同樣的過程。或許這倒是福氣?或許他們比我少着夢想所以也比我少着痛苦?他們會不會也設想過自己的來世呢?沒有夢想或夢想如此微薄的他們又是如何設想自己的來世呢?我不知道。我不知道。我只希望我的來世不要是他們這樣,千萬不要是這樣。

記憶與印象1

  • 故事有時候是必要的,有時候讓人懷疑。故事難免為故事的要求所迫;動人心弦,感人淚下,起伏跌宕,總之它要的是引人入勝。結果呢,它僅僅是一個故事了。一些人真實的困苦變成了另一些人編織的愉快,一個時代的絕望與祈告,變成了另一個時代的瀟洒的文字的調遣,不能說這不正當,但其間總似拉開着一個巨大的空當,從中走漏了更重要的東西。

這段其實是說史鐵生的「姥爺」,一個國民黨抗日軍官,在「解放」時被小人算計,最後被執行槍決。他說這其中必定隱匿着一個故事,悲慘的,或者竟是滑稽的故事。但他不想去考證,不想讓這成為一個故事,一個供後來人消遣的故事。

記憶與印象2

  • 模仿電影里的行動,是一切童年必有的樂事。...... 因而,曾有一代少年由衷地嚮往那樣的烽火硝煙。(「首長,讓我們上前線吧,都快把人憋死了!」 「怎麼, 着急了? 放心,有你們的仗打。」)是呀,打死敵人你就是英雄,被敵人打死你就還是英雄,這可是多麼值得!故而衝鋒號一響,銀幕上炮火橫飛——一批年輕人撂倒了另一批年輕人,一些被懷念的戀人消滅了另一些被懷念的戀人——場內立刻一片歡騰。
  • 我獨自看那「編劇」後面的三個字,早已懂得:有為,與愛情,原是風馬牛不相及的兩個領域。但暫時,亦可在心中長久,而寫作,卻永遠地不能與愛情無關。

想念地壇

  • 再看那些老柏樹,歷無數春秋寒暑依舊鎮定自若,不為流光掠影所迷。我曾注意過它們的堅強,但在想念里,我看見萬物的美德更在於柔弱。...... 柔弱,是信者仰慕神恩的心情,靜聆神命的姿態。...... 但要是「愛」也喧囂,「美」也招搖,「真誠」淪為一句時髦的廣告,那怎麼辦?惟柔弱是愛願的識別,正如放棄是喧囂的解劑。

讀這部分的時候,突然想到某人的溫柔。我想,溫柔也是一種很難得的美德吧。

  • 寫,真是個辦法,油然地通向著安靜。寫,這形式,註定是個人的,容易撞見誠實,容易被誠實揪住不放,容易在市場之外遭遇心中的陰暗,在自以為是時回歸零度。把一切污濁、畸形、歧路,重新放回到那兒去檢查,勿使偽劣的心魂流布。

我想,不僅是寫,讀也是這樣。讀到文中幾段反思自己的惡的部分,我看到了自己曾經的虛偽。很多事,並不因為沒有人追究你,你就能逃脫懲罰。也許在某個午後,往事會一幕幕襲來,醜陋的內心暴露在陽光下,痛苦與悔恨充斥心間,而你卻什麼也做不了。借用《一個女孩》中的一句話:當你無法說抱歉的時候,你的錯誤就變成肉中刺。

希望在這個浮躁的世界,仍然能做一個真誠的人,誠實的人。… Read the rest

走出迷惘

今天是2018年的第一天,回想過去的一年,忙碌、希望、難受、頓悟、反思,經歷了很多,覺得有必要寫下來(其實還是跟風和矯情),作為成長的見證,然後為新年做一個新計劃。

時間回到2016年8月,辭職後找工作,然後去了THS。 事後證明這是一個錯誤的決定。9月入職,感覺工作很不開心。10月國慶期間做了一個手術,感到很煩。11月從THS辭職,然後又是找工作。這次沒有想像中那麼順利,西溪那邊基本都是創業公司,不想去。當時收養了一小貓,留戀在西溪的環境,不想去濱江。後來覺得可能真的無法在西溪找到工作,沒辦法來濱江了。12月來到Glority,感覺還行吧。不過可能還是自己適應能力比較差,加上沒有自信,前期做的並不好。我得感謝我的領導CCC,關鍵時刻給了我很多啟發,也讓我找回了自信。後面的工作算是走上正軌了吧。

對於我,2017年的關鍵詞應該是忙碌。工作上很忙,零經驗做windows界面開發,有很多東西要學。同時空閑時間也讀了一些書,看了幾部可愛的動漫和一些老電影。

讀書

經濟學原理(by 格里高利・曼昆)
還在THS的時候,同事YY給我推薦了這本書。16年讀了《微觀經濟學》分冊,17年讀了《宏觀經濟學》分冊的一部分,讀完感嘆原來教材還可以這樣寫。理論介紹得很充分,很詳細,然後每章都有對應理論的實例分析和練習題。書中介紹的很多理論,如比較優勢,供求定理,歧視經濟學等,都對生活中的經濟現象做了非常好的解釋。我覺得這本書應該成為大學必修課的內容,它值得每個人學習。
今年如果有空,還想再複習並整理一遍《微觀經濟學》,然後讀《國富論》。

正義的成本(by 熊秉元)
這本書是初戀推薦給我的。不過我一直沒有去看,直到17年才在看完經濟學後想起來。這是一本法律經濟學的入門讀物,書中的大部分內容現在已經不大記得了,大概是對生活中的現象從法律和經濟兩方面做出解釋和指導。這本書沒有《經濟學原理》中那麼多的理論,更多的是針對生活的案例提出一些比較好的思考方式。印象最深的是其中提到的2種思維方式:假設性思維和財富最大化。

醜陋的中國人(by 柏楊)
這本書是一本雜文集,其中收錄了柏楊先生在各地的演講稿和發表在雜誌上的一些文章。書中指出了中國人的各種醜陋之處:臟、亂、吵,窩裡斗、不團結,死不認錯,諱疾忌醫,明哲保身,沒有獨立思考能力和鑒賞能力,奴性,崇古,不求上進,權勢崇拜,只我例外,不講是非,只講「正路」,責備賢者等等。柏楊先生把中國人醜陋的原因歸結為「醬缸文化」,大概就是傳統文化中的糟粕的集合。這本書更多的意義在於自省,對照書中的各種陋習,時刻反省自己。

野火集(by 龍應台)
這本書是龍應台在80年代所發表的抨擊時弊的文章的合集。當時台灣還處在集權統治之中,這本書里的文章就是針對當時的種種黑暗、醜陋的社會現象和制度進行抨擊。儘管這本書寫在80年代的台灣,但其中所涉及的黑暗和醜陋在當代大陸仍然存在,其中的評論放到現在仍然發人深省。在台灣民主化後,人民開始被另一種敵手所困擾:一種以庸俗淺薄為時尚、以「絕對娛樂」為目的、以行銷消費為最高指導原則的生活哲學。但我感覺這好像不單單是台灣遇到的問題,而是世界上很多地方都在面臨的問題,包括大陸。摘錄其中的一句:我也確信那個不公的體製得以存在,是因為個人允許它存在;比體制更根本的問題,在於個人。

一個女孩(by 陳丹燕)
這是陳丹燕的一本自傳體小說,寫的是她小時候(文化大革命時期)的一些經歷。主要寫了那個年代發生的種種匪夷所思和令人恐怖的事,以及她自己的感受。總的來說,讀起來是那種平靜中帶着悲傷的感覺,也有一點矯情。摘錄其中一段如下:老人臉上誠實地面對孩子的神情,像一根針一樣刺痛了我,那裡我明白了,人的心都是那樣柔軟,柔軟的心是那樣珍貴。當它呈現在你面前時,就像跌破了皮膚的傷口,乾淨、新鮮,不能用手指碰,一下也不能碰,不然那心會很疼,但人有一顆柔軟乾淨的心是多麼好。

奇怪的是它被歸類於兒童文學,我並不認為兒童能在沒有相關背景的情況下讀懂。

除此之外,還讀了弗洛姆的《愛的藝術》,主要講了怎樣自愛和愛人;野夫的《江上的母親》,主要是野夫的回憶文章和散文,文筆很好;還有前同事yjy推薦的《刻意練習》,主要講了學習的方法,在某一領域成為專家或者傑出人物需要「刻意」地練習。

技術方面,讀了《人月神話》,《Effective C++》,《clean code》,《Professional C# 5.0 and .NET 4.5.1》(Part 1)和《WPF編程寶典》(看了一部分)。其中,《Professional C# 5.0 and … Read the rest

迷信權威

 一直以來,我都是一個迷信權威的人。可能是因為沒讀過什麼書,所以獨立思考能力很差。上學的時候把課本和老師當成權威,上班後把領導當成權威。既然覺得他們是權威,心裏會認為他們說的做的即使不完全對,也肯定是有一定道理的。

 還記得有個同學跟我說她在公司就是看代碼,領導不信任她,所以不讓她寫代碼。我聽了一方面覺得很遺憾,碰到這樣有性別歧視思想的領導是一種不幸。另一方面覺得領導是不是有領導的考慮。這幾乎是我的下意識。後來,當我遇到其他的領導的時候,我才發覺我錯了。我意識到,我們有很多優秀的開發者,但很少有優秀的管理者,甚至是合格的管理者。大部分做技術的轉管理其實並不天生具有管理的經驗,也因此並不是開發做的好管理就一定做的好。

 我想產生這種奇怪的想法源於我一慣迷信權威,缺乏獨立思考。覺得領導之所以當上領導肯定是比一般人要厲害,做出的決策安排肯定有其合理的地方。現在又想起來這件事,發現性別歧視就是性別歧視,這個並沒有什麼可洗的。

 但是在這裡想向那個同學道歉,真的很對不起。希望她沒有因為我的話而懷疑自己,失去做開發的信心。

 有時候會想自己不經意的一句話,可能就會對別人產生誤導和傷害,感覺還是要多讀書,提高自己的知識水平。另外,謹言慎行,與大家共勉。… Read the rest

人月神話

抽空把《人月神話》複習了一遍,回顧自己近期的工作,想對書中的一些觀點談談自己的感受。

  1. 編程行業「滿足我們內心深處的創造渴望和愉悅所有人的共有情感」,其提供了五種樂趣

    • 創建事物的快樂;
    • 開發對其他人有用的東西的樂趣;
    • 將可以活動、相互嚙合的零部件組裝成類似迷宮的東西,這個過程所體現出令人神魂顛倒的魅力;
    • 面對不重複的任務,不斷學習的樂趣
    • 工作在如此易於駕馭的介質上的樂趣——純粹的思維活動——其存在、移動和運轉方式完全不同於實際物體

    最近公司接了一個活,目標是把一個windows上的軟件產品做成跨平台的,也就是windows和mac。僱主那邊寫了一個類似於WPF的框架,目前需要我們把原來用MFC寫的界面換成用他們的框架寫成的界面。寫了2天之後我發現這個工作大部分是體力活。首先你需要把原來的界面用他們的框架畫好,就跟寫WPF界面差不多。然後把原來界面中的邏輯重新實現一下。因為沒有文檔,全靠參照前期領導寫的代碼和問同事,所以寫得比較累。繼續寫了幾天以後,感覺這個東西沒有給我帶來任何成就感。我覺得我成了流水線上的工人,原來編程帶給我樂趣都不存在了,有的只是重複和被push的壓力。原來覺得編程是一種腦力勞動,現在發現在你掌握了一定的技術基礎之後,有些事情就變成了體力勞動。對於這種工作,我的態度是按時上班,按時下班,不付出額外的勞動。因為我覺得這個工作不值得我付出哪怕多一點的精力。它對程序員而言是一種痛苦。加班加點地做這種痛苦的事只會使自己逐漸喪失對編程的樂趣。所以我一直在自學一些覺得有意思的東西,始終讓自己保持對編程的新鮮感。我知道我還要寫幾十年的程序,保持興趣才能讓我不斷進步。

  2. 所有的編程人員都是樂觀主義者,「一切都將動作良好」。
    這個是我感受最深的一點。從我非常有限的編程實踐中,我發現從project manager到一線程序員,普遍都對進度做了過於樂觀的估計。書中提到了幾個點說明為什麼進度常常不是按照我們估計得那樣進行。

    • 由於編程人員通過純粹的思維活動來開發,我們期待在實現過程中不會碰到困難。但是我們的構思本身是有缺陷的,因此總會有bug.
    • 圍繞着成本核算的估計技術,混淆了工作量和項目進度。人月是危險和帶有欺騙性的神話,因為它暗示人員數量和時間是可以相互替換的。
    • 在若干人員中分解任務會引發額外的溝通工作量——培訓和相互溝通。

    做樂觀的進度估計很多時候來自於客戶或者僱主的壓力。項目經理會受到來自於客戶的壓力,一線開發者又會受到同事和項目經理的壓力。然而實際完成的時間並不會由於估計的時間少就會早完成。從實際來看,我完成的時間一般都是領導估計時間的3倍左右。我覺得我領導估計時間更多地考慮了代碼變動所花的時間,而忽視了其它活動所花的時間。因此實際完成時間和預估時間相差比較大。

  3. 目標上(和開發策略上)的一些正常變化無可避免,事先為它們做準備總比假設它們不會出現好的多。
    程序員都希望需求是一成不變的,可是實際項目的需求往往一變再變。來公司3個月的時候,領導給了我一個小需求。要求在原來的界面上加幾個控件,本來位置和個數寫死就行了,後來變成了控件類型和數量都可以動態變化,控件位置也要動態改變。我原來實現的時候,只用了一層抽象去實現,這樣實現起來可以滿足需求,但可能很難應對變化。領導建議我把控件分組,增加一層抽象。後來僱主又要求控件布局也要動態變化,我才想到領導的先見之明。提前想想可能出現的需求變化,在前期適當增加一些抽象,往往可以更容易應對以後的需求變化。當然這個其實要求你對業務比較熟悉,能夠對可能的需求變化做一些預測。後來我想寫出好的軟件除了需要精通各種技術之外,還需要熟悉業務,不熟悉業務很難做出有價值的決策。

  4. 缺陷修復總會以20%~50%的幾率引入新的bug.
    在不斷的改bug過程中,我越來越覺得這是真理。因為改bug需要你先理解原有的邏輯,對於老項目而言,特別是沒有文檔的老項目,理解它一個模塊的各個邏輯是比較費力的。有時候你覺得你理解了它原有的邏輯,但你可能忽略了其中一個case,於是你的這次改動就引入了新的bug. 很多時候也是由於面前工期的壓力,你沒有時間完全理解原有的邏輯,只想快點解決這個比較嚴重的bug。這些都是導致新bug的原因。

  5. 即使是完全開發給自己使用的程序,描述性文字也是必須的,因為它們會被用戶——作者遺忘
    這條說的是文檔的重要性。就我現在做的項目而言,是美國的外包項目。美國那邊很重視文檔,一開始就把詳細的需求說明書(或者叫規格說明書)寫好,並在以後根據情況隨時更新。這樣開發做起來就完全清楚要做什麼功能,把功能具體做成什麼樣。原來待過一個月的A公司,經常是領導口頭交待任務,具體做成什麼樣領導自己也不清楚,靠自己去問其他人,沒有任何規範。我很難想像它這個項目能維護下去。現在做的這個項目已經有20多年的歷史了,仍然能夠維護下去,我覺得文檔是很重要的一點。有什麼問題,先看看原來的文檔是怎麼定義功能的,這樣很多東西都有據可查。另外一點,代碼中的注釋也是極重要的,特別是針對特定case所寫的代碼,一定要寫上注釋,否則後面維護的人可能就倒霉了。在這一點上,我覺得我的領導給我做了很好的示範。通過他的code review,我逐漸明白了何時注釋以及怎樣寫好的注釋。

  6. 在未來的十年內,無論是在技術還是管理方法上,都看不出有任何突破性的進步,能夠保證在十年內大幅度地提高軟件的生產率、可靠性和簡潔性。
    這是Brooks博士最重要的論點。他認為軟件開發中最主要的困難是規格說明、設計和測試這些概念上的結構,而不是對概念進行表達和對實現逼真程度進行驗證。軟件開發中有一些無法避免的內在特性:複雜度、一致性、可變性和不可見性。正是這些內在特性導致了軟件開發的生產率不會得到大幅度的提高。在他論文發表後的幾十年時間裏,軟件開發領域出現了很多新的語言、工具、程序庫,但這些只解決了軟件開發中的一部分次要困難。
    不過,Brooks博士也提出了一些解決主要困難的方法。其中一個是需求精鍊和快速原型。需求精鍊是說,必須與客戶進行深入的溝通,明確化客戶需求中模糊的部分。但即使這樣客戶還是會有很多地方無法精確表達自己的需求,而改變傳統的軟件開發流程可能對解決這個問題有很大幫助,即快速原型。首先系統應該能夠運行,即使未完成任何有用功能,只能正確調用一系列偽子系統。接着,系統一點一點被充實,子系統被輪流開發,或者在更低的層次調用程序、模塊、子系統的佔位符。這種方法要求自上而下的設計,因為它本身是一種自上而下增長的軟件。
    讀完這個論點,我還是有點雲里霧裡的。可能是經驗太少,做的只是一小塊,所以感觸也不多。

最後,想用書中的一段評論來結尾,送給國內的開發者:
現實世界中的管理就是在更大程度上以人員的生命為代價,讓他們更努力、更長時間的工作。經理們總是不停地吹噓他們的人員的加班時數和能從這些人身上榨取更多時間的小把戲。這種情況下,開發產品的質量一定會下降,甚至慘不忍睹,因為開發人員唯一能控制的是質量,當他們不得不犧牲質量,痛苦地面對自己的工作,踐踏工作的樂趣時,可以想像項目成本會大大增加,並且項目的發佈往往伴隨着一大批程序員的倒下。Read the rest