We help you produce usable and solid software

Usable? Why?

Products that are not usable are unlikely to be successful: people struggle using them, forget how they did something, spend a lot of time performing tasks, they make errors, they leave frustrated.

Usability is a key requirement for modern complex user interfaces. If the software you are building is important to you, then focussing on usability of its user interface is a strategic move.

Solid software? Is there anything like that?

Solid software can be easily and quickly changed to suit new requirements; no domino effects, no technical debt being accumulated when refactoring an architecture, little time spent doing refactoring.

Solid software becomes one of your assets.

See the post on Usable and Solid Software.

Areas we specialize inTwo pillars: development of user interfaces and software engineering


Conceptual and interaction design
With a user interface, the user manipulates data. Conceptual design is the process of finding out which data and which operations make sense to users .

But understanding the data and operations that a user interface supports is not enough: its behaviour needs to be defined. How tasks are structured and what data are to be operated upon at which stage of the interaction are two crucial decisions.

Usability Evaluation
Usability is invisible: it is far easier to spot non-usability in a user interface; and while good design principles increase usability, very seldom a design is free from defects.

Therefore, appropriate investigation methods need to be applied to find out usability mishaps and fix them. The best method depends on the kind of user interface and the development circumstances. Methods include: informal user testing, heuristic evaluations, eye tracking usability testing and A/B testing.

user centered design
This is an iterative approach to design and implementation of user interfaces. From analysis to deployment, the focus is on understanding characteristics, needs and wants of end-users, coupled with repeating the synthesis of prototypes followed by a rigorous evaluation of usability.

By applying techniques such as structured interviews, task analysis, contextual design, card sorting, sketching, personas, and scenarios, several types of prototypes are developed and evaluated to understand if the project is in the right track. The outcomes are validated design choices for user interfaces and requirements.


Requirements Engineering
This process aims at discovering who the stakeholders are, what they need and what they want. It starts at the beginning of the project, continues during development until decomission of the system, and is based on techniques and artifacts such as interviews, brainstorming, focus groups, contextual design, domain analysis, use cases, user stories.
feature driven development
This is an agile approach to project management that balances analysis and design, focussing on system features. The process is divided into iterative sprints, each having a particular purpose and organized to produce a particular artifact that adds value to the project.

Compared to other approaches, FDD can easily scale with the complexity of the project and size of the team.

Model-driven development
The implementation of a user interface often accounts for a large portion of the overall development.
In some cases it makes sense to adopt model-driven engineering approaches where UML models (classes and state machines) are used to represent specific aspects of a user interface and tools produce the source code of the user interface or of test cases.

In IDS we develop tools that take these models as input and produce the source code of the user interface, or the source code of functional test cases. The benefits are evident: reuse of the models for different platforms, quick redesign of the user interface, fast generation of the source code of the user interface or of test cases, coverage analysis of test cases, and in specific situations even automated analysis of usability.


Domain driven design
This is the process of understanding what the domain concepts and operations are (part of the problem space) so that software can be built on a solid foundation, independent from the technology being deployed and from the user interface (parts of the more volatile solution space).

The benefit is that when requirements change, the problem space is seldom affected; hence little refactoring is needed.

Design for testability
Untested software contains bugs, leading to risks that likely undermines the relationship with your customer; hence testing is mandatory. However, for complex systems (expecially legacy ones), the architecture has to be organized into layers to allow independent testing of single components.

The benefit is a system that can be thoroughly tested.

Testability metrics and tools for computing them provide a dashboard that shows how well the system architecture is defined with respect to testability. In this way, upper management can decide how to allocate resources so to reduce the technical debt embodied in the system.

Test automation
Devising an effective testing process is a complex endeavour, highly dependent on specific circumstances (project, team, development infrastructure, boundary conditions). The stakes are high, as it affects both the quality of the system and the effort spent in developing it.

Techniques such risk-based test planning and test case design, adoption of explorative and regression strategies, execution of unit, behavioral, integration, end-to-end tests have to be carefully tuned, especially if part of the tests are to be automated.

Our services


We join the team while they work on their project and we contribute by analysing what has been done and how, what results could have been achieved and how to proceed further. These sessions will allow team members to quickly acquire the needed skills in the context of the problem in which they are needed. Sessions can be distributed over time as appropriate to provide enough time for people to absorb and practice the acquired skills without disrupting the project’s schedule.


If time constraints limit the possibility of coaching, we can act as external consultants and carry out activities that were agreed upon with the client, in the areas listed above. Consultancy requires less effort from the client side as opposed to coaching. We will help the client track the impact of our work so that the value we provide can be measured on a regular basis. These KPI of our value-focused consulting strategy are always identified in collaboration with our clients before the consultancy starts.


Similarly to consultancy and coaching, a workshop is focused on a specific project agreed upon with the client. Activities are organized in hands-on lectures with a mix of theory and practice. Tthis way, each team member can fill project-related gaps and start practicing the new skills “the day after”, autonomously. We monitor these subsequent autonomous activities, but with less intensity than during coaching.

This solution is ideal for already experienced teams that need to fill a specific technical debt in a short period of time.


We provide training courses in the areas described above. Courses are organized at the client’s premises with a calendar that optimizes learning and technological transfer. Our approach is passionate and pragmatic, with a balance of sound theory and consolidated software engineering practices. Training courses are ideal for filling the gap (either cultural or technological) in a complex project, or to align heterogeneous teams in order to develop and share a common knowledge.

Call us
We are happy to discuss your needs. Let us find out how we can help you

through this site