核心行動建議 - 即學即用 TCA 架構重整技巧,減少混亂、強化維護力
- 列出目前專案所有 State 結構,逐一比對實際需求,去除未使用欄位。
狀態精簡後維護更輕鬆,減少未來出錯機率。
- 鎖定單一 Reducer,每週至少啟用 debug 模式一次檢查 Action 流向與 State 更新。
能快速發現異常流程或多餘動作,提高開發透明度。
- 每次新增功能時先切分為 ≤3 個可組裝小模組(Feature),再整合進主架構。
降低耦合度、方便日後重構與擴充。
- 預留不少於10%的開發工時,用於集成測試 Store 與 Scope 的邏輯連動。
`先驗證流程` 能提早攔截潛在 bug,避免回頭修正浪費時間。
1. 程式架構亂了怎麼辦?TCA登場
# SwiftUI Composable Architecture:1 - 簡介
## 為什麼架構很重要
應用程式越做越大,架構——這玩意兒真的很難不去在意。嗯,我以前其實沒怎麼理會,坦白說,大概一年前才開始思考軟體架構對整個專案的影響。不過,那時候我也只是有一搭沒一搭地讀一些文章而已,好像總是隔著一層紗,看得模模糊糊的。直到2025年初吧,我終於接觸到Swift Composable Architecture(TCA),然後腦袋突然「叩咚」一下——感覺自己之前好像都搞錯重點了。說起來,其實也不知道自己到底懂了多少,但至少開始嘗試拆解SwiftUI開發的那種混亂與無力感。欸……話說回來,有時候遇到新東西就忍不住想多嘴兩句。所以這系列除了官方那套教條,也會夾雜一些我半路跌倒時摸索出來的小招數、被雷劈的經歷,還有那些「啊早知道就好了」的小哀怨。
## 什麼是 Swift Composable Architecture(TCA)?
Swift Composable Architecture(TCA)……嗯,要怎麼形容比較貼切?它其實是一套函式庫,也是設計模式,由Point-Free團隊裡面的Brandon Williams和Stephen Celis開發出來的。他們名字每次看到都覺得有點熟悉又想不起是哪個Podcast聽過。總之,TCA目的是幫忙管理複雜狀態、副作用以及導覽流程,而且要讓這一切變得一致、可擴展還能測試(老實說,一聽到要寫測試就頭痛)。特別是在你的SwiftUI app變大、頁面愈堆愈多的時候,它會讓你少掉很多爆炸頭髮。哦岔題了,拉回來。
它最核心的思想,就是把應用結構釐清,把資料流跟邏輯走向抓緊,不讓各種奇怪Bug滿天飛。整個模式頗嚴格,要求你在同一個地方定義狀態、動作和副作用,不管大小更新,都必須走預設好的流程。如果習慣隨手塞邏輯的人應該超級受不了吧,但我自己被救了一命——也許是心理安慰?
## 為什麼架構很重要
應用程式越做越大,架構——這玩意兒真的很難不去在意。嗯,我以前其實沒怎麼理會,坦白說,大概一年前才開始思考軟體架構對整個專案的影響。不過,那時候我也只是有一搭沒一搭地讀一些文章而已,好像總是隔著一層紗,看得模模糊糊的。直到2025年初吧,我終於接觸到Swift Composable Architecture(TCA),然後腦袋突然「叩咚」一下——感覺自己之前好像都搞錯重點了。說起來,其實也不知道自己到底懂了多少,但至少開始嘗試拆解SwiftUI開發的那種混亂與無力感。欸……話說回來,有時候遇到新東西就忍不住想多嘴兩句。所以這系列除了官方那套教條,也會夾雜一些我半路跌倒時摸索出來的小招數、被雷劈的經歷,還有那些「啊早知道就好了」的小哀怨。
## 什麼是 Swift Composable Architecture(TCA)?
Swift Composable Architecture(TCA)……嗯,要怎麼形容比較貼切?它其實是一套函式庫,也是設計模式,由Point-Free團隊裡面的Brandon Williams和Stephen Celis開發出來的。他們名字每次看到都覺得有點熟悉又想不起是哪個Podcast聽過。總之,TCA目的是幫忙管理複雜狀態、副作用以及導覽流程,而且要讓這一切變得一致、可擴展還能測試(老實說,一聽到要寫測試就頭痛)。特別是在你的SwiftUI app變大、頁面愈堆愈多的時候,它會讓你少掉很多爆炸頭髮。哦岔題了,拉回來。
它最核心的思想,就是把應用結構釐清,把資料流跟邏輯走向抓緊,不讓各種奇怪Bug滿天飛。整個模式頗嚴格,要求你在同一個地方定義狀態、動作和副作用,不管大小更新,都必須走預設好的流程。如果習慣隨手塞邏輯的人應該超級受不了吧,但我自己被救了一命——也許是心理安慰?
2. TCA的誕生與它背後那些人
一開始接觸這種方式,老實說,我也覺得有點僵硬──真的,總是卡卡的。但或許正因為它這麼「死板」,反而帶來了某種讓人安心的秩序感吧。嗯,其實我自己常常在專案裡搞到一團亂,所以才會格外在意這個問題。當應用程式慢慢長大、愈來愈複雜時,它就能防止那些莫名其妙、隨機出現的小狀況,至少理論上如此啦。不過話又說回來,有時候還是會不自覺懷疑,到底是不是太拘謹了?唉,不過現在狀態都不能被哪裡都改掉,你總算可以很明白地追蹤每個變化發生在哪裡,以及到底為什麼要變動。偶爾還是會迷路啦,但已經比以前好多了。這也讓除錯變簡單一些,而且測試起來比較順手(雖然偶爾還是有點煩)。新加入團隊的人嘛,他們要理解整個系統,好像也容易不少,至少不用邊猜邊罵。
## TCA 的核心組成
欸,不小心岔題了。拉回重點,如果你想懂 TCA,首要的事情就是對它的幾個基礎構件有概念:
### 1. State
所謂 State,就是你的應用程式裡那份唯一、不可否認的資料來源。簡單講,就是 source of truth 啦。有時候我會糾結到底該放什麼進去,但基本上,只要是所有視圖必須依賴呈現的資訊,都收納在這裡就對了。TCA 推崇將所有狀態集中管理,欸,其實剛開始看文件腦袋蠻痛,但久了後發現好像真的比較能掌控全局,也方便處理各種情境調度。有些細節很瑣碎,可是習慣之後,你反而會比較不怕突然出包,大概就是…嗯,有點難形容,要親身體驗才懂吧。
## TCA 的核心組成
欸,不小心岔題了。拉回重點,如果你想懂 TCA,首要的事情就是對它的幾個基礎構件有概念:
### 1. State
所謂 State,就是你的應用程式裡那份唯一、不可否認的資料來源。簡單講,就是 source of truth 啦。有時候我會糾結到底該放什麼進去,但基本上,只要是所有視圖必須依賴呈現的資訊,都收納在這裡就對了。TCA 推崇將所有狀態集中管理,欸,其實剛開始看文件腦袋蠻痛,但久了後發現好像真的比較能掌控全局,也方便處理各種情境調度。有些細節很瑣碎,可是習慣之後,你反而會比較不怕突然出包,大概就是…嗯,有點難形容,要親身體驗才懂吧。

