Wednesday, January 13

The Design Of Everyday Things Book Review

A few years ago I put together My Software Development Must Read Book List

One thing that was noticeable was that most of the books were not strictly about software development. That is because although technical proficiency is necessary to  software development it is not sufficient. There are many other skills necessary to software development that if done poorly can greatly reduce the chances of a successful outcome to your software project and by successful I mean producing a product or service that is valuable to the stakeholders. 

One of those areas of concern is a cluster of overlapping disciplines variously called User Experience, Interaction Design, Usability or Human–Computer Interaction. Which brings me to number 2 on my  book list

The Design of Everyday Things
The Design Of Everyday Things by Don Norman

This book blew my mind when I first read it. Don Norman highlights the importance of good design by showing how frustrating and counterproductive bad design can be. And how in contrast good design enhances our experience.

He tells an anecdote of sitting outside a bank watching as customer after customer struggled with doors that had been designed to be pretty rather than usable.  He shows how the users internal mental model of a product determines the expected behavior of the product. If that expected behavior differs from the products real behavior, it can cause usability issues.

He also gives many examples of affordance showing how a well designed door handle will make it obvious which direction the door needs to be pushed or pulled to be opened While a badly designed door may leave the user confused about which side the hinge is on and which side should be pushed.

He also shows examples of the Japanese concept of Poka-yoke or mistake proofing (a concept that predates the book by 40 years) describing cables that can only be inserted the right way or toys that can only be assembled the correct way.

Although the book discusses physical products, the principles apply equally to software whether it is the form of a traditional desktop application, website or mobile app. Given how frustrating many applications, apps and websites can be, a greater focus on design can only be welcome. This book changed how I approached software. While it was my first design book it was not my last. Other design books I would recommend would be -

The Visual Display of Quantitative Information   by Edward R. Tufte

This was another book that just blew me away when I first read it. Tufte's examples of charts and maps are just amazing. His advice about de-emphasizing what he termed administrivia and emphasizing the data was eye opening. As was his discussion of the differences between lines and boundaries.

This book had and still has an enormous influence on how I design software.

Don't Make Me Think, Revisited: A Common Sense Approach to Web Usability (3rd Edition) by Steve Krug 

The title says it all. Making the case for being clear, simple and obvious rather than being cute and clever.

The book mentions affordance and mental models and many other concepts that are also in The Design Of Everyday Things, but it is a far easier read and the examples are related to websites rather than physical products. The book is a demonstration of the principles it advocates, being an example of  clear, easily understandable communication

Universal Principles of Design, Revised and Updated: 125 Ways to Enhance Usability, Influence Perception, Increase Appeal, Make Better Design Decisions, and Teach through Design by William Lidwell, Jill Butler, Kritina Holden

One page of text and one page of illustrations for each of these principles, concepts and tips. This is a collection of bite sized nibbles rather a hard to digest meal. It gives you a lot to think about and reenforces many of the same concepts as the other books in this list.

The Back of the Napkin: Solving Problems and Selling Ideas with Pictures by Dan Roam

Gives a framework for using visual thinking and freehand sketching for ideation and communication. There are lots of tips and tricks on visually presenting information, on sketching, visually modelling and organising information to provide clarity.

Other UX Books are listed here.

Sunday, December 20

Restarted Melbourne Edition of Startup Digest

After a bit of a hiatus I have restarted the Melbourne Edition of Startup Digest, a weekly newsletter showing events in Melbourne that are of interest to entrepreneurs, creatives, technical professionals and business professionals.

It tends to be orientated towards the software industry. Despite things powering down for the holidays there is still quite a few events going on.

If you subscribe there is also a calendar of upcoming events (need to sign in).

Update: The following is an excerpt from the beginning  of the newsletter I put out on the 3rd of August 2017.


Silicon Beach

August 3rd 5:30pm
Drinks & Pitch Night
Royal Melbourne Hotel 629 Bourke Street, CBD | View in Calendar

Software Testing (Free)

August 3rd 6:00pm
Talk: Exploring SET - Arun Sivasubramaniyan 449 Punt Rd, Richmond | View in Calendar

Talk Data To Me (Free)

August 3rd 6:00pm
Discusses data and the infinite possibilities for the travel, transportation and tourism industry.
General Assembly 45 Williams Street CBD | View in Calendar

Wednesday, October 14

Everything is High Priority and Distributed Agile

Went to the Agile Product Owners and Business Analysts Meetup Group last night.

The facilitator cancelled at the last minute. Since I was the only Co-Organiser at the meeting I stepped up and ran the session.

