Câu chuyện về mình
Mình là Huỳnh Nhân Quốc.
Đây không hẳn là một bản giới thiệu nghề nghiệp. Nó là câu chuyện về một người đã đi qua nghĩa vụ quân sự, giảng đường, những đêm mất ngủ, các quán cà phê, công việc giao hàng, những sản phẩm thất bại và một giấc mơ được gọi là độc lập công nghệ.

Lời mở đầu
Nếu chỉ cần một câu trả lời ngắn, mình là một lập trình viên tự học, sinh ra và lớn lên ở Tam Kỳ. Mình làm việc nhiều với Go, JavaScript, máy chủ và những hệ thống web. Nhưng câu trả lời đó bỏ lại gần như toàn bộ phần quan trọng nhất: vì sao mình lại chọn con đường này, vì sao mình cứ muốn hiểu sâu hơn, và vì sao sau nhiều lần có thể rẽ sang một hướng dễ hơn, mình vẫn quay về với chiếc máy tính và những câu hỏi cũ.
Mình từng gọi bản thân bằng nhiều cái tên: coder, developer, designer, SEOer, researcher, indie hacker, thậm chí là một "kẻ lông bông" vì đã học và làm quá nhiều thứ mà không biết nên đặt mình vào một ô nào. Sau cùng, tên gọi không còn quan trọng. Điều nhất quán nhất là mình luôn muốn làm ra thứ gì đó bằng đôi tay của mình, hiểu nó đủ sâu và dùng nó để tạo ra một cuộc sống có ý nghĩa.
Có người làm việc vì tiền. Có người làm việc vì đam mê. Mình muốn làm việc vì hạnh phúc.
Trước 2015
Đi học, đi lính rồi trở lại trường.
Trước khi có lập trình, đã có một quãng đời khác.
Mình từng đi bộ đội hai năm. Sau khi hoàn thành nghĩa vụ quân sự, tháng 2 năm 2015 mình về quê ôn thi lại đại học, học lái ô tô, phụ gia đình và bắt đầu tò mò về Blogger. Đó là một giai đoạn mình làm nhiều việc cùng lúc đến mức sau này nhìn lại cũng không hiểu vì sao mình có đủ sức để đi qua.
Tháng 9 năm ấy, mình vào học ngành Công nghệ thông tin tại Đại học Quảng Nam. Kỳ đầu tiên không mở ra bằng một ngôn ngữ lập trình, mà bằng triết học. Mình thích đọc, gom các ý chính và cố nhìn thế giới bằng một cách có hệ thống. Trong lớp có những người bạn Lào; vì tò mò, mình học vài từ, tập nhớ tên và ghép những câu đơn giản để có thể trò chuyện với họ. Có lẽ từ rất sớm mình đã học theo cách như vậy: bắt đầu từ tò mò, tìm ra những mảnh nhỏ, rồi tự ghép chúng thành một thế giới mình hiểu được.
C và C++ khi ấy gần như không để lại trong mình điều gì ngoài cảm giác khó hiểu. Mình từng tìm code trên mạng, dán vào cho chạy và nghĩ thế là xong. Có lần thi trên giấy, mình chép một đoạn đệ quy dù không thật sự biết nó làm gì. Đó là một ký ức không đẹp, nhưng quan trọng: nó cho mình biết sự khác nhau giữa làm cho xong và hiểu một điều đến nơi đến chốn.
2015-2017
“HTML là gì?” và lần đầu mình tin rằng mình có thể làm được.
Câu hỏi kỹ thuật đầu tiên của mình rất nhỏ: HTML là gì? Mình xem các video về Blogger, thay theme, sửa một chi tiết rồi làm hỏng một chi tiết khác. Dần dần mình hiểu HTML là bộ khung, CSS tạo nên hình dáng và JavaScript khiến trang web có hành vi. Cách hiểu lúc đó còn ngây ngô, nhưng nó mở ra một cánh cửa.
Năm hai đại học, C# làm mọi thứ thay đổi. Vì thích giày, mình quyết định viết phần mềm quản lý bán giày. Từ khóa tiếng Anh còn là trở ngại nên mình tìm tài liệu tiếng Việt, đọc cả ví dụ VB.NET rồi dùng công cụ chuyển sang C#. Mỗi tính năng là một câu hỏi mới: đánh mã sản phẩm ra sao, phân biệt màu thế nào, quét mã vạch bằng Code128 như chiếc máy mình nhìn thấy trong siêu thị ở Tam Kỳ.
Sau hơn ba tháng, phần mềm hoàn thành. Nó không hoàn hảo; nhiều cách giải quyết khi ấy vụng về, như gọi lại hàm khi ID bị trùng hoặc tự quy ước màu bằng những con số. Nhưng lần đầu tiên mình nhìn thấy một ý tưởng trở thành thứ có thể dùng được. Kỳ học đó mình nằm trong nhóm điểm cao của lớp. Điều đáng nhớ không phải thứ hạng, mà là cảm giác một người vốn không nghĩ mình giỏi cũng có thể thay đổi khi tìm thấy điều mình thật sự muốn làm.
Từ WinForms, mình tìm đến WPF, MVC, MVVM, Entity Framework và LINQ. Rồi một câu hỏi khác xuất hiện: tại sao không thể viết một lần và chạy ở nhiều nơi? Câu hỏi đó đưa mình đến Xamarin, rồi Google Sheets API, JSON, Azure và Firebase. Mình chưa biết API thật sự là gì, chỉ biết mình muốn dữ liệu thay đổi ở một nơi và xuất hiện ở nơi khác mà không cần bấm tải lại.
Khi Xamarin không đi cùng Firebase theo cách mình cần, mình chuyển sang Ionic, Angular, Cordova và PWA. Mình liên tục rời một công cụ để tìm đến công cụ khác, không phải vì chạy theo tên mới, mà vì mỗi lần chạm vào giới hạn, mình lại muốn biết phía bên kia còn có gì.
2018-2019
Rời trường, đi xa và bước vào đời.
Lá đơn xin việc đầu tiên và những đánh đổi của tuổi trẻ.
Gần mùa xuân năm 2018, mình bỏ học và bỏ công việc làm thêm dù điểm số lẫn thu nhập đều ổn định. Mình từng đạt điểm trung bình 8,16 và đứng thứ 5 trong 46 người, nhưng mình không còn tin rằng con đường ấy sẽ đưa mình đến nơi muốn đến. Trong lá đơn xin việc đầu tiên, mình kể gần như toàn bộ những gì đã học: Blogger, C#, Xamarin, Firebase, Angular, Ionic và PWA. Mình xin một cơ hội thực tập hoặc thử việc, ở Đà Nẵng, Sài Gòn hay bất cứ nơi nào có thể được làm đúng điều mình thích.
Sài Gòn cho mình thấy khoảng cách rất lớn giữa những gì biết và công việc thật. Mình được làm với Angular, đọc code của người khác, hỏi rất nhiều và nhận ra mình giống một người vừa bước ra khỏi chiếc giếng nhỏ. Nhưng mình chưa từng xấu hổ vì phải hỏi. Muốn biết thì phải hỏi; muốn giỏi hơn thì phải học.
Những website đầu tiên của mình thất bại vì SEO. Trong khi website làm cho người khác có thể được tìm thấy, website của chính mình lại không. Mình bắt đầu nghiên cứu SEO website, Facebook và YouTube. Một website trong số đó tình cờ được ai đó nhìn thấy và yêu thích, rồi mở ra chuyến đi Bangkok, Luang Prabang và Hà Nội được tài trợ. Đó là lần đầu mình cảm nhận rõ một sản phẩm trên Internet có thể đưa đời mình đến một nơi hoàn toàn khác.
Cũng có năm tháng mình im lặng, chơi game và cố trả lại cho mình một phần tuổi thơ. Mình từng ngồi trước máy tính suốt những khoảng thời gian quá dài, như thể vượt qua giới hạn cơ thể là một bằng chứng của ý chí. Sau này mình mới hiểu: có những giới hạn cần vượt qua, nhưng cũng có những giới hạn tồn tại để bảo vệ mình.

