Network

Follow kosalanuwan on Twitter
View Kosala Nuwan Perera's profile on LinkedIn

Kanban was my unicorn and now it is my bitch

I remember one of my colleagues asked me once how good I am in work-life balance. I didn't have a perfect answer for him at that time. The newest addition to our life is Kanban. We made Kanban task boards out of all the surfaces we found, such as the almirah, bookshelf, doors, fridge and it would have been great if we had French windows.

We first started a Kanban task board with my wife's studies. In the beginning, she was using the timetable concept for prioritizing and scheduling study topics. This was working fine till she married (still is) to a husband who is on the computer 24/7.

Prioritizing the backlog items

It was an easy task for us to prepare a Backlog. Some have been already prioritized and weighted with hours (according to her calculations) required on the timetable. We took a collection of sticky notes, each with the topic and the weight written on it. It took only few hours for us to compile all the stickies into a Backlog.

Timetable schedule, mind maps, text books

Some study topics have a pile of materials to go through. These are split into smaller topics. Some are very little but include practical. These are noted with smaller stickies on the study topics. Some topics include those already studied in her previous courses.

Our mission was to prioritize these tasks as Urgent, Important, and Optional (topics that can wait).

Kanban task board

The task board initially happened to be our almirah, but now it is part of our almirah and a door, with three (3) sections labeled “To Do”, “Studying”, and “Done”, and we put all selected stickies for the upcoming week in the “To Do” section. My wife then moves stickies from “To Do” to “Studying” to “Done”.

Kanban door with To Do, WIP, and Done

The Studying in Progress (same as Working In Progress - WIP) is always limited to one study topic since this Kanban Board is only for my wife's studies, where as my Grooming Kanban Board has a WIP of four (4), one item for each Category of tasks.

Grooming Kanban Board with WIP of Many

As she completed each study topic, she is required to come up with a Mind Map. Once the Mind Map is sketched, the topic could then can be moved from “Studying” to “Done”, and then she could proceed to another study topic in the “To Do” list.

Monitoring the progress

However, I found that her tasks were moving a bit slower during later in the day than in the morning. I suspect that when she wakes up in the morning, she can see the tasks and that motivates and gives her a fresh start but it wasn't in a place near to her study area and that decreases her productivity. So we moved that task board to our door which is visible even when she is in the kitchen.

Kanban door at the end of first week

My wife enjoyed using the Kanban system. She felt that it reduces her stress and increased the productive time more than the previous timetable practice she had. She also expressed that she wish to continue her studies with Kanban every week.

PM> Install-Package ClassicDalHelpers

NuGet! Didn’t like the name when I heard for the first time! Anyways, NuGet has taken away the .NET open source PAIN! Consequently, now .NET open source is as easy as “Add Reference”.

http://nuget.org/List/Packages/ClassicDalHelpers

You do not need to work hard to refer Classic DAL Helpers by downloading at Codeplex.com. You can now add Classic DAL Helpers directly to your Data Access Layer via Visual Studio 2010.

Library Package Manager

But first, we need to get NuGet Library Package Manager from Visual Studio Gallery.

Visual Studio 2010 Library Package Manager

Visual Studio 2010 > Tools > Library Package Manager > Add Library Package Reference…

Once this is added to Visual Studio, you will get Library Package Manager under Tools menu. Also notice that you will get an additional reference option when you right-click on a project in Solution Explorer.

Add Reference

Add Library Package Reference

Right-Click on Reference > Add Library Package Reference…

This prompts the similar Add Reference Dialog that can be used to search NuGet packages online. To add Classic DAL Helpers, just search for “DAL” under “Online” Packages and click “Install” button.

Seach for DAL using Online package source

That’s it! You have now added Classic DAL Helpers to your project.

Refer Classic Data Access Layer Helpers to implement data access layers in application architecture for usage on Classic DAL Helpers.

Source code and samples are available at Codeplex.com.

