如果你對寫程式感到興趣,你也許之前已經聽過賈伯斯的這句話:「這個國家的每個人都應該學會對電腦進行程式,因為它教會你如何思考。」你可能會在想這究竟是什麼意思,像程式設計師一樣思考?怎麼才能做到呢?
Richard Reis 採訪了幾位程式設計師,並且歸納出了程式設計師的思考方式,讓你瞭解,如何像程式設計師一樣思考的步驟。
我們生活中常常遇到各種問題。無論大或小。不過有時候我們解決問題的方式可能並沒有所謂的「方法」,而是看心情。
對於一般人來說,除非你已經練就一套自己解決問題的方法,否則大多數人「解決」問題的方式大概是這樣的:
-
嘗試一種解決方案。
-
如果這種解決方案無效,再試另一種。
-
如果還是沒有用,重複第二步直到你走運。
你看,有時候你會走運,第一次就解決問題了。但是,「靠運氣」是解決問題最糟糕的方式!而且多半會非常非常浪費時間。
好的解決問題方式,首先應該a)有一個解決問題的框架,以及b)練習之。
形成一種解決問題的框架
我訪談了兩位在程式設計方面都有成就的人:C. Jordan Ball(在Coderbyte的65000+位用戶中排名1、2)以及 V. Anton Spraul(《像程式設計師一樣思考:創造性問題解決的介紹》的作者)。我問了他們同樣的問題,想要理解他們解決問題的框架是什麼,你猜怎麼著?他們的回答都非常相似!
以下就是步驟:
1、理解
準確瞭解被問的是什麼。大多數疑難問題之所以難,是因為你不理解問題(因此這就是為什麼這是第一步的原因)。
怎麼才知道你什麼時候理解了問題了呢?當你能夠把問題說清楚的時候。
你還記得問題卡住的時候,你開始解釋問題,然後馬上看到了先前看不到的邏輯漏洞的時候嗎?大多數程式設計師都知道這種感覺。所以這就是為什麼你應該把問題寫下來,畫張圖,或者把問題告訴某人的原因。
2、計畫
不要在制訂計畫之前就匆忙投入到問題解決當中(然後指望自己能像沒頭蒼蠅一樣找到出路)。先計畫好你的解決方案!
如果你不能寫下確切的步驟的話,沒有東西能幫到你。在寫程式的過程中,這意味著不要一言不發就開幹。要給你的大腦一點時間來分析問題和處理問題。
要想制訂出好的計畫,請回答這個問題:「在輸入為X的情況下,得到輸出為Y的必要步驟是什麼?」
3、分解
注意。這是最重要的步驟。
別想著解決一個大問題。相反,要把問題分解成子問題。這些子問題解決起來要容易多了。然後一個個地解決這些子問題。從最簡單的開始。最簡單意味著你知道答案(或者更接近答案)。之後,最簡單意味著這個被解決掉的子問題並不依賴於其他被解決的問題。
一旦你解決了每一個子問題,再將點連成線。把你所有的「子解決方案」連接起來就能得出原先問題的解決方案。祝賀你!這一技巧是問題解決的基石。記住它(如果沒記住,請把這個步驟再讀一次)。
如果我要教給新手程式設計師一個問題解決技能的話,這個技能會是「問題分解技巧。」
比方說,假設你是一名新程式設計師,有人要你寫一個程序讀10個數字並找出第3大的那個。對於菜鳥程式設計師來說,這可能會是一個艱難的作業,即便這只需要基本的變成語法。
如果你卡住了,就應該把問題分解為簡單一點的東西。與其尋找第三大的數字,何妨先找最大的數字呢》還覺得困難?那在3個數里面找出最大的數字呢?或者兩個數中較大的那個?
把問題分解到你之大如何去解決的程度然後寫下解決方案。把把問題稍微擴展一下,重寫解決方案來跟問題匹配,一直這麼做,直到你回到原先的起點。
——V. Anton Spraul
4、卡住了?
不過,你可能會想「 ……這的確很酷,但如果我連子問題也沒法解決又該怎麼辦呢?」
首先,深呼吸一下。其次,請不要擔心,朋友。每個人都會這樣!不同的是,最好的程式設計師(問題解決者),會對發生的bug(錯誤)感到好奇而不是感到氣憤。實際上,這裡有三件事情是需要你嘗試一下的:
-
調試:一步步仔細檢查你的解決方案找出什麼地方出問題了。程式設計師稱之為調試(實際上,所有的調試工具都要做這個)。
調試的藝術在於找出你告訴程式要做的究竟是什麼,而不是你以為你告訴它做的是什麼
——Andrew Singer
-
再評估:後退一步。換個角度審視問題。有沒有什麼東西可以抽象為更通用的方法?對於問題有時候我們太過只見樹木不見森林,以至於忽略了從更普遍的角度解決問題的一般原則。[……]
典型例子就是如何求一系列連續整數之和:1+2+3+…+n,你可以把數字一個一個加起來,但是你也可以用n(n+1)/2 這個簡單的公式來求和,避免了必須把一個個數加起來的麻煩。
—— C. Jordan Ball
-
調查研究:講白一點,就是上 Google 去 google 一下。沒錯。不管你有什麼問題,可能都已經有人解決過了。找到那個人/解決方案。實際上,哪怕你已經解決了問題也要去查查看!(你可以從別人的解決方案中學到很多)。
警告:不要想尋找大問題的解決方案。只去找子問題的解決方案。為什麼?因為除非你拼盡全力,否則就不會學到任何東西。如果你學不到任何東西,那就是在浪費時間。
結論
現在你應該對「像程式設計師一樣思考」更瞭解了吧。你還知道了問題解決是需要培養的一項技能。
最後,我希望你能遇到很多問題。至少,現在你知道了該如何解決它們了!(此外,你也會知道每解決一個問題你都會更上一層樓)。
當你以為你已經成功排除了一個障礙的時候,新的障礙又出現了。但人生之所以有趣正是因為如此……
人生就突破這些障礙的過程——人生就是要突破這一道道的防禦工事。
每一次你都會學到一點東西。
每一次你的力量、智慧以及看法都會得到發展。
每一次競爭對手都會被你拋在身後一點點。直到所有對手都看著你的背影望塵興嘆:你也成為了最好的自己。
——Ryan Holiday《The Obstacle is the Way(障礙就是出路)》
現在,去解決一些問題吧!
- 本文授權轉載自:36kr(36氪)
請注意!留言要自負法律責任,相關案例層出不窮,請慎重發文!