The ASP.NET community's only real problem is education

After reading this post from Dan Hounshell (via Rob Howard's post), I'm drawn to more questions about "what's wrong with the ASP.NET community," and I'm still convinced that people are asking the wrong questions.

To really understand where we are, I think we need to look at where we've been. There's a history when it comes to this platform, and I don't think you can really get to the meat of the platform's development and community without having that context.

In 2001 and 2002, I was yet another person beginning the transition out of the horrible ASP 3.0 world to ASP.NET. I was immediately active on GotDotNet, and then the asp.net forums. I posted a ton in CrystalTech's user forum, and was designated .NET guy of the year or something on SitePoint's forum. I was all about trying to help people out because, by extension, it strengthened my own experience.

Let met get back to that in a moment though. In the pre-ASP.NET world, as I mentioned, we were in ASP. Visual Basic 6 and other previous versions were about as common as Windows itself in little shops in every IT department. That Visual Basic world was powerful because you didn't have to be a programming genius to make stuff work. And in the world of drag-and-drop, you didn't even need to be all that handy with code.

ASP really required us to know how to write script, but by the very nature of script, we were focused on simply getting things done in the fastest and easiest way possible. These were very task-driven days. Thinking of a Web site as an application was more or less unheard of.

It isn't surprising that a great many people, I'm even willing to bet a majority, came to ASP.NET from one of those two worlds. That's a very different world from those who had experience with C++ or Java. It's something that was apparent in my experience with the various communities I frequently visited. I might have been an early adopter and forced myself to better understand the OOP world, but maybe that's because I was in an unemployment phase and had time to learn. To this day, a lot of questions in these communities are along the lines of, "How do I do this in ASP.NET" or "What's the command that does this." These are the wrong questions. A lot of people, in an effort to make something work, are looking for classes as if they were keywords in the language they're using.

In my book, I say in the first chapter, "The classes you write are not any different from those written by Microsoft in the .NET Framework." I'm surprised when I run into people with questions that they don't really understand this. It's the first problem with .NET education, that people aren't learning what objects are, or instances, or how a class is different from an instance. Most people fast forward to, "How do I save a cookie," without the slightest understanding or care about the moving parts like HttpCookie or the request/response lifecycle of ASP.NET. That's a problem.

I've felt that the lack of instruction involving object-oriented programming and how ASP.NET itself works is a huge problem. It's a problem that I wanted to further write about in my book, but was bullied into the chapter list I ended up with. Honestly, how to do "Hello World" with a Label control is like chapter 10 in my mind, but that's not how it is approached by anyone.

There is a lot of failure to throw around in that arena, none of which is attributed to any specific individuals or organizations. Books are written assuming OOP understanding or to learn whatever in seven days. Web articles, blogs and forums have zero cohesive vision, and it's a Google-and-go world. The only way I can think of to overcome this is the desire on the part of the individual to dig deeper, and you can't force that.

So by now you're thinking, "Dude, this isn't what community leaders and bloggers are even talking about." Yeah, no kidding, that's my point. That pyramid on Dan's blog post, you see that enormous part at the bottom? That's who we're talking about. The conversation, however, gets into whether or not you should use NUnit or the VS testing framework, or whether or not some new framework is open source or community developed or Microsoft developed or whatever. It's like this horrible "inside baseball" conversation that is totally irrelevant for the bulk of the community that the self-appointed thought leaders are talking about.

Before you get all up in my grill, I'm not suggesting that these aren't some important things to discuss. I'm just suggesting that these subjects are self-serving for a very small constituency of the community. To the cookie guy, this is like string theory, and there are a lot of cookie guys out there.

Since we're talking about it, I'm extremely happy with the direction that the platform has gone the last two years or so. Guthrie's various teams are kicking ass and adding value to their products in a way that makes my life easier. Ultimately, that's what I want from a company when I'm buying their products. C#3 and VS2008 were like the ultimate Christmas, and their ongoing open efforts, delivering something early and often (MVC comes to mind) is awesome.

In any case, I think the thought leadership needs to step away from the computer science and development methodology religion and think a little more about how we get those developers up to where we'd like them to be. God knows we'd like to hire more people like that. 

25 Comments

  • You've summed up my exact experience over the past few months.

    OOP is the crux of the issue. It's easy to use inheritance when that article you just read said to use it to derive from TextBox to create a custom control, but it's another thing altogether to consistently *think* and *design* on that level. Interfaces, abstract classes, static classes, pass by value, and pass by reference...I wonder how many .NET developers really even know what these things mean some times.

    Let's not even mention understanding the higher level constructs which are involved in building coherent, maintainable, extensible, and orthogonal systems. Things like inversion of control, domain models, model-view-presenter, and other design patterns are sorely lacking in .NET discussions.

    The truth of the matter is that .NET and VS make development _too_ easy, but in a way that's geared towards RAD and small scale design.

    I have to say, though, I'm very much digging the guidance packages, EXCELLENT documentation, and what not included with the Smart Client Software Factory/CAB and Web Client Software Factory. There's is hope yet, if these packages can be integrated by default as "best practices" or solution starter packages in some future release of Visual Studio.

    It's painful, dude...sometimes I think it's like that TheLadders commercial (the one where the guy is trying to play tennis and everyone rushes the court).

  • I remember my first programming book. I knew absolutely nothing about programming, not even what an if statement was. It was broken down into 20 chapters or so. Each chapter was a mini project. In each chapter you learned something new, a new construct or a new function, a new trick, etc. Everything was built on the knowledge from the previous chapters. I could usually go through one chapter a day, and at the end of the day I had the satisfaction of accomplishing something. I was proud of myself, I was 12. That book was like a teacher sitting beside me guiding me through this new world.

    The problem with the books that I've encountered in the past few years is that they cater to neither segment. They are neither beginner books nor advanced. They effectively encourage mediocrity. I have a couple of books that are supposed to be advanced, but every time I open them they fail me and I have to turn to the Internet. Books like these are a simple rehash of the documentation. I can tell immediately if the author has any real-world experience with the topic. Unfortunately few book authors have.

    I'm looking for guidance, for the author to guide me through the maze in front of me. I also don't want to be bored and most importantly I don't want to be left hanging when the problem gets really interesting (read difficult). If you're not going to cover a topic exhaustively, don't bother -- you're wasting my time.

    I haven't read any of your books, so this comment does not reflect you or your book in any way.

  • I totally agree with you. I've gone through a formal software engineering degree (B.Sc.A. and M.Sc.) after moving from ASP to ASP.NET. Coming from both worlds, I love ASP.NET even though it's not the coolest kid on the block.

    I like the abstraction it brings and it gets things done... that's all that matters to me.

    I see this widening gap in the web dev community between the people well-versed in OOP talking about better testing, aspect-orientation, OR mapping, etc. However, as time passes, I'm starting to wonder whether this ends up being only 20% of the dev community (or less). I'm never sure how to position my technical blog posts because of this... but people who actively read blogs are usually in that 20%.

    Short of saying go to university for a couple years, I'm not sure anything can be done in a short period of time to bring someone up to speed.

    But is this problematic? Maybe our industry is starting to mature. How many civil engineers do you know picked up a "Building Bridges For Dummies" book at a local book store? The buy a couple books and start coding strategy has worked until now, but maybe in a decade or two the complexity of it all will force everyone to get a formal education. (Not just for ASP.NET, for computer science / software engineering all together)

  • Maybe a part of it is also what you're exposed to. One of the reasons I went to a day job at Insurance.com is because consulting work often made me the smartest person in the room. Not a great place to be in if you intend to continue to develop your skills. I was only at Progressive for four months, but learned more in that time than I did my entire time consulting.

    These guys (and women) who work in small shops by themselves or a handful of people probably don't get exposed to big distributed systems or more complex Web apps, which means they don't have to learn about the "better" ways to develop. Can you really fault anyone for that?

    Regarding the earlier comments about books, believe me, I pitched a more thorough, ground-up approach to learning ASP.NET, and it was flat out rejected as being "too broad." If I had the time, I'd self-publish, because I really believe that a soup to nuts approach on OOP and ASP.NET is the "right" way to teach someone who doesn't have that experience. I still believe that audience is enormous.

  • Hi Jeff, as one of these cookie programmers I completely agree, and I can see a need for your book. Speaking of which - are you planning an update, or is it still relevant for VS008?
    Many thanks and keep up the good work on the blog. :)

  • I work with a team of cookies. Help me...

  • Jeff,

    I agree with you, and the chapter 10 hello world idea is perfect. So many times I read a book and ask myself "Well what underneath it makes it work" and the author never goes that deep.

  • @Jeff - I think that Dan's original pyramid is a little too simplistic for the sake of clarity. There are "leaders" who appeal to many different levels of developers. If you are reading blogs like Scott Guthrie, Scott Hanselman, or Jeff Atwood then you should not expect to find CS101 or 201 material. These leaders are talking to the more advanced developers. Where more basic understanding is required then users should be looking to resources like the Data and Object Factory site (http://www.dofactory.com/Patterns/Patterns.aspx) or W3Schools (www.w3schools.com) or other reference sites which do a much better job of providing a wholistic treatment of basic topics. People like Dan or Scott or Jeff are trying to help users who are trying to continue continue their "education" after having mastered the basics.

  • Very well stated! I have worked with many developers over the past 7 or 8 years that have ended up in senior level positions because they got into .NET early. The problem is that many of them don't have a clue about OOP, Design Patterns, Software Architecture, etc.

    I agree, this is an education issue. The problem with that is some of these developers don't want to learn how to do things correctly.

  • I see many comments regarding "the right way to do things". Applications are not developed using the right way or the wrong way. Every developer has his/her idea of how to get things done. Some developers have small applications that don't necessitate a full blown OO solution with unit tests. The boss doesn't think the smart guy is the guy to promote. It's the guy who gets things done quickly...therefore saving money. But, I do believe many programmers out there don't understand basic OO and don't care to. There will always be jobs for these folks, because the boss understands OO even less than the cookie programmer.

    I truly believe that programmers who are forced to maintain applications they have created realize the importance of good OO design. Have you ever maintained an ASP.NET application that has all the UI and code-behind so coupled that you are scared to touch it for fear of breaking everything? All it takes is some time maintaining these apps to decide it is worth taking the time to use OO and implement solid designs.

    I like to call it the teachable moment....but can you teach the teachable moment?

  • I completely agree, you've hit the problem on the head, but I don't think you've fully explained the solution. I started to write out a comment here, but it grew too long so I posted it on my blog instead.

    Here's a link to my thoughts on this discussion:
    http://pietschsoft.com/post/2008/03/dotNET-Community-Learn-The-Current-State-Of-The-Platform-Before-Deciding-On-Its-Future.aspx

  • That's because I'm not sure I have the solution. :)

  • I guess my problem is with this premise that OOP in the C#/Java sense is the end game.

  • End game for what? It *is* the pattern for which .NET and Java were designed for.

  • One thing that would help is if the bloggers spent some extra effort explaining the base principles. I find a lot of skip over the concepts and assume that the reader has inside knowledge. Take a look at ScottGu's first asp.net mvc post:
    http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx
    There are many excellent points to this article, and it is still well worth the read, but when I first followed the example I was really excited about getting into unit testing. However it skipped over the details of TestViewEngine and as a result I was unable to understand the fundamentals and had to leave unit testing for another day.
    However people like ScottGu and other tech bloggers still earn my respect because they have have raised the bar overall and I know a heck of a lot more now than used to, and I owe a good deal of my knowledge to the bloggers in the community.

  • "End game for what? It *is* the pattern for which .NET and Java were designed for."

    No, that's the pattern that the *libraries* were designed around, not what *.NET* and *Java* were designed *for*

  • Thanks Jeff for this relevant article and thanks Joe Brinkman for your helpful links!

    I learned (and I'm still learning) OOP and .NET on the job. I often read articles or blogs related to ASP.NET development. BUT: Due to the fact I learned some things on my own, when I read articles on .NET, I feel like it is missing me something in OOP or in basics of programming.

    Hopefully, some people shows sometimes basics and thanks to those persons I can increase my knowledge in OOP and in .NET. One of this great person, in my opinion, is Bob Tabor (and his team) and his http://www.learnvisualstudio.net website. In this website, you have all the basics you need to know on .NET, whatever is it in ASP.NET, C# or VB.NET.

  • I agree that most people I talk to don't have a good foundation of OOP and that it limits their abilities. You can only be as good as your foundation.

  • We are being flooded with complexity.

    You are expected to know Html, CSS, Javascript, C# or VB.NET, the .NET Framework, OO, design patterns, TDD, SQL, DLINQ, lambdas, generics, webservices, etc.

    All this just to stick a field from a database onto the screen.

    It now takes a three months to create a web application that could be done in MS Access in a couple of weeks. The users can't even tell the difference.

    No wonder people are searching for code generators and application frameworks and hoping that the next version of Visual Studio will make life easier.

    They are searching for the .NET equivalent of MS Access. Drag, drop and plug in and play.

  • Strange, I thought it took less time than ever.

  • It just takes a lot longer to learn how to do something in less time than ever.

  • I love to program, it is my #1 passion. I read 2000 page tech manuals like they are magazines. I’ve programmed in 15 different languages since 1979. So, I’ve been around and have made my own observations...

    First of all, MS stopped providing books after VS5, that was a major mistake. The doc team back then was top notch. Remember the 3 main books with the oodles of excellent knowledge, guidelines, and humor?
    Instead, we now have info overdrive/overload/mind numbing docs of .net.

    Compare the VS5 & 6 docs to .net" Do a simple search for "If"... How is a young programmer to learn anything from these useless, overly bloated docs? Each link links to 30 other docs ad infintum, but none every shedding very clear light on the matter at hand or on how to program using best practices for the subject.

    Many are just cutting their teeth. Remember what that was like: we need this app up in 5 months and here is a list of features we want to see. Is it done yet? Change that... etc... Meanwhile, they are trying to learn this bloated ide via bloated docs...

    Although some of the "uneducated" are lazy and others are shortsighted, the reason some are asking "Hey dude, how do you...???" may be because they are overwhelmed.

    For the first time in my life, I find myself not memorizing my core languages and technologies if they are from Microsoft (c#, asp.net, ado.net et al). I have become a "script kiddy" copying and pasting my beautifully architected apps together. What’s the point in memorizing syntax and obtaining subtle insights? The rapid pace of Microsoft’s language revolution leaves a wide path of bloat, frustration and wasted knowledge (many, many hours of reading, studying, probing, testing, writing, benchmarking, you know the drill). I know whatever I learn today will evaporate tomorrow and the effort will be for naught.

    No doubt, it is hard to beat c# for the desktop and web. However, I’ve resolved to deviate from Microsoft’s technologies as much as possible in an effort to preserve very, very hard fought for and very subtle programming knowledge and experience. Instead of designing web pages in vs I use Dreamweaver. Instead of Master/Template I use textpad & pure css, instead of sql server I use MySql. Instead of xml config I went back to .ini. At least this way, the next time MS jettisons our programming knowledge, I’ll have a lot I can hold unto.

    I feel sorry for the young programmers, they have no idea what is in store for them the next time Microsoft’s marketing dept twitches its eye... So, the next time someone says "Hey dude", give the guy a hand and don’t blame education. Have a bit of compassion, the poor guy is probably overwhelmed with bad schedules and a bloated programming tool that changes every 3 years.

  • I think if you're cutting and pasting and thinking that the .NET class library is something to be memorized or part of the "language," you're looking at it entirely wrong.

  • You're describing self-inflicted complexity. :) That's totally a Java thing. Some of "those people" want an interface for everything!

  • I agree with Steve's comments, especially this one:

    QUOTE (steve)
    What’s the point in memorizing syntax and obtaining subtle insights? The rapid pace of Microsoft’s language revolution leaves a wide path of bloat, frustration and wasted knowledge (many, many hours of reading, studying, probing, testing, writing, benchmarking, you know the drill). I know whatever I learn today will evaporate tomorrow and the effort will be for naught.
    UNQUOTE

Comments have been disabled for this content.