Hacker News new | comments | show | ask | jobs | submit login
.NET: So long and thanks for all the fish (lucisferre.net)
85 points by pitdesi on Feb 13, 2012 | hide | past | web | favorite | 104 comments

As a .NET developer that's currently working on a 100,000+ line application that uses all parts of Windows, .NET Framework, and the C# language, I suspect this person is pointing his finger in the wrong direction when he's blaming Microsoft, VS.NET, and C# for "getting in his way".

Best case scenario, is he has been using the wrong tools to solve the problems he works on. But can't admin his own fault.

If anything, what I'm working on now would be downright impossibly complex and infuriating if written in Python (his example of a language and ecosystem).

To me VS.NET is incredible. The .NET framework is incredible. And documentation and information is readily available. But more importantly, the problems I'm solving can't be more easily solved using another stack.

And every time I blame one of the above, a few days later I realize that the real issue was just a stupid mistake I was making myself...

As an example, just the other day I was using a BackgroundWorker (new thread) to do some work outside the UI thread. I needed to do 3 or 4 tasks and decided to re-use the BackgroundWorker for each task (instead of using a new one each time).

Of course problems started showing up. For a while, I was convinced that VS.NET was debugging on the wrong thread, and that there was an issue with re-using BackgroundWorkers in NET. I mean I'm a good programmer, it can't be possibly my fault!

Basically, I forgot to unsubscribe to the BackgroundWorker events. Which caused the previous DoWork attached anonymous functions to run multiple times.

.NET is the way Windows applications are built. VS.NET has no rival on this platform. And this stack is not any weaker because people such as the author leave us. Referencing a few negative blog posts does not prove .NET is dying and that "developers are leaving for greener pastures", which by ALL METRICS is completely not true. If the author wants to think that Python and whatever other choice of IDE will now solve his pain... Then let him eat his cake.

This is a great example of what is wrong with with dotnet. Someone who has been doing their best to improve the situation and finally giving up, after years of effort is dismissed by some random .net programmer as, "...pointing his finger in the wrong direction" or "using the wrong tools to solve the problems he works on".

C# is an incredible language and VS w/ R# is a pleasure to work with. I have been working in this stack for over 6 years, so it is fair to say I have enough experience to know what I am talking about with regards to being a .NET developer.

That said, .NET, as a development platform, is a couple of diamonds covered by tons of shit and surrounded by people trying to convince everyone else their shovel has all the goodies. Microsoft's shovel comes up empty more often than not and each year sees fewer people sifting through it all to help guide those without the time or taste for it. The biggest killer of .NET is that the majority of the community seems content to keep taking spoonfuls from the MS shovel lying to themselves about it's content.

> Someone who has been doing their best to improve the situation and finally giving up,

What I see is a random blogger makes generalized statements based on lack of experience.

> so it is fair to say I have enough experience to know what I am talking about with regards to being a .NET developer.

Your experience counts, just not mine! And you also know what you're talking about!

> That said, .NET, as a development platform, is a couple of diamonds covered by tons of shit and surrounded by people trying to convince everyone else their shovel has all the goodies.

You seem to have a lot of anger.

Thanks for trying .NET.

Have a nice day.

P.S., more than likely the blog author used VS.NET in a "visual" capacity (drag-and-drop component building).

Is it more likely than say a polyglot, unix loving, vim user who automates even .NET tasks with rake scripts and enjoys long walks on the beach also being sexually attracted to destroying every software project by dragging and dropping in a completely broken visual design paradigm?

Thanks for almost RTFA

Have a nice day yourself ;-)

I was trying to shape why this is an issue to the community that you and I are a part of. I don't know the author personally, but had heard of him before this blog post. The departure of individuals and those like him is a serious problem and will, in my opinion, ultimately kill the platform. Dismissing this problem will not solve it.

"But more importantly, the problems I'm solving can't be more easily solved using another stack."

Can you expand on that a little - what are the particular characteristics of the project that make it better suited for Windows than for a web stack of some sort?

If OP actually cared about the execution speed, he'd be able to have the .NET code running often almost two orders of magnitude faster than Ruby:


If he says that Ruby fits him better I can just conclude that he trades the execution speed for ease of the development, which can be a reasonable trade-off. I'd still like to hear him talking in a year if he actually worked on really comparable problems in .NET and in Ruby.

I'm not very familiar with Ruby, but with Python, I can profile my app, map the hotspots and easily rewrite them in C. Probably, I'll be done with the rewrite before the .NET version reaches RC quality. There is no reason to assume Ruby would be much different.

In reality, I very rarely have performance problems. I have heard Ruby got much faster with the 1.9 release.

If you "rarely have performance problems in reality" that explains a lot. Speed differences between Ruby and NET (see the link in my previous post) translate to having one server instead of twenty. If you make low traffic solutions, that's OK. If you move bottlenecks to something outside of your responsibility (like for example, your app waits on sql server because no caching is done) OK, not your problem. If somebody doesn't have problems in buying more hardware, OK.

Still it's approx. 20-times (see the link before, it is for Ruby 1.9) trade-off between development convenience and the hardware involved.

If you really need a rack full of Ruby servers to do the job of a single .NET server, your Ruby programmers are doing something (hint: most probably everything) wrong. Language choice excepted.

Server performance is only very rarely tied to CPU performance. There are a whole lot of factors other than that that impact performance.

I think you mixed up something (a detail, really): the author actually mentions Ruby, and Rails. Only a comment is mentioning Python, once.


>Are you expecting me to believe that in the entire development universe there is no solution adequate to any serious problem that didn't come from the MS stack?

The previous post does not say this. He is saying that for the particular problems he is facing (likely very Windows-centric), he doesn't think any other stack would be "better". Other stacks could still be equal (but if he knows .NET, there isn't any gain for undergoing the learning curve) and they might work better for other problems.

Fair enough.

"But more importantly, the problems I'm solving can't be more easily solved using another stack."

Its a sweeping statement to say the least.

I know the VS IDE and such often prevent you doing dumb things/shooting yourself in the foot and its great!

But are you saying that in the entire development universe there is no solution adequate to any serious problem that didn't come from the MS stack? You'll have never done anything like massively parallel computing or big/complex data sets then. Or AI development.

