Skip to content

2024

The C4 Model for Visualising Software Architecture

Software architecture forms the backbone of any successful system, defining the structure and interactions among its components. However, effectively communicating architecture to various stakeholders—developers, business analysts, or executives—can often be challenging. The C4 Model, created by Simon Brown, provides a lightweight yet powerful framework for visualising software architecture in a structured and scalable way. This model offers a systematic approach across four levels of abstraction: Context, Container, Component, and Code.

The Context level captures the big picture, answering what the system does, its purpose, and how it interacts with external entities. This high-level overview is perfect for executives or non-technical stakeholders to understand the system’s scope and key interactions. For example, an e-commerce platform’s Context diagram might highlight interactions with customers, payment gateways, and shipping providers, offering a clear, broad understanding of the system's environment.

The Container level dives into the system’s building blocks, such as applications, services, and databases, and focuses on their communication mechanisms. This level is aimed at technical stakeholders who need to understand how the system is structured and how its components interact. Using the same e-commerce example, the Container diagram might showcase a web application, an order management backend service, and a database, along with their communication protocols.

At the Component level, the focus shifts to the internal workings of individual containers. This deeper level of abstraction highlights the key components, their responsibilities, and their interactions within a container. For instance, the order management service might have components like an Order Processor, Payment Integration Module, and Notification Service, detailing how they work together to process orders and notify customers.

The Code level offers the most granular view, delving into implementation details. While optional, this level can be useful for development teams requiring detailed insights into the source code structure, such as class diagrams or methods used within a specific module. Using UML or similar tools, this level can visualize the finer details, such as how an Order Processor class interacts with a database repository.

The C4 Model stands out because it provides clarity across stakeholders, ensuring that everyone, from executives to developers, can understand the architecture at the appropriate level of detail. It scales well for projects of varying sizes, maintains consistent communication through structured diagrams, and emphasizes abstractions that evolve logically from high-level context to low-level details. These characteristics make it an invaluable tool for teams aiming to align on architectural decisions.

Creating C4 diagrams can be facilitated by tools like Structurizr, PlantUML, or general diagramming platforms such as Lucidchart or Draw.io. Best practices for adopting the C4 Model include starting at the Context level before moving to deeper levels, keeping diagrams simple, using consistent notation, iterating with feedback, and documenting assumptions alongside the diagrams.

The C4 Model is a practical and effective way to communicate software architecture, ensuring alignment across technical and non-technical stakeholders. By layering abstraction and focusing on the essentials, it bridges the gap between complexity and clarity. Whether you’re a developer, architect, or technical leader, adopting the C4 Model can significantly improve how software systems are visualized and understood. Start using it in your projects to experience its benefits firsthand.

C4 模型:可視化軟體架構

軟體架構是任何成功系統的核心,定義了其組件的結構及其互動方式。然而,向不同的利害關係人(如開發人員、業務分析師或高層管理人員)有效傳達架構信息往往是具有挑戰性的。由 Simon Brown 創建的 C4 模型,提供了一種輕量級但強大的框架,用於以結構化且可擴展的方式可視化軟體架構。該模型在四個抽象層次上提供系統化的方法:環境層(Context)容器層(Container)組件層(Component)程式碼層(Code)

環境層(Context)

環境層捕捉了系統的大圖景,回答了系統的功能、目的以及如何與外部實體互動的問題。這種高層次的概述非常適合高管或非技術相關的利害關係人,以了解系統的範圍和關鍵互動。例如,一個電子商務平台的環境圖可能會突出顧客、支付網關和運輸服務提供商的互動,清楚地呈現系統的環境與範圍。

容器層(Container)

容器層深入探討系統的構建模塊,例如應用程式、服務和數據庫,並關注它們的通訊機制。這一層面向需要了解系統結構及其組件如何交互的技術相關利害關係人。以同一個電子商務平台為例,容器圖可能會展示網頁應用、訂單管理後端服務以及數據庫及其通信協議。

組件層(Component)

