[譯] 如何像程序員般思考 —— 蘊含在問題解決中的經驗

原文做者 Richard Reis前端

若是你對編程感興趣,那麼你以前可能會據說過這樣的 一句話android

「每一個人都應該學習編程,由於它會教你如何思考。」 —— 史蒂夫·喬布斯ios

你可能還想知道,像程序員同樣思考到底意味着什麼?同時,要怎麼樣才能作到呢?git

從本質上講,像程序員般思考是一種更加有效的解決問題的方法程序員

經過這篇文章,個人目的是教會你用那樣的方式去思考問題。github

到最後,你就會更加清楚地知道,要經過哪些步驟才能成爲一個更好的難題終結者。編程

這件事爲何很重要?

解決問題是最根本的元技能。後端

咱們全部人都會遇到或大或小的各類各樣的難題。而不少時候,咱們如何去解決這些問題卻顯得,能夠說...很隨機。網絡

除非你有一套解決問題的體系,不然以下極可能就是你「解決」問題的方法(這也正是我編程之初經常走的歧途):框架

  1. 嘗試某種解決方案。
  2. 若是這種解決方案不湊效,那麼換另一個進行嘗試。
  3. 若是另外一種仍是不湊效,那麼不斷重複步驟 2,直到走大運剛好碰到解決這個問題的方法。

你看,某些時候可能你很走運,可以把問題解決。但這倒是解決問題中最最糟糕的方法。同時,這對你的時間形成了巨大浪費。

最好的方法包含了如下的兩個方面:a)擁有一套解決問題的框架;b)不斷練習實踐這套框架

「幾乎全部的僱主都把解決問題的能力放在首位。

解決問題的能力幾乎是全部僱主一致追尋的最重要的品質,甚至比精通編程語言、調試和系統設計更爲重要。