Build & Publish NuGet Packages

Building and hosting our own NuGet packages is quite easy with NuGet Package Explorer, available at Codeplex.com as ClickOnce application.

image

NuGet Package Explorer > New > Edit > Edit Package Metadata

In order to publish packages at NuGet Gallary, you need to get registered at NuGet.org (no Open Auth yet!). This will give you an Access Key which has to be provided when publishing packages.

image

Please don’t copy mine! Smile

 

More references:

NuGet > Videos:
There are few videos available at NuGet Videos. Mix11 NuGet in Depth covers almost everything you need to know about NuGet.

Your Own Feeds:
You can have private/corporate feeds as well. Hosting Your Own NuGet Feeds article covers step-by-step approaches.
Refer Setting up a Local NuGet Gallary post to have your own gallery.

Build Server Option:
Integrating building packages into a Build System is possible. Refer Creating and Publishing a Package using NuGet.exe post.

Programmer anarchy

Few days back I came across this great presentation on Leaner Programmer Anarchy by Fred George at InfoQ. I tried to find more references regarding this development process but ultimately ended up with this online video presentation.

Presentation slidePresentation slidePresentation slidePresentation slidePresentation slidePresentation slidePresentation slideimageimagePresentation slidePresentation slidePresentation slidePresentation slidePresentation slide

The principles what Fred George discuss in this presentation somewhat controversial and might not fit for everyone. Yet, there can be things that could use from Anarchy. Anyways, down the road we still use a little bit from chaos to waterfall to agile nerd.

Related links:

InfoQ > Leaner Programmer Anarchy presented by Fred George
Download flash video “Leaner Programmer Anarchy presented by Fred George”

Writing user stories: a practical approach

Let me be clear. Software projects are predictably unpredictable. You cannot solve all the problems in the project plan. It’s good if we can schedule good ideas but people don’t think like this way. People solve problems in unexpected ways. This is where good ideas come from. Many are called “Ahaa Thoughts”.

Explaining things are easy. Documenting it is the hardest part, not only that, many devs hate this part, in a software development process. We could only interpret around 50% of "Ahaa Thoughts" into "words".

Writing user stories is not a hard task. Once you master it you can say:

"Documentation in Development processes was my Unicorn, and now it is my bitch"

Or

"Writing user stories was my Unicorn, and now it is my bitch"

As a good citizen, a Business Analyst or a Product Owner could use a template/standard. I use something like this:

User Story

Name: Customer List
As a: User
I want: Interactive Customer List
So that: I can change the details of my customer
Size: XS, S, M, L, XL

This user story comes from my Product Backlog List. It is a White Note on my wall. Things I can do about this story are called Story Points, that explains further about the story. A story point is a Yellow Note on my White Note. I write it like this:

Acceptance Criteria/Story Points

Name: Delete an address
Given: The customer is in an editable state
When: The remove address button is pressed
Then: The address will be removed from the list
And: The change will persist after a refresh

Name: Add an address
When: The application is loaded
Then: A list containing customer addresses will be displayed
And: The name of each customer will be displayed with an image next to it

To reduce the number of documents that we have to maintain in a development process, I use these User Stories and Acceptance Criteria for Testing. A Bugs is reported under a White Note or a specific Yellow Note, if not, a separate Defects Backlog List (parallel to my Product Backlog List).

For more readings;

Beyond Functional Requirements On Agile Projects by Scott W. Ambler
Complex Requirements On an Agile Project by Scott W. Ambler
Introduction to User Stories by Ambysoft
User Interface Prototypes by Ambysoft

Classic Data Access Layer Helpers to implement data access layers in application architecture

In a simple application architecture with three layers there is always a layer that queries data from the database, extract, shape it to some CLR typed entities, push it to next layers that initiates it. Right now we get plenty of frameworks to get this job done. But those who are not fond of ADO.NET Datasets, nHibernate, LINQ-to-SQL, EF etc. will usually stick with the classic old school approach of handling CRUDs in data access layer.

