.NET Culture Shock: Why .NET Adoption Lags Among Startups
aaronstannard.com
aaronstannard.com
ASP.Net controls, postbacks for everything, view state, a general hiding of the actual power of ajax and an obsession with using tables made .Net a terrible web development environment if you had any clue what you were doing. The html it spat out was a bloated horrible mess, web services were anything but unless you really slogged your way through some pain, ashx pages and the directory structure just felt plain wrong.
That said I'd almost, almost, switched to using python/django and then I had a look at MVC and it did everything I needed. Full control over html, nice code separation, a nifty ORM for taking away the pain of basic crud. An alright templating system easily extensible using extension methods. And 3.5 brought some tricks using LINQ and anonymous methods.
I still know I need to learn a few more languages, but MVC has allowed me to copy everything I felt was the 'right' way of developing webs apps from rails/django without having to actually learn a new language and dev environment.
If you weren't worried about performance and didn't want to learn how to actually program, the old ASP.Net was ok for very quickly throwing out web apps for the 10 people in HR. Much more than that required an in depth of knowledge way beyond most .Net programmers, with most of those people being multi-lingual anyway and tending to opt for the cleaner code the alternatives offered.
I don't feel that's the case anymore, but it's way behind in adoption at the moment.
You still hit the occasional WTF in MVC where if feels as if someone wrote a part of the system without reading the memo about flexibility (the validation solution in MVC, for example, is terrible, although not finished and LINQ to entities can be frustrating).
tl;dr;? No startups because until recently good web development in .Net was actually really hard. MVC's changed that.
When I was writing .NET web applications, the sum total of ASP.NET integration was implementing IHttpHandler and friends - not much more than access to the request and response streams. You can build your own lightweight framework, which, being lightweight, isn't a big deal.
For the past two years we've been using our own light-weight MVC framework.
C# and IIS are very versatile technologies, you don't have to buy into the entire Microsoft tool chain to use it, you can use whatever parts you want.
And that highlights the other problem with using the Microsoft stack: There's no community around popular frameworks, the absolute majority use only what comes out of Redmond, and if nothing comes, then they're just stuck.
In the Java community, there were loads of MVC frameworks, people built it, and the popular ones flourished, and people could move on. In the .Net community, nothing really happened until Microsoft themselves made an MVC framework.
So being on the Microsoft stack is more like a roller-coaster than a smooth progression, and that is a problem, because it's not very startup-friendly.
I had almost convinced one of my ASP.Net developer friends who was well fed up with web forms to jump ship to Ruby and Rails with me when .Net MVC came out. After that, there wasn't a whole lot of a compelling reasons for him to start on a whole new language and framework anymore. If only they'd waited a few more weeks! Curse you Microsoft!
.Net is a set of class libraries and a virtual machine, your rant would carry a bit more weight if you at least got the basic terminology right.
(Although it has to be said that even Microsoft can't get it straight all the time either)
For that matter, when using just the base .NET framework for web development, I fail to see any advantage over Python or Rails beyond familiarity, and many disadvantages.
Yes, but that is not what he said. That the majority of .Net developers are completely hooked on the entire stack is a problem when it comes to recruiting people. That is not the same thing as claiming the .Net stack is rigid and inflexible.
I have only looked at web forms, I guess. Never actually formally been taught anything to do with .net. That was enough to turn me off.
This is especially telling considering I did work for "the enterprise" and I'm still doing it as a consultant.
Of course, personally I don't need more propaganda and advocacy.
Just last month I created an app for managing the webcams of a client. I used Red5 (the open-source Flash streaming server), in combination with Apache / Django + a MySql database. Besides my billing per hour, the extra cost to the client for the licensing of this infrastructure was $0.
And for my app, while I would love some of the stuff in .NET, I don't want to pay extra for those Windows servers, even if they provided extra-value over Linux (which they don't).
Putting your business hat on ... as a startup or as a pragmatic consultant, paying extra for Windows servers is not worth the price, unless the cost of switching from .NET is big (and really ... which other technology has such a big cost of switching?).
Sure ... it's easier to blame the lack of advocacy. The Perl community is also doing it (and I would rather go with Perl apps hosted on Linux servers than suffer the Windows licensing hell).
I think it's the first time I've met Mono in a product.
On the other side of that, MySQL enterprise licensing is only marginally cheaper than SQL Server, and one might argue lacks features and rich toolsets to work with in the enterprise. And in the end, most web-based startups are really SaaS so yes, you really do need to be thinking in terms of enterprise, and minimizing annual cost of delivery and ownership/subscriber.
It also doesn't spare your costumer (in the case of consultancy services) to buy licenses.
Second ... not everybody can enroll. The company I'm working for has 12 members ... some of them are field engineers that aren't doing programming (I mentioned we do consulting). WebSpark at least is out of the picture.
Third ... these programs are ticking time-bombs. I've worked on and off on several personal projects for the last 5 years (I'm doing it part time). 3 years is not enough, unless you have a good idea that you're sure it's going to work (and this doesn't happen that often).
> MySQL enterprise licensing is only marginally cheaper than SQL Server
A startup-founder would be too dumb to pay for MySql support.
HINT: you get all the support you need from its community, especially if you attend conferences and buy a round of beer to its core devs ;)
Yes, the backhoe might dig the flower bed faster, but it costs $5,000.00 to rent, there's a one-week minimum rental, and its treads tear up your yard to get to the flower bed. On the other hand the shovel may be slower, but you can borrow one from a friend and it doesn't tear up your whole yard. Let's near in mind these are start-ups with limited capital and no time to fill in the holes that your treads tore up in your front yard.
I have yet to hear anyone using LINQ on anything that's not SQL Server, and considering the NIH syndrome in Microsoft, I wouldn't recommend it.
On the same vein, while C# is an excellent language, there's too many sections of .NET and Silverlight that depend on type casting to the point where there's no advantage to using a statically typed language. And unfortunately neither IronPython nor IronRuby are used in the mainstream.
We don't have any issues with our Windows servers, but I guess the number of issues you run into is proportional to your experience. We would have a lot more problems dealing with Linux servers. YMMV.
Neither is the time lost using RDP instead of SSH
Practice makes perfect...
dealing with licenses
What? You buy it, you install it, done?
requiring much more HD space than the alternatives
Now you're just being silly. Are you worrying about HD space in this day and age? Seriously?
and lacking real scripting solutions.
I'll give you this, but I've yet to see the need for such an environment.
I have yet to hear anyone using LINQ on anything that's not SQL Server
Don't use it then? I think LINQ is a horrible idea, and horribly implemented, so I'm staying far, far away from it. I would never use it or SQL Server in a startup, that would be insane.
I see how you could accidentally recruit someone who thinks it's the best thing EVER and starts using it all over, but recruiting people addicted to the wrong bleeding-edge technologies is a hazard no matter which technology you use.
Using SSH is a much, much better solution for administration. I don't depend on having a large screen or fast connection. Believe, when you're managing servers 8000 miles away it makes you want to tear your eye sockets out.
Licensing. You must be kidding. Keeping track of license numbers, WGA validation, and being artificially limited in how I can move OS images around is nothing pleasant. I don't want to depend on anyone's approval for purchasing licenses; I need to download, burn, and deploy.
> I'll give you this, but I've yet to see the need for such an environment. I've been a UNIX sysadmin, I've seen my Windows counterparts. Please do take the opportunity, if you have the chance, to learn about shell scripting on Unix. It's incredible.
> Don't use it then? I think LINQ is a horrible idea, and horribly implemented Alternatives? I don't know of comparable alternatives. I don't think NHibernate would be right, neither do I want to go back to validating raw SQL.
As for installing, Debian/Ubuntu can't get any easier.
apt-get install <package>
And if you need the very latest nginx? wget <url>
tar -xzvf <tar.gz file>
cd <folder>
./configure
make
make install
Even better, you can script this with bash with little effort. (Complex scripting can be more difficult but that's not what we are doing here)If you go for .NET development, at least do it properly. The up front costs really are an issue, though.
Also, while it is true you can integrate with all sorts of popular open source products such as MySQL, Postgres, memcached, Cassandra, etc you'd have to ask yourself why not just use the environments they are supposed to work with?
Using them with .NET is like doing Windows thick client development in Java - possible, but a horrible experience. It's always the details that kill you. I don't know if you ever had to do Java<->COM integration, but doing that for a while taught me that all platforms have their specialities, and it's a lot easier if you don't fight them.
> Enterprise and startups aren’t mutually exclusive – they’re just different stages in the evolution of software
I think that if you told most startups that 'Enterprise' was another stage, a future stage in the 'evolution of software', they'd hang themselves.
There are a lot features related ot other MS products - SQL server, TFS (source code control, bugs tracking), Active Directory, etc.
The ultimate edition comes with web/load test tools. You can record some actions in Internet Explorer, than VS can create a coded test perfroming all the requests and testing the responses.
VS has a historical debugger, called InteliTrace. It can show you the state of an app at any previous point of execution.
If so, Visual Studio isn't as good, but is kind of comparable. It's better than Netbeans. Personally I prefer Eclipse, but I can see that others may prefer VS.
http://www.jetbrains.com/idea/index.html
The same guys make Resharper for Visual Studio. I can't imagine that Visual Studio is better if the Java guys are making a plugin for it. I have heard that for C++, VS is hard to beat, but I haven't done that in a few years.
VS has evolved quite a lot, and I don't acutely miss Eclipse anymore whenever I'm in VS.
also the trends setup by VC's like YCombinator, good college/university like MIT is, you can make cool products with open source ecosystem.
not sure how much you would remember, about 15 years ago it used to cost a large chunk of money to build scalable apps as 70% of the investment was sunk into datacenter acquisition.
another cool aspect is lot of new popular apps like posterous, started out as a single usable idea were implemented over a weekend and polished with multiple iterations.
licensing cost is still a big negative for those have discovered the power of open source technology, also the community is lot more evolved in sharing the expertise.
application frameworks like Ruby on Rails played a big role in getting the best practices like MVC Architecture, source code management, TDD/BDD, code generation, reuse in open source web frameworks
cloud computing infrastructure like amazon web services and linode VPS maks people experiment new projects at lot less cost.
Personally I have problems with many .Net developers who are "fish out of water", when it comes to living without the Visual Studio IDE. standards and features like XHTML, AJAX(prototype, jquery others ) came lot later in .Net programmers toolset until Internet Explorer was the leading in developer mindshare.
It was only very recently that I stopped running http://www.swfstats.com/ on SQL Server Express.
I think the real difference is it's just not front page news you're doing x with .NET. The web just likes to amplify and exxagerate certain 'accomplishments' ... doing your job in C#, Java, MySQL etc aren't on that list.
I personally enjoy working in .net; the entire development process is very smooth and intergrated.
"Come be an effective software engineer in today's new start up and use .NET to change the internet!"
or
"Laid back atmosphere, free pizza, Ruby and text mate. Let's get at it."
MS is a tool set - not technology. Hackers are very opinionated and want to do things their own way. In my experience, .NET, VB, Visual Studio (all while great tools) require you to do things one way, their way. That just doesn't sit well.
Then of course there is cost, stigma, lock-in, etc. Start ups are the anti-Microsoft, using it as a platform to build their technology, from a very fundamental level, is dissonant.
It certainly is culture shock, and its not going to get any better for Microsoft in these markets. But they don't care, their business isn't designed for it. Microsoft doesn't do consumer products well. If you think about it, the only reason DOS got in front of everyone is because they were able to sell it to IBM.
To be honest, that's not my experience. I've found that .NET gives you a lot of freedom, however things can be indeed easier if you do things the "recommended" way, but there's also an "if that's what you want, you can do it if you think you know what you're doing" mentality as well in the design of the framework. I mean, C# even has pointers which is quite uncommon in similar high-level languages, albeit well hidden so you only get to use them if you really want to.
Contrast that to Python's famous "there's only one way to do it" philosophy. Don't get me wrong, I think Python is really great stuff but I think it's unfair to say that .NET (as opposed to Ruby or Python) forces you to do things "one way, their way". If you want to do web development, you can choose between MVC and the (kind of) continuations of WebForms; imperative or functional, direct SQL, LINQ or the Entity Framework etc. - there are a lot of choices to be made.
That is simply not true. However, I agree that breaking out of the MS mold requires more effort than it does for other technologies, and if you couple that with the fact that the overwhelming majority of .Net developers available are unable to do so, then you get a major reason not to do a startup using .Net technologies, it's simply extremely hard to recruit the right people.
Now Visual Studio is a tool. But not fundamentally different than a tool like Vi or Emacs. And csc is not fundamentally different than gcc.
sounds an awful lot like
No wireless. Less space than a nomad. Lame
Even for the nerdy, a long feature list is not what actually makes people want to use a tool. In the case of Emacs, it's the customizability. With Vim, it's the simplicity, speed and focus on its purpose. Other environments have their own advantages that don't fit neatly in to a feature list.
Vim is here, now, the very second you need it, over an SSH connection, and far, far more customizable and with more useful plugins. The advantages of Visual Studio (namely, integration of features and great code completion) are lost when a framework fits in your head and you've automated most of your tools.
I say this as a person that spends 50% of his time on VS, the rest on Vim.
Second, how is Vim more customizable than VS? I can't think of anything I can't do in VS. There's plenty I can't do in Vim.
Vim does load faster. Although single file load with VS isn't too bad, but certainly no Vim.
And don't use TFS... that's just bad mojo.
I say this as a person who spent 12 years of his life using Vi/Vim before touching VS for the first time.
In the United States the Small Business Administration establishes small business size standards on an industry-by-industry basis, but generally specifies a small business as having fewer than 500 employees for manufacturing businesses and less than $7 million in annual receipts for most nonmanufacturing businesses.
When Microsoft makes something for small business, that's what they are imagining. For a boot strapped hacker working on a website, 500 people and $7 million is a long long way away...
I was willing to sympathesize with this article until the visual studio destroying everyone else feature set wise comment. Despite what you may think you are about the topic, you are just inviting a holy war.
As someone who has used visual studio, eclipse, and text mate regularly I would be hard pressed to say that visual studio destroys anything. I would prefer eclipse since it can do things like "open type" and "organize imports" natively. Things that come for free in the free and open source eclipse ide require you to buy the $80 resharper plugin for your $400 ide.
(and for what it's worth, I wasn't the one who downvoted your comment)
Basically, VS.NET wants you to use other MS products as well such as MTM, TFS, to be very very productive in MS environment. Using VS.NET, SVN, TeamCity and a mixed bags of other software will not give a smooth experience compare to using all-MS or go with Open Source.
Another problem is most MS internal developers still live in the 80s. You can hear "Real man write C++" all the time. Just browse the source code, written by MS employes, on Codeplex. They write C++ in C#. The APIs are out of this world - 25 or 50 lines of code to use a simple feature is no problem.
My issue is mostly around tools, not any of the languages themselves. In my ubuntu/rails environment i was up and running in 5 minutes with a text editor and a couple of sudo aptitude commands. With .NET i had to spend hours downloading and installing two different versions of the .NET framework, VS 2010, and SQL Server Management Studio. This was to say nothing of any external libraries. Now that i am up and running and my environment is setup its fine i suppose but frankly it took days just to be able to do hello world. With Rails I was there in 5 min, and it scaled with me. It was proportionally just as easy to get hello world going as something more complicated. The base bar to getting moving in .NET by comparison was several days - and if i wasn't being paid to do it, i never would have just for the sake of playing around.
- IComparable
- IComparable(Of T)
- IEquatable(Of T)
- IStructuralEquatable
- IStructuralComparable
- IEqualityComparer
- IEqualityComparer(Of T)
- IComparer(Of T)
- overriding Object.Equals
- overriding operators <,>, <=, >=, =, <>
...it's time to find a new language.
edit: Just imagine you encounter a new collection BozBag(Of T) which has to test your objects for equality. Without looking at documentation could you as a coder possibly know if BozBag uses x.Equals(y), x = y, x.CompareTo(y) = 0? Heck it could even use x.Equals(DirectCast(y,Object)) or x.CompareTo(DirectCast(y,Object)). The only way to really know is to dig through documentation.
- The "Structural*" types are new in .Net 4.0, you never had to understand them before and you probably don't need to even know they exist now.
- Many of these listed are just generic vs non-generic. The generic ones subclass the non-generic ones, so contraviance eliminates the need to really understand the distinction upfront.
- Compare means Compare(a,b):int which returns -1, 0, 1.
- Equals means Equals(a,b):bool
- If it ends in "er" it is a functor which operates on two free objects instead of "able" which means one subject of comparison is "this".
- Overriding individual operators gives you more flexibility than Compare(a,b):int because you can use specific algoritms for specific comparisons.
Maybe it's time to find a new arbitrary reason to hate .NET?
You're right, I scooped those off MSDN and never use them myself. All the others, however, have made numerous appearances in my code. I think that the preponderance of comparisons is a language smell-- it's not close to my only problem with .NET development but I think it captures the essential headache-inducing inelegance of C#/VB programming. That language-blob has little regularity but much accretion. There are rarely sane defaults nor any overarching design for your mind to latch onto. After time spent with saner languages (Python, Haskell, Ruby, OCaml, etc...) coding in .NET feels terrible.
As someone who has done A LOT of professional C# development: I've found that with only a few exceptions, the .NET base class libraries are very well designed with entirely reasonable defaults. I use Python primarily now and, in general, the core .NET libraries seem to be better designed than most of the older Python libraries (many of which are getting properly cleaned up in Python 3).
Every environment has its cruft.
HOWEVER, the second that Sharepoint enters the equation, I turn, run, and dont look back. What a horrendous kludgefest that is...
Startups don't use it, because: - there may be other technologies that are better for the job - startups rarely care about Microsoft's heavy marketing which alone can convince a lot of managers to use a technology just because it's from Microsoft
And one of the worst things is that it's a Windows technology, say what you will, but if you want .NET you need Windows, and pay a zillion $-es for license. Yes I know there is Mono, it's very close, but no cigar, it's like wine, it lags.
But in the end I want to ask a question too: What could .NET bring to startups that other languages can't?