證實計算思惟或者說分解大型複雜問題的能力,對於一份工做來講,至少與其所需的基本技術技能同樣有價值(就算不是更有價值的話)。」 —— Hacker Rank (2018 年開發者技能報告

擁有一套解決問題的框架

爲了找到正確的框架,我遵循了蒂姆·費里斯(Tim Ferriss)關於學習的書《4 小時廚師》(the 4-Hour Che) 中的建議。

這個建議讓我採訪了兩位真正使人印象深入的人:C. Jordan Ball(在 Coderbyte 65,000+ 用戶中排名第一或者第二),以及 V. Anton Spraul(書籍 「像程序員般思考:創造性解決難題導論」 的做者)。

我問了他們相同的問題,你猜猜結果如何?他們的答案基本是一致的!

很快,你也會認識到這些答案。

做者注:這並不意味着他們用相同的方法去作每一件事。每一個人都是不一樣的,你和他們也是不一樣的。但若是你遵循了咱們都認同的好的原則,以此開始,你會走得更遠更快。

「我看到的新手程序員犯的最大的錯誤就是專一於學習編程語言語法而不是去學習如何解決問題。」 —— V. Anton Spraul

那麼,遇到新問題時該怎麼作呢?

下面就是解決問題的一些步驟:

1. 理解問題

準確地理解問題所問的點是什麼。絕大多數的難題,僅難在你不能理解這些問題(這就是爲何要把理解問題放在第一步的緣由)。

如何知道你已經理解了一個問題?當你能用語言描述它的時候就真的理解了。

你記憶中是否有這樣一個場景,當你被困在一個問題中時,你開始解釋它,而後忽然之間,你發現了以前歷來沒有考慮過的邏輯漏洞?

絕大多數的程序員都應該對這種感受深有體會。

這就是爲何你要把你的問題寫下來、畫個圖或者告訴他人的緣由(另一件事是...有些程序員會使用小黃鴨調試法來解決問題)。

「若是你沒法簡單地解釋清楚某件事,你就尚未弄懂它。」 —— Richard Feynman

2. 作出計劃

在沒有計劃以前千萬不要一頭扎入問題的解決當中(除非你但願可以矇混過關)。必定要作好計劃!

若是你沒法寫下作事情的確切步驟,那麼什麼都幫不了你。

在編程中,這意味着不要一開始就強行暴力破解。必定要先給你大腦一些時間來分析問題和處理信息。

爲了得到一個好的解決問題計劃,先回答一下以下問題:

「在已有輸入 X 的前提下,若是要獲得返回值 Y,將要進行哪些必要的步驟?」

做者注:程序員們有一種很棒的工具來解決這個問題...那就是註釋!

3. 劃分問題單元

注意了,這是全部步驟中最最重要的。

不要嘗試去解決一個大的問題。這樣作你確定會哭的。

相反,應該把大問題分解成多個更容易解決的的子問題。

而後,對這些子問題各個擊破。從最簡單的問題開始吧。最簡單的問題意味着你知道問題的答案(或者至少更爲靠近答案)。

除此以外,最簡單的問題還意味着這個子問題的解決並不依賴於其餘問題的解決。

一旦你把每個子問題都解決了,而後就把每個小點鏈接起來。

串聯起你的每個**「子方案」**將會讓你得到最終的原始問題的解決方案。祝賀你,你已經解決了問題!

這種解決問題的技術是全部問題解決的基石。緊緊記住它(若是有必要,請再次閱讀這一步)。

「若是我能教給每一個新手程序員一個解決問題的技巧,那就是‘減小問題的技術’。

例如,若是你是一個新程序員,而後你被要求去寫一個程序,讀取 10 個數字,而後算出哪一個數字是第三大的。對於一個全新的程序員來講,這多是一項艱鉅的任務,儘管它只須要基本的編程語法。

若是你陷入困境,你應該把問題簡化。先不考慮找第三大的數,若是你去找最大的數你該如何作?仍是太困難?那若是要從三個數字中找到最大的你該怎麼作呢?若是從兩個數字中尋找呢?

不斷簡化問題直到你能寫出解決方案。而後稍微把問題進行擴展,並寫下相應的解決方法,不斷擴展下去直到源問題被解決。」 —— V. Anton Spraul

4. 陷入問題當中?

如今,你可能正坐在那裏想到:「嘿,Richard... 這方法很酷,可是若是我卡住了,而後連子問題都沒法解決該怎麼辦?」

首先呢,進行一下深呼吸。其次,這件事是公平的。

不要擔憂,朋友。這種狀況會在每一個人身上發生!

不一樣的是最好的程序員/問題解決者對 bugs 或錯誤更感興趣而不是惱怒。

事實上,當不幸面臨難題時,這裏有三件事能夠嘗試:

  • 調試: 一步一步檢查你的解決方案,而後去試圖尋找到底那裏出錯了。程序員們把這件事稱爲調試(事實上,這事全是調試器作的)。

「調試的藝術在於找出你真正告訴你的程序去作的事情,而不是你所認爲你已經告訴了你的程序去作的事情。」 —— Andrew Singer

  • 從新考慮: 後退一步。從另一個角度來看待這個問題。是否有能夠抽象成更通常的方法?

「有時候咱們迷失在問題的細節裏,而忽略了能在更通常層面上解決問題的通用方法。 […]

固然,最經典的例子是求連續天然數和, 1 + 2 + 3 + … + n,很是年輕的高斯很快認識到答案是簡單的 n(n+1)/2,這樣就不用去作加法了。」 —— C. Jordan Ball

做者注:另一種從新評估的方式是從新開始。刪除全部內容,用全新的眼光從新開始。我是認真的,你會驚訝於這是多麼的有效。

  • 搜索:啊哈,你沒有讀錯,好好去搜索一下。不管你遇到什麼樣的問題,極可能已經有人解決過了。去找到那我的或者找到那種解決方法。事實上,即便你解決了問題,你也能夠再去調查一下!(你能夠從其餘人的解決方案中學到不少的東西。)

注意:不要去尋找解決一個大問題的方法。只去尋找解決子問題的方案。這是爲何呢?由於除非你努力(哪怕是一點點),不然你什麼都學不到。若是你什麼都沒有學到,你就是在浪費時間。

不斷實踐練習這套框架

不要指望僅僅一個星期以後就能變得很棒。若是你想成爲一個好的問題解決者,那就多去解決一些問題吧!

練習、練習、再練習。早晚你會意識到「這個問題能夠經過 <在這裏插入概念> 輕鬆解決」。

如何去練習呢?這裏有不少的選擇!

象棋謎題、數學難題、數獨、圍棋、大富翁、電子遊戲、加密貓,等等等等。

事實上,成功人士的一個廣泛模式是他們有着不斷練習「微觀解決問題」的習慣。例如,彼得·泰爾 (Peter Thiel) 經過下棋,埃隆·馬斯克 (Elon Musk) 經過玩電子遊戲來進行練習同樣。

「拜倫•裏夫斯 (Byron Reeves) 說,‘若是你想知道將來三到五年的企業領導是什麼樣的,那就看看網絡遊戲正在發生什麼吧。’」

快進到今天。埃隆·馬斯克(Elon Musk)、雷德·霍夫曼(Reid Hoffman)、馬克·扎克伯格(Mark Zuckerberg)和其餘許多人都表示,遊戲是他們成功創建公司的基石。」 —— Mary Meeker(2017年互聯網趨勢報告

這是否意味着你應該只玩電子遊戲?並非這樣。

可是電子遊戲究竟是關於什麼的呢?沒錯,就是問題解決!

因此,你應該作的是找到可以練習的機會。能夠是能讓你解決不少小問題的東西(理想狀況下,這應該是你喜歡的東西)。

例如,我喜歡編程挑戰。天天,我都試圖解決至少一個挑戰(一般在 Coderbyte 上)。

正如我所說,全部的問題都有類似的模式。

結論

以上就是所有內容!

直至目前,你已經更好地瞭解了「像程序員般思考」究竟意味着什麼。

你也知道了解決問題是一種難以置信的技能(元技能)。

若是這還不夠,請注意,你還知道了要練習解決問題的技巧該作些什麼!

嘖嘖嘖... 聽起來很酷,對吧?

最後,祝你遇到不少問題。

你沒有讀錯,就是祝你遇到更多的問題。由於至少如今你知道怎麼去解決問題了!(同時,你將會知道,每解決一個問題都會使你得到進步)。

「就在你認爲你已經成功跨越了一個藩籬時,你與另一個障礙不期而遇。但這就是生活的奇妙之處。[...]

生活就是一個不斷突破桎梏的過程 —— 這是一些咱們成長必須突破的阻礙。

每次,你都會獲取新知。

每次,你都會變得更增強壯有力,睿智深邃和洞察非凡。

每次,都會有一些挑戰被你逾越,從而消失。直到最後所留下的:是那個最好的你。」 —— Ryan Holiday (絕境逢生的藝術 (The Obstacle is the Way)

從如今開始,去解決一些問題吧!

祝你好運 🙂

特別鳴謝 C. Jordan BallV. Anton Spraul,他們給了我不少寶貴的建議。

此外,若是沒有 Lambda School 學校,我沒法在如此短暫的時間內得到全部的編程知識。在這裏我要很是感謝以及強烈推薦他們。

感謝您的閱讀! 😊 若是您喜歡這篇文章,請您猛烈地把右手拍向左手,試一試您在 5 秒鐘以內可以拍 👏 多少次吧。這是對您有益的手指有氧健身操,固然這也會幫助其餘人看到這個故事。

在 Twitter 上向我 「打個招呼」 吧!

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索