A Django site.
July 30, 2008
» Idle Musings


I wasn’t aware of Randy Pausch until the day he died. That day I watched his Last Lecture and wondered aloud, “How have I not heard about this guy until just now?” Even my wife had heard of him. (I guess he was on Oprah? Seriously.) I find his story very inspiring as a fellow techie, father, and husband. It seems like he had it all figured out.

IDE-integrated source control would be so much easier to use if the whole concept of binding just went away. There’s a huge number of complications that arise from binding and varying opinions on how it works, actually and theoretically. Making IDE-integrated Vault work without binding is theoretically possible, but it would require pretty significant fundamental changes to non-IDE-related functionality. I think about it frequently, but it’s difficult to make the case that the benefit would be worth the cost.

It seems to me that with ten fingers, the natural convergence point for the human race should have been a base-11 written numerical system: you should run out of symbolic digits when you run out of physical digits. In base-10, you have to add a new column when you’ve still got one finger left! What a hack! Strangely, a half hour in Google and Wikipedia reveals no evidence of any non-fiction tribe or civilization, ever, that used a base-11 system. This gives me pause: what else do I consider perfectly reasonable and elegant that is demonstrably absurd?

I spent 9 days on Kentucky Lake this summer, sans laptop, and actually got ridiculously tan. Linda in support, (a professional people-person) mocked my bleached white eyebrows when I got back.

I’m reading Michael Lopp’s Managing Humans. I’ve read his blog for years, so in theory I’ve already read most of this, but I still find the book to be excellent. It’s both entertaining and informative. His writing style translates exceptionally well to dead-tree format, in my opinion. Lots of his advice pertains mainly to working in companies much larger than SourceGear, but I’m still enjoying it tremendously.

April 10, 2008
» ianolsen


Wow. Self-employment has made Jeff bold! Incendiary, even.

We Don’t Use Software That Costs Money Here:

It’s tempting to ascribe this to the “cult of no-pay”, programmers and users who simply won’t pay for software no matter how good it is, or how inexpensive it may be. These people used to be called pirates. Now they’re open source enthusiasts.

» ianolsen


If Vista decides, one more time, that the appropriate columns when looking at a folder full of C# source code is Artists, Album, Genre, and Rating, I’m going to go postal. I keep fixing it, and everything’s fine for a few weeks, and then it does it again. Yes. I have SP1 installed.

This morning I searched Google for “Vista folder view f***ed” (without the stars) and, amusingly, the second result led me to a fix. I’ve removed from the registry all the folder-specific view settings that Vista oh-so-cleverly remembered on my behalf. If it actually did this competently, that would be one thing, but if it’s just going to confuse itself every few weeks, I’ve got better ways to spend my time. So I’ve also turned off the “remember each folder’s settings” option. Call me crazy, but when looking at a list of files I actually want to see file-like information like size, date, and attributes. I genuinely miss Windows NT 3.5’s file explorer sometimes.

I’ll be 31 this year. Perhaps I’ve already begun the slow decline to cranky old geek. Soon I’ll be looked at by fresh-faced college kids the same way I looked at the graybeards reminiscing about core memory and punch cards.

June 14, 2007
» The Blowhard Index


I don’t understand the people who find their way into every organization and blame every problem on management. These people are the cause of their own problems. In short, they’re too passive. I don’t think I’m an overzealous management-blamer, but I could stand to be more assertive sometimes. I can think of many instances in the past, in my personal and professional life, where things sure would have gone smoother if I would have grown a pair and made people see things my way. I know I’m not alone. A while back Jeff Atwood published some thoughts about assertiveness among software developers that I found interesting, but I think he missed something. I think a lot of developers choose to be passive, and we don’t realize what a disservice we’re doing ourselves.

Recently I found myself with a few minutes to kill, and as luck would have it, there was good reading close at hand: Bathroom Reader 8: Things Everyone Should Know. It was full of pithy thoughts, one per page, in a tone similar to Deep Thoughts by Jack Handy. One page held only this:

People only get what they think they deserve.

Not people get what they deserve. People only get what they think they deserve. This is true, but it’s even more true if you expand it a little. People don’t get 100% of what they think they deserve, but they get 0% of what they don’t think they deserve. People get no more than what they think they deserve.

You get only what you think you deserve

What do I mean by “what you get?” Well there’s the classics: respect, prestige, power, and money, but those are sooo twentieth century. And we’re not supposed to admit we’re after them even if we are. “What you get” could be anything. The love of a partner. The advanced degree. The respect of a family member. The house on the water. The friendship of that brilliant, funny co-worker. Work/life balance. If you don’t think you deserve it, you’re not going to take any of the steps to get it, and you won’t.

