As an ASP.NET developer I'm pretty much sold on ASP.NET as a platform. I've used ASP.NET since the beginning of the early .NET betas and while I originally had a tough time getting started with it, I eventually came to really enjoy the framework. But once I understood the platform and the flexibility it offers, it's now really hard to think of any other Web development platform that I'd rather be working on. The flexibility of what can be done with ASP.NET reaches everything from high to low level tasks in a flexible and highly extensible environment.
Sure ASP.NET can be used very inefficiently and can produce some truly horrific code, but what platform doesn't allow for that? To me ASP.NET has the breadth necessary to let me build Web applications that range from very high level using the Web Forms engine, to building ultra low level applications or even service level interfaces at the raw HTTP level. I've built plenty of high level Web Forms applications and I've also built several applications where the point of entry interface was an HttpHandler, with our application logic providing the Web interface layer directly at the protocol level.
The cool thing is that all of that wide range can be done fairly easily and consistently in ASP.NET. True the framework is big and there's complexity if you want to understand it well, but the model is clean and effective. In the process of development I've built quite a few applications for and with customers, a few of ended up with sites that had backend page hit rates in the millions per day. Never have I run into a corner were ASP.NET was not up to the challenge of handling the load that was thrown at it either directly or by standard ways of load balancing that are available to any Web platform. These days it's getting rarer and rarer with today's hardware environment to have to resort to load balancing with single high power machines able to manage massive loads. Which isn't to say that there isn't a need for that as well when you end up building a site for the top 100 trafficked Web sites. Frankly I haven't been so lucky yet, but I'm fairly confident that if it came to that ASP.NET would be more than up to that challenge.
In short my experience with IIS and ASP.NET has been a solid one both in terms of performance and security – especially with IIS 6 and now IIS 7.
So why all the Dissing?
For this reason I'm baffled that the ASP.NET platform is often maligned as inefficient, slow and maybe most importantly insecure (which really is pointed at IIS). If you spend a little time searching around the Web and looking for comparisons of ASP.NET versus some other technology – typically PHP or Phython on Apache on a full LAMP stack – invariably ASP.NET will be played down as a vastly inferior choice. It's slow, it's inefficient, it's difficult and oh yeah, it's not free – or more accurately running on Windows which is not free.
Most of the bad mouthing of course comes from aficionados of alternate technologies and it's not terribly surprising that they think that their solution is better. You know the typical us vs. them argument and that's pretty normal.
But it goes even a bit further. It seems that ASP.NET's adoption rate for highly visible sites is not all that high. Sure there are plenty of big sites including Microsoft's own which tends to be around the busiest site on the Web, but overall when you start looking for high profile sites that run ASP.NET you'll find that not all that much content is running on ASP.NET.
You can do this test yourself – check out the top 20 sites outside of developer sites that you use yourself on a regular basis and see how many of them run ASP.NET. I think you'll find that very few run ASP.NET.
Which isn't to say that there aren't some popular and very busy sites out using ASP.NET. Here are a few you might recognize:
Still even looking at the list of sites above you'll notice that most of these are old school business sites and it gets much harder to find examples of ASP.NET in the type of social networking sites that many of us are working or playing with in the course of the day. It seems for smaller and startup sites, ASP.NET is vastly under-represented.
So the question arises why does ASP.NET have such a bad rap and why is it so relatively lightly used? Let me play devil's advocate and speculate on some of the reasons that ASP.NET is maybe getting a bad rap.
Competing with Free
I think competing with free tools is a big issue of why ASP.NET is not used as widely as it otherwise might be. Although ASP.NET is free the underlying platform it runs on is not. Windows is licensed and costs money – even if Windows Server Web Edition is available for a relatively small fee.
Compared to free even a small price looks expensive. Free draws a lot of people. Period. No matter how you look at it, if you have a free platform and one that costs money in the end there is always going to be a significant chunk of folks going to the free platform, regardless of whether free in this case has the better cost benefit or not. Free tools are compelling and it also drives developers who are just starting out into this direction because, let's face it, when you're starting out the last thing you want to do is spend money even if it's a relatively small amount.
In reality 'not-free' is a weak argument given that the Window Server Web Edition is pretty inexpensive at around $300. The Web Editon is fully loaded with everything to get an ASP.NET app up and running although the database needs to be added separately. You can even run open source data backends if you can't or don't want to use SQL Server or the free Sql Server Express Edition. With this kind of low price investment, especially in relation to any sort of software development fees, licensing shouldn't be a factor.
But the problem is one of perception: Micro$oft is by default associated with big dollar signs, and "Microsoft is always after your money". Certainly that's not my experience either for myself or for the customers I've worked with costs very clearly delineated.
But I can certainly attest to the hesitancy of many developers and companies to trust Microsoft, always feeling that in the end Microsoft is out to screw them. It's unrational to the biggest extent but it's a very real issue that plagues Microsoft in general in my opinion.
Barrier of Entry
ASP.NET from the outside is seen as a big and bulky solution. Huge framework, huge runtime requiring large servers, lots of memory etc. This criticism is really leveled against Windows as the platform rather than ASP.NET since the bulk of those requirements are for the operating system.
I find this argument very common, but it's also pretty weak given that high end hardware and memory are becoming so very cheap in recent years. For example, I just upgraded my server to a quad core Xeon box with 8 gig and 3 high speed harddisks for less than $1200.00 with a packaged server from Dell. It's hard to accept any whining about an application taking a few extra megabytes when you can buy 4 gigs of RAM for $70. Yet the argument goes, no matter how much hardware you use, the LAMP stack always requires less so you can make more out of your hardware and there certainly is some truth to that.
Along the same lines if you go looking for hosting space with ISPs it's also no secret that Windows hosting is more expensive and this is mostly due to the higher hardware and resource requirements plus licensing that host providers have to invest in order to host Windows solutions. Again these differences are not very large but they are subtle marks against a Windows solution.
Maybe an even bigger concern is that ASP.NET or .NET in general has a pretty steep learning curve. Web development is never easy, but ASP.NET involves learning a fair bit of framework functionality before you can really be productive and get stuff done. It's easy to build a hello world page or even a simple data form, but once you start building more complex stuff – especially when it requires data access and an architecture - all of a sudden there are a huge number of options of varying complexity available. Many choices but not a lot of guidance on which of these choices works well in which scenario.
I think it's very easy to forget for those us that are now proficient in .NET how much of a struggle it was to get to that first level of proficiency beyond feeling like a complete dork with .NET. I know it took me a lot more time to get there than I care to admit to feel comfortable working with .NET. It's not that .NET is particularly hard, but it is very large. The framework is huge and while you don't need to know all of it, figuring out which pieces you need and which pieces are the right ones to use at any given time takes time. This process is more involved with .NET because there are many more choices available than in most other Web environments especially scripting languages. It can also be frustrating to get to that first stage of proficiency beyond feeling like a dork and frankly I think this stage is where many would be developers drop off the ASP.NET try outs and opt for another solution.
Compared to other solutions like PHP, Python or maybe even more drastically ASP Classic ASP.NET is a monstrous beast that can be a blessing for those that feel comfortable with the framework and know how to leverage the rich functionality, or a curse for those just starting out to become proficient and become overwhelmed and confused by the myriad of choices.
It's easy to point a finger here and say – "Well, software development is hard and you have make an investment to learn a new tool", but the reality is that there are still a lot of developers out there that are already proficient in one tool or another and if you are comparing tools on a regular basis and find one that on first blush seems more complex than it needs to be, it's not going to win any popularity contests.
I personally feel that investing the time in .NET was definitely worth the effort. When I first looked at ASP.NET I was also overwhelmed and confused by which approach to take, but with time of learning the framework and understanding the architecture I've come to really appreciate the power and flexibility that it offers in Web development or development in general. I've spent a fair bit of time building my own Web frameworks from the ground up, I've looked at various other frameworks more recently and for me it still comes back to the simple fact that ASP.NET is built on a very solid and flexible foundation that can do just about anything on the HTTP stack fairly easily.
But I'll be the first to admit that the learning curve was steep and I think this is where the sticking point lies: You have to make an up front time investment and upon starting out it's not obvious whether this investment pays off especially in the eyes of developers who may already have a skeptical tendency and who can use technologies that are more popular and provide a more straight forward path to Web development.
The problem is that this is difficult to convey the benefits of .NET from a perspective of "you have to be highly proficient first". It's not going to go over well when you say: "After you spent a year studying the deep inner workings of the framework you'll really benefit from ASP.NET". Never mind that this concept applies to just about any tool, but without that instant gratification of productivity it's a tough sell.
ASP.NET is a Different Web Metaphor
ASP.NET – at least using the Web Forms engine - uses a different approach to Web development that is based on abstraction and effectively hiding many of the HTTP semantics from developers. In some ways this can be very efficient and produce very rapid results if you know what you're doing and you flow with this concept, but if you are coming from a raw HTML and CSS background or even as a developer from other tools that are based on raw HTML/CSS principles it's actually difficult to get your head around the abstraction that Web Forms provides.
Web Forms also produces HTML that is not easily styled via CSS so traditional design mechanisms can be more involved. The raw output of the stock (and even more so third party) controls is at fault here often producing inline styled HTML that makes it really difficult or impossible to use standard HTML and CSS concepts effective. It's possible to do once you understand how controls render, but it's not exactly obvious and easily discoverable.
The bottom line is that if a developer already familiar with HTML and CSS looks at ASP.NET there are going to be a lot of questions of how do I style my output properly, and how do I perform tasks that I already know how to do by hand with ASP.NET's markup and code.
Some of this is unwarranted, because as I mentioned at the outset of this post there's low level support available in ASP.NET at all levels including in Web Forms. But it's not the default model out of the box and as a new developer you're not likely to find examples showing lower level, 'raw' approaches out of the box. If you really wanted to output 'raw HTML' and not rely on formatting of complex controls it's easy to do that by using placeholders, inline script and otherwise simple controls that can easily be styled. For example, you can use a ListView or Repeater control instead of a DataGrid and produce fully CSS compliant table output. But this is not always obvious, not covered in an entry level tutorial and certainly not easy to figure out on their own for somebody starting out with the tool.
It's also important to remember that ASP.NET does NOT equal Web Forms. Most of the criticism leveled against ASP.NET has to do with Web Forms and using Web Forms in it's default Drag and Drop like way. But there are alternative view engines available that either allow you to go lighter in usage of Web Forms functionality or replace the Web forms engine completely. The just released Microsoft ASP.NET MVC Framework (part of .NET 3.5 SP1) for example offers a more low level Model View Controller approach to creating Web applications, with Views that are effectively moving back to a more script like, raw Html interface.
MVC is a development pattern, but one that is widely used on other platforms, and one can also hope that the Microsoft ASP.NET MVC implementation might bring a turning point in getting more people from outside of the .NET fold into ASP.NET as it uses a model that might be more familiar to developers coming from other Web technologies.
The Loss of Cool
I remember the days when ASP.NET first came out and there was a ton of excitement around this new tool. It brought compiled object oriented code for pages that could be mixed with script code, a true object oriented architecture plus a sophisticated platform architecture to bear on Web development. At the time ASP.NET was an innovative product by providing a comprehensive framework that encapsulates the Web platform as well as the Html document using a server side programming model. ASP.NET was the crown jewel of the .NET platform and many developers from all persuasions were eager to try out and eventually work with this new environment. ASP.NET enjoyed a solid wave of popularity for new development for a while.
It seems that this early excitement has faded quite drastically. Nowadays it seems that even within the ASP.NET community some of that fire has died down considerably as developers have settled in and are going about their jobs using tools that have seemingly become old hat.
The end result is that ASP.NET is not a first choice among many Web developers and certainly not among designers or other standards oriented workers. In those circles ASP.NET is a foreign entity and if a project based on ASP.NET needs to be sold into this environment there's invariably going to be some hard nosed discussions about why ASP.NET should be used over other 'open' software.
ASP.NET is not amongst the hip technologies that startups like to use. I'm not sure why that is, but it's clear that the majority of new startups and especially those that are in the 'hip' social networking category are not choosing ASP.NET as their tool of choice. Whether it's perception of ASP.NET as slow or inefficient, or whether it's its image or merely the fact that it comes from Microsoft the evil empire is hard to say, but the effect is undeniable.
Worse the problem of non-adoption starts even lower down. If you look at what kids and hackers are doing these days you're not likely to find very many working with ASP.NET (or .NET in general for that matter). While this may not seem significant, it is something that should be worrying because the next generation of developers growing up is growing up distinctly distant from Microsoft's tools. Many of this generation of kids who've grown up on computers and know of no world without them are generally very anti-Microsoft biased. This in turn means there's not a lot of influx of 'young blood' into the community which can provide a kick start, new innovation and the sheer energy that seems to have drained from the platform.
Maybe it's just me, but it definitely feels like energy levels are way down. To illustrate the point, the last couple of .NET conventions I attended were dull and almost boring both in terms of content and even more so in mood and attitude, which is quite a contrast from the way I remember the earlier days of .NET. This is a bit disheartening.
ASP.NET has gone Stale
It also doesn't help that Microsoft has let ASP.NET stagnate a bit since the release of .NET 2.0. .NET 2.0 brought about so many changes that there was some backwash against the sea of new features that were introduced in that version. While there were tons of major and useful improvements in 2.0 there also were a number of confusing features (like the funky 2.0 stock project model) and a host of features that seemed to seemingly overlap. Nevertheless the release of .NET 2.0 was eagerly anticipated because it brought many valuable improvements that affected developers in day to day tasks.
Since then though it's been rather quiet around ASP.NET. By comparison the recent release of ASP.NET 3.5 was an anti-climax for ASP.NET with almost no new features save integration of some previously released features – namely ASP.NET Ajax and the IIS 7 integration. Ironically the just released .NET 3.5 Service Pack 1 brought more new features and a new framework in the form the Microsoft MVC Framework that breathes some new life into the platform and diffuses some of the ire that the Web Forms engine had taken from agile developers looking for a more fitting platform for Web development.
Change is good, but I personally think that taking a breather in ASP.NET 3.5 was probably a good idea. There's been so much change recently in other areas of .NET from WCF, WPF, WorkFlow plus the new LINQ features in all of their various dialects that not having a boat load of new controls and framework features in ASP.NET 3.5 was actually a welcome relief. But it's a balancing act. Having a platform stabilize and not constantly requiring changes to keep up with new versions is a good thing, but dropping innovation too much also makes the platform appear to stuck in a rut and not moving forward which is also important for perception and adoption. It looks like ASP.NET 4.0 will again pick up the pace and provide more enhancements to address the latter.
Ajax – stuck in the Mud
As with ASP.NET in general the ASP.NET Ajax tools have become stale after the initial release several years back. .NET 3.5 brought merely integration of these tools into the shipped runtimes, but there was no significant new functionality added to these libraries. The innovation has gone out of the Ajax tools while the rest of the Ajax world was frantically innovating.
I'm always amazed how many people outside of the Microsoft fold have such intense loathing of Microsoft. It's not just dislike, but a virulent loathing where anything Microsoft is considered evil. Microsoft has certainly made itself unpopular over the years in a variety of ways and unfortunately mistakes of the past are now coming back to haunt the companies and likely will continue to do so for some time. Most of this is completely unrational, but it's a very common sentiment.
On the developer tools front Microsoft does well in the Enterprise and for typical business level systems mainly because Microsoft products are already entrenched in these environments and so .NET has a strong foot in the door already.
But outside of the enterprise and especially in Web development circles Microsoft is often greeted with strong cynicism and so tools that come from Microsoft are already facing an uphill battle. The perception of Microsoft as the evil empire with no good qualities and only out to get your money is definitely an issue in many circles and often results in downright dismissal of anything Microsoft as an option. This is often a consideration before even any sort of technical viability is established.
I'd argue that Microsoft has long shed this 'evil empire image' especially on the development tools front. These days Microsoft is much more open and transparent in regards to forthcoming developments and to some degree there's community involvement in product shaping. However, it isn't a truly open process and critics continue to point at the fact that Microsoft will never be able to create good software because it is not open sourced.
This stigma is going to be very difficult to overcome for Microsoft, unless the company can drastically change its image. Right now Microsoft's image is of a big stodgy company – the new IBM of old that is big and wants to keep its market dominance without contributing anything innovative to the technology pie. For Microsoft to turn things around would involve providing something new that is so compelling that it can overcome all the negative energy or a very drastic change in its business and development model that aligns it closer with the open source process. I wager, chances are slim that either of these will happen anytime soon…
Does it matter what others think?
The obvious question is whether all of this should concern us at all, or whether we should just be happy we've found our development platform that we're happy with and go on our merry way. It does matter to some degree to me. Like most people I want to be using a framework that has merit and is popular and maybe more importantly that I don't have to fight to justify my use of everywhere I go.
I think from a technical perspective ASP.NET is a solid framework with lots of room to grow and produce Web/HTTP applications of any kind. There are a number of options available for high level development with the Web Forms and MVC engines available now in the box, and additional third party engines available. ASP.NET is flexible enough to do high and low level development so that you can either rely on existing high level frameworks that are provided or – if you really need something specific – you can roll your own and even mix and match between them. Technically I'd argue that ASP.NET has nothing to worry about.
The bigger problems are those of political nature. Microsoft's stigma as a big company out to take advantage anyway it can is probably the biggest deterrent for ASP.NET adoption on the ground floor before it ever even comes to technical decisions. I also think the barrier of entry and getting started is turning off many people who are giving ASP.NET a first shot but are either overwhelmed or not comfortable with the default Web Forms mechanism.
There aren't a lot of solutions to these latter problems because they are based primarily on subjective sentiment. Certainly cleaning up Micorosft's image is not something that's going to happen overnight. I also think that on the development tools front at least Microsoft is going down the right path by being ever more transparent and even making source code available for many of the new projects that are coming out. For example, the MVC Framework's source code is actually available on CodePlex so you can look at the core source as well as become involved in the development process. This is a drastic change and a good step in the right direction to open up the tools and platform.
I think it would also help if Microsoft spent a little more effort to push the Microsoft platform outside of the already converted. Most of the advertising for ASP.NET and .NET and developer tools in general tends to be targeted at .NET developers, which is just preaching to the choir. What's really needed is more of a push to gain the hearts of those outside of the already converted circle. This is not easy and has to be done sensibly and not in the ram rod fashion that Microsoft 'case studies' often employ.
I also think that Microsoft would be well served by more introductory tutorials that focus on scenarios that go beyond the very basic drag and drop demos. Specifically some HTML designer centric demos that approach ASP.NET web development from the typical Html/CSS workflow approach would be very useful. Currently there's nothing of the sort that I've seen on the Microsoft site. This could help bridge the gap between developers who already are familiar with Web development and don't want to be dragged by the nose by the Visual Studio Visual Designer. Also more examples that about code rather than how to use the designer to hook up everything would be beneficial I suspect. All of this serves to make things more transparent – it helps convey that ASP.NET is just a big black magic box that mysteriously generates HTML but rather a tool that works with existing standards and features that HTML provides and provides the flexibility to generate just about any layout necessary.
For us as developers I think it's also very important to keep up to date and look at other technologies outside of the Microsoft space from time to time, to understand the grievances and also to see if there's not something that we can learn from other platforms.
I know it's hard to find the time to look at other technology; it's hard enough to keep up with all the new stuff coming out just inside of the Microsoft universe let alone looking at Web technologies in general. But I do believe it's important to understand what other technologies are out there and how they are approaching the same problems that we are solving with ASP.NET. In the end all tools generate HTML output that gets rendered in a browser, so there's more than one way and there's no one best way. It's a good idea occasionally to step outside your comfort zone and check out what the other guys are doing. Pick up a book on PHP or Phython, or sit down and install and run a Ruby on Rails tutorial and see how the same problems are solved with these other tools. Not only does this improve the way you can talk about other technologies intelligently, but it also might inspire new ideas on how you can do things differently in your own work even with ASP.NET.
And maybe, just maybe, the tide can turn and ASP.NET will be greeted with a little more respect in the future.