You will see how I have used the Classic DAL Helpers (from CodePlex.com) to get this job done in a much cleaner and easier way. In this article, I will try to demonstrate following topics with samples;

  • Creating and handling stored commands.
  • Materializing relational data into CLR types.
  • Using template classes to reduce repetitive tasks.

The code samples are based on the Mini NorthWind project which have 3 main classes:

Sample class diagram

In a traditional approach, code to call a stored procedure in the database (with proper connection handling), extract relational data, create set of objects and identities could be very large even with rapid tools have been used such as Data adapters, EF, LINQ-to-SQL. Here is what I had to write:

public List<Category> GetAllCategories()
{
var connString = ConfigurationManager.ConnectionStrings["SampleModel"].ConnectionString;
using (var conn = new SqlConnection(connString))
{
using (var comm = conn.CreateCommand())
{
comm.CommandType = CommandType.StoredProcedure;
comm.CommandText = "dbo.GetAllCategories";

if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
try
{
using (var reader = comm.ExecuteReader())
{
var cats = new List<Category>();
while (reader.Read())
{
var idOrdinal = reader.GetOrdinal("cid");
var nameOrdinal = reader.GetOrdinal("name");

if (!reader.IsDBNull(idOrdinal))
{
var category = new Category
{
Id = reader.GetInt32(idOrdinal),
Name = reader.GetString(nameOrdinal)
};
cats.Add(category);
}
}
return cats;
}
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
}
}
}


Below sections demonstrates how you can start refactoring this code using Classic DAL Helpers. There are few important classes, helpers and extensions methods that you can use in this refactoring process.


Creating and handling stored commands



As a good citizen, you have to add library namespace to your classes in order to use the extension methods and helpers in Classic DAL Helpers library.

using Microsoft.Data.Extensions;


Now you can use SqlDatabaseHelper.HandleCommand method to manage connection lifetime and to create a stored command as below:

var cats = SqlDatabaseHelper.HandleCommand<List<Category>>(
"SampleModel",
"dbo.GetAllCategories",
new SqlDatabaseHelper.CommandHandler<List<Category>>(GetAllCategoriesCommand));


Once this is done, you can get rid of few steps relates to stored command such as initialization of the database connection, retrieving connection string in the application configuration file, and creating and managing lifetime of a stored command. The HandleCommand<T> method facilitates an IDbCommand with a live connection for you to handle your stored command execution and you do not need to validate and verify whether the connection is opened or not since the helper method takes care of that part for you.


In order to pass parameters to your stored procedure you will require to instantiate SqlParameter objects, assign relevant values to those, pack it to your command before the execution. Here is how we used to do:

comm.CommandType = CommandType.StoredProcedure;
comm.CommandText = "dbo.GetAllCategories";

var catParam = new SqlParameter { ParameterName = "cid", Value = categoryId, Direction = ParameterDirection.Input };
comm.Parameters.Add(catParam);

Instead of this, you can use the extension methods that provided by the Classic DAL Helpers library:

command.AddParameter<int>("cid", (int)args.First());

Materializing relational data into CLR types



I heard the term “Materialization” from the EF Team. It means; converting the relational data returned via stored command into actual objects, pretty much similar to an ORM process. Here is a sample code that we used in previous section to populate Category objects:

using (var reader = comm.ExecuteReader())
{
var cats = new List<Category>();
while (reader.Read())
{
var idOrdinal = reader.GetOrdinal("cid");
var nameOrdinal = reader.GetOrdinal("name");

if (!reader.IsDBNull(idOrdinal))
{
var category = new Category
{
Id = reader.GetInt32(idOrdinal),
Name = reader.GetString(nameOrdinal)
};
cats.Add(category);
}
}
return cats;
}


Instead, I can materialize relational data into Category objects like this:

return reader.Materialize<Category>(this.Materialize);


The materialize extension method requires a delegate that knows how to map data record into a single Category object. The generic extension method Field<T> in IDataRecord can return value relevant to the Ordinal or the Column name. This is how it would look like:

protected override Category Materialize(IDataRecord record)
{
var cat = new Category
{
Id = record.Field<int>("cid"),
Name = record.Field<string>("name")
};

return cat;
}


While the materialization is more convenient, it is much more efficient to use a single materialize method per CLR type. However, you can use the same materialize method to instantiate multiple CLR types if they all derive from a common super class.


You can use the same ProductDataAccess object to materialize both Product and DiscontinuedProduct objects as below:

protected override Product Materialize(IDataRecord record)
{
Product prod = record.Field<DateTime?>("discontinued_date").HasValue ?
new DiscontinuedProduct
{
Id = record.Field<int>("pid"),
Name = record.Field<string>("name"),
CategoryId = record.Field<int>("cid"),
DiscontinuedDate = record.Field<DateTime>("discontinued_date")
} :
new Product
{
Id = record.Field<int>("pid"),
Name = record.Field<string>("name"),
CategoryId = record.Field<int>("cid")
};

return prod;
}

The CLR type could be a Business Entity in the model, a View Model used to present data, a Data Transfer Object that used to transport data among tiers, or it could be a Data Contract in your WCF service.


Using template classes to reduce repetitive tasks



A traditional Data Access Component would contain all the CRUDs related to a single business entity, facilitating ORM functionality to that same entity. The Classic DAL Helpers library contains few template classes. DataAccessObject template is one of the main classes you can use to implement CRUD functionality. Now I can declare Category and Product Data Access Objects as below:

public sealed class CategoryDataAccess : DataAccessObject<Category>
public sealed class ProductDataAccess : DataAccessObject<Product>


In order to use CRUD functionality via template DataAccessObject, you must make sure your CLR types are derived from RootEntity template. Now I can change my class declaration as in below sample:



image


I have extent Product class further to a DiscontinuedProduct class. The class declarations for this diagram look like this:

public sealed class Category : RootEntity
public class Product : RootEntity
public sealed class DiscontinuedProduct : Product

The Classic DAL Helpers library source code is now available in CodePlex.com. You can download directly from the below link;


CodePlex.com, Classic Data Access Layer Helpers and Samples
http://classicdalhelpers.codeplex.com/

Rapid way to improve JavaScript’ing skills

Found some interesting tools and techniques that could improve our JavaScript’ing skills. Worth trying!

jslintJSLint is an online site that can do static analysis on your JavaScript code. You just have to Paste it on the site and Boom! You get the all the BS in the code. You can configure the level of analysis as well from the site. Why not try JSLint to improve the scripting as well.

blackbirdBlackbird can help you debug the JavaScript you have written with fun. It is difficult to debug the JavaScript code, watch the variable values etc. and one option is to use alert() snippets or break the script and debug if the IDE supports script debugging. But you may agree that it still sucks. You have to make sure you remove all the alert() snippets, break snippets in your script before you commit as a good citizen. Why not try Blackbird instead?

JSLint, The JavaScript code quality tool
http://www.jslint.com/

Blackbird, Open source JavaScript logging utility
http://www.gscottolson.com/blackbirdjs/

Why Software Estimations Sucks?

A long story short (a true story)
There is this Developer doing his thingy in his cubicle, one day, a Project Manager comes up to him and says; “Hey, you know that project we’ve been talkin’ about?”
Developer replies; “um.. yeah! I know.”
The PM continues; “You  know what… we would really really like to get it done in this August, coz’a this and this and this and that… can we do that?”
and the Developer thinks a lil bit… and says; “Yeah… I think its possible... I think we can do that... you know… there might be a lil bit’a work… but I think we can do that.”
The PM was so excited and runs off to a meeting… they makes decisions about spending thousands and millions of dollars and resources based on a freaking 15 seconds estimation that Developer did.

The consequences are pretty severe if you mess an estimate. Many developers get scolded for messing estimates. Many developers’ credibility was shocked coz they messed the estimates. Many developers were tribute losing their job to messing an estimate.

If you are a Developer, you might agree with me at least 100% in all three things. But if you are a Project Manager or a Delivery Manager you might think that this is a bit offensive, but please don't take this personally. This is just what I see from a Developer’s point of view. Well, its becoz, you often asking to;

Why Software Estimation Sucks

What does projects under schedule pressure do to Developers? In Drive, the author Daniel H. Pink says that, when you get the pressure involved or a reward involved, your mind goes into a kind of a transaction mode. And the problem solving part of the brain is kind of turned off. So your puzzle solving or the problem solving skills actually affected. This is the way our mind works.

Biggest paradigm shift

A convincible lifecycle of an estimate would be Size, Effort, Data, and Schedule. The biggest paradigm shift that people have in trying to get better in estimating, is to Learn to think in Size. What you need for Sizing is an Unit and a Measure.

Why Software Estimation Sucks2

People have enjoyed certain amount of success trying to solve this puzzle for quite a while using various kinds of matrix such as counting the Line of Code, Function Points, Pages of Requirements, Screens or Web Pages etc. but its been in the last few years I have actually seen a method that I think that might actually work and that’s Story Points.

Always keep in mind to re-estimate when there is more visibility on where are you are heading. Here are some simple steps to start loving Software Estimates :)