I know what you’re thinking. “Well thank you, Captain Obvious! Did you really think Bathroom Reader 8 held the wisdom of the ages? Perhaps if you had more fiber in your diet you’d waste less time and bandwidth around here, hmm?”

Okay. But there’s more!

In addition to the “I Deserve” value we give ourselves, we assign “You Deserve” values to the people we know. We do it with everybody: co-workers, family members, friends, anybody you would consider more than an acquaintance. You decide how smart they are, or how talented, or good-looking, or whatever qualifications are appropriate for a particular relationship, and subconsciously assign a value. When someone’s “I Deserve” value grossly outstrips the “You Deserve” value you give him, he becomes obnoxious, the kind of person who constantly toots his own horn.

Engineers are particularly vulnerable to this pattern of thinking. We invented the bozo bit, after all. Our skills and qualifications are pretty well defined. Either you know something or you don’t. We tend to extend this: either you’re qualified or you’re not. In a technical field, you can assign a professional “You Deserve” value far easier than you could in, say, oil painting. As hard as it is to quantitatively measure the value of a software developer in an organization, it’s relatively obvious day-to-day who the brilliant engineers are, and they don’t even have to die first. In our binary world, there’s a pronounced bias against those whose confidence overshadows their demonstrated skill. We prefer to celebrate our brilliant but self-effacing, populist leaders, like Linus Torvalds and his penguin. We’re suspicious of those who have an apparently bottomless well of confidence without being obviously brilliant. We reserve our respect for those ushered into a position of leadership by consensus among their peers. Most of us decide it’s better to be failingly humble, and instead strive to produce work that outshines our passivity.

But we’re missing something important. Have you noticed the people heavy on bravado and light on skill often wend their way into positions of authority? Is this simply the typical workings of a clueless bureaucracy or something else? Both. Here’s the thing: if people did only what they were qualified to do, things for which they had already proven some aptitude, we’d still be living in caves. The caveman that built the first fire was certainly not qualified. What a pompous jerk this guy was. The other cave-people were doing just fine huddling together for warmth and eating raw meat, thanks. And it was so obvious that he had no idea what he was doing. Rubbing sticks and banging rocks for hours? Nice going there, Lothar. Do us all a favor and spear a woolly mammoth or something, would ya? But you have to admit that the whole fire thing worked out pretty well.

It seems to me that with very few exceptions, anybody who ever did anything extraordinary had a much higher “I Deserve” value than the “You Deserve” value they were assigned by their well-adjusted, humble peers. Some hid it better than others, but they all had it. Am I suggesting that we should strive for maximum arrogance in hopes that we’ll someday stumble upon greatness? No. Nor would I ever claim that acting skilled is more important than actually being skilled. I would prefer that the engineers that designed my airplane actually are skilled, thanks very much.

But there is a relationship between what you think you deserve, your confidence, and what you’re actually capable of attaining. Natural leaders tend to believe this implicitly. They come out of the womb and ask the nurse to fetch them a coffee. The rest of us just have to strive to keep it in mind when one of these obnoxious types is in our face. Here’s the way I think it breaks down:

The Blowhard Index

The point at which one’s cup of confidence floweth over, taking him into obnoxious territory, is certainly subjective. The people I consider successful in life, professionally or otherwise, spend most of their time slightly left of the blue area. Some occasionally venture well into the blue. But notice that leadership ability continues to increase a smidge beyond the obnoxious threshold. That’s intentional. 90% of the household name leaders, even in technical circles, fall into this very slim minority of extraordinary people: obnoxiously confident, tremendous leaders. Bill Gates? No question. Steve Jobs? Notoriously so. Larry Ellison? The guy actually has a lifestyle section on Wikipedia wherein his obnoxiousness is detailed.

At some point it became fashionable to declare Joel Spolsky arrogant. This was inevitable, because he’s successful and outspoken and he moves in the highly confidence-skeptical world of software development. And he’s still just small-time enough that people tend to wonder if maybe he’s gotten too big for his britches. I’ve shaken his hand and exchanged a couple of sentences with him, but certainly don’t know him well enough to place him on the Blowhard Index. Certainly the fact that he started his own company, which appears to be thriving, places him somewhere firmly in the right-most 50%. Doubtless there are people who actually know him that do find him obnoxious. But the people he employs at Fog Creek surely enjoy the living they make there, which never would have been possible if he’d waited to be qualified to start a company. Without the outrageous confidence necessary to publish his opinion about everything related to software development, he’d never have attained the runaway marketing success that launched FogBugz. (All of which is true about my boss, too, but by declaring himself arrogant occasionally, he cleverly sidesteps the whole mess.)

