天天看點

敲了 10000 小時代碼,我也沒能成為一名進階程式員

作者:CSDN

【CSDN 編者按】Malcolm Gladwell在《離群索居》(Outliers)一書中曾言,要真正掌握某件事情,需要10000小時的練習。而本文作者Greg Bulmash擁有40多年的程式設計經驗,寫了10000個小時的代碼,卻沒能成為一名進階程式員。為何一萬小時定律會失敗呢?他分享了自己的一些看法。或許他的經驗能夠對你有所幫助,一起來看看吧。

原文連結:

https://letmypeoplecode.com/the-truths-and-fallacies-of-10000-hours-for-developers/

本文由CSDN翻譯,轉載需注明來源出處。

譯者 | 章雨銘 責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

Malcolm Gladwell在《離群索居》(Outliers)一書中說,要真正掌握某件事情,需要10000小時的練習。其實,10000隻是一個粗略的數字,而且這句話的含義也被過度簡化了。我已經斷斷續續進行了40多年的程式設計。可能已經寫了10000個小時的代碼,但我甚至還未能成為一個優秀的程式員,更别提成為大師級的程式員了。

我認為有以下幾個原因。首先,在這10000小時中,我主要學習了4種不同的程式設計語言,以及其他一些輔助語言。我從一種語言換到另一種語言時,發現它們有的概念可以互通,有的完全不同。而有趣的是,在這種語言中沒有意義的概念可能用來建構它。

例如,JavaScript沒有本地連結清單實作,但如果在V8 GitHub庫的src目錄下搜尋 "連結清單",會發現有76個commit提到了它。即使它們在語言本身中沒有用C的連結清單,但會在引擎下使用C的連結清單。

每種語言都有自己的文法和特殊的實作方式,這些是必須要學習的,而不僅僅隻是學習其概念。一種語言的最佳實踐方式對于另一種語言來說可能不是最好的。在編譯語言上我從來沒有花過很多時間,幾乎總是使用解釋型語言,如BASIC、PHP、JavaScript、Python。我學習過C#和Java,用Rust做過Hello World,但在Linux中從源碼編譯對我來說十分困難,是以我通常隻是下載下傳源碼,按照教程中的訓示操作,然後祈禱代碼能夠運作。

其他的技能

除了學習這些語言,我還學習了伺服器技術和系統架構的基本概念,不是從程式設計的角度,而是從網絡管理者或者說系統管理者的角度。而且無論是建立一個大型網站,在Flash中建立矢量圖并将其渲染成位圖,還是學習通過AWS解決方案架構師助理認證,我都已經做了很多次。但是很多東西我已經忘記了。我已經學會了這些語言的架構和庫,如JavaScript的React和JQuery以及PHP的Laravel......然後也忘記了許多,因為我為完成一個項目學習了它們,然後就沒有再使用它們。

遺忘是常态

即使寫了10000小時的代碼,也不意味着你能夠輕易地在不同語言之間轉換。當你真的進行轉換的時候,你會發現10000小時沒有那樣神奇的魔力,因為另一個不可避免的原因:記憶衰退。正如我所說的,如果我停止使用一種語言,甚至隻是停止使用它的一個功能一段時間,我就會像忘記 "高中西班牙語 "一樣忘記它。我在高中時讀完了西班牙語3級,在大學時考過了西班牙語4級,并獲得了A。而現在,我可能隻記得不到10%的内容。

例如,我幾乎完全忘記了怎樣使用正常動詞連接配接過去式,更不用說不規則動詞了。但是因為我以前練習的足夠多,我知道自己的不足之處,是以我可能比剛開始學習的人更快地恢複以前的知識。但可能需要幾個月的強化練習才能全部恢複。

十年前,我精通PHP,在一個定制的MVC架構中工作(由其他人建立),使用Doxygen來映射類的繼承層次,并使用JQuery來建構前端的互動性。但我在7年前沒用過PHP了,轉而使用Node。現在,我需要花5分鐘并且改正了一些文法錯誤,才在剛才提到的PHP副本中正确地寫出一個Hello World。

<?php$baby = ", Baby!";              echo "Hello World" . $baby;              ?>           

