Tôi đã chứng kiến không ít lần những dòng code "hoàn hảo" trên lý thuyết sụp đổ trong thực tế. Một nguyên tắc mà tôi luôn ghi nhớ và áp dụng trong sự nghiệp của mình là Murphy’s Law (ML): "Anything that can go wrong will go wrong" - hi vọng bạn cũng từng nghe tới.
Trong bài viết này, tôi sẽ giải thích Murphy’s Law trong lập trình, và đặt cùng các nguyên tắc phổ biến như SOLID, KISS, DRY, và cách áp dụng ML để viết code bền vững hơn nhé.
Murphy’s Law bắt nguồn từ kỹ thuật hàng không vũ trụ, và trong lập trình, nó nhắc nhở chúng ta rằng mọi giả định đều có thể sai, mọi lỗi đều có thể xảy ra, và hệ thống sẽ thất bại theo cách bạn ít ngờ tới nhất.
Ví dụ đơn giản:
ML không phải là bi quan, mà là một lời cảnh tỉnh để chúng ta chuẩn bị cho những tình huống tồi tệ nhất. Nó khuyến khích lập trình viên thiết kế hệ thống phòng thủ (defensive programming) và luôn đặt câu hỏi: “Điều gì sẽ xảy ra nếu…?”
Để hiểu rõ hơn về vai trò của ML, hãy đặt nó trong bối cảnh các nguyên tắc lập trình mà các bạn gặp hàng ngày như SOLID, KISS, DRY, và YAGNI:
ML không phải là một hướng dẫn thiết kế cụ thể mà là một tư duy phòng thủ. Nó nhắc nhở lập trình viên luôn chuẩn bị cho những tình huống xấu nhất, từ lỗi người dùng, lỗi hệ thống, đến các yếu tố bên ngoài như mất kết nối mạng hay phần cứng hỏng.
Điểm khác biệt: SOLID, KISS, DRY, YAGNI tập trung vào cách viết code tốt hơn, trong khi ML tập trung vào cách bảo vệ code khỏi thất bại. ML bổ sung một lớp tư duy thực tế cho các nguyên tắc khác.
Người dùng luôn tìm cách phá hệ thống, dù vô tình hay cố ý. ML nhắc nhở bạn kiểm tra mọi đầu vào kỹ lưỡng.
public void ProcessUserInput(string input)
{
if (string.IsNullOrWhiteSpace(input))
throw new ArgumentNullException(nameof(input), "Input cannot be empty.");
if (input.Length > 100)
throw new ArgumentException("Input is too long.", nameof(input));
// Xử lý input
}
Luôn giả định rằng mọi thứ có thể thất bại: API, cơ sở dữ liệu, file system, v.v. Sử dụng try-catch một cách thông minh.
public async Task<string> FetchDataAsync(string apiUrl)
{
try
{
using var client = new HttpClient();
return await client.GetStringAsync(apiUrl);
}
catch (HttpRequestException ex)
{
// Log lỗi và trả về giá trị mặc định hoặc thông báo
logger.LogError(ex, "Failed to fetch data from {ApiUrl}", apiUrl);
return string.Empty;
}
}
Khi một phần hệ thống thất bại, hệ thống vẫn nên hoạt động ở mức tối thiểu. Ví dụ, nếu dịch vụ gửi email bị lỗi, ứng dụng vẫn nên lưu giao dịch và thử lại sau.
public async Task SendEmailAsync(string recipient, string message)
{
try
{
await emailService.SendAsync(recipient, message);
}
catch (SmtpException ex)
{
// Lưu vào queue để thử lại sau
await queueService.EnqueueEmailAsync(recipient, message);
logger.LogWarning(ex, "Email sending failed, added to retry queue.");
}
}
ML khuyến khích bạn viết unit test để kiểm tra các trường hợp biên và sử dụng chaos engineering để mô phỏng lỗi hệ thống (ví dụ: tắt ngẫu nhiên một service trong môi trường staging).
[Fact]
public void ProcessUserInput_ThrowsException_WhenInputIsNull()
{
var processor = new InputProcessor();
Assert.Throws<ArgumentNullException>(() => processor.ProcessUserInput(null));
}
Khi điều tồi tệ xảy ra, bạn cần biết nó xảy ra ở đâu và tại sao. Sử dụng logging (ví dụ: Serilog) và monitoring (ví dụ: Application Insights) để theo dõi hệ thống.
public void CriticalOperation()
{
logger.Information("Starting critical operation...");
try
{
// Thực hiện thao tác
}
catch (Exception ex)
{
logger.Error(ex, "Critical operation failed.");
throw;
}
}
Dưới đây là một số thư viện .NET nổi bật hỗ trợ áp dụng Murphy’s Law, kèm theo cách chúng giúp giảm thiểu rủi ro từ những “thất bại không lường trước”.
Polly là một thư viện .NET mạnh mẽ để xử lý các lỗi tạm thời (transient faults) như mất kết nối mạng, timeout, hoặc lỗi HTTP 503 từ API bên thứ ba. Polly cung cấp các chính sách (policies) như Retry, Circuit Breaker, Timeout, và Fallback, giúp ứng dụng tự động phục hồi từ các sự cố.
Liên hệ với Murphy’s Law: Polly giúp bạn chuẩn bị cho những thất bại này bằng cách:
Serilog là một thư viện logging mạnh mẽ cho .NET, cho phép ghi lại thông tin chi tiết về hoạt động của ứng dụng, bao gồm cả các lỗi. Nó hỗ trợ ghi log vào nhiều đích khác nhau như file, console, hoặc các dịch vụ như Seq, Application Insights.
Liên hệ với Murphy’s Law: ML nhấn mạnh rằng khi lỗi xảy ra, bạn cần biết chuyện gì đã xảy ra và tại sao. Serilog giúp bạn:
FluentValidation là một thư viện để xác thực dữ liệu đầu vào trong .NET. Nó cung cấp cú pháp dễ đọc để định nghĩa các quy tắc xác thực, giúp đảm bảo dữ liệu hợp lệ trước khi xử lý.
Liên hệ với Murphy’s Law: FluentValidation cảnh báo rằng người dùng có thể nhập dữ liệu sai hoặc độc hại:
MediatR là một thư viện hỗ trợ triển khai pattern Mediator trong .NET, giúp tách biệt các thành phần trong ứng dụng và quản lý luồng xử lý yêu cầu (request handling). Nó thường được sử dụng trong kiến trúc CQRS (Command Query Responsibility Segregation).
Liên hệ với Murphy’s Law: MediatR nhắc nhở rằng logic phức tạp dễ dẫn đến lỗi:
Microsoft.Extensions.Diagnostics.HealthChecks là một thư viện tích hợp trong ASP.NET Core để kiểm tra sức khỏe (health checks) của ứng dụng, ví dụ: trạng thái cơ sở dữ liệu, API bên thứ ba, hoặc bộ nhớ.
Liên hệ với Murphy’s Law: Health checks giúp:
Để áp dụng ML một cách hiệu quả, bạn có thể kết hợp các thư viện trên trong một dự án. Ví dụ:
Ví dụ tổng hợp trên C#
public class OrderController : ControllerBase
{
private readonly IMediator _mediator;
private readonly IValidator<Order> _validator;
private readonly ILogger<OrderController> _logger;
public OrderController(IMediator mediator, IValidator<Order> validator, ILogger<OrderController> logger)
{
_mediator = mediator;
_validator = validator;
_logger = logger;
}
[HttpPost]
public async Task<IActionResult> CreateOrder(Order order)
{
var validationResult = _validator.Validate(order);
if (!validationResult.IsValid)
{
return BadRequest(validationResult.Errors);
}
try
{
var result = await _mediator.Send(new CreateOrderCommand { OrderId = order.Id });
return Ok(result);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to create order {OrderId}", order.Id);
return StatusCode(500, "An error occurred.");
}
}
}
Murphy’s Lawkhông chỉ là một lời cảnh báo, mà còn là một lời kêu gọi hành động để lập trình viên xây dựng các hệ thống bền bỉ.
Các thư viện như Polly, Serilog, FluentValidation, MediatR, và Microsoft.Extensions.Diagnostics.HealthChecks cung cấp các công cụ nhằm:
Bằng cách tích hợp những thư viện này vào quy trình phát triển, bạn không chỉ tuân thủ tinh thần của Murphy’s Law mà còn nâng cao chất lượng và độ tin cậy của ứng dụng.
Hãy nhớ: Anything that can go wrong will go wron - Nếu điều gì có thể sai, nó sẽ sai. Nhưng với các công cụ phù hợp, bạn có thể giảm thiểu thiệt hại và giữ cho hệ thống luôn hoạt động ổn định.
Bạn đã sử dụng thư viện nào để xử lý các kịch bản lỗi bất ngờ? Hãy chia sẻ kinh nghiệm của bạn trong phần bình luận nhé!
/Son Do - I share real-world lessons, team building & developer growth.
#MurphyLaw #DotNet #ProgrammingPrinciples #SOLID #KISS #DRY #YAGNI #DefensiveProgramming #Polly #Serilog #FluentValidation #MediatR #HealthChecks #SoftwareDevelopment #TechBlog #1percentbetter #wecommit100xshare
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
Công nghệ - 27/06/2025 03:15:44
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