Do entrepreneurs or corporate big-shots need something larger than life to associate with in order to offset what is actually deep-seated insecurity, merely masquerading as confidence? Probably in some cases. But even these people are valuable contributors to an organization. The truth is, we need people who are more confident than we are, whether or not they have the qualifications to back it up. Without them, we’d all still be huddling together for warmth in a cave somewhere.

Confidence is A Good Thing. For techies too. If you allow your professional bias to keep you from realizing this, you’re only hurting yourself.

October 30, 2006
» ianolsen


Two other items of interest:

  • There are some existing CCNet plug-ins (Sequential Task, Sequential Source, and Sequential Project) that provide locking.
  • There is work underway to integrate named build queues within CCNet itself, described here.

For anybody whose build spends the vast majority of its time in NAnt (or MSBuild), I’d still recommend locking there, as I described last week, for faster build throughput.

October 23, 2006
» ianolsen


A frequent topic on the CruiseControl.NET (CCNet) mailing list is how to serialize builds. Lots of people have multiple projects that build on one server, and sometimes dependency relationships between those projects are fairly complex. Solving the problem to everyone’s satisfaction without burdening everyone with its complexity is quite a challenge, which is probably why there’s no functionality in CCNet to accomodate this to date.

We don’t have to deal with dependencies for our builds at SourceGear, but we did have to resolve some serialization issues when we first set it up.

We have five projects currently built by CruiseControl.NET:

  • Dragnet 1.0.x
  • Dragnet Trunk
  • Vault 3.1.x
  • Vault 3.5.x
  • Vault Trunk

For people whose build times run into hours, it’s important to build as little as possible to fully reap the rewards of Continuous Integration. Including all unit tests, Vault builds in about 45 minutes, and Dragnet less than that. We have a smaller set of tests that runs on every checkin to get Vault’s time down around 20 minutes. We essentially build all the code for every build on each of these projects, sparing us the dependency issues. Still, there are a couple of reasons we couldn’t just allow anything to build at any time:

  1. The unit tests require that the Vault server be installed and you can only have one instance of a Vault server installed on a machine. We can’t have multiple Vault builds trying to install the server willy-nilly.
  2. We use Wise for our installers, and strange things happen when multiple instances of it are running.

Initially, I cobbled up some modifications to CCNet to only allow one build at a time. This worked, but it sometimes made the wait for a build much longer than it had to be. In our configuration, when CCNet does a build it’s actually doing all these things:

  1. Clean out the source directory
  2. Get the latest source
  3. Build
  4. Create installers
  5. Install server
  6. Unit tests
  7. Uninstall server
  8. Label source

My modified version of CCNet essentially made the entire process one big critical section. It was effective, but far from optimal. At one point last fall someone on the mailing list mentioned that they had created a mutex script in NAnt that gave them finer-grained locking. John Hardin at CRS Retail Systems was kind enough to save me the effort of rolling my own and provided his script.

Adding this block to your NAnt script gives you the ability to add named mutexes as NAnt tasks. In our configuration, steps 3 through 7 are all performed within a NAnt script that CCNet kicks off. For the Vault builds, steps 5 through 7 are encapsulated by a mutex. Each build waits for it’s turn to install and test a server:

<mutex mutexName="VAULT_SERVER_MUTEX" />

<!–
Install Server…
Do Unit Tests…
Uninstall Server…
–>

<mutex mutexName=”VAULT_SERVER_MUTEX” />

We did the same thing with a “Wise” mutex for the parts of the script that create the Wise installer.

The NAnt mutex method is just as effective as one huge lock from CCNet, but because we’re locking only when necessary, builds spend a lot less time waiting for others to finish. And we no longer need to run a customized version of CCNet.

Even if CCNet includes serialization features some day, I can’t imagine that this level of locking would be possible. Once you’re running NAnt (or MSBuild, or whatever) you’re outside CCNet’s control: locking within NAnt itself ought to be a useful trick for some time.

June 27, 2006
» More on CodeRush/Refactor 2.0

CodeRush/Refactor is evolving into the tool I want to love, but it’s just not there yet. The templates are tremendously cool (and it’s obvious I’ve barely scratched their surface) but as a whole it’s lacking a number of Resharper features I find it hard to live without.