去年12月時,我為freeCodeCamp的前端庫認證建立了五個React項目,但在那之後,我就沒有再編碼React項目了。過去了兩個月,當我開始準備面試的時候,我覺得我就像是React新手。如果我看到自己寫的代碼,能夠很快了解。但是因為很多東西都隻是我準備的輔助工具,很多我都忘光了,是以我需要回到文檔中去開始一個新的React項目再開始工作。和新手相比,我隻是走得更快。

這就是新手和已經入門了的差別。一萬個小時可以讓你成為一個小提琴大師。但是如果你每隔500小時就換一次樂器,并想要成為整個交響樂團的主角,那你不一定能夠更勝一籌。是以為了強化和拓展你的技能,練習不僅要廣泛,而且要持續。

邏輯上的沖突

10000小時是什麼樣的概念?是5年每周工作40小時,兩年休息1周(假期、病假和休假都在這2周内)。你會發現有的工作招聘時要求在一個3年的架構内有5年的經驗。5年似乎是成為專家所需的标準時間。因為對架構的無知和這種簡化的标準,就會産生邏輯上的沖突,一言以蔽之。

工作中的一萬個小時≠一萬個小時的實踐

一個專業的開發人員,有多少的工作時間是花在電子郵件和會議上的?又有多少時間在真正編碼和思考編碼問題?當我在微軟寫文檔的時候,我的經理說,不管怎麼算,你一天中大概隻有一半的時間花在實際的生産工作上。其餘的時間會花在一些瑣事上,比如回複電子郵件、開會、進度/狀态報告、在IM上回答随機問題或者和别人閑聊......

是以我隻有20%的時間是在寫代碼,因為其他80%的時間是在寫文檔和教程,這意味着我平均每天隻寫了一個小時的代碼。在使用浏覽器中的開發工具進行調試方面,我曾經是個天才,因為我在這方面經驗豐富,還經常為新版本進行更新。但是,雖然當時所有的開發控制台的快捷鍵,我都爛熟于心,但在我離開微軟的7年後,我基本上已經把它們忘得一幹二淨了。

事實上,自從我進入開發人員關系部後,我每天花了10-20%的時間寫代碼,其餘的時間寫教程,為會議講座和網絡研讨會制作檔案,制定建立和培養開發人員社群的戰略,制定展示新功能的最佳方法,以及處理各種人——産品經理、内部工程師、外部開發人員、産品營銷經理、需求生成和社交媒體經理、律師、公關和公司政策執行者的問題。

一萬小時不都用來學習新事物

最後要記住的是,你不會花整整一萬個小時學習新東西。如果你在學習小提琴,你可能會花上幾百個小時來學習一些初級的作品。在你學習新東西之前,你已經掌握了一些初級的東西,并且在反複練習直至完美的過程中,

學到很多,并且将你學到的這些用于學習新事物。是以這一萬個小時中的大部分時間都是強化的。

在程式設計中,這就像多次編寫相同的To Do單頁應用程式。前幾次你可以參考教程,但最終你必須能夠在沒有任何參考的情況下寫出它。這就像一邊看着樂譜一邊慢慢演奏《歡樂頌》,然後記住如何演奏,然後準備在演奏會上演奏。

但是,當你需要在截止日期前傳遞一個項目時,你有多長時間來進行強化練習?在許多公司,不會給你提供擴充技能和強化編碼的時間,需要你利用額外的時間來完成。一些公司會給你10%的時間或20%的時間來做獨立的項目,但很少有公司希望你把這些時間花在單純的練習上。

新的架構、新的最佳實踐方法、新的語言、新的模式産生的速度不斷加快,在這種情況下,僅僅是在新的方面取得合格的成績,都會像和職業選手一樣演奏《歡樂頌》的困難。

總結

你需要平衡強化和探索的時間,特别是當你每天編碼的時間少于50%的時候。你必須不斷地通過練習來進行強化,建立心理肌肉記憶,直到你能在睡夢中解決它們。小提琴幾百年來都沒有實質性的變化,但程式設計卻在不斷變化。成為一個特定語言的大師級程式員意味着要堅持更長的時間。你不得不在非工作時間進行強化練習,完成任務,努力成為一個優秀的程式員,或者跳槽到另一個能夠給你充足時間練習的公司。

哪怕你5年或者10年後都沒有成為大師級的程式員,也沒有關系,因為好好地做一萬個小時比看起來更難完成。

—END—

《新程式員001-004》全面上市,對話世界級大師,報道中國IT行業創新創造