Mục lục
Vấn đề với các “lộ trình học tập” hiện tại
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 lập trình viên .NET thành công. Ngày nay, internet đầy rẫy các “lộ trình học .NET” bao gồm mọi thứ từ Azure, AWS, Redis, Docker, Postgres, GraphQL, gRPC, Dapper, ELK stack, CQRS, và vô số thứ khác.
Có vài 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 lập trình viên giỏi, bở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à lẽ ra 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 trong 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ằng những gì mà những người có ảnh hưởng gọi là kiến thức .NET tối thiểu, tôi thậm chí không đủ tiêu chuẩn làm lập trình viên junior.
Tôi không đùa hay gì cả, nhưng chẳng phải bạn nên học Redis chỉ khi bạn, kiểu như, làm việc với Redis sao? Bạn không cần 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 là điều cần thiết. Đừng hiểu lầm tôi: đây đều là những công nghệ thú vị và việc làm quen với chúng là tuyệt vời. 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à nắm vững kiến thức về bản thân .NET, và đó là nội dung chính của bài viết này.
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 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, nó vẫn là rất nhiều thông tin. Nắm vững mọi lĩnh vực tôi sẽ nói đến sẽ mất hàng tháng hoặc thậm chí hàng 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 chuyên môn của bạn từ từ, chủ đề này đến chủ đề khác.
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á cấu trúc 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. Bây giờ hãy bắt đầu.
Sách
Nếu bạn hỏi tôi mười năm trước đây cách tốt nhất để học .NET là gì, tôi có lẽ đã nói vớ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 rất nhiều kể từ khi cuốn sách ra mắt đến nỗi tôi không còn có thể giới thiệu nó như cách hiệu quả nhất để nắm vững .NET. Thực tế, tôi nghĩ rằng chất lượng của sách kỹ thuật đã giảm dần trong những năm qua, vì vậy có ngày càng ít sách mà tôi coi là phải đọc.
Mặc dù vậy, nếu bạn thích đọc sách, vẫn còn một số cuốn sách xuất sắc ngoài kia! Nếu tôi chỉ phải giới thiệu 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à tập hợp các quy ước và thực tiễn tốt nhất để viết mã .NET theo phong cách ngôn ngữ. Đ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ừ các 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 tiễn 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, đó 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ê chuẩn 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 liệu 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á cấu trúc 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 bên dưới lớp vỏ. Đạt được sự hiểu biết sâu sắc về async/await, string interpolation, spans và garbage collection sẽ 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 xuất bản các bài phân tích sâu trên blog của họ (thường chỉ là Stephen Toub trong hầu hết các trường hợp), và chúng đều tuyệt vời, không có 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 chắc chắn là bộ sưu tập các bài phân tích sâu về .NET tốt nhất trên internet. Những video này bao gồm các chủ đề tương tự 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 kiến thức cơ bản về C#, việc tiến xa hơn khá đơn giản. Dù bạn muốn học về các tính năng mới của C# hay chỉ lấp đầy những 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 có kinh nghiệm, tôi nghĩ bạn vẫn sẽ học được điều gì đó mới.
Luôn cập nhật
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, record types, hoặc pattern matching ngay lập tức. Nhưng tôi vẫn khuyên bạn nên kiểm tra định kỳ 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ột 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ọn lọc ngẫu nhiên các thông tin từ các bài đăng .NET chính thức). Tuy nhiên, không phải mọi thứ trên blog .NET đều là bài đọc bắt buộc. Đối với tôi, những bài viết sáng tỏ 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 series 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 series – 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 series.
Nắm vững các thư viện chính
Để 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 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 và deserialization. Học cách sử dụng HttpClient chính xác cũng rất cần thiết – có vẻ hiển nhiên, nhưng thật ngạc nhiên là khó để làm đúng. Đây là các bài viết tôi đề xuất về việc viết mã mạng đáng tin cậy và tránh các lỗi thường gặp:
- 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 khi í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 sẽ mang lại lợi ích.
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, chúng thực sự là sách ngụy trang – bản cài đặt 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ư không thể. Cách tôi đề xuất để tiêu thụ các bài đăng này là quét qua các chủ đề và đọc kỹ các phần khơi dậy sự tò mò của bạn. Điều đó có nghĩa là gì? Nếu bạn là 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ác 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ế bạn 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ể đòi hỏi sự hiểu biết về cách garbage collection hoạt động. Tài liệu chính thức về garbage collection rất tuyệt vời: nó dễ đọc và rất kỹ lưỡng. Nó sẽ dạy bạn cách các thế hệ hoạt động, 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 dứt khoát để nắm vững 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 cuối cù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 thể tranh cãi của việc benchmark .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 là điều đơn giản và bạn có thể dễ dàng kết thúc bằng việc đo sai thứ. Đó là lúc Hướng dẫn thiết kế Microbenchmark của đội ngũ .NET phát huy tác dụng. Hãy coi tài liệu này như sổ tay BenchmarkDotNet còn 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 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 hộp 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 có vẻ đơn giản như string interpolation hoạt động bên dưới. Lựa chọn decompiler là tùy thuộc vào bạn – cá nhân tôi thích ILSpy.
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 các 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, source browser làm cho việc điều hướng dễ dàng hơn nhiều.
Công cụ của .NET Framework khá đơn giản. 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 của mình, nhưng trong những trường hợp 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 cần thu thập memory dump, bạn sẽ biết rằng bạn có thể sử dụng dotnet-dump. Hoặc nếu bạn cần debug các thread chạy mất kiểm soát, dotnet-stack có thể chụp stacks của tất cả các thread trong một quy trình .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 việc có 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á đượ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à cần thiết!



