views:

158

answers:

3

I suppose this question is pretty subjective, but I think there is bound to be a path that most people consider sensible.

I've been working with C# and ASP.NET for about 3 years, but I've only just started REALLY studying it. My goal is to become a guru in say... 5-10 years. What skills should I have? What should I make sure I have a full understanding of? What types of applications should I make to test myself? Are there any other languages that I should learn to increase my understanding/ability in C#?

Additionally, is there a particular order to learn the skills in? Say, hypothetically:

  • Learn C# to an intermediate level
  • Learn C++/C for a more base level understanding
  • Learn CIL to understand what the compiler is doing to your C#

Etc. etc.

I appreciate any help you guys could give me. Any book/blog/website recommendations, anything really.

+2  A: 

As far as C# goes, I suggest learning things that interest you. Think about your long-term goals; if you just want to look appealing to an employer, then learn pretty much everything to a decent extent. The following are simply suggestions of advanced topics you should learn on top of the intermediate C# concepts and .NET technologies. Learn how to use and implement generics, interfaces, abstract classes, and all that... prior to diving deep into what I'm about to mention.

One thing a lot of people overlook is threading. Threading is rather difficult to master, but it's definitely being needed now and will continue to become higher demand in the future with the increase in availability of multi-processor computers. Technologies inside .NET which relate to threading are the Task Parallel Library (TPL), PLINQ, and the good ol' System.Threading namespace.

If you want to learn something that many people don't even investigate, try socket programming. Socket programming basically allows you to enable your applications to communicate over the Internet. You would want to research the advantages and disadvantages of the most used protocols (TCP and UDP and SCTP). Additionally, you should invest the time to learn asynchronous sockets and not just synchronous or thread per client models.

Security is a topic that interests me and many others, but employers usually overlook this nice skill. The .NET framework exposes System.Security.Cryptography, which allows you access to various cryptographic algorithms (symmetric and asymmetric ciphers and hash algorithms). I suggest reading into the topic of cryptography before truly getting into this, but it's still fun to play around with even if you don't understand how to utilize it in a truly secure manner. If you wanted to learn about cryptography as a subject, I suggest Bruce Schenier's "Applied Cryptography" book, or his other book titled "Cryptography Engineering"; both are fantastic.

You could learn more about the Windows Communication Foundation, because employers love that sort of thing. MCPD/MCSE certifications for .NET are a good way to get a base level understanding of random topics and are a way to explore what it is out there to see if anything piques your interest. One thing that people find easy is developing Windows Forms or Windows Presentation Foundation applications, but the truth is it is a large topic and should be explored or at least understood at a basic level by pretty much every C# software engineer.

These are my views and of course are limited to the scope of my interest, so there is quite a bit of bias. But learning the aforementioned would definitely give you a huge advantage over other people, when it comes to C#, as these are the most difficult and often ignored concepts and technologies in the .NET and C# world.

Take care!

JNZ
Good ideas. I would just add that there is a *lot* more to security than crypto. One of the things you learn when you study secure design is that crypto solves a *small* number of problems *extremely well* and is lousy at everything else. It actually is not useful for the vast majority of security problems; most security problems do not involve tamper-resistent transmission of secret messages.
Eric Lippert
Cryptography however, is usually the most immediately valuable aspect of security to become involved with. When looking at the large spectrum of things, security is a wide topic obviously, but fortunately for those of us well versed in cryptography, we can see that the basis for most information security problems in the world is the application or implementation of cryptographic primitives and schemes. I doubt cases such as overflow vulnerability resolution and other similar issues come close to matching the volume of use in Internet data encryption.
JNZ
+7  A: 

Start answering questions on Stack Overflow. If you see a question in your area you don't know the answer to, learn it. Do that for a few years and pretty soon you will be the guy who knows all the answers to common questions.

Eric Lippert
This is very good advice actually, I had considered starting to do that. Although trying to answer every question will leave you with a lot of specific knowledge in random areas of various programming languages. :)
Liggi
@Liggi: Good point. If you want to be a "guru" then pick a small area and go deep. (I've chosen "design and implementation of the C# language" as my "go deep" area.) Some people prefer going broad to going deep. Which kind of person are you?
Eric Lippert
@Eric Lippert, I just realised you are the owner of the blog I have just been reading. Nice to e-meet you. I think initially going broad is a good idea for me, but as I progress I suspect there will be a "go deep" area I will need to find.
Liggi
+1  A: 

I'm far from an expert, but I found myself in the same situation a couple of years ago. There were two things that happened around the same time that really lit a fire under me.

1) I started reading Eric Lippert's blog. Once I started getting a taste for why things in the C# compiler worked the way they do, I became much more interested in learning more. Suddenly programming became less about magic and hand-waving, and more about deeply understanding what's going on behind the scenes.

2) I started using ReSharper. Suddenly my code was decorated with all sorts of hints and suggestions. This led me to want to understand why the suggestions were being made (and no, they are not always valid or valuable). For example, its insistence on wanting to turn some nested loops into LINQ statements is what really drove me to learn about LINQ. Caveat: This is not a plug for ReSharper - similar products would do the same thing, and even better would be to have your code reviewed by an expert who can really advise you.

Rob H
ReSharper looks really interesting! Thanks for that man.
Liggi