<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Đạt Trương Thành</title>
    <description>The latest articles on DEV Community by Đạt Trương Thành (@datweb07).</description>
    <link>https://dev.to/datweb07</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2903739%2F7935ae02-fcc4-4922-9d4b-8058266abacd.png</url>
      <title>DEV Community: Đạt Trương Thành</title>
      <link>https://dev.to/datweb07</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/datweb07"/>
    <language>en</language>
    <item>
      <title>Chia sẽ câu hỏi pv backend dev</title>
      <dc:creator>Đạt Trương Thành</dc:creator>
      <pubDate>Wed, 27 May 2026 02:46:14 +0000</pubDate>
      <link>https://dev.to/datweb07/chia-se-cau-hoi-pv-backend-dev-4n5j</link>
      <guid>https://dev.to/datweb07/chia-se-cau-hoi-pv-backend-dev-4n5j</guid>
      <description>&lt;p&gt;Hôm trước mình vừa trải qua một buổi phỏng vấn vị trí Backend Developer Intern tại FPT Telecom. Và mình được tech lead hỏi 3 bài toán sau. Mình đưa ra được solution cho case 1, case 2 thì dự án mình chưa xử lý đến mức đó =)))), case 3 thì mình có dùng Redis nhưng không solve cho case này =))), nên cũng cook luôn&lt;/p&gt;

&lt;p&gt;Nay mình viết bài này để chia sẽ đến mọi người 3 case này và solution của nó như sau:&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 1: Xử lý Race Condition
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Câu hỏi:&lt;/strong&gt; Giả sử trong kho chỉ còn đúng 1 sản phẩm cuối cùng. Có 2 người dùng cùng lúc ấn nút thanh toán ở cùng 1 thời điểm thì điều gì sẽ xảy ra và làm sao để xử lý chuyện kho bị âm?&lt;/p&gt;

&lt;p&gt;Và đây là cách mình giải quyết:&lt;/p&gt;

&lt;p&gt;Lúc này mình đã nhớ đến quy tắc isolation và consistency trong ACID để xử lý transaction. Và mình đã dùng perssimistic locking trong database transaction để giải quyết. &lt;/p&gt;

&lt;p&gt;Nói nôm na cho dễ hiểu, isolation giống như việc bạn đi mua đồ vậy. Khi user A bắt đầu quá trình mua hàng, hệ thống sẽ mở một transaction và dùng lệnh SQL để locking dòng dữ liệu của sản phẩm đó lại.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lúc này, user B cũng gửi request tới, nhưng vì dòng dữ liệu đang bị locking, request của B buộc phải đứng ngoài đợi.&lt;/li&gt;
&lt;li&gt;Khi A thanh toán xong, số lượng cập nhật thành 0 và transaction đóng lại.&lt;/li&gt;
&lt;li&gt;Lúc này B mới được phép vào đọc dữ liệu, nhưng kho đã về 0 nên hệ thống sẽ ném exception (throw exception) hết hàng.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nhờ việc cô lập 2 user này, dữ liệu kho hàng không bao giờ bị âm, từ đó giữ vững được tính consistency cho hệ thống.&lt;/p&gt;

&lt;h3&gt;
  
  
  Case 2: Xử lý mất Webhook IPN
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Câu hỏi:&lt;/strong&gt; Hệ thống có tích hợp cổng thanh toán VNPay. Khách hàng đã thanh toán thành công, ngân hàng trừ tiền rồi, VNPay chuẩn bị gọi API về server để báo kết quả thì rớt mạng ở browse của client. Vậy hệ thống đã xử lý như nào để đơn hàng của khách không ở mãi ở trạng thái "Chờ thanh toán"?&lt;/p&gt;

&lt;p&gt;Và đây là cách mình giải quyết (mình có hỏi Gemini để hỗ trợ case này):&lt;/p&gt;

&lt;p&gt;Bản chất của Webhook là một luồng giao tiếp &lt;strong&gt;thụ động&lt;/strong&gt;. Chờ người ta gọi tới thì mới biết kết quả.&lt;/p&gt;

