A CRM Developer at work mentioned the term Finite State Machine and it was curious because I had never heard of this term.
The CRM developer mentioned it as something you would learn in your first year of computer science course. So I thought I would investigate and the best way to learn something is to learn it enough to explain it to someone else.
So I will start will the description from Wikipedia Finite State Machine
A finite-state machine (FSM) or finite-state automaton (plural: automata), or simply a state machine, is a mathematical model of computation used to design bothcomputer programs and sequential logic circuits. It is conceived as an abstract machine that can be in one of a finite number of states. The machine is in only one state at a time; the state it is in at any given time is called the current state. It can change from one state to another when initiated by a triggering event or condition; this is called atransition. A particular FSM is defined by a list of its states, and the triggering condition for each transition.
Abstract ideas harder to grasp
I remember when I starting out as a Java Developer I found it difficult to understand abstract ideas, particularly Abstract classes and Interfaces.
I have also found abstract ideas are harder to explain to other developers, the main reason for this is because its harder to use scenarios to explain the idea because Abstract ideas can’t be compared to physical objects. Reading the Abstract vs Concrete article on wikpedia, it describes the difficult comprehending abstract ideas
The type-token distinction identifies physical objects that are tokens of a particular type of thing. The “type” that it is a part of, is in itself an abstract object. The abstract-concrete distinction is often introduced and initially understood in terms of paradigmatic examples of objects of each kind:
Examples of abstract and concrete objects Abstract Concrete Tennis A tennis game Redness The red coloring of an apple Five Five cars Justice A just action Humanity (the property of being human) Humanity (the human race)
http://en.wikipedia.org/wiki/Finite-state_machine
This article is also interesting on Abstract versus concrete thinking
This brief article discusses why student find abstract ideas hard to understand
Understanding a Finite State Machine
The original definition on Wikipedia I found a bit ambiguous, the key to understanding something is you should be able to take the key concepts and explain them to someone in your own words.
The wikipedia definition I can take these key points
- It can have only one state from a finite amount number of states
- The machine can only have one state at a time, this is called the current state
- It can change from one state to another
- When a state changes this is called a transition
- A state change is triggered by an event/condition
Whilst looking for articles on finite state machine I also found this excellent article on i Programmer
Finite state machines may sound like a very dry and boring topic but they reveal a lot about the power of different types of computing machine. Every Turing machine includes a finite state machine so there is a sense in which they come first. They also turn out to be very useful in practice.
I enjoyed reading this article and I started to understanding the logic of the finite state machine in more detail
- The machine has an input which changes the state of the machine
- The next stage depends on the current state and the input
Pictures are worth a thousand words on finite state machines
Below is a picture taken from Wikipedia here, the example is a finite state machine for parsing the word nice. Notice if you price the correct letter sequence the state moves along. You have the input of the character being typed in but it also checks the current state.
The example has
- 4 states (Inactive, Active, Paused, and Exited)
- 5 types of state transitions (Begin Command, End Command, Pause Command, Resume Command, Exit Command).
Youtube Videos
State transition table
The other important concept of the finite state machine is the state transition table. This is a table of all the possible states and the important concept is you have to include all the potential states and you cannot miss out any
The wiki article has a very simple state transition table for a
Current State | Input | Next State | Output |
---|---|---|---|
Locked | coin | Unlocked | Unlock turnstile so customer can push through |
push | Locked | None | |
Unlocked | coin | Unlocked | None |
push | Locked | When customer has pushed through lock turnstile |
here is a video
CRM 2013/CRM 2015 – Status Reason transitions/Custom State Model Transitions
When I was reading about finite state machine I was thinking about CRM 2013/CRM 2015 and the new functionality
this is also known as Custom State Model Transitions
It helps to understand the finite state machine to see how status reason transitions might work and how useful they can be. The status reason transition doesn’t work exactly like the finite state machine but it’s in the same ball park
Before CRM 2013 you could change from any status reason to another status reason.
e.g. an incident could go from Open to Closed and completely missing out in progress.
With Status being able to move to any status this usually meant the status had to be programmatically moved and not allowed the user to directly change the status.
or
The status reasons would be removed and added using Javascript.
With Status reason transition functionality you can set what status reasons you can move to from your current status reason.
e.g. the user can only move to closed status from the status In-Progress.
Here are some good articles on status reason functionality
Define status reason transitions
Define status reason transitions for incident (case) management
Custom State Model Transitions
The custom state model transitions offer a great way to control status transitions without having to write lots of code and customizations
After reading about finite state machine it’s easy to see how you can use custom state model transitions to create this functionality and importantly it helps you think about the status for your entities and what available paths should be available to the user.
What I have learnt from learning about the finite state machine and the new state model transitions is when you are thinking about a Crm solution you should think about the entity statuses and the state transitions, what are the possible paths.
Its interesting to split up the design in
Input
Current state
Next state
Output
The more time you put into design of your CRM solution the better the code will be structured and less changes to design and code later on.