Phân tích từ Code "chạy được" đến Code "hoàn hảo"

Công nghệ - 29/09/2025 09:03:35

Từ Code "chạy được" đến Code "hoàn hão" 

Sau hơn thập kỷ "cày cuốc" với .NET, Database và đủ loại hệ thống, từ monilithic đến microservices, tôi đã chứng kiến vô số lần tranh cãi về "code tốt" là gì. 
Có lẽ, hành trình của mỗi developer luôn được thể hiện qua: Code chạy Được đến Code "Hoàn Hảo".

Chào các bạn, trong các bài post trước, tôi đã giới thiệu ngắn gọn về sự khác biệt trong tư duy code giữa junior và senior devs. Hôm nay, tôi muốn chia sẻ về một chủ đề mà tôi nghĩ sẽ hữu ích cho cả junior và senior developers: sự khác biệt trong tư duy lập trình giữa code chỉ "chạy được", và code "perfect". Đây cũng chính là yếu tố phân biệt rõ ràng giữa yếu tố phân biệt rõ ràng giữa junior và senior devs.

Tôi sẽ đưa ra và phân tích một số case study để chúng ta cùng phân tích nhé.


Code "chạy được" (Just Works): chỉ tập trung vào chức năng cơ bản, thiếu chất lượng và Best Practices

Các bạn developers mới thường ưu tiên làm code hoạt động nhanh chóng, mà chưa chú trọng đến chất lượng. Đây là giai đoạn "survival", code chạy đúng là thành công, nhưng dễ dẫn đến technical debt.

Hãy lấy ví dụ từ .NET trong .NET, một junior dev có thể viết method đơn giản để lấy dữ liệu users:

Nội dung bài viết

Nó bình thường và chạy được đúng không :) Giờ ta thử phân tích kỹ hơn:

  • Vấn đề Performance: Query SQL dùng SELECT * trả ra toàn bộ bảng, không tối ưu khi dữ liệu lớn, bảng nhiều trường, nhiều cột. Và trong .NET, không sử dụng async/await dẫn đến blocking I/O, làm app chậm khi concurrent requests cao.
  • Security Risks: Không dùng parameterized queries (dễ SQL injection). Connection string hard-coded, không dùng configuration.
  • Readability & Maintainability: Không có comment, không tuân thủ naming conventions (như PascalCase cho methods). Không có exception handling, nếu connection fail, app crash.
  • Testing: Không có unit test. Junior chưa nghĩ đến mock DbContext với Entity Framework để test isolated.
  • Scalability: Khi app scale, method này có thể gây connection pool exhaustion vì không dispose đúng cách (mặc dù using có giúp, nhưng chưa optimize).

 