&lt;p&gt;Để giải quyết triệt để, backend phải thiết kế thêm một luồng chủ động. Giải pháp ở đây là dùng &lt;strong&gt;Cron job&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cứ mỗi 5-10 phút, Cron job sẽ âm thầm quét trong database, tìm ra những đơn hàng nào đang "Chờ thanh toán" quá lâu.&lt;/li&gt;
&lt;li&gt;Sau đó, hệ thống sẽ mang cái &lt;code&gt;transaction_id&lt;/code&gt; đó, chủ động gọi API ngược sang phía VNPay để hỏi đơn hàng này đã thanh toán hay chưa.&lt;/li&gt;
&lt;li&gt;Nếu VNPay check và báo "Thành công", server của mình sẽ tự động cập nhật trạng thái đơn hàng cho khách hàng.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Case 3: Xử lý High Traffic vào các ngày flash sale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Câu hỏi:&lt;/strong&gt; Cứ đến các ngày lễ, đặc biệt hay flash sale thì hàng trăm ngàn người dùng truy cập vào app cùng lúc. Database chắc chắn sẽ quá tải và sập. Thì em có giải pháp gì cho vấn đề này?"&lt;/p&gt;

&lt;p&gt;Và đây là cách mình giải quyết (tham khảo thêm Gemini):&lt;/p&gt;

&lt;p&gt;Với lượng request spike traffic như vậy, nếu bắt database tính toán, truy vấn ổ cứng liên tục thì chắc sẽ cook mất =))))&lt;/p&gt;

&lt;p&gt;Giải pháp ở đây là sử dụng &lt;strong&gt;Caching&lt;/strong&gt; và &lt;strong&gt;Rate Limiting&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching: Thực hiện sao lưu những dữ liệu &lt;strong&gt;tĩnh&lt;/strong&gt; từ database lên in-memory cache (ví dụ như Redis). Redis lưu dữ liệu trên RAM, nên khi cả ngàn request ập tới, backend chỉ cần vào Redis lấy dữ liệu trả về ngay lập tức, giảm tải áp lực truy cập vào database để querry data.&lt;/li&gt;
&lt;li&gt;Rate Limiting: Dùng trong trường hợp bị spam bot hoặc tấn công DDoS. Mình sẽ cấu hình giới hạn số lượng request/s từ một địa chỉ IP. Nếu IP nào bấm tải lại trang liên tục vượt quá con số này, chặn ngay để bảo vệ server.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kết luận:&lt;/strong&gt;&lt;br&gt;
Hi vọng bài viết này sẽ giúp các bác nào phỏng vấn backend dev có thể dùng để ôn tập nhé, ngoài phần solve problem này ra, các bác cần phải ôn thêm DSA, SQL,... và đừng fake CV. Chúc may mắn!!!&lt;/p&gt;

&lt;p&gt;À mình còn được hỏi một câu so sánh stateful và stateless trong xử lý user session nhưng bài viết đã khá dài nên mình chia sẽ sau nhé&lt;/p&gt;

</description>
      <category>backend</category>
      <category>intern</category>
      <category>redis</category>
      <category>acid</category>
    </item>
    <item>
      <title>Ảo giác từ Vibecoding, Vibecoders</title>
      <dc:creator>Đạt Trương Thành</dc:creator>
      <pubDate>Sun, 10 May 2026 17:09:38 +0000</pubDate>
      <link>https://dev.to/datweb07/ao-anh-vibe-coding-3klj</link>
      <guid>https://dev.to/datweb07/ao-anh-vibe-coding-3klj</guid>
      <description>&lt;p&gt;Nay tôi viết blog này vì nhận ra &lt;strong&gt;bản thân tôi&lt;/strong&gt; và có thể &lt;strong&gt;các SV đang theo khối ngành IT/Software Engineer&lt;/strong&gt; nói chung đang gặp phải. Đó là việc dùng AI trong việc xây dựng mã nguồn!!!&lt;/p&gt;

