# marimo: notebook gửi khách không còn hỏng vì thứ tự cell

> Mỗi notebook là một file Python thuần, tự chạy lại theo quan hệ phụ thuộc giữa các cell và đóng gói được thành web app chỉ hiện kết quả cho người không đọc code.

Bản gốc: https://fdetimes.net/vi/cong-cu/marimo-notebook-python-tai-lap-duoc-gui-phan-tich-cho-khach/

Notebook Jupyter gửi cho khách thường hỏng ở một chỗ không ai nhìn thấy: thứ tự bạn đã chạy các cell. marimo, notebook mã nguồn mở của công ty Marimo (thành lập năm 2022), làm khác hẳn. Mỗi notebook là một file Python thuần, và khi bạn chạy một cell, các cell phụ thuộc vào nó sẽ tự chạy lại.

Với FDE, khác biệt này quyết định chất lượng của thứ bạn bàn giao. Bản phân tích bạn giao phải chạy lại được khi dữ liệu tháng sau về, khi người khác trong team tiếp quản, và khi khách hỏi một con số được tính từ đâu.

Trang chính thức mô tả marimo là notebook muốn giữ cảm giác làm việc của notebook nhưng có tính chất của một chương trình Python. Chạy lại được, người khác tiếp quản được, truy được nguồn gốc từng con số: đó là những thứ ta vẫn đòi hỏi ở một chương trình, chứ không phải ở một bản nháp.

## Lỗi thật của Jupyter nằm ở trạng thái ẩn

Hướng dẫn chuyển từ Jupyter của marimo nói thẳng rằng notebook Jupyter dễ tích tụ "trạng thái ẩn", kéo theo cả lỗi ẩn. Hướng dẫn đó cũng chỉ ra rủi ro cell bị chạy lệch thứ tự. Khi chuyện ấy xảy ra, kết quả trên màn hình rất dễ không còn khớp với code bạn đang nhìn.

Thử hình dung bạn phân tích tỷ lệ khách rời bỏ cho một công ty giao hàng. Cell 3 lọc theo vùng, cell 5 vẽ biểu đồ. Bạn sửa ngưỡng lọc ở cell 3 nhưng quên chạy lại cell 5, rồi xuất file gửi đi. Biểu đồ trong file đó lại được vẽ từ ngưỡng cũ.

marimo chặn tình huống này ngay từ cơ chế chạy. Khi một cell chạy, marimo tự chạy lại mọi cell tham chiếu tới biến của cell đó. README của dự án nói rõ ba cam kết: không có trạng thái ẩn, thực thi tất định, và có sẵn quản lý package.

**Điểm mấu chốt:** Phân tích giao cho khách phải chạy lại được, chứ không chỉ chạy đúng một lần trên máy bạn.

## Một vòng tối thiểu: từ notebook đến app cho khách

Vẫn với ví dụ công ty giao hàng, bạn mở notebook trong môi trường cô lập bằng `uvx marimo edit --sandbox churn.py`. uv là backend mặc định của sandbox và cài package từ PyPI. Phiên bản Python cùng danh sách package được ghi vào một khối comment ở đầu file theo chuẩn PEP 723, nên notebook mang theo môi trường của chính nó.

Bạn viết ba cell: đọc dữ liệu, lọc theo ngưỡng, vẽ biểu đồ. Khi đổi ngưỡng, biểu đồ tự cập nhật mà bạn không phải nhớ cell nào cần chạy lại. Vì file là Python thuần chứ không phải JSON, commit vào Git sẽ cho ra một diff đọc được như code bình thường, và người review sẽ thấy đúng dòng ngưỡng đã đổi.

Đến lúc giao cho khách, bạn chạy `marimo run churn.py`. Lệnh này trình bày notebook dưới dạng một app và khởi động web server để phục vụ app đó. Mặc định app chỉ ghép các output lại và giấu code, nên người quản lý vận hành phía khách chỉ thấy biểu đồ và bảng số.

Nếu báo cáo cần chạy hằng tháng, README cho biết notebook marimo cũng chạy được như script, nhận tham số từ dòng lệnh. Như vậy cùng một file vừa là bản nháp khám phá, vừa là job định kỳ, vừa là app trình bày.

## Giới hạn nào cần nói với khách trước?