3. 一切都從State開始(還有那些小細節)
動作(Actions)嘛,其實就是你在這個功能裡面可能出現的那些事,像什麼?嗯,比如按下某個按鈕啦、API 給回應啦,甚至計時器突然跳出來嗶嗶叫一下,都算。每次講到動作都覺得頭有點暈,你懂嗎?好像很多事情都被塞進一個籃子裡。有時候我自己也搞不太清楚,唉,不過重點是——它們都記錄著發生了什麼狀況,同時也是更新狀態的方法之一,大概就這樣吧。
欸,你還記得之前聊過 TCA 那種莫名嚴謹感嗎?這段就是很鮮明的例子。有點囉唆,不過我們真的只能靠傳送動作去改變狀態,尤其那種會直接影響畫面的部分。啊,我剛才差點又岔題了——好吧,拉回來說,就是不能繞道、沒捷徑。
Reducer 這東西其實……嗯,要怎麼形容呢?它負責定義你那個功能需要哪些狀態,以及會有什麼動作可以發生。有時腦袋轉不過來,但 Reducer 的工作大致就是處理每一個動作來的時候應該怎麼反應,也許跟人生有點像(笑),只是人比較沒那麼規矩啦。不小心想多了,其實 Reducer 就是替你的程式決定遇到不同動作要怎麼調整現況。
欸,你還記得之前聊過 TCA 那種莫名嚴謹感嗎?這段就是很鮮明的例子。有點囉唆,不過我們真的只能靠傳送動作去改變狀態,尤其那種會直接影響畫面的部分。啊,我剛才差點又岔題了——好吧,拉回來說,就是不能繞道、沒捷徑。
Reducer 這東西其實……嗯,要怎麼形容呢?它負責定義你那個功能需要哪些狀態,以及會有什麼動作可以發生。有時腦袋轉不過來,但 Reducer 的工作大致就是處理每一個動作來的時候應該怎麼反應,也許跟人生有點像(笑),只是人比較沒那麼規矩啦。不小心想多了,其實 Reducer 就是替你的程式決定遇到不同動作要怎麼調整現況。
4. Action不是只有按鈕,還有更多奇怪來源
唉,這個 TCA 的 reducer 啊,怎麼說呢,你等等會看到,它其實是用 `@Reducer` 這個巨集寫成 Swift 的結構體樣子。雖然型態長得有點像模板,但...老實講,裡面塞什麼才是真正的關鍵。我有點常懷疑,大家是不是只在意那個外層包裝,不過重點還是在內容啦。
內部就是一個函式。它會吃進現在的狀態和 action,然後咦?沒錯,又產生新的狀態回來。有時候你功能小一點,這 reducer 可能就只是根據 action 去動動 state,比如換個頁籤、更新文字啥的。但現實世界很煩瑣嘛,在真的 app 裡頭,reducer 根本常常不只做這些事。例如,你可以讓它處理路由(嗯,有人說過這聽起來很奇怪),或拿來存取像資料庫 client 之類的依賴項,又或者把好幾個小功能組合起來變成大的東西。
咦,我是不是扯遠了……欸,好吧,之後我們深入聊路由還有功能組合的時候會再解釋更多細節。不過你先記著這回事。### 4. Store
Store 啊,就是 TCA 裡頭把所有元素連起來的東西,其實有點像是總開關吧。
內部就是一個函式。它會吃進現在的狀態和 action,然後咦?沒錯,又產生新的狀態回來。有時候你功能小一點,這 reducer 可能就只是根據 action 去動動 state,比如換個頁籤、更新文字啥的。但現實世界很煩瑣嘛,在真的 app 裡頭,reducer 根本常常不只做這些事。例如,你可以讓它處理路由(嗯,有人說過這聽起來很奇怪),或拿來存取像資料庫 client 之類的依賴項,又或者把好幾個小功能組合起來變成大的東西。
咦,我是不是扯遠了……欸,好吧,之後我們深入聊路由還有功能組合的時候會再解釋更多細節。不過你先記著這回事。### 4. Store
Store 啊,就是 TCA 裡頭把所有元素連起來的東西,其實有點像是總開關吧。