&lt;h3&gt;
  
  
  Lập trình bằng cảm giác thay vì hiểu biết
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vibecoding là việc tạo ra phần mềm chủ yếu thông qua các prompt bằng ngôn ngữ tự nhiên với AI. Người dùng tập trung vào kết quả hiển thị có vẻ đúng, bỏ qua việc hiểu cấu trúc mã nguồn bên trong.&lt;/li&gt;
&lt;li&gt;Khả năng dựng prototype nhanh chóng tạo ra ảo giác về một lập trình viên 10x. Không cần lo nghĩ về cú pháp, chỉ cần ra lệnh là có kết quả.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Không thể mở rộng quy mô
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bề mặt mượt mà đã che dấu đi một cỗ máy đang rỉ sét. Vibecoding đang tạo ra &lt;strong&gt;nợ kỹ thuật&lt;/strong&gt; ở tốc độ chưa từng có trong lịch sử phần mềm.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Một vài lí do đã tạo ra các repo rác, code rác, khó scale up
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Sự sụp đổ của System Architecture
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;AI rất xuất sắc trong việc viết các đoạn mã chức năng nhỏ lẻ, nhưng hoàn toàn thiếu khả năng thiết kế hệ thống một cách toàn diện và tổng thể bao quát.&lt;/li&gt;
&lt;li&gt;Hệ thống chắp vá từ hàng ngàn đoạn mã rời rạc → Điều này dẫn đến các logic bị lặp lại, luồng dữ liệu rối rắm và tạo ra &lt;strong&gt;spaghetti code&lt;/strong&gt;. Không có tầm nhìn kiến trúc bao trùm, mỗi prompt mới lại làm gãy vỡ cấu trúc cũ&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Tạo ra cơn ác mộng mang tên Debug
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Mã nguồn hoạt động được chưa chắc là mã sạch. Việc tìm lỗi trong một hệ thống mà không phải do bạn xây dựng chẳng khác nào mò kim đáy bể.&lt;/li&gt;
&lt;li&gt;Và điều này cũng dẫn đến việc biến bản thân thành trò hề trong chính mã nguồn của mình → Khi lập trình viên không tự tay viết các logic cốt lõi, họ không hiểu luồng xử lý thật sự. Việc sửa một lỗi nhỏ mất thời gian gấp 10 lần vì họ phải &lt;strong&gt;học lại&lt;/strong&gt; chính hệ thống do mình tạo ra.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. Tạo ra các lỗ hổng bảo mật
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Bề ngoài trong có vẻ tốt nhưng bên trong chưa chắc ổn định. Các Vibecoders hiếm khi check kỹ lưỡng các trường hợp ngoại lệ&lt;/li&gt;
&lt;li&gt;Các mô hình ngôn ngữ lớn thường xuyên bị &lt;strong&gt;ảo giác&lt;/strong&gt; tạo ra các thư viện không tồn tại hoặc sử dụng các phiên bản cũ → Các lỗ hổng được tạo ra giúp hacker dễ dàng xâm nhập, hay cho cái gọi là &lt;strong&gt;code vẫn chạy được&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Sự thui chột kỹ năng cốt lõi (làm ngu đi) =))))
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Đây là cái giá phải trả đắt nhất trong tương lai. Sự phụ thuộc vào AI hiện nay đang làm xói mòn khả năng tư duy và giải quyết vấn đề một cách độc lập.&lt;/li&gt;
&lt;li&gt;Mất đi khả năng tư duy thuật toán: Các lập trình viên dẫn mất đi khả năng tư duy độc lập. Khi một vấn đề khó, trừu tượng phức tạp xuất hiện vượt ngoài khả năng xử lý của AI → Vibecoders bó tay chịu thua =))))&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Cạm bẫy MVP, Prototype với doanh nghiệp
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Vibecoding tạo ra các sản phẩm MVP tuyệt vời, nhưng lại là thảm họa khi triển khai thành production.&lt;/li&gt;
&lt;li&gt;Chi phí triển khai đập đi xây lại quá tốn kém: Nợ kỹ thuật tích lũy theo &lt;strong&gt;cấp số nhân&lt;/strong&gt; khiến việc bảo trì trở nên khó khăn. Cuối cùng doanh nghiệp phải bỏ ra số tiền lớn thuê người có chuyên môn viết lại toàn bộ mã nguồn hệ thống.&lt;/li&gt;
&lt;li&gt;Khi có lỗ hổng khiến dữ liệu rò rỉ hay hệ thống sụp đổ khi dùng Vibecoding, ai là người chịu trách nhiệm? AI hay là Vibecoders????&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;→ Sử dụng AI &lt;strong&gt;một cách thông minh&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Thay đổi phương pháp tiếp cận từ lười biếng sang có kỷ luật.&lt;/li&gt;
&lt;li&gt;Những Software Engineer thực thụ sử dụng AI vào các tác vụ lặp đi lặp lại, nhưng họ luôn là người kiểm soát AI theo System Architecture và Bussiness Logic của họ.&lt;/li&gt;
&lt;li&gt;Thiết lập các ràng buộc như phải review code, check syntax error,... do AI generate.&lt;/li&gt;
&lt;li&gt;Luôn xác định kiến trúc tổng thể dự án trước khi prompt cho AI bởi lập trình viên mới là những người có quyết định cao nhất về dự án.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Và lời cuối cùng tôi muốn truyền tải tới mọi người rằng:
&lt;/h3&gt;

