
【我們為什麼挑選這篇文章】對於任何一個不是工程師的人而言,可能很難理解工程師是怎麼解決問題,但學會邏輯思考這件事,對人生來說不管怎樣都會有幫助啦!(責任編輯:林子鈞)
這個國家的每個人都應該學習程式語言,因為它可以教會你思考。
—Steven Jobs
如果你對寫程式感興趣,你以前可能看過這句話
大家可能還不是很明白,像工程師一樣思考是什麼意思?又是怎麼做到的呢?
從本質上講,這是解決問題的一種更有效的方法。
在本文中,我就將把這種方法教給你。
到最後,你會明確地知道解決問題需要的步驟,從而能夠更好地解決問題。
為什麼解決問題的能力很重要?
因為解決問題的能力是最基本的能力。
世界上一直都存在大大小小的問題。我們如何處理它們有時是……非常隨機的。
除非你有一個系統,這可能是你「解決」問題的方式(這是我開始寫程式時所做的):
1.嘗試使用解決方案。
2.如果不起作用,嘗試另一個。
3.如果不起作用,重複步驟 2,直到運氣變好。
即使你的運氣一向很好,這種方法也並不值得使用。事實上,它可能是最糟糕的解決方法,因為會浪費大量的時間。
最好的方法包括:1.設立一個框架,2.不斷實踐。
幾乎所有僱主都會優先考慮解決問題的能力。解決問題的能力應該是僱主在求職者中尋求的最重要的特質……而不僅僅是編程語言的熟練程度,調試和系統設計的能力。展示計算思維或分解大型複雜問題的能力與工作所需的基本技能一樣有價值(甚至是更加有價值)。
—Hacker Rank (2018 Developer Skills Report)
設立一個框架
為了找到合適的框架,我參考了 Tim Ferriss 關於學習的書《4 小時廚師》中的建議。
繼而,我採訪了兩位大佬:C.Jordan Ball(在Coderbyte的65,000多名用戶中排名第一或第二)和V. Anton Spraul(《像工程師一樣思考:創造性問題解決導論》一書的作者)。
我問了他們同樣的問題,令人吃驚的是,他們的回答非常相似!
這並不意味著他們做任何事情都採取一致的行動,每個人都不同,你也是與眾不同的。但是,如果我們都遵循一些良好的原則,我們就會更快地得到進步。
我看到新程序員犯下的最大錯誤就是專注於學習語法,而不是學習如何解決問題。
—V. Anton Spraul
那麼,遇到新問題時應該怎麼做?
以下是處理問題的步驟:
處理問題的步驟,你應該這樣思考
理解
大多數難題之所以難的原因,正是因為你不理解它們,因此,解決問題的第一步就是確切地知道問題是什麼。
那麼,理解問題的標準是什麼呢?
當你能用簡單的語言解釋它的時候。
你是否遇到過這種情況?在一個難題上一籌莫展,但是當你嘗試用語言解釋的時候,馬上就發現了以前疏忽的邏輯漏洞。
大多數程序員對這一點都感同身受。
這就是為什麼你應該寫下你的問題,畫個塗鴉,或者將它告訴別人(或者其他方式……有些人使用橡皮鴨)。
橡皮鴨的資料請參閱這個傳送門
如果你不能用簡單的語言來描述,你就沒有真正地理解。
—理查德·費曼
計畫
不要漫無目的地開始解決問題,要有明確的計畫!
如果你不能寫下確切的步驟,那麼解決複雜問題簡直就是天方夜譚。
在寫程式的過程中,這意味著不要立即開始動手幹活,要讓你的大腦有充分的時間分析問題,並對訊息進行整合。
要想制定一個好的計畫,就必須回答以下問題:
「給定輸入 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,我不可能在短時間內獲得大量的工程師知識。在這裡我對他們表達無盡的感激之情。
–
給工程師
如何成為一名數據科學家?來聽聽 Netfix 資深工程師的入門攻略
只打 code、修 bug 太浪費!條理分明的工程師是推動企業改革的關鍵人物
(本文經公眾號 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈業界 | 如何像程序員一樣思考〉。)