Air Traffic Control system in .Net, for example? Nah.

.Net is a just a general-purpose tool for writing certain kinds of software. That's all. And it is telling that none of Microsoft's core products (the ones that earn lots of cash) are even remotely going to ever be converted to .Net or managed code.

> Its a sweeping statement to say the least.

No. It's an exact statement based on the particular problem I'm solving.

> I know the VS IDE and such often prevent you doing dumb things/shooting yourself in the foot and its great!

I have no idea what you're talking about unless you think that VS.NET is "visual drag-and-drop programming". I've never used it as such.

> .Net is a just a general-purpose tool for writing certain kinds of software. That's all.

.NET is a higher abstraction of the win32 api with many many additional features. And that's an understatement.

And that "kinds of software" is more or less the entire Windows desktop market.

Funny to see this considering my opinion is pretty much a polar opposite to Chris'.

In the last couple of years C# has gotten better than ever. LINQ, Lambdas & Generics combined with the IDE's autocomplete and refactorings have made the language really nice for power devs.

The next release will include a Compiler as a Service which could be a game changer if it's embraced by the community and if it's not borked by Microsoft.

A good rule of thumb for .Net is that anything from Microsoft which is built around a tool should be avoided like the plague. For example Entity Framework and WPF are horrible tool-bound monsters. They don't play well with version control, don't play well with clean coding (POCOs) and almost feel designed to sell other tools (SQL Server / Expression Blend).

Entity Framework is especially bad. It combines terrible performance, terrible scaling (it has terrible support for large schemas) and until recently didn't even support "code first" development.

Thankfully, like other dinosaurs that kind of thing is going the way of VB6.

To add a bit of context: I have a pretty broad background - been coding for 21 years (started at 10) and have experience implementing something significant in: C64 (BASIC/6510asm), Pascal/Delphi, VB, Java, PHP/HTML/JS, TSQL/SQL, C# and ActionScript/Flex. I've dabbled with Ruby and the beautiful Python.

I abandoned dynamically typed languages for serious projects (those expected to work for > 5 years) because of the poor refactoring support and the dominance of style over substance in the community. I work in the Enterprise, and there software maintenance quickly dominates the cost of projects making the big two static languages a better choice.

I still, of course, turn to dynamic language when they're the best solution to the problem. For example for situations where speed of development dominates returns (think opportunity cost) or where a language is deeply embedded in a specific community (Python and NLP).

I remember the joy of saying goodbye to the limits of BASIC when I switched to C. Ah, the power, the control....

After a while, I was sick of debugging memory and having to rely on "libraries" just to do anything useful with strings, and it was such a relief to discover Perl. Talk about power! I was suddenly creating little utility programs for everything. It occurred to me that I could have been writing these utilities in C all along but I never did because the time to write and debug them was more than the time they would have saved. What a joy to discover Perl (which then led into learning the Unix command line and its utilities.)

But after a while, I noticed how often I still had to look up the "clever" syntax of Perl. There were so many other ways to do things that I couldn't read other people's Perl without a reference book beside me and, heaven help me, sometimes I couldn't even read my own. That had never happened in C, But I wanted to create commercial GUI apps. Perl's answer? Use Tk? Yeah, right.

So, I switched to C++ for GUI apps, and what a treat to have that kind of power compared to Perl. But then I rediscovered memory debugging, what it's like to not have a string datatype, and I learned that the usefulness of OOP was offset by all the ridiculous little gotchas that meant you always had irreproducible bugs that you hadn't yet discovered.

What a relief when Java came out. Almost all the power of C++, plus built-in strings, arrays, even Unicode, but without most of the hidden gotchas. I could concentrate on the demands of the problem instead of the demands of C++. Like lots of programmers, I found Java much more fun than C++.

But of course there were things I missed--structs, enums, regular expressions, GUI apps that looked native--and every time I complained to Sun reps in a meeting, they would simply explain to me that they knew more about programming languages than I did, and they knew that I didn't really need these things. They held that position ("No, trust us, you don't really want that") for years.

But the Microsoft reps were always EXTREMELY interested in anything we wanted from Java but that Sun wouldn't give us. "What do you wish Java had and how would you use it?" They took lots of notes. Superb marketing.

When C# was released, it was with great relief that I finally got the language, native GUI app builder, and other things I'd been longing for in Java for so long.

Building GUI apps with C# is still a joy, but I'm always frustrated at being limited to Windows. I use Macs and Linux boxes, too, and Mono has never quite been what I had hoped for. I need to do a lot of web programming, cross-platform number crunching, and all sorts of things. And having to (repeatedly) buy all of those Microsoft tools and be a "registered developer" and all that nonsense, phooey!

Thank goodness, I found Python. Free, available on every platform, great built-ins AND great libraries.... Like Perl, but with a syntax I remember without looking things up. I can read other people's code without a reference.

But I wish it had the flexibility and macros of Lisp, the power I've found in functional programming, the easy GUI creator of C#, the speed of C... and a pony.

I understand the OP's feeling of relief at leaving annoyances behind. Believe me, I do. Every system I've used has had problems I'm glad to rid of and features I still miss. But that's what you get when you change a relationship, move to a new house, sell your car, get a new job. And, with programming languages, you can go back when you need to.

It's often good to move on, but it doesn't mean what you left behind was bad. Sometimes you just need different problems.

Many geeks/hackers don't understand or won't accept the fact that you just mentioned regarding maintenance and Enterprise.

The idea of attempting to refactor a 100k+ loc codebase, without static typing and a compiler that can identify issues at compile-time versus runtime is equivalent to asking to be punished. If you must, consider that the role of a type-checking compiler is simply to perform a first round of automatic unit-tests, tests that are conveniently available after providing some typing annotations. To escape static typing - if there is a demonstratable and exceptional need (loose coupling), simply wrap the required events up as objects and switch and downcast on them with enums or use a visitor pattern.

Unfortunately associating dynamic languages like ruby, python and javascipt with some narrative of hacker agility and contrasting against a clumsy slow-moving 'enterprise' culture is confounding the issues. This is not to say that there aren't plenty of vendors/consultants selling FUD and over-hyped and over-complicated 'solutions' in 'enterprise' but it's a non-technical issue.

