如何像程式設計師一樣思考 - 解決問題的經驗與教訓

AdolphLWQ發表於2019-01-15

如果你對程式設計感興趣,你可能看過這句話:

“這個國家的每個人都應該學習計算機程式設計,因為它會教你思考。” -  Steve Jobs

你很可能想知道這句話是什麼意思?以及如何做到?本質上講,這句話是關於更高效解決問題的方法

在這篇文章中,我的目標是教會你這種方法。讀完本文,你將明確知道要採取哪些步驟來成為更好的問題解決者。

為什麼這很重要?

解決問題是元技能

我們都面臨問題。大的和小的。有時,我們處理它們的方式,呃......很隨意。

你需要有一個系統方法,這可能是你“解決”問題的方式(我開始程式設計時就是這麼做的): 1. 嘗試一個方案。 2. 如果這不起作用,請嘗試另一個。 3. 如果還不起作用,請重複步驟2直到解決。

可能你運氣好解決了問題。但這是最糟糕方法!浪費大量的時間。

最佳方法是:a)有一個框架, b)練習掌握這個框架。

“幾乎所有僱主都優先考慮解決問題的技能。

相比程式語言的熟練程度、除錯和系統設計,解決問題的技能幾乎是僱主尋求的最重要的技能。

展示計算思維或將大型、複雜問題拆分的能力與工作所需的基線技能一樣有價值(如果不是更多)。” - Hacker Rank(2018年開發人員技能報告

擁有一個框架

為了找到合適的框架,我參考了Tim Ferriss關於學習的書《The 4-Hour Chef》中的建議。

這讓我採訪了兩個人,他們非常令人印象深刻:C.Jordan Ball(在Coderbyte的65000多名使用者中排名第一或第二)和V.Anton Spraul《像程式設計師一樣思考:解決創造性問題導論》一書的作者“)。

我問他們同樣的問題,猜猜結果如何? 他們的回答非常相似!

很快,你也會認識他們。

旁註:這並不意味著他們對待每件事都用同樣的方式。每個人都是不同的,你也和大家不一樣。但是如果你遵從我們都認可的原則,你會更快進步。

“我看到新程式設計師犯下的最大錯誤就是專注於學習語法,而不是學習如何解決問題。” - V.Anton Spraul

那麼,當遇到新問題你該應該怎麼做?

下面是步驟:

1. 理解你的問題

明確被問的問題是什麼。大多數問題很難是因為你不理解它們(因此這是第一步)。

如何確定你理解了問題?當你能用簡單的語言準確描述它,你就理解了這個問題了

你還記得曾經被困在一個問題上,你嘗試描述它,卻立即發現之前沒有考慮到的邏輯漏洞?

大多數程式設計師都知道這種感覺。

這就是為什麼你應該寫下你的問題、畫畫塗鴉,或告訴別人你的問題(或者有些人使用橡皮鴨除錯法)。

“如果你不能用簡單的術語來解釋某事,那你還沒理解它。” - Richard Feynman

2. 做好計劃

沒有計劃前就不要開始解決問題。你需要計劃你的解決方案。

如果你不能寫下明確的步驟,別人就沒法幫你。

在程式設計中,這意味著不要立即開始hacking。給大腦時間來分析問題和處理資訊。

要想獲得一個好的計劃,請回答這個問題:“給定輸入X,返回輸出Y所需的步驟是什麼?”

3. 分割問題

請注意,這是最重要的一步。不要試圖解決一個大問題,你會哭的。相反,將其分解為子問題。這些子問題更容易解決。

然後,逐個解決每個子問題。從最簡單的開始。最簡單意味著你知道答案(或者很接近答案),還意味著要解決的這個子問題不依賴於其它問題。

一旦解決了每個子問題,請連線所有“子解決方案”,你就得到原始問題的解決方案了。恭喜!

這種方法是解決問題的基石。務必記住它(如果有必要,這個步驟要多讀幾遍)。

“如果我能教會每個初學程式設計師解決問題的技巧,那就是'減少問題的技巧性'。

例如,假設你是一名程式設計師新手,被要求編寫一個程式:讀取十個數字,確定第三大的數字。對於一個全新的程式設計師來說,這可能是一個艱難的任務,即使它只需要基本的程式設計語法。

如果你遇到困難,你應該把問題簡化為更簡單的問題。找到最大的那個數,而不是第三大的數字。還是太難了?那找到三個數字中最大的一個呢?或者兩個數中較大的一個?

將問題簡化到你知道如何解決,然後寫下解決方案。然後稍微擴充套件問題並重寫解決方案以匹配,並繼續擴充套件直到你回到起點。“ - V.Anton Spraul

4. 卡住了?

到現在為止,你可能正坐在那裡思考“嘿理查德......這很酷,但是如果我被困住,甚至無法解決一個子問題怎麼辦?”

首先,深吸一口氣。其次,這很公平。因為每個人都會遇到這個情況!

不同之處在於,最好的程式設計師/問題解決者面對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。

說明

相關文章