2018
Quán cà phê của một người bạn.
Đêm Firebase biến “phụ thuộc” thành một trải nghiệm thật.
Năm 2018, mình phụ một người bạn ở quán cà phê vào ban ngày và viết phần mềm cho quán vào ban đêm. Đây không phải Hoa House; Hoa House đến nhiều năm sau. Phần mềm quán cà phê là một trong những hệ thống đầu tiên khiến mình phải suy nghĩ nghiêm túc về sản phẩm: bàn, món, kích thước, hóa đơn, thao tác của nhân viên và cách một giao diện phải đủ rõ để được dùng trong lúc quán đang đông.
Một bản cập nhật Firebase làm quá trình triển khai bị hỏng. Mình thức qua đêm và chỉ dừng lại vào khoảng mười giờ sáng hôm sau. Trước đó, dependency chỉ là một từ kỹ thuật. Sau đêm ấy, nó trở thành cảm giác bất lực khi thứ mình xây phụ thuộc vào một lớp mình không hiểu đủ sâu và không thể tự sửa.
Mình không rời Firebase ngay lập tức. Nhưng câu hỏi về quyền kiểm soát đã ở lại. Nó đưa mình đến việc tự vận hành máy chủ, học Go, Ubuntu và dần nhìn một ứng dụng như một hệ thống hoàn chỉnh thay vì chỉ là phần giao diện người dùng nhìn thấy.

