I’m a ReSharper junkie, and I get angry when I don’t have it. I’ve spent the majority of my .Net career working with converted Java developers. To a man, they all complained about the crudeness of Visual Studio.Net compared to IntelliJ or even Eclipse. I wrote them off as whiners because I was used to working in either VB6 or Visual InterDev (I still have a soft spot in my heart for doing what’s now called Ajax development in VI) and VS.Net was clearly more polished (except for that little code and continue goodness). Then the ReSharper 1.0 beta builds dropped. My project team of ex-IntelliJ jockeys jumped at it immediately. Even with the sometimes spectacular instability of the ReSharper beta, it made an obvious improvement in coding efficiency. I know this because several times I started to code on the flight home without a working copy of ReSharper and became frustrated quickly when the code navigation and refactoring was missing. ReSharper quickly improved with each passing build, and the phrase “I’m having a ReSharper moment” left the project vocabulary.
Why am I complaining about this today? I’m wrestling with a legacy C# codebase this month and it’s not entirely “ReSharper-able.” One of Michael Feather’s pieces of advice in his book Working Effectively with Legacy Code is to lean on the compiler when making changes to legacy code. Going farther, I really want to be able to use ReSharper’s “Find Usages” capabilities to trace code in an attempt to understand interdependencies between classes and trace through code. In order to insert any kind of unit tests I’m having to extract methods, classes, and interfaces. The safest and quickest way to do this by far is to utilize the automated refactorings in ReSharper.
Out of the box the code could not be traversed by the static code analysis of ReSharper. The reasons? The solution files aren’t using project references between projects. They are compiling all assemblies to a common hard-coded folder and making all references to this folder, creating a force field impervious to ReSharper code navigation and refactoring. This was largely done to get around problems they had with circular references between class libraries. A lot of classes are loaded and executed by reflection. Part of the problem is that the class library projects are much more fine-grained than they really need to be. I’m guessing that the assemblies were subdivided so granularly to apportion out the work between developers and avoid checkout conflicts with Visual SourceSafe’s pessimistic locking, but I don’t know that.
So far we’re only tackling a small portion of the legacy code at first. The long range steps we’re trying first are:
- Get to project references immediately. Enable both ReSharper refactoring across projects and the almighty task in NAnt. It also solves some reference conflicts
- Collapse the assembly structure to mitigate the circular dependencies and simplify deployment and build
- Eliminate as much of the load by reflection instantiations as possible. Minus automated unit testing, strong typing is absolutely essential. Since we don’t have an automated NUnit test suite to speak of, we have to have the compiler enforce strong typing as a first line of defense when it’s time to modify the code
- Get rid of VSS, move to Subversion, and get some automated builds put together for continuous integration
- Automate the migration of build products (think shared libraries, frameworks, and staged builds) between our different codebases. This is a soft spot in our infrastructure at the moment that is slowing us down. We’re certainly not the first team to struggle with this by any means.
Another thing I highly recommend; my partner is an uber-buildmaster and one of the first adopters of the original CruiseControl. Fellows like him are awfully nice to have around when you’re in this sort of situation.
I have played with IntelliJ briefly when I thought I was getting a chance to go onto a J2EE web project. For the agile style of incremental development (red bar, green bar, refactor), IntelliJ is a coder’s paradise. I think this largely due to JetBrains dogfooding their own tool using an XP process. I know pockets of MS use agile processes (and I’m dubious about counting MSF Agile in that column), but I don’t think the VS team really takes it seriously. VSTS is clearly aimed at the heavyweight Rational Unified Process product.
VS 2005 with VSTS is a definite improvement for agile development, but I think it still falls short of what I’ve observed in IntelliJ or Eclipse. I’m not entirely sure that some of the enhancements like unit testing integration are actually as good as the existing open source equivalents, and the refactoring in VS 2005 is inferior to ReSharper. I’m honestly more excited for the upcoming ReSharper 2.0 release than I am for the improvements with VSTS.