How do we raise our game?

A couple of weeks ago, I was in the Seattle area for work reasons. I took the opportunity to meet up with a lot of smart folks, including some working on the Reactive Extensions team and the C# team. I asked pretty much the same question of almost everyone:

How is Microsoft intending to make developers smarter?

Let me explain what I mean a bit more clearly…

The problem

Now, let me be quite clear: I only have visibility of a small section of the community. In particular, I get to see:

  • Comments from blog readers
  • Questions and answers on Stack Overflow
  • MSDN forum posts (typically the Code Contracts and Reactive Extensions forums, and then only occasionally)
  • Random emails, often from C# in Depth readers
  • User group and conference attendees

Intuition would suggest that these are some of the more interested developers. Not necessarily the smartest, but ones who are at least engaged with the community. It’s been a while since I’ve worked in a regular company – I don’t think Google engineers are representative of software engineers as a whole – so I’m not going to suggest I have a good grasp of how able the "disengaged" engineers are. I doubt that they’re significantly smarter though.

My concern is that some of the new technologies that I’m getting excited by (in particular Parallel Extensions, Code Contracts and Reactive Extensions) may make it easier for awesome people to write awesome code – but leave everyone else behind. Even though I’m excited about Reactive Extensions, I still regularly get confused by it – this is partly a matter of thin documentation (a natural corollary of an API which is still under development; I’m sure it will improve markedly over time) but partly because a push model is simply harder to think about.

What can we do about it?

Taking Reactive Extensions as an example, how is anyone going to learn about Reactive Extensions to such a degree that they can really use it productively, rather than just for experimentation?

As I see it there are currently five main ways of disseminating information:

User groups and conferences

These are good for getting people interested – but they’re not really great at deep dives. To be absolutely cynical about it, I think they’re better at entertaining than educating. To be slightly more positive, they can be good at inspiring people to look further for themselves… but unless you have a relatively long session or start off with developers who already have a fair amount of experience in the topic, I don’t think they’re a great way of imparting detailed information. (Organisers of such events, please note that this is in no way a condemnation of events in general. I’m still interested in speaking at them – I just question their ability to create experts.)

Training courses

I have little experience of training courses – it could be that they’re highly effective – but they clearly don’t scale in terms of getting information to a wide audience. As training companies make their money by getting people to the courses in person, they’re unlikely to provide videos of the training to let everyone take advantage of an individual tutor’s experience. We can hope for a network effect here and in some of the other options, of course – an expert trains a novice, the novice gains experience and then trains other novices in their company. There’s a risk of truth dilution, but at least this has the possibility of reaching those who would otherwise never voluntarily learn about new technologies.

Blogs

Blogs can be effective, but are difficult to navigate and often outdated. The "navigation" problem is one of picking the right course through the posts in order to try to get a well-rounded knowledge of the subject in an appropriate order.

To give a concrete example, a large amount of the information available in C# in Depth is covered in significantly more detail in Eric Lippert’s blog – which is great for those who already know enough to read it, but it doesn’t provide a 1, 2, 3 experience for learning C# 2-4. (Aside: Over time I’ve been coming to the conclusion that treating a subject "in the round" with a carefully considered ordering is the primary feature of tech books these days – you can almost always find more detailed, accurate and timely information online if you know what you’re looking for.)

I’ve been tremendously impressed at the Microsoft developer blog output in the last few years. There are many well-written, informative and enlightening blogs out there, which can certainly go a long way to filling an educational void. Right at this minute, it feels like they’re probably the most effective teaching tool in this list… but it somehow feels wrong to try to learn a new technology from scratch from a blog. It’s easy to get caught up in details and miss the big picture.

Is there a market for third parties collating blog posts into effective teaching material? I don’t just mean "link blogs" – but well-maintained and organised sequences of posts designed to teach particular topics… possibly with extra explanatory posts to provide extra cohesion. Is there sufficient coverage of basic topics in blogs, or are most bloggers aiming at developers who are already experienced in the topic in question? Answers on a postcard…

