程序思維是什么?怎樣才能做到?從本質(zhì)上講,它是一種更有效的解決問題的方法。在這篇文章中,我的目的是用這種方式告訴你什么事變成思維,同時(shí)你就會(huì)知道怎樣才能更好的解決問題。
我們每天都會(huì)遇到很多問題,我們處理問題的方式有時(shí)候都是隨機(jī)的,比如:先試著解決方案,如果不行就再試一次,再?zèng)]有效果就重復(fù)第二步直到運(yùn)氣好的時(shí)候。
這樣解決問題的方法是最糟糕的方法,也非常浪費(fèi)時(shí)間!
“計(jì)算思維或分解大型復(fù)雜問題的能力,與工作所需要的基本技術(shù)能力一樣有價(jià)值”—by Hacker Rank(2018 Developer Skills Report)
那么,當(dāng)遇到問題時(shí),擁有編程思維的人應(yīng)該怎么做呢?
步驟如下:
1、理解
非常確切的知道自己被問的是什么問題。大多數(shù)難題之所以難,是因?yàn)槟悴焕斫馑鼈?,所以這個(gè)是第一步。
如何知道什么時(shí)候你理解了一個(gè)問題呢?——當(dāng)你能用簡(jiǎn)單的、用自己的語言解釋它的時(shí)候。
你可能會(huì)記得,當(dāng)你被困在一個(gè)問題上,一旦開始解釋它,你就立刻看到邏輯上的漏洞,而且漏洞很可能也是你以前沒有看到的。
這就是為什么你應(yīng)該把你的問題寫下來,畫個(gè)圖,或者告訴別人。
2、計(jì)劃
不要在沒有計(jì)劃的情況下,一頭扎進(jìn)解決問題的過程中(并且希望你能混過去),計(jì)劃你的解決方案吧!
如果你不能寫下計(jì)劃確切的步驟,什么也都不幫不了你。
為了得到一個(gè)好計(jì)劃,回答這個(gè)問題:給定輸入X,返回輸入Y所需要的步驟什么?程序員的世界里面,有一個(gè)偉大的工具來幫助他們實(shí)現(xiàn)這個(gè),那就是注釋!
3、拆分
這是最重要的一步,不要試圖一次就解決一個(gè)大問題,相反,當(dāng)你把這個(gè)問題進(jìn)行拆分成一個(gè)一個(gè)子問題,這些子問題就更加容易解決了。然后,逐個(gè)解決每個(gè)子問題,從最簡(jiǎn)單的開始。最簡(jiǎn)單意味著,你知道答案(或者更加接近那個(gè)答案)。另外最簡(jiǎn)單的方法意味著子問題的解決并不依賴于其他問題的解決。一旦你解決了每個(gè)子問題,再把這些點(diǎn)連接起來,連接所有“子解決方案”,將為你提供的原始問題的解決方法!
這種技巧,是解決所有問題的基石,請(qǐng)記住它(建議你重新再讀一遍這個(gè)步驟)。
如果我能交給每一個(gè)初學(xué)者一種解決問題的技能,那就是“減少問題這個(gè)技能”,例如:假設(shè)你是一個(gè)新程序員,你被要求編寫一個(gè)程序,讀取10個(gè)數(shù)字,然后算出哪個(gè)數(shù)字是第三高的,對(duì)于一個(gè)全新的程序員來說,這可能是一項(xiàng)艱巨的任務(wù),盡管它只需要基本的編程語法。如果你陷入困境,你就應(yīng)該把問題簡(jiǎn)化。而不是專注在第三個(gè)高的數(shù)字上。如何在一個(gè)整體中先找到最高的那個(gè)數(shù)呢?還是太難了?那從三個(gè)數(shù)字中找到最大的那個(gè)呢?還是太難?那如果是尋找兩個(gè)較大的那個(gè)呢?
4、卡住了呢?
現(xiàn)在,你可能正坐在那里想,這幾個(gè)步驟看起來還不錯(cuò)嘛,但如果我卡住了,遇到了不能解決的問題該怎么辦?
首先,深呼吸。因?yàn)檫@個(gè)很正常!別擔(dān)心,朋友,每個(gè)人都會(huì)這樣子!不同之處在于,最好的程序員(問題解決者),對(duì)bug(錯(cuò)誤)更加好奇,而不是惱怒!
事實(shí)上,當(dāng)你遭遇不幸時(shí),有三件事情可以嘗試:
調(diào)試:逐步檢查你的解決方案,試圖找出哪里出錯(cuò)了。即調(diào)試程序。
重新評(píng)估:后退一步,從另個(gè)一角度來看這個(gè)問題,有什么可以簡(jiǎn)化成更加簡(jiǎn)單的方法嗎?
(有時(shí)候,我們會(huì)對(duì)問題的細(xì)節(jié)太過沉迷,以至于忽略了在一般層面上解決問題的一般原則?。?/p>
經(jīng)典的例子,求一長(zhǎng)串連續(xù)整數(shù)的總和,1+2+3+4+…+n,利用一個(gè)簡(jiǎn)單的消元方法就可以很快的識(shí)別出這么一個(gè)公式:n(n+1)/2,從而避免了不得不做的加分。
(另一種重新評(píng)估的方式是重新開始。刪除所有的內(nèi)容,用全新的眼光重新開始。你會(huì)驚訝到這是多么有效。)
上網(wǎng)搜:你沒看錯(cuò),不管你有什么問題,可能有人已經(jīng)解決了。找到那個(gè)人解決的方案。事實(shí)上,就算你解決了問題,也應(yīng)該去多搜索其他人做的案例,你可以從別人的解決方案中學(xué)到很多。
(注意:不要尋找解決大問題的方法。只尋找子問題的解決方案,為什么呢?因?yàn)槌悄闩?,(哪怕是一點(diǎn)點(diǎn)),否則你什么都學(xué)不到,如果你什么都沒學(xué)到,那你就是在浪費(fèi)時(shí)間)
5、實(shí)踐
不要期望僅僅一個(gè)星期就能變的很厲害,如果你想成為一個(gè)好的問題的解決者,就應(yīng)該去解決很多問題!練習(xí)、練習(xí)、練習(xí)!遲早你會(huì)認(rèn)識(shí)到這個(gè)問題可以通過很輕松的方式來解決。
那么如何練習(xí)呢?其實(shí)也有很多選擇的!
比如:象棋游戲、數(shù)學(xué)問題、數(shù)獨(dú)、視頻游戲、cryptokittiles,bla bla bla………
所以,你應(yīng)該做的是,找到一個(gè)練習(xí)的方式,可以讓你解決很多小問題的東西。正如我所說,所有的問題都有相似的模式!
6、結(jié)論
現(xiàn)在,你知道“編程思維”有多重要了吧!
最后,祝你遇到很多問題。你沒看錯(cuò),這樣你可以反復(fù)的練習(xí)如何解決問題,同時(shí),你將了解到,每一種解決方案都會(huì)使你得到改進(jìn)!