Some of these were previously mentioned, but this is my complete, updated wish list for CodeRush/Refactor:

  • I need keyboard shortcuts for “Move Down Call Graph” (Go To Definition) and “Move Up Call Graph” (or List References, when there’s more than one possibility). Visual Studio 2005 has only halfhearted implementations of these. For example it doesn’t take overloaded routines into account and it frequently just doesn’t find some references. Visual Studio 2003 is totally lacking the List References/Find Symbol functionality, making this a huge win there. These are what I called “usage search tools” last week. This is a killer Resharper feature that I just can’t live without.
  • I’d like a tool window showing my marker stack that allows visiting any marker with a double-click, without altering the stack. (Maybe add some right-click options and/or drag-n-drop to modify the stack. I could be persuaded that’s overkill.) This would make markers the perfect bookmark replacement, and I could forget about them altogether. As it is, I still have to use bookmarks if there’s a bunch of source locations I need to visit frequently in relatively random order.
  • I’d like additional syntax highlighting options. In particular, I like being able to give colors to variables of different scope (member, local, parameter).
  • I’d like a comprehensive list of keyboard shortcuts, including templates, navigation, embedding, etc. I know the vast majority are context sensitive, and this list would be huge, but I still want it and this is my list. :) At the very least, bring the training panel (which is awesome) up-to-date. Shift-ESC, one of my favorites, isn’t even on there! Good thing I discovered it via the training video!
  • CodeRush needs to do smart overwriting of closing parentheses: another one I got used to in Resharper. With the default options, there are some strange gymnastics required to work around the automatically inserted closing parentheses. For example, attempt to type this line:

    someStringBuilder.Append(someEnumValue.ToString());

    When you type the opening parentheses for ToString, a closing parentheses is added, so now both are in place. However, depending on the strength of your habits, you’re likely to add an extra parentheses or two. Even if you stop, you’ve now got to press End or cursor to the right before pressing enter. (Unless you have “Smart Enter” turned on, which is what I did, but that’s not the default.) Resharper recognizes that there are no more parentheses needed, and automagically overwrites them as you type. I don’t like that with CodeRush I have extra mental gymnastics to examine the parentheses situation at the end of some lines. Again, familiarity would probably make it better but I think Resharper’s solution is a good one: low impact to newbies without sacrificing power. I’m sure someone can point out that I’ve missed an option or “the right way” to type this line, but that’s exactly the point: Resharper doesn’t make me learn a new way to type code (or ship with options that do).

  • The refactor hotkey should have more consistent behavior. You can assign a keyboard shortcut to the context-sensitive refactorings, which is great. The problem is that if there’s only one available refactoring for the current context, it’s automatically performed. For someone relatively new to the product, I’d prefer to see what’s going to happen first. Maybe I’ll change my mind as I get more familiar. Nevertheless, I’d make this an option and default it to the “just pop up, don’t perform” setting to accomodate newbies.
  • I’m getting used to using CodeRush’s QuickNav, which is equivalent to Resharper’s CTRL-N (Go To Type) or CTRL-SHIFT-N (Go To File). The only thing I’d like is being able to change the search scope more easily with the keyboard. I still feel like I could get to ANY file/type quicker with Resharper because I never had to reach for the mouse. Also, Resharper’s list updates as you type, making everything feel snappier.
  • Better availability for some refactorings. Want to “safe rename” a structure? Too bad, it’s not there! You’re stuck with Visual Studio 2005’s icky implementation, or you’re totally out of luck in VS2003.
  • Resharper does background compilation, which lets you see any compile-time errors as you type and improves intellisense. I’m less of a rabid fan of this than many Resharper users, but it is cool. It’s yet another feature that’s less necessary if you work primarily in VS2005, but is killer for VS2003 users.
  • Show me unused variables and unreachable code. Resharper does this.
  • CodeRush lacks brace auto-completion, though it does auto-complete parentheses and square brackets.
  • CodeRush needs contextual help for the options dialogue. There are a ton of options, and this is most definitely a Good Thing for this type of product. As you’d expect, many of these are not self-explanatory. The only way to figure them out, right now, is to experiment.

I’ll continue to keep an eye on CodeRush. Its got real potential, it’s definitely breaking new ground in the UI, but for me it’s not a Resharper replacement. My quick and dirty summary of the differences is this: If you spend most of your time writing lots of brand new code, CodeRush’s templates are very compelling. If you spend lots of time integrating your work with existing code, particularly code written by other people, Resharper’s analysis tools are the bigger win. Typically at my day job, I’m in the latter camp. If you’re an Eclipse zealot who is occasionally forced to work with .NET, you’re going to find Resharper strangely familiar. (I’m not, but I work with a few.)