Books

Books have problems of freshness and detail, as mentioned before. There’s also a problem of readership – I’m not convinced that books have a wide enough reach these days. I suspect this is largely because blogs do a good enough job in many areas, and also because technology often moves faster than a book market can keep up. Of course this ends up being a cycle to some extent – with fewer and fewer readers, top authors will have more incentive to blog than to write books, so the overall quality could drop, leading to fewer book readers etc. I’m not going to pretend to know enough about the book market to make concrete predictions – but it does concern me.

(I’m not particularly bothered in terms of my own income – I’ve never been writing C# in Depth for the money, although of course that provides more incentive for "polish". I wouldn’t have put in as much editorial work in a purely amateur capacity. There’s a very strange motivational force going on when it comes to tech writing and publishing. That’s possibly a seed for another post some time.)

Will there be a book teaching how to think about push sequences and use Reactive Extensions effectively? Maybe. Heck, I’d potentially be interested in writing one – if only to understand it better myself. Would it reach all the people who could benefit from it though? I’m more dubious about that.

Documentation and tutorials

This is probably the most traditional and widespread route to knowledge of new technologies. Does it cut it? I simply don’t know. I can’t remember the last time I read docs in a "from scratch" mode – my experience is much more in reference mode. I’ve occasionally tried - but found either my patience or the documentation to be lacking. It’s entirely possible that my expectations and methods of learning have changed, and that that’s what’s gone wrong… but this may be a reasonably common phenomenon.

Again there’s a problem of reach – although it’s possible that as the most traditional form of learning, it’s possible that it has a greater reach into the non-community, if you see what I mean.

Non-conclusion

This has been somewhat rambly, partly because I’m demob-happy: I’m about to go to Athens on holiday with Holly for a few days. (Don’t expect any comments to be approved until Sunday.) It’s a real concern though, and one which goes way beyond the Microsoft technologies mentioned here.

The challenges faced in computing are growing, and so are the technologies trying to up us meet those challenges… but we need to grow too, in order to take advantage of what’s available.

I’m not pronouncing doom on the industry – but I’d like your thoughts on how we can keep up, and how we can help others to do likewise.

30 thoughts on “How do we raise our game?”

  1. Very interesting post!

    It’s possible that pair programming or mentoring may become much more important, as an attempt to solve this problem. I’ve never had the chance to do pair programming (or mentor, or be mentored), but I think it may work quite well.

    This, in turn, may encourage the move to a Cravath-style system. An interesting (and debatable) article on getting Cravath into CS/IT is here: http://thedailywtf.com/articles/up-or-out-solving-the-it-turnover-crisis.aspx

  2. I don’t know what else to do on the teaching side, but on the learning side, each individual has to take time to learn. My personal guess is that those who are left in the dust of others are those who don’t take time on their own to learn and practice (though other factors also contribute).

  3. I believe you raise your game by using all of the methods Jon said, based on their strength. I used blogs if I need to get a overview of new technologies. I used tutorials like those found in MSDN library if I want to learn how to use an API in .NET. I use training videos if I need to hear a voice and see a demo and not just read it (like for something like ASP.NET MVC). It is good use them.

  4. Am I the only person who loathes the recent trend of putting technical information into videos as an alternative to documenting it with words? I recently sat through a 20-minute video with some guy droning on about Azure, because I couldn’t find the information I needed anywhere else. Turned out the video didn’t have the information I needed either, but it took me 20 minutes to determine that, instead of the 30 seconds it would have taken me to skim a blog post with the same information.

  5. I think it comes down to a few layers, for every technology. I’ll use Microsoft as an example.

    * Describe it simply. There are tens of Microsoft products that I’ve looked at for hours and have been unable to figure out at all. It took me repeated run-ins over the course of three years to figure out what their message queue was supposed to solve, and that’s one of the easier problems to solve in this mess. I still have no idea what “ALM” or Dublin is all about.

    * Show, in a brief period of time, several examples of how it solves problems in a better way. Draw people in; light the spark. Rx is impressive and I’d like to be able to use it, but I have yet to sit down with it long enough that I’ve been able to pinpoint exactly where it could improve something I already have. Both the “drag and drop” and “dictionary suggest” demos are too cute and contained.

    * Provide good answers to basic questions and go from there. This is simply well-written documentation.

    * Produce edge material; what can you do if you reach just beyond the usual usage? How do these low level parts really interact?

    One Microsoft team that has been doing everything right has been the Parallel Extensions team

  6. I don’t think it’s possible for anyone to know everything. My own strategy for coping with this massive amount of new input is to filter at lot of the details away.

    If I am to work together with someone, I don’t expect them to know every detail of the frameworks we are to use. If they know the overall concepts we have a platform to communicate upon and we can cooperate to make a solution. Thats what team are for. :)

  7. I tend to think that online hyperlinked tutorials take the prize on this one. While you can use a blog to present a coherent series of lectures on a topic, the navigation leaves a lot to be desired. Skipping the blog interface and using sync-ed table of contents fixes that problem. Yet an online tutorial can also link to relevant blog articles. With a little Javascript, it’s possible to let the reader toggle visibility of embedded case studies, more advanced discussion, theory, etc.

  8. You’re asking two questions, one of which you’ve already answered.

    The second (and perhaps easier) question is: how do we teach people working in the field about new techniques and technologies? You then went on to describe the current state of the art for this. Like Phil said, I find my technology use pattern following something along the lines of:

    – Learning about new tech through blogs, and conferences.
    – Using books, courses, and the ever essential documentation to learn how to apply and use it.
    – Searching forums, groups, and Stackoverflow to find answers to questions unresolved by the documentation (or source code if I’m lucky).

    None of these sources stands alone as a single “best” way to come up to speed on a technology, but their combination (tied together with a capable search engine) is very powerful.

    Your first question was somewhat different: how do we make developers smarter? This might sound pessimistic (or maybe optimistic depending on your point of view) but I don’t think that we can. It doesn’t take much looking to see that engaged and incredibly intelligent people have been involved in this industry since the beginning, and I don’t see that changing. Also, there will be a segment of uninterested, unengaged people that won’t grow much beyond the basics no matter what you do. Jeff Atwood posted today about intrinsic motivation. If somebody’s got it, then they’ll learn and grow. If not, well… you can lead a horse to water, but you can’t make them drink.

  9. BLOGS! Blogs win this one for me, by far.

    Here’s why: blogs are already in my RSS feeds, and so I get a gradual exposure. A “hey that looks cool”; a “wow that’s much easier than the way I was doing it with the old technology”; a “I think I get the concept now, due to all these many examples.” Then when I start a new project, I have all this new tech in the back of my mind, and I go “OK new tech X seems like a good fit, let me try to use that!” And then I know what blog posts to go back to, which is a great starting place.

    This exact thing has happened to me for both WPF and ASP.NET MVC. The latter is particularly easy since ScottGu’s blog is such a great example of a gradual-exposure blog for ASP.NET MVC. I’ve been reading it since ASP.NET MVC started, and only in the last few months did I decide to start a project. But when I did, I knew exactly the right place to go, and had an idea of what ASP.NET MVC allowed me to do; what the code looked like; what techniques to use for certain tasks; etc.

    TLDR: blogs win because they are already in my feed reader.

  10. To add to 2 of the topics. Docs are never up to the task of teaching someone something from scratch, at least not the docs I’ve been seeing. Sometimes they’re not even good enough for reference mode reading.

    Books:
    With devices like the Kindle/Nook, there’s a market for value-adds. I’ll be willing to pay a premium for books that update with the times. When new information is released, add a chapter seamlessly, when things change, update the chapters seamlessly. The technology is there, tech-writers need to use it.

    PS: Your captcha doesn’t display in Chrome

  11. The new technologies came out more and more quickly, even just in .Net area. Sometimes I just feel frustrated if I want to catch up all of them. Personally I think it is better to focus on what you are interested and what you need.

    For new things I reckon it is better to start from a book, a good one. It won’t give you much details but you would have a big picture and scope. After that then just need to open Google, then you won’t feel strange when you look at some new concepts. There are too much information you can handle.

    Have a good holiday Jon : )

  12. I tend to think books need to focus on being random access as people don’t necessarily want to read from beginning to end to get started on something. Also, you somewhat need to know you need to know something before you invest in a book on that something, which creates a chicken/egg situation.

    Blogs are great because they can introduce you to new things you didn’t know you needed to know and with little personal investment other than time. They’re a great stepping stone into the rest of the resources. That said, your idea of combining several blogs (and possibly other resources) into a virtual book on a subject is a good one.

  13. There’s a massive problem here, in a iceberg-below-the-waterline way. The interested and engaged programmers read blogs, books, go to user groups and conferences, know how to enquire of arcane mysteries such as MSKB and might go to training courses (but probably not for core skills because they probably already know more than most trainers anyway). They’re not the problem, but they’re the easy target for the solutions we have, so that’s what we get.

    The disengaged, work-to-live “enterprise” nine-tenths are a major problem. They don’t want to be reached, they don’t want new stuff, they don’t want things to change. They don’t really want to be doing this job at all and most will eventually slope off, leaving their former profession no poorer – but no better either – than when they came. That, I theorise, is why age distribution for developers is skewed – the oldies (like me) are still around because they love what they do. There are too few passionate ones entering the field – or too many jobs to be filled.

    We won’t ever teach them effectively unless they want to be taught. They either have to be taught to love the craft enough to want to learn more or taught how to leave it and start loving what they do, whatever that may be.

  14. Interesting post!

    A few thoughts …

    Mike Woodhouse is right! .. many of us don’t want to know for various reasons … laziness, busy with other matters, lack of curiosity … this stuff is hard and requires a certain devotion (love?) that some will not give.

    I disagree with Joel … tech videos rule!!! I love Channel9! … when something new is announced I need to know .. what is it, how does it work and is it worth my attention … tech videos can do that … details and comprehensive coverage have to be done in books and documentation!

    Training courses … they’re good to get you a running start … but I dont think you can ‘master’ any subject in a three day or 5 day class … IMHO … you need to study … which is why we like your book so much.

    Blogs tend to be too brief and too idiosyncratic … this post is an example.

    So to answer your question, How do we raise our game? … videos, classes, conferences and blogs are nice … but we need to study … we need quality books!

  15. Regarding Reactive extensions, TPL and Parallel extensions and code contracts …

    Code contracts is obviously needed and easy enough to use that people will get it pretty quickly. We all write tons of ‘defensive code’ to make sure we dont return null or pass null to methods that you dont need to have ever heard of Eiffel to see its usefulness.

    TPL is designed so nicely that its pretty easy to get started. Writing complex concurrent apps is always going to be hard but TPL and the new collections make doing some basic things pretty easy.

    Reactive extensions is another story. Lots of compelling use cases dont come to mind. I know the web is asynchronous … but I dont have a need to collect a stream of twitter feeds (or whatever) into a bucket so I can perform operations on them.

  16. I think one of the problems is that the sub-set of developers that read blogs, go to conferences read Stackoverflow etc is relatively small and gets smaller at each step.

    I think that there’s a large % of developers who get most of their info from company provided training courses and books, i.e. they don’t do it off their own back.

  17. I have to agree with Keith. Videos that cover new technologies are a great way to quickly absorb high level concepts. The Cloud Cover show on Channel9 ( http://channel9.msdn.com/shows/Cloud+Cover/ ) is a great example, as each episode is 30-45 minutes but gives a good overview of different parts of Windows Azure. You won’t be an expert after watching one video or even the whole series, but they can help you learn new things and are easier to follow than raw text in books or blogs. I would put podcasts like hanselminutes.com in the same category.

    Another category you might want to add to your list is certifications. My job requirements have grown to cover DBA and server management responsibilities, and I have found the MCTS and MCITP certification tracks have helped me fill in the gaps of what I have learned on the job. The major certifications tend to cover the core aspects of the technology stack, but this means that new technologies usually won’t be covered until they become canonical standards.

    Maybe there needs to be community based certifications that cover emerging technologies. Sort of like what StackOverflow does with reputation, tags, and badges, but there would need to be a set of questions and topics that a user would need to answer before receiving a certificate for a given technology. Something to help guide users to learn all major aspects of the technology.

    Keep up the great work!

  18. “I don’t think Google engineers are representative of software engineers as a whole” ..

    I wonder why this is?

    Is there any measurable data on it? Is the total set of Google engineers better than IBM, Microsoft, Novell, Apple, Intel, AMD, Bell-Labs, Adobe, etc..

    I mean really is it Google’s process, DNA, food, water, working hours, ….?

    I always hear the same old thing out of Google.. I think if you were at a small shop or in a small group that you *might* be able to think your shop or group is made of a small set of just smart engineers and everyone else is a mort, but what really makes one think that with Google’s size that you can statistically corner the market on smart folks??

    Maybe it’s the fluffy chairs and some nice food? or is it PhDs or just LOC? or maybe it could be that everyone would like to think of themselves as more important and more X.. Just remember that delusions of grandeur and hubris can be the negative side effects of success.

    I guess whether it’s really true or not doesn’t really matter anyway, now does it? Since while the good times roll, at the end of the day the pay, games, drinks and food *really* is good.

  19. This exact notion has been rattling around in my head for a while now. I was just invited last week to help lead a good sized, well established .Net user group. The group has been going strong for many years now, with a series of excellent speakers from the local community. Generally we average in the 60-120 attendee range. It’s a good solid community, but how do we get better?

    I think you nailed it with entertainment > education. A 90 minute session once a month is great for overviews and introductions to the New and the Shiny, with a few advanced nuggets sprinkled in. And that’s great, I do not want to disrupt that. But what’s the next level?

    One of the ideas we have been kicking around are UG endorsed “Jam Sessions” which user group members can schedule and meet up, with laptops mandatory, and actually hack on some code for 2-4 hours with the goal of actually cranking out code and some sort of app in some new or lightly used tech. Like a hardcore nerd dinner. Jam Session leaders would be volunteers and do a little legwork ahead of time to get some ideas and directions, but whoever shows up to the session will have direct input. We want to call back to those classic UG’s from the 70s and 80s with active users and active participation.

    Would love to know if anyone has experience with this type of group learning?

  20. I can’t stand the video trend myself. It takes me less than 5 minutes to read an article, yet 20 minutes to watch a video that has a speaker with such a heavy accent that I have to spend more effort understanding the words than learning the content. Plus I can’t search the video for key words. I understand some people like videos, but i personally hate them. If you must have videos please make sure there is a typed transcript linked from the same place as the video.

  21. @Anthony: I’m going by my experiences inside and outside Google. I’ve not met any engineers in Google who *aren’t* smart and deeply engaged in software. One of the biggest perks of working isn’t the food, etc – it’s getting to chat to really smart people all the time. I’m still amazed I got in.

    I dare say the same may well be true at the companies you mentioned – I don’t have enough experience of them to say.

  22. Real world code examples are how I learn the fastest. I especially like the examples where the subject matter expert presents at least two different ways to attack the problem.

    This method is fast, Relevant, and Easy to contrast to existing technology you already have stored in wetware.

    One thing that gives me hope regarding all these advancements is that they all seem to be either:
    A) A simplification of a overly complicated process or
    B) An extension to a process that had no exposure in the first place.

    So, I gleefully poke around for examples so I can simplify (accelerate development) and do tricks I could never do before.

  23. I think that books are important because they give you a progressive and fuller knowledge than blogs and online tutorials, and when starting with something new, that’s very important for me.

    Diving into something after reading a tutorial and getting it to work might make you think you know it and then miss on small things that will eventually make things break.

    There’s the reverse of the developers who don’t want or bother to advance – the ones who can’t, or at least not at the pace they would go on.

  24. Jon, clearly the explosion in platforms, technologies, languages, tools, patterns, and techniques makes it challenging for developers to keep up.

    Some of us are fortunate enough to work with (or otherwise know) some of the talented and engaged individuals who trail blaze with new technologies, write about them (both in books and online), and introduce the rest of us to the fruits of their labor.

    I completely agree with your points about the effectiveness if courses, blogs, conferences, and books. They each have their place and a purpose to serve. However…

    I think that free, online, ‘hyperbooks’ would be a far more successful at bringing people up a level – the key is to find way to inspire would be authors to devote the time and energy to contribute. In fact, I would model something after the likes of Wikipedia – there’s no question that it has made enormous inroads at organizing and democratizing access and dissemination of information in a manner that makes it possible for people to explore and learn on their own. (I can honestly say that I’ve spent more than a few hours engrossed in reading articles, jumping from one topic to another as I encounter concepts or ideas I’ve not yet learned).

    Imagine a site like Wikipedia (but with perhaps a bit more structure) crossed with a Q&A site like StackOverflow. A place where developers could come to learn – where they could get both a big-picture view of a technology as well as answers to specific problems.

    Companies like Microsoft, Google, Oracle, Apple that create new technologies have the most to gain from making information, examples, and tutorials on their technology accessible, up-to-date, and robust. These companies spend millions of dollars creating documentation and tutorials for their technologies already. Some sites, like MSDN, do a relatively good job – at least for reference materials – others not so much. There is a large pool of individuals outside these companies, with both the knowledge and passion to contribute. The technology exists to make it possible for large groups of people to author content online together. Technology companies are directly served by developer awareness, adoption and effectiveness. They should have a huge stake at promoting, encouraging, and possibly financing such online initiatives. Rather than devoting their resources to cranking out content on their own, I think they would be well served by creating online communities devoted to specific technologies – places where content can be authored but also organized and structured – much like on Wikipedia.

    I think that companies should embrace this kind of crowd-sourcing, and look for ways to make it rewarding and exciting for people to participate. From my own participation on StackOverflow, I’ve seen the effectiveness of a community oriented approach to sharing knowledge and experience to help people solve problems, understand technology, and learn how to program better and more effectively. SO doesn’t pay its contributors. It doesn’t crowd itself with dozens of adds. It’s just a crisp, effective place to go for help. And it’s success speaks for itself.

    But let’s imagine for a moment (even though I don’t believe it) that financial renumeration is a key factor for achieving the necessary quality and time investment necessary to create such online books. Well, even in this case, it would likely still be beneficial for sponsoring companies to pay authors based on voting, traffic, comments, or some other scoring model. Likely, large companies could even use ad revenue to offset such costs.

  25. Every year there is more that a .net programmer is expected to know, even if some method of coding has been superseded by something better, the old method will still be used somewhere in a system the programme has to work on.
    One day .net will just get so big, that is gets replaced by something else that is new and small, then we will repeat the cycle again.

  26. I think these observations apply to education in general. I’ve been thinking about this kind of thing for years – turning the WWW into a ‘Concept Network’.. the semantic web seems to be in this spirit – do you know of anything else?

  27. @Aaron: I’m afraid I don’t really know anything else. I think it’s happening organically to some extent.

Comments are closed.