# Nghệ thuật tối giản: hoặc mình điên, hoặc app này điên

AI lẽ ra phải làm phần mềm đơn giản đi. Vậy mà ngày nào mình cũng phải học thêm một khái niệm mới. Về nỗi ám ảnh đằng sau ClarkCant, những thứ mình cố tình bỏ ra ngoài, và vì sao có thể mình sai.

Duy Nguyen /zuey/ · 2026-10-05T10:09:06.280Z

Source: https://clarkcant.cc/vi/blog/the-art-of-minimalism

Mình có một nỗi ám ảnh, và mình nói trước để bạn tự cân nhắc mọi thứ phía sau: mình tin AI phải làm phần mềm đơn giản hơn. Không phải trông xịn hơn, không phải nhiều tính năng hơn. Đơn giản hơn.

Với ClarkCant, mình đẩy ý tưởng đó đi xa hơn mức hợp lý. Tối giản tới mức điên rồ. Có hôm đang dùng, mình tự nghĩ: hoặc là mình điên, hoặc là cái app này điên. Theo nghĩa tốt, mình hy vọng vậy.

Đây là một thử nghiệm. Những gì bên dưới là triết lý một chiều trong đầu mình, mình biết vậy. Chỉ có cộng đồng mới trả lời được nó đúng hay sai. Nhưng nói thật, mình hy vọng nhiều lắm.

## Nỗi ám ảnh này từ đâu ra

Hồi trước mình mê chủ nghĩa tối giản của người Nhật lắm. Mình từng sang Nhật, từng làm việc với khách hàng Nhật, có bạn bè người Nhật. Cái đọng lại trong mình không phải là mấy căn phòng trống trơn. Mà là chính sự ám ảnh của họ với tối giản. Nói là yêu thì chưa đúng lắm, đúng hơn là ngưỡng mộ.

Mình không dám nói là hiểu văn hoá đó từ bên trong. Mình chỉ biết một khi đã thấy tận mắt kiểu kỷ luật ấy, nhìn lại phần lớn phần mềm bây giờ thấy ồn ào kinh khủng. Mỗi cái tab, cái toggle, cái badge trên màn hình là một quyết định của ai đó, và giờ người dùng phải gánh nó.

## OpenAI thật ra đã làm đúng điều gì

Đây là cách mình nhìn, và chỉ là của riêng mình thôi. Thành tựu thật sự của OpenAI không phải là phát minh ra AI. AI có từ lâu trước họ rồi. Thậm chí cũng không hẳn là ChatGPT xét về mặt công nghệ. Mà là họ mang trải nghiệm trò chuyện tới cả thế giới. Gõ vào, nó trả lời. Hết. Đơn giản tới mức phát bực.

Vậy mà giờ, theo mình thấy, chính họ lại sa vào cái bẫy phức tạp. Phức tạp, hay mình hay gọi vui là “fuck tạp”. ChatGPT nuốt luôn Codex, rồi thêm mấy bề mặt mới mà mình tạm gọi là Dots với Space, càng ngày càng giống một nồi lẩu, cái gì cũng thả vào chung một nồi. Đó là quan sát của một người dùng, không phải phân tích của người trong cuộc.

Mình nghĩ họ sống hơi xa trong tương lai. Họ mặc định ai cũng hiểu những gì họ hiểu. Người dùng thật không nghĩ như vậy. Người dùng thật chỉ muốn làm xong một việc rồi quay về với cuộc sống của họ.

## Chỉ cách một prompt, họ bảo thế

Lời hứa của AI là mọi thứ chỉ cách mình một prompt. Thực tế thì NGÀY NÀO cũng phải học cái mới. Agent. Context engineering. Prompt engineering. Loop. Graph engineering. Skill. Hook. Memory. Một đống kỹ thuật với thuật ngữ kỳ quặc mà hình như phải thuộc hết thì phép màu mới chạy.

Mình làm nghề này mà còn thấy mệt. Có gì đó sai sai ở đây, đúng không? Nếu thứ công cụ sinh ra để xoá bỏ đường cong học tập mà tuần nào cũng đẻ thêm một đường cong mới, thì mình đã lạc đường ở đâu đó rồi.

## Vậy ClarkCant đặt cược vào điều gì?

ClarkCant được xây trên chính nỗi ám ảnh đó. Kim chỉ nam trong DESIGN.md ghi rằng sản phẩm phải cảm giác đơn giản hơn cái hệ thống đang chạy bên dưới nó, và người dùng chỉ cần học hai thứ: một cuộc hội thoại, và một voice agent, cũng chính là Clark. Mọi thứ khác (Pi session, routing của Jev, memory, node, tool registry, worker, package generation, policy engine) đều là hạ tầng. Không được biến thành một kiểu điều hướng mà người dùng phải học.

Câu mình hay quay lại nhất được in đậm ngay trong file đó: don't make me think. Đừng bắt người dùng phải hiểu kiến trúc thì mới làm được việc.

