---
# System prepended metadata

title: Topic 35 - 37
tags: [The Pragmatic Programmer]

---

# 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
*在寫程式碼的時候，學會傾聽你的直覺是一個重要的技能。*

- 有時一個設計只是感覺不對，或者一個需求的解釋讓你感到不安 🤧
	- 請停下來分析一下這些感覺
	- 如果你在一個支持的環境中 大聲表達出來