組件層聚焦於個別容器的內部運作。這一層次的抽象突出了關鍵組件、其責任以及它們在容器內部的交互方式。例如,訂單管理服務可能包括“訂單處理器”、“支付整合模組”和“通知服務”等組件,詳細說明它們如何協作完成訂單處理並通知客戶。

程式碼層(Code)

程式碼層提供了最細緻的視圖,深入探討實現細節。雖然此層是可選的,但對於需要詳細了解源代碼結構(如類圖或特定模組中使用的方法)的開發團隊來說,它可能非常有用。使用 UML 或類似工具,可以可視化如“訂單處理器”類如何與數據庫倉儲進行交互等細節。

C4 模型的優勢在於,它在不同利害關係人之間提供了清晰的溝通,確保從高管到開發人員的所有人都能在適當的詳細程度上理解架構。它對不同規模的項目有良好的適應性,通過結構化圖表保持一致的溝通,並強調從高層次環境到低層次細節的抽象邏輯演進。這些特性使其成為團隊在架構決策上對齊的一個重要工具。

創建 C4 圖表的工具與最佳實踐

創建 C4 圖表可以使用 Structurizr、PlantUML 或通用圖表平台如 Lucidchart 或 Draw.io 等工具。採用 C4 模型的最佳實踐包括: - 從環境層開始,然後逐步深入。 - 保持圖表簡潔。 - 使用一致的符號。 - 結合反饋進行迭代。 - 與圖表一起記錄假設。

C4 模型是一種實用且有效的軟體架構溝通方式,能確保技術和非技術利害關係人之間的對齊。通過分層抽象並專注於要點,它在複雜性和清晰度之間建立了橋樑。無論您是開發人員、架構師,還是技術領導者,採用 C4 模型都可以顯著改善軟體系統的可視化和理解。開始在您的項目中使用它,親身體驗其帶來的好處吧!

Mastering Digital Leadership - Lessons on Lean Innovation and Continuous Learning from NUS-ISS

Last week, I completed the final presentation for the Master of Technology in Digital Leadership course at NUS-ISS, marking the end of an incredible two-year journey. This milestone reflects not only academic achievement but also a personal transformation. The lessons and insights gained during this program have been invaluable in shaping my understanding of leadership and innovation in a rapidly changing world.

One of the key takeaways from this journey is the importance of continuous learning and adapting to change. In today’s fast-moving technological landscape, innovation is not a one-time event but an ongoing process. Lean and experimentation principles have proven to be powerful tools for fostering innovation in any organization. These principles emphasize the need to test ideas quickly, learn from failures, and continuously improve. Organizations that embrace this approach can create long-term growth by unlocking the creativity and talent of their teams.

To drive meaningful innovation, it is essential to validate ideas early by engaging directly with customers. Asking simple but important questions—such as whether the problem is real, how it is being solved today, and whether a proposed solution is better—ensures efforts are focused on delivering real value. This approach minimizes wasted resources and increases the likelihood of success.

The program also highlighted that successful transformation begins with leadership. Leaders must inspire action, create space for experimentation, and encourage learning. Companies like GE and Airbnb have shown how fostering a culture of innovation and agility can lead to remarkable growth and resilience. Leadership drives change, but it also requires building systems and processes that make innovation a continuous and reliable effort.

As I reflect on this journey, I am reminded that the real challenge lies ahead. Technology and markets will keep changing, and organizations must develop the ability to adapt repeatedly. My goal is to apply these lessons to inspire teams, drive impactful changes, and build organizations that thrive on uncertainty and opportunity.

This two-year journey has been a transformative experience, but it is only the beginning. The commitment to learning, experimenting, and innovating will remain central to my approach as I embrace the challenges of the future.

掌握數位領導力——來自NUS-ISS的精益創新與持續學習的啟示

上週,我完成了新加坡國立大學-資訊系統學院(NUS-ISS)數位領導力碩士課程的最終展示,標誌著這段令人難忘的兩年旅程的結束。這不僅是學術上的成就,更是一次個人的蛻變。在這個課程中學到的經驗和見解,對於在快速變化的世界中理解領導力和創新有著無比寶貴的作用。