2019
Go, máy chủ và mong muốn xây phần nền của riêng mình.
Mình bắt đầu dùng Go cho backend, học Ubuntu Server, CLI, tiến trình, log, route, cache và cách một request thực sự đi qua hệ thống. Hugo đưa mình đến JAMstack; Gatsby cho mình thấy một website có thể nhanh và mượt như thế nào. Càng dùng những công cụ tốt, mình càng muốn biết bên trong chúng có gì.
Đây không phải sự phủ nhận WordPress, Shopify, Laravel hay bất kỳ nền tảng nào đã tồn tại. Mình chỉ nhận ra mình muốn có một mặt đất vừa đủ cho những sản phẩm của chính mình, nơi mình có thể hiểu từng quyết định, thay đổi khi cần và không phải mang theo những phần không sử dụng.
Mình từng lao vào một thuật toán chuyển HTML thành JSON suốt mười lăm ngày xuyên đêm. Có những ngày ngồi trước màn hình 12, 16, 21 tiếng, thậm chí lâu hơn. Câu nói đau nhất nhưng cũng cần thiết nhất mình từng dành cho bản thân là: “Hãy ra ngoài khi trời còn sáng.” Không phải từ bỏ công việc, mà là nhớ rằng phía ngoài màn hình vẫn còn mặt trời và một cuộc đời cần được sống.
2019-2020
Khởi nghiệp và những người bạn.
DIMODO, ba con người, ba ngôn ngữ và một giấc mơ chưa kịp thành hình.
Năm 2019, mình tình cờ gặp Parker. Tiếng Anh của mình rất tệ; cuộc trò chuyện đầu tiên bắt đầu bằng vài câu vụng về rồi kéo dài nhờ Google Translate. Mình kể về mong muốn xây một nền tảng riêng. Parker nói về khởi nghiệp và giới thiệu Lychee, một người bạn làm thiết kế. Parker là người Hàn Quốc, Lychee là người Trung Quốc, còn mình là người Việt Nam gần như không nói được tiếng Anh.
DIMODO ra đời từ đó. Parker nghĩ về sản phẩm và thị trường, Lychee muốn làm ra những thiết kế đẹp, còn mình cứ quay về với phần nền. Mình từng nói: một sản phẩm có thể thất bại, nhưng một nền tảng tốt có thể tạo ra sản phẩm tiếp theo. Chúng mình tranh luận rất nhiều nhưng cũng trở thành những người bạn gần gũi.
Năm 2020, Lychee trở về Vũ Hán, mình về quê ăn Tết và đại dịch xảy ra. Mỗi người bị giữ lại ở một nơi. Ngôn ngữ vốn đã là khoảng cách; khi không còn ngồi cạnh nhau, chúng mình dần mất kết nối. Startup không tiếp tục, nhưng nó dạy mình rằng kỹ thuật không đủ để giữ một đội ngũ hay một sản phẩm sống sót. Con người, giao tiếp, thời điểm và hoàn cảnh đều là một phần của hệ thống.

