This is a practical, hands-on, how-to guide covering the concepts and techniques of model-based software engineering using a tool called Universal Modelling Language. The book shows how software can be developed and maintained under a true engineering discipline, describing relevant software engineering practices with grounding in Computer Science and Discrete Mathematics. There is a strong emphasis on surfacing as many precise requirements as possible using semantic modeling. This approach separates business complexities from technology complexities, which gives developers the most freedom in finding optimal designs and code. The author promotes scalability through domain partitioning and subdomain partitioning. The book also explores software documentation that specifically and intentionally adds value for development and maintenance.