Wednesday, December 26, 2007

Notes from new company launch

A few notes about new company launch found while tidying up my desktop

"Software that works like you do"

benefits of bigger company VS benefits of smaller company


Quality

  • processes / mgmt systems
  • in everything
  • delight customers
Belief
  • believe it can be done
Teamwork
  • meet team objectives
Trust
  • each other
  • the company?
Precision
  • order
  • attention to detail

the people who do it first are remembered (in sport)
- does this hold true for software? - I don't think so

Passionate about software
Proud of the software we make

opportunities for personal development (?)
we have a large customer list, that many would be envious of. But what does that really mean for new customers/users?

Thursday, December 20, 2007

quasimodal shift


The above image is from SourceGear's Vault. It demonstrates a bad use of modes within software because it forces users to remember something they shouldn't have to, if they want to hide this dialog most of the time.
They have to remember that when they select the option which (can/used to) display this dailog they have to press a button if they want more advanced options.

Better would be to hide this dialog and perform the operation based on the default/previously selected option, unless the Shift key (or any other predesiganted key is pressed). This way the functionality is stil available to all and no one needs to remember anything. (A note explaining this feature could be put on the form, rather than the above checkbox and label.)
This is an example of a Quasimode.

NOW() + n in Excel and weekends

In Excel:

Display the current time plus two days:
=TEXT(NOW()+2,"dd/mm/yyyy hh:mm:ss")

Display the current time plus two working days (skip weekends):
=TEXT(WORKDAY(NOW(),2),"dd/mm/yyyy") &TEXT(NOW()," hh:mm:ss")


N.B. If the WORKDAY function is not available, and returns the #NAME? error, install and load the Analysis ToolPak add-in.
  1. On the Tools menu, click Add-Ins.
  2. In the Add-Ins available list, select the Analysis ToolPak box, and then click OK
  3. If necessary, follow the instructions in the setup program.

Wednesday, December 19, 2007

Tuesday, December 18, 2007

MSI to text

Debugging Installshield projects is a right pain. Who changed what to break the install?

Having spent ages trying to work out what had been changed in an InstallShield project so that it no longer upgraded files. I eventually found a solution using MSIDIFF.

This is a brilliant tool which can convert an MSI file to text.

I used it by taking the old and new versions of the MSI files, converting to text and then comparing the files using WinMerge to see what had been changed.
I then went back into the InstallShield project to make the necessary repairs.

Friday, December 07, 2007

cmdline DTS to DTSX

When migrating a command line executed package from SQL Server 2000 to 2005

1. Use the migration wizard to turn the DTS file into a DTSX one

2. Change the command line.

From:

dtsrun /FC:\Scripts\GetLatestDataFromDev /NGetLatestDataFromDev /A"TargetServer:8=(local)"

To:

dtexec /FILE C:\Scripts\GetLatestDataFromDev.DTSX /Set \package.variables[TargetServer].Value;(local)

Wednesday, December 05, 2007

Tuesday, November 27, 2007

new phone - HTC Touch Dual

I've got a new phone.

I think that means I'm obliged to post detais of all the phones I've had before.

This is the new one:

This is the one before:
I had this one for a bit as a trial:
I vaguley remember this:
Ah, my first Windows Mobile powered phone:




Tiny phone:
There was another Nokia phone I can't remember the name of or find a picture of.

This was my first mobile, ten years ago. Ah, the days of the brick.

Friday, November 23, 2007

Wednesday, November 21, 2007

Poor internationalisation

This image is part of a screen shot from a shopping website I visited recently.

This shows the sites attempt at providing the site in different languages.
A few observations:
  • Surely the options should be: Français, Deutsch and Svenska.
  • What about an option for English. - Because this isn't, the only way to get back to English is to delete the cookie created by the site.
  • Because an option is always displayed (French if in 'English mode') and the only way to change the language is by selecting a different language from the list, to get the site to display in 'French' you must first select one of the other options. Yes, to see the site in French you must first display it in Swedish or German
  • There is no way to change the language if the browser you are using does not support Java Script.
Also, only the navigation was translated. All product descriptions were still in English. I don't think that will work out as being particularly helpful for French, German or Swedish visitors.
It's good to see websites adding support for multiple languages, it would just be nice to see them doing a good job of it.

Friday, November 16, 2007

plan in disappearing ink

When writing a plan, assume that you are using disappearing ink. A special disappearing ink that will slowly fade over time. To ensure that you don't lose your plan you have to keep rewriting it.
Now, hopefully you'll realise that it doesn't make sense to keep rewriting the same thing if it no longer applies. Therefore, you'll be forced to update it as you rewrite what has faded.

Hmm. I wonder if there's an application in this?

Thursday, November 15, 2007

MotoDev Summit notes

My notes from last Fridays MOTODEV Summit:




designing the best UI for mobile handsets

be obvious
be accessible
be consistent
be new and beautiful }be engaging
be fast }
be protective (protect users (MY) work)
be familiar - speak my language - applications should ahve a personality - make user smile
be powerful - give the user (ME) power and control


controls:
grids
(2 line) lists
nested option menus
tabs
predictive
progressive disclosure
5 way controls

application based - not task based


common structure:
list -> view -> edit -> save -> list...


Flow + media + prompts = application

flow: movement between tasks/screen/functions/action

media: icons animations colours image themes fonts sounds

prompts: context style tone nomenclature capitalisation grammar & punctuation


Put context in your messages:
Not: "Wait..."
But: "One moment. Loading contact from sim card."


"language can never describe a user experience"



framework (from device/platform) + application = UI



