Understanding Programming
Introduction to software design using modern C++
A continuation of this introductory programming course, focusing on issues arising in larger, real world, collaborative software development and teaching features and tools useful for managing the resulting complexity.
This describes version 0 of this course, as held during 2023.
If you participated and would like to look at the course material again, it can be found here.
If you received a certificate and would like to verify its authenticity, head over here.
You can find a list of currently running and offered courses here.
Description
Everybody [...] should learn how to program a computer, should learn a computer language, because it teaches you how to think
Computers - as well as the programs controlling them - are ubiquitous in modern society. Basically every profession utilizes them in some way and everyday life is increasingly shaped and controlled by various "smart" devices like phones, tvs and personal assistants.
Further, their influence permeates academia, as computer code has proven to be an indispensable tool for scientific inquiry and pretty much every discipline.
Physicists simulate complex processes or evaluate large amounts of collected data, physicians perform computer aided diagnosis to prescribe medications developed with algorithmic assistance and even social scientists rely on applications for statistical analysis whilst using websites and apps to conduct surveys and experiments on otherwise impossible scale.
Despite the fact that even a rudimentary understanding of their workings - of their language - would aid tremendously in the purposeful application of computer systems, programming still remains a mystery to many. An impenetrable, arcane activity reserved for experts.
It doesn't have to remain that way! Obviously not everyone has to become a professional software developer, just like most of us do not earn a living as professional authors or mathematicians. Nonetheless programming shares an important commonality with reading, writing and arithmetic in it being one of the essential pillars modern life is built upon. A basic understanding of its principles can help us better understand society, navigate it confidently and express ourselves creatively.
This practical use would already be more then enough reason to acquire some skills in the area but even more important is the way of thinking doing so can teach, which offers wide ranging benefits for *all* walks of life.
At its core, programming is structured problem solving. It is the ability to analyze complex situations and processes, to abstract and to decompose big, unwieldy tasks into smaller, manageable components. It is the ability to communicate clearly - not only with computers but also with other humans, to unambiguously express intent and to repeatedly check ones own beliefs and assumptions.
Much more than a means to control it, programming is a tool for understanding the world.
After having acquired a basic understanding of the fundamentals and underlying principles of programming using the multi-paradigm language C++, this course continues where the preceding one left off and first teaches a number of language features and standard library constructs useful for managing the complexity of larger systems consisting of many interlocking, separately developed parts.
You are then introduced to the larger ecosystem your code lives in, learning about external libraries, build systems and version control.
Once you feel reasonable familiar with this environment, you are encouraged to practice and consolidate the ability to write maintainable code by developing a slightly larger, collaborative project in small groups.
At the end of this course, you will have collected your first experiences with larger scale software design, have knowledge of the tools and techniques needed to create readable, maintainable systems and are thus enabled to begin actively participating in collaborative development efforts.
Target audience & Prerequisites
This course was aimed at students who had previously completed Understanding Programming - Introduction to problem solving using modern C++.As such, it requires knowledge and skills on par with what was taught there, that is a basic understanding of the fundamental constructs making up most C++ programs and the ability to apply them in small, well-defined and self-contained programs.
Topics covered
- Values & References
- Memberfunctions, Access Specifiers & Invariants
- const, constexpr and const correctness
- Operator overloading
- Constructors & Destructors, Rule of 3|5|0, RAII
- Templates & Concepts
- Lambda expressions, standard algorithms & containers
- Version control, Build systems & dependency management
- Working with existing code and external libraries