Software Design Methods for Concurrent and Real-Time Systems