Jon Skeet, a well-known C# developer, writes about C# features, date/time handling, dynamic typing, and why programming is hard.
HN commenters recommend his Edulinq series for learning by reimplementing LINQ, and cite his posts on C# async and programming difficulty.
> They either want a full system, or just a product.
While I think this is true at the moment, it seems that there is an interesting question behind that, as well. Why don't more people want to create their own software? I do think the author has an implicit point: because, frankly, creating software stinks. Jon Skeet's talk [1] demonstrates this admirably. I spend a shockingly large part of my time working around bugs and leaky abstractions in other software rather than implementing my own ideas.
I don't know if it is possible to design a system with a solid enough abstraction that these problems don't exist. I do know that HyperCard came unusually close, as I know several folks who made HyperCard stacks who wouldn't imagine creating software in any typical fashion.
I hold out hope that such a useful system could be created again, one that gives people enough flexibility to create software solutions of their own (perhaps within a genre of software) and that is able to combat the currently-accurate stigma of programming being "hard".
[1] http://msmvps.com/blogs/jon_skeet/archive/2009/11/02/omg-ponies-aka-humanity-epic-fail.aspx
C# is the lingua franca of .NET so you would be best off studying that first. It's still a simple language, especially if you know C++. I recommend "Pro Visual C++ 2005 for C# Developers" (it maps C# concepts to C++ but you can go the other way), "The C# Programming Language 4th Edition (with annotations)" and "C# in Depth". Then, of course, just solving problems with the language.
Next you want to get the latest edition of "CLR via C#" to get a very in depth look at how the CLR works.
Once you're comfortable with C# and the CLR, you can pretty much figure out how the major frameworks must work. For instance, you can understand about 90% of ASP.NET just by learning two classes and two simple interfaces.
Some other good online resources are:
http://stackoverflow.com/questions/9033/hidden-features-of-c
http://stackoverflow.com/users/88656/eric-lippert
http://stackoverflow.com/users/22656/jon-skeet
https://msmvps.com/blogs/jon_skeet/
http://blogs.msdn.com/b/ericlippert/
Oh, if you really want to accelerate your C# learning, try writing code without using `if`, `while`, `for`, `switch` and `goto` (obviously).
There are two standard rebuttals.
One is that the thickness of the vessels wall (hands-breadth) is not taken into account in the establishment of 3 as the value being used for pi despite this being mentioned right there in the text, this apparently gives a value of 3.1414 for pi.
The other is that 1 Kings 7:23 reference uses a special rendering of the term line (Hebrew numbers are expressed using letters) such that the ratio of line to ordinary line and the rendering in the text give the actual value as:
3 * 111/106
This gives Pi accurate to 0.00026%.
This all seems quite ex-post-facto but Hebrew has a strong tradition of numerology and this "special" variant of the word line is used only 3 times and always referring to circular objects.
---
Example references: (short) http://msmvps.com/blogs/coad/archive/2010/05/14/pi-in-the-bible.aspx, (longer) http://www.bibleprobe.com/pi.htm, (several refs) http://www.math.ubc.ca/~israel/bpi/bpi.html, (with alternate based on "hands-breadth") http://ldolphin.org/pi/index.html though I'm not sure on the original source.
The IoC threads work by converting park-able functions into Single-Static Assignment (SSA) form [1] and then compiled to a state machine. Essentially, each time a function is "parked", it returns a value indicating where to resume from. These little state machine functions are basically big switch statements that you don't need to write by hand. This design is inspired by C#'s async compilation strategy. See the EduAsync Series [2] on John Skeet's blog, and the compilation post [3] in particular. Once you have these little state machines, you just need some external code to turn the crank.
[1]: http://en.wikipedia.org/wiki/Static_single_assignment_form
[2]: http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx
[3]: http://msmvps.com/blogs/jon_skeet/archive/2011/05/20/eduasync-part-7-generated-code-from-a-simple-async-method.aspx
Programming is hard, period. Knuth has noted that its so difficult for him that when he is programming he can't teach courses, and he's among the best programmers in history.
Jon Skeet wrote a blog on the topic: http://msmvps.com/blogs/jon_skeet/archive/2009/01/29/programming-is-hard.aspx
Jon Skeet is right. Programming is hard, except the most trivial tasks. And anything that is not trivial is probably broken. But we're OK with things being a little broken, and we've made users bend to our will sufficiently now that we have pushed much of the cognitive load to the users.
I agree with this. At first glance the problems he presents are simple, then you realise all the design decisions they've made and the pros and cons of each approach they were aware of when writing C#.
On a footnote I also recommend Jon Skeet: Coding Blog - http://msmvps.com/blogs/jon_skeet/
He's known in the .Net community. He's the guy behind Tony the Pony. He's a Google staffer who has written some C# books. He goes into great depth about C# stuff.