Archive for the ‘Software Development’ Category
I’m happy to announce the release of Veracity 0.9.0 today, which for the first time includes installers!
Next week, Veracity will have been self-hosting for one full year. We began dogfooding Veracity on May 24th, 2010. We think it’s gotten pretty decent, and we’re ready to extend its audience beyond the people willing to build it themselves from source.
The following installers are available:
- Windows msi:
- 32-bit installers support XP and later
- 64-bit installers support Vista and later
- non-privileged installers: current Windows user only, no administrative rights required
- Linux deb packages supporting Ubuntu 10.04 and later (32 and 64-bit)
- Intel Mac universal dmg (32 or 64-bit)
As before, the source tarball is also there.
Note that on Windows, the Tortoise client is still a work in progress and therefore isn’t installed. If you’re building veracity from source, however, the Tortoise client is in there.
Changes we’ve made since the 0.7.0 release last month include:
- The server can be put in a read-only mode
- Several server stability bug fixes
- Lots of bug fixes in the command-line interface
- Lots of bug fixes in the web interface
- Overhaul of vv branch syntax. Type “vv help branch” for details.
- Added branch and file history filters to web interface
- Tortoise client has a functional history dialog
Previous users of Veracity should also be aware that branches changed significantly. Branches created with an 0.7.0 build won’t be visible with an 0.9.0 binary. If you want to keep them, make a note of them before upgrading and re-add them with “vv branch add-head”. As noted above, “vv branch help” gives full detail on the new branch syntax.
There was some debate among the team as to whether we should call this a public beta. The software is beta quality: there are no known serious bugs, but we still have some tinkering to do. And it’s not quite feature complete. With a little luck (and lots of hard work) next month’s release will be feature complete. At that point it will unequivocally be a public beta.
This is a big milestone for the team here at SourceGear. Let us know what you think!
I spent all day yesterday getting unit tests to pass.
I’d set my module to run in one of two modes, then run the test suite. I fixed all the test failures, then set my module to run in the other mode, and fixed all those failures.
Then I’d go back to the original mode, and lo! More test failures. I fixed them, then switched back to mode two. I spend the better part of the day in this loop. After lunch I realized perhaps I should step back for a moment and think about the problem. All these failures were related, and I had simply been playing whack-a-mole with test failures rather than actually thinking about the problem. Ten minutes of thinking, twenty minutes of changes, and suddenly everything worked.
I’m certainly glad we have tests to verify what I’ve done, but I’d have saved myself a lot of time if I’d not used the tests as an excuse not to use my brain.
I’d like to join the other zillion people who installed Chrome today and exclaimed, in unison: wow!
I installed Chrome 20 minutes ago, and I’m already impressed.
I like the minimalist interface. All the meaningless stuff surrounding the page (*cough* the uh, chrome) is gone. The default start page actually makes sense: it lists the pages and bookmarks you visit most. I might not even change my default page to about:blank for the first time since 1998. I love that you can turn off the bookmarks toolbar, after which those bookmarks show up where you’d logically use them: the default start page.
It’s not perfect. On my laptop, the vertical scroll area of the touchpad is wonky. It’s way too sensitive and only scrolls down. Every time I forget and reach for it, I immediately scroll to the very bottom of whatever page I’m looking at and get stuck there. That’s annoying enough that I probably won’t make Chrome my default browser on this machine until it’s fixed.
I also miss several things I’d gotten used to in Firefox:
- The Adblock Plus plugin. I’ve been using Adblock for most of the 21st century, and 20 minutes without it is already too long.
- The del.icio.us plugin. I use at least 3 machines regularly. Portable bookmarks are essential.
Keyword searches. Typing in the address bar searches Google by default, but I’ve got at least a dozen customized keyword searches set up in Firefox. Not being able to determine if The Dark Knight is still the best movie of all time with a simple ALT+D “imdb the dark knight” really cramps my style.Oops. Looks like Chrome does this. Awesome!
Overall though, it’s an incredibly good “beta” browser. I can’t remember the last time any application made me literally say “wow” within 10 seconds of launching it for the first time. And I’ve only done pedestrian browsing. I haven’t yet scratched the surface of the browser-as-platform features at the heart of Chrome. Google’s done an incredible job with this opening salvo in the new browser wars.
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.
Wow. Self-employment has made Jeff bold! Incendiary, even.
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.
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.
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.
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 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.
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.
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:
- 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.
- 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:
- Clean out the source directory
- Get the latest source
- Create installers
- Install server
- Unit tests
- Uninstall server
- 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" />
Do Unit Tests...
<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.