這段旅程中最重要的收穫之一就是持續學習和適應變化的重要性。在當今快速發展的科技環境中,創新不再是一蹴而就的事件,而是一個不斷進行的過程。精益和實驗的原則已被證明是促進任何組織創新的強大工具。這些原則強調需要快速測試想法,從失敗中學習,並持續改進。那些擁抱這種方法的組織,能夠通過激發團隊的創造力和才能來實現長期增長。

為了推動有意義的創新,提前通過直接與客戶互動來驗證想法至關重要。詢問一些簡單但重要的問題——例如,這個問題是否真實存在?目前是如何解決的?所提出的解決方案是否更好?——能確保將精力集中於交付真正的價值。這種方法可以最大程度地減少資源浪費,並提高成功的可能性。

這個課程還強調了成功轉型的起點是領導力。領導者必須激勵行動,為實驗創造空間,並鼓勵學習。像通用電氣(GE)和Airbnb這樣的公司展示了如何通過培養創新和敏捷的文化來實現顯著的增長和韌性。雖然領導力是變革的推動者,但它也需要建立系統和流程,確保創新成為一個持續且可靠的努力。

回顧這段旅程,我深刻地意識到真正的挑戰還在前方。科技和市場將不斷變化,組織必須具備不斷適應的能力。我的目標是運用這些經驗教訓,啟發團隊,推動有影響力的變革,並建立在不確定性與機遇中蓬勃發展的組織。

這兩年的旅程是一段改變人生的經歷,但這僅僅是開始。對學習、實驗和創新的承諾,將繼續作為我迎接未來挑戰的核心方法。

Automating DNS Management in Kubernetes with ExternalDNS

ExternalDNS is a third-party, open-source tool designed to automate the management of DNS records for Kubernetes clusters. It integrates seamlessly with Kubernetes to dynamically update DNS records in response to changes in your cluster, enabling smooth automation of exposed services, APIs, and applications. Originally developed to support AWS Route53 and Google CloudDNS, it has since expanded to support a wide array of DNS providers, making it a versatile option for cloud-native environments.

Key Concepts in ExternalDNS

ExternalDNS operates by watching “source” Kubernetes resources—like Services, Ingresses, and Istio Gateways—that represent network endpoints. It reconciles these sources with DNS records through Kubernetes Controller patterns, ensuring that records are synchronized with the underlying infrastructure changes.

Types of Sources

The main types of source objects for ExternalDNS are: - Services (of type LoadBalancer): Commonly used for high-availability applications. - Ingresses: Manage access to services based on routing rules. - Custom Resources (CRDs): Extend ExternalDNS’s compatibility with other Kubernetes configurations.

Each source is associated with an ExternalDNS instance, which will reconcile these resources with a DNS provider based on specific annotations configured on the source.

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --source=ingress
    - --source=service
Hostname Annotations

Once ExternalDNS detects a source, it requires a hostname to identify the DNS record pointing to this source. Hostname annotations facilitate this by specifying the record name.

metadata:
  annotations:
    external-dns.alpha.kubernetes.io/hostname: api.example.io

This annotation instructs ExternalDNS to create or update a DNS record with api.example.io as the hostname.

DNS Providers and Integrations

ExternalDNS supports various DNS providers, making it a flexible choice for multi-cloud setups. DNS providers, or “integrations,” allow it to update records on platforms like AWS Route53, Google CloudDNS, and Azure DNS. Configuration for providers is specified as arguments to the ExternalDNS container:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --provider=aws

Policy and Registry in ExternalDNS

Policy Modes

Policies in ExternalDNS define how it interacts with DNS providers. The available policies include: - Sync: Supports create, update, and delete operations. - Upsert-only: Allows only create and update, preventing accidental deletions. - Create-only: Restricts operations to only creating new records.

Using the upsert-only policy ensures that DNS records are created or updated as needed without accidental deletions:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --policy=upsert-only
Registry Options

