若是你對編程感興趣,你可能看過這句話:git
「這個國家的每一個人都應該學習計算機編程,由於它會教你思考。」 - Steve Jobs
你極可能想知道這句話是什麼意思?以及如何作到?本質上講,這句話是關於更高效解決問題的方法。程序員
在這篇文章中,個人目標是教會你這種方法。讀完本文,你將明確知道要採起哪些步驟來成爲更好的問題解決者。github
解決問題是元技能。編程
咱們都面臨問題。大的和小的。有時,咱們處理它們的方式,呃......很隨意。框架
你須要有一個系統方法,這多是你「解決」問題的方式(我開始編程時就是這麼作的):less
可能你運氣好解決了問題。但這是最糟糕方法!浪費大量的時間。編程語言
最佳方法是:a)有一個框架, b)練習掌握這個框架。ide
「幾乎全部僱主都優先考慮解決問題的技能。相比編程語言的熟練程度、調試和系統設計,解決問題的技能幾乎是僱主尋求的最重要的技能。學習
展現計算思惟或將大型、複雜問題拆分的能力與工做所需的基線技能同樣有價值(若是不是更多)。」 - Hacker Rank(2018年開發人員技能報告)加密
爲了找到合適的框架,我參考了Tim Ferriss關於學習的書《The 4-Hour Chef》中的建議。
這讓我採訪了兩我的,他們很是使人印象深入:C.Jordan Ball(在Coderbyte的65000多名用戶中排名第一或第二)和V.Anton Spraul(《像程序員同樣思考:解決創造性問題導論》一書的做者「)。
我問他們一樣的問題,猜猜結果如何? 他們的回答很是類似!
很快,你也會認識他們。
旁註:這並不意味着他們對待每件事都用一樣的方式。每一個人都是不一樣的,你也和你們不同。可是若是你聽從咱們都承認的原則,你會更快進步。
「我看到新程序員犯下的最大錯誤就是專一於學習語法,而不是學習如何解決問題。」 - V.Anton Spraul
那麼,當遇到新問題你該應該怎麼作?
下面是步驟:
明確被問的問題是什麼。大多數問題很難是由於你不理解它們(所以這是第一步)。
如何肯定你理解了問題?當你能用簡單的語言準確描述它,你就理解了這個問題了。
你還記得曾經被困在一個問題上,你嘗試描述它,卻當即發現以前沒有考慮到的邏輯漏洞?
大多數程序員都知道這種感受。
這就是爲何你應該寫下你的問題、畫畫塗鴉,或告訴別人你的問題(或者有些人使用橡皮鴨調試法)。
「若是你不能用簡單的術語來解釋某事,那你還沒理解它。」 - Richard Feynman
沒有計劃前就不要開始解決問題。你須要計劃你的解決方案。
若是你不能寫下明確的步驟,別人就無法幫你。
在編程中,這意味着不要當即開始hacking。給大腦時間來分析問題和處理信息。
要想得到一個好的計劃,請回答這個問題:「給定輸入X,返回輸出Y所需的步驟是什麼?」
請注意,這是最重要的一步。不要試圖解決一個大問題,你會哭的。相反,將其分解爲子問題。這些子問題更容易解決。
而後,逐個解決每一個子問題。從最簡單的開始。最簡單意味着你知道答案(或者很接近答案),還意味着要解決的這個子問題不依賴於其它問題。
一旦解決了每一個子問題,請鏈接全部「子解決方案」,你就獲得原始問題的解決方案了。恭喜!
這種方法是解決問題的基石。務必記住它(若是有必要,這個步驟要多讀幾遍)。
「若是我能教會每一個初學程序員解決問題的技巧,那就是'減小問題的技巧性'。例如,假設你是一名程序員新手,被要求編寫一個程序:讀取十個數字,肯定第三大的數字。對於一個全新的程序員來講,這多是一個艱難的任務,即便它只須要基本的編程語法。
若是你遇到困難,你應該把問題簡化爲更簡單的問題。找到最大的那個數,而不是第三大的數字。仍是太難了?那找到三個數字中最大的一個呢?或者兩個數中較大的一個?
將問題簡化到你知道如何解決,而後寫下解決方案。而後稍微擴展問題並重寫解決方案以匹配,並繼續擴展直到你回到起點。「 - V.Anton Spraul
到如今爲止,你可能正坐在那裏思考「嘿理查德......這很酷,可是若是我被困住,甚至沒法解決一個子問題怎麼辦?」
首先,深吸一口氣。其次,這很公平。由於每一個人都會遇到這個狀況!
不一樣之處在於,最好的程序員/問題解決者面對bug/錯誤時,他們很感興趣而不是惱火。
事實上,面對打擊時能夠嘗試如下三件事:
逐步執行你的解決方案,嘗試找到出錯的地方。程序員稱這爲調用(事實上,這都是調試器作的)。
「調試的藝術是弄清楚你真正告訴程序要作什麼,而不是你認爲你告訴它要作的事情是什麼。」 - 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》)
如今,去解決問題吧,祝你好運。
本文以「像程序員同樣思考」爲題,介紹瞭如何成爲合格、優秀的程序員。做者結合兩位頂尖程序員的回答、參考一些關於學習的書籍,認爲最重要的是培養解決問題的能力/技能,分享了培養這個能力的方法:造成思惟框架,而後在實踐中不斷練習。筆者理解爲多刷OJ。