First, lets assume your 100k+ loc codebase would be about 10k+ loc if coded in most of the "overhyped" languages. That's the primary reason there are not that many huge codebases in them - huge codebases aren't needed. That's also a reason no multi-year development is done with them - it just doesn't last that long.

Next, remember not having to upcast and downcast objects considerably simplifies the code, simplifying the tests you need to write. Less code means less places a bug can hide.

And, finally, understand that, while not passing compilation proves your program is wrong, passing it doesn't make it any closer to correct.

Trust me. I've seen enough "enterprise" codebases in my life. They aren't that special.


Assumption #1: 100k+ loc codebase in X == 10k+ loc in Y (somehow... magic)

Assumption #2: Assumption #1 is the primary reason not many huge codebases in Y

Assumption #3: Static type implies upcast/downcast objects (despite the presence of generics...) == simplifies code == simplifies tests.

Fact: Less code == less places a bug can hide

Fact: BTW! we all are using tried-and-tested libraries to cut down code to be written

Fact: FindBugs (or static code analysis) does actually find bugs to eliminate most technical bugs and leave you with business logic (and quite possibly race condition bugs).

Argument: Compiler isn't special, see, I just show you it doesn't proved your code to be correct, there's the logic bug in your Business Logic. (Except that happens as well in dynamic language, AND on top of that you gotta work a little bit extra since you ain't got no compiler).

I think this has become your typical nerd holy war between static vs dynamic with no end.

Here's my biggest problem with Ruby or Python community: your libraries tend to have short-lived (i.e.: orphaned).

When I looked at Java community, they're quite stable and rock solid since 2004-2005 (Apache Commons, Maven, Ant, FindBugs, Eclipse, EclEmma, Spring Framework family, JUnit, Hibernate). Newer libraries tend to have good internal codebases (GWT, Google Guava, Mockito). Most APIs are stable and solid.

The stupid ones tend to get kicked out of the crowd (i.e.: Struts, JSF)

This is what I'm looking for. I can focus on writing code that matters, instead of refactoring my code once every 4 months because things changed and I have to keep up.

> Assumption #1: 100k+ loc codebase in X == 10k+ loc in Y (somehow... magic)

Have you ever worked with any significantly complex (as in "does a lot of stuff") in Ruby, Python or Smalltalk? Do you sincerely think you could express that same level of functionality with C, C++, C# or Java?

> Assumption #3: Static type implies upcast/downcast objects (despite the presence of generics...) == simplifies code == simplifies tests.

Generics are nice until you have to implement something that accepts them. I gave up once.

> Fact: BTW! we all are using tried-and-tested libraries to cut down code to be written

And language features that do just that (see Assumption #1)

> ... static code analysis) does actually find bugs

Actually, they are one step above syntax errors.

> Except that happens as well in dynamic language

No. Not really. Of course, I may pass a list to something that expects a file but, provided I embraced the idea of duck typing, that would probably work just fine. And yield correct results.

And avoid implementing a similar function that receives a string instead of a file.

> AND on top of that you gotta work a little bit extra since you ain't got no compiler

Most errors a compiler catches are traditionally caught in tests with dynamic languages. But having compilers doesn't allow one to skip writing proper tests with statically typed languages. In fact, considering you'll have to deal with more situations, you'll have to write more tests to go with your less concise code.

> I think this has become your typical nerd holy war between static vs dynamic with no end.

