The trouble with "High Priority"

[This is a long rambling rant -- you can stop reading now].

If you're bug tracking software lets you say that every single bug in the system is high-priority, then it's meaningless. You may as well say everything is low priority.

The answer isn't to have more granular priority levels (super urgent, semi urgent, sorta urgent and so on). To make a priority feature work you have to go holistic and look at the context of the bug...

Priority is so damn tricky and yet so simple:

Bugs doesn't exist in a vaccuum -- they exist alongisde other bugs/tasks and there are people who are going to do those bugs. If you're serious about settings the priorities for a series of bugs then you need to re-sort the bugs for a particular developer (possibly yourself).

"This one is the highest priority for Jack to work on, then that one, then that one."

You don't need to go down too low. A strict rank order is only useful for the first few. Assigning priorities to the lower order tasks is just 'busy work' that makes you look busy when you're really just shuffling papers. By the time those tasks rise to the top, other things will have come into the system anyway.

At Advantech Software (Brisbane's Premier .Net Consulting Specialists, ;-) we use FogBugz, from Joel Spolsky, and we're very happy with it. It's even begun to influence our language. We now say "I'll raise a foggy" anytime we either find a bug, or decide on a task, or invent a new feature.

But even fogBugz has the traditional 'priority' problem, much like every piece of bug tracking software I've ever used. Maybe a bumptop style solution would work? It's like the weather you know; everyone complains about it, but nobody gets in and fixes it.

Another feature I'd find useful is the ability to split one bug report into many bugs. And to split one feature into a series of tasks that make up that feature. Customers email in these documents that contain fifty different problems. And on a different track: simple features soon turn out to invole implemening many little steps along the way, each of which can be assigned to different people. (Let the bomb expert make the bomb, the safe cracker can crack the safe, the disguise expert can... and so on). This kind of hierarchy work quickly leads to usability problems. A feature rich interface can become impossible for any new user to pick up, and smart software does well to avoid it. An overly complex bug tracking system is worse than none at all.

Okay, just blogging this rather than emailing it to Joel Spolsky. Do you know he tends to personally respond to all his emails? I find that pretty amazing, as he's a busy guy. The technical support at technorati, by contrast is hopeless. How come they say I haven't updated my blog in 353 days when I update it every week? I've done the 'update ping' thing, but nothing works. If anyone can solve this for me I'll send them a robert scoble style link in gratitude.

 

The difference between goals and dreams.

[this seems to be some kind of preachy, life-coach article... stop me if i suck at this.]

Big projects often involve both goals and dreams. These two things are similar but different. One of my pet theories is that in a big project you need both dreams and goals, and you need to distinguish between them. Hey, I'm gonna make that into a subheading, so the skimmers will read it too...

In a big project you need both goals and dreams

That doesn't sound very agile does it? Big Dreams Up FrontTM?

Anyway, what's the difference between a dream and a goal?

Dreams are not Reality

Dreams are the slippery huge indescribblable stuff. The presence of big dreams is not a bad sign. This is the big picture that each version of the project will work toward. A lot of the marketing stuff you hear about a product is based on the dreams of the product, not the goals. Don't let this put you off the concept of dreams.

Goals are Reality

Goals, or targets, are actual concrete things that can be delivered. They have those five famous properties that make them "s.m.a.r.t." -- Specific, Measurable, Achievable, Realistic, Time-based. They are not infinite. They will be achieved with the version you are working on today. And you know when they will be released.

I need this delivered yesterday!!

When a goal becomes unrealistic -- it's no longer an effective goal. CHANGE IT! Bring the goal back into line with reality.

You have to be willing to drop features from a goal. Or failing that, to change the time frame, or the depth of the feature.

When a feature is dropped, it can be a blow to the motivation of the team that has been working on that feature. But it's easier to take the blow if you know that the feature is part of the dream, and may get its chance in subsequent releases. It isn't lost, just deferred.

I keep repeating myself

  • Goals are focused -- dreams are generalised
  • Goals are also known as Targets. Dreams are not so targeted.
 

Concurrency Bug in all editions of Visual Studio

more than 1 visual studio open... settings will be gazumped

You often have more than one copy of visual studio open. When you change a setting in visual studio, the change will be wiped out if you close another copy of visual studio after you close the current one.

This is a frustrating bug, and one that could be addressed in simple ways. The best approach would be if settings were merged together. Say I've changed the C# settings in one instance of visual studio, and I've changed the tool box settings in another instance. There's no conflict there, so all settings could be merged together.

Okay, so that's difficult. How about if settings are only saved then they've been changed. That would be enough to fix a good percentage (perhaps the majority) of problems with concurrency.

The current "Last In Wins" approach is really out of place -- when you consider how much effort they've put into the rest of the settings architecture. There's at least fifteen pages about settings at msdn..

 

Demo: Exec-Inline, an Add-in that executes the currently selected code, immediately

Execute the code immediately under the cursor

You're in Visual Studio (2003 in this case)

  1. Highlight the code you want to run.
  2. Press the 'exec inline' button on the toolbar.
  3. The code is compiled and executed in its own little assembly

All credit goes to these four places:

Code compilation retyped from jconwell's Dot Net Script Project at CodeProject.

Wrapper around compilation retyped from dstang2000's DynamicCompileAndRun project.

Help with writing a VS Add-in: Scott Swigart, PasteAs Visual Basic Add-in

And help with getting the currently selected text from the IDE, retyped from Kevin McFarlane's VS Csharp Macros page.

I deliberately re-typed, rather than copying and pasting their code, so that I'd have to really look at what was going on in every place.

(continues with 'how does it work')

How does it work?

The code you select gets wrapped inside it's own class (unless it contains a class of its own) and then an entry point is added to this class. A bunch of common imports (i.e. include) statements are added, just in case.

It's compiled using System.CodeDom.Compiler which is remarkably easy to do.

If the code doesn't compile -- then I display a mini window, showing the generated code, and what compilation errors there were. This gives you a chance to alter the code and get it to work.

If there's a runtime exception, then I display the same window, along with the exception that occurred.

I don't have enough time to work on this project. So it's on the backburner, alongside ShinyPower Analyzer, WSCG v4, Crank, SimpleTests, and everything that isn't TimeSnapper or Advantech.

Writing this add-in was actual just a detour along the way toward writing a SimpleTests add-in, which I'm still kicking around in the back of my mind.

The steps and decisions involved in getting that puppy to fly are all too many.

Regarding exec immediate: Source code currently is VB only (since the PC i first developed it on didn't have C# installed). Once I've made it work for both languages, I'll post the project up.

 

Ruby versus .Net? If Languages (and IDE's) were Vehicles... what would you be driving?

Ruby: a racing bicycle.net: house on wheelsRuby on Rails: jetpack bicycle

Ruby: Racing Bicycle

I'd describe Ruby as a racing bicycle. Highly maneuvrable, stylish, quick to launch etc. Yet not the greatest top speed, and some potential safety issues, due to the lack of compile-time type-checking. It's got its pros and its cons.

.Net: Motor Home

Dot Net is a house on freakin wheels. Has everything built in, good on the open road. But takes a while to get it started, less manuevrable in traffic and sometimes hard to park.

In the context of this metaphor you see how ridiculous this question is: "What feature can we add to .net to give it a ruby-like appeal?"

Or the metaphorical equivalent: "What feature can I add to my motor home to make it more like a bicycle?"

You don't really choose between these two things. You use the right vehicle for the job. Some morons would insist on using the same type of vehicle in every scenario. Be they bike bigots, MotorHome bigots, or anywhere in between.

Wait: but what about Ruby on rails?

Ruby on Rails: Jet Bicycle

I picture a jet pack on a bicyclist's back. And i quickly found just such an image! I chose thise over a motorcycle because i figured that RoR doesn't fundamentally alter Ruby -- it changes the way it's used.

You know, at this point the metaphor is just ridiculous and I'm close to just deleting this whole entry.

The jet pack implies more danger -- but the auto generated unit tests of RoR increase the safety, not the danger. If I upset some RoR fanboys, then all the better I guess. Those guys are so touchy. Go cry emo kid!


Image credits:

Side note: I actually spelt maneuvrable right without any help from the google spell check! Very proud right here ;-).

 

Switching off the OS

I was reading about these people switching to mac, and switching back from Mac and everything... and you know, i just thought: what a bunch of losers. So last season.

I finally made the switch away from operating systems. It was like a light switching off in my head.

I uninstalled all my operating system stuff. All i use now is a browser and a usb key.

I use google docs, google spreadsheets, google calendar, google mail. And for searching I use msn. i mean google.

Now that all my info is online I don't need a hard-drive either. Virtual memory goes onto the usb key. I took out the hard drive and just gave it to a kid who was walking down my street. What a liberating moment.

Drives for my remaining hardware are bundled into a self contained file that's called by a bootstrap from the BIOS. I used a bunch of stuff from sysinternals to extract the driver code away from the full windows drivers, like a surgeon removing healthy tissue from a tumour, and bundled them into a self-booting chunk of code on the afore mentioned usb key. Updates are gonna be tricky. I'll work aroud that when I get to it.

The only thing i don't have is a decent ide. Maybe lisp can help there.

 

Quick Tip: Show Shortcut Keys in Visual Studio

Customize Toolbars, Options, Show shortcut keys in ScreenTips

Right click in the tool bar area --> choose customize, you get the 'Customize' dialog.

On the 'Options' tab there's a little check box that says "Show shortcut keys in ScreenTips".

Like so:

Customize Toolbars, Options, Show shortcut keys in ScreenTips

This is off by default. But you're like me. At least I think you are. And when you spend much of your life inside an application, you want to learn a few good short cut keys. So check that box!

Of course, to really take it to the next level, use KeyTraino ;-).

Updated:

Here's the equivalent screenshot for Visual Studio 2005.

In visual studio 2005

 

Code Quiz: That Empty Feeling

Which would you use to test if a string is blank? And why?

1. x.Equals(string.Empty)

2. x = ""

3. x.Length = 0

4. x = string.Empty

5. string.Empty.Equals(x)
 

A Kilo of Days Ground

So The Daily Grind is just about set to celebrate it's 1000th edition!

Mike Gunderloy is an industry legend. If you want to feel that you're keeping up with the vast amount of new stuff that the programming world keeps throwing at you, all you need to do is visit the Daily Grind, daily. Here's looking forward to another 1000! You don't need to subscribe to any blogs. Check the Daily Grind every day, and you're up to date. Anything you subscribe to beyond that is purely for entertainment.

Well, here's a bunch of stuff. I can't really say what ties it together -- it's largely code generator type stuff that's been taking background braincycles away from me lately. Mostly stuff I found thanks to Larkware.

Somethings gonna happen here. Something... else... altogether.

  • SubSonic -- 'the Zero Code DAL' -- a ruby on rails inspired code generator for asp.net, that presents a clever compromise between ORM and 'code generator overdose'.
  • ActiveWriter -- entity modelling tool, that creates .Net classes with ActiveRecord attributes (used by Castle Project).
  • NextGeneration -- a code generator app by some clever Australian. Not a lot written about it that I could find. My experience with it was mixed. I'd say 'has potential'.
  • Web Client Software Factory -- guidance from the patterns n practices gang at MS. Haven't even looked at this yet.
  • protara -- seems to be an entire language and development platform. Worked for me, though i'm not sure what i'd use it for, or who would be the real target audience for it. (Wow -- seems to be Australian too. I only wish I got the point of it.)
  • Aptana -- brilliant javascript IDE. Javscript intellisense, integration with popular web frameworks... incredible app. So useable.
 

ShinyPower Now Opensource

Need help getting started with Powershell? Or need help working out how to automate powershell from .Net?

I wrote a quick and dirty tool a few months ago, called 'ShinyPower'. I've now made it open source, and available from CodePlex -- source code and all.

It's also been recompiled to use Powershell release candidate 2.

If you ever do any scripting/admin work on windows, and you haven't checked out powerShell yet, then today is the day! PowerShell is brilliant. Jeffrey Snover, the architect behind powershell, really hit gold with the ideas in this tool. Jeff was interviewed on hanselminutes last week, and there've been a few other podcasts where you can hear him talk.

If I had time I'd also be polishing/releasing 'ShinyPower Analyser' a clone of SQL Analyser that you can use for developing PowerShell scripts (rather than SQL Scripts). If anyone wants to pay me good money to stop my other work and write this thing for a week, I promise it'd be ready. In the meantime, the excellent Karl Prosser has released a sophisticated tool called PowerShell Analyzer that is darn impressive and does things I'd never dream of doing. And Karl appears to be a New Zealander. In case you don't know, Aussies and Kiwis have a strange combination of rivalry and respect, based on shared experience. We both have trouble converting US formatted dates into real formats, for example. But I digress. ShinyPower Analyzer is similar to PowerShell Analyzer, but different in enough ways that I think it'd be worth finishing it and shipping.