Nhưng tối giản không có nghĩa là bỏ đói người dùng. Tài liệu scope của tụi mình nói khá rõ: tối giản là giảm công sức ra quyết định, chứ không phải ép mọi thao tác thành chữ. Nút play, form đăng nhập an toàn, date picker, nút stop đều ổn. Sidebar session, cây thư mục bắt buộc, dashboard admin thường trực thì không.

Sơ đồ: bạn gõ chữ, nói, hoặc dùng lệnh slash, cả ba đi vào một cuộc hội thoại và thành cùng một hành động có kiểu tới Clark. Phía sau Clark là nhóm hạ tầng gồm Pi session, routing của Jev, memory, node, tool registry, worker, package generation và policy engine, những thứ người dùng không cần học. Theo phần North Star trong DESIGN.md.



Nguồn: DESIGN.md, mục 0 (North Star) và 1.1.

Bảng hai cột đối chiếu thứ người dùng tưởng phải học với nơi nó nằm trong ClarkCant. Session cũ và chạy nền: gọi ra bằng cách hỏi, bằng giọng nói hoặc /sessions, tới dưới dạng tin nhắn có danh sách. Đăng nhập provider: /login và /logout mở thẻ trong hội thoại, nội dung gõ vào không lưu trong chat. Model và mức thinking: /thinking, pill model, hoặc một câu như đổi sang Gemini. Phê duyệt: thẻ trong hội thoại, có cả trong inbox, quyết ở đâu cũng là một quyết định. Chart, bảng, trình phát: nằm trong câu trả lời, pin thì giữ trong hội thoại chứ không thành dashboard. Settings: mở đè lên hội thoại và đóng về chỗ cũ. Session, routing, node, package generation: hạ tầng, không lên màn hình chính trừ khi được hỏi, cần thiết, hoặc mở phần Advanced.

```json
[
  {
    "id": "sessions",
    "thing": "Ô chọn session cho việc cũ và việc chạy nền",
    "clark": "Hỏi, nói, hoặc gõ /sessions. Nó tới dưới dạng một tin nhắn có danh sách."
  },
  {
    "id": "providers",
    "thing": "Trang cài đặt provider và API key",
    "clark": "/login và /logout mở một thẻ ngay trong hội thoại. Những gì bạn gõ ở đó đi thẳng tới engine, không lưu vào chat."
  },
  {
    "id": "model",
    "thing": "Menu chọn model và mức thinking",
    "clark": "/thinking, cái pill model nhỏ, hoặc chỉ cần nói đổi sang Gemini."
  },
  {
    "id": "approvals",
    "thing": "Một hàng đợi phê duyệt riêng",
    "clark": "Một thẻ trong hội thoại, đồng thời có trong inbox. Quyết ở đâu cũng là cùng một quyết định."
  },
  {
    "id": "widgets",
    "thing": "Dashboard cho chart, bảng, trình phát",
    "clark": "Nằm ngay trong câu trả lời. Pin thì giữ nó trong hội thoại, không mở ra màn hình chính thứ hai."
  },
  {
    "id": "settings",
    "thing": "Một trang admin",
    "clark": "Settings mở đè lên hội thoại và đóng lại đúng chỗ cũ."
  },
  {
    "id": "internals",
    "thing": "Session, routing, node, package generation",
    "clark": "Hạ tầng. Không lên màn hình chính trừ khi bạn hỏi, có việc cần bạn, hoặc bạn mở phần Advanced."
  }
]
```

Nguồn: DESIGN.md mục 1.1, 6.7 và 11, AGENTS.md, và các thẻ lệnh slash thêm vào ngày 5/10/2026.

Mẹo nằm ở một dòng trong tài liệu thiết kế: mục tiêu không phải là giấu đi, mà là gọi ra được. Không có gì bị lấy mất cả. Bạn vẫn đăng nhập provider được, vẫn đổi model được, vẫn mở lại session cũ được. Chỉ là bạn làm bằng cách hỏi, bằng giọng nói, hoặc bằng lệnh slash, và câu trả lời quay về thành một tin nhắn trong hội thoại có giao diện nhỏ bên trong. Gõ lệnh hay nói một câu thì cuối cùng cũng là cùng một hành động.

Một ví dụ nhỏ mình thích. Orb, cái quả cầu phát sáng là chữ ký của Clark, có vài kiểu dáng. Bạn có thể bấm vào ô Plasma trong Settings, hoặc chỉ cần nói đổi Orb sang Plasma. Hai cách là cùng một lần ghi preference, không phải hai bản cài đặt khác nhau. Và Clark chỉ báo xong khi Orb trên màn hình đã thật sự đọc lại lựa chọn và hiện ra đúng. Nếu đọc lại thất bại, Clark sẽ nói lựa chọn đã lưu nhưng chưa hiển thị. Cả triết lý gói trong một tính năng nhỏ: một hành động, nhiều đường để tới, và không giả vờ.

