Các influencer muốn bạn nghĩ rằng bạn phải học hàng tá công nghệ khác nhau để trở thành một lập trình viên .NET thành công. Ngày nay, internet tràn ngập những “lộ trình” .NET bao gồm tất cả mọi thứ trừ cái bồn rửa chén: Azure, AWS, Redis, Docker, Postgres, GraphQL, gRPC, Dapper, ELK stack, CQRS, đủ thứ trên đời.
Có một số vấn đề với xu hướng này. Một là nó tạo ra sự sợ hãi và lo lắng rằng không thể trở thành một lập trình viên giỏi, bởi vì danh sách những thứ bạn “phải” biết đang tăng lên từng ngày. Nó cũng có thể khiến bạn tập trung vào những thứ sai lầm và lãng phí thời gian mà bạn có thể dành để thực sự cải thiện kỹ năng .NET của mình. Vấn đề khác là những tuyên bố này hoàn toàn sai về mặt khách quan. Tôi đã sử dụng .NET hơn 15 năm, trong đó 6 năm làm việc cho Microsoft, nơi tôi hiện là kỹ sư chính. Nếu tôi bị đánh giá bởi những gì các influencer gọi là kiến thức .NET tối thiểu, tôi thậm chí còn không đủ tư cách là một lập trình viên junior.
Tôi không nói đùa hay gì cả, nhưng chẳng phải bạn chỉ nên học Redis nếu bạn, kiểu như, làm việc với Redis? Bạn không cần phải học GraphQL để trở thành một lập trình viên .NET giỏi, nhưng bạn chắc chắn nên học cách quản lý bộ nhớ hoạt động như thế nào. Kafka và RabbitMQ là tùy chọn — biết cách async/await hoạt động mới là điều thiết yếu. Đừng hiểu lầm: đây đều là những công nghệ thú vị và thật tuyệt khi biết về chúng. Nhưng hầu hết các công nghệ có thể được học dễ dàng khi có nhu cầu thực sự. Điều thực sự quan trọng là làm chủ kiến thức về bản thân .NET, và đó là những gì bài viết này đề cập.
Mục lục
Cách đọc hướng dẫn này
Tôi sẽ chia sẻ với bạn danh sách các tài nguyên sẽ giúp bạn trở thành một lập trình viên .NET tuyệt vời. Mặc dù tôi đã cố gắng tóm tắt chỉ những điều cốt yếu, nhưng vẫn còn rất nhiều thông tin. Làm chủ mọi lĩnh vực tôi sắp nói đến sẽ mất vài tháng hoặc thậm chí vài năm, vì vậy đừng nản lòng sớm. Không thể học mọi thứ ngay lập tức — điều quan trọng là mở rộng kiến thức chuyên môn của bạn từ từ, từng chủ đề một.
Bạn có thể học các chủ đề tôi trình bày theo bất kỳ thứ tự nào. Ví dụ, nếu công việc của bạn yêu cầu viết mã hiệu suất cao, bạn có thể bắt đầu hành trình học tập bằng cách tập trung vào phần hiệu suất và công cụ. Hoặc nếu bạn muốn mở rộng kiến thức C# trước, bạn có thể bắt đầu với Tài nguyên học C#. Nếu bạn không chắc chắn, Khám phá nội bộ .NET là nơi tốt nhất để bắt đầu.
Trước khi bắt đầu: nếu bạn là người mới bắt đầu hoàn toàn với .NET, bài viết này có lẽ không dành cho bạn. Nếu bạn muốn học C#, tôi khuyên bạn nên xem khóa học video C# cho Người mới bắt đầu trên YouTube trước. Bây giờ chúng ta hãy bắt đầu.
Sách
Nếu bạn hỏi tôi mười năm trước đâu là cách tốt nhất để học .NET, tôi có lẽ sẽ nói bạn hãy đọc CLR via C#. Mặc dù nó vẫn là một trong những cuốn sách kỹ thuật yêu thích nhất của tôi, .NET đã thay đổi quá nhiều kể từ khi cuốn sách ra mắt đến nỗi tôi không thể tiếp tục giới thiệu nó như cách hiệu quả nhất để làm chủ .NET. Thực tế, tôi nghĩ rằng chất lượng của sách kỹ thuật đang giảm dần qua các năm, vì vậy ngày càng có ít cuốn sách mà tôi coi là phải đọc.
Tuy nhiên, nếu bạn thích đọc sách, vẫn còn một số cuốn xuất sắc ngoài kia! Nếu tôi phải giới thiệu chỉ một cuốn sách .NET, đó sẽ là Framework Design Guidelines. Được viết bởi các kiến trúc sư .NET, đây là bộ sưu tập các quy ước và thực hành tốt nhất để viết mã .NET chuẩn chỉnh. Điều nâng tầm cuốn sách này so với phần còn lại là nó đầy ắp các bình luận và chú thích từ những huyền thoại .NET như Jeffrey Richter, Joe Duffy, Rico Mariani, và Vance Morrison, trong đó họ giải thích không chỉ các thực hành tốt nhất, mà còn cả lý do đằng sau chúng.
Một cuốn sách khác tôi yêu thích là Writing High-Performance .NET Code. Khi nó ra mắt vào năm 2018, đây là hướng dẫn toàn diện nhất về hiệu suất .NET. Điều duy nhất khiến tôi không dám chắc chắn giới thiệu nó bây giờ là tôi đã không đọc lại nó từ đó, vì vậy tôi không chắc nó có còn phù hợp với thời điểm hiện tại hay không (tôi đoán là nó vẫn còn giá trị).
Khám phá nội bộ .NET
Tôi nghĩ chìa khóa để trở thành chuyên gia .NET là học cách mọi thứ hoạt động dưới nắp capo. Hiểu sâu về async/await, nội suy chuỗi (string interpolation), spans, và dọn rác (garbage collection) sẽ mang lại cho bạn siêu năng lực và giúp bạn nổi bật giữa đám đông. Đội ngũ .NET thường xuyên đăng tải các bài phân tích chuyên sâu trên blog của họ (thực ra, hầu hết là do Stephen Toub viết), và chúng đều tuyệt vời, không có ngoại lệ. Dưới đây là những bài tôi cho là quan trọng nhất:
- How Async/Await Really Works in C#
- String Interpolation in C# 10 and .NET 6
- ConfigureAwait FAQ
- An Introduction to System.Threading.Channels
- Understanding the Whys, Whats, and Whens of ValueTask
- All About Span: Exploring a New .NET Mainstay
Nếu bạn thích xem video, Deep .NET là bộ sưu tập các bài phân tích chuyên sâu về .NET hay nhất trên internet. Những video này bao gồm các chủ đề tương tự như các bài blog tôi đã đề cập và thậm chí còn nhiều hơn, vì vậy chúng chắc chắn đáng để bạn dành thời gian.
Tài nguyên học C#
Giả sử bạn đã biết những điều cơ bản về C#, việc tiến xa hơn khá đơn giản. Cho dù bạn muốn tìm hiểu về các tính năng mới của C# hay chỉ đơn giản là lấp đầy khoảng trống trong kiến thức của mình, bạn nên xem các trang sau:
Hai bài viết này mô tả các tính năng mới trong các phiên bản mới nhất của C# và .NET, nhưng tôi cũng khuyên bạn nên đọc về tất cả các phiên bản trước đó. Ngay cả khi bạn là một lập trình viên .NET giàu kinh nghiệm, tôi nghĩ bạn vẫn sẽ học được điều gì đó mới.
Cập nhật kiến thức
Trước hết, bạn không cần phải biết về mọi tính năng mới của runtime hay ngôn ngữ. Bạn hoàn toàn ổn ngay cả khi không bắt đầu sử dụng readonly ref struct, record types, hay pattern matching ngay lập tức. Nhưng tôi vẫn khuyên bạn nên định kỳ kiểm tra những gì đang diễn ra trong hệ sinh thái .NET. Không cần thiết phải làm điều này hàng tuần hay thậm chí hàng tháng — làm điều này mỗi năm một lần là quá đủ.
Nguồn thông tin chính của bạn nên là blog .NET (các blog khác thường chọn lọc ngẫu nhiên các thông tin từ các bài đăng chính thức của .NET). Tuy nhiên, không phải mọi thứ trên blog .NET đều cần đọc. Đối với tôi, những bài viết hữu ích nhất là những bài giới thiệu các cải tiến trong các phiên bản .NET mới nhất. Những điểm nhấn cá nhân của tôi là các loạt bài sau:
- Performance Improvements in .NET 9
- .NET 9 Networking Improvements
- What’s new in System.Text.Json in .NET 9
- File IO improvements in .NET 6
Đây chỉ là những bài đăng mới nhất trong loạt bài — nếu bạn thích chúng, tôi rất khuyên bạn nên đọc các bài trước đó trong cùng loạt bài.
Làm chủ các thư viện quan trọng
Để trở thành một lập trình viên .NET hiệu quả, việc thành thạo thư viện chuẩn (standard library) quan trọng hơn là quen thuộc với bất kỳ thư viện bên ngoài cụ thể nào. Chắc chắn đáng để học các API hiện đại cho JSON serialization và deserialization. Học cách sử dụng HttpClient đúng cách cũng rất cần thiết — điều này nghe có vẻ hiển nhiên, nhưng thực tế lại khó làm đúng một cách đáng ngạc nhiên. Dưới đây là các bài viết tôi khuyên dùng về viết mã mạng đáng tin cậy và tránh các cạm bẫy phổ biến:
- Guidelines for using HttpClient
- IHttpClientFactory with .NET
- Build resilient HTTP apps: Key development patterns
Bên ngoài thư viện chuẩn, Newtonsoft.Json vẫn được sử dụng rộng rãi đến nỗi rất hữu ích nếu ít nhất bạn biết cách sử dụng nó một cách tối ưu cho hiệu suất.
Viết mã hiệu suất cao
Modern .NET cực kỳ nhanh. Thực tế, tôi có thể nói rằng hiệu suất cao là một trong những đặc điểm nổi bật của nó, vì vậy việc hiểu cách tận dụng tối đa các tính năng hiệu suất cao của nền tảng là rất xứng đáng.
Các bài blog hàng năm của Stephen Toub về cải thiện hiệu suất trong .NET là một trong những tài nguyên quý giá nhất để học về hiệu suất .NET. Mặc dù chúng được đăng dưới dạng blog, nhưng chúng thực sự là những cuốn sách được ngụy trang — bài mới nhất dài hơn 300 trang. Trừ khi bạn có thời gian rảnh không giới hạn, đọc chúng từ đầu đến cuối gần như là không thể. Cách tôi khuyên dùng để tiếp thu các bài viết này là lướt qua các chủ đề và đọc kỹ các phần khơi gợi sự tò mò của bạn. Điều đó có nghĩa là gì? Nếu bạn là một người đam mê tối ưu hóa trình biên dịch, bạn có thể muốn đọc các phần về cải tiến JIT và PGO mới nhất. Nhưng nếu bạn đang tìm kiếm kiến thức thực tế có thể áp dụng ngay vào dịch vụ backend của mình, bạn có thể đọc các phần về cải tiến JSON và mạng.
Viết mã .NET nhanh nhất có thể đòi hỏi hiểu cách dọn rác (garbage collection) hoạt động. Tài liệu chính thức về dọn rác rất tuyệt vời: dễ đọc và rất kỹ lưỡng. Nó sẽ dạy bạn cách các thế hệ (generations) hoạt động, large object heap là gì, sự khác biệt giữa workstation và server garbage collection, và nhiều hơn nữa. Nhưng tài liệu quan trọng nhất để làm chủ bộ nhớ trong .NET là tài liệu .NET Memory Performance Analysis được viết bởi Maoni Stephens, kiến trúc sư GC của .NET. Đây là hướng dẫn tối thượng về cách tiếp cận phân tích hiệu suất bộ nhớ, và là một trong những cách tốt nhất để đào sâu hiểu biết của bạn về cách bộ nhớ hoạt động trong .NET.
Cuối cùng, điều quan trọng là học cách đo lường hiệu suất một cách chính xác. BenchmarkDotNet là vị vua không thể tranh cãi của benchmarking .NET và là một trong số ít thư viện mà mọi người nên sử dụng. Tuy nhiên, biết cách sử dụng BenchmarkDotNet chỉ là một nửa câu chuyện. Viết benchmark tốt không phải chuyện đơn giản và bạn có thể dễ dàng kết thúc với việc đo lường sai thứ. Đó là lúc Microbenchmark Design Guidelines của đội ngũ .NET phát huy tác dụng. Hãy coi tài liệu này như cuốn sách hướng dẫn BenchmarkDotNet bị thiếu — nó đi xa hơn cú pháp và dạy bạn cách thiết kế benchmark đúng cách. Kho lưu trữ GitHub .NET Performance cũng chứa tất cả các benchmark cho thư viện chuẩn .NET. Nếu bạn cần cảm hứng khi thiết kế benchmark, đây là nơi tốt nhất để bắt đầu.
Công cụ hữu ích
Tôi nghĩ mọi người nên có một trình dịch ngược (decompiler) trong hộp công cụ của mình. Nó hữu ích không chỉ cho việc reverse engineering, mà còn nếu bạn muốn học cách các câu lệnh có vẻ đơn giản như nội suy chuỗi hoạt động dưới nắp capo. Việc chọn decompiler là tùy thuộc vào bạn — cá nhân tôi thích ILSpy hơn.
Một công cụ không thể thiếu nữa là .NET Source Browser. Tôi thường sử dụng nó để kiểm tra cách các lớp .NET được triển khai và tìm kiếm các ví dụ về mẫu thiết kế mã tốt. Mặc dù mã nguồn .NET có sẵn trong kho lưu trữ GitHub .NET Runtime, trình duyệt mã nguồn giúp việc điều hướng dễ dàng hơn nhiều.
Công cụ của .NET Framework khá là sơ sài. Ngược lại, .NET Core đi kèm với một số công cụ chẩn đoán tuyệt vời. Bạn rất có thể sẽ không sử dụng tất cả chúng trong công việc hàng ngày, nhưng trong những hoàn cảnh thích hợp, chúng có thể cực kỳ hữu ích. Ít nhất, bạn nên biết những công cụ nào tồn tại. Như vậy, nếu bạn cần thu thập một memory dump, bạn sẽ biết mình có thể sử dụng dotnet-dump. Hoặc nếu bạn cần gỡ lỗi các thread mất kiểm soát, dotnet-stack có thể chụp lại stack của tất cả các thread trong một tiến trình .NET.
Kết luận
Tôi hy vọng bài viết này không quá choáng ngợp! Nhưng thông điệp chính của tôi rất đơn giản: hãy tập trung vào việc có một nền tảng vững chắc và bạn sẽ thành công. Hy vọng rằng, bạn cũng đã khám phá ra một số tài nguyên học tập mới và thú vị. Hãy cho tôi biết nếu tôi bỏ sót điều gì mà bạn cho là thiết yếu!



