
Đẹp Nhất CM – Từ một buổi Tech Sharing đến một cuộc thi ảnh bằng AI
Table of Contents11 sections
Chương 1: Chuyện này đáng lẽ chỉ là một buổi Tech Sharing

Có một điều mình thấy khá buồn cười mỗi khi nghĩ lại về Đẹp Nhất CM.
Rất nhiều người sau này hỏi mình project này bắt đầu như thế nào. Có người đoán chắc mình ngồi cả tuần để nghĩ ý tưởng, có người nghĩ mình muốn thử AI nên kiếm đại một project để nghịch, cũng có người mặc định đây là một side project mình đã ấp ủ từ rất lâu. Thật ra không có giả thuyết nào đúng cả. Nếu phải chọn đúng một thời điểm để mọi chuyện bắt đầu thì mình sẽ chọn một buổi chiều rất bình thường, lúc cả công ty đang chuẩn bị cho company trip. Mình được giao một chủ đề Tech Sharing về cách chụp ảnh bằng điện thoại. Chỉ vậy thôi. Không roadmap, không product vision, càng không có ý định build thêm bất kỳ sản phẩm nào. Trong đầu mình lúc đó chỉ có đúng một việc: làm sao gom mấy kinh nghiệm chụp ảnh thành một buổi chia sẻ đủ thú vị để mọi người không cảm thấy mình đang ngồi nghe một tiết học.
Thú thật thì mình cũng không phải người quá mê nhiếp ảnh. Mình không thuộc tên các loại ống kính, cũng chẳng phải kiểu cuối tuần xách máy đi săn bình minh. Điều mình thích hơn là quan sát. Vì sao có những bức ảnh nhìn vào thấy rất "đã", còn có những bức chụp cùng một chỗ, cùng một người, nhưng lại chẳng để lại cảm giác gì? Trong lúc chuẩn bị slide, mình ngồi xem lại khá nhiều ảnh của những chuyến đi cũ, vừa chọn ví dụ vừa tự phân tích xem điều gì làm chúng khác nhau. Mọi thứ vẫn diễn ra rất bình thường cho đến khi mình tự hỏi một câu mà ban đầu mình cũng không nghĩ nhiều.
Nếu sau buổi chia sẻ này mọi người thật sự chụp đẹp hơn thì sao?
Nghe có vẻ là một câu hỏi khá vui, nhưng càng nghĩ mình lại càng thấy nó kéo theo một câu hỏi khác thú vị hơn. Nếu ai cũng chụp đẹp hơn, vậy cuộc thi ảnh của công ty sẽ diễn ra như thế nào? Trước đây, khi chất lượng ảnh còn chênh lệch khá nhiều, việc chọn người thắng có lẽ không quá khó. Nhưng nếu ai cũng biết chọn góc, biết canh sáng, biết bố cục thì sao? Ban tổ chức sẽ chấm kiểu gì? Nếu chỉ đếm số lượt thích thì cuối cùng cuộc thi có khi lại biến thành cuộc thi xem ai nhiều bạn bè hơn. Còn nếu để AI chấm toàn bộ thì nghe có vẻ hiện đại thật, nhưng mình lại thấy thiếu thiếu. Một cuộc thi ảnh mà con người chỉ đứng nhìn máy đưa điểm thì có gì đó không đúng.
Điều mình thấy lạ là từ sau hôm đó mình không còn nghĩ nhiều về buổi Tech Sharing nữa. Mỗi lần mở slide lên chỉnh sửa một chút, đầu óc mình lại trôi sang câu chuyện của cuộc thi. Ban đầu mình nghĩ chỉ cần thêm một ý nhỏ rồi thôi, nhưng càng nghĩ thì những câu hỏi mới lại xuất hiện. Nếu không dùng lượt thích thì dùng gì? Nếu AI không phải giám khảo thì AI nên làm gì? Nếu mình là người tham gia thì điều gì khiến mình muốn mở website thêm một lần nữa sau ngày đầu tiên?
Đến lúc đó mình vẫn chưa mở Figma. Chưa tạo repository. Chưa viết một dòng code nào. Nhưng nhìn lại thì mình nghĩ project thật sự đã bắt đầu từ đây. Không phải từ lúc mình xây dựng sản phẩm, mà từ lúc mình bắt đầu tò mò về một bài toán mà trước đó mình chưa từng nghĩ tới. Và mình cũng không ngờ rằng chính sự tò mò đó sẽ kéo mình đi xa hơn rất nhiều so với một buổi Tech Sharing ban đầu.

