我將提出一個大膽的主張:每個開發人員(和有抱負的開發人員)都應該解決前50個項目Euler問題。
處理項目Euler問題的好處太大了,不容忽視:
他們將揭示你是否理解你正在使用的語言的基本操作,並且可以用任何程式語言解決它們你將學習如何編寫可靠的,標準的,香草代碼。 不需要代碼庫,因此你不會依賴拐杖你將不得不考慮如何在內存中存儲和訪問數據你需要優化處理速度並仔細考慮算法在這篇快速(<5分鐘閱讀)的文章中,我將闡述為什麼你應該在你想要學習的每種程式語言中解決Project Euler問題。
從基礎知識開始
傳奇的美式橄欖球教練文斯隆巴迪將以(現在著名的)演講開始每個賽季前的訓練:
「先生們,」他對一個職業足球運動員的房間說,「這是一個足球。」他繼續解釋在比賽中打球和獲勝的基本原則 - 跑步,傳球,搶斷和踢球。
隆巴迪對基本面的無情關注使他成為足球歷史上最有名的教練,其歷史上的冠軍數量超過其他教練。
同樣的原則適用於軟體開發。
任何編碼挑戰都將測試你使用變量,條件語句,循環,數據結構和程式語言的其他常見功能的能力。
然而,Euler項目是對你理解和掌握基礎知識的特別嚴格的考驗。 你必須將不同排列的基本原理結合起來才能解決問題。
基本面就是你所需要的。 如果你一直在編寫Web應用程式,遊戲或其他軟體,那麼你很可能已經習慣使用某些庫來完成特定的,可預測的任務。
項目Euler帶走了這些庫並純粹測試了你解釋簡單邏輯問題的能力,並編寫了解決這些問題的簡單代碼。
培訓難以教授的東西:優化直覺
這就是為什麼每個計算機科學本科課程都包括算法和數據結構課程,以及為什麼這麼多公司在招聘過程中測試算法思維的原因。
編寫優秀代碼的核心是將最佳解決方案應用於手頭的邏輯問題。
挑戰在於知道何時花時間優化以及何時使用簡單的解決方案。
有時直接的解決方案是最好的解決方案。
對其他人來說最易讀並且直觀有意義的解決方案通常是最好的。
最初的幾個項目Euler問題將教你這一課。 它們涉及具有(相對)小上限的簡單計算。 計算機速度很快,沒有必要為自己創建過度優化前幾個解決方案的工作。
其他時候,你需要進行優化才能看到真正的性能提升
大學裡的理論算法課不能教你什麼是等待慢速算法計算問題答案的感覺。
一個優秀的開發人員對效率有直覺。 隨著時間的推移,經驗豐富的開發人員為問題解決方案的次優實現開發了第六感。 你從經驗中發展出這種直覺,而後來的項目歐拉問題是效率直覺的優秀教師。
如果算法經常被使用或者在大輸入上使用,那麼花費時間進行優化對於節省時間來節省時間是值得的。 但在其他情況下,優化僅用於小規模的解決方案並不值得花費額外的時間。
判斷優化權衡是經驗豐富的開發人員所擁有的直覺,而這是Euler項目可以開始教授的技能。
你將對你選擇的語言變得更加流暢和自信
解決即使是少數項目歐拉問題,也會對你對特定語言的信心和流暢度產生奇蹟。 這也是獲取新語言或刷新你曾經知道的語言的好方法。
例如,在過去的幾個月裡,我一直專注於使用Python進行編碼,而且我用C語言寫了一段時間已經有一段時間 - 我在Python之前就已經知道了這種語言。
我開始在C中實現前幾個Project Euler問題來刷新我的技能。 它創造了奇蹟,帶回我的技能並提醒我語法。 類似地,我使用Project Euler來學習Java的基礎知識,因為Java的語法與C的關鍵方式類似但不同。
練習文檔和測試的絕佳機會
如果你想為你的產品組合添加令人印象深刻的東西,請啟動一個GitHub存儲庫,你可以在其中保存解決Project Euler問題的解決方案。
(注意:多條評論提到,分享你的Project Euler解決方案是違反競爭規則的。如果你正在競爭當前的Project Euler挑戰,請加入官方論壇並在那裡討論代碼。
但是,對於已經解決了數十萬次的存檔問題,將Project Euler代碼添加到你的投資組合中可以獲得很多好處,就像數百名其他開發人員在你之前所做的那樣。
只需確保在開發自己的解決方案時不要看別人的解決方案! 這會破壞樂趣,意味著你不會學到太多!)
完成解決方案後,檢查變量和函數名稱以確保它們是直觀的,刪除任何不需要的代碼,並以一致的方式格式化所有內容。
接下來,添加有關您在代碼中做出決策的原因的注釋。 學習寫好評論是一項技巧。 一個好的經驗法則:任何優秀的開發人員都可以弄清楚你的代碼做了什麼,所以你的評論應該解釋為什麼它這樣做。
Project Euler的另一個絕佳機會是學習單元測試。 在編寫解決方案之前,為項目添加最小測試框架並編寫測試。 這是開始使用測試驅動開發的好方法。
項目歐拉!
如果你解決了前50-100項Euler問題,你將:
掌握編程基礎知識對所選語言的語法充滿自信和流利了解算法優化,更重要的是,優化直覺獲得使用良好文檔編寫乾淨代碼的經驗有機會練習測試驅動的開發在GitHub和產品組合中展示令人印象深刻的東西我不知道任何其他一組適合教授和演示編程基礎知識的問題。 項目Euler是任何開發人員或有抱負的開發人員必須做的事情。