2018.04.24 13:00

不會寫程式沒關係,但你該學習怎麼像程式設計師一樣思考

ADVERTISEMENT

如果你對寫程式感到興趣,你也許之前已經聽過賈伯斯的這句話:「這個國家的每個人都應該學會對電腦進行程式,因為它教會你如何思考。」你可能會在想這究竟是什麼意思,像程式設計師一樣思考?怎麼才能做到呢?

Richard Reis 採訪了幾位程式設計師,並且歸納出了程式設計師的思考方式,讓你瞭解,如何像程式設計師一樣思考的步驟。

 

我們生活中常常遇到各種問題。無論大或小。不過有時候我們解決問題的方式可能並沒有所謂的「方法」,而是看心情。

對於一般人來說,除非你已經練就一套自己解決問題的方法,否則大多數人「解決」問題的方式大概是這樣的:

  1. 嘗試一種解決方案。

  2. 如果這種解決方案無效,再試另一種。

  3. 如果還是沒有用,重複第二步直到你走運。

你看,有時候你會走運,第一次就解決問題了。但是,「靠運氣」是解決問題最糟糕的方式!而且多半會非常非常浪費時間。

好的解決問題方式,首先應該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(障礙就是出路)》

現在,去解決一些問題吧!

 

  • 本文授權轉載自:

ADVERTISEMENT