Semester: summer 2022/23
Lectures: Wednesday, 9:00, S3 (Lubomír Bulej)
  Thursday, 9:00, S1 (Lubomír Bulej)
  Thursday, 14:00, S1 (Lubomír Bulej)
Page in SIS: NPRG043
Grading: Graded credit


May 15, 2023 — Clarified description of the first part of Task 7.

May 11, 2023 — Published lecture materials for the May 10 lecture (cancelled due to the Rector’s day).

May 11, 2023 — Partial grading is now available in individual student repositories.

May 9, 2023 — Published Task 7.

Apr 24, 2023 — Published Task 6.

Apr 12, 2023 — Published Task 5.

Mar 27, 2023 — Published Task 4.

Mar 20, 2023 — Published Task 3.

Mar 12, 2023 — Published Task 2.

Mar 8, 2023 — The course schedule was updated to provide a gap between the API review, API presentation, and API testing tasks. This also means that the initial API presentations will be shifted by one week from March 16 to March 23.

Feb 23, 2023 — Published Task 1.

Jan 31, 2023 — Published tentative course schedule.

Jan 17, 2023 — The course capacity is limited and cannot be easily increased. When enrolling, please take into account that throughout the semester, you will be required to work on 7 assignments (outside of school) and that you cannot skip any of them.

Show all...


Programming is not just a matter of writing a program that runs (correctly), or implementing a particular algorithm. Modern programming has become a task in managing structural complexity of computer systems. For small-scale programs, which often serve as a wrapper (handling inputs and outputs) for some algorithm, the (structural) complexity is dominated by the abstractions, operations, and data structures required to implement the algorithm. In medium-sized programs and large-scale software systems, the complexity due to algorithm and the associated data structures stops dominating as the program becomes complex as a result of the number of concepts and their interactions. For such programs, design plays a critical role as the ability to develop and maintain such programs surpasses the capacity of a single person.

In such projects, the ability of team members to communicate effectively becomes extremely important, and the source code of a software system becomes one of the communication channels, which also happens to exactly reflect the current state of the system. While source code quality is (usually) not directly related to correct function of a software system, it does have a significant impact on other important aspects, such as readability, maintainability, and together with design also extensibility and reusability.

The source code quality manifests in many ways, from source code formatting, ordering of statements, choice of variable and function names, decomposition into methods, the content of comments, to design of classes and interfaces. At the lowest level, the goal is to find how to clearly and conveniently capture the executed operations, while at the highest level, the goal is to identify and use good abstractions, which simplify writing and orientation in code, and thus make a program easier to maintain and extend.

Through lectures and lab work during the semester, the course aims to introduce the students to (best) programming practices that lead to better code and program design. The goal is to motivate the students to adopt and use these techniques in practice.

Topics covered

  • Software construction and design, managing essential and accidental complexity.
  • API design, general principles, impact on class and method design.
  • Class design, abstraction & encapsulation, inheritance & composition, polymorphism, immutability.
  • SOLID design principles, design patterns in the context of design principles.
  • Method design, cohesion, naming, parameter passing, returning values, using exceptions, defensive programming.
  • Basic building blocks, variables and constants, general guidelines, naming convetions, fundamental data types.
  • Control structures and primitives, general guidelines, conditional statements, loop statements, code organization.
  • Code formatting, general principles, formatting blocks of code and code elements, formatting aids.
  • Documentation, internal documentation and comments, self-explanatory code.

Contact and office hours

The course uses a GitLab issue tracker in a dedicated Forum project repository as the primary means of communication. Occassional announcements will be made via e-mail (using the one you have in SIS).

Please use the forum for any questions or suggestions related to the course, because it will (most probably) be of interest to other students as well. Consequently, you may want to subscribe to repository notifications to see issues created by other students.

If there is something that needs to be discussed in private, please create a confidential issue on Forum.

Using the issues has the advantage providing a view of the state of a particular issue (for the issue creators) and also a view of outstanding issues (for the course instructor).

Please use e-mail only if you feel that the Forum (confidential) issue tracker is not fit for the purpose. While it is generally OK to come to my office without an appointment, make sure to check my teaching schedule to avoid coming just before my lectures. If you need to discuss something at length, I suggest to arrange an appointment — preferably over Zoom (I can host it).

Assignments and grading

The core of the work in the course comes from multiple assignments. Some of them are intended for pairs of students (to facilitate discussion about design and to try working with someone else), while others have to be submitted individually. The final grade is mostly determined by the assignments and the course can be passed with flying colors solely on the basis of excellent work during the semester.

The final grade is determined by the percentage of points gained from all assignments as shown in the following table:

≥ 87% 1
≥ 73% 2
≥ 60% 3
< 60% fail

Please keep in mind that no assignments can be skipped (or turned in empty). You will providing other teams either with feedback for their design or tests for their code. Likewise, your team will be receiving tests and feedback from other students. Skipping assignments would be grossly unfair to other students.