Software Estimations Sucks3

  1. Information required: Approved Business Requirements.
  2. Multiple people estimate separately, then meet to review and revise.
  3. Cone of uncertainty applied: (-50%, +100%).
  4. This is only an Estimate only.
  5. Re-estimate after Detailed Requirements Phase.

You can apply these steps on any software development method you like.

More readings;

Drive: The surprising Truth about What Motivates Us by Daniel Pink
  • Drive: The Surprising Truth About What Motivates Us by Daniel H. Pink
  • Software Estimation: Demystifying the Black Art by Steve McConnell
  • Agile Estimating and Planning by Mike Cohn

Enhance your blog with more plug-ins, hacks, tweaks

You can have facebook like/recommend links, sharing buttons, navigation bar-less and many more to your blog with minor tweaks.

image[9]

Blogger Plugins, Label Cloud Widget
http://www.bloggerplugins.org/2008/06/label-cloud-widget-for-blogger-blogspot.html

Blogger Plugins, Tutorials
http://www.bloggerplugins.org/search/label/Template%20Hacks?&max-results=5

Blogger Plugins, Facebook Like/Recommend button
http://www.bloggerplugins.org/2010/04/facebook-like-button-for-blogger.html

Blogger Plugins, Official Sharing buttons
http://www.bloggerplugins.org/2010/06/official-sharing-buttons-on-blogger.html

