Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I\'ve been a .NET developer for about six years. In those six years, I\'ve worke

ID: 639647 • Letter: I

Question

I've been a .NET developer for about six years. In those six years, I've worked at exactly one .NET shop that followed any kind of actual design pattern or industry best practice. That realization has frustrated me where I'm at the point of considering making a switch to Java and leveraging my C# experience because the Java community seems to have a larger handle on proper software engineering than the .NET community, which seems more focused on RAD techniques and quasi-procedural code and don't want to improve at all.

For example, the average Java shop is probably using an MVC framework like Spring, Seam or venerable old Struts, is using Hibernate, is probably writing unit tests, knows how to use source control properly, and while there's the danger of the architecture astronaut is more than likely applying design patterns and following good practices like the SOLID principles.

In contrast, the average .NET shop uses untyped DataSets, writes all the code to solve a problem in event handlers of WebForms, thinks testing means loading up the built-in web server and playing with the application, if they use source control at all use something like Visual SourceSafe and think it's great, and has no idea what the single responsibility principle even means or why it's a good thing. Attempts at introducing things like ORMs, design patterns, unit testing is usually met with a blank stare or outright rejection due to not even understanding why those things are better than the debugger or writing code in an event handler of a widget - it's like talking to a brick wall.

I am aware of "ALT.NET" (I follow it myself), but I am finding an environment that knows about that, let alone follows it, and it seems to be like finding needle in a haystack, and trying to change an organization to use it has always ended badly for me, to the point where I've actually been shown the door and let go for wanting to do things better than the company had been doing before I joined.

Would there be any benefit at all to my trying to leverage C# skills and make a transition to Java? I'm running out of options trying to find a .NET shop that actually follows real software engineering concepts instead of just throwing out code, and I'm starting to think my chances of finding that kind of place will greatly increase if I'm not using a technology stack that pushes the opposite as the right way.

Explanation / Answer

I'm inclined (having made the switch in the opposite direction) is that your mileage may vary. Both languages are very similar, but arguably C# has more language features. You won't have access to LINQ, and you'll trade one set of partially consistent APIs for another (both have inconsistencies).

Your complaints are mostly around the software development process. There is no reason why you can't architect a good .NET web application. You can use ASP.NET MVC for a good MVC framework, and NHibernate if that floats your boat. You can use NUnit for unit testing. All of these things (except NHibernate, we're using other ORM tools) are happening at the shop I work in.

Reasons for switching to Java:

You want to learn the language and satisfy some curiosity. Nothing but good comes from playing around like this.
The number of .NET jobs in your area is rather small, but the number of Java jobs is much larger.
Reasons not to switch:

The average Java shop does X, and the average .NET shop doesn't. Quite frankly, there are just as many Java shops that violate good programming practice as .NET shops. Maybe more since the Java market is still bigger (for the moment).
Microsoft sucks, and I don't want a platform controlled by one vendor. Well, Java is controlled by one vendor: Oracle (used to be Sun). You can deploy in more environments, but Oracle is as much a dictator as Microsoft.
If your chief complaint is the poor programming practices at your current job, you have a couple options:

Try to make incremental changes to improve the situation. With every important Java library, there is a .NET equivalent. JUnit -> NUnit, Log4J -> Log4Net, Hibernate -> NHibernate, Spring -> Spring.NET, etc.
Give up at that company and find one that does more of what you expect of good engineering practices.
Honestly, I've found that with the right attitude and some quick wins (like unit testing) that have measurable results--most companies are willing to give a new technique a shot. Especially if it saves them money. The more improvement your changes have, the more they will trust you. Just don't try to overhaul everything in one day or you will be met with serious opposition by your peers.