2020
Trở về Tam Kỳ, giao vặt 15 nghìn và bắt đầu lại từ những viên gạch nhỏ nhất.
Mùa xuân năm 2020, mình trở về quê với rất ít tiền trong túi. Mình lập fanpage Giao vặt Tam Kỳ, nhận mua hộ và giao hàng với giá 15 nghìn. Mình làm shipper, freelancer, website, nội dung và thiết kế. Chỉ cần công việc trong sạch, có thể nuôi bản thân và không làm hại ai thì mình làm.
Song song với việc kiếm sống, mình bắt đầu xây phần nền riêng. Nó được xóa đi viết lại không biết bao nhiêu lần: render template, CSS, JavaScript phía trình duyệt, database, root pointer, routing và cách tổ chức thư mục. Mình phải tự làm từ UI/UX đến quản trị dữ liệu và backend vì không có lựa chọn nào khác.
Năm đó mình từng ghi lại khoảng 200 trong 365 ngày bị đảo lộn giấc ngủ. Mình hoàn thành hơn mười website, viết hàng chục bài blog, thiết kế logo và vừa đủ kiếm tiền từ nghề chính để tiếp tục trả cho server. Nhìn từ bên ngoài, đó có thể là một năm quá sức. Với mình khi ấy, thành công không phải số tiền kiếm được mà là việc một khách hàng có thể mỉm cười vì thứ mình làm ra.
2021-2022
SEO, Samdy và affiliate.
Khi kỹ thuật phải học cách tạo ra giá trị và tự nuôi chính nó.
Ngày 11 tháng 11 năm 2021, mình public Samdy, một website so sánh giá và affiliate được xây trên phần nền riêng. Hai tuần trước đó mình từng chạy khoảng hai mươi website trên VPS một core, một GB RAM. Khi Samdy bắt đầu có người dùng, chiếc máy chủ chạm giới hạn. Thu nhập ban đầu khoảng 20 nghìn mỗi ngày, vừa đủ trả VPS, nhưng đó là lần đầu hệ thống tự tạo ra một phần chi phí để tiếp tục tồn tại.
Nhờ kinh nghiệm SEO và tự động hóa dữ liệu sản phẩm, Samdy từng lọt khoảng top 66 trong nhóm website thương mại điện tử tại Việt Nam theo bảng xếp hạng mình theo dõi lúc đó. Mình kiếm được 1.000 USD đầu tiên từ affiliate. Rồi Google thay đổi, lượng index giảm và doanh thu rơi theo. Mình đã đặt gần như tất cả niềm tin vào một nguồn traffic. Khi nguồn đó thay đổi, giấc mơ tự động hóa cũng vỡ rất nhanh.
Bài học lớn không nằm ở con số. Một thuật toán tốt không thay thế được một hệ thống phân phối lành mạnh. Traffic, hạ tầng, dòng tiền, thời gian duyệt hoa hồng và hành vi người dùng đều liên quan với nhau. Từ đó, mình không còn nhìn SEO như vài từ khóa, mà như một phần của kiến trúc sản phẩm.
Sau Samdy là shortlink, shortdomain và tracking: những hệ thống đo CPC, EPC, chuyển đổi, chiến dịch và tận dụng việc chuyển hướng domain. Chúng được viết trên Kitstack, cái tên mình dùng cho nền tảng riêng lúc đó. Chính những sản phẩm thật này buộc phần nền phải trưởng thành.
2022-2023
Highlands, Hoa House và một giấc mộng bằng hoa.
Affiliate không chỉ mang lại tiền; nó biến một nơi trong tưởng tượng thành nơi có thể bước vào.
Khi SEO giảm, mình thử những nguồn traffic khác. Với chiến dịch voucher Highlands Coffee, mình kết hợp quảng cáo trả phí, nội dung, fanpage Kit Voucher và một cộng đồng hơn 30.000 thành viên. Thay vì để mỗi lượt click kết thúc sau một chuyển đổi, mình tìm cách đưa những người có cùng nhu cầu về một nơi có thể tiếp tục chăm sóc và chia sẻ thông tin.
Trong khoảng sáu tháng, affiliate mang về cho mình khoảng 200 triệu đồng. Mình ghi lại con số đó không phải để biến About thành một bản thành tích, mà vì nó giải thích một chương quan trọng: số tiền ấy cho mình khả năng tự tay xây Hoa House, một quán cà phê nhỏ ở Tam Kỳ.
Hoa House có câu “Ở đây có bán mộng mơ”. Nhiều năm trước, có lúc mình chưa từng nghĩ sẽ cầm được mười triệu trong tay; sau này mình dùng tiền kiếm từ những đường link, dữ liệu, quảng cáo và rất nhiều thử nghiệm để dựng nên một không gian thật. Nếu không có affiliate, sẽ không có Hoa House.
Hoa House khác với quán cà phê của người bạn năm 2018. Một nơi là nơi mình phụ bạn và viết phần mềm; một nơi là giấc mơ được xây sau hành trình affiliate. Hai câu chuyện đều có cà phê, nhưng thuộc về hai thời điểm và mang hai ý nghĩa hoàn toàn khác nhau.

