The idea about programming and debugging reliable systems is to get past the natural assumptions people make when writing programs. At times people create almost an urban legend about what is and what is not possible. It does not matter what programming language you write in, this guide will help you to understand how programs work, and how you can write more reliable applications and also be able to debug these applications when something goes wrong.