Chương 2: "Ủa... vậy khác gì Facebook?"
Có một điểm mình nhớ rất rõ, dù bây giờ nhìn lại thì nó chẳng có gì đặc biệt. Sau vài ngày quanh quẩn với mấy câu hỏi về cuộc thi ảnh, mình quyết định mở Figma lên thử vẽ vài màn hình xem sao. Không có yêu cầu gì cao siêu cả. Chỉ là đôi khi một ý tưởng nằm trong đầu quá lâu thì cách nhanh nhất để biết nó có ổn hay không là vẽ nó ra.
Mọi thứ diễn ra nhanh hơn mình nghĩ. Một màn hình đăng nhập, một trang hiển thị danh sách ảnh, một nút upload, vài cái card để hiện thông tin người đăng, rồi thêm một nút bình chọn ở góc. Chưa đầy một buổi thì mình đã có một prototype đủ để bấm qua bấm lại. Lúc đó cảm giác cũng khá thích. Ít nhất thì ý tưởng không còn nằm trong đầu nữa, nó đã bắt đầu có hình dạng.

screenshot bản prototype đầu tiên
Nhưng cái cảm giác đó chỉ kéo dài được vài phút.
Mình mở prototype lên, bấm từ màn hình này sang màn hình khác thêm vài lần rồi tự nhiên dừng lại. Không phải vì phát hiện bug hay vì giao diện xấu. Mình chỉ có cảm giác rất quen. Quen đến mức hơi khó chịu. Mình nhìn thêm một lúc nữa rồi buột miệng nghĩ đúng một câu.
Ủa... vậy khác gì Facebook?
Câu hỏi đó làm mình khựng lại khá lâu. Nếu bỏ logo đi, đổi màu giao diện một chút rồi thay chữ "Đẹp Nhất CM" bằng tên của bất kỳ mạng xã hội nào khác thì có lẽ chẳng ai thấy lạ. Người dùng vẫn upload ảnh. Người khác vẫn thả tim hoặc bình chọn. Cuộn xuống thì lại thấy thêm ảnh mới. Thực ra mình không hề tạo ra một trải nghiệm mới, mình chỉ đang lắp lại những thứ đã tồn tại từ rất lâu.
Điều thú vị là mình không nghĩ Facebook hay Instagram dở. Ngược lại, chúng quá thành công. Chính vì quá thành công nên mình vô thức lấy chúng làm khuôn mẫu mỗi khi nghĩ đến một website có ảnh và có tương tác. Nhưng rồi mình lại tự hỏi một câu khác. Nếu ngay cả mình còn không có lý do để mở lại cái prototype này ngày mai, thì tại sao đồng nghiệp của mình lại phải làm điều đó?
Lúc đó mình mới nhận ra vấn đề chưa bao giờ là chuyện upload ảnh hay bình chọn. Những thứ đó chỉ là chức năng. Điều mình thật sự thiếu là một lý do để người ta muốn quay lại sau lần đầu tiên. Facebook khiến người ta quay lại vì mỗi lần mở ứng dụng đều có nội dung mới. Nhưng company trip chỉ diễn ra vài ngày. Số lượng ảnh là hữu hạn. Nếu chỉ sao chép mô hình của mạng xã hội thì ngay từ đầu mình đã chơi một cuộc chơi mà mình không thể thắng.
Đó là lần đầu tiên mình nghiêm túc nghĩ rằng có lẽ mình đang đi sai hướng. Mình không cần làm một Facebook phiên bản thu nhỏ chỉ dành cho công ty. Mình cần tìm xem bản chất của cuộc thi ảnh này thật sự là gì. Và càng nghĩ, mình càng thấy câu trả lời có lẽ không nằm trong thế giới của mạng xã hội.
Nó nằm ở một nơi hoàn toàn khác.
Chương 3: Mình bắt đầu nghĩ về game
Mình không nhớ chính xác mình mất bao lâu để thoát khỏi cái bóng của Facebook. Chỉ nhớ là sau khi nhận ra prototype đầu tiên chẳng khác gì một mạng xã hội thu nhỏ, mình không còn hào hứng mở Figma nữa. Thay vì thêm chức năng mới, mình dành nhiều thời gian hơn để tự hỏi một câu nghe có vẻ rất ngớ ngẩn: rốt cuộc mình đang build cái gì? Càng nghĩ mình càng thấy mình luôn trả lời câu hỏi đó theo cách quá hời hợt. Mình bảo mình đang làm một website cho cuộc thi ảnh. Nhưng nếu chỉ vậy thì mọi thứ đã xong từ chương trước rồi. Upload ảnh, bình chọn, bảng xếp hạng... tất cả đều đã có. Thế mà mình vẫn thấy thiếu một cái gì đó.
Có lần mình ngồi nhìn cái nút bình chọn khá lâu. Bình thường một nút bấm thì có gì để nghĩ đâu. Thích thì bấm, không thích thì thôi. Nhưng càng nhìn mình càng thấy lạ. Nếu người tham gia có thể thích tất cả mọi bức ảnh thì cái nút đó thực sự có ý nghĩa gì? Một lượt bình chọn không khiến người ta phải suy nghĩ. Nó không buộc người ta đánh đổi điều gì. Nó chỉ là một phản xạ. Nhìn ảnh đẹp thì bấm. Kéo xuống thì bấm tiếp. Đến cuối cùng thì mọi người đều được rất nhiều lượt thích và mình lại quay về đúng bài toán ban đầu: làm sao phân biệt được đâu mới là bức ảnh thật sự nổi bật?
Lúc đó mình chợt nhớ đến một điều khá thú vị. Trong game, người ta rất hiếm khi để người chơi có tài nguyên vô hạn. Máu có giới hạn. Đạn có giới hạn. Tiền có giới hạn. Thậm chí thời gian cũng thường có giới hạn. Không phải vì game muốn làm khó người chơi, mà vì chính giới hạn mới khiến mỗi quyết định trở nên đáng nhớ. Nếu mình chỉ có một viên đạn thì mình sẽ ngắm kỹ hơn trước khi bóp cò. Nếu mình chỉ có vài lá bài thì mình sẽ cân nhắc nên dùng lúc nào. Điều làm mình thấy hứng thú không phải bản thân viên đạn hay lá bài, mà là cảm giác phải lựa chọn.
Rồi mình thử nhìn cuộc thi ảnh theo góc đó. Điều gì sẽ xảy ra nếu lượt bình chọn cũng là một loại tài nguyên? Nếu mỗi người chỉ có một số lượng vote nhất định cho cả cuộc thi thì sao? Ngay lập tức mình thấy mọi thứ bắt đầu khác đi. Thay vì bấm theo phản xạ, người tham gia sẽ phải cân nhắc. Vote bức ảnh này đồng nghĩa với việc mình không thể vote cho một bức ảnh khác. Mỗi lần bấm nút đều mang theo một chút do dự. Và kỳ lạ là chính cái cảm giác do dự đó lại làm cuộc thi trở nên thú vị hơn.
Đó cũng là lúc mình nhận ra mình đã tìm sai nguồn cảm hứng ngay từ đầu. Mình không cần học cách Facebook giữ chân người dùng. Facebook có nội dung mới mỗi phút nên họ cần làm cho việc tương tác dễ nhất có thể. Cuộc thi ảnh của mình thì ngược lại. Nội dung chỉ có từng đó. Điều mình cần không phải thêm thật nhiều hành động, mà là khiến mỗi hành động đều có trọng lượng. Hai bài toán nhìn qua rất giống nhau nhưng cách giải lại gần như đối lập.
Nhìn lại thì mình nghĩ đây mới là lúc Đẹp Nhất CM thật sự có linh hồn. Những ý tưởng như giới hạn vote, ẩn bảng xếp hạng hay sau này là AI review đều không xuất hiện vì mình muốn thêm tính năng cho vui. Chúng xuất hiện vì mình đã đổi cách nhìn. Mình không còn cố build một mạng xã hội nữa.
Mình đang cố tạo ra một cuộc chơi.