Code một cảm giác tuyệt vời, một cú "hit" dopamine đầu tiên. Thông thường, nó mang những đặc điểm dễ nhận thấy:

  • Tập trung vào "cái gì" (what), không phải "như thế nào" (how).
  • Có thể lặp code (vi phạm nguyên tắc DRY - Don't Repeat Yourself).
  • Logic phức tạp, khó hiểu, thiếu comment.
  • Không xử lý hết các trường hợp ngoại lệ.
  • Hiệu năng chưa được quan tâm (ví dụ: query N+1 trong vòng lặp là một "đặc sản").

 

Tuy nhiên từ kinh nghiệm cho thấy, trong dự án, code kiểu này dẫn đến timeout khi traffic tăng, techdebt, có khi buộc phải refactor toàn bộ.

Code "tối ưu trong phạm vi" (Optimized Within Constraints): cân bằng Best Practices, Performance, và thực tế dự án

Là senior developers, chúng ta không chỉ làm code chạy mà còn tối ưu trong giới hạn thời gian, ngân sách, và team skills. Tư duy thực dụng: áp dụng best practices như code chỉnh chu, comment chi tiết, unit/integration test đầy đủ, và query performance-tuned, nhưng không over-engineer.

Refactor ví dụ trên trong .NET với Entity Framework Core (EF Core) và SQL tối ưu:

Nội dung bài viết

Phân tích kỹ hơn đoạn code trên:

  • Performance Optimization: dùng async/await và EF Core để tránh blocking. Đồng thời, Query SQL với index trên age (index scan thay full scan), pagination (OFFSET/FETCH) để handle large datasets, giảm thời gian từ giây xuống ms với giảm cả triệu records. Sử dụng projection (Select specific columns) để minimize data load.
  • Security & Best Practices: Parameterized auto từ EF, tránh injection. Dependency injection cho DbContext và Logger. Comment xml-style cho để dễ đọc hơn.
  • Maintainability: Tuân thủ SOLID (Single Responsibility, method chỉ làm 1 việc). Exception handling với custom exception và logging (e.g., Serilog hoặc Application Insights).
  • Testing: Viết unit test với xUnit/Moq: Mock DbSet để test query logic mà không hit real DB. Integration test với InMemoryDatabase để verify SQL generated.
  • Trade-offs: Không dùng stored proc nếu EF đủ tốt (giảm complexity). Nếu budget cho phép, thêm caching (DistributedCache) cho frequently accessed data. Và cân nhắc business: Optimize chỉ nếu query chạy thường xuyên.

 

Khi đã có kinh nghiệm, bạn không còn thỏa mãn với việc code chỉ "chạy được". Bạn bắt đầu đặt câu hỏi:

  • Nó chạy có nhanh không?
  • Người khác đọc có hiểu không?
  • Thêm tính năng mới có dễ không?
  • Hệ thống có chịu được tải lớn không?

 

Đây là lúc tư duy về chất lượngsự bền vững xuất hiện.

  • Áp dụng đủ thứ nguyên tắc thiết kế như SOLID, KISS, DRY.
  • Sử dụng cấu trúc dữ liệu và thuật toán phù hợp.
  • Viết code sạch, dễ đọc, dễ bảo trì (Clean Code).
  • Chú trọng performance: tối ưu câu lệnh SQL, sử dụng caching, xử lý bất đồng bộ (async/await trong .NET).
  • Viết Tests để đảm bảo sự ổn định.

 

Code "HOÀN HẢO" (The Myth of Perfection)

Code hoàn hảo luôn là dộng lực cho cải tiến liên tục, cả server side như .net, java,... hay client side framework như react, vuejs, angular,... nhưng tất cả đó chỉ là ảo tưởng, không tồn tại.

Ngay cả các framework đó cũng thay đổi từng ngày, từ .NET Framework đến .NET 8, từ Angular 13 đến 20, rồi 2 tháng nữa thôi là ra 21 rồi. Nhu cầu + yêu cầu thay đổi, và luôn có trade-offs. Chúng ta cần hiểu rằng pursue perfection có thể delay delivery.

  • Tại sao code perfect chỉ là ảo tưởng?: Code .NET "perfect" hôm nay (ví dụ, với LINQ) có thể kém performant khi data lớn, cần thay bằng Dapper cho raw SQL. Query SQL perfect có thể vulnerable với new attacks hoặc outdated với schema changes.
  • Rủi Ro: Over-optimize như viết custom ORM thay vì EF dẫn đến maintenance nightmare. Senior tránh gold-plating – ví dụ, không add full auditing nếu không thực sự dùng đến.
  • Approach thay thế: Evolutionary design, bắt đầu với code tốt nhất có thể đã, refactor via CI/CD (Azure DevOps). Tận dụng code reviews, static analysis (SonarQube) để cải thiện từng buớc. Trong database, monitor với Query Store để tuning queries liên tục qua từng ngày.

 

Junior vs Senior: không phải tuổi tác, mà là tư duy và kinh nghiệm xử lý tình huống

Trong lập trình các bạn junior thường tập trung functionality, code .NET, UI nhanh nhưng thường thiếu thiếu validation, test hay comment, query SQL cơ bản. Họ giỏi adopt những tính năng mới, nhưng cần học và có tầm nhìn xa hơn.

Trong khi đó, Senior dev xem xứt hệ thống toàn diện hơn, code .NET chỉnh chu với patterns (Repository, CQRS), validator cẩn thận trên UI, query tuned cho perf, align với business. Và họ mentor để build resilient teams. << làm được chi li như này, thì bạn đã là Senior rồi đấy.

Sự khác biệt lớn nhất giữa một Senior và một Junior không chỉ nằm ở kỹ năng code, mà nằm ở khả năng sự chi li, ra quyết định dựa trên bức tranh toàn cảnh, bao gồm cả kỹ thuật và con người.

Các bạn có đồng ý với quan điểm này không? Dựa vào đây chúng ta cùng thay đổi để bản thân tốt hơn, team tốt hơn được chứ :)

