Nhật ký làm Notas - Kỳ đầu

Nhật ký làm Notas - Kỳ đầu

Tin ngắn hàng ngày dành cho bạn
  • Đây là bài viết thứ 366, có nghĩa là mình đã duy trì được việc mỗi ngày một bài trong chuyên mục Threads 1 năm rồi đấy mọi người. Tuy rằng không phải ngày nào cũng viết vì nhiều hôm mình bận, quên thì hôm sau là lên bài bù, mục đích là để cam kết với độc giả, ấy vậy mà quay đi quay lại đã một năm trôi qua rồi. Nhanh thật 😃

    À mai, kia, ngày kìa nữa mình đi du lịch nên chắc không lên bài cho mọi người được. Về rồi mình lên sau nhé 😅. Cảm ơn!

    » Xem thêm
  • Hơn 1 tuần nay mình không đăng bài, không phải không có gì để viết mà đang tìm cách để phân phối nội dung có giá trị hơn trong thời đại AI đang bùng nổ mạnh mẽ như thế này.

    Như từ hồi đầu năm đã chia sẻ, số lượng người truy cập vào trang blog của mình đang dần ít đi. Khi xem thống kê, lượng người dùng trong 6 tháng đầu năm 2025 đã giảm 30% so với cùng kì năm ngoái, 15% so với 6 tháng cuối năm 2024. Như vậy một sự thật là người dùng đang rời bỏ dần đi. Nguyên nhân do đâu?

    Mình nghĩ lý do lớn nhất là thói quen của người dùng đã thay đổi. Họ tìm thấy blog chủ yếu qua các công cụ tìm kiếm, trong đó lớn nhất là Google. Gần 1/2 số lượng người dùng quay trở lại blog mà không cần thông qua bước tìm kiếm. Đó là một tín hiệu đáng mừng nhưng vẫn không đủ để tăng lượng người dùng mới. Chưa kể giờ đây, Google đã ra mắt tính năng AI Search Labs - tức là AI hiển thị luôn nội dung tổng hợp khi người dùng tìm kiếm, điều đó càng khiến cho khả năng người dùng truy cập vào trang web thấp hơn. Một điều thú vị là khi Search Labs được giới thiệu, thì các bài viết bằng tiếng Anh đã soán ngôi trong bảng xếp hạng truy cập nhiều nhất.

    Một bài viết của mình thường rất dài, có khi lên đến cả 2000 chữ. Mà để viết ra được một bài như thế tốn nhiều thời gian. Nhiều bài viết ra chẳng có ai đọc là điều bình thường. Mình biết và chấp nhận vì không phải ai cũng gặp phải vấn đề đang nói đến. Viết đối với mình như một cách để rèn luyện sự kiên nhẫn và cả tư duy. Viết ra mà giúp được cả ai đó là một điều tuyệt vời.

    Vậy nên mình đang nghĩ sẽ tập trung vào nội dung ngắn và trung bình để viết được nhiều hơn. Nội dung dài chỉ khi muốn viết chi tiết hoặc đi sâu về một chủ đề nào đó. Nên là đang tìm cách thiết kế lại trang blog. Mọi người cùng chờ nha 😄

    » Xem thêm
  • CloudFlare đã giới thiệu tính năng pay per crawl để tính phí cho mỗi lần AI "cào" dữ liệu trên trang web của bạn. Là sao ta 🤔?

    Mục đích của SEO là giúp các công cụ tìm kiếm nhìn thấy trang web. Khi người dùng tìm kiếm nội dung mà có liên quan thì nó hiển thị trang web của bạn ra kết quả tìm kiếm. Điều này gần như là đôi bên cùng có lợi khi Google giúp nhiều người biết đến trang web hơn, còn Google thì được nhiều người dùng hơn.

    Bây giờ cuộc chơi với các AI Agents thì lại khác. AI Agents phải chủ động đi tìm kiếm nguồn thông tin và tiện thể "cào" luôn dữ liệu của bạn về, rồi xào nấu hay làm gì đó mà chúng ta cũng chẳng thể biết được. Vậy đây gần như là cuộc chơi chỉ mang lại lợi ích cho 1 bên 🤔!?

    Nước đi của CloudFlare là bắt AI Agents phải trả tiền cho mỗi lần lấy dữ liệu từ trang web của bạn. Nếu không trả tiền thì tôi không cho ông đọc dữ liệu của tôi. Kiểu vậy. Hãy chờ thêm một thời gian nữa xem sao 🤓.

    » Xem thêm

Vấn đề

Cũng tròn một tuần kể từ bài viết Làm ứng dụng ghi chú - Notas mà tôi đã bật mí với bạn đọc trước đó. Trong suốt thời gian vừa rồi, tôi gần như tập trung hoàn toàn vào công việc này. Cái nhìn ban đầu của Notas đã và đang dần lộ ra rõ nét như ban ngày và tôi nghĩ quá trình xây dựng Notas khá thú vị, vì thế càng hữu ích hơn nếu ghi lại nhật ký phát triển ứng dụng tiện ích đầu tay của mình.