Chương 4: AI không chỉ chấm ảnh
Đến đây thì mình lại quay về với một ý tưởng mà lúc đầu mình đã gạt sang một bên: AI. Thời điểm đó AI đang ở khắp mọi nơi. Mở LinkedIn thấy AI, mở YouTube cũng thấy AI, đi đọc blog kỹ thuật thì kiểu gì cũng có một đoạn nói về AI. Thế nên phản xạ đầu tiên của mình cũng rất đơn giản. Nếu đã làm một cuộc thi ảnh thì hay là để AI chấm luôn.
Nghe qua thì hợp lý thật. AI có thể nhìn ảnh, phân tích bố cục, màu sắc, ánh sáng rồi đưa điểm. Không biết mệt, không thiên vị, cũng chẳng quen ai trong công ty. Trên giấy thì gần như đây là một giám khảo hoàn hảo. Mình thậm chí còn khá hào hứng với ý tưởng đó vì nó nghe rất "đúng thời".
Nhưng càng nghĩ mình lại càng thấy có gì đó sai sai. Nếu AI quyết định người thắng cuộc thì người chơi còn lại gì để làm? Mình thử tưởng tượng đến ngày công bố kết quả. Nếu AI nói bức ảnh A được 9.8 điểm còn bức B được 9.5 điểm thì mọi người sẽ phản ứng thế nào? Có lẽ ai cũng sẽ nhìn con số đó vài giây rồi... thôi. Cuộc tranh luận kết thúc ngay khi AI đưa ra đáp án. Ngược lại, nếu người chơi là người quyết định, họ sẽ bắt đầu bàn luận. Người này thích góc chụp, người kia thích biểu cảm, người khác lại thấy bức ảnh vui hơn. Đột nhiên mình nhận ra điều thú vị nhất của cuộc thi chưa bao giờ là kết quả cuối cùng. Nó nằm ở những cuộc nói chuyện diễn ra trước khi có kết quả.
Đến lúc đó mình mới đổi cách nhìn về AI. Có lẽ AI không nên đứng trên người chơi để phán xét họ. AI nên đứng cạnh người chơi. Nhưng "đứng cạnh" cụ thể là làm gì? Câu trả lời lại quay về đúng lý do mình bắt đầu cả project này: một buổi Tech Sharing về cách chụp ảnh đẹp hơn. Nếu mục tiêu ban đầu là giúp mọi người chụp đẹp hơn, thì tại sao AI chỉ xuất hiện sau khi mọi thứ đã kết thúc? Lúc người chơi thật sự cần góp ý nhất lại chính là lúc họ vừa chụp xong bức ảnh, chứ không phải ngày công bố giải thưởng.
Thay vì chỉ đưa ra một điểm số, AI giải thích vì sao bức ảnh lại được điểm như vậy, dựa trên nhiều tiêu chí khác nhau: ánh sáng, bố cục, khả năng làm nổi bật chủ thể, màu sắc và không khí chung, cảm xúc và câu chuyện mà bức ảnh truyền tải, cùng chất lượng kỹ thuật. Một con số tổng chỉ là phần tóm tắt. Điều có giá trị hơn là người chơi hiểu được mình mạnh ở đâu và còn có thể cải thiện điều gì.
Nếu ảnh được chụp bằng máy có lưu EXIF, AI cũng được đưa luôn dữ liệu đó: model máy, tiêu cự, khẩu độ, ISO, tốc độ màn trập, để viết phần nhận xét kỹ thuật dựa trên số liệu thật thay vì đoán mù qua mắt thường. Thay vì chỉ nói chung chung "ảnh hơi tối", AI có cơ sở để giải thích cụ thể hơn, kiểu như ISO đang bị đẩy quá cao nên xuất hiện nhiễu, hoặc tốc độ màn trập đang quá chậm khiến chủ thể dễ bị nhòe, miễn là dữ liệu EXIF thật sự tồn tại trên bức ảnh đó.
Và vì đây vẫn là một cuộc chơi chứ không phải một buổi chấm điểm nghiêm túc, AI còn có một việc nữa: để lại một câu nhận xét hài hước, tách riêng khỏi phần điểm số và phần kỹ thuật. Không phải lời khuyên, không phải điểm số, chỉ đơn giản là một câu bông đùa về bức ảnh. Chính những câu này sau đó lại trở thành thứ mọi người chụp màn hình gửi vào nhóm chat nhiều nhất, nhiều hơn cả bản thân điểm số.
Người chơi vẫn là người quyết định cuộc thi. AI chỉ làm một việc duy nhất: giúp mọi người hiểu bức ảnh của mình hơn hôm qua, và thỉnh thoảng chọc mọi người cười một cái.

