Những người có ảnh hưởng 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 nhà phát triển .NET thành công. Ngày nay, internet đầy những “lộ trình” .NET bao gồm mọi thứ có thể: Azure, AWS, Redis, Docker, Postgres, GraphQL, gRPC, Dapper, ELK stack, CQRS, bạn cứ nói tiếp đi.
Có một số vấn đề với xu hướng này. Một là nó tạo ra nỗi sợ và lo lắng rằng không thể trở thành một nhà phát triển giỏi, vì danh sách những thứ bạn “phải” biết ngày càng dài thêm. 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ùng để 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 về mặt khách quan là sai. 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ư trưởng. Nếu tôi bị đánh giá bởi những gì người có ảnh hưởng gọi là kiến thức .NET tối thiểu, tôi thậm chí còn không đủ tiêu chuẩn là nhà phát triển cơ sở.
Tôi không đùa hay gì cả, nhưng chẳng phải bạn chỉ nên học Redis nếu bạn, à, làm việc với Redis sao? Bạn không cần phải học GraphQL để trở thành nhà phát triể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 thế nào. Kafka và RabbitMQ là tùy chọn—biết cách async/await hoạt động mới là thiết yếu. Đừng hiểu lầm tôi: đây đều là những công nghệ tuyệt vời và việc làm quen với chúng thật tuyệt. Nhưng hầu hết các công nghệ có thể dễ dàng học được 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ề chính .NET, và đó là điều bài viết này nói đến.
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 nhà phát triển .NET xuất sắc. Mặc dù tôi đã cố gắng tóm tắt chỉ những điều cần thiết, nhưng vẫn là rất nhiều thông tin. Làm chủ mọi lĩnh vực tôi sắp nói đến sẽ tốn của bạn nhiều tháng thậm chí nhiều năm, vì vậy đừng nản chí sớm. Không thể học mọi thứ ngay lập tức—điều quan trọng là mở rộng 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 các 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á bên trong .NET là nơi tốt nhất để bắt đầu.
Trước khi chúng ta 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 YouTube C# for Beginners trước. Giờ hãy bắt đầu.
Sách
Nếu bạn hỏi tôi mười năm trước cách tốt nhất để học .NET là gì, tôi có lẽ đã nói bạn nên đọ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 rất nhiều kể từ khi cuốn sách ra đời đến nỗi tôi không thể còn khuyến nghị nó như cách hiệu quả nhất để làm chủ .NET. Thực tế, tôi nghĩ chất lượng sách kỹ thuật đã giảm dần qua nhiều năm, vì vậy ngày càng ít sách mà tôi coi là phải đọc.
Dù vậy, nếu bạn thích đọc sách, vẫn có một số cuốn tuyệt vời ngoài kia! Nếu tôi chỉ được khuyến nghị 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 quy ước và phương pháp hay nhất để viết mã .NET đúng chuẩn. Đ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 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ỉ phương pháp hay nhất mà còn 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 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 thể phê duyệt nó ngay bây giờ là tôi chưa đọc lại nó kể từ đó, vì vậy tôi không chắc nó có còn phù hợp ngày nay không (tôi đoán là vẫn có liên quan).
Khám phá bên trong .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 lớp vỏ bọc. Đạt được hiểu biết sâu sắc về async/await, string interpolation, spans và garbage collection sẽ cho bạn sức mạnh siêu nhiên và giúp bạn nổi bật giữa đám đông. Nhóm .NET thường xuyên xuất bản các bài phân tích sâu trên blog của họ (thực ra, trong hầu hết trường hợp chỉ là Stephen Toub), và chúng đều tuyệt vời, không ngoại lệ. Đây là những bài tôi coi 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 rõ ràng là bộ sưu tập phân tích sâu .NET tốt nhất trên internet. Những video này bao gồm các chủ đề giống như các bài đăng trên blog tôi đã đề cập và thậm chí 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#, tiến xa hơn khá đơn giản. Dù bạn muốn tìm hiểu về các tính năng mới của C# hay chỉ lấp đầy khoảng trống kiến thức, 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à nhà phát triển .NET có 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 biết về mọi tính năng runtime hoặc ngôn ngữ mới. Bạn sẽ hoàn toàn ổn ngay cả khi bạn không bắt đầu sử dụng readonly ref struct, kiểu record hoặc 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 hoặc 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à .NET blog (các blog khác thường chỉ chọn các mảnh thông tin ngẫu nhiên từ các bài đăng .NET chính thức). Tuy nhiên, không phải mọi thứ trên .NET blog đều bắt buộc phải đọc. Đối với tôi, những bài đăng mang tính khai sáng nhất là những bài thể hiện các cải tiến trong các phiên bản .NET mới nhất. Những điểm nổi bật cá nhân của tôi là các chuỗ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 chuỗi—nếu bạn thích chúng, tôi rất khuyên bạn nên đọc các bài đăng trước đó trong chuỗi.
Thành thạo các thư viện chính
Để trở thành nhà phát triển .NET hiệu quả, việc thành thạo thư viện chuẩn quan trọng hơn là làm quen 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 and deserialization. Học cách sử dụng HttpClient chính xác cũng thiết yếu—nghe có vẻ hiển nhiên, nhưng đúng là khó một cách đáng ngạc nhiên. Đây là các bài viết được khuyến nghị của tôi 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
Ngoài thư viện chuẩn, Newtonsoft.Json vẫn được sử dụng rộng rãi đến mức rất hữu ích để ít nhất biết cách sử dụng nó tối ưu cho hiệu suất.
Viết mã hiệu suất cao
.NET hiện đại cực kỳ nhanh. Thực tế, tôi sẽ nói rằng hiệu suất cao là một trong những đặc điểm xác định 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à đáng giá.
Các bài đăng blog hàng năm của Stephen Toub về cải tiến hiệu suất trong .NET là một trong những tài nguyên giá trị nhất để học về hiệu suất .NET. Mặc dù chúng được xuất bản dưới dạng bài đăng trên blog, nhưng thực sự chúng là những cuốn sách 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, việc đọc chúng từ đầu đến cuối gần như là không thể. Cách tiêu thụ các bài đăng này được khuyến nghị của tôi 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ề những 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 lập tức trong 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ể yêu cầu hiểu cách garbage collection hoạt động. Tài liệu chính thức về garbage collection rất tuyệt: dễ đọc và rất kỹ lưỡng. Nó sẽ dạy bạn các thế hệ hoạt động thế nào, large object heap là gì, sự khác biệt giữa garbage collection workstation và server là gì, và nhiều hơn nữa. Nhưng tài nguyên xác định để 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à 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 hiệu suất chính xác. BenchmarkDotNet là vua không tranh cãi của .NET benchmarking và 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 đơn giản và bạn có thể dễ dàng kết thúc việc đo lường sai thứ. Đó là nơi Microbenchmark Design Guidelines của nhóm .NET phát huy tác dụng. Hãy coi tài liệu này như sổ tay BenchmarkDotNet bị thiếu—nó vượt ra ngoài 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ả benchmark cho thư viện chuẩn .NET. Nếu bạn từng cần cảm hứng khi thiết kế benchmark, đó 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 decompiler trong bộ công cụ của mình. Nó hữu ích không chỉ để reverse engineering mà còn nếu bạn muốn học cách các câu lệnh tưởng như đơn giản như string interpolation hoạt động dưới lớp vỏ bọc. Lựa chọn decompiler 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 ví dụ về các 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 nguồn giúp điều hướng dễ dàng hơn nhiều.
Công cụ của .NET Framework khá 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 phù hợp, chúng có thể cực kỳ tiện lợi. Ít nhất, bạn nên biết những công cụ nào tồn tại. Bằng cách đó, nếu bạn từng cần thu thập memory dump, bạn sẽ biết bạn có thể sử dụng dotnet-dump. Hoặc nếu bạn cần gỡ lỗi các thread chạy mất kiểm soát, dotnet-stack có thể chụp stack của tất cả thread trong một process .NET.
Kết luận
Tôi hy vọng bài viết này không quá áp đảo! Nhưng thông điệp chính của tôi rất đơn giản: tập trung vào nền tảng vững chắc và bạn sẽ ổn thôi. Hy vọng bạn cũng khám phá được 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 bất cứ điều gì bạn coi là thiết yếu!