I wheeled out the whiteboard and we brainstormed topics that the attendees wanted to talk about. Then we dot voted on the captured topics and two of them received most of the votes.
  1. Everything is High Priority 
  2. Distributed Agile

Everything is High Priority 

It seems to be a universal experience. Almost everyone has come across bosses, stakeholders or customers who refuse to prioritise.

Most of the solutions generated by the attendees involved avoiding the concept of priorities altogether.

  • Using Ranking (Not allowing items to have the same priority. Just using a ordered list.)
  • Using Defaults (Telling them your best guess priority and telling them that unless you hear back from them you are going with that)
  • Using Business Value.
  • Using Business Value divided by Estimated Time of development.
  • Using Risk (what are the elements that have the most unknowns)
  • Controlling the size of the backlog / ranked list.

Distributed Agile

A large percentage of attendee had experience with distributed teams.

The issue that seemed to cause the most trouble was Time Zone and either non-overlapping business hours or where the overlap was small.

Their was also agreement that some sort of digital Kanban Board or some other form of item tracking was vital.

Some face to face contact was also considered vital.

Sharing the pain of off-hour meetings and not letting one sub-team feel like second class team members was also mentioned.

Making sure that all sub-teams had a clear understanding of the process and a clear understanding of the reasons behind the process could be an issue. Credibility of the company could be an issue as there was a danger of Agile been seen as a business fad if it was enforced top down.


Tuesday, October 13

Zen, Improv Theatre and Responding to Change

Steve Mitchell conducted a very interesting and useful session at Agile Coaching Circles last night.

I experienced Steve's workshops before at LAST Conference 2013. Along with the session on visual communication his was the most the memorable workshop at that conference. I have certainly obtained a lot of milage out of those workshops over the years. I have used them on software teams to increase mindfulness and creativity, at my toastmasters club as an ice breaker and on my children as a fun bonding activity.

Steve's workshops are an interesting blending of Improv Theatre, Mindfulness Training, Divergent Thinking Training and Buddhist Philosophy. With one exception the exercises  Steve taught were different from the ones I learnt before.

He started off with a spatial awareness meditation to help get us in the mood and shake off the cares of the day. 

When I have used Steve's exercises on client's before I haven't incorporated his Eastern Philosophy, however after the session last night I am starting to think that was a missed opportunity. The Buddhist religion has surprising synergy with Change Management as its core principle is the need to be open to change, that all suffering is caused by resistance to change, by attachment to the Status Quo and our own Imagined Future. I probably won't mention to my clients that elements of what I am teaching come from Buddhist Philosophy. Steve certainly didn't mention Buddhism during the session, I was only aware of the origin of some of the ideas from other sources. Mindfulness, of course, comes directly from Buddhism, even though listening to Western Psychologist and Business Gurus, you would think they invented it.

It was a refreshing change to attend a workshop that was so active. This active participation  is one of the reasons I find Steve's exercises so valuable. Instead of passivity receiving the wisdom of the presenter the attendee are constantly engaged participants in their own learning.  Even small workgroup sessions are not this active.

Instead of teaching us how to convince others how to except change, Steve taught us to be more open to change, by both, teaching us by example, and teaching us that change begins with us.

Monday, October 12

Common Complaints heard at the Scrum User Group Meeting

I attended September's Scrum User Group meeting where we split into 6 workgroups of about 6 and discussed what issues outside our traditionally immediate sphere of control where causing us problems. Areas that might not get addressed in a normal retrospective as being outside scope. Although I must say that my teams have discussed most of the topics brought up in the Scrum UG in retrospectives at one time or another.

The first thing I noticed was how similar the problems brought up by my fellow workgroup members were. The first half of the session was devoted to identifying problems, after which workgroups created cards outlining the problems which were then displayed.

We all examined each other's cards. We were supposed to pick a card, then form another set of workgroups to brainstorm a solutions. All the card listed very similar problems. In fact I couldn't tell which one been written by my original group.  I picked one at random and a second workgroup formed to tackle brainstorming solutions.

The number one pain point was

Constantly Changing Requirements

Most people wanted to freeze requirements and / or reduce / funnel / manage communications.

Interestingly the Aconex Project Manager was very much against freezing the backlog during a sprint.

My approach to the problem is the opposite.  I will increase communication often with a larger pool of stakeholders. I will make the conversation more concrete with design mock ups, paper prototypes, mocked up screens with fake data, and more traditional partially functional prototypes.

Changing Direction and Losing Focus

There is a tension between maintaining a targeted focus and being adaptable enough to respond to an evolving understanding of the requirements. However I would rather lose a little of the sunk costs than end up with something that is not going to be used.