Nhìn lại thì mình nghĩ đây mới là vai trò phù hợp nhất của AI trong Đẹp Nhất CM. Điều mình muốn xây dựng chưa bao giờ là một cỗ máy tìm ra bức ảnh đẹp nhất. Điều mình muốn là một cuộc thi mà sau khi kết thúc, mọi người đều cảm thấy mình đã chụp đẹp hơn lúc bắt đầu. Nếu điều đó xảy ra, thì AI không chỉ chấm điểm một cuộc thi. Nó đã hoàn thành nốt phần còn lại của buổi Tech Sharing năm ấy.
Sau chương này, mình không còn nghĩ đến chuyện thêm thật nhiều tính năng nữa. Bộ khung của cuộc chơi gần như đã hoàn chỉnh. Việc còn lại chỉ là biến tất cả những ý tưởng đó thành một sản phẩm đủ ổn để mọi người thật sự mang ra dùng trong company trip.
Chương 5: Ý tưởng chỉ thật sự có ý nghĩa nếu kịp company trip
Đến lúc này thì mình mới bắt đầu nghĩ nghiêm túc đến chuyện viết code. Nghe có vẻ hơi ngược đời, nhưng phần kỹ thuật lại đến khá muộn. Trước đó mình dành nhiều thời gian để tự hỏi mình đang xây cái gì hơn là nghĩ nên dùng framework nào. Mình biết nếu trả lời sai bài toán sản phẩm thì dù kiến trúc có đẹp đến đâu, cuối cùng mình cũng chỉ tạo ra một website mà chính mình không muốn mở lần thứ hai.
Nhưng một khi ý tưởng đã đủ rõ thì một áp lực khác lại xuất hiện. Company trip không chờ mình. Đây không phải side project để cuối tuần rảnh thì làm tiếp, cũng không phải sản phẩm có thể dời deadline thêm vài tháng. Mọi thứ phải chạy được trước ngày mọi người lên đường. Lần đầu tiên mình thấy deadline không chỉ là một cột mốc của dự án, mà là một sự kiện ngoài đời thật. Nếu lỡ ngày đó thì coi như mất luôn lý do để sản phẩm tồn tại.
Điều đó làm mình thay đổi khá nhiều quyết định kỹ thuật. Bình thường làm một project cá nhân rất dễ rơi vào việc tối ưu quá sớm. Nghĩ về microservice khi còn chưa có người dùng, bàn chuyện scale khi database mới có vài chục bản ghi, hay mất cả buổi chỉ để chọn framework "đúng". Lần này thì khác. Mỗi khi định thêm một ý tưởng mới, mình đều tự hỏi một câu rất đơn giản: nó có giúp cuộc chơi vui hơn không? Nếu câu trả lời là không, hoặc chưa chắc, thì mình gạch nó đi.
Nhìn lại thì mình thấy mình đã may mắn vì có AI hỗ trợ trong giai đoạn này. Claude Code giúp mình tăng tốc rất nhiều ở những phần lặp đi lặp lại như dựng giao diện, xử lý CRUD hay viết những đoạn code mang tính cơ học. Thay vì dành hàng giờ cho những việc quen thuộc, mình có thêm thời gian để quay lại suy nghĩ về trải nghiệm của người dùng. Mình không xem AI là người viết thay mình. Nó giống một đồng đội giúp mình hoàn thành những phần nhàm chán nhanh hơn để mình tập trung vào những quyết định mà chỉ người làm sản phẩm mới có thể đưa ra. Nhờ vậy mà từ lúc mọi thứ trong đầu đã đủ rõ đến lúc có một bản MVP thật sự chạy được, mình chỉ mất khoảng một buổi: đúng nghĩa vài tiếng đồng hồ, chứ không phải vài ngày.
Có một chuyện mình suy nghĩ khá lâu trước khi dựng server. Đẹp Nhất CM chỉ là một project nội bộ và vòng đời của nó thực ra không dài.
Nếu nhìn theo cách đơn giản nhất thì mình hoàn toàn có thể SSH vào VPS, git pull, chạy vài lệnh rồi deploy thủ công. Chắc cũng chỉ mất vài phút mỗi lần. Nhưng rồi mình lại nhớ đến công việc hằng ngày của mình. Gần như mọi dự án mình tham gia trong những năm gần đây đều cố gắng tự động hóa quá trình phát triển. Test được chạy tự động, build được tự động, deploy cũng được tự động. Mục tiêu chưa bao giờ là để nhìn "ngầu" hơn, mà là để loại bỏ những công việc lặp đi lặp lại. Vậy nếu đây là project của chính mình, tại sao mình lại quay về cách deploy thủ công?
Thế là mình quyết định dành thêm thời gian để dựng hẳn một pipeline CI/CD, dù biết rằng đó không phải việc bắt buộc. Thành thật mà nói, lúc đầu mình cũng hơi phân vân. Company trip thì đang đến gần, còn mình lại dành thời gian viết workflow, cấu hình server và tự động hóa việc deploy thay vì làm thêm tính năng. Nhưng chỉ sau vài ngày mình đã thấy quyết định đó hoàn toàn xứng đáng. Có những lúc mình chỉ chỉnh một chi tiết nhỏ trong giao diện, sửa vài dòng prompt cho AI hoặc thay đổi cách tính điểm. Thay vì SSH vào server rồi lặp lại từng bước như trước, mình chỉ cần commit, push và đợi pipeline hoàn thành. Phiên bản mới đã sẵn sàng để mở trên điện thoại và kiểm tra ngay.