Blogger Plugins, Remove Blogger Navigation Bar completely
http://www.bloggerplugins.org/2010/04/remove-blogger-nav-bar-completely.html

Anyways, I tried the Facebook Like button, it only appears when you click on an article!

MVVM – Model View ViewModel

That’s kinda weird acronym. And if you want to be very famous, you can use very catchy phases like

“Im going to do MVVM in a SLOOB with SLUT”

And there are some confusions around MVVM. Let me clarify things first,

  • MVVM is nothing but a Pattern. Its in WPF or SL tho you dont use it. For instance, the controllers you use are built with mini MVVM.
  • Also known as Presentational Model.
  • The rest of this things are Helpers, Practices etc.

Lets see some variations of similar patterns;

MVC Pattern

MVC Pattern

Model View Controller is probably the oldest pattern. May be since 1980s. This is still use widely, especially with ASP.NET MVC.

Passive View Pattern

Passive View Pattern

This is a variation of MVC pattern. The advantage that we see here is that the View is completely Passive. The controller has lot of responsibilities. Since the View is not reacting to anything you don’t need to test it. For me, that's a relief, coz, testing a View is very difficult and time consuming.

Presentation Model Pattern

Presentation Model Pattern

Another variation of Passive View Pattern is the Presentation Model. Here the Controller is replaced by Presentation Model and we can call this as a ViewModel.