5. Reducer這個東西其實比你想得複雜
它會把當下的狀態留存起來,然後你的視圖就可以去發送動作,reducer 也能運作來調整那份狀態。嗯,其實在 SwiftUI 裡面,大多時候大家就是直接把 store 丟給視圖;只要一變動,畫面就自己反應了。這聽起來有點像魔術,但其實背後邏輯滿單純的。
> 就算 store 掌管著某個功能模組、甚至整體 app 的完整狀態,也還是可以用 `store.scope` 去約束視圖能觸及的東西範圍。有些人可能會疑惑欸,那這樣不就很難維護?但事實上這種做法剛好讓你可以只塞進去那個視圖「真正需要」的資料和指令。比如說,在 `HomeView` 裡,就能把全域 store 縮減成只有 `home` 狀態和相關行為——於是那個頁面根本不會碰到什麼奇怪的外部資訊。啊,我有時候也會忘記 scope 到底要怎麼寫,不過沒差,查文件就好啦。
## TCA 流程如何運作
TCA 的流程……嗯,好像每次講都一樣,不過還是得重複一次吧:View 先丟出 Action,接著 Reducer 處理它,再改 State,最後 View 自己跟著更新。唉,每一步感覺都蠻可控、也容易追蹤,就是少了一點神秘感(這到底算優點嗎)。
View 直接讀取 State,也負責 dispatch Actions;Reducer 則處理各式各樣的 Actions,同時順手修改 State。而 SwiftUI 本身又是 reactive,所以畫面自然而然地同步最新資料。有時會想,如果哪天漏掉一個步驟,系統應該馬上大亂吧。不過目前看來,每一步都還算透明易懂。
## 什麼時候適合使用 TCA
說真的,要不要用 TCA 有時候讓人猶豫啊——雖然官方文檔寫得很清楚,可現實情境總是多多少少不一樣。有些專案場景,用 TCA 感覺特別順手,比如說需要高度可預測性、或真的很重架構分離那種大型 app。我自己偶爾遇到功能爆炸多的頁面,就懶得手刻 redux-like flow(誰有那時間)。可是如果只是單純的小元件、小功能,有時反而嫌 TCA 太龐大,不如 swift state 搞定收工。唉,有沒有標準答案?大概沒有吧。不過據說習慣之後回不了頭就是了。
> 就算 store 掌管著某個功能模組、甚至整體 app 的完整狀態,也還是可以用 `store.scope` 去約束視圖能觸及的東西範圍。有些人可能會疑惑欸,那這樣不就很難維護?但事實上這種做法剛好讓你可以只塞進去那個視圖「真正需要」的資料和指令。比如說,在 `HomeView` 裡,就能把全域 store 縮減成只有 `home` 狀態和相關行為——於是那個頁面根本不會碰到什麼奇怪的外部資訊。啊,我有時候也會忘記 scope 到底要怎麼寫,不過沒差,查文件就好啦。
## TCA 流程如何運作
TCA 的流程……嗯,好像每次講都一樣,不過還是得重複一次吧:View 先丟出 Action,接著 Reducer 處理它,再改 State,最後 View 自己跟著更新。唉,每一步感覺都蠻可控、也容易追蹤,就是少了一點神秘感(這到底算優點嗎)。
View 直接讀取 State,也負責 dispatch Actions;Reducer 則處理各式各樣的 Actions,同時順手修改 State。而 SwiftUI 本身又是 reactive,所以畫面自然而然地同步最新資料。有時會想,如果哪天漏掉一個步驟,系統應該馬上大亂吧。不過目前看來,每一步都還算透明易懂。
## 什麼時候適合使用 TCA
說真的,要不要用 TCA 有時候讓人猶豫啊——雖然官方文檔寫得很清楚,可現實情境總是多多少少不一樣。有些專案場景,用 TCA 感覺特別順手,比如說需要高度可預測性、或真的很重架構分離那種大型 app。我自己偶爾遇到功能爆炸多的頁面,就懶得手刻 redux-like flow(誰有那時間)。可是如果只是單純的小元件、小功能,有時反而嫌 TCA 太龐大,不如 swift state 搞定收工。唉,有沒有標準答案?大概沒有吧。不過據說習慣之後回不了頭就是了。
6. Store藏了什麼?scope又在搞什麼鬼
TCA 在那些動輒龐大、還在持續膨脹的專案裡,真的很明顯有它的優勢。尤其啦,說到團隊合作這回事,有時候一堆人一起開發,亂成一團也不是沒發生過。偏偏 TCA 裡面什麼東西都照著一套嚴格又預期內的規則走,嗯……我想這讓開發者們在理解應用怎麼跑、資料藏哪裡、狀態更新是怎樣流動時,好像就簡單不少。其實我偶爾會懷疑:真的每個人都能乖乖照著結構嗎?但多數時候,好像混亂的情形減少了欸(至少我自己是覺得如此)。岔題一下,上次有人問 SwiftUI 相容性,其實 TCA 跟 SwiftUI 的配合度算高喔。
SwiftUI 一直強調反應式更新還有單向資料流,搞得人腦偶爾轉不過來——啊抱歉扯遠了——TCA 能給這種架構明確的骨幹,不至於無頭蒼蠅。然後,如果你正要打造那種畫面超多、有共享狀態或者摻雜非同步效果(比如叫 API 那些鬼事)的 SwiftUI 應用程式啦,其實選擇 TCA 就會覺得整體組織性跟可測試性提升許多。不知道是不是錯覺,有時寫起來竟然沒那麼焦躁。
## TCA 與 MVVM 的比較
唉,在正式接觸 TCA 以前,我大部分時間都用 MVVM 結合 SwiftUI。我往往直接選 `@StateObject` 或 `@ObservedObject`,順手弄個 ViewModel,再把資料丟來丟去傳遞。有時自以為流程清楚,但老實講隨著 App 慢慢長大,全體架構開始鬆散甚至混亂(好吧,有點慌)。嗯…有幾次還因為資料流向抓不穩,多耗了好幾小時 debug;欸,是不是只有我這樣?總之,到後期再回頭整理,就會痛感原本看似合理的做法,其實暗藏不少地雷。
SwiftUI 一直強調反應式更新還有單向資料流,搞得人腦偶爾轉不過來——啊抱歉扯遠了——TCA 能給這種架構明確的骨幹,不至於無頭蒼蠅。然後,如果你正要打造那種畫面超多、有共享狀態或者摻雜非同步效果(比如叫 API 那些鬼事)的 SwiftUI 應用程式啦,其實選擇 TCA 就會覺得整體組織性跟可測試性提升許多。不知道是不是錯覺,有時寫起來竟然沒那麼焦躁。
## TCA 與 MVVM 的比較
唉,在正式接觸 TCA 以前,我大部分時間都用 MVVM 結合 SwiftUI。我往往直接選 `@StateObject` 或 `@ObservedObject`,順手弄個 ViewModel,再把資料丟來丟去傳遞。有時自以為流程清楚,但老實講隨著 App 慢慢長大,全體架構開始鬆散甚至混亂(好吧,有點慌)。嗯…有幾次還因為資料流向抓不穩,多耗了好幾小時 debug;欸,是不是只有我這樣?總之,到後期再回頭整理,就會痛感原本看似合理的做法,其實暗藏不少地雷。