&lt;p&gt;Các lập trình viên sử dụng AI không sai, nhưng hãy sử dụng nó để tạo ra các sản phẩm có giá trị thực tế, bởi một sản phẩm được tạo ra từ AI có giá trị cao khi được điều khiển bởi bộ não trí tuệ thực sự của con người!!!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>vibecoding</category>
      <category>programmers</category>
      <category>vibecoders</category>
    </item>
    <item>
      <title>Cookie, Session và Token-based authentication</title>
      <dc:creator>Đạt Trương Thành</dc:creator>
      <pubDate>Sun, 10 May 2026 04:29:12 +0000</pubDate>
      <link>https://dev.to/datweb07/cookie-session-va-token-based-authentication-je6</link>
      <guid>https://dev.to/datweb07/cookie-session-va-token-based-authentication-je6</guid>
      <description>&lt;h3&gt;
  
  
  1. Phân biệt Authentication và Authorization
&lt;/h3&gt;

&lt;p&gt;Rất nhiều lập trình viên mới hay nhầm lẫn hai khái niệm này:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authentication (Xác thực):&lt;/strong&gt; Ví dụ: Hành động bạn nhập Username và Password để đăng nhập vào hệ thống.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authorization (Phân quyền):&lt;/strong&gt; Ví dụ: Sau khi đăng nhập thành công, hệ thống kiểm tra xem bạn là Admin hay User thường, bạn có quyền xóa bài viết hay chỉ được xem.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Giao thức HTTP và vấn đề "Stateless"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Giao thức HTTP bản chất là &lt;strong&gt;Stateless&lt;/strong&gt;. Nghĩa là server xử lý xong một request là sẽ forget luôn client đó là ai. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nếu không có cơ chế lưu trữ lại trạng thái, mỗi lần bạn bấm sang một trang mới trên website, hệ thống sẽ lại bắt bạn đăng nhập lại. Để giải quyết vấn đề này, người ta sinh ra &lt;strong&gt;Cookie&lt;/strong&gt;, &lt;strong&gt;Session&lt;/strong&gt; và &lt;strong&gt;Token&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Cơ chế Cookie và Session
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cookie:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Là một đoạn dữ liệu nhỏ (khoảng vài KB) được Server yêu cầu Client (browse) lưu trữ lại ở dưới máy của người dùng.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mỗi khi Client gửi một request mới lên Server, nó sẽ tự động đính kèm các Cookie này theo. Nhờ đó, Server biết được request này đến từ ai.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Session:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lưu toàn bộ thông tin nhạy cảm ở phía Client (bằng Cookie) là rất nguy hiểm (dễ bị hack). Do đó, người ta sinh ra Session.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cách hoạt động:&lt;/strong&gt; Khi bạn đăng nhập thành công, Server sẽ tạo ra một vùng nhớ chứa thông tin của bạn (gọi là Session) và sinh ra một &lt;strong&gt;Session ID&lt;/strong&gt;. Server chỉ gửi cái &lt;strong&gt;Session ID&lt;/strong&gt; này về cho Client để lưu vào &lt;strong&gt;Cookie&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Các lần request sau, Client chỉ gửi Session ID lên. Server lấy Session ID này dò trong bộ nhớ/DB Session của mình để biết bạn là ai.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Token-based Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nhược điểm của Session:&lt;/strong&gt; Khi hệ thống scale lên nhiều Server, Server A lưu Session của bạn nhưng Server B thì không. Nếu request của bạn bị điều hướng sang Server B, bạn sẽ bị bắt đăng nhập lại.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Giải pháp Token (JWT - JSON Web Token):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Thay vì lưu trạng thái ở Server, sau khi đăng nhập thành công, Server sẽ gom thông tin của bạn (như ID, Role), &lt;strong&gt;mã hóa&lt;/strong&gt; và &lt;strong&gt;sign&lt;/strong&gt; bằng một khóa bí mật, tạo thành một chuỗi gọi là &lt;strong&gt;Token&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Server gửi Token này cho Client lưu lại (thường lưu ở Local Storage hoặc Cookie).&lt;/li&gt;
&lt;li&gt;  Lần sau gửi request, Client đính kèm Token này vào &lt;code&gt;Header&lt;/code&gt; (thường là &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  Server không cần tìm trong bộ nhớ nữa, chỉ cần dùng khóa bí mật để giải mã và kiểm tra chữ ký của Token là biết bạn là ai và có quyền gì.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ưu điểm:&lt;/strong&gt; Cực kỳ phù hợp cho Web API, các ứng dụng Mobile, và hệ thống Microservices vì nó hoàn toàn "Stateless" (Server không cần tốn RAM để nhớ người dùng).&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>authentication</category>
      <category>authorization</category>
      <category>cookie</category>
      <category>session</category>
    </item>
  </channel>
</rss>