Giới hạn đầu tiên là phiên bản package. Tài liệu sandbox ghi rằng khối PEP 723 lưu yêu cầu package, nhưng muốn có đúng từng phiên bản thì phải dùng lockfile. Nếu khách chạy lại sau sáu tháng và cần ra đúng con số cũ, bạn nên tạo lockfile ngay từ đầu.

Giới hạn thứ hai là hạ tầng. `marimo run` khởi động web server, nhưng chạy server đó ở đâu, ai được truy cập và dữ liệu khách nằm trên máy nào là phần việc deployment của bạn. Hãy thống nhất những điểm này với đội IT phía khách trước khi hứa "gửi link là xem được".

Giới hạn thứ ba là rủi ro nhà cung cấp, thứ khách doanh nghiệp hay hỏi. CoreWeave công bố mua lại Marimo ngày 30/10/2025 và cam kết notebook marimo vẫn miễn phí, vẫn mở mã nguồn với giấy phép thông thoáng. Dự án dùng giấy phép Apache-2.0, đủ để bạn trả lời câu hỏi của bộ phận pháp chế.

Cuối cùng, marimo có công cụ dòng lệnh để chuyển notebook .ipynb sang định dạng của nó. Tuy vậy, một notebook cũ từng chạy đúng nhờ trạng thái ẩn có thể lộ lỗi sau khi chuyển. Đó là điều tốt, nhưng bạn nên dành thời gian rà lại trước khi gửi bản mới cho khách.

## Nên học gì trước, và thể hiện ra sao trong CV?

Thứ cần học trước là cách nghĩ theo quan hệ phụ thuộc: mỗi cell định nghĩa biến gì và dùng biến nào. Khi đã quen, sandbox và `marimo run` chỉ còn là hai lệnh. Học uv song song cũng đáng, vì đó là backend mặc định của sandbox.

Về hồ sơ, một repo công khai có notebook .py, khối dependency ở đầu file và lịch sử commit có diff rõ ràng là bằng chứng cụ thể hơn câu "thành thạo Python" trong CV.

Dòng mô tả trong CV nên kể thứ bạn bàn giao chứ không chỉ kể công cụ. Một mẫu bạn có thể phỏng theo: "Bàn giao phân tích tỷ lệ khách rời bỏ dưới dạng notebook marimo lưu trên Git, kèm môi trường ghi trong file và lockfile; khách xem kết quả qua app ẩn code và chạy lại hằng tháng bằng script nhận tham số."

Khi phỏng vấn, hãy chuẩn bị kể lại đúng một lần bạn biến một bản phân tích thành thứ khách tự chạy lại được, kể cả lỗi trạng thái ẩn bạn tìm ra trên đường đi. Câu chuyện đó cho người phỏng vấn thấy bạn nghĩ đến người nhận chứ không chỉ đến cái máy của mình.

Khách ít khi nhớ bạn dùng notebook gì. Điều họ nhớ là con số tháng trước có khớp với tháng này hay không.

**Thử ngay tuần này:**

- Lấy một notebook Jupyter bạn từng gửi khách, chuyển nó sang marimo bằng công cụ dòng lệnh, rồi mở bằng `uvx marimo edit --sandbox` để xem cell nào từng phụ thuộc vào trạng thái ẩn.
- Chạy `marimo run` trên notebook đó và đưa một đồng nghiệp không đọc code xem thử, để kiểm tra phần kết quả có tự giải thích được không khi code bị giấu.
- Commit notebook vào Git, sửa một tham số rồi đọc diff để xem người review sẽ thấy gì.

## Nguồn

- [marimo | a next-generation Python notebook](https://marimo.io)

- [marimo: The Reactive Python Notebook](https://docs.marimo.io/)

- [GitHub - marimo-team/marimo: A reactive notebook for Python](https://github.com/marimo-team/marimo)

- [Coming from Jupyter](https://docs.marimo.io/guides/coming_from/jupyter/)

- [Run as an app](https://docs.marimo.io/guides/apps/)

- [Working in sandboxes](https://docs.marimo.io/guides/package_management/sandboxes/)

- [CoreWeave Acquires Marimo to Unify the Generative AI Developer Workflow](https://coreweave.com/news/coreweave-acquires-marimo-to-unify-the-generative-ai-developer-workflow)