To maintain ownership and control over specific records, ExternalDNS maintains a registry that records its ownership. The TXT registry is a commonly used option, which adds a TXT record alongside DNS records managed by ExternalDNS. This TXT record identifies ownership, helping differentiate records created manually or by other tools like Terraform.

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --registry=txt

Control Loops in ExternalDNS

ExternalDNS periodically reconciles DNS records to match the desired state specified by source objects. This reconciliation follows a control loop that can be set to run at defined intervals or respond to specific events: - Interval: Runs periodically across all sources, updating DNS records to the current state of Kubernetes objects. - Events: Triggers updates in response to specific changes in source objects, allowing for faster response times.

The following configuration sets a reconciliation interval of 10 minutes, with event-based updates:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --interval=10m
    - --events

Conclusion

ExternalDNS offers a powerful way to automate DNS record management in Kubernetes environments. By integrating with multiple DNS providers and offering flexible policies and registry options, it reduces the manual burden of DNS management and ensures records are always synchronized with service endpoints. ExternalDNS is a valuable tool in cloud-native setups, automating the exposure of essential services and APIs and maintaining operational efficiency across environments.

自動化 Kubernetes 中的 DNS 管理:使用 ExternalDNS

ExternalDNS 是一個第三方的開源工具,專為 Kubernetes 集群的 DNS 記錄管理自動化而設計。它與 Kubernetes 無縫集成,能根據集群的變更動態更新 DNS 記錄,從而實現服務、API 和應用的自動化公開。最初,ExternalDNS 是為支持 AWS Route53 和 Google CloudDNS 開發的,現已擴展支持眾多 DNS 提供商,使其成為雲原生環境中多功能的選擇。

ExternalDNS 的關鍵概念

ExternalDNS 通過監控 Kubernetes 資源(如 Service、Ingress 和 Istio Gateway)作為“來源”,這些資源代表網絡端點。它使用 Kubernetes 的控制器模式將這些來源與 DNS 記錄進行匹配,確保記錄與基礎設施變更保持同步。

資源類型

ExternalDNS 的主要資源類型包括: - Service (LoadBalancer 類型):常用於高可用性應用。 - Ingress:根據路由規則管理對服務的訪問。 - 自定義資源 (CRD):擴展 ExternalDNS 與其他 Kubernetes 配置的兼容性。

每種資源都與一個 ExternalDNS 實例相關聯,該實例會根據配置在 DNS 提供商處對這些資源進行同步。

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --source=ingress
    - --source=service
主機名註解

ExternalDNS 探測到資源後,需透過主機名(hostname)來識別指向該資源的 DNS 記錄。主機名註解通過指定記錄名稱來實現此功能。

metadata:
  annotations:
    external-dns.alpha.kubernetes.io/hostname: api.example.io

此註解指示 ExternalDNS 創建或更新 api.example.io 為主機名的 DNS 記錄。

DNS 提供商與整合

ExternalDNS 支援多種 DNS 提供商,這使其成為多雲設置中的靈活選擇。DNS 提供商或“整合”允許它在平台(如 AWS Route53、Google CloudDNS 和 Azure DNS)上更新記錄。提供商配置作為 ExternalDNS 容器的參數進行指定:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --provider=aws

ExternalDNS 的策略與註冊表

策略模式

ExternalDNS 的策略定義了它如何與 DNS 提供商交互。可用的策略包括: - 同步 (Sync):支持創建、更新和刪除操作。 - 僅新增或更新 (Upsert-only):僅允許創建和更新,防止意外刪除。 - 僅創建 (Create-only):限制操作僅限於創建新記錄。

使用 upsert-only 策略可確保根據需要創建或更新 DNS 記錄,而不會發生意外刪除:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --policy=upsert-only
註冊表選項

為了維持特定記錄的所有權與控制,ExternalDNS 使用註冊表記錄其所有權。TXT 註冊表 是一個常用選項,會在 ExternalDNS 管理的 DNS 記錄旁邊添加一條 TXT 記錄。該 TXT 記錄可識別所有權,幫助區分手動創建或由其他工具(如 Terraform)創建的記錄。

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --registry=txt

ExternalDNS 的控制迴路

