Designing Event Driven Systems