Programming is fundamental to all engineering disciplines. Engineers solve real-world problems and they extensively use computers to do this. Programs are written in high-level languages, which are eventually executed as a series of instructions within the computer. The world of the computer is in bits and bytes, which is very different from the real world. The real world, unlike the binary world of computers, uses many kinds of entities such as natural languages, diagrams, maps and the like for communication. How does an engineer connect these two diverse worlds? This course tries to address this question using software engineering methods. Lessons learned here, though mainly from software engineering, can be transferred to many other engineering domains such as computer systems engineering, mechatronics and mechanical engineering.
The Object Oriented (OO) methodology is one such approach, which can be used to connect real world problems with the digital world, so that these problems can be solved efficiently. This will be the focus of this course. In addition to this, we will also teach algorithms (mathematical representation of programs in a generic format called pseudocode), and data-structures (mathematical objects for data representation and manipulation on a computer). The combination of all these concepts encompasses an approach to connect the digital world with the real world in a systematic way for engineering problem solving. Topics covered will include the following:
Weeks 1 to 6: Introduction to git version control (using GitHub), Linux command line, review programming basics, OOP fundamentals, classes, abstraction, encapsulation, inheritance, polymorphism. Weeks 7 to 12: Test-driven development and test-first programming, abstract data types, data-structures such as linked-lists and trees, algorithm analysis, and "Big O" notation.