I think statically typed languages have their place. I have written tons of C and Java (and a bit of C#). I just admit my ST code was not significantly better than my DT code and was considerably more complicated, with more functions, classes, interfaces, configurations, indirections, and much more verbose. The 10x loc difference is very real. In the end they were all, ST and DT, correct.

> Here's my biggest problem with Ruby or Python community: your libraries tend to have short-lived (i.e.: orphaned).

I'm nos as familiar with Ruby (the language mentioned in the article) but I can tell you Rails (the framework mentioned) is very solid and very well maintained. Compatibility can be broken from time to time, mostly for good reasons. And you don't need to rush to update your code - you can be perfectly happy using older libraries. I can tell you, however, Python libraries are remarkably stable. The impending move to Python 3 is the only significant example of code breakage, but, again, it's for great reasons.

> they're quite stable and rock solid since 2004-2005 (Apache Commons, Maven, Ant, FindBugs, Eclipse, EclEmma, Spring Framework family, JUnit, Hibernate).

A couple of them gained significant functionality in the past couple years. If you want to use the new functionality, you'll have to refactor your code, often extensively.

> I can focus on writing code that matters,

Ditto here. I just write less code (in less time) for the same amount of "matters"

> instead of refactoring my code once every 4 months because things changed and I have to keep up.

With the extra time you get by writing less code in less time, you certainly have the time to refactor. With good tests, you have the certainty the refactoring was successful. Besides, nothing is compelling you to switch to incompatible versions every 4 months (I don't even think that's possible unless you are doing so deliberately). What is the problem here?

I use Guava extensively and it has helped me quite significantly to reduce some of the code normally Java developers wrote.

I use Rails for CRUD app and I use Spring MVC too.

I used Python a lot a few years ago from writing tools (testing, scripting, automation), to small web-apps.

Saying that 100k can be cut to 10k (or 1k) is like pulling number out of thin air, that's what I find... "magical". It's like some CEO of a startup giving a deadline to the developer to write Hadoop in 4 hours; pulling the number out of thin air.

Compiler => helped syntax errors and types (95%, 5% consist of reflection hackery that might bite).

Static code analysis => One level up from syntax errors, focused on common pitfalls and bug patterns

One step, two step, three step, doesn't matter, it helps, that's the bottom line.

What I refer to "except that happens as well in dynamic language" is to the business logics, the app logics, not syntax and whatnot, you _got it wrong_. We all got business logics bugs that can't be caught by anything other than testing the app themselves (QA, automation, whatever).

So we agree that dynamic languages requires you to write more testing code because there's no compiler? Gotcha.

I never say anywhere that using a static language requires NO testing.

What I found is that a bunch of old-timers who wrote Java back in 98-2003 and didn't use more modern Java frameworks and tools but already jumped the band-wagon to Rails or Node.js keep singing the same tune.

When I use Rails, then Spring MVC + Spring Data, I noticed that the amount of business logics that I have to write is more or less the same. 10x is again out of thin-air. I admit writing code in Java requires more typing albeit Eclipse helps a lot (and please don't bring the old argument of "But You need an IDE!", who cares what I need as long as it helps me to do my job).

Picking one example to refute the epidemic that occurs in the ecosystem is probably not a strong argument (Rails is well maintained, I give you that, although it takes Rails up to version 3.x to realize that they need to cool down and stabilize but I give you that, but that doesn't mean the other plugins and libraries are held the same level of quality and commitment with Rails).

> So we agree that dynamic languages requires you to write more testing code because there's no compiler? Gotcha.

No, we don't. I never said that. Since there is less code structured in simpler ways, there can be less tests (there are less code paths). Since the tests themselves are written more concisely, the tests themselves are smaller. The syntax errors will be caught in the tests because most dynamic languages actually compile the code. They just do it as needed.

Again, the 10x number is not out of thin air - we keep a lot of Java applications here and, more than once, we rewrote them in dynamic languages. We saw better than 10x ratios, although with the more recent, nicer Java code is more like 5x.

> Picking one example to refute the epidemic that occurs in the ecosystem is probably not a strong argument

I am not very familiar with the Rails ecosystem, but if most of the libraries someone picks tend to be abandoned, maybe the problem isn't in the libraries, but in the selection process.

True, Rails is such a terrible and unsupported framework.

If 90k of your 100k codebase is generated code - and there's a good chance that it is - then the size of the codebase is no reason to switch to an interpreted language.

Are you sure generated code is a good thing? Isn't it just support for limited expression power, something you shouldn't be able to get away with in your language of choice that your tools help you with by writing lots of code that are required to express what you intended?

Wouldn't it just be nice if you could get away with just the code you wrote?

Maybe because it's simply false.

Static typing is not a pre requisite for quality code. Quality developers is. If you have your codebase maintained properly, maintenance is easy and cheap.

How do you know it is false?

(Hint: don't argue with me at this point, it's just random geeks meaningless debate. Really. I mean it. Y'all don't have a good proof that dynamic typing implies better developers or static typing implies bad developers and I'm a bit tired to hear "Good developers, not tools" that kind of crap when most Python/Ruby developers are just as average as Java developers).

> Y'all don't have a good proof that dynamic typing implies better developers or static typing implies bad developers

I never said (nor implied) that. I said dynamic typing leads to more concise and readable code. Most of the time, you'll be reading the code, so, it makes sense to optimize for readability.

> most Python/Ruby developers are just as average as Java developers

Wouldn't it then make sense to give them better tools? I don't use Python because I'm better than my colleagues who prefer Java - I use it because I want to get the job done and keep it done with less effort.

The argument of "readable" code is like saying Steak taste better than Chinese food: it depends on your audience.

I used to buy the whole dynamic language argument (heck I even lead local Python user group) but not any more these days.

To me, Ruby is less readable than Python. To me, when reading a large code base, Java is more readable than Python. To me LISP is weird (even though I kind of like it).

Now you said "it makes sense to optimize for readability" the problem with this statement is that less code != readable code (and I don't mean to jam everything in one line a'la Perl). I find that I need to read, re-read, think, and re-think a few times just to understand what the Ruby crowds refer to short, concise, and elegant code.

Whereas in Java, albeit more terse, I can just read within seconds to know the intention of the code.

So it all depends. Hence me not buying the dynamic vs static debate.

> the problem with this statement is that less code != readable code

Never said that. When writing code I never go for the least possible number of symbols (if I did, I'd write traditional APL). Still, more concise code is often closer to what you want done than the details of how you'll get it done. While I find Ruby's syntax a bit confusing at times (and that's why I prefer Python) I cannot deny idiomatic Ruby is very close to intention than to implementation (to a fault).

Well, I don't ... and it isn't just me who thinks claims made about the "enterprise" are pure marketing BS.

Perhaps that's because most people who think that the claims are BS have never worked with codebases that are expected to exist and be maintained for at least a decade with minimal downtime.

Within large companies those types of codebases are normal. The upfront development cost of applications is significantly less than the long term maintenance cost - especially once you've factored in the cost of hardware over the time period, and having to keep institutional knowledge of the applications amongst development teams, sys admin teams and network teams.

Oh I have worked with codebases (in large financial institutions and in engineering applications) that are meant to be contiguously maintained for more than a decade. They have been working nicely 16+ years and are easy to maintain with no downtime. Obviously, none of it involves the CLR or .Net. On the other hand, I've also seen seriously big projects ruined by .Net with no handover or documentation. But worst, no accountability. I've also seen a few successful ones but I would expect that culture to deliver continuous quality -- but it surely hasn't.

That's why I am saying that most of these claims people bandy around about enterprise computing are nonsense.

We don't do marketing BS since well.. we'd like to use Rails occasionally as well.

All I can say is that YMMV since this debate typically goes to no end.

If we have a super-hacker on our team that can fix any problems ranging from C to Assembly to Linux Kernel to everything under the sun, we'd take the risk of using cutting-edge technology such as Node.JS to do SOAP/WS-*. Otherwise, it's all Java/.NET plus outsourcing the risk to Microsoft/IBM/Oracle support when shit hits the fan.

Certain things don't apply to internet companies by the way. They can write a SOAP library, put it on Github and blog about it how much they save the money but Enterprise project has deadlines and impatient customers.

What's your take on the use for Haskell in the enterprise for large code bases?

It depends on what you're building. That's why it's good to know a broad range of languages : you can pick and choose the best options from the general purpose languages, or use your knowledge to build your own simple DSL..

When appropriate : language/framework choice depends on more than just technical factors...

I'm not a .NET person. Heck, I'm not even a Windows person. I found this sentence interesting:

Things like the Microsoft "professional engineer" who advises you at your invitation, and then sends e-mails behind your back to executives to inform them of his concern about the "business risks" of non-Microsoft technology choices.

That's really weird. Who finances these commissars? I mean, I've seen this sort of thing take place, but only when a two-letter consultancy was gunning to take over some director's entire department. What's in it for the commissar?

In the .NET ecosystem, there's a number of individuals that enhance their own self-promotion by hitching their wagon completely to the Microsoft train. They present themselves as "experts" and justify high hourly rates by presenting their Microsoft sponsored credentials.

Often such folks have little in the way of open source contributions, commercial products, or shipped code that they can point to. But they've probably spoken at a number of events promoting "The Microsoft Way" and have likely been awarded a Microsoft MVP award as a result of those efforts.

In general, they get by simply by advocating the Microsoft toolchain, and moving on from consulting engagement to engagement just before they're exposed. Or they focus their consulting services on large corporate IT where even their meddling makes little difference in the grand slow scheme of things.

This is how most mid-size traditional consulting companies work. You can switch the word Microsoft to IBM or Oracle or something else.

This is how you get referrals. Like it or not, it's business.

I realize that traditional consulting companies hitch themselves to particular vendors or sets of vendors. I was surprised that consultants would act as Party Commissars, reporting developers or groups that depart from their preferred vendor(s). I thought reporting people for deviation from a party line went out in 1989, when the Berlin Wall fell.

A lot of the folks that I referred to are actually independent consultants, or switching consulting companies regularly.

That phenomenon transcends the typical consulting firm loyalty and is more of a culture around Microsoft products.

See this all the time. Its astounding what some of these people get away with.

I've been developing with .NET for seven years now and I've worked with many talented .NET developers, none of whom have been dogmatic about any Microsoft technology. All have been well-versed in open-source alternatives, and the industries I've worked across: financial, media and retail, have never queried any decision to choose these over Microsoft-owned technologies when presented with sound argument. Maybe I've just been lucky.

I'm a .Net engineer who feels like this day will also come for myself very soon. Don't get me wrong, I love .Net. It has treated me well and I love the direction that Microsoft is going with Azure, their adoption of open source, and the resources they provide for startups.

Sometimes it's just hard to 'switch over' like the author as done. I've done plenty with Java and PHP too but there's nothing there that excites me really. So now I'm dabbling with Python to see if there are any sparks there. Have I made a good choice? I guess we'll see.

I do find it interesting that you don't seem to hear people say things like "I'm done with Ruby, switching to Python". People make a bigger deal of leaving .Net and Java as if it's something you'll never go back to.

Why not try F#? That's a genuinely awesome language, an ML usable in the "real world".

I tiptoed around this a bit, but I think F# is great. I have little experience with it, but I work with someone who has been using it pretty extensively for a bit and we've talked about it a number of times.

This, however, is where the environment/culture issue (that I also danced around) comes into play. In most .NET shops it would be extremely hard if not almost impossible to bring in another programming paradigm like functional, let alone mix it. This is perhaps a bit ironic considering most of the same places use javascript, but if they could write C# instead of javascript on the client side, I'm certain most would (in fact when ASP.NET first made this somewhat possible it was the norm until people got bitten by all the pitfalls).

From what I can tell the biggest issue you (and many others have) is the environment/culture issue. The stuff you see or some of the ways that you are expected to code with C# in many .NET shops will make you want to claw your eyes out. (And though I don't have any first hand experience, I reckon it's the same way in Javaland.)

F# is a mighty fine language but introducing that into an established shop just isn't going to happen. It's personally my favorite language but there is a very steep learning curve coming from C#. For my projects I use Windows & Linux, C#, Python, JS (client), and F# all over the place. I keep the programs small with a service orientation so it's easy to switch languages.

Anyway, all frameworks have their problems. It's hell to make a program of any appreciable size in Python. Javascript/Node turns into callback hall of mirrors. Avoid creating a mammoth framework with these and it all works out great. And while it doesn't have everything in the world like the Python ecosystem, .NET OSS ecosystem, which is really coming around. And Microsoft itself is encouraging exploration of other frameworks, e.g. NodeJs and WinRT's first class Javascript support.

My take is the problems usually aren't framework/tech related. It's about people and process. Diving into a new framework really isn't about the tech, it's about learning the tech, and thereby giving your brain some much needed stimulation.

Believe me, the cultural issues you will face introducing F# will be 1/10th of those of introducing OCaml, I speak from experience!

Well fortunately that won't be an issue for me anymore ;-).

No need to leave .NET behind if you take up Python. Check out IronPython[1], which gives you all the resources of Python and .NET.

[1] http://ironpython.codeplex.com/

> you don't seem to hear people say things like "I'm done with Ruby, switching to Python

No, it's usually more along the lines of, "Ruby is beautiful (but I’m moving to Python)" (http://news.ycombinator.com/item?id=3179370 :)

This is the problem that you define yourself by your programming language/environment/OS of choice, versus just being a really good problem solver.

See: http://www.kalzumeus.com/2011/10/28/dont-call-yourself-a-pro...

I would say don't call yourself a [Java|Javascript|C|C++] developer.

If your career were a blog post, languages are more like a tag than a title.

Contrast "I Solve Problems" with "I Only Solve Problems with PHP."

I don't know, I think that everyone has a "go-to" language, and I don't think that's a reflection on ability to solve problems.

After all, if I'm making a web site there really isn't a choice to make between Python, C#, Ruby, etc.- they're all going to do the job with almost identical ability. Doing it in a different language for the hell of it is definitely a fun learning experience, but if I have a client on the other side I'd rather get it done quickly.

There may be a population of developers who can jump super-easily between tools/languages. But I think the population of developers who, simply because it's what they have spent the most time with, are more productive in one environment is larger.

The OP is basically saying "I'm super comfortable & productive with the MS stack. It's been fun and good. Now I get to focus on something else. The change will be good for me."

Nothing wrong with that.

Not at all, where do I define myself by my programming language/environment? What I am saying is that language/environment is not a no-effect choice. It has an impact on productivity, efficiency and most importantly the clarity and (for lack of a better term) UX of the code left behind for others.

The problem with your assertion is it assumes that all languages, tools, frameworks and environments are equal to the task.

I am a really good problem solver (at least in my opinion) I just don't want to make the implementation of those solutions harder on myself than it has to be.

That's a nice ideal but it doesn't work very well in practice. It takes an enormous investment to become an expert in any given technology stack, easily on the scale of attaining a college degree. When a restaurant needs a baker, or an executive chef, or a pastry chef they hire specifically, not generically. So does the tech industry. If a company has a rails stack and they need someone up and running quickly it does no good to say "I can do it, just give me a few weeks to get up to speed and a few months to get really good".

Plenty of companies go for talent over niche. When you expect the average person to last 5+ years it's dangerous to only higher people that know exactly the stack you work with every day, because it narrows everyone focus and they ignore edge cases where it's really better to use some other tool.

Sure, but there are limits. If you have a company that is heavily focused on web dev, you are naturally going to want people who have web dev experience. Maybe you won't mind too much if someone with a lot of talent has a history with Python or PHP and your current systems are based on Rails, but you will probably be a lot more cautious if someone applies with a background in programming IBM/360 systems and knows nothing about html or the web?

I do think it's important to hire on talent, but I think the other extreme of a super generic "computer-based problem solver" is very unrealistic. Not every company can afford the delay of bootstrapping someone into having expertise with the technologies the company uses.

Gotta admit that I'm getting to that point too, so good for you. I've been working with the .NET stack since the beta, and at this point in my career I dabble in other languages, but keep coming back to the bread and butter since "that's what I know". All the while I'm involved in the ALT.NET community secretly eyeing Rails and Python wondering when and if I can take a hard left and make the jump. I'm sick of working in the .NET box where we get excited about tools and features that were released years ago on other stacks, just to have a port done that's about 3/4 as good as the original.

tl;dr; good for you man.

Is there a support group for folks like us? :)

I released a commercial .NET app 2 weeks after the official 1.0 release and am still using the framework. I've dabbled in Ruby, Java, JS, written an iPad application, etc. I have my gripes with some of the .NET tools but I really like C# as a language. My biggest gripe is the business decisions made by Microsoft over the past few years. Under Gates, Microsoft really understood the developers created their monopoly. Under Balmer it feels like Microsoft wants to extract every ounce of blood from developers which is ultimately going to bring down the house.

The "tl;dr;" version:

I just want languages, tools and frameworks to help me get work done and then get out of my way. Is Rails a clean code panacea? Is Javascript elegant? No. However, am I more productive, less burdened and do I have more options and flexibility? Absolutely. I am far less frustrated trying to produce elegant, clear, extensible and maintainable solutions in these dynamic languages. I also find that dynamic languages, modern web frameworks and -nix is just more fun.

Two years ago I began developing a large web application and I had to choose a language and stack. Having built applications on .NET and PHP most recently, I knew I could fall back on either and be safe. I decided to investigate RoR and .NET MVC. For whatever reason, RoR felt strange and I knew it would have a steeper learning curve initially, but probably be more efficient to develop with in the long run. On the other hand, .NET MVC felt a bit more familiar, and had many attractive qualities that "appeared" to mimic RoR. I went with .NET MVC. Now 2 years later I find myself spending my day job in .NET MVC and my side projects are all RoR. I found that .NET MVC was a great bridge from regular .NET to RoR. I am frustrated that I didn't pursue RoR harder 2 years ago, but hind sight is 20/20. I am extremely happy to be working on side projects in RoR because honestly it is more fun. Don't get me wrong, RoR isn't all roses, I'm just finding fewer weeds!

I'm also primarily a .NET dev, using ASP.NET MVC. But for my most recent project I used node, and I'm hooked. Probably because it allowed me to take existing JS knowledge and apply it, but still. ASP.NET MVC just feels too heavyweight afterwards.

That said, whenever using something other than C# I miss LINQ. It's awesome.

I've been working a lot with node lately as well, there are some things I like but some I miss so much from C# ... there is nothing anywhere near as good as VS for node, and god I miss ReSharper and compilation errors.

I'll admit it. Losing that is a bit scary in some ways. It does lead to some laziness though. But sometimes it's awesome to remove a property from an object and have the compiler tell you all the places that are broken now.

On a similar note. I've followed your Playtomic blog a bit and it helped me make the jump to MongoDB for our gamification platform. (We still use SqlServer for lots of things though) Here's to trying new types of kool-aid! :)

Funny to say you miss "compilation errors", but as someone who works with ASP.NET MVC during the day and RoR at night, I know what you mean.

I had the same frustration, until I finally broke down and just fed my JS through jshint (http://www.jshint.com/). Keep a JS console open while developing and have it display relevant parts of the returned object you care about.

Unfortunately there's no reSharper for JS but eh... I feel like it's not as necessary with JS as its a fundamentally simpler language than C#.

This reminds me a lot of posts I used to see on Javablogs 5-6 years ago. Not sure what that means, but I don't think it's the language so much as where people _are_ with the language. In 2005-2006, there were a lot of folks who'd spent almost a decade with Java. They were good at it, but they were also getting bored and looking for new horizons, and Ruby and Python were available. Beta versions of .Net rolled out in 2000, so we might have the same kind of phenomenon.

None of which is to say other languages might not be better. But being better has never been enough, on its own. If it were, C++ might never have gotten a start. Language popularity depends a lot on history. But boredom/dissatisfaction with a dominant language can help give a new language a chance.

I think a big part of it is also the dead weight that accumulates with older technologies. Sometimes it is a person just making a decision for the stability of their household or because they've been at it so long it is all they know. Whatever the cause, as a technology (particularly a language) ages, more and more people that are change adverse remain and those (many times the best and brightest) move on. Not really surprising, but a bit unfortunate for those who remain.

I'm using .Net (MVC3) for my current web startup. I thought about python, I thought about RoR, I thought about Java, but I decided on .Net.


I knew C# well at the time, maybe not the best out of the languages I know, but well enough to hit the ground running. And I knew with MVC3, I would be running in no time. Visual Studio is an awesome environment IF you have a fast PC. I have a fast PC. LINQ, and LINQ to SQL, is incredibly powerful. I can drastically alter my SQL DB, and have my ORM code auto-generated immediately.

Out of the box, .Net takes care of a lot of the detail. I can optimise this detail later if I need to (I hope).

With the aim of this code being maintainable, and having hated maintaining a large python code-base before, I wanted to use a statically typed language.

Importantly, I knew .Net was going to be scalable when I needed it be (stackoverflow.com as an example).

How is it going?

Very well. But I've not launched yet. I have no regrets, and think C# is an amazing language to work with.

I would generally consider myself language agnostic, so whilst the decision was hard, I was confident it wouldn't matter too much in the end. Hopefully that will remain the case, but you never know what's around the corner...!

"It seems as though the whole philosophy of .NET centres on catering to the novice... .NET, and specifically C#, both coddles you and then scolds you at every turn."

Perfect summary and exactly how I feel about .NET.

I'm trying to figure out how a language which features reified generics, covariance and contravariance, lambdas, expressions-as-data, type inference, both static and dynamic types, reflection, and anonymous types could be considered by anyone as "catering to novices" or "coddling" you. Say what you want about MS, but C# is an incredibly powerful and expressive language.

The image in the link sums it up ("...all without writing a single line of code!", which I've heard personally in Microsoft events). It's not that the languages or the framework lack advanced features, it's that Microsoft/MVP's constantly tote the "beginner" features. I find C# to be very fun to code in... so long as you avoid anything that the tool will do (or only the tool can do) for you.

After seeing a few blogs like this, I was starting to get the general impression that C# and .NET were dying out.

However, according to the TIOBE Index [1], C# was actually second in growth in 2011, just behind Objective C. Not sure how reliable that is, but thought it was an interesting (and unexpected) trend.

[1] http://www.tiobe.com/index.php/content/paperinfo/tpci/index....

I think there's some significant selection bias on HN, particularly against Windows and Microsoft. It seems a disproportionate amount of the people here are using Python/Ruby on OS X, so naturally you'll get more articles about moving to that sort of stack and away from .NET and the like than the opposite.

In reality, .NET is actually a very interesting platform. LINQ is actually really cool and C# is largely a better language than Java. If this isn't enough, you can always use F# which is a very nice functional, statically typed language based on OCaml. On top of this, MSR produces interesting research in programming languages, which can easily be subsumed by their product languages. There is actually a healthy exchange of ideas between Haskell and the .NET languages, for example, even going both ways. (Haskell recently got some features from LINQ, for example.)

What are those LINQ features you're talking about?

I was particularly thinking about things like order and group in list comprehensions[1]. Turns out the paper introducing them was actually from 2007, so maybe it's not that recent :). (I thought it was newer than that.)

[1]: http://research.microsoft.com/en-us/um/people/simonpj/papers...

Here is a random video I found earlier where SPJ talks both about this in particular and the exchange of ideas between Haskell and .NET in general: http://www.youtube.com/watch?v=iSmkqocn0oQ

Influx of new developers != increasing utility of the language, especially for seasoned devs.

As the OP notes, It seems as though the whole philosophy of .NET centres on catering to the novice, but even as the novice evolves into the “advanced beginner” they inevitably find they want and need more.

With everything that's been and being added to C#, I'd argue that it keeps getting more and more interesting for experienced developers and further away from novices.

Your typical novice developer is going to have a hell of a time trying to understand any non-trivial C# projects these days with all the function features that have been added - especially with things like PLINQ and TPL.

The utility for experienced developers has increased over the years, it's accessibly to inexperienced developers has, however, decreased.

I think the argument is about viability of a career choice. New developers don't come up in a vacuum if there's no demand, they'll quickly switch to something that pays the bills.

Is there any indicator(other than a few HN posts) that .NET (or # of seasoned devs in .NET) is actually in decline?

>After seeing a few blogs like this

The reason you see blogs like this that some in HN reflexively vote up anything that is anti-.NET or anti-MS.

Around a 50% use Macs and a significant percentage use Ruby, Node et al. Since people tend to vote up things that make them feel good, 'OMG .NET IS TEH SUX' posts tend to get on top.

I too have second thoughts about .NET. I absolutely love C#. I've worked in just about any language & dev stack out there and, to me, nothing comes close to the immense power of C#. My biggest gripes with .NET is tooling and deployments. I do agree that sometimes you wait for ages for tools that are already available in other development stacks (think EF or Team Foundation). Deploying on .NET is an absolutely atrocious experience. Dealing with MSBuild, XAML workflows and WebDeploy is just a royal pain in the butt. On the other hand, I do have to say that when you have a rock-solid group of engineers working on a complex .NET solution, the architectural patterns are much easier to implement and bring new people into than other stacks I'd worked on. Everything just looks cleaner, plus you have some pretty solid frameworks you can tap into such as MVC for web, LINQ for powerful querying, WCF for service-oriented needs, WPF for beautiful desktop apps. Moving from all of this is certainly pretty tough. But I sometimes feel the need to embrace the cool stuff that's happening with the speed of light in other stacks. It's just too big to disregard.

>> You’d probably have to have been living under a rock to have missed all the previous blog posts from others leaving .NET for greener pastures

Well some people have the opposite experience and also have written posts as to why they are moving to .NET.

They do? I'd would actually love to read them (I'm sure so would others) so perhaps you would provide some links?

On this note though, I should probably mention I didn't reference those posts to prove there is a deluge of people leaving .NET (in fact I highly doubt that there is), but for context and to demonstrate just how cliche and unoriginal mine was. ;-).

To me its about trends as much as anything. I noticed a few years ago that the kids on reddit were not interested in .NET but were interested in JavaScript etc.

So, honestly one of the main reasons I got out of .NET was because it seemed like it wasn't as cool as I thought it was anymore.

Another reason, although this is probably a secondary rationalization, is that open source isn't really that big in .NET, and open source seemed important (and cool).

Which isn't to say that there aren't lots of rational reasons to get out of Microsoft development, but I just think that we should acknowledge that people don't usually do things for rational reasons. They mostly do what other people seem to think they should do.

Anyway, I don't see anything wrong with drag-and-drop components or intellisense or even compile time checks. That stuff is really helpful. I am working on composable drag-and-drop widgets for JavaScript/CoffeeScript web applications. And I think that less code is better, and if you can accomplish the same thing with a GUI designer, drag and drop and some property editing, then that is better than writing source code to do it. Its better engineering.

IDEs that are slow are not great, of course. The biggest issues for me are that most everything is closed source and generally the language C# is much more verbose compared to CoffeeScript or JavaScript. Also your software will only run on Windows desktops and not over the web.

I'm trying to understand your last few sentences. Microsoft has open sourced huge amounts of code in the last four years or so. The entire MVC framework is open source, for example. Nuget (another open source project, but built with the community) is really driving the adoption of many open source projects in the larger .net world. You have companies like telerik (huge .net shop) releasing some of their own software open source now.

Microsoft even redistributes jquery. The culture (at least in the web side of .net) has really changed in the last few years.

Which brings me to your last sentence. Any software built with .NET will not run over the web? Where are you getting that from? I've been programming .NET for 8 years now, and I've only programmed stuff that runs over the web.

Sorry that last part was a mis-stated. A lot of .NET is Windows desktop programming.

A lot of the "web" stuff is XBAP or whatever which is basically desktop packaged to go in IE.

Sure there is plenty of ASP.NET development going on, and that is over the web.

But come on, you can't say that most .NET software is not closed source. Sure, some of it is being 'opened up', but for the most part, ASP.NET and C# libraries and components are not open source. Especially when you compare the ratios to other platforms.

>But come on, you can't say that most .NET software is not closed source.

Which is probably why I said nothing even close to that.

I can only really talk about the web related tech. Huge parts of ASP.NET are open source.

Then you have projects like F# which are open source.

Nuget package manager is open source (formed out of two community open source projects).

The Dynamic Language Runtime is open source.

IronRuby and IronPython are both open source.

MEF is open source.

The Orchard CMS is open source and control has actually been given completely over to the community.

Silverlight controls was open source.

I could go on and on. Open source is bigger in microsoft than you give it credit for. When you imply that most .net software is closed source, it's true, but you can say that about any language. Most software written in ruby is closed source. The one exception might be javascript, because you can't really close the source to that.

However, you can take a look at the big .NET open source projects, or just the AltDotNet community for the counterpoint.

>Especially when you compare the ratios to other platforms.

That is a meaningless metric

>So, honestly one of the main reasons I got out of .NET was because it seemed like it wasn't as cool as I thought it was anymore.

How in the world can C# not be considered cool? It's statically typed and reflective. It's got generics (reified) and delegates. Those things led directly to anonymous types, anonymous functions (lambdas, if you wish), co & contra variance, and type inference. Those things led to expressions which enabled Linq. Then you throw in dynamics. The next version will have the compiler as a service and the 'await' keyword which vastly improves multi-core and event drive programming.

Yeah, there are other languages out there that are doing some cool things. I don't see how anyone could think C# isn't cool, though. BTW, while microsoft is still working on their C# 5 compiler, Mono (the open source .net implementation) has already completed theirs and it is available today. They had compiler as a service before microsoft even announced it.

.NET is finally mature enough to get the "I'm leaving" posts.

There were plenty of these in heady times of '06 and the Ruby rush. Except with Java.

I'm sure at some point there were some for Cobol and Fortran and C and C++.

You seem to be defending .NET with a lot of handwaving. How exactly does one demonstrate that "I'm leaving" == maturity. By your reasoning then, anyone leaving what they feel to be a failed language/framework automatically proves it's maturity by doing so. I don't get it.

In the end it all boils down to use the best tool for you for the job you're working on.

That aside, going from Rails to .NET MVC has been a lesson in patience. While I am glad to have skipped Webforms, there is still something about .NET MVC that weighs on new ideas.

It's just easier to get up and running with a Rails stack and get your idea out there.

But that's just me, maybe for you it's Python, or C or Assembly. Whatever it is you work best in that's what you use.

Posts like this can help a community identify weak points though so I'm always glad to see them.

sigh Scientists stand on the shoulders of giants; programmers stand on each others' feet.

My biggest pains with .Net C# are:

1) Not runnable properly on Linux (I always have trouble with mono - maybe its just me)

2) Compilation and app restart time etc are annoying when wanting to develop rapidly

LINQ and the syntax of the language, VS etc are all awsome though.

Visual Studio compilation times are ridiculously fast for me, are you talking about Mono/Linux in point #2 also?

I have a lot of fondness for C# (version 3+) even though I don't use it any more. VS is a good IDE, too. Windows itself is meh.

Overall, you can do a lot worse.

There are probably 2 reasons why I would look at .NET and one of them is not pure .NET/Windows anyway.

1) Consulting/Contracting gigs

2) Mono for cross-platform GUI development

