Functional Programming 既簡單又困難,簡單的會覺得理所當然,但是一旦把這些簡單的事物攤開來去追朔背後的思想及歷史,又是另外一個世界,似乎不存在中間狀態,這讓我們在堆廣學習上是一道阻礙,導致思考落差極大,懂的總能隨意變換舉一反三,略懂的概只能在特定情境下才使的出來,最後懂的只會越來越懂,略懂的大概就停在那了,在程度落差過大的情況下很難作到好的教學及傳遞。
本篇是我遇到的學習狀況及導入到團隊所需面臨的問題,從導入的過程發覺真正的問題所在並改變教學策略。
令我們迷失的一個最大原因
我認為在導入或者學習 FP 中最讓我們困惑並且迷失方向的一個最大原因是,FP 並不像 OOP 那樣有著大家公認的模樣,而是各自有自己的流派,導致你今天你採用了 A 想法,在另一個語言或是領域的 FP 卻完全不提及 A,讓心理產生了矛盾,開始思考這真的是對我有幫助的嗎? FP 到底指的是什麼?
這也是學習中最常遇到的狀況,除了多看多比較找出差異,另一個辦法是找出共同核心思想,只要找到核心思想,那方向絕對不會錯,這也利於你在推廣上的信心。
不可或缺的一部分
經過長期的打滾,在被一堆專有名詞轟炸後,該查的都查了,讀不懂的也硬讀了一番,我終於頓悟了。
大多數教學內容都與「純函數」跟「組合」脫不了關係,這就是我所要找的核心,再來是建立一個自己對這兩個詞的見解。
- 純函數 : 這是一切的前提,你做的越徹底,後續在使用 FP 其他任何手法上都變得更容易
- 組合 : 寫任何程式都是在組合,只是組出來是否堅固,另外 FP 大部分手法目的是在讓組合變得容易
這兩個核心要素是相輔相成的,寫純函數的同時也會改變思維,慢慢的你也能寫出容易組合的純函數,拿積木當比喻的話,組合就是在用積木組出一個應用,寫純函數就是讓一個積木變得更好用,不會形狀怪異導致組合上的困難。
導入
在導入團隊之前必須有幾句話謹記在心
- 不是每個人都與你一樣對這東西有強烈的興趣。
- 你得非常清楚優劣在哪裡,不適合的場景就不要這麼堅持,除非你可以想出更好的替代方案。
- 多聽多看成員的狀況及遇到的困難,解決他們的困擾,你有義務做這件事,只有你最清楚它到底好在哪。
以上幾句不只適用於 FP 本身,任何你想導入的新想法或工具都適用,要讓技術真正對團隊起到效果,必須讓成員都有共識與認知,一有人落單很容易慢慢走歪,甚至是失敗導致最後還要收拾殘局。
建立純函數基本原則
其實純函數的概念已經慢慢的被堆廣出來,我相信以現代工程師基本都會認同純函數本身是有價值的,但是概念終究是概念,在不同語言領域下仍有不同的想法。就以「不應該有 side effect」這條規則,那 side effect 指的到底是什麼,你需要在你們的語言框架下做出更明確的定義,好讓成員去依循及判別。
- 純函數到底是什麼,我們能做到什麼程度?
- 怎樣才叫做不可變,可被接受的可變操作又是什麼?
- side effect 涵蓋哪些,如何去避免它,在不可避免的情況下該怎麼辦?
為你們團隊寫下這幾個問題的答案及想法,讓成員有個明確的方向,並且與你一起共同調整成最適合團隊的準則,當然,修改前提是沒有完全偏離核心思想。
關注體驗勝過於糾正
函數式思維到底好在哪,大概只有從中受益的你最懂,然而大部分你認為的好都是體驗出來的,你不會因為你實際上用起來糟透了,但是大家都說他好而跟著說這東西很棒,也因為你最熟悉,時常看到別人用起來似乎不那麼正規,就心癢癢想糾正別人。
記住,你也是懵懵懂懂瞎用一通過來的,重點是你有心想知道理想的作法到底是什麼,所以比起糾正,你更應該詢問他的感覺怎麼樣,是否有跟你感受到一樣的好處,過程中少了哪些關鍵知識需要你補充,讓團隊有意識的去使用它。
建立思維優先於花俏的手法
作為一個推廣者想必對大部分相關的事物感到興奮,或許你能找到適合使用的情境,但在別人眼裡是毫無意義的操作,任何手法是在處裡特定議題下誕生的,同個手法在不同狀況下也可能起到效果。
所以真正重要的是目的及思想,而不是結果。你在探索時是在找出目的並提供成員一個強而有力的使用理由,在你還沒摸索出個所以然時,任何單純的吹捧或推薦都是脆弱的,必須慢慢的摸索出一套思想體系,再傳遞給別人,之後這些手法的使用將會變得理所當然。
理論的必要性
因為我本身就對一些背後理論有些興趣,所以各方面都會去涉略一些,FP 背後涉及不同的數學分支,所以一開始會非常無力,這我認為是正常的現象,況且某種程度上我還算是個數學小白。
理論並沒有提供給我這些手法實質對程式有什麼直接幫助,但我得到的是抽象能力的提昇,並且能做到快速識別函數的邊界條件跟組合函數,這種能力的提昇或許也算是一種優勢吧。
以團隊角度我認為應該做的是利用 FP 把開發體驗做好,這是開發者最能直接體會到的,理論的話他們有興趣再提供一些資訊即可。
如果你想以我們上面提到的核心思想開始去讀相關資料,但又不想太純數學,我會推薦 「The Art of Functional Programming」這本書,一、二章基本講解了 FP 的一些特性及歷史,以及與一般開發有何區別,後面就是把 FP 各個你常見的特性跟風格用範例解說他實際的作用是什麼。這本應該算是我認為把理論跟實際程式結合的比較好的書。
結語
導入思想比導入工具困難得多,這需要長時間的醞釀與發酵,並不像工具那樣直截了當、立見成效。然而,儘管過程漫長,引入思想最大的優勢在於——你總能從中吸收對自己有意義的部分。
工具會有取捨,而思想則沒有邊界,甚至能融合、衍生出全新的觀點,幫助你更深入地思考問題,前面令我們迷失的一大原因讓我們不得不探索更多,而這種思想上的不一致最後卻成了促使我們獨立思考的催化劑——這正是 FP 帶給我最寶貴的禮物。