7. 流程梳理:到底誰先動?誰最後負責善後
用 MVVM 時,你會碰到這種讓人有點煩躁的選擇題啦——像是:欸,這段邏輯到底要讓哪個 ViewModel 處理才對啊?然後,又跑出一個更微妙的問題:那個該死的狀態,誰管比較好?反正,每次只要開始改動,就會忍不住懷疑:「我是不是又放錯地方了?」嗯,散落各地的一堆函式,一下這裡一下那裡,各自偷偷摸摸更新不同屬性。啊,有時連自己都搞不清楚原本設計是什麼,但等你發現時,只剩下開著偵錯工具在滿世界找 bug 的份。唉。
說回 TCA,好像…亂象可以少一點(但也不是神藥)。有個單一來源的狀態,那傢伙叫 `Store
說回 TCA,好像…亂象可以少一點(但也不是神藥)。有個單一來源的狀態,那傢伙叫 `Store
`——名字怪硬派。我剛開始還以為要手動改值,結果完全不用,你就是丟個 action 給 store,它再丟給 reducer 去消化處理。所有複雜邏輯全往 reducer 那堆積,就算精神恍惚,也大致能看懂什麼時候資料被更新。其實滿方便的,只是話說回來,我上禮拜因為凌晨沒睡覺,看 reducer 還是昏倒了一輪。有點離題了喔…繼續。
<pre><code class="language-yaml"><pre><code class="language-yaml">### 重點整理:
- 狀態變更藏在哪已經比較明白
- 資料、邏輯、外部副作用彼此分開安置
- 不太需要一直焦慮 ViewModel 規劃細節
- 追不到隨機狀態異動的崩潰機率降低不少
咳,其實我當然知道,不可能只靠這幾點就做什麼終極評比啦。架構這回事有夠複雜,比較依據永遠都嫌薄弱,大概只能暫時就先講到這裡吧。
8. 什麼時候應該選擇TCA,不然MVVM也可以啦
MVVM 和 TCA 到底哪個比較適合,其實嘛,得看專案脈絡才知道──老實講,每一種架構都會卡在某些地方,各有各的坑啦。嗯,這只是我的小小見解(話說,有時候我也懷疑自己理解得夠不夠深入),畢竟用 MVVM 時我會覺得怪怪的,不確定是不是純粹手生、還是根本沒掌握精髓……唉,也許只是熟練度問題吧 XD
## 快速預覽:TCA 程式碼到底長什麼樣?
欸,直接上範例大概最快了。不囉嗦,我找了一個超級陽春的計數器功能來展示 TCA 怎麼組合應用。其實寫起來就那幾行,但看到程式碼腦子常常還是糾結住。
@Reducer
struct CounterFeature {
struct State: Equatable {
var count = 0
}
enum Action: Equatable {
case increment
case decrement
}
var body: some ReducerOf
## 快速預覽:TCA 程式碼到底長什麼樣?
欸,直接上範例大概最快了。不囉嗦,我找了一個超級陽春的計數器功能來展示 TCA 怎麼組合應用。其實寫起來就那幾行,但看到程式碼腦子常常還是糾結住。
swift
import ComposableArchitecture
import SwiftUI
@Reducer
struct CounterFeature {
struct State: Equatable {
var count = 0
}
enum Action: Equatable {
case increment
case decrement
}
var body: some ReducerOf
{
Reduce { state, action in
switch action {
case .increment:
state.count += 1
return .none
case .decrement:
state.count -= 1
return .none
}
}
}
}
然後咧?邏輯寫完當然要丟進 SwiftUI 視圖裡面跑跑看,不然乾坐著好像也沒意義——好啦拉回正題。
struct CounterView: View {
let store: StoreOf
var body: some View {
WithViewStore(store, observe: { $0 }) { viewStore in
VStack {
Text("Count: \(viewStore.count)")
HStack {
Button("−") { viewStore.send(.decrement) }
Button("+") { viewStore.send(.increment) }
}
}
}
}
}
## 下一步
所以,你現在應該對 TCA 的核心運作、資料流向有點感覺了吧?雖然過程中可能還是一頭霧水,但真的只有自己摸下去才會懂。接下來我們就動手做,一步一步把狀態跟動作拆開,再用 reducer 串起所有東西,用 store 推動整個 SwiftUI 視圖……等等,好像又開始碎念了,總之下一篇就是從零打造簡易應用,你絕對可以撐到那裡,大概啦。
下一篇:SwiftUI 組合式架構(二):從零打造一個簡易應用
## 作者小語
呃,我想先自報家門一下好了。

9. 超迷你的Counter範例跟你想的不一樣嗎?
我是 Muhammad Rezky Sulihin。唉,終於到了最後了,不太確定該怎麼收尾。總之真的很謝謝你花時間把這些文字看完。其實如果你腦中有冒出一點小疑問、甚至只是想罵我英文爛,其實都可以直接寄信給我[. ](mailto:)——對,我是真的會回的那種人,雖然有時候可能晚個兩天…呃,別介意。你的批評或建議,大概都能推我往前走一小步吧。有時覺得自己一直在原地兜圈子,但偶爾也會忽然明白,啊,有人在乎這些事。
老實說,我現在同時是行動應用開發者,又還卡在電腦科學本科(真的是快畢不了業的那種),然後之前還從 Apple Developer Academy @IL 畢業,感覺履歷就像堆積木一樣搖搖欲墜。不過嘛,各種機會我幾乎都願意碰——不管合作、自由接案、實習、兼職或全職都有興趣。如果哪天有緣能一起折騰一下新東西?嗯,那應該很妙吧。有點扯遠了,回到正題,希望我們之後還有機會在其他文章裡遇見。好吧,就先這樣啦。
老實說,我現在同時是行動應用開發者,又還卡在電腦科學本科(真的是快畢不了業的那種),然後之前還從 Apple Developer Academy @IL 畢業,感覺履歷就像堆積木一樣搖搖欲墜。不過嘛,各種機會我幾乎都願意碰——不管合作、自由接案、實習、兼職或全職都有興趣。如果哪天有緣能一起折騰一下新東西?嗯,那應該很妙吧。有點扯遠了,回到正題,希望我們之後還有機會在其他文章裡遇見。好吧,就先這樣啦。
10. 後記和自我介紹,還有那點不完美
好吧,說實話,每次要結束的時候都會有點猶豫,就是那種「欸,要講完了嗎?」的感覺。你知道嗎,有些問題,好像永遠也學不完。嗯——請你一直保有那份想知道更多的小小執念,也許未來哪天會忽然明白什麼吧?其實我自己也還在學習啦,有時候覺得怎麼查資料都還是有疏漏。這應該很正常,大概吧。
說到這裡,我分享的東西,嚴格來講,都只是目前摸索到的一點心得而已。有些地方可能不夠精確、甚至會讓人想搖頭,但……人生本來就不是每件事都能一次就做對嘛。唉,不過希望至少能對也曾經卡關的人有點幫助。如果你剛好看到什麼不合理或需要補充的地方,真的拜託留言給我,這樣我才比較不容易一直錯下去(自言自語中斷→其實沒有人留言也沒關係啦)。
我是真的很歡迎各種意見或指正,不管是溫柔建議還是直接批評,都很有價值。畢竟,人總不能活在自己的小圈圈太久,不然越來越像井底之蛙了……呃,我是不是又扯遠了?拉回來!繼續保持開放、繼續修正,也許哪天就能突破盲區。不知為何突然想到咖啡快沒了——唉,下次見面聊更深一點好了,先這樣啦。
說到這裡,我分享的東西,嚴格來講,都只是目前摸索到的一點心得而已。有些地方可能不夠精確、甚至會讓人想搖頭,但……人生本來就不是每件事都能一次就做對嘛。唉,不過希望至少能對也曾經卡關的人有點幫助。如果你剛好看到什麼不合理或需要補充的地方,真的拜託留言給我,這樣我才比較不容易一直錯下去(自言自語中斷→其實沒有人留言也沒關係啦)。
我是真的很歡迎各種意見或指正,不管是溫柔建議還是直接批評,都很有價值。畢竟,人總不能活在自己的小圈圈太久,不然越來越像井底之蛙了……呃,我是不是又扯遠了?拉回來!繼續保持開放、繼續修正,也許哪天就能突破盲區。不知為何突然想到咖啡快沒了——唉,下次見面聊更深一點好了,先這樣啦。
