什麼樣的程式設計師是領導最喜歡的,一名退休的主管告訴你
職場或者人生最重要的技能是什麼?老闆最看重的是什麼?解決問題的能力。如何培養解決問題的能力?這事兒也許需要從程式設計師身上吸取經驗。否則的話,你可能就會像個沒頭蒼蠅一樣亂打亂撞。Richard Reis 總結了程式設計師的思考方式,並且給出了你如何像程式設計師一樣思考的步驟。
如果你對程式設計感興趣,你也許之前已經見過這句話:
這個國家的每個人都應該學會對計算機進行程式設計,因為它教會你如何思考。
——喬布斯
你可能會在想這究竟是什麼意思,像程式設計師一樣思考?怎麼才能做到呢?
基本上這一切與更有效地解決問題有關。
本文的目標就是教會你這種思考方式。.
看文字文之後,你將會了解到成為更好的問題解決者究竟需要哪些步驟。
這個為什麼重要?
問題解決屬於元技能。
我們都有問題。無論大或小。不過有時候我們解決問題的方式可是有點隨意。
除非你有一套系統,否則的話你“解決”問題的方式大概是這樣的(我開始編碼時就是這樣):
1.嘗試一種解決方案。
2.如果這種解決方案無效,再試另一種。
3.如果還是沒有用,重複第二步直到你走運。
你看,有時候你會走好運。但這是解決問題最糟糕的方式!而且非常非常浪費時間。
最好的方式涉及到a)有一個框架,以及b)練習之。
幾乎所有的僱主都優先考慮問題解決技能。
問題解決技能幾乎毫無疑義是僱主尋求的最重要的資質……比程式語言能力、除錯能力以及系統設計能力都要重要。
證明計算思維或者分解大型複雜問題的能力與工作需要的基本技術技能一樣重要(如果不是更重要的話)
——Hacker Rank(2018 年開發者技能報告)
形成一種框架
為了找到合適的框架,我是按照 Tim Ferriss 有關學習的書《4 小時大廚》裡面的建議來做的。
這讓我訪談了兩位令人印象非常深刻的人:C. Jordan Ball(在 Coderbyte 的 65000+ 位使用者中排名1、2)以及V. Anton Spraul(《像程式設計師一樣思考:創造性問題解決的介紹》的作者)。
我問了他們同樣的問題,你猜怎麼著?他們的回答都非常相似!
很快,你也會認識他們的。
旁註:這並不意味著他們每一件事的做法都一樣。每個人都不一樣。你也會有所不同。但如果你從我們都同意是好的原則開始的話,你取得更大突破會快很多。
我發現新程式設計師的最大錯誤是關注於學習語法而不是學習如何解決問題
——V. Anton Spraul
那麼,遇到新問題時你會怎麼做呢?
以下就是步驟:
1、理解
準確瞭解被問的是什麼。大多數疑難問題之所以難是因為你不理解問題(因此這就是為什麼這是第一步的原因)。
怎麼才知道你什麼時候理解了問題了呢?當你能夠把問題說清楚的時候。
你還記得問題卡住的時候,你開始解釋問題,然後馬上看到了此前看不到的邏輯漏洞的時候嗎?
大多數程式設計師都知道這種感覺。
所以這就是為什麼你應該把問題寫下來,畫張圖,或者把問題告訴某人(或者某物……有的人會利用橡皮鴨)的原因。
如果你不能用簡單的語言解釋一個東西,你就沒有真正理解它。
——費曼
2、計劃
不要在制訂計劃之前就匆忙投入到問題解決當中(然後指望自己能像沒頭蒼蠅一樣找到出路)。先計劃好你的解決方案!
如果你不能寫下確切的步驟的話,沒有東西能幫到你。
在程式設計中,這意味著不要一言不發就開幹。要給你的大腦一點時間來分析問題和處理資訊。
要想制訂出好的計劃,請回答這個問題:
“在輸入為X的情況下,返回輸出Y的必要步驟是什麼?”
旁註:程式設計師有很好的工具幫助他們做好這個……評論!
3、分解
注意。這是最重要的步驟。
別想著解決一個大問題。你會哭的。
相反,要把問題分解成子問題。這些子問題解決起來要容易多了。
然後一個個地解決這些子問題。從最簡單的開始。最簡單意味著你知道答案(或者更接近答案)。
之後,最簡單意味著這個被解決掉的子問題並不依賴於其他被解決的問題。
一旦你解決了每一個子問題,再將點連成線。
把你所有的“子解決方案”連線起來就能得出原先問題的解決方案。祝賀你!
這一技巧是問題解決的基石。記住它(如果沒記住,請把這個步驟再讀一次)。
如果我要教給新手程式設計師一個問題解決技能的話,這個技能會是“問題分解技巧。”
比方說,假設你是一名新程式設計師,有人要你寫一個程式讀 10 個數字並找出第 3 大的那個。對於菜鳥程式設計師來說,這可能會是一個艱難的作業,即便這隻需要基本的變成語法。
如果你卡住了,就應該把問題分解為簡單一點的東西。與其尋找第三大的數字,何妨先找最大的數字呢》還覺得困難?那在 3 個數裡面找出最大的數字呢?或者兩個數中較大的那個?
把問題分解到你之大如何去解決的程度然後寫下解決方案。把把問題稍微擴充套件一下,重寫解決方案來跟問題匹配,一直這麼做,直到你回到原先的起點。
——V. Anton Spraul
4、卡住了?
不過,你可能會想“嘿 Richard……這的確很酷,但如果我連子問題也沒法解決又該怎麼辦呢?”
首先,深呼吸一下。其次,這很公平。
但請不要擔心,朋友。每個人都會這樣!
不同的是最好的程式設計師/問題解決者會對 bug/錯誤更加好奇而不是感到氣憤。
實際上,在遭受打擊時這裡有三件事情是需要你嘗試一下的:
·除錯:一步步仔細檢查你的解決方案找出什麼地方出問題了。程式設計師稱之為除錯(實際上,所有的除錯工具都要做這個)。
除錯的藝術在於找出你告訴程式要做的究竟是什麼而不是你以為你告訴它做的是什麼
——Andrew Singer
·再評估:後退一步。換個角度審視問題。有沒有什麼東西可以抽象為更通用的方法?
對於問題有時候我們太過只見樹木不見森林以至於忽視了從更普遍的水平上解決問題的一般原則。[……]
當然,這個的典型例子是一系列連續整數之和,1+2+3+…+n,這個問題一位年輕的高斯很快就能意識到答案是n(n+1)/2,從而避免了必須把一個個數加起來的麻煩。
—— C. Jordan Ball
旁註:重新評估的另一個辦法是重新開始。刪掉一切再次用嶄新的眼光開始。我是認真的。你會對這種辦法的有效性目瞪口呆。
·調研:啊哈,就是上 Google 去 google 一下。沒錯。不管你有什麼問題,可能都已經有人解決過了。找到那個人/解決方案。實際上,哪怕你已經解決了問題也要去查檢視!(你可以從別人的解決方案中學到很多)。
警告:不要想尋找大問題的解決方案。只去找子問題的解決方案。為什麼?因為除非你拼盡全力,否則就不會學到任何東西。如果你學不到任何東西,那就是在浪費時間。
實踐
別指望一週之後你就會變得很棒。如果你想要成為一名好的問題解決者,那就解決很多問題先!
練習、練習,不斷地練習。這樣下去你意識到“這個問題很容易就能用[在此處插入概念]加以解決。”就只是個時間問題。
如何練習?選項太多了!
國際象棋迷局、數學難題、數獨、圍棋、地產大亨遊戲、視訊遊戲、cryptokitties 等等等等……
其實,成功人士的一個共同模式是練習“微觀問題解決”的習慣。比方說,Peter Thiel 下國際象棋,Elon Musk 玩視訊遊戲。
Byron Reeves 說“如果你想知道3~5 年後商業領導力是什麼樣,那就看看線上遊戲發生的事吧。”
回到現在。Elon、Reid、扎克伯格等人都說遊戲是自己創業取得成功的基礎。
——Mary Meeker《2017 年網際網路趨勢報告》
這是否意味著你就應該去玩視訊遊戲呢?完全不是。
但是視訊遊戲是幹什麼的呢?對了,解決問題!
所以,你應該做的是找一個合適的地方去練習。
比方說,我喜歡變成挑戰。每一天我都試圖解決至少一個挑戰(通常是在 Coderbyte 上)。
就像我說那樣,一切問題都有類似的模式。
結論
就這些了夥計們!
現在你應該對“像程式設計師一樣思考”更瞭解了吧。
你還知道了問題解決是需要培養的一項不可思議的技能(元技能)。
如果這還不夠,注意還知道了如何去練習你的問題解決技能!
這相對酷對不對?
最後,我希望你能遇到很多問題。
你明白我的意思。至少現在你知道了該如何解決它們了!(此外,你也會知道每解決一個問題你都會更上一層樓)。
當你以為你已經成功排除了一個障礙的時候,新的障礙又出現了。但人生之所以有趣正是因為如此……
人生就突破這些障礙的過程——人生就是要突破這一道道的防禦工事。
每一次你都會學到一點東西。
每一次你的力量、智慧以及看法都會得到發展。
每一次競爭對手都會被你拋在身後一點點。直到所有對手都看著你的背影望塵興嘆:你也成為了最好的自己。
——Ryan Holiday《The Obstacle is the Way(障礙就是出路)》
現在,去解決一些問題吧!
祝你好運!