如何像程序員一樣思考——解決問題的經驗
“Everyone in this country should learn to program a computer, because it teaches you to think.”?—?Steve Jobs
你可能還想知道,像程序員一樣思考到底意味著什麽?怎樣才能做到?
從本質上講,這是一種更有效的解決問題的方法。
在這篇文章中,我的目標是用這種方式教你。
最後,你就會知道怎樣才能更好的解決問題。
為什麽這很重要?
我們每天都有遇到很多問題,無論大的小的。我們處理這些問題的方式有時候都是隨機的。
除非你有個系統,否則用“隨機的方式”可能就是你“解決”問題的方法(下面我開始學習編程寫代碼時候做做的事情):
1、試著解決方案
2、如果不行,再試一次
3、如果沒有效果,重復第二步知道你運氣好
這樣的方法,在你運氣不好的時候,就傻了。總之這種方法時候解決問題的最糟糕的方法!也是非常浪費時間的。
最好的方法是:
a、有一個框架
b、練習它
幾乎所有的雇主都把解決問題的能力放在首位!
解決問題的能力已經是雇主們尋找程序員、測試工程師、系統設計師等最看重的一個方面。
計算思維或分解大型復雜問題的能力,與工作所需要的基本技術能力一樣有價值?—?by Hacker Rank (2018 Developer Skills Report)
一個框架
為了找到正確的框架,我遵循了Tim Ferriss 關於學習的書《the 4-Hour Chef》中的建議, 《The 4-Hour Chef》
這讓我采訪了兩個讓我印象深刻的人:
C. Jordan Ball (ranked 1st or 2nd out of 65,000+ users on Coderbyte, and V. Anton Spraul (author of the book “Think Like a Programmer: An Introduction to Creative Problem Solving”.
我問了他們同樣的問題,你猜怎麽著?他們的回答竟然非常的相似!
接下來,你很快就能認識他們了~~
當然,其實這也並不意味著它們每件事情都是以同樣的方式進行,每個人都是不同的,你也會是不同的,但如果你從我們都認同的好的原則開始,你也會走的更遠更快。
我看到新程序員犯的最大錯誤是專註於學習語法,而不是學習如何解決問題。by - V. Anton Spraul (http://vantonspraul.com/)
那麽,當你遇到新的問題時,你應該怎麽做呢?
步驟如下:
1、理解
非常確切的知道自己被問的是什麽問題。大多數難題之所以難,是因為你不理解它們,所以這個是第一步。
如何知道什麽時候你理解了一個問題呢?——當你能用簡單的、自己的語言解釋它的時候。
你可能會記得,當你被困在一個問題上,一旦開始解釋它,你就立刻看到邏輯上的漏洞,而且漏洞很可能也是你以前沒有看到的。
大多數程序員都知道這種感覺吧!
這就是為什麽你應該把你的問題寫下來,畫個圖,或者告訴別人。
“If you can’t explain something in simple terms, you don’t understand it.”? 如果你不能用簡單的語言來解釋某件事,你就無法理解它 —?Richard Feynman
2、計劃
不要在沒有計劃的情況下,一頭紮進解決問題的過程中(並且希望你能混過去),計劃你的解決方案吧!
如果你不能寫下計劃確切的步驟,什麽也都不幫不了你。
在編程中,這意味著不要立即開始進行××××××。給你的大腦一定的時間來分析問題和處理信息。
為了得到一個好計劃,回答這個問題: 給定輸入 X,返回輸入Y所需要的步驟什麽? 程序員的世界裏面,有一個偉大的工具 來幫助他們實現這個,那就是註釋!
3、拆分
這是最重要的一步
不要試圖一次就解決一個大問題,不然你可能會哭的。
相反,當你把這個問題進行拆分成一個一個子問題,這些子問題就更加容易解決了。
然後,逐個解決每個子問題,從最簡單的開始。最簡單意味著,你知道答案(或者更加接近那個答案)。
另外最簡單的方法意味著子問題的解決並不依賴與其他問題的解決。
一旦你解決了每個子問題,再把這些點連接起來
連接所有“子解決方案” ,將為你提供的原始問題的解決方法!那麽恭喜你,你做到了!
這種技巧呢,是解決所有問題的基石,請記住它(建議你重新再讀一遍這個步驟)
如果我能交給每一個初學者一種解決問題的技能,那就是“減少問題這個技能” ,例如:假設你是一個新程序員,你被要求編寫一個程序,讀取10個數字,然後算出哪個數字是第三高的,對於一個全新的程序員來說,這可能是一項艱巨的任務,盡管它只需要基本的編程語法
如果你陷入困境,你就應該把問題簡化。而不是專註在第三個高的數字上。如何在一個整體中先找到最高的那個數呢?還是太難了?那從三個數字中找到最大的那個呢? 還是太難? 那如果是尋找兩個較大的那個呢?
將問題簡化到你知道如何解決問題,並編寫解決方案的程度。然後稍微展開問題,重新解決方案使其匹配,並繼續進行,知道你回到你最開始的地方。—?V. Anton Spraul
4、卡住了呢?
現在,你可能正坐在那裏想,這幾個步驟看起來還不錯嘛,但如果我卡住了,設置不能解決子問題該怎麽辦?
首先,深呼吸。因為這個很正常!
別擔心,朋友,每個人都會這樣子!
不同之處在於,最好的程序員/問題解決者,對bug/錯誤更加好奇,而不是惱怒!
事實上,當你遭遇不幸時,有三件事情可以嘗試:
調試:逐步檢查你的解決方案,試圖找出哪裏出錯了。即調試程序。
(調試的藝術在於,找出你真正告訴你的程序去做了什麽,而不是你以為你告訴它去做什麽)
重新評估:後退一步,從另個一角度來看這個問題,有什麽可以抽象成更加一般的方法嗎?
(有時候,我們會對問題的細節太過沈迷,以至於忽略了再更一般的層面上解決問題的一般原則!)
經典的例子,求一長串連續整數的總和,1+2+3+4+...+ n , 利用一個簡單的消元方法就可以很快的識別出這麽一個公式:n(n+1)/2 ,從而避免了不得不做的加分。
(另一種重新評估的方式是重新開始。刪除所有的內容,用全新的眼光重新開始。你會驚訝到這是多麽有效。)
搜索/研究 :你沒看錯,就是使用Google,不管你有什麽問題,可能有人已經解決了。找到那個人/解決方案。事實上,即使你解決了問題,也要這樣做!(你可以從別人的解決方案中學到很多)
(註意:不要尋找解決大問題的方法。只尋找子問題的解決方案,為什麽呢? 因為除非你努力,(哪怕是一點點),否則你什麽都學不到,如果你什麽都沒學到,那你就是在浪費時間)
5、實踐
不要期望僅僅一個星期就能變的很厲害,如果你想成為一個好的問題的解決者,就應該去解決很多問題!
練習、練習、練習!遲早你會認識到這個問題可以通過很輕松的方式來解決。
那麽如何練習呢?其實也有很多選擇的!
比如:國家象棋遊戲、數學問題、數獨、視頻遊戲、cryptokittiles ,bla bla bla .........
事實上,成功認識的一個普遍模式是他們練習“圍觀解決問題”的習慣。例如: 彼得.泰爾(Peter Thiel )下棋,埃隆.馬斯克 (Elon Musk) 玩電子遊戲....
拜倫.裏夫斯(Byron Beeves)說,如果你想知道三到五年後商業領導力會是什麽樣子,那麽久看看網絡遊戲正在發生什麽吧
快進到今天 , 埃隆馬斯克、雷德.霍夫曼、馬克.紮克伯格和其他許多人都表示,遊戲是他們稱建立公司的基石。——Mary Meeker (2017年互聯網趨勢報告)
這意味著你應該只玩電子遊戲? 也不全是。
但是這個到底跟電子遊戲有什麽關系呢? 沒錯,就是問題解決!
所以,你應該做的是,找到一個練習的出口,可以讓你解決很多小問題的東西。(理想情況下,還是你喜歡的東西,那就更好了)
例如,我喜歡編程挑戰,每天,我都試圖解決至少一個挑戰(通常在Coderbyte)https://coderbyte.com/
正如我所說,所有的問題都有相似的模式!
6、結論
現在,你知道“像程序員一樣思考” 是什麽意思了。
你也知道解決問題是一種難以置信的元技能。
如果這還不夠,你肯定也知道了如何練習解決問題的技巧。
你看,這是不是看起很酷!
最後,祝你遇到很多問題哈哈。
你沒看錯,至少現在你知道怎麽解決了,同時,你將了解到,每一種解決方案都會使你得到改進!
“Just when you think you’ve successfully navigated one obstacle, another emerges. But that’s what keeps life interesting. 就在你認為已經成功跨域了一個障礙時候,另一個障礙有出現了,但這正是讓生活變得有趣的地方。
Life is a process of breaking through these impediments?—?a series of fortified lines that we must break through. 生活是一個突破這些障礙的過程——一系列我們必須突破的防線。
Each time, you’ll learn something. 每次,你都會學會到一些東西。
Each time, you’ll develop strength, wisdom, and perspective. 每一次,你都將發展你的張力、智慧、和洞察力
Each time, a little more of the competition falls away. Until all that is left is you: the best version of you.”?—?Ryan Holiday 每次,更多的競爭就會消失。直到你成為最好的自己。——瑞安.霍利迪(障礙就是路)
現在,去解決一些問題吧!
擴展閱讀:
學習新技術時你應當掌握的『最少必要知識』
選擇IT,就意味著終身學習
只有不停的奔跑,才能留在原地
放下負擔多去嘗試才能接觸到更多的事物
軟件生命周期與技術人的職業周期
如何像程序員一樣思考——解決問題的經驗