A large part of my job is training. I’ve been doing that professionally on and off for the past 13 years. I remember the “good old days” of teaching C and C++, then COM (Component Object Model). These two, C++ and COM (with ATL, no doubt) where the backbone of any productive development on the Microsoft platform, and it all seemed to be possible to do, each with its own training course: 5 days of C++, 5 days of COM (non consecutive, as it’s pretty unrealistic to take some software guy and teach C++ then COM in straight 10 days), but it was possible to start from a C++ guy and get to a COM guy in 5 days.
Then came .NET. Teaching .NET 1.x, a new platform, with a new prominent language, C#, was also feasible. Such training lasted for 5 days as well. Attendees where typically C++ or Java developers, so it just meant learning the new platform, the new C# language – that seemed not too difficult, as C# has many common traits with C++ and Java. Some new concepts, such as garbage collection and finalization, delegates and reflection needed more explanation, as they did not exist in C++, or had different capabilities.
Then .NET 2.0 came along. And again, there was generics, that was inspired by C++ templates, but was very different in capabilities and implementation. C# 2.0 added some new features (not just for generics), such as anonymous delegates and iterators (a.k.a. yield). yield was typically not discussed, and that’s why even today when I teach advanced .NET/C# courses, I always talk about yield – people seemed to miss that powerful feature that is present since 2005. Again, 5 days was the training. This was more difficult – .NET 1.x features were not going away – so .NET 1.x and .NET 2.0 had to be covered.
Then came .NET 3.0. This added WCF, WPF, WF and CardSpace to the .NET arsenal. But the CLR was the same, C# was the same, so these topics were pushed to their own training courses: one for WCF, one for WPF, one for WF, and… CardSpace was usually discarded as being too odd, or at least not that useful.
And then came .NET 3.5. This had major additions, with LINQ and C# 3.0 coming to the fore. C# 3.0 had many new capabilities, most of them leading to LINQ. New training courses tried to cover that as well, all in 5 days. I found that to be very difficult. Starting with a C++ or Java developer, going through the basics of the .NET platform, C# and the CLR is hard enough. Adding LINQ was most of the time overwhelming, and understandably so. Most developers have very little (if any) experience with functional languages, so the concepts related LINQ seem alien, as they are not the usual “procedural” stuff.
Things like multithreading got much more important than before, because of the multicore machines that became the norm. But where would you add that stuff? It’s not just threading itself, it’s synchronization, patterns, the use of kernel objects and more. This may be pushed to an “advanced” course, but usually a basic coverage was pushed to the basic training.
I realized at that time that it was not realistic to get a C++/Java developer up to speed with basic .NET 3.5 and C# 3.0 in 5 straight days. But training centers mostly insisted on it, because clients don’t usually agree to more than 5 days of “lost work” and training costs.
Things weren’t getting better. With .NET 4, things got (naturally) worse. There’s C# 4.0, and more core libraries, such as MEF (Managed Extensibility Framework), that seem as “good to know”. And how about the new Task Parallel Library (TPL)? How does one cram all this in 5 days? Not possible, in my humble opinion.
As a consequence, I designed a 7 day course to cover .NET from the ground up, including all versions of C# and most core libraries, such as reflection and MEF. This, however, did not work well. Few companies agreed to let their employees be away for 7 days. Most see this as too expensive. But the real cost comes later, when developers are unprepared for the tasks ahead, or at least don’t use the best .NET has to offer, topics that could have been accomplished in the extra 2 days. Microsoft’s own MOCs support the 5 days idea – unrealistic, or at least, very superficial treatment of subjects.
The net result of this state of affairs, is that people want to know everything (or at least required to), but unwilling to take the required time to get there. The knowledge ramp is increasing. If we think about the other libraries that surround .NET, some of which essential to do actual work, such as WCF, WPF/Silverlight, ASP.NET (Web Forms, MVC), Entity Framework, WCF Data Services, WCF RIA Services…, the list goes on and on – it’s pretty difficult to become and all around developer. A novice stepping into Microsoft’s world has a lot to learn, and it’s not getting easier.
I believe training should be taken more seriously by the IT industry. It’s not an afterthought – it’s a necessity. And it saves money in the mid and long run. A shift in thinking is required.