這個問題就像練習如何思考一樣有趣。
網路上有非常多的思考技巧,打開Youtube也有很多的個人思考辦法。
我自己是思考技巧的愛好者,現在還是喜歡鍛鍊自己的思考框架、看看別人是怎麼想問題的。最早開始碰到思考技巧,是高中的時候。
還記得高中升學時,特別為數學這科大魔王寫了半本的數學思考辦法。那本筆記是整理建中數理資優班,如何解決問題的,裡面有很多解題的方式,解題。解決問題,這也帶出了為什麼今天要寫這個主題:
所以,我們為什麼要思考?正確的是,不思考會犯什麼錯誤?
先來個人文碎碎念
我覺得除了鍛鍊自己的智識、培養解決問題的能力,更重要的是避免對他人造成無形中的傷害。
最近有一部很紅的日劇:現在開始,三年A班的同學都是人質
我很喜歡裡面的老師說的話:「我們在行動之前,永遠都要想我們的行動會造成什麼影響?」尤其在網路的時代,留下資訊非常輕易,那留下了這些資訊會對別人造成什麼影響?傷害?鼓勵?幽默? 很多時候我們都不知道自己傳達出去的訊息其實就像一顆石頭,隨意就可以讓社會泛起漣漪,我覺得
太多人都低估自己行動的結果了,即使只是個學生,傳播這麼方便的時代,一言一行都應該更謹慎才是。
好像偏題了,不過這也是小小的反思,畢竟有時候忙著學習,基本的道德標準還是要鞏固,否則會造成社會問題,也是科技進步對社會的衝擊吧!我們很少理會到科技進步所衍生的問題,我這學期上北醫醫學系教授的通識課,他們分享身為第三類組的「科學家」,其實不像人文學生那樣,可以先一步洞察到自己所研究的主題其實會造成什麼問題。所以思考有很多層面,人文、理工、商管,而程式思考是可以泛用在這些層面上的。
那麼,什麼叫做程式思考?
我定義為:有邏輯、有層次的思考法。
就像寫程式一樣,我們會一步一步寫下解決問題的方法,透過組合語法、組合函數來達到想做的目的,每一步都清清楚楚的,程式思考的好處是:我們可以跳出問題,更宏觀地思考整個大問題,然後逐步擊破小問題,實作的時候更專心在解決問題上。
至於該如何練習?也很簡單,試試看這樣的思考流程,應用到任何事情上,也就是以天地為師,以下的思考技巧是我思路技巧,歸納了許多本思考相關書籍的知識,並輔佐程式訓練以及管理顧問的商業思考所萃煉出來的,希望對您有幫助!
以程式思考貫通全部:
- 清楚描述問題
- 拆解問題
- 把問題簡化
- 構思
- 組合解法
- 問:然後呢?
其實日常生活中您也在用各式各樣的程式思考,比如您的計畫表可能會這樣制定:
- 早上出門上班
- 回覆mail
- 開會
- 例行公事、專案
- 下班去超市補給生活用品
- 休息
他是一個連貫的,行為背後有目的意義存在的,只是平常這些問題已經內化到我們很難注意到,好比會去補給生活用品是為了解決「家裏用不夠」的問題,出門上班是為了解決「公司的問題」……當你意識到問題的時候才能夠更聰明行動,好比家裡用不夠,是不是有更深的問題,比如食物都不小心放過期、開會有什麼問題?能不能不開會?很多很多,只要稍微留點意就可以更深入貼近實際問題。
那今天談談軟體開發的問題,寫程式時,我們的思考步驟又怎麼做呢?
程式思考特別容易解決程式問題,因為這本來就是軟體工程師的思考方式:
第一步:清楚描述問題
如果你不能很好清楚描述問題,就不要想解決它。
有時候您以為這是個問題,但是它或許不是,以我熟悉的資料科學舉個例子:某個工廠廠長問我:其實工廠常常有一些機器的報廢開支,能不能協助預測我們的報廢率?
這是問題嗎?不是啊!因為報廢率不是一個有pattern的問題呀!他不是單純會計上的折舊而已,我們可以評估器材的使用期間、使用年限,但是報廢是突發的,今天某個機器壞掉、或者沒有算好機器操作的能力讓器具壞掉…….這些都是有可能突然發生的,可以預測機台的故障率,但是廠房器材的報廢率並不是一個真正的問題,應該要提出來的問題是:「能不能告訴我,為什麼我們的報廢率常常發生?」你必須了解的是這個問題的因,因為知道問題發生的原因才能解決問題。再舉一個例子,投資的時候問:「A公司跟B公司,哪個可以買?」
這是問題嗎?不是啊!我說可以買,如果你資金不夠的話你怎麼買?甚至:兩個都可以買啊,但是你要怎麼分配投資組合?即使我回答:「A公司。」這樣有解決你的問題嗎?顯然沒有,因為你一定不知道該怎麼分配投資比例、該買多少、而且:「什麼時候要賣?」。
所以這邊要提出的問題是:「我有多少錢可以投資?」這才是你應該先解決的問題,以及投資的第一個問題。清楚描述問題包括了發現問題的過程,在貨幣政策中還有所謂的時間延遲效應,國家政策的思考步驟都會用到清楚描述問題了,個人問題也要這麼做才行。
第二步:拆解問題
這是一個管理顧問常常用到的技巧,其實上一篇文也有提到。
利用MECE的原則拆解問題,好比我想分析:「為什麼超市營收下跌?」
營收可以拆成:銷售 — 成本。銷售又可以分成:銷量 * 價格
銷量又可以拆成:來客量 * 消費能力 *平均購物件數
價格可以拆分成:原本價格*折扣率………
太多了,想挖多深就可以挖多深,重要的是停到一個「我們有沒有意識到問題、能不能在這邊解決」的階段。
以工程師常常碰到的資料庫為例,資料庫正規化的時候共有五個步驟(俗稱5NF,不包含Boyce codd的NF),但其實為了避免有損分解的問題產生,通常只要三個正規化就可以了,這是因為此時已經達到「資訊完整」、「處理效能」、「避免異常」的平衡。
學會拆解問題,就不會覺得難以下手。
第三步:把問題簡化
舉我練吉他的例子,我在練習一首歌的時候通常都會先找最簡單的譜來練,因為吉他的練習分成左手(指法)以及右手(伴奏手法),這時候要先思考哪邊應該先練習,或者這首歌有用到什麼特別的技巧?練習簡單的譜有助於我們培養對這首歌的理解、也方便一開始跟著音樂進行練習,久了我就會加上個人的編曲概念、曲風轉換、根據歌唱者轉調、換一種指型來練習,問題簡化放到程式也是:
如果問「能不能讓我看看第二高薪水的主管是誰?」所以我的第一個反應就是自動拆解問題:「主管是誰?」「薪水第二高怎麼得到?」 怎麼找主管?我先把問題改成:「同事名單,有嗎?」我們先找到他的部下ID,利用部下的管理階級取得不一樣的主管ID就是主管名單。怎麼找薪水第二高?我想先把問題改成:「怎麼找薪水最高/最低?」,找到之後再問:「怎麼排序而且拿第二個人?」類似這樣,像這題就是一個leetcode的題目,掌握這種技巧去想,解問題就不會那麼難了,甚至還有它的樂趣。
第四步:構思問題
回答問題,這裡可能需要收集很多資料來回答某個自己缺乏的知識。
比如不懂語法、不懂怎麼報稅,就需要去查該怎麼做。這個時代我們需要建立第二個大腦,知道該怎麼搜集資訊、我們想要的資料在哪裡,掌握了這點就能夠有自信面對未知的問題。
第五步:組合解法
把拆解的問題一一擊破之後,就重組在一起回答完整的方案。
管理顧問常常這樣子做,利用金字塔思維告訴您答案,接著把答案組出來。我很喜歡這種有邏輯、具有說服力的方式,就像我認為「從容是美德」,而所謂從容,就是說服自己與他人的組合答案的過程。
第六步:問「然後呢?」
不停問然後呢?所以我解決了這個問題,我的下一步應該是什麼呢?
像資料科學家常常會在專案開始前就先問:我的分析結果可以對團隊有什麼impact?
可以達成什麼行動嗎?有行動就會產生價值。
One Comment