華為阿里工作4年,我總結出這4條寶貴經驗!
- 2021 年 6 月 29 日
- AI
當時間緊張、需求急迫時,如果沒有高效的方法,很容易會亂了陣腳,得到失敗的結果。
因此,對於不同領域,我總喜歡提起「方法論」這個詞彙。
掌握一定的方法,能夠條理清晰、腳踏實地的高效完成每一項工作。
對於編程開發也是這樣。
在開發過程中,經常會接到各種各樣的需求,也會出於不同原因導致各種各樣的問題。
當系統出現一個問題之後,我們該如何高效解決問題,雖然在面試過程中不會考核這些,但是卻和日常工作息息相關。
本文,就來介紹我通過總結得出的4步高效解決編碼問題的方法。
首先說明一下,本文介紹的方法並非是筆者首創,而是從波利亞·哲爾吉的一本名為《How to Solve It》得到的靈感。
這本書最初於1945年問世,已售出超過100萬本。
這本書中提出的解決問題方法已經被很多程序員和高校教授使用,通過這本書介紹的方法,可以通過四步來解決編碼過程中面臨的很多問題。
本文,將使用JavaScript作為實例語言進行舉例,首先拋出問題:
創建一個將兩個數字相加並返回該值的函數
解決問題的方法分為4個步驟:
- 了解問題
- 制定計劃
- 執行計劃
- 復盤迴顧
下面逐步介紹一下。
步驟1:了解問題
在面對需求時,很多同學首先想到的就是趕緊進行編碼,避免項目延期。
這是在所難免的,但是,需要避免這種情況。
在開始解決問題之前,首先確保真正理解該問題。
如果對問題一知半解,不僅使得開發過程中模稜兩可浪費時間,還會導致最終需求對接存在誤差倒是結果不盡人意,嚴重時甚至需要返工重新開發。
因此,需要認真理解問題,弄清楚自己不理解的部分,達到對問題有清晰的認識。
為了更好地理解問題,請問自己幾個問題:
輸入是什麼?
問題的輸入是什麼?在本文的示例中,輸入將會作為函數的參數。
通過對於前面提出的問題可以知道,我們的輸入將是數字。
但是,需要做更加全面的考慮,我們可以問:
輸入將始終只是兩個數字嗎?如果我們的函數收到三個數字作為輸入怎麼辦?
以此,來達到對問題進行更加深入和全面的認識。
輸出是什麼?
該函數將返回什麼?在這種情況下,輸出將是一個數字,這是兩個數字輸入的結果。
確保你真正了解輸出結果。
一旦掌握了問題並知道了可能的輸入和輸出,就可以開始處理一些具體示例。
編寫用例
示例可以作為測試用例,用作穩定性、健全性檢查。同時,通過編寫用例,可以提升自己對代碼的理解。
從一個簡單的示例或兩個可能的輸入和輸出開始。讓我們回到加法函數。
我們將函數稱為add。
什麼是示例輸入?輸入示例可能是:
//add(2, 3)
它的輸出是什麼?要編寫示例輸出,我們可以編寫:
// add(2, 3)---> 5
這表明我們的函數將輸入2和3並返回5作為其輸出。
也可以通過編寫更為複雜的用例,來尋找需要考慮的極端情況。如果我們的輸入是字符串而不是數字,該怎麼辦?
2. 制定計劃
接下來,制定解決問題的計劃。
在設計計劃時,可以用偽代碼將其寫出來。
偽代碼是算法步驟的簡單語言描述。換句話說,偽代碼是解決問題的重要組成部分。
寫下解決問題所需採取的步驟。對於本文問題,你可以編寫:
// 創建一個sum變量。
使用加法運算符將第一個輸入添加到第二個輸入。
// 將兩個輸入的值存儲到sum變量中。
// 返回總和變量作為輸出。
現在,你已經有逐步解決此問題的計劃。
對於更複雜的問題,埃文斯教授指出:「系統地考慮人類如何解決問題。」
也就是說,暫時先不要考慮用代碼怎麼解決問題,而是考慮如何以人工方式解決它, 這可以幫助你更清楚地看到這些步驟。
3. 執行計劃
解決問題策略的下一步就是執行計劃。
使用你的偽代碼作為指導,寫出你的真實代碼。
埃文斯教授建議將重點放在簡單的解決方案上。
你的解決方案越簡單,就越可能正確編程。
拿我們的偽代碼,我們現在可以這樣寫:
function add(a, b) {
const sum = a + b;
return sum;
}
切記不要過早優化!
就是說,當你在實現需求的過程中可能會這樣想:「等等,我這樣做,這將是效率低下的代碼,不如優化一下吧!」
首先,只需獲得簡單的解決方案即可。解決問題應該通盤考慮,而不是在實現過程中過度追求其中一部分的優化。
Colt Steele在這裡提供了很好的建議:如果您無法解決部分問題,請忽略使您絆倒的那部分困難。
相反,請專註於可以開始編寫的其他所有內容,暫時忽略你不太了解的問題中的困難部分。
完成這一部分後,請回到較難的部分。
4. 復盤迴顧
解決方案開始運行後,請花點時間思考一下並找出如何進行改進。
這是你將解決方案重構為更有效的解決方案的時候了。
當你查看工作時,Colt Steele建議你提出一些問題,讓自己思考如何改善解決方案:
- 還有哪些可行的其他方法?
- 一眼就能理解嗎?是否有意義?
- 可以將結果或方法用於其他問題嗎?
- 可以提高解決方案的性能嗎?
- 能想到其他重構方法嗎?
- 別人如何解決這個問題?
針對前面的代碼實現,我們可以重構問題以使代碼更簡潔的一種方法:刪除變量並使用隱式返回:
function add(a, b) {
return a + b;
}
當我自己編碼時,總是會看到比我提出的解決方案更優雅或更有效的解決方案。
因此,可以通過不斷的閱讀別人代碼,或者讓別人評審自己的代碼,這樣有助於提出更為有效的解決方案。
在本文中,我們討論了解決編碼問題的四步問題解決策略。
請記住,解決問題的技巧是使得任何人都可以隨着時間和實踐而變得更好的技能。
乾貨推薦
為了方便大家,我花費了半個月的時間把這幾年來收集的各種技術乾貨整理到一起,其中內容包括但不限於Python、機器學習、深度學習、計算機視覺、推薦系統、Linux、工程化、Java,內容多達5T+,我把各個資源下載鏈接整理到一個文檔內,目錄如下:

所有乾貨送給大家,希望能夠點贊支持一下!
https://http://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA (提取碼:0000)