I was surprised to see people on the DevExpress newsgroups reporting that CodeRush and Resharper can peacefully coexist. Sounds dangerous, but the possibility of having the best of both worlds is so compelling it’s worth a shot.

June 21, 2006
» ReSharper vs. CodeRush: Part 1

Being as it’s the longest day of the year, I’d say I have time for a blog post! ;P

I’ve been a happy ReSharper user for almost a year now, but several recent events spurred me to investigate CodeRush:

  • The DevExpress booth was just down the aisle from Vault at TechEd, and their demos were impressive.
  • Scott Hanselman dropped by the Vault booth one afternoon and gave a passionate demonstration of why CodeRush rocks. And I do mean passionate.
  • JetBrains recently released version 2.0 of ReSharper, in which they introduce support for Visual Studio 2005, which is good. What’s not so good is that they’ve also introduced a bunch of stuff I don’t need, and the product has gotten a bit top-heavy. I basically wanted Resharper 1.5 with support for Visual Studio 2005. Instead I got unit testing (TestDriven.NET works fine already) and ASP.NET support (which is probably a God-send for many, but not much use to me in my day job working on Vault). It’s still a fine product, but for my personal use these new features weren’t worth the performance hit.

So back at the office on Monday I uninstalled ReSharper 2.0 and installed the newly released CodeRush and ReFactor! 2.0. My impressions after a couple of days of use:

  • I really miss ReSharper’s usage search tools. Being able to move up and down the call graph with a keystroke or two is really nice, and very conspicuously absent from CodeRush. If you spend a fair amount of time reading other people’s code, this is huge. With everything else CodeRush does, I can’t fathom why this feature is missing. In Visual Studio 2005 it’s tolerable, because Visual Studio has its own (admittedly lame) implementation of this, but I’m thoroughly crippled in Visual Studio 2003, where I still do a fair amount of work. I could go back to ReSharper for this reason alone.
  • CodeRush’s stack-based “markers” (similar to VS.NET’s bookmarks) are tremendously cool. This is the way bookmarks should have been implemented. I can’t believe how often Shift-ESC (”collect” the top marker and paste) is useful.
  • I miss the extra syntax highlighting options ReSharper gave me. This sounds trivial, but I got used to fields, locals, and parameters being different colors, and it made reading code easier.
  • CodeRush’s templates are really, really powerful. They definitely have the edge over ReSharper here. This is how Visual Studio’s snippets should have been implemented.
  • The selection-based “embedding” CodeRush features (e.g. embed the current selection in a region, embed the current selection in a try…finally) just don’t work on my installation. The shortcut keys do nothing. I’m not sure why. I can’t find anybody else reporting a similar problem, so I’m assuming it’s a peculiarity of my environment. I’ve installed and uninstalled several versions of ReSharper before installing CodeRush, for example.
  • ReSharper has better documentation. I keep a single page hard copy of ReSharper shortcut keys on my desk, and there’s no CodeRush equivalent. CodeRush has a “training panel” which pops up context-sensitive shortcut key possibilities within Visual Studio, but it’s incomplete. There are a number of things I caught at TechEd demos and in DevExpress’s training videos that don’t show up in the panel. The training videos are cool, but what I really want is a comprehensive list of the keyboard shortcuts, even if it’s huge. Or at least bring the training panel up to date. With ReSharper I can also go into Visual Studio’s keyboard options and see all the assigned keboard shortcuts. It’s understandable that CodeRush didn’t go this route due to the (very cool) context-sensitive nature of its shortcuts, but it adds to the feeling of not really knowing what’s possible.
  • Not yet being used to CodeRush, some features are suprising, if not downright frustrating. For example, yesterday I hit tab several times expecting to, you know, insert tabs in the source. Instead, the first tab behaved as expected. Tabs 2 though n jumped me to various (apparently significant in some way) locations in the file I was editing. I’m sure this was me failing to understand some contextual rule, but it was maddening for a newbie. It took me a minute or two to figure out how to just insert the #$%!-ing tabs.
  • CodeRush’s complexity metrics are cool. I’m a big believer in Simpler Is Better, and having easily accessible, concrete measurements of a routine’s complexity is awesome.
  • CodeRush’s huge array of built-in shortcuts are cool (as in, they demo well), but not tremendously useful, in my experience. It’s just not that hard, for example, to type “private bool x;[enter]” rather than “vb x[enter][enter]”. Maybe I’ll feel differently after a few weeks’ use when those shortcuts are second nature.

I’ll probably stick with CodeRush until my eval expires at the end of July, to fully give it a chance. Unsuprisingly so far, I prefer the product I’ve got months of experience with.