Proces vývoje a tvorby software, inherentní a zavlečená složitost.
Návrh rozhraní (API), obecné principy, návrh veřejných tříd a metod rozhraní.
Návrh tříd, abstrakce a zapouzdření, dědičnost vs. kompozice, polymorfizmus, immutability.
Základní principy objektového návrhu (Single responsibility principle, Open-closed principle, Liskov substitution principle, Interface segregation principle, Dependency inversion principle).
Jednotkové testování, testovatelný design.
Principy objektového návrhu v návrhových vzorech (strategy, observer, decorator, factory).
Návrh metod, metody jako abstrakce, název a účel metody, délka a soudržnost kódu, práce s parametry a vracení hodnot, používání výjimek.
Defenzivní programování, kontrola vstupů a použití assertů, obsluha chyb.
Obecná pravidla pro práci s proměnnými a konstantami, názvové konvence, základní datové typy.
Obecná pravidla pro práci s řídícími strukturami a primitivy, organizace kódu, refaktoring.
Programování není pouze o schopnosti napsat fungující program. S kvalitou programu je (vedle návrhu a celé řady funkčních charakteristik) spojena celá řada charakteristik, které s funkcí programu přímo nesouvisí. Náplní předmětu je seznámit studenty s praktickými postupy a pravidly, jejichž důsledné dodržování a aplikace vedou ke kvalitnějším programům. Cílem předmětu je motivovat studenty k osvojení a používání probíraných postupů v praxi.
Předpokládají se znalosti programování v rozsahu bakalářského kursu NPRG031 Programování II.