(這篇不是教你如何寫程式,也不是教你怎麼使用Chatgpt)
你有沒有想過,一樣是8小時,為什麼同事總可以處理很多事情?而你每天都要加班,結果還總是不盡人意呢?過去你可能會合理化說,是因為自己經驗不足、工作方法有待加強,或是時間管理不佳。這些當然都是很重要的工作技能,但依據我自己的觀察,高效與無效工作者的關鍵差異是 — 思維能力。
「快思慢想」一書中提到人有兩個思考系統,系統1與系統2
系統1指的是直覺與本能,系統2指的是理性思考。系統1常常會偽裝成系統2來欺騙我們,誤以為受過比較多的教育就擁有系統2的思維能力。大部分的人在工作時其實都是用系統1,透過過去經驗來解決工作遇到的任務。只使用系統1工作的缺點:
工作時需要問題解決、資訊判斷、邏輯思考等其實是系統2的層次。而運算思維就是最好的系統2補強方式。
什麼是運算思維(computational thinking)? 其實就是運用電腦科學的基本概念進行問題解決、系統設計與行為理解的思維模式,而學習運算思維讓我們能擁有像電腦科學家面對問題時的思維能力。
或許過去我們沒有聽過運算思維,但實際上我們已經在做運算思維。
例如老闆如果一大早丟給你說:「昨天工程師加班到很晚,你去擬一個方案」,你會怎麼進行呢?
如果你應該有一半以上的機率回復老闆說:「加班費就按照勞基法的方式計算就好了,哪有什麼方案」。這樣的話你應該就是利用系統1的方式在工作,就是未來將AI被取代的一群人。
要如何透過運算思維來回應老闆這個問題呢?
工程師加班到很晚這個問題太籠統了,我們應該進一步去拆解這個問題,讓問題的複雜性降低並且有清楚的定義。拆解問題有很多種方式,可以按照問題的本質、發生的時序、處理的邊界、MECE 原則等。拆解問題的同時,其實也在了解現況。
例如這個個問題,我們可以去拆解:是那些部門或是職位的工程師?這些工程師在什麼情況發生加班? 是幾點到幾點開始加班,加班到幾點? 加班後有什麼影響,拆成數個子問題後釐清狀況。
運算思維很重要的一點是自動化重複性任務,提升效率。你當然不可能老闆交辦一次你就設計一個方案,這樣不累死自己才怪。因此模式識別的能力就是觀察這個問題有沒有相似的情形、是否具有規律性、是否未來會出現這樣的情況,讓我們可以把單一的問題解決擴展到對於特定情形、類型、屬性的對象。
例如我們詢問後發現,某部門的工程師是為了修復A系統的問題而晚上12點之後加班。那我們在擬定方案的時候就必須去思考,那往後會不會持續遇到A系統要修復的問題。另外如果未來B系統、C系統遇到加班狀況,是不是可以一併適用? 所以我們可以定義,這個方案可以只要是未來修復系統產生的半夜加班都可以適用。把單一方案普遍化成特定情形的解決方案,而不會只適用於這次的情形。
抽象化主要是過濾雜訊,提升問題解決的效率。為何工作者會沒有效率的工作,其實就是在思考的時候沒有辦法過濾雜訊,而把所有的情形都考量進去。所有的情形都想處理,就等於是所有都沒處理,導致自己的思維能力負荷不了崩解。
抽象化的步驟可以幫助我們思考什麼是不變 、什麼是可變、什麼是重要、什麼是不重要,聚焦在解決問題的關鍵的訊息上。
例如設計這個方案時,一定有很多人會來問:我不是工程師也可以適用嗎?我如果不是修復系統也可以適用嗎?我8點加班也可以適用嗎?如果你把所有的情境都想要考量進去,那這個方案就會變得很複雜,不易統籌與規範。
透過抽象化,析出「修復系統」,所以就算不是工程師,但跟工程師一起修復系統,就可以納入適用。這個方案是為了晚上12點之後加班的補償,析出「半夜」,所以即便是修復系統,但12點之前的加班就不適用。我們就可以抽象化為:修復系統同仁半夜加班方案。
抽象化還有幾個概念很有趣,就是封裝、繼承與介面。
演算法不一定是程式設計,演算法是解題思路,包含定義了明確的初始狀態、輸入條件、有限步驟、最後輸出的工作流程,重點是這個流程可以重複的產生。
因此完成了方案擬定後,就是設計工作流程。例如規定加班結束後(狀態),加班人員要提供什麼表單資訊 (輸入)、人資依據加班方案計算 (有效步驟)、最後得出該次加班的加班費 (輸出)。所以之後不管是10個或100個工程師、加班了10次或100次,都不必一個一個問、每次加班每次問,只要按照「修復系統人員半夜加班方案」,都可以馬上解決這個問題。
原本10個人問10次需要花我100分鐘的時間,透過運算思維設計的方案我可能只需要寄一封信+計算加班費5分鐘就解決了這個問題。不僅大幅提升了工作效率,額外還獲得工程師的滿意度以及老闆的肯定,省下大把時間我還可以去做其他專案或是上網看資料、甚至休息喝一杯咖啡。思維能力就是你跟別人差距的原因。