Nhưng trước khi bắt đầu kể, xin có một vài lời muốn nói!

Chỉ sau một hai bài viết trên Facebook (trước đây tôi rất ít đăng bài lên Facebook, từ trang cá nhân cho đến hội nhóm) thì có vẻ như nhiều người khá mất kiên nhẫn trước những bài viết "dài". Gọi là nhiều chữ nhưng những bài viết ra chỉ có độ dài biến thiên trong khoảng 1000 chữ đến dưới 2000, mà theo như tôi thấy thì điều đó cũng... đâu có dài lắm. Thầm nghĩ có lẽ mọi người đang quen dần với xu hướng thông tin "nhanh" nên đối với một bài viết có nội dung dài, hẳn là rất choáng ngợp.

Tôi nghĩ rằng một bài viết thành công là bài viết thuyết phục được người đọc, không liên quan nhiều đến dài hay ngắn, miễn sao họ cảm thấy người viết đang trình bày vấn đề một cách nghiêm túc thì đã là thành công bước đầu. Mà bài viết dài, cốt là để dẫn dắt người đọc vào ngữ cảnh, để cho họ hiểu bối cảnh, để từ đó dễ thuyết phục hơn. Nhưng nói gì thì nói, nếu đã không đọc thì có bắt ép cũng không thể. Hy vọng bạn đọc hiểu những gì tôi đang nói, để từ đó có cái nhìn khách quan cho những gì mà tôi viết ra.

Quay lại vấn đề!

Tuần vừa rồi, tôi chủ yếu là nghiên cứu tất cả các trường hợp liên quan đến logic xử lý của một ứng dụng ghi chú. Khi bắt đầu nói "Tôi sẽ làm ứng dụng ghi chú", nghe có vẻ dễ dàng (kể cả tôi lúc đó cũng nghĩ là nó dễ) nhưng vấn đề chỉ phát sinh khi bạn thực sự bắt tay vào làm một cái gì đó.

Cách làm

Thường thì trước khi làm, ai cũng dành một khoảng thời gian để suy nghĩ xem mình cần làm gì, chuẩn bị những gì và nên làm như thế nào.

Khi làm Notas cũng vậy. Như ở bài viết trước, tôi xác định các bộ khung và thư viện (framework/library) để làm ứng dụng. Nhiều cái tên rất thân thuộc như Nuxt.js, Tailwind và thư viện DaisyUI. Đây là những công cụ mà tôi đã quen sử dụng, tận dụng được lợi thế đó để đẩy nhanh quá trình phát triển Notas.

Vì có dự tính Opensource, nên việc dành thời gian suy nghĩ cho cấu trúc cũng là một vấn đề. Thực ra một cấu trúc dù tốt đến đâu cũng không thể mang ra áp dụng cho tất cả các trường hợp được. Tôi đang nghĩ đến một kiến trúc phù hợp thì hợp lý hơn, nghĩa là nó rõ ràng, đọc hiểu nhanh chóng, từ đó đẩy nhanh quá trình đóng góp mã hoặc sửa chữa nếu có. Cấu trúc thư mục của Notas được chia ra theo vị trí của nhũng thành phần trong mảnh ghép tạo nên Notas.

Cấu trúc thư mục

Về kiến trúc, được chia thành 3 lớp (layer) chính đó là GUI, Logic và Adapter. Trong khi GUI là giao diện, Logic là một tầng xử lý dữ liệu lấy từ Adapter, và Adapter là nơi để lấy dữ liệu. Adapter là thành phần có thể triển khai lại theo cách mà bạn thích, chỉ cần đảm bảo đủ các hàm lấy dữ liệu là có thể cắm vào hoạt động như một cơ sở dữ liệu cho Notas.

Adapter đơn giản nhất tôi đang xây dựng là LocalStorage của trình duyệt. Chỉ cần trữ lưu dữ liệu và lấy ra trong bộ nhớ cục bộ này là đủ để thử nghiệm xem liệu Adapter có hoạt động được như mong muốn. Cho đến bây giờ thì tôi chưa gặp vấn đề gì với Adapter cả, có lẽ mọi thứ đang đi đúng hướng.

Trình soạn thảo có lẽ trái tim của Notas, như lời gợi ý từ một người bạn làm thế nào để dễ đa dạng trình soạn thảo, thì tôi đã thiết kế để tách riêng soạn thảo thành các thành phần (components) trong Vue. Nghĩa là bạn có thể dễ dàng thêm bất kỳ trình soạn thảo nào mà bạn thích, miễn là làm sao triển khai (implements) đầy đủ các phương thức cần có của một trình soạn thảo. Hai cái tên được tích hợp ban đầu là Tiptap và SimpleMDE, ngoài ra, còn rất nhiều cái tên khác nữa như là CKEditor và TinyMCE... cũng rất tiềm năng tích hợp.