Here the View is more active and pushing information to the Model. OK, so before this, we saw the goodness about the View being completely Passive. So the trick here is that the interactions is done via Data Binding.

When you have a Framework with Data Binding, for instance, WPF and SL, you really dont need to worry about View being active. This is built in the framework so you dont have to test it, coz Microsoft did that for you.

MVVM Pattern

So, what have we learned so far? Yes, Model, View, ViewModel and Bindings. Its not that complicated and thats MVVM, everything else, is Helpers around MVVM.

Lets talk about a bit on the helpers. They are nothing but Commands, and Messages. Its got nothing to do with MVVM. You can straight away use without MVVM Pattern.

MVVM Pattern with Helpers

Sometimes View might need to notify the ViewModel about something happened in the View, for example; a control being clicked. Its a good job for Commands.

1 ways is that we can use very basic Command Pattern implemented with ICommand interface. What I see as annoying is that I have too much code here. I have to have separate classes for each Command and pass in the ViewModel.

What breaks you application is code. So another way is to minimize the code and to get rid of these annoying Classes is to use the RelayCommand (sometimes it is called Delegate Command Pattern) Component inside your ViewModel.

The other directions is also good for sometimes, when a ViewModel can notify to the View when something happen. 1 way is to use Events, another good way is to use Messages. This is good, coz most of the time we end up with multiple ViewModels.

MVVM Pattern with Helpers 2

To notify the View, we can simply use Events. But with WPF and SL, we can get the advantage of Messenger Component and we can simple get rid of all the Events and Delegates.

You can express all your MVVM Feelings with the use of MVVM Light Tools V3. This is an open source MVVM very light Framework with 2 DLLs. It contains essentials such as RelayCommand, Messenger, and ViewModelBase components. Some extras such as EventToCommand which can be used to get rid of annoying WPF and SL Command binding limitations, and DispatcherHelper for multi-threaded applications.

Cons in MVVM

You have to write lot of code in MVVM.

  • You have to implement INotifyPropertyChanged interface on your ViewModel. You cannot use Automatic Properties. You have to expand my properties.
  • You can only use Command with limited controls basically Clickable controls. You cannot use this with any event you want.

Some operations such as Setting Focus on a UI element from the ViewModel coz the ViewModel doesnt know the View. We can use the code behind for these kinda operations.

You cannot use this pattern in other platforms such as ASP.NET etc. coz its highly use Bindings. You might be able to use this pattern in ASP.NET MVC but it will be a different kinda implementation than what we have in mind.

There are lotsa toolkits and frameworks which sometimes confuses since there are no formal guidance. Not even from Microsoft YET!

Some Myths about MVVM

“No code in the code behind.”

“If you have code in your View’s code behind, MVVM Police is going to take your family away.”

There is something called “Code Behind For a Reason”. But what I see the problems is that it is not that easy to test your Views if there are code in your code behind.

“No need for Converters.”

Sometimes you might need to use Converters, but I would say it is LESS use in MVVM.

“MVVM is only suitable for BIG projects.”

It is suitable in lot of cases that we can gain advantages of Data Binding.

“MVVM Costs Performance.”

Well, I would say Developer Performance since it requires some skills to understand the Patter and you have to do some additional coding such as Commands etc. But I think the Data Bindings are very optimized. You mileage may vary.

“MVVM is complex. Makes my head hurt”

Well, its nothing but a Pattern. The rest of the stuff are helpers and if your head hurts, it probably becoz of Last Night :)

“I dont need separation coz I dont have a designer.”

I think separation is about maintainability, and testability other than blend-ability.

“You cannot use MVVM with other patterns.”