ExternalDNS 定期調整 DNS 記錄以匹配資源所定義的目標狀態。此調整通過控制迴路進行,可設置為定期執行或響應特定事件: - 間隔 (Interval):按設定的週期執行,將 DNS 記錄更新為 Kubernetes 物件的當前狀態。 - 事件 (Events):響應特定來源變更觸發更新,提供更快的響應速度。

以下配置設置了 10 分鐘的調整間隔,並啟用了基於事件的更新:

- name: external-dns
  image: //third_party/docker:external_dns
  args:
    - --interval=10m
    - --events

結論

ExternalDNS 是一種強大的工具,可在 Kubernetes 環境中實現 DNS 記錄管理自動化。透過與多個 DNS 提供商的集成以及靈活的策略和註冊表選項,它減少了 DNS 管理的手動負擔,確保記錄與服務端點同步。ExternalDNS 在雲原生設置中是一個寶貴的工具,能自動公開核心服務和 API,並維持運營效率。

Overcoming Fear - My Journey Through Storytelling and Building Confidence

Yes, I was extremely nervous. My heart raced, my stomach churned with anxiety, and the emergency exit door beside me seemed like a beacon of escape. "It’s not too late to leave now," I thought. Although I had accumulated public speaking experiences over the years, standing before two hundred people who had been drinking and expected to be entertained with stories was different. My mind raced with thoughts of failure—blank stares, silent rejection, boos, and even the possibility of having drinks thrown at me. The pressure was immense.

It was my mentor who first inspired me to sign up for a storytelling course. He took the plunge in his seventies and found it exhilarating, claiming it could also benefit my career. At the time, I was working in sales, and he wisely said, "Everyone likes a good storyteller. The more people connect with your stories, the more you can sell!" I didn’t plan on switching careers to storytelling, but I felt stuck in the comfort zone of my life and wanted to challenge myself. I believed that pushing these boundaries would improve my emotional resilience. So, I debated between taking a storytelling course and skydiving. Now, I wished I had chosen skydiving.

The moment arrived. The host's voice boomed through the room: "Please welcome our next storyteller, Victor Leung!" I stepped out, grabbed the microphone, and launched into my six-minute story. Most of my material was about my family. I opened with, "My cooking skills are so bad that last week I made egg fried rice, and even the eggs complained about their fate. They said, 'We thought we were going to be omelets, not hostages in this disaster.'" It was a silly, light-hearted joke, but some people chuckled. Those few chuckles gave me enough confidence to keep going, delivering more engaging stories and eliciting more reactions. In the end, the performance was a success. None of the nightmarish scenarios I imagined came true. It was actually fun and thrilling, an experience that left me brimming with adrenaline and newfound confidence.

From that night on, I continued storytelling, gradually gaining confidence, even though not every performance was a hit. There were moments when I bombed, telling the same story in the same way to different audiences with mixed reactions. Sometimes, I encountered hecklers. Once, I was even yanked off stage during an open mic for running over my time. But these worst-case scenarios weren’t as catastrophic as I’d feared. Over time, I learned to observe audience reactions, improve my timing, and interact more naturally. I even discovered how to measure success with "LPM" (laughs per minute), a metric I'd never known existed. I found that tougher crowds honed my skills more than easy audiences, and those so-called "bad" nights paved the way for the "good" ones. All of this expanded my comfort zone, and the confidence I built carried over into all areas of my life.

To take control of our lives, we first need to take control of ourselves, and confidence is key to achieving this. True, sincere confidence—not arrogance—is the fuel that propels us through challenges. It empowers us to interact healthily with others, take risks, and seize opportunities. Confidence is one of the most important pillars for a fulfilling life, whereas the opposite—living in fear, doubt, insecurity, and worry—can be destructive.

How do we build confidence and bridge the gap between who we are and who we want to be? Two factors play crucial roles: self-efficacy and self-worth.

Self-efficacy is the belief that we can accomplish a task, directly influencing our ability to meet our goals. People with high self-efficacy view challenges as opportunities rather than threats because they trust in their abilities and resilience. Even if they fall short, they know the journey will help them grow and improve.