when developing the UI, focus time/effort where users will spend their time, not on edge cases.





controling device access (Symbol devices)


gui:
consistency throughout
simplicity
screen size and resolution
prevent user accessing unproductive apps


Autostart
- reg setting
- startup folder: exe or .RUN file

AppLauncher - not supported

AppCenter
- free download
- prelicensed on each device
- shell over the OS
- admin password to close
- diasbles activesync
- no programmign required
- has a debug mode
- supported

Good mobile Messaging 5(?):
-expensive


SPB Kiosk
- 3rd party solution
- expensive for small volumes




Pocket controller (from SOTI):
skinable
can capture to .AVI


Windows Mobile Development


Why certify?
- commitment to quality
- demonstrates applying best practices
- required for inclusion in Microsoft app catalogue and marketing
- helps ensure device compatibility

why sign apps?
- slightly improved UI - as not prompted
- required for installation on some devices
- needed for access to some device functionality


designing for multiple devices:
touch screen - with or without
form factor - screen resolution & orientation
hardware (buttons, radios, peripherals, etc.)

however - all use same runtime


Plan before starting:
- define minimum device requirements
- ADAPTABILITY
- try and use additional functionality of some devices and down grade gracefully where not available
- avoid trying to target the lowest common denominator
- support touch screen where available

consider using separate forms for touch screen and non-touch screen versions


to target multiple devices
use anchoring and docking
when that is not enough, use the Orientation Aware Control
when that is not enough, hard code screen design based on device



Mobile Web 2.0


web 2.0 = user generated, has a network effect

think of mobile as an extension of the desktop

focus on mobile centric data/situations, rather than just portng desktop functionality

Wednesday, November 14, 2007

treating a social network like a private club

The clue is in the name. It's supposed to be social. If you only ever interact with the people you know that's not being very sociable.

Would you go to a club/bar/whatever where there were many people you didn't know, but only talk to the ones you did? Even if there were some very interesting looking people there?

When using a social network, make your data searchable, you never know who you might meet.

Get hit by a bus or catch the plague

When planning for some less than desirable circumstances, I used to talk about 'getting hit by a bus' as an example of unplanned possible events happening that may need to be considered.
However, as a result of lots of cycling recently, the possibility of being hit by a bus seems a lot more possible. As such I've started using 'catching the plague' as a less likely possibility.

The same thing, just less close to home.

Tuesday, October 16, 2007

A wasted opportunity?


This screen seems like a terribly wasted opportunity.
I went to the trouble of entering my email address in a website to subscribe to a newsletter.
I even clicked the 'confirm' link in the email I was sent.
But then I am presented with this screen.
It doesn't make it clear what I'm confirming.
It doesn't give me anything to do next.

EDSK ... self discipline and motivation

Every developer should know self discipline and motivation.

Why is this important?


There are many elements to software development. The chances are that you aren't going to enjoy all of them. Unfortunately though, there will be times when you have to do them. If you don't: certain bugs won't get fixed; features may not get added; customers may be lost; users will be frustrated; documentation won't get written; and your software won't be as good as it should be.


What do you do once you know this?


You find a way to to motivate and discipline yourself to do the things you'd rather not. There are lots of possibilities. What is important is that you find what works for you and don't give up until you do.


What do you think?
Is this something every developer should know? Have you say in the comments.

Delete old folder on upgrade

Here's the installscript funciton I wrote to delete the start menu shortcuts using the old company name when a folder structures were updated to reflect the new company name.

This worked with Installshield 11.
The following function was added to a .rul file. A custom action was then created for the funciton. The custom action was then added to the execute sequence.

function DeleteOldCompanyNameShorcuts(hMSI)
begin
//Errors should not be highlighted as this function will be called multiple times
// on subsequent calls there should be nothing left to delete
// Also, there may not be anything to delete in the first place

//default group type is common
//Delete old company name shortcuts from all users menu
DeleteProgramFolder(FOLDER_PROGRAMS ^ "Old Company Name");

//Delete old company name shortcuts from current users menu
ProgDefGroupType(PERSONAL);
DeleteProgramFolder(FOLDER_PROGRAMS ^ "Old Company Name");
end;

.Net past and present





































20022003200520062007
Tool
(Visual Studio)
VS.NET 2002VS.NET 2003VS2005VS2005
+ Extensions
VS2008
LanguagesC# v1.0
VB.NET (v7.0)
C# v1.1
VB.NET (v7.1)
C# v2.0
VB2005 (v8.0)
as beforeC# v3.0
VB9
Framework LibrariesNetFx v1.0NetFx v1.1NetFx v2.0NetFx v3.0NetFx v3.5
Engine (CLR)CLR v1.0CLR v1.1CLR v2.0same versionsame version

Friday, October 12, 2007

EDSK ... not to use mapped drives

Every developer should know not to use mapped drives.

I'll start by admitting that this is something that really annoys me. I'll also admit that it may be appropriate to use mapped drives if, and only if, you are creating a mapped drive to connect to a directory that only you will ever need to connect to. An example being your personal area on a server.

If you're not sure what I mean by "mapped drives" or want to confirm that what I mean and what you understand are the same, take a look at these two Wikipedia articles:
Drive mapping
Drive letter assignment

I'd sum it up like this:
Rather than have to specify a long file path, such as:
\\aServer\folder\directory\another folder\another directory\my files\file.ext
It is possible to tell Windows that the letter X should be mapped to \\aServer\folder\directory\another folder\another directory. This means that it is now possible use the drive letter X, when specifying the path to the file (X:\my files\file.ext)

