# Understanding the problem statement

We are in the business of solving different kind of problems with software. A program is a sequence of instructions that can be executed by a computer to solve some problem or perform a specified task. In order to know what instructions to include in our programs, we need to gain an understanding of why our program is...

## Capturing requirements

The very first thing we need to do in a project is to try to fully understand the problem we are solving as well as the scope of the problem. Let's start with defining these two terms and then take a closer look at what we are dealing with in the context of the ATM Challenge.

### Get to work - Go Agile

Employing Agile practices in Software Development is an excellent way to incrementally deliver solutions, ensuring that user needs are kept front and center throughout the entire design and development process. Once you’ve stepped back and identified the true nature of the problem to be solved, you and your team can leverage on agile best-practicies to incrementally build out the solution.

#### The Problem Statement

A Problem Statement is the explicit written statement of the problem. Creating a good problem definition is a fundamental step to set the direction of the project and thus a very important process. Working without it leads to waste of time and effort.

> "Would you tell me, please, which way I ought to go from here?"
>
> "That depends a good deal on where you want to get to," said the Cat.
>
> "I don't much care where—" said Alice.
>
> "Then it doesn't matter which way you go," said the Cat.
>
> "—so long as I get SOMEWHERE," Alice added as an explanation.
>
> "Oh, you're sure to do that," said the Cat, "if you only walk long enough."

Working without a plan can also be compared to the Infinite Monkey Theorem, stating that given an infinite length of time, a chimpanzee punching at random on a typewriter would almost surely type out all of Shakespeare's plays.

To create a good Problem Statement we must dig deep and find out what is the root cause of the problem given to us, the real problem.

A good Problem Statement is:

* written down and shared;
* explicitly defines the current state and the desired state;
* measurable, so we know if and when we achieved it;
* short;
* not over constrained.

In the context of the ATM Challenge the Problem Statement might be something like this:

_**"Bank customers, in need of cash, would benefit from being able to get cash in a quick yet secure way. Getting cash should be possible without limitations of Bank office opening hours."**_

#### Tell a story

We are story tellers. We tell our stories using software and the way we tell our stories depends on who is listening.

A well-told user story starts a conversation. A user story is an informal, natural language description of one or more features of a system that define what has to be built in the project. The goal with defining user stories is to capture the requirements needed to deliver a solution to the problem definition.

#### Draw a Picture

Flowcharts are a modeling technique that can help you visualize a flow of actions, data inputs and outcomes. Here's a very simple flowchart for the process of withdrawing funds from an ATM.

![](https://2319180717-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L9htzNZtMtWBsdebPS_%2F-L9hu-kXViZwQfjP3ANw%2F-L9hu3VUoeYEoNfjwYIc%2F5c1018df-4843-4f1f-bb29-9aa60195139b.png?generation=1523336112979918\&alt=media)

## Naming is a process, not a single step

Don't be afraid to change your mind. Quite often, as your system evolves with more use cases and features implemented, the names of your classes, methods and attributes might prove irrelevant or illogical. That is perfectly normal and an integrated part of the refactoring process is to review and refine your naming.