For me, stepping on that stage for the first time was about building self-efficacy. It was a testament to embracing discomfort, facing fears head-on, and learning from both victories and failures. The journey to confidence isn't linear or easy, but it's one worth taking—for your career, your relationships, and your overall well-being.

If you’re interested in hearing my storytelling and public speaking, check out this YouTube video:

Trial and Error | Love and Loss

克服恐懼 —— 我在說故事與建立自信中的旅程

是的,我非常緊張。我的心跳加速,胃部因焦慮而翻滾,旁邊的緊急出口像是一盞指引逃生的明燈。「現在離開還不算晚吧?」我心想。儘管這些年來累積了一些公開演講的經驗,但站在兩百名喝著酒、期待被故事娛樂的人面前,感覺完全不同。我的腦海中充斥著失敗的念頭——呆滯的目光、無聲的拒絕、噓聲,甚至可能有人向我扔飲料。壓力大得無以復加。

是我的導師首次啟發我報名參加一個說故事的課程。他在七十多歲時毅然參加,並表示這讓他感到振奮,還認為這對我的職業生涯也有幫助。當時,我從事銷售工作,他明智地說:「每個人都喜歡聽好故事。你的故事越能讓人產生共鳴,你就越能賣出產品!」我並沒有打算轉行成為說故事的人,但我覺得自己生活在舒適圈裡停滯不前,渴望挑戰自我。我相信突破這些界限能提升我的情緒韌性。於是,我在參加說故事課程和跳傘之間猶豫不決。現在,我希望自己當時選擇了跳傘。

那一刻到來了。主持人的聲音在房間裡迴盪:「讓我們歡迎下一位說故事者,Victor Leung!」我走上前,拿起麥克風,開始了我的六分鐘故事。大部分內容是關於我的家人。我開場說:「我的廚藝差到上週我做了蛋炒飯,連雞蛋都在抱怨自己的命運。他們說,‘我們本以為會變成煎蛋,而不是成為這場災難的人質。’」這是一個愚蠢的輕鬆笑話,但有些人笑了。這些零星的笑聲給了我足夠的信心繼續下去,講出更有吸引力的故事並引起更多的反應。最終,這場表演很成功。我想像中的那些可怕場景都沒有發生。這實際上既有趣又刺激,讓我充滿了腎上腺素和全新的自信。

從那天晚上開始,我繼續講故事,逐漸建立起自信,儘管並不是每次表演都很成功。有時我失敗了,對不同的觀眾以相同的方式講同一個故事,但反應卻參差不齊。有時我遇到了擾亂者。有一次,甚至在一場開放麥克風的活動中,因為超時而被拉下了舞台。但這些最糟糕的情況並不像我擔心的那麼災難性。隨著時間的推移,我學會了觀察觀眾的反應,改善自己的節奏,更自然地互動。我甚至發現了一個名為「每分鐘笑聲」(LPM)的成功指標,是我以前從未聽說過的。我發現,困難的觀眾比容易的觀眾更能磨練我的技巧,而那些所謂的「糟糕」夜晚為「美好」夜晚鋪平了道路。所有這一切都拓展了我的舒適區,而我建立起來的自信延伸到了生活的各個方面。

要掌控我們的生活,首先需要掌控自己,而自信是實現這一目標的關鍵。真正、真誠的自信——而非自大——是推動我們克服挑戰的燃料。它使我們能夠健康地與他人互動,敢於冒險並抓住機會。自信是充實人生的最重要支柱之一,而反之——生活在恐懼、懷疑、不安全感和擔憂中——可能是破壞性的。

我們如何建立自信,並在我們現在的自己與理想中的自己之間架起橋樑?有兩個因素至關重要:自我效能感和自我價值感。

自我效能感是我們能完成任務的信念,直接影響我們實現目標的能力。具有高自我效能感的人將挑戰視為機會,而非威脅,因為他們信任自己的能力和韌性。即使他們未能達成目標,他們也知道這段旅程會幫助他們成長和進步。

