程式碼整潔之道
簡介:
本書是程式設計大師“Bob 大叔”40餘年程式設計生涯的心得體會的總結,講解要成為真正專業的程式設計師需要具備什麼樣的態度,需要遵循什麼樣的原則,需要採取什麼樣的行動。作者以自己以及身邊的同事走過的彎路、犯過的錯誤為例,意在為後來者引路,助其職業生涯邁上更高臺階。
本書適合所有程式設計師閱讀,也可供所有想成為具備職業素養的職場人士參考。
第十四章 輔導、學徒期與技藝
計算機科班畢業生的質量一直令我頗感失望。究其原因,並不是這些畢業生不夠聰明或缺乏天分,而是由於大學並沒有教授真正的程式設計之道。
14.1 失敗的學位
我認同在大學裡是有可能獲得良好教育的,但是我也認為,在大學裡完全也可以矇混過關,混得一紙文憑,其實什麼都不懂。
那些符合要求的畢業生有個共同點:他們幾乎都在進入大學之前就已經自學程式設計,並且在大學裡依然保持自學的習慣。
而且還有另外一個問題。即使是最好的電腦科學學位教學計劃,通常也不足以幫助年輕畢業生充分準備好應付工作後遇到的挑戰。在這裡,我並不是要控訴教學計劃裡的那些課程。在學校中所學的內容和在工作中發現的實際需要,這兩者之間通常會有巨大的差異。
14.2 輔導
在第一個案例中,我透過一本精心編寫的手冊向作者學習。
在第二個案例中,我透過觀察他人工作來學習,儘管他們對我視若不見。在這兩個案例中,我所獲得的知識雖然基礎但是意義深遠。
沒人幫助我理解真正專業的程式設計師是怎樣的,也沒有什麼專門的人教我該如何行動以及做什麼事情是有價值的。我必須自己摸爬滾打,自己教自己,而這絕非易事。
我最終挺過來了,而且也取得了成功。但是,這個過程本來可以走得更好。如果當時我有一個真正的導師,能夠深入淺出地指導我跨過其中的溝溝壑壑,那我的路途就要平坦很多。我可以在給他打下手完成一些小任務時觀察他的工作方式。他會對我的工作進行審查,指導我的早期工作。他會專門教導我建立正確的價值觀和反思內省的習慣。這類角色,你可以稱他為“老師”“大師”或是“導師”。
14.3 學徒期
但是,在軟體開發行業中已經形成一種觀點,認為程式設計師就是程式設計師,一旦畢業後就肯定會程式設計。事實上,一些公司在僱用一些剛從學校裡出來的毛頭小孩後,就會立馬將他們組織成“團隊”,把他們扔到關鍵系統的開發中,類似這樣的情形屢見不鮮。這真是荒唐透頂!
大師:
- 他們是那些已經領導過多個重要軟體專案的程式設計師。一般說來,他們已經擁有10年以上的從業經驗,曾在多個不同型別的系統、語言和作業系統上工作過。
- 他們懂得如何領導和協調多個團隊,他們是熟練的設計師和架構師,能夠遊刃有餘地程式設計。
- 組織曾為他們提供管理職位,但是他們不是拒絕就是在接受管理職位後又回去了,或是將管理職位和主要承擔的技術角色整合在了一起。
- 他們透過閱讀、研究、練習、實踐和教學來維持自身的技術水平。公司會把專案在技術方面的主要職責交由大師承擔。想象一下,大師就像“Scotty[5]”。
熟練工:
- 他們還處在受訓期中,不過已能勝任工作,而且精力充沛。
- 他們彼此間的經驗水平差異可能很大,但是平均經驗水平大約在5年左右。
- 在職業生涯的當前階段,他們將會學習如何在團隊中卓越工作和成為團隊的領導者。
- 他們對當前的技術都十分了解,但是對其他許多系統尚缺乏經驗。
- 他們一般只瞭解一種語言、一個系統、一種平臺,但是他們正在不斷學習的過程中。
- 他們之上是成長十分迅速的大師,之下則是剛剛進來不久的學徒工。
- 熟練工在大師或者其他資深熟練工的督導下工作。很少會讓資歷尚淺的熟練工獨立工作。他們在嚴格的督導下進行工作。他們的程式碼會被人仔細複查。
- 隨著經驗不斷積累,他們的自主能力也會不斷增長。對其直接介入指導的地方也會變得越來越少,指導內容也會越來越趨向那些微妙之處。最終,督導活動會轉為以“同行評審”的方式進行。
學徒/實習生:
- 畢業生會從學徒這一步開始他們的職業生涯。學徒沒有“自治權”,他們需要在熟練工的緊密督導下工作。
- 在一開始,他們不會單獨承接任何任務,而只能作為助手為熟練工打下手。在這個階段,應該十分密集地進行結對程式設計。這一時期是學習紀律並強化各項實踐的階段。各項價值觀的基礎也都是在這個階段塑造成型。
- 熟練工會擔任他們的導師。他們要確保學徒們能夠了解設計原則、設計模式、各種紀律和固定的操作環節。熟練工會向他們傳授TDD、重構、估算等各種技藝。他們會為學徒安排閱讀、練習和實踐任務,還會檢查學徒們的任務進展情況。
- 學徒期至少應持續一年。
- 期滿之時,如果熟練工願意接受學徒上升到他們這個層級,就會把學徒推薦給大師們。大師們則透過面談和水平檢測,對學徒們進行考核檢驗。如果能夠取得大師們的認可,那麼學徒便可晉升為熟練工。
現實情況:
- 在大多數情況下幾乎沒有技術層面的督導!在大多數公司中,根本就不存在技術督導這一回事。程式設計師的水平是否能夠提升和最終是否能夠得到職位晉升,全視乎程式設計師自己的表現。
- 我們今天的做法和我所提倡的理想化的學徒制程式,這兩者之間的主要差異在於技術方面的傳授、培訓、督導和檢查。
- 觀念上最大的差別在於,專業主義價值觀和技術敏銳度需要進行不斷的傳授、培育、滋養和文火慢燉,直至其完全滲入文化當中。
- 我們當前的做法之所以傳承無力,主要是因為其中缺失了資深人士輔導新人向其傳授技藝的環節。
14.4技藝
技藝是工匠所持的精神狀態。技藝的“模因”(meme[6])中包含著價值觀、原則、技術、態度和正見。
技藝模因經由口口相傳和手手相承而來,需要由資深人士向年輕學徒殷勤傳授,然後再在學徒之間相互傳播。
資深人士會觀察年輕學徒的學習過程,然後不斷反思和改進傳授之道。技藝模因宛如一種“傳染病”,一種“精神病毒”。透過觀察其他人的工作,讓模因落地生根,你也會“感染”上技術模因。
覺者:
你無法說服別人成為一名匠者,你無法說服他們去接受技藝模因。
口舌之爭並無益處,資料亦無足輕重,案例研究也無法說明什麼。接受技藝模因並不是一種理性決策的過程,也非感情用事便可奏效。這與人的“自性”(humanthing)緊密相關。
那麼該如何讓人們接受技藝模因呢?前面我曾說過,只要技藝模因可以被人觀察到,它便具有傳染性。因此,只需讓技藝模因可以被他人觀察到即可。你自己首先要成為表率。你自己首先要成為能工巧匠,向人們展示你的技藝。然後,將剩餘的事情交給技藝模因的自然執行之道即可。
14.5 結論
學校能夠傳授的是計算機程式設計的理論。但是學校並不會也無法傳授作為一名程式設計匠者所需掌握的原則、實踐和技能。這些東西只有經由師徒個體間多年的細心監督和輔導才能獲得。
軟體行業中像我們這樣的一批人必須要面對這一事實,即指引下一代軟體開發人員成熟起來的重任無法寄希望於大學教育,現在這個重任已經落到了我們肩上。建立一種包含學徒期、實習期和長期指引的機制已是迫在眉睫。
---meme 模因:
模因,meme,這一詞最早出現在英國牛津大學著名動物學家和行為生態學家理查德·道金斯於1976年出版的《自私的基因》一書中。道金斯杜撰meme一詞的主要目的是為了說明文化進化的規律。在他看來,人類文化進化的基本單位是meme。meme在很大程度上指的是“以非遺傳方式(如模仿)傳遞的行為或文化屬性”。任何一個資訊,只要它能夠透過廣義上稱為“模仿”的過程而被複制,它就可以稱為meme。也就是說透過模仿獲得並加以傳播的任何想法、說法或做法都可以算作是meme,如“曲調旋律、想法思潮、時髦用語、時尚服飾、陶器製作或搭建拱門的方法”等等。如今,研究meme及其社會文化影響的學科被稱為Memetics。在本文中,將meme譯為“模因”。道金斯根據gene杜撰出了meme,而“模因”一詞則是模仿了“基因”一詞翻譯而成的。——譯者注