# Topic 35 - 37 ###### tags: `The Pragmatic Programmer` ## Topic 35 Actors and Processes ### Actor model Actor 模型由 Carl Hewitt 於1973年提出,推崇「<mark style="background: #ADCCFFA6;">一切皆是演員</mark>」的想法,這與物件導向程式設計的「一切皆是物件」類似。 1. 獨立性 - 每個 actor 都有<mark style="background: #FFB8EBA6;">自己的狀態和行為</mark> - actors 之間<mark style="background: #FFB86CA6;">不共享狀態或資源</mark> 2. 非同步性 - 通過非同步<mark style="background: #FFF3A3A6;">發送</mark>和<mark style="background: #FFF3A3A6;">接收消息</mark>進行 actors 之間的通信和協調 - 👉 提高系統的效率和性能 #### Pros - 可伸縮性(容易擴展) - 可以很容易地添加新的 actor,而不會影響其他 actor 的正常運行。 - 常被用來實現高度可伸縮和可靠的分佈式系統 - e.g. 分佈式數據庫, 分佈式應用程序 - 可靠 & 容錯性 - 如果一個 actor 發生故障,它可以被停止和重啟,而不會影響其他 actor 的正常運行 #### Cons - 複雜性 - 儘管 Actor 模型的概念相對簡單,但實踐起來可能需要大量的代碼和復雜的邏輯。 - 性能問題 - 消息傳遞需要一定的時間和開銷。 所以如果 actor 之間的通信頻率很高,可能會影響系統的性能。 - 測試困難 - 由於 Actor 模型是非同步的,因此在測試時可能會出現一些困難。 ### Application - Erlang 是一種函數式且並發的編程語言,常用於開發大型且高可靠性的分佈式系統。 - <mark style="background: #FFB8EBA6;">Redux 是一種基於 Actor 模型的前端狀態管理庫。</mark> - 在 Redux 中,整個應用程序狀態被存儲在一個單一的狀態樹中,是一個不可變的對象。 - 為了更新狀態,必須通過 dispatch 派發一個 action 對象 - 👉 action 和狀態樹的改變都是通過消息傳遞實現的。 - reducer 函數接收這個 action 並根據它返回一個新的狀態對象,實現狀態的更新。 - 👉 每個 reducer 都是一個獨立的函數,沒有共享狀態。 - ❗️ Vuex 不是 Actor 模型,它是一個基於 Flux 架構的狀態管理庫~~ %%在 Actor 模型中,狀態和行為是封裝在獨立的 actor 中,它們之間通過消息傳遞進行通信。每個 actor 都是自治的,它們不共享狀態或資源,也不會直接影響彼此的行為。%%其狀態和行為都被集中管理在一個全局的 store 中,組件可以從 store 中獲取狀態或觸發操作來改變狀態。 - 也具有可維護和可擴展的特性 - 且容易測試 P.S. Process 通常是一個比較通用的虛擬處理器,通常由操作系統實現,以方便併發。 本文提到的 actor 可以理解為 process 被約束後的一種類型。 ## Topic 37 Listen to your Lizard brain 作為成熟的人類,我們已經學會了忽略我們更動物的一面,我們的直覺(本能),我們的蜥蜴腦 🦎。 在 The gift of fear 這本書中聲稱,大多數在街上被攻擊的人在被攻擊前都會意識到不舒服或緊張。 這些人只是告訴自己這感覺像是在犯傻。 然後,那個身影從黑暗的門口出現 ... <mark style="background: #FFF3A3A6;">Instincts</mark> 直覺只是對裝在我們無意識的大腦中的模式的一種反應。 - 有些是與生俱來的 innate - 有些則是通過<mark style="background: #FFB86CA6;">重複學習</mark>到的 👉 經驗的積累 一層層的隱性知識 tatic knowledge - 有些可以 work 有些不行 - error 的可能原因 - 手手不自主的按下 autosave *Whatever their source, instincts shared one thing: They have no words. Instincts make you feel, <mark style="background: #CACFD9A6;">not think.</mark>* *The trick is to <mark style="background: #CACFD9A6;">notice it is happening</mark>, and then to work out <mark style="background: #CACFD9A6;">why</mark>. * #### SITUATION1: FEAR OF THE BLANK PAGE 面對空蕩蕩的專案可能是一種不安的體驗,許多人就會推遲開始的時間。 - 啟動一個新專案 - 建立一個專案的新模組 ##### 2 POSSIBLE REASONS 1. 蜥蜴腦試圖告訴你一些東西 👉 <mark style="background: #FFF3A3A6;">可能是經驗在向你說話</mark> - 當你感覺到有一種絮絮叨叨的疑惑 - 面對一項任務時感到有些不情願 2. 只是害怕自己犯錯 - 把程式碼中的錯誤當作是對自己能力的反映 - 冒牌貨症候群 - 認為這個專案超出了我們的能力範 - 無法看到自己要怎麼到達終點 ### SITUATION2: FIGHTING YOURSELF Sometimes code just files from your brain into the editor: ideas become bits with seemingly no effort. 🤕 Other days, coding feels like walking uphill in mud. Taking each step requires tremendous effort, and you slide back two every three steps. 🤕🤕 ~~But, being a professional, you solider on, taking step after muddy step: that's my job.~~ 這可能是你的蜥蜴腦感受到一些程式碼的回饋正試圖跟你溝通: - 你現在在做的事情可能比想像中的更難 - 也許結構或設計是錯誤的 - 也許你解決的問題是錯誤的 - 也許你只是在創造一個螞蟻農場的 BUG 🙂 [[⭐️ Tip]] 61 Listen to Your Inner Lizard ### HOW TO TALK LIZARD ##### Stop what you're doing - 給自己一點時間和空間,讓你的大腦自己組織一下。 - 嘗試將問題外化 -> 嘗試對你的橡皮鴨說話 💬 <mark style="background: #ADCCFFA6;">讓想法在你的大腦中層層滲透:你不能強迫它 </mark>最終它們可能會在你的意識層面上浮現出來,你就會有一個 AHA! 的時刻 ##### It's playtime ##### Not just your code 我們工作的很大一部分是處理既有的程式碼。這些程式碼往往是由其他人編寫的。 <mark style="background: #ABF7F7A6;">他們的直覺會和你不同,做出的決定也會不同。 不一定更差,只是不同。</mark> - 👉 你可以試著 - 機械地、慢慢的閱讀他們的代碼 - 對那些看起來很重要 or 奇怪的東西做筆記 雖然這是一份苦差事,但它是有效的。你可能會在這個過程中學習到一些新的東西。 ##### Not just code *在寫程式碼的時候,學會傾聽你的直覺是一個重要的技能。* - 有時一個設計只是感覺不對,或者一個需求的解釋讓你感到不安 🤧 - 請停下來分析一下這些感覺 - 如果你在一個支持的環境中 大聲表達出來