If it is clear that the stakeholders are not able to provide a clear consistent vision for the product or service that the team is building I am not afraid of going back to the discovery phase.

The natural tendency is to start coding too soon.  At the initial inception and discovery phases I prefer to use whiteboard, flip charts and pen and paper. Even when Teams resist early coding, they often go to Illustrator and Photoshop too soon. It is better to use hand drawn designs to build the initial consensus.

Scrum usually recommends not interfering with the sprint backlog within the sprint, but in practice work items are constantly being re-evaluated and re-interpreted as the sprint progresses. Just because you have the same card on the board as it travels from the waiting end of the board to the done end of the board, doesn't mean that it symbolises exactly the same task at the end of the sprint as it did at the start.


One solution that is often proposed is placing a gatekeeper between the development team and the stakeholders. Statistics and studies are often cited that show the high cost of context switching and the frequency of interruptions in the modern workplace. However the gatekeeper usually becomes a bottleneck. Communication suffer and are distorted as gatekeeper re-interprets and re-phases the information according to her understanding and experience which is often different from both the development team's and the stakeholder's. Most teams suffer problems because of lack of communication and a gatekeeper's job is to reduce communication.

My solution would be to setup cadences of set times to to co-ordinate or ask for assistance and have the team come up with their own protocols on how and when to interrupt.  Often it is we, that interrupt ourselves. So turning off toast and only checking email and messages at set intervals can help.

Often the cost of changes and interruptions fall unevenly on the team overloading your knowledge keepers, your specialists. Shifting your highest performers to coaching and training the other members of the team will mean loss of inefficiency, productivity and poorer quality in the short to medium term. Yet failing to do so, can lead to them being overloaded, becoming bottlenecks, and risking knowledge loss when they leave.

Other Issues that were discussed where
Unsurprisingly the Convenor / Moderator / Event Organiser Craig Brown picked up on the similarities in topics workgroups focused on, as well. There was a discussion at the end were the themes of the night were elaborated and possible solutions shared.

Monday, October 5

Pencil and Paper Battleships

School holidays and I wanted to spend time with my daughters. I remember how I used to play Pencil and Paper Battleships with my brothers. I do a search and none of what I find is anything like what I used to play with my brothers. So I made up some sheets from memory and they were a big hit with my daughters.

Maybe a kind reader could tell me where we got these rules from. I am not sure whether we made them up or got them from somewhere else.

Burns Family Rules for Battleship

Place the following battle units on the “Your Ships” grid. The units can be rotated or flipped to face any direction. However they cannot be placed running in a diagonal direction. Units cannot be placed next to each other. There must be at least a one square gap orthogonally and diagonally between each unit.

The following ships must be placed in ocean squares on the grid.

The following air units must be placed on any squares on the grid.
The following ground units must be placed on land squares on the grid.

Now that all units have been placed on the grid. Each player takes turns guessing the location of their opponents “Ships”. They fire off a “shot” by calling out the ‘Letter’ and ‘Number’ of a location on the grid. Their opponent calls out ‘Miss’ if they have nothing at that location and ‘Hit’ if they do have something there. If all squares of a ‘Ship’ have been hit then the opponent announces the type of “Ship” sunk and the fact that it has been destroyed. The tally box of the ‘Ship’ (to the right of the grid) should be crossed out when a “Ship” is destroyed. The first player to destroy all their opponents ‘Ships’ wins.
Three times in a game a player can use a mega-bomb. Mega-bombs hit everything at the called location and all 8 adjacent squares. The opponent calls out any hits from the bomb and their location plus the names of any ‘Ships’ destroyed. Cross out an ‘M’ tally box each time you use a bomb.

Game Sheets 

Thursday, October 1

Source Code on Github for Simple Card Game written in Swift

I knocked up a simple game in swift using SpriteKit as part of a job interview. Its based on a game my family plays all the time using real physical cards. I put it in the app store under the name Rickety Kate and uploaded the source to Github. You might find it takes 8 to 16 days for the code in the repository to find its way to the app in the App Store, one and half review cycles on average.

I probably over engineered this one. You can build your own deck of cards, anything from a 40 card deck with 4 suites to a 168 card deck with 10 suites. I knocked up some very simple input controls to control the options.

Putting 1x and 2x images  in texture atlases was a little finicky. I did a little experimentation and the 2 versions of the images seem to need to be in the same atlas for the 2x images to be automatically used in a retina device. Also here were problems unless all images in a atlas had the same number of versions e.g. they all needed to have 2x versions or none should have them. I have not tried using 3x images yet.

