Following steps are extremely important for any development.
Requirement gathering
Freezing and documenting exact requirements. Drafting exact use cases help a lot.
Design
Designing the solution. Here different approaches can be chosen depending upon the nature of project.
- Incremental pattern :
For a long term project with short spurts of deliverables and reviews, an incremental pattern helps a lot.
- Concrete pattern :
Here you design your application in thorough. The releases cycles are longer. Every feature is completed first and then delivered.
Using UML following diagrams are important.
- Class diagrams :
Should list all classes in detail. Use of Interface, Abstract classes, helper classes, Third Party APIs can be detailed here.
- Sequence diagrams :
Should list the flow of actions for all listed use cases in project.
Use of appropriate design patterns should be included here. Test cases should be drafted matching the use cases, generally in relation like 1 or more test cases per use case.
There actually is a lot to describe here. What I have provided is the approach that should be taken while implementing the project.
Considering your application, breaking it down to different pieces can help design it simpler. On a broad level I can think of following pieces.
- Entity - Speaker, Listener
- Expressions - List of expressions
- Rules - Rules in the form of reaction expression for speaker expression.
- Communication - Communication layer which will be used by speaker to listener (something like a broadcast) and from listener to speaker(something like a point to point queue)