Điều thú vị là thứ CI/CD giúp mình tiết kiệm không chỉ là vài phút deploy. Nó giúp mình giữ được dòng suy nghĩ. Mình không còn phải liên tục chuyển vai giữa người thiết kế sản phẩm và người vận hành server. Ý tưởng xuất hiện, mình sửa code, push lên, trải nghiệm, rồi lại quay về suy nghĩ tiếp. Toàn bộ vòng lặp đó trở nên ngắn hơn rất nhiều. Nhìn lại thì mình thấy CI/CD không làm cho sản phẩm tốt hơn một cách trực tiếp. Nó chỉ làm cho việc thử nghiệm ý tưởng trở nên nhanh hơn. Nhưng với một project mà mình liên tục thay đổi và điều chỉnh như Đẹp Nhất CM, đó lại là một lợi thế rất lớn.
Nhìn lại thì kiến trúc cuối cùng của Đẹp Nhất CM cũng phản ánh đúng cách mình nghĩ về project. Không cố chứng minh điều gì, không cố nhồi thật nhiều công nghệ mới. Chỉ cần đủ đơn giản để triển khai nhanh, đủ ổn định để mọi người sử dụng trong company trip và đủ linh hoạt để nếu có một ý tưởng hay xuất hiện vào phút cuối thì mình vẫn còn thời gian sửa. Sau tất cả những chương trước, mình nhận ra điều mình cần không phải một hệ thống hoàn hảo. Mình cần một hệ thống giúp mình lặp lại thật nhanh chu trình: nghĩ, sửa, deploy, trải nghiệm rồi lại nghĩ tiếp.
Đến ngày mình deploy phiên bản đầu tiên, cảm giác cũng khá lạ. Sau nhiều tuần chỉ tồn tại trong đầu, trong Figma và trên máy tính của mình, cuối cùng nó cũng trở thành một website mà người khác có thể mở lên. Nhưng mình vẫn chưa biết mọi người sẽ phản ứng thế nào. Liệu họ có thật sự dùng nó? Liệu những cơ chế mình nghĩ ra có tạo nên một cuộc chơi thú vị như mình tưởng tượng? Hay tất cả chỉ là những ý tưởng nghe hay trên giấy?
Mình chỉ còn một cách để biết.
Đưa nó cho mọi người.
Chương 6: Đến lúc đưa cho mọi người
Có một điều mình thấy khá thú vị là mình gần như không quá lo về chuyện hệ thống có chạy được hay không. Đến thời điểm đó mình đã thử đủ nhiều, pipeline deploy cũng đã ổn định, AI review cũng đã hoạt động và website có thể chạy trên điện thoại lẫn máy tính. Thứ mình tò mò hơn lại là một câu hỏi rất khác.
Liệu mọi người có thật sự muốn chơi không?
Trước đó mình đã dành rất nhiều thời gian để nghĩ về sản phẩm. Mỗi cơ chế đều có lý do của nó. Vote bị giới hạn vì mình muốn mỗi lượt bình chọn đều có giá trị. AI được thiết kế để giải thích thay vì chỉ chấm điểm. Giao diện được tối ưu để việc đăng ảnh diễn ra nhanh nhất có thể. Nhưng tất cả những điều đó mới chỉ đúng trong đầu mình. Một sản phẩm chỉ thật sự bắt đầu khi có người dùng đầu tiên.
Đó cũng là khoảnh khắc mình nhận ra cảm giác khác biệt lớn nhất giữa làm theo yêu cầu và tự xây một sản phẩm. Khi làm một tính năng cho công ty, nếu code chạy đúng, test pass và QA xác nhận thì gần như nhiệm vụ đã hoàn thành. Còn với Đẹp Nhất CM thì ngược lại. Lúc deploy xong mới là lúc bài kiểm tra bắt đầu. Không ai quan tâm mình dùng framework gì hay AI nào. Điều duy nhất họ quan tâm là: "Có vui không?"
Những tấm ảnh đầu tiên bắt đầu xuất hiện. Rồi đến những lượt bình chọn. Mọi người bắt đầu đọc AI review của nhau, chụp màn hình những đoạn nhận xét hài hước rồi gửi vào nhóm chat. Có người quay lại chỉ để xem mình đang đứng ở đâu. Có người sửa ảnh rồi đăng lại vì muốn thử xem AI và mọi người sẽ phản ứng khác đi như thế nào. Chính những hành động nhỏ đó làm mình biết rằng website không còn chỉ là một nơi để upload ảnh nữa. Nó đã bắt đầu tạo ra những cuộc trò chuyện.