Kết quả tuần đầu tiên

Giao diện Notas

Về cơ bản, giao diện của Notas phiên bản Desktop đã được định hình. Gồm có 3 cột tương ứng danh sách thư mục, danh sách ghi chú và khung soạn thảo ghi chú. Giao diện chưa được chau chuốt cho lắm vì cốt là định hình được các nút tính năng, sau đó rất có thể cần lời khuyên của nhiều người hơn về UI/UX cho Notas.

Hiện tại tôi đang triển khai Adapter đơn giản nhất để lưu trữ dữ liệu là LocalStorage của trình duyệt. Dữ liệu được lưu dưới dạng JSON để dễ dàng xử lý. Đây cũng là một trong những Adapter mà sẽ xuất hiện trong Notas, ngoài ra bạn cũng có thể tự triển khai lại Adapter lưu trữ dữ liệu nơi mà bạn muốn. Sau đó, tôi sẽ viết thêm một vài Adapter dành cho SQLite và Turso để đồng bộ hóa ghi chú trực tuyến.

Notas đã có thể thêm/sửa/xóa thư mục, thêm/sửa/xóa ghi chú - là các tính năng cơ bản nhất của một ứng dụng ghi chú. Ngoài ra, một vài tính năng cũng hữu ích khác như là ghim/bỏ ghim ghi chú lên đầu mục, đặt/gỡ mật khẩu cho ghi chú và Thùng rác cũng đã hoạt động (với một vài lỗi - nhưng không đáng kể :D).

Khó khăn

Có khá nhiều khó khăn mà tôi đang phải đối mặt.

Đầu tiên là thời gian, một vấn đề mà không khóc không được. Mỗi buổi tối chỉ dành được một vài tiếng để tập trung vào Notas vì ban ngày là thời gian cho công việc chính. Nhưng ngoài viết mã ra, cũng có nhiều việc khác cần phải làm như nghiên cứu, phân tích tính năng, cũng như lên phương án xử lý cho các vấn đề đang nhìn ra trước mắt.

Một trong những vấn đề đang thấy đó là đặt mật khẩu cho ghi chú. Hmm... cứ cho người dùng cài đặt một mật khẩu rồi sau đó sử dụng để khóa/mở khóa chẳng phải rất dễ sao? Nhưng hãy nhớ ai cũng có thể đọc mã thì chẳng phải ai cũng sẽ biết cách xử lý mật khẩu như thế nào hay sao? Vì thế việc bẻ khóa mật khẩu ở máy khách há sẽ rất dễ dàng. Nhưng đừng lo, tôi đã nghĩ ra một giải pháp để tăng tính bảo mật cho phần này, chỉ là chưa có thời gian để kiểm chứng. Hy vọng sang tuần tôi sẽ có thời gian để thử nghiệm.

Cuối cùng là vấn đề đồng bộ. Một ứng dụng ghi chú có thể trở nên vô nghĩa nếu thiếu đi mất tính năng này. LocalStorage chỉ lưu trữ được cục bộ cho nên Adapter này chắc chắn không thể dùng để đồng bộ được. Thay vào đó, tôi sẽ tận dụng Turso để làm một cơ sở dữ liệu trực tuyến, cái khó ở đây là làm sao thiết lập được cấu hình kết nối đến Turso và làm thế nào để người dùng thiết lập cấu hình cho Adapter một cách dễ dàng nhất.

Tổng kết

Với tất cả những gì đã làm được, Notas đã có thể sử dụng được các thao tác cơ bản, bên cạnh đó là rất nhiều khó khăn mà đang nhìn thấy. Nhưng tôi không phải là một người nghiêm túc với việc đặt mục tiêu cho lắm, mà mang hơi hướng của một kẻ "cứ làm đi, rồi sẽ xong cả thôi"!

Cao cấp
Hello

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (1)

Nội dung bình luận...
Avatar
Luc Tan1 năm trước

Em thấy các bài viết của anh cũng kh đến mức là dài, nội dung anh viết được truyền đạt theo cách kể chuyện - nói chuyện rất hay cho nên e đọc kh có cảm giác bị nhàm chán. Chúc anh vẫn luôn giữ lửa và năng lượng này để có thêm nhiều bài viết chất lượng

Trả lời
Avatar
Xuân Hoài Tống1 năm trước

Cảm ơn em, anh hay lồng ghép câu chuyện của mình vào các bài viết để dẫn dắt người đọc vào bối cảnh của mình vì như thế giúp cho bài viết có chiều sâu hơn. Kể cả thế vẫn rất khó để câu chuyện diễn ra một cách tự nhiên, và anh thì vẫn rèn luyện để viết tốt hơn mỗi ngày á 😄