Now I've got the boring part you already know out of the way.

DON'T DO IT!

Why not?

Because using mapped drives causes problems down the line.

Need to set up another machine?
Lost your mapped drive settings?
Which drives do you need to map? and where?

Someone else wants to know where a file is? Telling them it's on Drive T doesn't help them unless they know where you have drive T mapped to. And why would you remember? You mapped the drive so you wouldn't have to.

Mapped drives provide no meaning.

//Server1/Departments/Support/Customers/Acc01234/history.crm - has meaning.
H:\history.crm - has little.

They are user specific.
Different users can map the same drive letter to different paths.
This can lead to all sorts of problems. Especially if there are files of the same name in the different mapped paths.

They add unnecessary and artificial constraints.

Using a mapped driver anywhere in the development or build process can cause problems.

Very rarely is the development of a piece of software done by a single person, on the same machine for the lifetime of that piece of software. If more than one person will be working on an application, ever. Requiring a mapped drive will just be one more thing to configure and this flies in the face of what every developer should aim for. Removing all unnecessary complications from the development process.

What do you do once you know this?

Ensure that the software you create software that can support file paths in either (any) format.

There should definitely be no excuse for ever creating software which can only connect to a file if using a mapped drive. You'd just be creating problems for other people.


What do you think?
Is this something every developer should know? Have you say in the comments.

Wednesday, October 03, 2007

How I blog and still do everything else I want to?

Time is precious and I often find that I have very little of it to do all the things I would like.

How do I still find time to write in my blog?

I make the time when I can and try not to worry about it when I don't or can't.

Yes, this means that I'll never have the most prolific blog with thousands of regular readers. For some people that would be hard to say. Some people want to blog to have fame and fortune and if that's what they want to then fine.
I never want to look back and say that I wanted to spend more time with my family or friends or to have been doing something else.

Spend time on what is important to you. You're likely to regret doing anything else.

Nod and Wink: http://www.problogger.net/archives/2007/10/04/24-hour-giveaway-blogging-tips-get-24-prizes/

Friday, September 21, 2007

speedlinking

rather than just taking on jobs you can put your heart into, you should find a way to put your heart into everything you do.”

Windows Mobile: Feature Prioritization

In these days where we’re shipping software every day, and just cause a site is out there doesn’t mean it’s anywhere close to done, it’s important to recognize that sites may be works in progress.

stand in front of them and explain this bright thing

Tips (etc.) on using flip charts