Nhìn lại thì mình thấy điều đáng nhớ nhất không phải là số lượng ảnh hay số lượt vote. Điều đáng nhớ nhất là lần đầu tiên mình nhìn thấy một thứ vốn chỉ tồn tại trong đầu mình được người khác sử dụng theo cách hoàn toàn tự nhiên. Không cần mình phải giải thích từng tính năng. Không cần hướng dẫn quá nhiều. Họ cứ thế mở điện thoại, đăng ảnh, bình chọn và bàn luận với nhau. Đó là lúc mình biết ý tưởng này đã tự đứng được bằng đôi chân của nó.
Sau company trip, website vẫn còn đó. Server vẫn chạy, pipeline vẫn có thể deploy thêm phiên bản mới bất cứ lúc nào. Nhưng mình không còn nhìn Đẹp Nhất CM như một project nội bộ nữa. Nó trở thành một bài học rất thú vị về cách một ý tưởng nhỏ có thể lớn dần lên nếu mình đủ kiên nhẫn đặt đúng những câu hỏi trong suốt quá trình xây dựng.
Có lẽ điều mình mang về sau project này cũng không phải Laravel, AI hay CI/CD.
Mà là niềm tin rằng việc xây dựng sản phẩm thú vị hơn rất nhiều khi mình bắt đầu từ trải nghiệm của người dùng, rồi mới nghĩ đến công nghệ để hiện thực hóa nó.
Lời kết: Thứ mình thật sự học được
Nếu có ai hỏi mình Đẹp Nhất CM là gì, có lẽ bây giờ mình sẽ không trả lời rằng đó là một website tổ chức cuộc thi ảnh.
Nó cũng không phải một project AI.
Càng không phải một bài demo Laravel hay CI/CD.
Nhìn lại toàn bộ quá trình, mình thấy những công nghệ đó chỉ là công cụ. Nếu một ngày nào đó mình viết lại project này bằng framework khác, dùng model AI khác hay deploy theo cách khác thì bản chất của nó vẫn không thay đổi.
Điều thay đổi nhiều nhất lại là cách mình nghĩ về việc làm phần mềm.
Trước đây mình thường bắt đầu bằng câu hỏi: "Mình sẽ xây cái gì?". Rồi từ đó mới nghĩ đến database, API, giao diện hay kiến trúc. Sau project này, mình gần như bắt đầu theo hướng ngược lại. Mình tự hỏi: "Tại sao người ta lại muốn mở website này thêm một lần nữa?". Nếu không trả lời được câu hỏi đó thì mọi quyết định kỹ thuật phía sau đều trở nên kém ý nghĩa.
Có lẽ vì vậy mà trong suốt quá trình làm Đẹp Nhất CM, mình đổi ý rất nhiều. Mình bỏ những ý tưởng nghe có vẻ hay nhưng không làm trải nghiệm thú vị hơn. Mình giữ lại những thứ tưởng như rất nhỏ nhưng lại khiến mọi người muốn quay lại xem thêm một lần nữa. Có những quyết định không hề liên quan đến code, nhưng cuối cùng lại ảnh hưởng đến sản phẩm nhiều hơn cả việc chọn framework hay tối ưu database.
AI cũng làm mình suy nghĩ khác đi. Trước đây mình thường xem AI là một công cụ để viết code nhanh hơn. Sau project này mình bắt đầu thấy AI còn hữu ích ở một vai trò khác: nó giúp mình thử nghiệm ý tưởng nhanh hơn. Từ việc phác thảo giao diện, viết prompt, tạo nội dung, cho đến hiện thực hóa một ý tưởng mới, khoảng cách giữa "nghĩ ra" và "nhìn thấy nó chạy" ngắn hơn rất nhiều. Điều đó khiến mình dám thử nhiều hướng hơn trước, vì cái giá của việc thử đã rẻ đi rất nhiều.
Có lẽ đây mới là điều mình thích nhất. Đẹp Nhất CM không dạy mình Laravel, Docker hay GitHub Actions. Những công nghệ đó rồi sẽ thay đổi. Thứ còn lại là một bài học đơn giản hơn nhiều: hãy dành nhiều thời gian để hiểu trải nghiệm mình muốn tạo ra trước khi nghĩ đến cách hiện thực hóa nó.
Một website có thể kết thúc sau một chuyến company trip.
Nhưng cách mình nhìn việc xây dựng sản phẩm thì có lẽ sẽ còn theo mình lâu hơn thế.
Và tất nhiên, đã là game thì phải có kẻ thắng, người thua. Đây là Đẹp Nhất CM.⭐
Giải Ba


Giải Nhì


Giải Nhất