I am going put out a series of very simple games and apps. I put out another card game called Sevens. Next one after that is going to be a tilt game with retro neon line graphics. Set in the wreckage of a large city post alien invasion, you pilot spacecraft picking up refugees, and ferrying soldiers, diplomats, wounded, equipment and supplies while avoiding Lurkers, Tripods and Space Jellyfish.

Update: Rickety Kate 1.1.4 Just passed review (22/01/2016) and  v1.0.2 just passed review (09/01/2016)

Rickety Kate is now localised for English, French, German, Portuguese and Spanish.

Wednesday, September 30

Is it worth while transitioning from Objective C to Swift?

I 'm late to this bandwagon. However I had a heavy investment in an Objective C code base and a lot of distractions. Enough with the excuses, better late than never.

I know others have held off for many of the same reasons I did. So the question is useful. Was transitioning to swift worth it? The answer is a definite yes.

The Pros

No pointers and no nil-able values or objects unless they are wrapped in an option. This cuts down on a large class of errors.

Named parameters. This language is targeted for Objective C programmers so of course it has name parameters, however I still count it as a plus because named parameters increase readability and are a good idea, even C# has named parameters theses days.

No lisp-like nested square brackets everywhere (yes I know lisp uses round brackets, however I am talking about the nesting behaviour)

Immutable values using the let keyword. This reminds me of Scala's val and var keywords and of F#'s let keyword, although F# makes it harder to make values and objects mutable. Immutable values can make an application easier to reason about and make it easier to do concurrent programming (less need for locking)

No more header files.

Memory management that doesn't feel like a tacked on after thought .

Only one form of closure instead of the two different flavours in Objective C (selectors and blocks)

The 'if let' statements ability to chain together multiple let statements capped with a where cause reduces nesting and as nesting plays havoc with readability this is all to the good. There is a 'if var' version but I never see it used.

Swift has its own REPL which in Swift's case is called a playground. REPLs are common in many interpreted languages, they are ideal for learning and experimentation. REPL is pronounced 'reppel' and stands for Read Evaluate Print Loop and at its heart in a very simple, effective and old piece of technology.

No more need to box and unbox value types just to use collections. I remember when C# had this problem (versions 1.0 and 1.1 fixed in 2.0), but at least C# 1.1 had the __box and __unbox keywords,  in Objective-C you have to wrap and unwrap value types by hand.

Swift has generics, type safety and even type inference. Plugging that hole (lack of generics) in the type system pays off massive benefits in reduction of errors and increased ease of use. There is no way to have general purposes containers like lists and dictionaries without either having a generic type system, using dynamic types or breaking the type system by casting away type.

Less use of special characters in syntax, no more semi-colons at the end of your lines and a more modern cleaner looking syntax.

Initial Annoyances / Gotchas

You will need to lose the habit of surrounding if conditions with brackets as this can break things. This is initially is frustrating, but when you get used to it, it actually looks cleaner.

Significant white space between operators and operands or lack there of will turn binary operators into prefix unary operators.

Xcode habit of warning you that you have not used a declared variable or constant straight after you have declared it and before you have had the chance to type the line that will use it, can initially be distracting.

The Cons

I am used to uninformative and obscure error messages, but Xcode has reached a new low in this lost art of sowing confusion. After a while you get an idea about what it could be complaining about, but even when you know what is causing the problem, drawing a meaningful relationship between the error message and the cause of the problem can be bewildering.

The navigation and intellisense  tends to break when you need them most.

No refactoring support for swift yet compared to Xcode refactoring support for its other supported languages, not that Xcode Objective-C refactoring support is terribly good, but at least its there.

Lost Opportunities

There is a lot I could say about this, but Objective-C does worse in features I want to complain about so I will just point you to a post that Rob Napier wrote about how swift is not functional and save the rant I was going to write here for another blog post.

The Experience

The first one or two weeks was frustrating. Most of the frustration was centred around the compiler. However the learning curve was surprisingly easy. After two weeks I felt more comfortable with Swift than Objective-C even though I have been using Objective-C for years. Their is very little in Swift that isn't a standard expected feature in a modern programming language. Even the syntax and the keywords are pretty stock standard. Given the blandness of Swift the main reason for its existence is obviously to have built-in compatibility with the existing libraries and APIs and to make migration from Objective-C and interoperability with Objective-C easy. In achieving these goals Swift is successful.


I am not going to rewrite all my Objective-C code base in Swift. However all new work is going to be in Swift and even major modifications to old projects will probably be in Swift as you can mix the two languages in the same project.