對我而言,第一次站上舞台就是為了建立自我效能感。這是一種擁抱不適、直面恐懼、並從成功與失敗中學習的見證。自信的旅程並不是線性或容易的,但這是一趟值得的旅程——對你的職業、你的關係和你的整體幸福來說。

如果你有興趣觀看我的故事和公開演講,請查看這段 YouTube 視頻:

試與錯|愛與失

A Guide to Mindful Acceptance

Dealing with anxiety and cravings has been a struggle for as long as I can remember. I tried every tip out there—distracting myself, challenging my thoughts, even trying to ignore them altogether. But none of that really worked. I’d end up even more stressed, wondering why I couldn’t just “get over it.”

Recently, though, I came across a different approach, and it’s honestly changed how I handle tough emotions. Instead of pushing away the anxiety or cravings, I began to just accept them. It might sound strange, but stay with me, because this simple shift has made a big difference for me.

The classic way people tell you to handle anxiety is to question and challenge negative thoughts. For example, if I thought, “Everyone thinks I’m weird,” I’d try to replace it with, “No, people probably don’t notice.” But when you’re really anxious about social situations, it’s hard to believe those new, positive thoughts. It feels like you’re just lying to yourself. And honestly, just trying not to think about it at all feels impossible! It’s like trying not to think about a pink elephant—suddenly, that’s all you can think about. So this approach never felt right for me.

Then I learned about a different approach that’s more about observing and accepting what you feel, instead of fighting it. Rather than trying to shut down my anxious thoughts before a social gathering or while talking to someone new, I’d just notice them. If I felt nervous, I’d acknowledge it, feel where that nervousness showed up in my body, and focus on my breathing. It’s not about getting rid of the anxiety but about realizing, “Okay, I’m anxious in this situation, but that’s okay. I can handle this feeling.” And here’s the surprising part: when I stopped resisting my anxiety, it started feeling less intense.

One example that really sticks with me is from my visits to my grandfather in the hospital. Every time I left, I felt a mix of guilt and sadness. Before, I’d try to shake off those feelings, which only made them worse. But I started a new practice where, after each visit, I’d sit on a bench outside, close my eyes, and let myself feel those emotions fully. I imagined my feelings like dark clouds and my breath like a gentle breeze blowing them away. The guilt and sadness would eventually fade. Sometimes, a lingering heaviness would stick around, but I learned to sit with it. I didn’t need to push it away; it was okay to feel sad. This small change helped me feel more at peace, even during tough times.

Another place this approach helped was with cravings, especially around things like binge-watching TikTok. I used to feel guilty about spending hours scrolling through videos, telling myself, “I won’t do it tonight.” But shifting from “I won’t” to “I want to” changed everything. I started focusing on wanting to do things that felt better for me in the long run, like reading a book, spending time with friends, or getting a good night’s sleep. I’d remind myself of how much better I felt when I chose these things. This way, I wasn’t fighting the craving to scroll through TikTok; I was just choosing something that felt better. Surprisingly, this made it much easier to stick to my goals.

This same approach worked for other cravings, like the urge to scroll through TikTok. Instead of trying to make the urge disappear, I started observing it. When I felt the pull to open the app, I’d pause and check in with how my body felt. Maybe there was some restlessness or a bit of boredom. Rather than giving in immediately, I’d imagine the urge like a wave building up. Waves rise and fall, but they always fade. I reminded myself that even if I didn’t open TikTok right away, the urge would eventually disappear on its own. This helped me break the habit of mindless scrolling and enjoy more intentional moments of downtime.

Both anxiety and cravings can feel like waves crashing over us. But by simply observing them, without fighting or judging, I’ve learned to let these feelings come and go. This shift has been a game-changer for me. Now, instead of getting frustrated with myself, I feel calmer and more in control.

So if you’re struggling with anxiety, cravings, or just tough emotions in general, maybe give this approach a try. Don’t fight it. Just observe, breathe, and let it be. You might find, like I did, that sometimes the easiest way to overcome something is by not fighting it at all.

正念接受的指南