I love c# to bits.

I have worked pretty much my whole career in .NET, and I think it's pretty good in terms of actual coding and development. It has gotten better by leaps and bounds in recent years. .NET and C# aren't the problem, the insanity of the Windows stack is the problem. So many stupid little things unrelated to your code can go wrong, the toolchain is paltry, and deployment is still a mess.

If you're actually using drag-and-drop you probably already lost.

C# is an awesome systems language, hampered primarily by official support being limited to windows systems. But a lot of other technologies swirling around the .net stack are horrific. EF, workflow/xaml, wpf, and even the build infrastructure such as team foundation and msbuild are not a pleasure to work with and in many cases generally inferior to free open source alternatives.

Worse yet, sometimes you get the feeling that building expertise in all these tools is limiting because it has little commonality outside the windows bubble. Working on improving IIS performance won't help you much in a wider world were apache and nginx expertise is more useful, for example.

I no longer do .Net development and leaving it all behind was a breath of fresh air. It was ridiculous.

I find it monstrously overblown and while its proponents/fans call it elegant I think its a horrible inelegant mess. Great if all you do is Windows, no doubt.

Plus I don't trust Microsoft on Mono (which at one time I thought was a neat idea) and I don't trust them not to dump their existing .Net devs like they did with VB6 sometime down the line and without warning as soon as they and their marketing department decide the next shiny-shiny programming paradigm has arrived. There are plenty of rumours about this and I frankly don't discount any of them as being too far-fetched.

> I don't trust Microsoft on Mono

The FUD on this issue has been tirelessly debunked. Microsoft would have to contravene its own covenants and agreements in order to do this.

There are reasons to dislike Mono. This is not a legitimate one.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact