Showing posts with label Lessons. Show all posts
Showing posts with label Lessons. Show all posts

Thursday, June 18, 2015

Will this effect affect anything?

When to use affect and effect is something which in the past, I have relegated to guesswork. For a time, I used just one, figuring, I'd be right half the time.

Now, I've got a bug report to fix, saying, "Use the terms Affect and Effect consistently". One screen has "Effect" on a label, the other has "Affect" in a heading.

Well, it's not meant to be used consistently! It's meant to be used correctly! But all the same, I could not say with any confidence that it was right - so I Googled it, and guess what, it was wrong, in both cases listed on the bug report. Completely backwards. Whoever raised the report didn't know that either - they wanted it the same. But hey, the report was fair enough - it looked dumb, and in fact, was dumb.

So, for the record (at least my personal record): Affect is a Verb. Effect is a Noun.

You have a "Tax Effect" of some attribute in our system, and therefore that attribute "Affects Tax" in a certain way.

Affect is Verb, Effect is a Noun.... Affect is Verb, Effect is a Noun.... Affect is Verb, Effect is a Noun.... Affect is Verb, Effect is a Noun.... Affect is Verb, Effect is a Noun.... Affect is Verb, Effect is a Noun....

I need a rule to remember this.AVEN or ENAV ???


Monday, April 20, 2015

It is your job and it is your choice.

Recently I've been stretched quite a bit at work. As every developer in a small business can tell you, they are the one "responsible" for printers that don't work, windows updates that need to be applied, Internet connectivity, backups, and so on.

After a recent spate of server outages and just a bad month for our network in general, I found myself becoming a little bit disillusioned with my role in general.

I'm trying hard to keep up with new development technologies and fighting an uphill battle to keep our software product relevant and somewhere close to up to date. It's a tough battle in a small (microscopic) software development house.

Anyway, after recently being drawn into discussions on disaster recovery, backup best practice, virtual servers architecture, RAID drive recovery and so on and seemingly being the one who's fault it was that a drive failed in the first place, then also copping plenty of pressure to keep the progress of our ongoing, leviathan development project going, I started having some toxic thoughts about how I'm not paid enough to be a system administrator AND a lead developer.

But I know that's toxic! I just said it was. It didn't stop me feeling a little dejected - or used. But I believe I am a more positive person than that and I don't want to become "that guy". There is two ways to look at every situation. You can be a victim, or you can look at what you can control. You can lament that you aren't paid enough, or you can grab the opportunity to do more.

I like to think the negative thoughts that sometime creep in are only skin deep - a short term reaction to a tough day maybe - and that underneath, the "positive me" will ultimately control my actions, for the better.

So with those fairly positive (I'd like to think) core values, I took to Google. I searched terms like "it's not my job", "initiative" and "attitude" and Dr Google prescribed this one....http://www.personalbrandingblog.com/eliminating-its-not-my-job-attitudes-at-your-workplace/

This is a gem. This make the analogy with a sporting club and pointing out that everyone has "roles" but essentially, there is a "job" to be done - by everyone! So I thought, yeh, but what happens when one superstar carries the team all the way!  Well, firslty that rarely never happens, secondly, when it looks that way, the value of that superstar skyrockets.  But think about what comes first.  I love cricket so I'll relate to that. You will never see a player, unproven, state that "right, I'm going to open the batting, open the bowling, captain the side, oh, and I'm going to be incredibly successful at it, so I want top dollar before I start". It doesn't work that way. That player goes out, does what he says he can do, then gets the big offers. If he's bought into the side as  a wicket keeper or an opening bowler or a leg spinner, and does that, he doesn't not make runs or take catches until he's paid more. He makes the runs, takes the catches and turns into an invaluable resource. Then come the spoils. If he's still not appreciated by his current team, that's a different issue. (The recruiters will come knocking).



So time to "put some runs on the board". Once I really am invaluable - then worry about the spoils, and I'm tipping that if it's going that well, you won't have to worry too much.




Monday, April 13, 2015

Remarkable Curry Puffs

A few months back the oldest boy bought home some curry puffs he'd made at school, in cooking class.

They were learning about spices and flavours and so on. His were seriously hot. He'd experimented with the curry and the chili.

He'd learnt too. I loved them. No one else did.

Is it better that he made ridiculously hot curry puffs that I loved and most people hated, but that everyone talked about, or should he have just followed the recipe and made something that everyone expected.

I think his remarkable curry puffs were far more....well,,,remarkable.

Thursday, January 22, 2015

How to install the Dot Net 3.5 runtime to a Windows 8.1 Pro system

I've been attempting to add the Dot Net 3.5 run time to my new Surface Pro 3 running Windows 8.1 Pro for about half a day now.

Initially the normal web installer for the 3.5 run time was failing with error:
"0x800f0906 : “The source files could not be downloaded. Use the "source" option to specify the location...". 
After a bit of Googling I discovered (in fact remembered because I think I've been here before) that you can only install the Dot Net 3.5 run time from the Windows "Add / Remove" features section of the Control Panel. However, this too failed, with the same error.

Now our Internet traffic in the office is all routed through a Web Guard proxy. There is however a work around for this exact scenario which I promptly implemented, ensuring I was bypassing the proxy - still the same error.

Next, I discovered there was a security patch, which could actually prevent the run time being installed - but that could be resolved using security update 3005628. I ran the Windows 8.1 x64 version of this - guess what, no change.

Now you always find what your looking for in the last place you look right? The next discovery on my part was that, as the only way to add the Dot Net 3.5 run time to Windows 8.1 Pro is via the Windows Update service (no stand-alone installation is going to work) you cannot be running your Windows updates via WSUS. Guess what, We are!

So, the work around for this is a command line option - found here.
DISM /Online /Enable-Feature /FeatureName:NetFx3 /All /LimitAccess /Source:installationMediaDrive:\sources\sxs
But alas, that too was failing.... still failing to locate the required files, with the same error!

Next, to disable the WSUS Group Policy. Luckily, we are a very small company, and I, as the developer and also "the I.T. Guy" because, you know, I know how to restart a server!

So I located the Group Policies in question, recorded the settings for each relevant one, then disabled them. (For the record, they are in the Computer / Policies / Administrative Templates / Windows Components / Windows Update branch of the Group Policy editor.) Having run "gpupdate /force" on the Windows 8.1 Pro machine, I tried again from the command prompt. It didn't work!  I was attempting to use a Windows 8.1 Pro MSDN disk as the source for the component.


So, I went back to the control panel, and tried adding the feature the original way - now that my WSUS Windows update policy was turned off, I was optimistic - with good reason - it worked! The Dot Net 3.5 run time was installed, on my Windows 8.1 Pro, Surface Pro machine.

------------------------------

Now I don't expect many people to read all that diatribe - here's the executive summary:

For error 0x800f0906: The source files could not be downloaded..... when attempting installing the Dot Net Runtime on a Windows 8.1 Pro machine:

  1. Make sure you are not accessing the Internet via a Proxy that is preventing access to Windows Updates (pretty unlikely you'd hope) - you must have Internet access as this is the only way, for Dot Net 3.5 on Windows 8)
  2. Remember, you need to be using the Control Panel / Programs and Features option to "Turn Windows Features on or off (you can find Control Panel in Windows 8 by just typing "Control Panel" from the Start Screen.)
  3. Make sure Security Update 3005628 is applied.
  4. Find out if you are using Windows Server Update Services (WSUS) for windows updates as this will prevent you PC from accessing the files required to add the feature. If so, you'll need to get it disabled for this process. If you're like me and in control of those Group Policies, temporarily disable them. If you work for a larger organisation where that is impractical, you will need to see if you can get yourself temporarily excluded from that policy, while you add this feature.
If none of these things have helped solve your problem, I'm sorry, but as I mentioned, step 4 fixed mine, and you also find the answer in the last place you look! (sorry I didn't keep looking for answers, after I found one).






Friday, November 07, 2014

So tempting to blame the user for bad design...

The me from 15 years ago would've blamed the "dumb user" for this, but in these days of UX Design, usability and delighting the user I'd like to think I'm bigger than this now....

I am working on a line of business, Windows application which involves quite a bit of data entry. The screens are nice and consistent in their layout across many aspects of the system ranging from CRM and Sales tools to Accounting and graphical estimating tools. (www.constructor.com.au). Users are presented with summary information and choose to open the information they want to edit. Slightly old fashioned but with a decent user base around the country and the promise of lots of fancy new services to hang off this system, the windows client will suffice for our desktop users for sometime to come.

Today the boss came in, a little sheepish, asking if we had a back up. He'd just deleted an important client he'd been working on. He admitted to not really reading the message that popped up, but also insisted that he'd just altered some information and thought he was just confirming the "save before closing" style message.

Now the messages in both these situations (saving and deleting) are in fact quite different. We use these HTML message boxes (a custom thing I wrote years ago), so save confirmations are all green and blue, positive look and feel, with "Save Now" captions on the buttons etc, and delete confirmation messages a red with the item you are about to delete bolded, and so on.  But still, I found it intriguing that a relatively experienced user could "accidentally" click the delete button and confirm the action, on a screen he swears he wasn't using.

Turns out, I guess it's something of a design flaw on my part - if I'm tough on myself. It's still going to bite me again at some point though if I don't do something about it now. 

I watched briefly as my boss explained what he thought he'd done and something jumped out at me - the detective work here did impress him in the end, helped perhaps by the fact he was already somewhat placated by the fact I have backups occurring every two hours so the information he thought he'd lost was pretty simple to recover.

After entering a diary note against a sales lead he was working, he "just saved then clicked yes to confirm the save and close"....

Now that's strange, because you shouldn't have to confirm the save if you click on save - that would be just silly. You would only have to confirm the save, if you clicked on "close" and had made some changes that maybe, ought to be saved.

So I watched....

"Yeh, I just entered the notes in here the clicked here to save them and close" - I watched as he moved the mouse up to the "Save and Close" button and double clicked it....



Wait!  You double clicked....

Here's what it looked like when you close the diary screen....




So, directly under the "Save and Close" button, as "design" would have it, is a delete button. (At least when the screens are maximised.)

Now as I said, firstly there is no need to double click a toolbar button in any Windows system I've ever used, but, it does seem to be a common misconception.....and I have worked hard to have a very well worded, "are you sure" message, with RED text, and "no" as the default choice. We do however try to live by one other little golden rule here - use message boxes as a last resort. Try to design so you don't need them, and try not to build rude software the continually interrupts the user with such dialog.

We use message boxes sparingly and even then, they don't get read!

So now, I have to set about redesigning this scenario.

It appears far harder than it should to simply capture/handle the double click event on the toolbar buttons of the standard Toolstrip control in .Net. (At least not when you also want to handle the click event.)

Do I just move the delete button somewhere else - it is probably ironic that it lines up so perfectly with the save and close button on all our standard summary and edit screens (especially when they are all full screen size). Do I work harder on fixing the actually response to a double click on a toolbar button, of can I just step back in time, and blame the dumb user?

I think I'll sleep on this one....

Monday, March 31, 2014

How do you use templates in Word 2013

I can only see Online Templates, none of which I have ever needed!




Word 2013 will only show you the "Featured" AND "Personal" options on the "File / New" screen, if you have something entered in the "Default Personal Templates Location", which can be found in the Word Options screen. (Go To "File" in the top left, then down to options.)


Enter the path to your templates, in the "Default Personal Templates Location" field - I am sticking with the old Office 2010/2003 etc location.

Once you have a valid path in that field, the "Personal" link will appear on your File / New screen, and you'll be able to see your old documents.

Discouverable software - right! - discoverable only using Google.

Wednesday, January 15, 2014

Some in sight into how Google Calendar Quick Add works

Using IF THIS THEN THAT (www.ifttt.com) I automate several entries to a journal calendar in Google Calendars.

Recently, one of those automated entries contained the phrase - "13 years" in the middle of a decent slab of text - from a Facebook status update actually.

So, you can guess what happened in my calendar. Yep - the "13 years" was removed from the text that was used as the description for the calendar entry and a 13 year entry was made.

I've used the quick add feature often from the calendar page in the browser and often entered text like, "for 2 hours" or "for 1 day" but never realised that any text related to any time frame would simply be stripped out and used as the duration, regardless of the context of that text.

Friday, May 25, 2012

Keep it real

As so often happens, a recent post by Seth Godin titled "Hard Work on the Right Things" struck a chord with me.

I'm so guilty of concentrating on the wrong things, and even more often, focussing on the wrong things at the wrong times.

Customers (of the "end user" variety") and even managers, especially in the building industry, don't care about your code, how good it is, what language it's written in or whether your curly braces line up. They don't want to hear you talk about how well architected your system is. They want to know it works, and they want to know it does what "they" want it to, and nothing else.

Most of the time, "what they want it to do" is different to everyone else, and most of the time they can't understand why on earth any other customer would be different, but most importantly, they don't care. It doesn't matter.... to them.

What your software could do for them, and how well it could do it, are completely irrelevant. They are interested in knowing what they want to know right now - be that a problem a prospective customer is trying to solve, or an issue an existing customer on the phone to help desk, is trying to resolve, of a non-technical manager wanting to know when your latest project is going to be ready.

I know what Seth is getting at in his post is intended to apply to any discipline, in any industry with any customer, but I find it is particularly relevant to a developer especially one who is in close contact to the end user of their software.

This is not to say robust, well designed code isn't important or that refactoring your code to make it maintainable, optimised etc isn't vital. It is. Clearly! These just aren't things the customer is interested in (usually).

Likewise, as Seth says;
"what matters changes by culture, by buyer, by product, and even by day of the week". 
The message I take from Seth's post is (in my world) "work hard at building good quality software but be especially attuned to what really matters to the customer/manager/colleague/prospect/friend you are currently interacting with, and relate to that and you'll be a winner."

This has parallels with listening with empathy and "seeking first to understand, then be understood".


Monday, June 27, 2011

Wednesday, December 01, 2010

Voiced and Voiceless

How to pronounce possessive S'es - or is it Ses, S's?  or could it be S', Esses, Hmmm?

http://english.stackexchange.com/questions/5913/pronouncing-possessive-words-that-already-end-in-s

This takes some reading, and following a couple of the links, in particular, http://forum.wordreference.com/showpost.php?p=672824&postcount=8  and http://en.wikipedia.org/wiki/Voiced_consonant

Thursday, April 22, 2010

Lambdas - good intro

Will probably need to read this again soon, but it was worth the 20 minutes I spent on it this morning...

Wednesday, April 21, 2010

I’m estimating in Apples and entering Oranges on my timesheet

applesandorangesI’ve just had a realisation that for the past month, I’ve been making a fundamental mistake with regards to managing the schedule on a software development project I’m working on.

Someone that’s tried all the various techniques that I have and listened to or read countless case studies on the matter, should never have made such a fundamental mistake.

We have undertaken a massive rewrite of our software recently and have been roaming fairly aimlessly along, building some really nice stuff, but with only a vague picture of what we want to do, and what will wait until later. I’ve felt bad about the lack of direction for awhile but have never had enough pressure on me (or put enough on myself) to make some commitments about where it’s going. I’ve always been able to show plenty of progress – lots of cool looking screens and better features than the old system – but progress to where…I’m driving my car along a very long highway and have no clue as to where the road goes.

Lately, in the nicest possible way, the owner of the business has decided he’d like to know when this project is likely to be ready to launch. I cringed a little, as I wanted to be all Agile, and not set some “pie in the sky” date way out 12 months of so from now, only to completely miss it and….you know how it goes. However it is clearly just as big a mistake to continue to wander aimlessly along with no goals and no solid commitment on my part. I had to face facts and make a few tricky calls.

So I applied my best Agile techniques and started talking about small iterations, monitoring progress, and even evidence based scheduling.

So for the past month, I’ve put together a work log (or backlog), done my estimates of the work to complete, recorded my time and compared results, recording how much time I get to dedicate to the project and how much time I get dragged off onto other stuff.

After a very interrupted month, the results came in. There weren’t too many unexpected figures in there except that my estimates were about 25% too high.

After some discussion with the boss, he agreed to do whatever he can to stop interruptions to my day task switching etc. He means it and has put his money where his mouth is in terms of contracting others to take over some of the work. no complaints here.

Then we started talking about what a fair percentage of my time is, to be dedicated to this project. My gut feeling was that if I could log 70% of my time to the project, that would be great. He couldn’t understand why, with all he was doing, that I would so matter-of-factly" say, achieving productivity of over 80% is a pipedream.

“I want you to be spending at least 90% of your time on this. I’m paying you to work here….” and so it goes.

So today, I've focussed and the first two hours were really productive “zone time”. I started at 8.30am, made coffee, replied to some emails, checked a couple of settings on our network as the new guys contracted to manage that (last week – one of the obstacles removed) were making some changes overnight, and I was into it.

I surface at 11.00am and thought, well there’s 2 hours. So I logged that time. Now that’s 120 / 150 minutes – 80%. Geeez! How is 90% ever going to be possible if I done this much and still only hit 80%. So I went to make a coffee, thereby dropping that figure a little more!

Then it occurred to me, when I estimate these tasks, incredibly roughly with a huge amount of guesswork and gut feel, I do so in a “that’s about a day, but that one is less than half a day, that one will take me a week” and so on.

This form of guesstimation intuitively takes into account all the normal daily interruptions of phone calls, email, coffee making. It’s not fair, or even accurate to estimate in terms of duration (“it will take me at least a week to do all that”) but then record your time in terms of dedicated zone time. I have to record time the same way as I estimate it.

It sound so bloody obvious when you say it out loud, but the fact was, even after the number of different approaches to this type of scheduling and estimating I’ve seen and used, I still made such a stupid mistake.

Anyway, it is now clear that as I have not worked on any other projects or tasks today, Ive hit 100%. How much did i get done? Well, if you look at the tasks I finished, almost exactly what I’d expect to get done in a day. Good estimating Stu! Now I am recording that time fairly my estimates at the end of the month should look a lot more correct too. Not only that, but the boss will be happy seeing my get close to the target he set of 90%…dream on…

Joel Spolsky had a rant along these lines on a recent StackOverflow podcast too – talking about absorbing the minor interruptions into the hours you record against the job – those interruptions are a normal part of the day and should be included in the evidence you take on board, for the next estimate you make.

Wednesday, December 23, 2009

Form_Load Event vs overriding onLoad

I'm still using Windows Forms with C# (yep I'm the one.)

I've been having this nasty little form painting problem on inherited forms, whereby as the form loads, it does stuff in the load events of the child, parent and in some cases "grand parent" form.

The painting is ugly because as the form sizes and positions to it's last state, done in the very base form (top of th hierarchy) it repaints the form by not the controls within it yet.

After trying heaps of stuff including refreshing, invalidating, pausingLayout etc etc, I discovered a post someone else with a very similar problem.

Turns out the overriding the OnLoad event gives you much better control in this scenario because by calling base.OnLoad at the start of your override, you let Windows get all it's stuff done (and probably the child form "stuff" as well) then get back to your resizing code - which makes this all a lot smoother...

...anyway, mental note - override onLoad instead of using the form_load event wired up by the designer.

Thanks to this post!

Wednesday, September 09, 2009

Counting records in a SQL Server table

Counting the number to records in a table is something you need to do from time to time. Especially for long running processes where you need to have some clue as to what's instore, if for no other reason than to provide feedback on progress, in terms of percentage complete.

Until this morning, I though select count(*), or select count(field_name) was my only option. That bugged me because select count(*) can't be efficient, and select count(field_name) is tricky to make generic because you don't always have a consistant field name to use. It ought to be possible to write something that simply takes a table name as a parameter and tells you how many rows are in that table. Turns out, there is!

It's explained here - http://www.sqlservercentral.com/links/894320/119638 (although you need to be a member of the site - free - to read the article I think.)

It boils down to use of a stored proc: sp_spaceused. You pass the table name and one of the rows returned by the proc is the number of rows in that table. (Just as it should be!) Nice.

The contents of the proc vary for SQL 2000 and SQL 2005/2008 but the proc is still around.

Wednesday, February 11, 2009

Streams demystified

I must admit that even though I've been using .Net and C# for about 8 years now "Streams" have never really "jelled". There's all these Streams, StreamWriters, StreamReaders, TextStreams, MemoryStreams, FileStreams. 

I must be honest - it's been pure laziness that has prevented this. This is a bit of a pattern with me. Just getting stuff to work. Hacking it together. Anyway, as I was copying another slab of code today, I had had enough.  I needed to "get" this. So I pressed F1 - called up the MSDN help and read... I stumbled across a page titled "Stream Concepts" - or something like that.

The introduction on "Stream Concepts" explained how all Streams have a Base Store. FileStream - a stream of "stuff" from a file. MemoryStream and stream of stuff from or to "memory". Then it explained how StreamWriters and StreamReaders append themselves to those Stream objects, via the constructor - because when you instatiate a StreamReader, you specify the stream in the Constructor...suddenly, some penny somewhere dropped. Things started to make sense and knew they did, because I was able to whip up some code that was nice and clean, succinct and worked, without converting stuff through about 8 different objects, reader here, writers there and so on, without copying it from somewhere else...and it worked.

Now to the seasoned .Net developer - which I should be, this is trivial and probably makes me look stupid...if so, so be it, i probably am...but I'm a little less stupid that yesterday.

From now on, I am going to force myself to search for this "deeper" knowledge everytime i strike something I don't "get", that I should get...it maybe 20 years to late, but I'll be a decent developer yet...!!

==========

Then, on the way home listening to to Podcast #40 from StackOverflow, the guys (Joel, Jeff and some other dude) were talking about continuous learning, reading and so on - they talked about "deep" learning. That was it. I need far more deep learning. Maybe not as deep as they were talking about, but deeper that cobbling together code that works without really "getting" it... I have to do this...

Tomorrow I'm starting a 4 week, basic (really really really basic) photography course - for people with point and shoot cameras. It maybe simple, and an absolute starting point, but the same principle applies.  I want to learn this stuff properly and if it leads me to spending heaps of money on new cameras, because, as usual, all I learn is how much I need to spend to do things properly, well so be it.

Thursday, January 22, 2009

My LINQ stuff won't compile after Visual Studio 2008 SP1

That'll teach us to play with Beta stuff.

Anyway, import links here:

Changes to the schema element for the SSDL content...


Other changes...


Also seems as though the System.Data.ProviderException has been replaced, I think with the System.Data.EntityException but don't quote me on this.

Wednesday, January 14, 2009

A BitWise Calculator

This was really useful when working out the constant vlues required to build a "magic number" used in some code I found on the net.

Wednesday, January 07, 2009

public T Find (Predicate <T> match)

Like Delegates and Events in c# - at first - predicates and dynamic functions, Find and Exists on Generic Collections, confuse the !@#$ out of me everytime I need to use them.

I'm going to write some stuff down here that gets me over the line - it makes some sense to me, so that I can refer back to it. This post will probably change as I "grow wiser", but for now, it is here to stop me having to "re-aquaint myself" with this topic, via useless MSDN help, and examples about dinosaurs, everytime I strike it.

I want to find an occurence of an object, in my Generic collection.

So, you use, MyList.Find. All the doco words it like this:

public T Find (Predicate match)

Now this is just the "signature" of the Find method you are about to use.

Find, is a method on the List class.  

Now T was the first point of confusion. But as best I can tell, this is just a naming convention. It means your particular Type of object. (Your class name.) So it's kind of obvious - the Find method on your Generic collection, returns to you, one of your own objects. (Naturally).

From there, the next point of confusion is the word Predicate.  Any concept I'd managed to grasp until that point evaporated when I read that word. It just wouldn't gel.

After the 20th time I'd hacked a solution in to find an object in my generic collection, I decided to look up the word predicate in a dictionary.

It basically talks about "claiming, asserting, affirming something about the subject..."

I guess the "subject" in our case, is our function that is going to define what consitutes a match so we are asserting that the subject of that function, is one of our custom objects...a "T" within our list of T's  - List.

So, Find, on the List class, is going to loop through all its members, (which are, remember your very own objects) and return you one of them, which, when passed to the method you tell it to call ("match"), returns true.

If this is way to over simplified for you and that annoys you, move on to some other site or Google search result, if it doesn't annoy you and you can further enlighten me, leave me a comment that sets me straight, if it helps you too, then great! Good luck.

Time will tell whether this helps me again or not...

Tuesday, December 09, 2008

Using Personas really helps!

I recently read Alan Cooper's book - "The inmates are running the asylum". What a life changing (or developer life anyway) book that was!

It really got me thinking. At first I was depressed about the state of affairs in computer software development, but then, I started noticing changes in software that have taken place in recent years, since this book was published, and realised that it really is having an impact in some quarters...granted many other "quarters" still have a long way to go, and the problem is far from solved - take for instance Office 2007! But then I;m sure Microsoft would argue that ribbon controls are precisely a response to the usability and interaction design that Alan Cooper espouses. I'm getting way of track in this post already!

Here at Constructor we have recently implemented some personas. It was a little experiment really, to see if I could get any traction for the idea, without really ranting, raving and evangelising. It helped that I waved Alan Cooper's book under the nose of the GM, who read it, loved it, and now two other staff members have also read it. 

Anyway, we drafted up a handful of personas, and stumbled across some graphics software we could use to knock up some very satisfactory images to go along with our personas. We printed up little one page "bios" complete with "mug shot" onto nice glossy A4 cards and these float around the office, living mainly on the round table in the middle of the developers area. They have already been the centre of a handful of discussions about new enhancements and so on. It's been very encouraging to watch other staff members, completely "get" the benefit of using personas (not specific users) to discuss these features.

Our personas were developed without formally interviewing customers, mainly because we know our existing customers, many of them have been with us for 10 years, and feel we could at least start down this track without the extended interview process.

Anyway, it's working a treat!

Just now, I've been designing a new screen, for customising some user options. While sitting staring at Visual Studio IDE, I found myself slipping into that old trap whereby it's all too easy to just pick controls that work best for me at the time, and throw them onto a form. Now, the background data access work is down. The user interaction has been designed at a higher level with our personas in mind, and this "customise" screen is a bit like a "Tools/Options" kind of screen. Won't be highly used - this doesn't mean it shouldn't be easy to use.

Anyway, as I said, I found myself slipping into the, "ah well a combo box will do here, the user can just pick..." oops - there I go, stretching and twisting the user into the shape I need him/her to go...I heard a small call from the table behind me. It was Eddy, my primary persona in this case. I turned around and read the bio, and thought again about my new screen. Suddenly something dawned I me. This screen was coming at the solution, from completely the wrong angle. This was a screen about setting user options. It needs to start with the user, and most likely the current user.  The module they are setting options for needs to be highlighted, but given it's for customising, they need to see the others, right there in front of them.  The massive list of customisations that can be made is secondary and had to be moved way over to the right...look the details of this particular feature don't matter, focussing on our personas, has just improved to interaction with this screen for everyone that users it, by simply forcing me to think "step away from the computer" and get in the shoes of the people that need to interact with this thing.

Now there is most definitely plenty still wrong with our approach. We are still developers doing design work - that's not likely to ever change here, we're 5 people, but surely, this is a big step in a very positive direction.

Monday, December 08, 2008

I never knew this was called "Monty Hall"

Several years ago I walked into an office with a group of guys having an animated argument over a game on a white board.

"Pick one of these doors" (drawn on the board). "If I tell you there's a brand new car behind one of them, then after you make a choice, I'll tell you which one of the remaining doors is incorrect, should you change your choice to the other remaining door?"

So you could be right all the long, but you now know a little bit more...so should you change.

I've since bought this up at other offices, dinner parties, BBQs etc and wonderful conjecture always ensues.

Anyway, I found an online version - here - http://montyhallgame.shawnolson.net/ - check it out. You should win this, 66.666% of the time.