每日最新頭條.有趣資訊

業界 | 如何像程式員一樣思考

大數據文摘出品

編譯:羅然、Hope、雲舟

這個國家的每個人都應該學習電腦編程,因為它可以教會你思考。

—史蒂夫·喬布斯

如果你對編程感興趣,你以前可能看過這句話

大家可能還不是很明白,像程式員一樣思考是什麽意思?又是怎麽做到的呢?

從本質上講,這是解決問題的一種更有效的方法。

在本文中,我就將把這種方法教給你。

到最後,你會明確地知道解決問題需要的步驟,從而能夠更好地解決問題。

為什麽解決問題的能力很重要?

因為解決問題的能力是最基本的能力。

世界上一直都存在大大小小的問題。我們如何處理它們有時是......非常隨機的。

除非你有一個系統,這可能是你“解決”問題的方式(這是我開始編程時所做的):

1.嘗試使用解決方案。

2.如果不起作用,嘗試另一個。

3.如果不起作用,重複步驟2,直到運氣變好。

即使你的運氣一向很好,這種方法也並不值得使用。事實上,它可能是最糟糕的解決方法,因為會浪費大量的時間。

最好的方法包括:1.設立一個框架,2.不斷實踐。

幾乎所有雇主都會優先考慮解決問題的能力。解決問題的能力應該是雇主在求職者中尋求的最重要的特質......而不僅僅是編程語言的熟練程度,調試和系統設計的能力。展示計算思維或分解大型複雜問題的能力與工作所需的基本技能一樣有價值(甚至是更加有價值)。

—黑客等級

設立一個框架

為了找到合適的框架,我參考了Tim Ferriss關於學習的書《4小時廚師》中的建議。

繼而,我採訪了兩位大佬:C.Jordan Ball(在Coderbyte的65,000多名用戶中排名第一或第二)和V. Anton Spraul(《像程式員一樣思考:創造性問題解決導論》一書的作者)。

我問了他們同樣的問題,令人吃驚的是,他們的回答非常相似!

這並不意味著他們做任何事情都采取一致的行動,每個人都不同,你也是與眾不同的。但是,如果我們都遵循一些良好的原則,我們就會更快地得到進步。

我看到新程式員犯下的最大錯誤就是專注於學習語法,而不是學習如何解決問題。

—V. Anton Spraul

那麽,遇到新問題時應該怎麽做?

以下是處理問題的步驟:

理解

大多數難題之所以難的原因,正是因為你不理解它們,因此,解決問題的第一步就是確切地知道問題是什麽。

那麽,理解問題的標準是什麽呢?

當你能用簡單的語言解釋它的時候。

你是否遇到過這種情況?在一個難題上一籌莫展,但是當你嘗試用語言解釋的時候,馬上就發現了以前疏忽的邏輯漏洞。

大多數程式員對這一點都感同身受。

這就是為什麽你應該寫下你的問題,畫個塗鴉,或者將它告訴別人(或者其他方式......有些人使用橡皮鴨)。

橡皮鴨的資料請參閱:

https://en.wikipedia.org/wiki/Rubber_duck_debugging

如果你不能用簡單的語言來描述,你就沒有真正地理解。

—理查德·費曼

計劃

不要漫無目的地開始解決問題,要有明確的計劃!

如果你不能寫下確切的步驟,那麽解決複雜問題簡直就是天方夜譚。

在編程中,這意味著不要立即開始動手乾活,要讓你的大腦有充分的時間分析問題,並對資訊進行整合。

要想制定一個好的計劃,就必須回答以下問題:

“給定輸入X,返回輸出Y所需的步驟是什麽?”

對於這一任務,程式員有一個很好的工具來幫助他們...評論!

劃分

請注意,這是最重要的一步。

不要一開始就想解決一個大問題,你會被它虐哭的。

相反,將其分解為多個子問題,這些子問題會更容易得到解決。

然後,逐個解決每個子問題。從最簡單的開始,也就是你馬上就能知道答案的問題(或者已經接近答案了)。

此外,優先解決那些獨立於其他問題的子問題。

一旦解決了每個子問題,就可以將它們連接起來。

連接所有“子解決方案”就得到了原始問題的解決方案。恭喜!

謹記,這種方法是解決問題的基石(如果有必要,請再次閱讀此步驟)。

V. Anton Spraul曾經說:“如果讓我給剛入門的程式員講授解決問題的技巧,我首先會教他們'減少問題的技巧'。

譬如,你是一名新的程式員,需要編寫一個讀取十個數字的程式,並確定哪個數字是這些數字中第三大的。對於一個新來的程式員來說,這可能是一個艱難的任務,即使它只需要基本的編程語法。

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

