It seemed wrong to do a ‘normal’ blog post on December 23rd, and my programming themed “Night Before Christmas” rap medley never quite came together, so instead I’m doing a top-ten list.
Well, not really a “top-ten” list, but a list of ten indispensable programming technologies I’ve used this year. I’ve avoided numbering my top-ten list because I couldn’t come up with any sensible way to compare these disparate programs. They have all been crucial. I’ve blogged about most of them, and if you’re not using them or some equally good equivalent you should fix that. I use every one of these technologies both at work (on projects with dozens of developers and industrial strength infrastructure) and at home (on projects with one developer and with the ‘build machine’ being a different enlistment on my laptop).
This article was originally posted on #AltDevBlogADay.
I develop on Windows so there is a significant bias towards Microsoft products. The good news is that six of the seven Microsoft products on this list are available for free (and even the seventh can be free), and two of the three non-Microsoft products are also free (and even the third is free for limited use).
Without further ado, here is my list:
- Visual Studio 2010 – I’m enjoying using parts of C++0x including move constructors, static_assert, and the ‘auto’ and ‘override’ keywords. The “Navigate To” functionality (Ctrl+,) lets me explore source code more effectively, and there are other hidden improvements as well.
- /Analyze – I’ve written about this feature a number of times already, but this is a good place to summarize its effect. By using /analyze for static code analysis I have found and fixed over a thousand serious bugs this year, and it now monitors our code to prevent entire classes of bugs from ever returning.
- App Verifier – I’ve written about this as well and, while it’s only helped me find a few dozen bugs, these were all serious (race conditions and memory corruption) and would have been painfully difficult or impossible to find without such a tool.
- Symbol server – having symbols show up when I need them is magically essential. I now even put locally built symbols into a local symbol server so that I never again invalidate a crash dump by rebuilding the DLLs that it depends on.
- Source indexing – every day I save time because the source file that I need shows up automatically. I love the fact that, no matter what product, branch, or version the code is from, the debugger will automatically find the file instantly. If you ever debug code that is not built on your machine then you need this.
- Xperf – knowing how to use xperf is like having x-ray vision while everyone else is blindfolded. This tool has let me quickly find and fix innumerable performance problems, in our software and in the tools that we use.
- WinDbg – the debugger I love to hate. It’s UI is execrable but it does a couple of things that Visual Studio’s debugger doesn’t, so I keep it around for the clarifying second opinion that is occasionally crucial. More on this in the new year.
- Perforce – change lists, labels, file history that I can believe in, I love this version control software. I haven’t used anything else for more than a decade, so I can’t compare it to any of its worthy competitors, but it is excellent.
- sysinternals – for exploring or monitoring of processes these tools are tough to beat. Many problems can be solved by proper applying one of these.
- Python – a good scripting language is indispensable and it’s good to be at a company where Python is one of the main choices. Indenting for scope makes me smile.
I thought about having a top 10 list with just xperf and /analyze but a top 1010 list seemed more fun.
What’s missing from this list? What deserves to be removed? Let me know.