[譯] 如何像程式設計師一樣思考:解決問題的經驗
from unsplash
如何你對程式設計感興趣,你可能見過這句話:
“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 每次,更多的競爭就會消失。直到你成為最好的自己。——瑞安.霍利迪(障礙就是路)
現在,去解決一些問題吧!
作者:謝導(水瓶座男生)
原文:How to think like a programmer — lessons in problem solving
擴充套件閱讀:
-
ofollow,noindex">學習新技術時你應當掌握的『最少必要知識』
長按2秒,識別二維碼,關注我。