if you still want to dynamically create WSDL files (using the http://localhost/vDir/myService.asmx?WSDL) with your own minOccurs values

Ease of use can lead to new uses...

"How can we even think of saving chimpanzees if the humans around them are struggling to survive?" That was the question posed by Dr. Jane Goodall, who's devoted 47 years of her life studying chimps in the Gombe Stream National Park in Tanzania

Top Ten Signs Your Software Project is Doomed

The Mathemagician's Guide to Lightning Calculation and Amazing Math Tricks.

Note From Boss To Employees

I majored in super annoying grammar correction in college

PowerPoint (or Keynote) is a great tool to AMPLIFY what we are saying, but not serve as our scripts, or substitute for our own communication experience when we are speaking.

Try to avoid having BOOL function parameters

CSS Naked Day

scope creep

Precision in language

How To Make Your Own Domain An OpenID

10 tips for leading your team to peak performance

Jobs that don’t require a specialty are low level. To move up you need to be great at something, and you have to let people know what you don’t do. No one is great at everything. Even if your goal is not to get to the executive suite, you should specialize. When you want to take five months off to hike in Tibet, if you are easily replaced, you will be. If you have a skill that is hard to duplicate, your job will be there for you when you get back.

EDSK ... how long the software being developed will need to be supported

Every developer should know how long the software being developed will need to be supported.

First off, lets get the exceptions out of the way. If the software being developed is a small, one off application, which serves a single purpose and will only be used by a single person, there is a chance that it may never need supporting. In such a case it will normally be sufficient to just keep a copy of the source code and
any specification documents.

So what do I mean by 'software needing to be supported'?
Simple. It's everything after the software is finished and delivered to the user.

This includes:
- Helping installing the software.
- Answering questions about the software.
- Fixing bugs.
- Adding new features.

Why is this important?

Because time taken in support is time that can't be spent on other software or a new version of the software.

If you aren't accounting for supporting previously created software when planning subsequent work or determining how much to charge for the software, problems are likely to follow.

It is also likely to matter to the person buying the software. They will have expectations about how long support will be available for. As part of managing the relationship with the customer and their expectations it is important to be clear about this. And this is sometihng that can only be done if it has been thought through.


What do you do once you know this?

Make sure that you plan for support and are always have sufficient resources and knowledge to do so.


What do you think?
Is this something every developer should know? Have you say in the comments.

Thursday, August 30, 2007

EDSK ... how to touch type

Every developer should know how to touch type.


Digital image content © 1997-2007 Hemera Technologies Inc., a wholly owned subsidiary of Jupiter Images Corporation. All Rights Reserved
Touch typing is typing without looking at the keys.

It's much faster than typing and looking at the keys for two main reasons.
1. You will spot mistakes sooner as you immediately see them when they occur.
2. You don't lose time finding your place on the screen as you do when your focus is constantly changing back and for the between the screen and keyboard.

The good news is, you can probably already do it, you just need to trust yourself. If you currently use all of you fingers

This will take practice. Don't worry if you make lots of mistakes early on, you will get there in the end and it will be worth it. Your typing will be much much faster. Plus correcting your mistakes without looking at the keyboard provides an extra sense of achievement.

This is not about telling you that you should be specifically forcing yourself to learn to use specific fingers for specific keys, but about doing it without looking. If you don't use a specific system, you will soon learn which keys arm naturally easier for you to press with each finger.

Touch typing is about learning not to think about the unimportant and unnecessary, so you can focus on what is more important. Focus on what is on screen, not how to get it there.

There is an argument from developers that touch typing only helps when typing large amounts of text and not when typing structured code. This isn't true. While touch typing traditionally focuses on alphabetic characters and not the numerous operators, brackets and other characters that are needed when writing code it can make typing anything faster. If you can push the button without having to look at the keyboard each time, you can type faster, regardless of what you are typing.

There are also other ways of typing faster, or even faster, such as using a keyboard layout designed for this purpose, like the Dvorak keyboard layout. There are also other layouts which allow for faster typing.

If you're not confident to try this by yourself and want extra help there are a number of tools and training aids to help.

Search for what works best for you. Here are some of the more popular aids available from Amazon:

Aids for learning touch typing (Associate link)


What do you think?

Is this something every developer should know? Have you say in the comments.
Know a developer who should read this?

Tuesday, August 28, 2007

sing a song

If you was hit by a truck

and you were lying out
in that gutter dying...

and you had time to sing
one song, huh, one song...

people would remember
before you're dirt...

one song that would let

God know what you felt about
your time here on earth...

one song that would sum you up...
you telling me that's the song you'd sing?

That same Jimmie Davis tune
we hear on the radio all day?

About your peace within
and how it's real

and how you're
gonna shout it?

Or would you sing
something different?

Something real,
something you felt?

Because I'm telling you
right now...

that's the kind of song
people want to hear.

That's the kind of song
that truly saves people.

from Walk the Line

Thursday, August 02, 2007

EDSK ... about UI developer guidelines

Every developer should know about UI developer guidelines.

Developing software that is easy to use is not always a simple task. One way to help create software that is easier for users to learn and use, is to follow conventions in the use, style, layout and positioning of form components.

Here are some guides for a number of different environments and platforms:
Windows Vista User Experience Guidelines
Microsoft Inductive User Interface Guidelines
How to Create the Best User Experience for Your Application
Java Look and Feel Design Guidelines
Apple's User Experience Guide
GNOME Human Interface Guidelines
UI and User Experience Guidelines for Nokia mobile phones
Smartphone User Interface Guidelines

Sometimes there are benefits to creating something that looks different, but it is very easy to create something that looks ugly and is confusing for users.

Creating something that looks and behaves like applications that users have used before:
  • Creates comfort and familiarity for the user.
  • Means that things will work the way the user expects.
  • Means that the application will be quicker and easier for the user to learn.

Sunday, July 29, 2007

Laws of software development

(This was originally going to be on EDSK)


19 Eponymous Laws Of Software Development
My faves:
Parkinson’s Law - so does blogging
The Peter Principle - I'm still on the way up
Conway’s Law - I won't say which software/company I'm thinking of


laws, axioms and rules pertaining to mainstream software development
My faves:
Clarke’s Third Law - just like that
Flon’s Axiom - hence http://worsethanfailure.com/
Hoare’s Law of Large Programs - Why do those in support seem to not know this?
Jakob’s Law of the Internet User Experience - Amen

Friday, July 27, 2007

EDSK ... about Unicode and character encodings

Every developer should know about Unicode and character encodings.

This is a complicated subject but it's a very important one. It's also a subject that I expect to return to several times.

“If you are a programmer working in 200[7] and you don’t know the basics of characters, character sets, encodings, and Unicode, and I catch you, I’m going to punish you by making you peel onions for six months in a submarine.” Joel Spolsky

Joel is famous for his site http://www.joelonsoftware.com/. If you haven't read it I recommend you do.

Of particular relevance today is the article:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

If you haven't read this article before, read it now. If you have, read it again. A little refresher is rarely a bad thing.

But why do you need to know this?

Well, at some point you are going to have to know:
  • Why some fonts show characters differently.
  • Why characters with diacritics don't always display (correctly).
  • How you display text from languages which uses alphabets other than the English one (A to Z, no diacritics).
  • How you create characters with multiple diacritics.
  • What UTF-8 & UTF-16 really mean.
  • How you display text from languages which read from right to left.
  • How you display text from the Chinese, Japanese and Korean languages.
  • How you should display text that contains a words from varying languages.
This list could easily be a lot longer, and as you start to investigate the subject you'll soon see how.
The most important thing to take from this is that you will not be able to get through the rest of your career in software development assuming that the only letters you will ever need are A though Z. As the world gets smaller and international boundaries blur, especially on-line, there will be more and more need to know this.
This is a complex subject. Start learning about it now and you'll have a head start when have to implement related functionality.

Wednesday, July 18, 2007

Tuesday, July 17, 2007

already on wishlist


I'm surprised Amazon even let me try to add something that was already on my list. A bigger warning that I had done might have been nicer. I had to search for this, when the normal page wasn't displayed after adding an item.
This is bad. It didn't do what I expected and it didn't make it clear why.

Why all the posts about presentations

You may have noticed that I have posted a lot about presentations.
Two reasons.

1. I want to be good at presenting and so I'm linking up references to tools and tips that will help me.

2. Presenting well is about clear and effective communication of ideas and information. It is about making the information usable. I find a lot of the techniques and ideas about creating or making a good presentation also apply to making good software:
  • Clear presentation of data
  • Showing one thing at a time
  • Logical progression of ideas/information
  • Visualising data.
  • ...

Friday, July 13, 2007

2 quick notes on SQL Server Triggers

Because there is a lot of misleading and contradictory information on the web about this. I encourage you to test this for yourself. Don't believe it just because someone says so on the internet! - I learnt the hard way ;)

A trigger (insert, update or delete) will get called only once, even if more than one row is affected.

Update and delete triggers will be called, even if no rows are affected.

SQL Server sample databases

While it is wise to delete sample databases from a production environment, don't delete them from your development environment.

Why?

Because, one day you are going to be looking for a way to do something you have never done before, some strange type of query, perhaps. If you are lucky you will find an example (on-line, or maybe in a book). The chances are that the example will be against one of the sample databases. If you haven't got the sample database any more, the example is no good to you.

The space you gain by removing sample database is minimal. If you are running out of space on a development machine, you will likely have bigger issues than a few small sample databases.

Keep samples, you may need them one day.

Thursday, July 12, 2007

Introducing ... ME

Let me formally introduce myself.

Hi. My name is Matthew Robin Lacey (hence mrlacey), but you can call me Matt.

By day I am a software developer and by night a husband and father.

I live in Woking, England.

I have been a professional (as in paid) developer since 1999 and have had a varied career. I have worked in small companies (~15 people) and large multi-nationals (40,000+ people). I have also done some freelance work. I have worked in consultancies, corporate IT departments and at ISVs. I've worked on Windows and *NIX platforms. I've worked at all levels of support as well as in development. I've used more programming languages and tools than I can remember, but currently, I mostly work with Delphi and C#, but with a little PHP thrown in here and there.

I feel that covers a pretty broad spectrum and has allowed me to see a lot of good and bad within the industry.

The first program I ever wrote was a game on the programmable calculator I had for my A-Level maths course. I thought it (the game) was pretty good, considering the device had less than 1KB of programmable memory,

My main interests within software development are: web development; mobile development; and usability.

Outside of software development I have been known to play basketball and football. I also enjoy cooking and going to the cinema.

If I had more time to do things I want to do (i.e. fewer responsibilities and didn't have to work for a living) the things I'd spend my day doing would probably include (in no particular order):
  • I'd still probably use computers a lot.
  • I'd go to the cinema in the day.
  • I'd cook a lot more.
  • I'd pray and read my Bible a lot more.
  • I'd spend more time with my family.

Friday, July 06, 2007

Bloggers: consider the future

I've been reading a lot of blog posts that are several years old. One thing that has become increasingly frustrating is blog posts about an article or image on another site that no longer exist.

Please, if you are writing about an article on another site at least post a snippet (and obviously provide credit and a link to the article.) And if you are writing about an image on another site, at least include a thumbnail of the image so we have a chance of understanding the post if the other site should ever be down or remove the file.

Monday, July 02, 2007

Saturday, June 30, 2007

Ending a presentation with an 'any questions' slide

Ending a presentation with an 'any questions' slide

Pro:
  • Engages conversation with the audience

Cons:
  • Should have answered questions when making presentation - because know audience and presentation was geared to their needs
  • Should stop and take questions at any time - if don't do this people will forget questions or miss something else while writing the questions down so they don't forget.

Friday, June 29, 2007

Wanna be like Mike?

iPhone Day

Today is iPhone day. Well the day they become available in the US.
Enough has been said about the iPhone to fill an awful lot of somethings, but I'm going to use the opportunity to talk about Safari.
When Safari for Windows was announced there was lots of speculation about why Apple would do this.
While there is an argument for it being a way to show Windows users what Apple products are like and maybe convert some to Macs. I think that the [main] reason for releasing a version of Safari that runs on Windows is to increase application compatibility with websites and Safari. In turn this leads to a better UX for anyone using Safari: most Mac users and all iPhone users.

Just think of all the websites that don't display properly on in Safari or just flat out even refuse to try to work. With Safari for Windows presenting exactly the same output as the Mac version, developers no longer need a Mac to test their sites. Because OSX couldn't be vitalized, the cost of Safari compatibility udes to be the cost of a Mac. Now it's the cost of downloading a few Mb.

Tuesday, June 05, 2007

Some random quotes

"People need uninterrupted time to get things done. 37signals is spread out over four cities and eight time zones. From Provo, Utah to Copenhagen, Denmark, the five of us are eight hours apart. One positive side effect of this eight hour difference is alone time. There are only about 4-5 hours during the day that we’re all up and working together. At other times, the US team is sleeping while David, who’s in Denmark, is working. The rest of the time, we’re working while David is sleeping. This gives us about half of the day together and the other half alone. Guess which part of the day we get the most work done? The alone part. It’s not that surprising really. Many people prefer to work either early in the morning or late at night - times when they’re not being bothered. When you have a long stretch when you aren’t bothered, you can get in the zone. The zone is when you are most productive. It’s when you don’t have to mindshift between various tasks. It’s when you aren’t interrupted to answer a question or look up something or send an email or answer an im. The alone zone is where real progress is made. Getting in the zone takes time. And that’s why interruption is your enemy. It’s like rem sleep - you don’t just go to rem sleep, you go to sleep first and you make your way to rem. Any interruptions force you to start over. rem is where the real sleep magic happens. The alone time zone is where the real development magic happens!" - 37Signals 'Getting Real'

"We all know that knowledge workers work best by getting into 'flow', also known as being 'in the zone', where they are fully concentrated on their work and fully tuned out of their environment. They lose track of time and produce great stuff through absolute concentration...trouble is that it’s so easy to get knocked out of the zone. Noise, phone calls, going out for lunch, having to drive 5 minutes to Starbucks for coffee, and interruptions by coworkers - especially interruptions by coworkers - all knock you out of the zone. If you take a 1 minute interruption by a coworker asking you a question, and this knocks out your concentration enough that it takes you half an hour to get productive again, your overall productivity is in serious trouble." - Joel Spolsky 'Where do These People Get Their (Unoriginal) Ideas?'

"Don’t worry about design, if you listen to your code a good design will appear...Listen to the technical people. If they are complaining about the difficulty of making changes, then take such complaints seriously and give them time to fix things." - Martin Fowler 'Is Design Dead?'

"We usually think of debt in terms of money but it comes in other forms too. You can easily build up code and design debt. Hack together some bad code that’s functional but still a bit hairy and you’re building up debt. Throw together a design that’s good enough but not really good and you’ve done it again. It’s ok to do this from time to time. In fact, it’s often a needed technique [...]. But you still need to recognize it as debt and pay it off at some point by cleaning up the hairy code or redesigning that so-so page. The same way you should regularly put aside some of your income for taxes, regularly put aside some time to pay off your code and design debt. If you don’t, you’ll just be paying interest (fixing hacks) instead of paying down the principal (and moving forward)." - 37Signals 'Getting Real'

http://en.wikipedia.org/wiki/Archibald_Putt
"Technology is dominated by two types of people: those who understand what they do not manage, and those who manage what they do not understand."

Checking database permissions in SQL Server 2000

I recently had to write a script to confirm that correct database permissions had been set on a database. Here's how I did it. Hopefully the comments will make it clear what's going on.


--- This uses the syspermissions.actadd column.
--- This is an undocumented column and is not guaranteed to work in future versions of SQL Server.

SELECT 'ATTENTION:' AS Type, 'Any entries below have not been granted adequate permissions' AS Name

UNION

-- This query will return all user tables that xxxxxx has not granted SELECT, INSERT, UPDATE & DELETE permissions

SELECT 'TABLE', o.name
FROM sysobjects o
WHERE o.xtype = 'U'
AND o.name != 'dtproperties'
AND o.name NOT IN (
SELECT o.name
FROM syspermissions p, sysobjects o, sysusers u
WHERE p.id = o.id
AND u.uid = p.grantee
AND u.name = 'xxxxxx'
AND o.xtype = 'U' --User Table
AND p.actadd = 27 ) -- = 1 (SELECT) + 2 (UPDATE) + 8 (INSERT) + 16 (DELETE)

UNION

-- This query will return any view that xxxxxx has not been granted SELECT permission
-- If other permissions have also been granted they will be ignored

SELECT 'VIEW', o.name
FROM sysobjects o
WHERE o.xtype = 'V'
AND o.category = 0
AND o.name NOT IN (
SELECT o.name
FROM syspermissions p, sysobjects o, sysusers u
WHERE p.id = o.id
AND u.uid = p.grantee
AND u.name = 'xxxxxx'
AND o.xtype = 'V' --View
AND (p.actadd & 1) = 1 ) -- BITWISE check to confirm that the SELECT permission is set

UNION

-- This query will return any stored procedure that xxxxxx has not been granted EXEC permission

SELECT 'STORED PROCEDURE', o.name
FROM sysobjects o
WHERE o.xtype = 'P'
AND o.name NOT LIKE 'dt_%'
AND o.name NOT IN (
SELECT o.name
FROM sysobjects o, syspermissions p, sysusers u
WHERE o.id = p.id
AND p.grantee = u.uid
AND u.name = 'xxxxxx'
AND o.xtype = 'P' --Stored Procedure
AND p.actadd = 32 )-- 32 = EXEC

UNION

-- This query will return any functions that xxxxxx has not been granted EXEC permission

SELECT 'FUNCTION', o.name
FROM sysobjects o
WHERE (o.xtype = 'FN' OR xtype = 'IF')
AND o.name NOT IN (
SELECT o.name
FROM sysobjects o, syspermissions p, sysusers u
WHERE o.id = p.id
AND p.grantee = u.uid
AND u.name = 'xxxxxx'
AND (o.xtype = 'FN' OR xtype = 'IF') --Scalar Function or In-lined table-Function
AND p.actadd = 32 )-- 32 = EXEC
ORDER BY 1, 2

Software out of date


This could be better:
It could report version numbers/dates so it is clear what is wrong.
It could say what needs to be done to allow the program to run.
It could say where to go/who to contact to find out how to get the program to run.
Can the program be changed/updated? or is a completely new version needed?
Is 'DataBase' the same as 'Database'?

Misleading execution times


After restoring a database I was surprised that SQL Server was reporting that it only took 1 second. It definitely felt like longer to me.
It did take longer. Look at the bottom of the screen, it actually took 33 seconds. So why report that it only took 1? And what only took 1 second?
This message is bad because it is unclear and wrong!

How many new items


I like Google reader but there is a definite usability issue in the indication of how many items are in the 'All items' group. It could be 101 or 10000001 for all I can tell. The reason this is bad is that I get an exact figure up to 100 and then suddenly all I get is an approximation with no indication of how accurate the approximation is.
Quite frankly, I'm not interested in finding out how approximate the figure is. I may be there for quite a while.

Some thoughts on support

I recently made some notes on customer service/support. Thought I'd share them here too.



The Customer Service function is a public face for the company. Customers need to contact the company when they have a problem that is stopping them from doing their job. At this time the customer will get to see how the company values them. Does the company appreciate the customer’s problem and resolve it as quickly and simply as possible? After all, isn’t this all that the customer is interested in?


Customer Service is an expense. It costs money to perform and doesn’t generate any direct income.


When performed well Customer Service can make money for the company. It does this by helping ensure customer retention and upgrade. It also improves the reputation of the company and product to potential new customers through word of mouth.


The Customer Services department has the opportunity to gather valuable information about customers and their use of a system. This can be invaluable when planning development schedules, particularly with regard to prioritising ‘bug fixes’.


While there is a department given the title of ‘Customer Services’ the responsibilities of serving the customer fall on everyone in the company.

Customer Services are part of a company wide process that seeks (among other things) to achieve the following goals:

1. Customers shouldn't have to make calls to the CS department.

We should aim to avoid the perception that something will go wrong!

While perfect software (that never goes wrong) is not a practical reality, it should be the intention of the company to provide a product with no known issues and is able to work under all conditions. Dealing with support calls costs the company money and creates a bad user experience. It should therefore be avoided, where at all possible.


2. When customers do have to call the CS department, their experience should be positive and more than just satisfactory.

Delighted customers are loyal customers, who talk about how good experiences.

Using a back-tested paper portfolio and an actual case, the authors of a study published in the Journal of Marketing found that companies at the top 20% of the American Customer Satisfaction Index (ACSI) greatly outperformed the stock market, generating a 40% return.
From 1996-2003, the portfolio outperformed the Dow Jones Industrial Average by 93%, the S&P 500 by 201%, and NASDAQ by 335%.”
http://consumerist.com/consumer/personal-finance/how-to-beat-the-stock-market-buy-companies-with-high-customer-satisfaction-scores-261282.php



3. When a customer does have to make a call, it should be as productive as possible.

This is a business. We need to use our time effectively.

The customer should always be left with a positive impression and be satisfied that their issue will be dealt with as quickly as possible.

Because of the effort and cost involved in dealing with a problem, and because we want the customer’s problem resolved as quickly as possible we should aim to obtain all the information we need to resolve the issue, when the issue is first reported. While making multiple calls to the customer to request more information does show to the customer that an issue is being investigated, it can also show a level of disorganisation in not requesting all the information in the first place. It also adds to the total amount to time taken to resolve an issue.


4. Communications between customers and the Customer Service dept should be recorded for two purposes:
i. As part of managing the relationship with the customer.

If it’s a big customer the account manager may want to know about the problems.

If a sales person is going to contact a customer (to try and up-sell or talk about license renewals) they will benefit from knowing if they have had any problems and how they were dealt with.

“I am very sorry for all the problems you have had. We will take this into
account when we look at your license renewal.”

“You’ve seen how valuable
a support contract is and how quickly we were able to deal with the problem you
had.”


ii. To keep track of which areas of the program are having repeated problems/issues.

- Are lots of people having the same problem?
If so, do we need to improve the program/ documentation/ training in light of this?
- Are some customers having more problems than others?
If so, do we need to provide (re)training for them?
- If the first few customers to do something (i.e. upgrade) have a problem?
Do we need to warn other customers who are, shortly, likely to do the same thing?
- Are customers having problems due to a configuration issue that is different to our testing and development environments?
If so, do we need to create suitable test environments? (This might not be financially viable if it was just one customer.)
- If one customer has a problem but finds a work around, do we fix the cause of the problem?
If it’s just that one customer may be not. But if it is lots of customers we will want to fix the problem before other customers become aware of it and have to use the work around. (Remember, it’s not just a case of telling them. Either we tell everyone there is a problem that they may or may not have to deal with – possibly makes us look bad, depending on the circumstances. Or, we wait for them to discover the issue and contact us. While we may be able to provide an immediate solution, the customer has experienced the frustration/ inconvenience/ cost of experiencing the problem.)



Service Level Agreements and Multiple Levels of Support

Service Level Agreements (SLAs) can be formal or informal.

- Formal SLAs are part of a contractual agreement with the customer.

- Informal SLAs are estimated guidelines, either advised to the customer or only used internally.

If neither formal nor informal SLAs exist there is the potential for incidents to be considered unimportant and not be given the attention required.

“I don’t have to do this today, so it can wait for tomorrow.”


Multiple levels of support exist when incidents are handled by different people under different conditions and when a process of escalation exists.

If having service level agreements and/or multi-level support levels, they must be clearly defined so:

- Sales people know what to sell.
- Customers no what to expect.
- Customer Services team members know what the customer expects of them.
- Customer Services team members know what the company expects of them when they are talking with a customer and dealing with an incident.
- Customer Services team members know the conditions under which an incident can or should be escalated. And to whom.
- Developers who have issues escalated to them are aware of expectations and promises that have been set and made.



Incident handling and escalation

At a basic level all calls should be handled in the same way. This includes a taking the call in a professional and courteous manner, but also in gathering some standard information for every incident, regardless of what the incident is.

By ensuring that all calls are handled in the same way:
- The customer knows what to expect, regardless of who answers the phone.
- We know that enough information has been gathered for internal purposes.
- Sufficient information is available for anyone to whom the incident is escalated.

Plenty of customer service people would like to do the right thing. They'd like to fix the problem that's presented to them. But frustration hits when the policies and procedures and metrics they've been given to work with won't let
them.

For a service rep in this particular situation, "doing my job" means making the person go away, while "doing the right thing" means taking initiative and actually solving the problem.

Getting your team in alignment (having their job match their tools match their mission) is perhaps the first job … to do.”
http://sethgodin.typepad.com/seths_blog/2007/05/alignment.html

What information to gather

In addition to the basic information gathered for each call/incident, specific information may be needed for different types of issue or product.
- If an incident relates to installation we need to know X, Y & Z.
- If an incident relates to printing we need to know A & B.
- If an incident relates to … we need to know F, G & H.
- ….

While it is probable that an initial version of the question list could be developed now, it is likely that such a list of questions can only be fully developed over time.

A question list should not be set in stone and is likely to develop over time and in line with enhancements and developments to products.

A question work flow may be an appropriate way of managing which questions should be asked, based on the incident being reported.

In addition to the list of questions, details explaining why each specific question is asked should also be recorded. This aims to remove any doubts as to why the questions should be asked.


Documenting an incident

The most important part of handling a reported incident is to:

WRITE EVERYTHING DOWN!

Or, better still record the call and use a speech to text tool to handle the dictation. Or, even better still apply the text to speech processing to the call as it is happening, so any corrections can be made at the time.

It is important that nothing is assumed. When recording information it is important to record exactly what the problem is, which version of which product it is experienced in and all the steps needed to recreate it.

Specifics are very important.

Without specific details the chances of finding and resolving an incident are greatly reduced. This is due to the fact that most incidents only occur under very specific circumstances.

The only questions a developer handling an escalated support call should be “What is the reference/log number for the call/incident?”

They then need time to read the details documented so far (to get up to speed) before being expected to be able to respond to, discuss or investigate the issue.


Reasons to record everything that happens as part of an incident investigation:
- So not relying on memory to know what happened or has been tried so far. - Saving repetition of asking or attempting possible soultions.
- So the solution can be documented so it is available if needed again.
- So the solution can be used to patch code so it can't/doesn’t happen again.
- So that if another person needs to get involved in solving the problem they know all that has happened so far.


How rest of the company can help the support department/process:

· Provide documentation for all parts of the program.
· Share training/debugging tips and solutions.
· Document solutions and resolutions to problems.
· Any more ideas . . . ?

Friday, May 18, 2007

Change of posting style

I had become increasingly aware that a lot of my posts on this blog have just been link posts. In reaction to this I wanted to find a way to make it easier for me to make these posts.

To do this I've gone the Google Reader and del.icio.us route.

You'll see widgets for the two of these at the side now.

If something is really worth a comment, I'm likely to still make a real post about it, but most of my re posts will be via these routes now.

This may mean I post less in future, but hopefully it will mean that I can concentrate on writing posts of more value, rather than just links.

Friday, May 04, 2007

A semantic web? (not)

Is this really what Tim Berners-Lee meant when he coined the term 'semantic web'? He talked about machines learning by looking at data and seeing how it is related. Surely this is people teaching machines.
http://radar.oreilly.com/archives/2007/03/freebase_will_p_1.html
http://blogs.oreillynet.com/mt/mt-tb.cgi/1859
http://www.freebase.com/

Friday, March 30, 2007

Enso launcher

I've been trialing ENSO launcher by Humanized.

The idea that "All you have to remember is the name of the command that you want to use" is a nice idea but in practice that can be an awful lot of commands. In reality I've found that it can be good for a number of situations
but, unsurprisingly, it's not perfect for all situations. After all GUIs were designed, in part, so that users don't have to remember things.

It's a good product and a welcome addition to my desktop. A couple of things I'd like to see added though:

I'd like to to automatically be able to open any file added to the desktop. I keep a few key files there along with ones I'm working on at the moment. It's frustrating to have to set up shortcuts ('learn as open...') each of these when they change every few days. Maybe 'open desktop .......' ?

It would also be nice to be able to open any saved bookmark or favourite in IE or FireFox, in a single step without having to open the browser then select the favourite or teach enso the favourites I open most regularly. Maybe 'open favourite .......' ?

It would also be nice to be able to teach enso to be able to open shortcuts. I often save parameters in shortcuts so they open programs the way I like. Enso can't currently handle shortcuts. I've found a way round this by creating a .cmd file and having enso learn how to open that but it's an inelegant solution. I have to create the extra file plus an extra console window is opened.

How Google could be better

I can see three areas where Google could be better.

Blogger
  • In the new version all dates of posting in the RSS feed say 2007/01/01.
  • The 'remember me' feature doesn't work when logging in.

Google Groups
  • In order to maintain a consistent experience when accessing usenet groups via the web, it would be good to be able to have a signature when posting via the web as well as via a mail client.
  • The list of unread message in subscribed groups doesn't update properly.

Google Desktop - News gadget
  • It would be good if it was possible to block a news provider. For instance, I don't ever want to receive news from foreign language newspapers, which sometimes show up and there are some sports news providers I'd quite like to stop showing up.
  • The "Do not show me items like this" feature could be made better. Sometimes I indicate that I don't want to see an item, I later get the exact same articel from another agency or an update on the same story.

Maybe, one day these will be addressed.

Polite Notice:

Signs which start with 'Polite Notice' annoy me.

  • They contain redundancy - You should be able to tell from reading it.
  • They are insulting - That we wouldn't know otherwise.
  • They show laziness - That the person authoring the notice couldn't take the time to write it such that it wouldn't be understood as being impolite.

Friday, March 23, 2007

Jesus and Your Job

Watch the 'Jesus and Your Job' talk here
http://www.mppcfamily.org/app/w_page.php?id=49&type=section

there is nobility in serving other people
to serve is to add value
work is to create value

do work for a greater purpose.

workplace - a place to: be known and relate to people

Remember the dignity of people (as human beings)