Những năm Kitstack
Một phần nền riêng lớn lên trong im lặng cùng các sản phẩm thật.
Kitstack chưa từng là một sản phẩm công khai hoàn chỉnh. Nó là hệ thống riêng mình dùng để xây Samdy, shortlink, shortdomain, tracking, các module affiliate, website khách hàng và nhiều thử nghiệm khác. Bên trong nó có quá nhiều logic gắn với công việc riêng để có thể đưa lên mạng nguyên vẹn.
Ở phía trình duyệt, mình đi từ Angular, Web Components, Proxy và data binding đến một runtime JavaScript nhỏ hơn. Mình quan tâm đến directive, expression, scope, state và câu hỏi ai thực sự có quyền thay đổi DOM. Thứ từng được gọi là reactivity dần trở thành runtime JS, rồi được mở ra dưới dạng kit.js.
Ở phía server, các câu hỏi cũng đi sâu hơn: source code được đọc thế nào, compiler tạo ra gì, bytecode có thể nhỏ đến đâu, VM phải kiểm soát quyền hạn ra sao, tenant được cô lập bằng cách nào và request nào có thể đi thẳng ra file mà không cần đánh thức máy ảo. Những khái niệm ấy không đến từ sách trước rồi mới tìm chỗ áp dụng. Chúng đến từ vấn đề thật, sau đó mình mới quay lại học tên gọi và nền tảng lý thuyết của chúng.
Từ 2025
Kitwork và việc mở những gì từng riêng tư.
Kitwork không phải một khởi đầu mới; nó là phần có thể chia sẻ của một hành trình cũ.
Cuối năm 2025, mình bắt đầu tách những phần có thể dạy, kiểm chứng và mở mã nguồn khỏi Kitstack. Những website được viết theo cấu trúc thư mục, template, routing, compiler, bytecode, VM, JIT và tenant isolation dần được chuẩn hóa dưới tên Kitwork.
Mình không muốn kể Kitwork như một cỗ máy sống hay một sản phẩm sẽ thay đổi thế giới. Nó đơn giản là nơi những hiểu biết của mình phải đối diện với mã nguồn thật, giới hạn tài nguyên, bảo mật, triển khai và người dùng. Điều nào không đứng vững trong thực tế thì phải được sửa hoặc bỏ đi.
Website bạn đang đọc cũng chạy trên phần nền đó. Vì vậy, nó vừa là blog cá nhân vừa là một bằng chứng nhỏ: các ý tưởng không chỉ nằm trong bài viết, chúng đang tự phục vụ trang chứa câu chuyện về chúng.
Độc lập công nghệ
Không phải tự làm mọi thứ. Là giữ quyền lựa chọn và chịu trách nhiệm về lựa chọn ấy.
Ở tuổi ba mươi, mình hiểu “độc lập công nghệ” khác với những năm đầu. Nó không có nghĩa là phủ nhận thư viện, cộng đồng hay công sức của người khác. Nó cũng không có nghĩa là một người phải viết lại cả thế giới. Với mình, đó là khả năng hiểu những lớp quan trọng, sở hữu dữ liệu và đường đi của sản phẩm, thay thế một phần khi cần và không hoàn toàn bất lực trước hệ thống mình phụ thuộc.
Con đường độc lập đi cùng sự cô đơn. Không có đội ngũ lớn để chia sẻ khi hệ thống lỗi, doanh thu dừng lại hoặc một quyết định hóa ra sai. Mình không thể chạy nhanh như một công ty có hàng trăm người, cũng không cần hàng triệu người dùng để biện minh cho công việc. Đổi lại, mình có thể đi chậm, hiểu sâu và phục vụ một nhóm nhỏ những người thật sự tìm thấy giá trị.
Tự do không phải muốn làm gì cũng được. Tự do là khi mọi hậu quả cuối cùng cũng quay về với mình. Chính trách nhiệm đó khiến sự độc lập đáng giá, đồng thời khiến nó không bao giờ dễ dàng.
Mình không cần thành công ngay lập tức. Mình chỉ cần mỗi ngày còn có thể tiến thêm một bước và vẫn nhận ra con đường mình đang đi.
Viết để nhớ
Tại sao một lập trình viên lại viết nhiều như vậy?
Vì code giữ lại cách một hệ thống hoạt động, nhưng không giữ được cảm giác của người viết nó. Nó không kể được đêm nào mình mất ngủ, điều gì đã làm mình sợ, ai đã ở bên, tại sao một quyết định tưởng như vô lý lại cần thiết trong hoàn cảnh lúc đó.
Mình không viết để chứng minh mình đã giỏi. Nhiều đoạn trong bản About cũ vụng về, sai chính tả, lặp lại và chứa cả sự tự cao lẫn tuyệt vọng của tuổi trẻ. Nhưng chúng thật. Viết lại không phải để xóa con người cũ, mà để nhìn người ấy bằng sự bình tĩnh và thương cảm hơn.
Một repository, một URL, một bức ảnh hay một bài viết đều cho ký ức một địa chỉ. Đó là lý do website này tồn tại: để những điều đã học không tan mất, và để một người nào đó đang đi một mình có thể biết rằng đã từng có người khác cũng đi chậm, đi vòng, thất bại nhiều lần nhưng vẫn chưa từ bỏ.
Hiện tại
Vẫn ở Tam Kỳ, vẫn viết code và vẫn học cách sống bên ngoài màn hình.
Mình tiếp tục phát triển Kitwork, kit.js và website này. Mình vẫn tò mò về runtime, compiler, bytecode, VM và cách xây những hệ thống nhỏ có thể tồn tại lâu. Nhưng mình cũng cố nhớ lời nhắc cũ: hãy ra ngoài khi trời còn sáng.
Mình không biết vài năm tới sẽ ở đâu hay những gì đang làm sẽ trở thành điều gì. Điều chắc chắn hơn là mình vẫn muốn tiếp tục học, tiếp tục viết và giữ quyền sống thật với những lựa chọn của mình.

Những điều mình tin tưởng
Sự thấu hiểu chậm rãi sẽ bền vững hơn.
Mình học chủ yếu bằng cách tự xây dựng lại, đập đi làm lại và kiên nhẫn với các câu hỏi cho đến khi chúng đủ rõ ràng để áp dụng.
Hệ thống nên gắn liền với cuộc sống thực tế.
Máy chủ, SEO, những lần triển khai thất bại, công việc giao hàng, quán cà phê và cuộc sống gia đình không tách rời khỏi công việc. Chúng định hình cách mình xây dựng sản phẩm.
Viết công khai là một cách để ghi nhớ.
Một repository, một ghi chú, một bài viết hoặc một lời giải thích ngắn giúp định danh cho một ý tưởng. Nó làm cho quá trình tự học dễ quay lại và dễ chia sẻ hơn.
Những công cụ mình làm việc cùng
Trang web này
Liên hệ
Bạn có thể theo dõi mã nguồn và những gì mình đang xây trên GitHub, đọc các bài dài bằng tiếng Anh trên Substack, hoặc đơn giản quay lại blog này vào một ngày khác.