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

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