Hãy chia sẻ suy nghĩ và trải nghiệm của bạn ở phần bình luận bên dưới nhé!

#DotNetDeveloper #DatabaseOptimization #SeniorDev #CodeBestPractices #TechMentorship #LinkedInTech #1percentbetter

Công nghệ - 19/08/2025 21:13:07

Tìm hiểu cách xây dựng hệ thống phát hiện ngôn ngữ ký hiệu theo thời gian thực bằng AI, sử dụng DETR để tăng cường khả năng tiếp cận và đổi mới. Kết nối lời nói và cử chỉ.

Công nghệ - 18/08/2025 13:38:25

Tối ưu hóa các hệ thống RAG bằng cách tận dụng siêu dữ liệu để truy xuất thông tin chính xác và nhanh chóng hơn, giải quyết các thách thức về dữ liệu dư thừa hoặc lỗi thời với công cụ LangExtract nguồn mở. Khám phá cách LangExtract sử dụng các mô hình ngôn ngữ tiên tiến để trích xuất và cấu trúc siêu dữ liệu, tạo ra một quy trình truy xuất hợp lý và hiệu quả.

Công nghệ - 01/08/2025 07:00:00

Gỡ lỗi LLM rất quan trọng vì quy trình làm việc của chúng phức tạp và liên quan đến nhiều phần như chuỗi, lời nhắc, API, công cụ, trình truy xuất, v.v.

Công nghệ - 19/06/2025 03:05:09

Code xong chạy được là chưa đủ – phải biết khi nào nó "chết" nữa chứ 😅

Bạn đang triển khai ứng dụng trên Kubernetes, Docker hay môi trường production nào? Và bạn từng "toát mồ hôi" vì service chết mà không ai báo?

Công nghệ - 16/07/2025 13:41:17

Bạn có bao giờ tự hỏi tại sao trang web của mình tải chậm, đặc biệt là trên các thiết bị di động? Rất có thể, thủ phạm chính là những hình ảnh chưa được tối ưu. May mắn thay, có một công cụ miễn phí và cực kỳ hữu ích có thể giúp bạn giải quyết vấn đề này: Responsive Image Linter – một tiện ích mở rộng trên Chrome. Video này sẽ giới thiệu chi tiết về công cụ này, giúp bạn xác định và tối ưu hóa các hình ảnh gây tốn hiệu năng trên trang web của mình.

Công nghệ - 27/06/2025 03:15:44

⏳ Chậm 3 giây – Mất 50% người dùng. Đó không còn là lý thuyết, đó là thực tế.

Công nghệ - 11/12/2025 15:05:29

[Góc chuyện nghề] bán account game để đi học nghệ - bạn dám không?

Làm nghề 20 năm, gặp nhiều sinh viên, nhưng chiều qua tôi khá bất ngờ với một cậu em tên Quang. Em Quang muốn theo nghề BA và mong muốn lương 20 triệu sau khi làm việc 1.5 năm tới 2 năm trong nghề.

Công nghệ - 22/09/2025 08:59:20

Dừng ngay việc dùng DateTime.Now trong APIs, đó là ổ lỗi tiềm ẩn trong hệ thống của bạn

⏱️ Tôi từng nghĩ DateTime.Now là một thứ vô hại, đơn giản và tiện lợi, cho đến khi gặp những vấn đề về múi giờ. Những lỗi "tưởng chừng nhỏ" này lại chính là nguồn cơn của sự thất vọng và tốn kém thời gian cho nhiều đội ngũ phát triển.

Công nghệ - 14/03/2025 04:30:32

💡Bạn muốn tăng tốc tìm kiếm toàn văn nhưng hạ tầng hạn chế? Lucene có thể là giải pháp bất ngờ! Bài viết tiết lộ cách nó vượt trội hơn SQL Server, tối ưu truy vấn và những ứng dụng thực tế đáng khám phá.