Well, Why Not. You can use in a User Control with MVVM, and use this User Control in any other places.

“MVVM will make you rich and attractive.”

 

Stolen from Laurent Bugnion’s presentation, Understanding the MVVM Pattern.

More Information can be found on;

Codeplex, MVVM Light Toolkit
http://mvvmlight.codeplex.com/

Galasoft, Understanding the MVVM Light Application Sample
http://www.galasoft.ch/mvvm/sample1/index.html

Galasoft, Creating a new MVVM Light Application in Visual Studio
http://www.galasoft.ch/mvvm/creating/

MSDN Blog, Dan Crevier’s Blog MVVM Series
http://blogs.msdn.com/dancre/archive/tags/DM-V-VM/default.aspx

User Experience Design for Non-Designers

MIX09 User Experience Design for Non-Designers Workflow

Concept Ideation is something that happens right from the starting of the project, quickly iterate and develop a lot of ideas, very quick and very cheap. How do we do that.. thru by Sketching. The power of sketching is that everyone can do it. Sketching is almost as fast as you.

MIX09 User Experience Design for Non-Designers Concept Ideation

Once we have an idea of where we want to go, we move in to Interaction Design. take in one or two concepts and flush them out end to end. There are few ways to do this;

  • Site map/user paths
    MIX09 User Experience Design for Non-Designers InteractionDesign SiteMap
  • Application wireframes
    MIX09 User Experience Design for Non-Designers InteractionDesign AppWireframe
  • Interaction wireframes
    MIX09 User Experience Design for Non-Designers InteractionDesign IntWireframe

Once we have our wireframes, and we have our concept we like, we are happy with it and our users are happy with it, now we getting to the Visual Design phase. We build composites to show how the actual application looks when its finally ready and deployed in an environment.

MIX09 User Experience Design for Non-Designers Composites

We can pick and chose key wireframes where the visual design really effects, how users may interact, and how the visual design affects the emotions/feelings that the application gives you.

And finally, we step into Production where we stop iterating, the developer starts coding, and we starts producing assets, such as GUI produces images, animations, icons, sounds and so on.

MIX09 User Experience Design for Non-Designers Production

When we are done developing, and users starts interacting the application, we get into Polish phase, where we start to see things that we didn’t see earlier. This is something like the second phase of development.

MIX09 User Experience Design for Non-Designers Polish

The conclusion is that there are 3 things to remember;

  • Start designing if you have not.
  • Design early.
  • Iterate often since very rare we get it at the 1st time.

MIX09 User Experience Design for Non-Designers Design Iteration

Stolen from Shawn Konopinsky’s presentation, MIX09-C30M - User Experience Design for Non-Designers.

If you are looking to fail…

if you want to fail at creating good software:

image

  1. Do not understand the end user
  2. Trust developers to make good design decisions
  3. Hope for a silver bullet design
  4. Build for everyone
  5. Launch and forget
  6. Do not define success
  7. Avoid all conflicts
  8. Believe you shouldn’t have to sell your ideas
  9. Plan for perfection
  10. Value process over the product

If you are looking to fail, do not understand the end user. Everybody wants to understand the end user but where we see failures is, how do you turn this Idea/Methodology into Action. Nearly 70% of all IT Projects fail due to a lack of user acceptance. So the New Golden Rule for Software Development is Hyper Focus on the End User. Every other rule that you discuss will be subservient, and every other failure ultimately comes back to ignoring this rule.

If you are looking to fail, trust developers to make good design decisions. Its not just developers, its anybody who is not connected with end users. Developers are focused on the deadlines, and not what the end client goal. Developers are encouraged to make really bad design decisions. So trust in your designers. Your users DO NOT CARE if the application was Silverlight, AJAX, Flash, .NET … Don’t let politics and silos get in the way of great software. Educate your design team on the technical challenges you face and they will work with you and not against you. A good designer will help you understand the end user translate their needs into something actionable and when in doubt, ask your users.