將問題你分解到你馬上就能動手編寫的程度,然後稍微擴展問題並重寫解決方案,剩下的就是繼續前進直到你回到起點。“

還是一籌莫展?

現在,你腦子裡的念頭可能是“這些方法很酷,但是如果我卡在一個子問題上跨不過去了怎麽辦?”

首先,深吸一口氣。其次,這是很正常的。

不過不要擔心,每個人都遇到過這種情況!

不同之處在於,一個好的程式員對哪裡出現問題更感興趣,而不是亂發脾氣。

事實上,在面對打擊時,我們需要嘗試三件事:

調試:逐步運行你的解決方案,試圖找到出錯的地方。程式員把這叫做調試(事實上,這都是調試器所做的)。

調試的藝術在於弄清楚你真正想要你的程式做什麽,而不是你自以為你要讓它做什麽。

—Andrew Singer

重新評估:退後一步,從另一個角度看問題,看是否有任何東西可以抽象為更一般的方法?

有時候我們會在問題的細節上迷失方向,而忽略了它能夠在更一般的層面得到解決。經典的例子是求一長串連續整數的總和,1 + 2 + 3 + ... + n,年輕的高斯很快就認識到它只是n(n + 1)/ 2,從而避免了通過一點一點的加和來進行計算。

—C. Jordan Ball

另一種重新評估的方式是從頭再來,刪除所有內容,然後重新開始。我負責任地告訴你,你會驚訝於這個方法是多麽有效。

研究:使用谷歌。你沒有看錯,不管你有什麽問題,有人可能已經解決了。找到那個人/解決方案。事實上,即使你解決了問題,也要這樣做!(你可以從其他人的解決方案中學到很多東西)。

警告:不要尋找解決大問題的方法,隻尋找子問題的解決方案。為什麽?因為除非你付出了努力(哪怕是一點點),否則你什麽都學不會。如果你什麽都沒學到,那純屬浪費時間。

練習

別奢望在一周的時間內變成解決問題的強者。如果你想成為一個好的問題解決者,就必須解決很多問題才行!

實踐,實踐,再實踐。這只是時間問題,最後你會意識到“這個問題只需要就可以解決了”。

怎麽練習?選擇非常多!

國際象棋謎題,數學問題,數獨,圍棋,大富翁,電子遊戲,密碼,bla ... bla ... bla ....

事實上,成功人士的共同模式是他們練習“解決小型問題”的習慣。什麽問題並不重要,比如Peter Thiel選擇下棋,而Elon Musk選擇玩電子遊戲。

“Byron Reeves說:'如果你想看看三到五年內的商業長官力是什麽樣的,那就看看在線遊戲中發生了什麽。'

直到今天, Elon Musk, Reid Hoffman, Mark Zuckerberg ,以及其他許多人都認為遊戲是他們在建立公司方面取得成功的基礎。

——Mary Meeker

這是否意味著應該隻玩電子遊戲?當然不是。

但是電子遊戲的本質是什麽?沒錯,就是對解決問題的訓練!

所以,你應該做的是找到練習的方法,也就是可以讓你解決許多小問題的訓練(可以的話,找那些給你帶來歡樂的練習)。

例如,我喜歡編程挑戰。每天,我都嘗試解決至少一個挑戰(通常在Coderbyte上)。

就像我說的,所有問題都有相似的模式。

結論

以上就是所有的步驟和內容。

現在,你應該更清楚“像程式員一樣思考”意味著什麽了。

你也知道解決問題是一項極其值得培養的技能(基本技能)。

如果這還不夠,你可能還需要注意如何練習解決問題的技巧!

最後,我希望你遇到很多問題。

你沒看錯。遇到很多問題是一件好事,不然你怎麽知道如何解決它們!(你將會在每次解決問題中得到進步)。

當你成功跨越一個障礙的時候,另一個障礙出現了。生活因此而豐富多彩。

生命是一個不斷突破這些障礙的過程,我們必須突破一系列的障礙,走出一條踏實的路。

每一次,你都會學到一些東西。

每一次,你都會積蓄力量、開啟智慧並形成觀點。

每一次,壓力和競爭都會一點點消失。最後只剩下你自己:你得到了最好版本的你。

——瑞安假日

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

祝你好運

特別感謝C. Jordan Ball和V. Anton Spraul。這裡所有好的建議都來自他們。

同樣,如果沒有Lambda School,我不可能在短時間內獲得大量的編程知識。在這裡我對他們表達無盡的感激之情。

相關報導:

https://medium.freecodecamp.org/how-to-think-like-a-programmer-lessons-in-problem-solving-d1d8bf1de7d2

【今日機器學習概念】

Have a Great Definition

獲得更多的PTT最新消息
按讚加入粉絲團