## Những thứ mình cố tình bỏ ra ngoài

Nói thật, danh sách những thứ ClarkCant không có mới là phần mình tự hào nhất. Không có sidebar cố định để điều hướng. Không có ô chọn session trên màn hình chính. Widget không được biến thành một dashboard song song. Header không hiện số lượng tool, node ID hay ruột gan của engine. Settings không được phép phình thành trang admin.

Ngay cả trong Settings, một control chỉ xuất hiện khi hành vi phía sau nó đã thật sự tồn tại. Một preference đã khai báo mà chưa có gì đọc tới thì không có công tắc, và tụi mình ghi rõ lý do ngay chỗ bạn sẽ tìm. Một công tắc bấm không ăn thua gì là một lời nói dối nhỏ.

Bảng hai cột. Hợp lệ trong ClarkCant: nút play, form đăng nhập an toàn, date picker, nút stop, pin (theo scope-lock.md). Cố tình bỏ ra ngoài: sidebar session, cây thư mục bắt buộc, dashboard admin thường trực (scope-lock.md), ô chọn session trên màn hình chính và số tool, node ID trên header (DESIGN.md mục 1.1 và 6.1).



Bạn kéo thẻ qua lại được, nhưng chỉ trên máy bạn thôi.

Checklist review thiết kế của tụi mình kết thúc bằng một câu mình rất thích: thay đổi này có tránh được việc thêm nút, tab hay thẻ chỉ vì code cho dễ, chứ không phải vì tốt hơn cho người dùng không? Nếu câu trả lời là không, thiết kế lại trước khi merge. Không phải sau.

Trích DESIGN.md dòng 1539 tới 1543: câu 14 hỏi giọng nói có điều khiển được bề mặt này qua một hành động ngữ nghĩa không; câu 15 hỏi có tránh lộ ruột gan Pi, Jev, node không cần thiết không; câu 16 hỏi có tránh thêm nút, tab, thẻ chỉ vì code dễ hơn chứ không phải vì UX tốt hơn không. Nếu câu 15 hoặc 16 là không thì thiết kế lại trước khi merge.



Nguyên văn tiếng Anh từ repo.

## Hỏi ít đi, chứ không phải bớt rào chắn

Phê duyệt cũng đi theo cùng tư duy đó. Mặc định Clark chạy ở chế độ Autonomous: bạn đã giao việc rồi thì nó không quay lại xin phép từng lần gọi tool. Muốn đổi sang Guarded hay Ask every time thì lúc nào đổi cũng được. Tài liệu thiết kế nói thẳng: không được lấy bảo mật làm cớ để thêm một bước xác nhận trùng lặp sau khi người dùng đã nói rõ họ muốn gì. Thay vào đó là hoạt động hiển thị rõ ràng, nút Stop, Undo khi làm được, và audit log.

Cũng có những thứ tụi mình nhất quyết không làm giả, vì đơn giản mà xây trên mấy lời nói dối nhỏ thì không còn là đơn giản. OAuth consent hay hộp thoại xin quyền của hệ điều hành vẫn đi qua màn hình của chính nền tảng. Không có nút trông bấm được mà không làm gì. Không gọi một con số cache là live. Không báo thành công chỉ vì một tiến trình đã dừng.

Ngay cả inbox cũng theo luật đó. Bạn mở nó từ cái chuông, hoặc chỉ cần hỏi Clark có gì đang chờ mình không. Clark đọc đúng dữ liệu mà bảng inbox hiển thị, và câu hỏi đó không thể tự đánh dấu đã đọc hay tự duyệt thứ gì sau lưng bạn.

## Có thể mình sai

Nói thẳng với bạn: chuyện này có thể không thành. Có khi người ta thật ra thích tab với dashboard, còn mình đang áp gu của mình lên mọi người. Có khi power user sẽ thấy bị bó tay. Có khi một app lấy hội thoại làm trung tâm sẽ đụng một bức tường mà giờ mình chưa thấy.

Nhưng mình cứ nghĩ mãi về cái cảm giác đơn giản của ô chat đầu tiên đó, và tụi mình đã trôi xa khỏi nó tới mức nào. Nếu AI giỏi như mọi người vẫn nói, thì phần mềm bao quanh nó phải ngày càng yên tĩnh hơn, chứ không phải ồn ào hơn. ClarkCant là cách mình thử điều đó, công khai. Câu trả lời thật nằm ở cộng đồng, và mình thật sự tò mò nó sẽ là gì.

Điều gì làm bạn mệt nhất với các công cụ AI hiện nay?

- Tuần nào cũng có khái niệm mới phải học
- Quá nhiều app, tab và bề mặt
- Cái gì cũng bắt xác nhận
- Không gì cả, mình thích nhiều nút để vặn