If you are looking to fail, hope for a silver bullet design. A good agency want come in with the big (genius) idea. Sometimes the big idea is important and some projects require out of the box thinking. And sometimes, small changes are big such as $300 Million Button.

image

So trust in your users. Add the word “EMPATHY” into your job description, and put it into action by talking to your users. Be willing to throw out ideas based on user feedback and be careful not take your user’s feedback to literally. Do not focus on your portfolio, if the user “notices” the UI, you’ve failed.

If you are looking to fail, build for everyone. If you build for everybody, you wind up building for nobody. Why you should not use the iPhone as an example for design is simply you mostly likely are not lucky enuf to have the budget and time for innovation that apple does. It is easier to think people like icons or faceless symbols. You will result in thousands of features that try to accommodate every need. So focus your efforts. Add the word “EMPATHY” into your job description, and put it into action by talking to your users and define a maximum of 3 personas for a project, and then hyper focus on them.

If you are looking to fail, you launch and forget, and you focus on next shining object. Most software, when releasing version 1, its only half way done, and there is a lot of learning to do. So measure for improvement. Account future releases up front. Integrate customer a feedback mechanism in the software. User testing during development AND post launch. Monitor your success metrics.

If you are looking to fail, do not define success. Defining success can be challenging. Its just that stakeholders don’t know that they shouldn’t define success, its that they don’t know how. To define success, we do not discuss features or requirements. So we discuss benefits for instance;

Qualitative
Customers has the perception of a fast transaction.
Customers would recommend the software to a friend.
Experience must be brand consistent and trustworthy.

Quantitative
Reduce the time it takes to track a shipment by 20%.
Increase the leads by 50%.
Decrease the customer service calls by half.

There is a conflict between you and your customers. So you need to find the right balance between Business Value vs End User Value.

If you are looking to fail, avoid all conflicts. Conflict is good, there is no progress without conflict and harder the conflict, the more glorious the triumph. Everybody agreeing with each other means that somebody is not voicing their opinion and if you are not hearing it, play Devil’s advocate.

If you are looking to fail, believe you shouldn’t have to sell your ideas. To sell your ideas, understand the personalities involved on the project, and answer their objections and concerns before they bring them to you. List to your customers and ensure that your opinions align with theirs – then speak using your customer’s words (“this is what we heard our customers tell us…”. Be humbly passionate about your ideas and then Oversell – craft a pitch that will set the bar.

If you are looking to fail, plan for perfection.

“The first Matrix I designed was quite naturally perfect, it was a work of art - flawless, sublime. A triumph equaled only by its monumental failure…” – The Matrix Reloaded.

image

We see that in lot of companies, they look for the perfect project plan or for the perfect estimate that understands everything perfect. No matter how well you set up the perfection, it never works out, and if you look at the cone of uncertainty, you will see why waterfall and fix bidding projects rarely work out.

If you are looking to fail, value process over the product. This can also title as if you are looking to fail, take no risk. So the process diagrams are dime and dozen. It means nothing if you deliver a crappy product on time. Wouldn’t it be great if we could schedule good ideas? But people don’t think like this, you cannot solve all the problems in the project plan. Attempting to apply a strict process will not save you from this undeniable truth “software projects are predictably unpredictable”. People solve problems in unexpected ways, this is where good ideas come from…

Stolen from Anthony Franco’s presentation, MIX09-C06F - Ten Ways to Ensure RIA Failure. You can find the references from here;

Wordpress.com, Anthony’s blog
http://anthonyfranco.wordpress.com/

Wordpress.com, The 8 Criteria for Usable Software
http://anthonyfranco.wordpress.com/2009/02/14/the-8-criteria-for-usable-software/

UX Strategy, Why Design Matters
http://ux-strategy.com/2008/06/25/why-design-matters/

Apple.com, Guides
http://developer.apple.com/mac/library/navigation/index.html#topic=Guides&section=Resource+Types