如何像程式設計師一樣思考 - 解決問題的經驗與教訓
如果你對程式設計感興趣,你可能看過這句話:
“這個國家的每個人都應該學習計算機程式設計,因為它會教你思考。” - 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。
說明
- 原文連結
- 翻譯:@AdolphLWQ
- 專案地址
- tt:自動生成翻譯模板
- 用時: 3h (人機混合)
相關文章
- 像程式設計師一樣思考——提高解決問題的能力程式設計師
- [譯] 如何像程式設計師般思考 —— 蘊含在問題解決中的經驗程式設計師
- 8月書訊 | 像大師級程式設計師一樣思考程式設計師
- Go 併發程式設計中的經驗教訓Go程式設計
- 像鳥一樣思考更好的並行程式設計並行行程程式設計
- 如何像資料分析師一樣思考?
- 《程式設計師的數學》思考題(一)程式設計師
- 解決問題的能力 > 10倍程式設計師程式設計師
- 程式設計謎題:提升你解決問題的訓練場程式設計
- 像CFO一樣思考(3)- 電商閉環設計思考
- 程式設計師的管理經驗程式設計師
- 面對一個Bug,高手程式設計師是如何解決問題的?程式設計師
- PHP程式設計師解決問題能力的八個級別PHP程式設計師
- 安裝pytorch-gpu的經驗與教訓PyTorchGPU
- 如何訓練解決問題的能力?
- 有經驗的程式設計師應該如何提升自己程式設計師
- 扎心!一個3年經驗的程式設計師經驗之談!程式設計師
- 培訓機構出來的程式設計師,怎樣才能拿高薪?這些經驗很重要程式設計師高薪
- 程式設計師面試經驗程式設計師面試
- 程式設計師生涯,學到最重要的6個教訓程式設計師
- 長沙IT培訓:程式設計師面試專案經驗分享程式設計師面試
- 做大廠程式設計師是一種怎樣的體驗?程式設計師
- 經驗:一個秒殺系統的設計思考
- 程式設計師不是在編寫程式碼,而是在解決問題 - LanRaccoon程式設計師
- 程式設計師筆記(知識)管理的一點經驗程式設計師筆記
- 一個有40年編碼經驗的老外程式設計師的職業經驗程式設計師
- 做任何職業都不要做程式設計師,特別是Java程式設計師,血淋淋的教訓程式設計師Java
- 提升解決問題能力的思考
- 【譯】Googler如何解決程式設計問題Go程式設計
- JAVA程式設計題-用java解決兔子問題Java程式設計
- 幽默:程式設計中困難的不是解決問題,而是確定要解決的問題 - Paul程式設計
- 一個 1年工作經驗的 PHP 程式設計師是如何被面試官虐的?PHP程式設計師面試
- [譯] Data Binding 庫使用的經驗教訓
- Heap使用Postgres SQL後的經驗教訓SQL
- 經驗分享:Java程式設計師的黃金5年你如何突破?Java程式設計師
- 好程式設計師Python培訓分享列表去重中的copy問題程式設計師Python
- 大齡程式設計師思考程式設計師
- 10倍程式設計師的思考模型程式設計師模型