處理焦慮和渴望一直以來都是我面臨的一大挑戰。我試過所有的方法——分散注意力、挑戰自己的想法,甚至試圖完全忽視它們。然而,這些方法都沒有效果。我最終變得更加壓力重重,不禁懷疑自己為什麼無法「克服它」。

最近,我接觸到了一種不同的方法,這種方法真的改變了我應對困難情緒的方式。不再是試圖驅趕焦慮或渴望,而是開始接納它們。這可能聽起來有點奇怪,但請聽我說,這種簡單的轉變對我來說有著巨大的影響。

傳統的方法是通過質疑和挑戰負面想法來處理焦慮。例如,如果我想著「每個人都覺得我很奇怪」,我會試著用「不,人們可能根本沒注意到」來取代這種想法。但是,當你對社交場合真的感到焦慮時,很難相信這些新的、積極的想法。這感覺像是在對自己撒謊。說真的,試圖不去想它根本就是不可能的!這就像試著不去想一隻粉紅色的大象——突然間,這就是你腦中唯一的畫面。所以,這種方法對我來說從來沒有奏效。

後來,我學到了一種更關於觀察和接受自己感受的方法,而不是與之抗爭。在社交聚會前或與新認識的人聊天時,我不再試圖壓制我的焦慮想法,而是注意到它們。如果我感到緊張,我會承認這種感覺,感受這種緊張感在身體中的具體位置,並專注於我的呼吸。這並不是要消除焦慮,而是意識到「好吧,我在這種情況下感到焦慮,但這沒關係。我可以應對這種感覺。」驚喜的是,當我停止抵抗焦慮時,它的強度開始減弱。

讓我印象最深刻的一個例子是我去醫院探望祖父的經歷。每次探望結束後,我都感到內疚和悲傷。以前,我會試圖擺脫這些情緒,結果反而讓情況更糟。但後來,我開始在每次探望後嘗試一種新的做法:我會坐在外面的長椅上,閉上眼睛,讓自己完全感受這些情緒。我想像自己的情感像是烏雲,而呼吸像是溫柔的微風,將它們慢慢吹散。內疚和悲傷最終會消失。有時,心中的沉重感會依然存在,但我學會了與之共處。我不需要將它推開;感到悲傷是可以的。這個小小的改變讓我即使在艱難的時刻也能感到更平靜。

這種方法在應對渴望時也幫助了我,特別是在像刷 TikTok 這樣的行為上。我以前對自己花幾個小時刷短視頻感到內疚,對自己說「今晚我絕對不會再刷了」。但將「我不會」轉變成「我想要」徹底改變了一切。我開始專注於那些從長遠來看讓我感覺更好的事情,比如讀一本書、和朋友共度時光或睡個好覺。我會提醒自己,選擇這些事情後的感覺會好得多。這樣,我並不是在與刷 TikTok 的渴望作鬥爭,而是選擇了一些讓我感覺更好的事情。令人驚訝的是,這讓我更容易堅持自己的目標。

同樣的策略也適用於其他渴望,比如衝動地刷 TikTok。與其試圖讓這種衝動消失,我開始觀察它。當我感到想打開應用的衝動時,我會停下來感受身體的狀態。可能有些不安或一點無聊。與其立刻屈服,我會把這種衝動想像成一個漸漸升起的浪潮。浪潮有高有低,但它們總會退去。我提醒自己,即使我不立即打開 TikTok,這種衝動最終也會自行消失。這幫助我打破了無意識刷視頻的習慣,並更加享受那些有意識的閒暇時刻。

焦慮和渴望都像是拍打我們的浪潮。但通過簡單地觀察它們,而不是與之抗爭或評判,我學會了讓這些感覺來來去去。這種轉變對我來說意義重大。現在,我不再因自己感到挫敗,而是感到更加平靜和掌控自如。

所以,如果你正在努力應對焦慮、渴望或其他困難的情緒,不妨試試這種方法。不要抗爭。只需觀察、呼吸,讓它自然流動。你可能會發現,有時最簡單的克服方式就是不去抗爭。