Devise

Project planning, software design, and group dynamics.

Requirements
The first step in any project is to define the functional and non-functional requirements. Lack of proper definition will lead to a product that is developed to meet the standards and needs of the software development team. Since they are most often not the target audience, the product will not meet the needs of the clients.

The formal means of achieving this is through the use of Use Case Analysis. This technique allows both technical and non-technical professional to communicate their requirements. Should the client be unreceptive to the use of UML, the behavior must be defined in a informal manner. This can be achieved through a series of personal meetings.

Before designing the system, you must know the core requirements. You must be able to explain to the client what they have in mind. If you can achieve this, you can safely begin the development. If not, you must be vigilant in your continued information gathering.

This analysis also plays a pivotal role in future evolutions of your product. If you are able to envision the maximum amount a uses prior to design, you can create a system that has is able to adapt to future needs with the least amount of headache. Imagine the following; you are designing a means of communication between two applications. You originally envisioned the system to work locally, so you achieved IPC using a named pipe. You've successfully produced your new com system, and are showing off your months of work. To your horror, you are informed that the functional requirements have changed. It has to work both locally and remotely, as well as a yet un-drafted proprietary communications format.

Flashback to the original design date. Instead of hard-coding the pipe IPC system, you instead create a lower level layer of abstraction to represent the communications channel (my personal hero is the c#/java interface). When you are presented with a change in spec, you only have to create a new implementation of your com channel. You have achieved an appropriate level of decoupling. You can now add new communications channel with ease and without the infinite level of regressions that come with modifying a tightly coupled system.


Comprehension

Every developer must fully comprehend their assigned tasks. Failure to achieve this prerequisite knowledge will lead to an implementation lacking functionality. On one extreme, the work will fail to meet specification and will be reassigned. On the other extreme, a fundamental flaw will be introduced into the system that will go unnoticed by all except the end user.

The primary means of conveying knowledge to the developers is through formal task definitions. They must inform the developers of both task requirements and project details. A hard copy of the task/requirements (may it be through email, project timeline, etc) should be created so the developers know where they stand. Should they require any clarification, this document will provide a basis for the discussion.

The more they understand, the better they are at providing meaningful insight.

Lucid UI
The goal of any interface designer is to create an environment targeting the lowest common denominator. In a perfect world, an interface will be comprehensible to all. Failing this, it must avoid a steep learning curve. People's attention spans are shrinking with every generation, and the interfaces must meet their changing needs.

If the software you are designing is too complex to achieve a comprehensible GUI, two techniques should be utilized. The first technique is to keep the visual surface clean and uncluttered. There is nothing worse than a screen with information overload. Webpage's that do not adhere to this rule will soon find themselves without readers.

The second technique is to have a comprehensive help system. It should be tailored to your target audience. While a purely text based search popup can work in an IDE, graphical representations must be used for applications targeting the general populous. The best way to achieve this is to embed it into the primary window. Having it in view at all times allows the users to get assistance without loosing their focus.