Zaliczenie zajęć:
Warunek konieczny: zadania domowe
Warunek wystarczający: kolokwium (nie ma alternatywy!)
Dodatkowo: konkursy umożliwiające podniesienie oceny.
Plan zajęć i prezentacje:
- Wykład (Jacek Matulewski, 10h)
- Podstawy
- Przypomnienie podstaw programowania obiektowego
 - Testy jednostkowe
 - Zasady SOLID i GRASP. Zapachy kodu
 - Odwrócenie kontroli (IoC) i wstrzykiwanie zależności (DI)
- Materiały dodatkowe:
- Bob Martin SOLID Principles of Object Oriented and Agile Design
 - Testy jednostkowe:
 
 
 
 - Inżynieria wymagań
 - Wprowadzenie do UML
 - Praca inżynierska
- Zawartość i wymagania
 - Szablon pracy: Word, PDF, TeX
 - Krótko o strukturze IMRaD
 - Egzamin inżynierski
 - Zagadnienia na egzamin
 
 - Zespół. Role w zespole (teoria Belbina). Kwestionariusz Belbina 
 - Szybki przegląd katalogu wzorców projektowych Gangu Czworga
 - Projektowanie architektury oprogramowania i wybrane wzorce architektoniczne:
- Architektura MVC na przykładzie aplikacji konsolowej
 - Architektura trójwarstwowa (dane, BLL, prezentacja)
 - Wzorzec MVVM dla aplikacji z GUI
 - + Domain Driven Design (DDD) i Architektura zorientowana na usługi (SOA)
- Materiały dodatkowe:
- Mikrousługi:
 
 
 
 - Problemy tradycyjnych metodyk wytwarzania oprogramowania: trójkąt Kerznera, prawa Lehmanna, prawa Brooksa (antycypacja drugiej części wykładu)
 
 - Wykład (Łukasz Sikorski, 5h)
- Tradycyjne i zwinne metodyki wytwarzania oprogramowania
- Trójkąt Kerznera
 - Model kaskadowy, iteracyjno-przyrostowy, równoległy i inne
 - Prawa Lehmana dotyczące rozwoju oprogramowania
 - SCRUM
 - Kanban
 - Typy umów na tworzenie oprogramowania, w tym umowy time&material i fixed price
- Materiały dodatkowe:
- Agile i SCRUM:
 - Kanban:
 - Zalety i wady kontraktów fixed price i time & materials
 
 
 
 - Narzędzia pracy zespołowej
- Atlassian Jira, Asana, Trello
 - Discord, Slack
 
 - Krótkie wspomnienie o narzędziach do prototypowania i projektowania interfejsu aplikacji
- Figma (WWW: https://www.figma.com/)
 - Justinmind Prototyper (WWW: https://www.justinmind.com/)
 - Microsoft Blend (Visual Studio)
 
 
 - Ćwiczenia (Jacek Matulewski, 10h)
- Wzorce projektowe (implementacja w C++ i C#)
- Singleton 
-> modyfikacje (klasa statyczna, ograniczenie liczby instancji do N)
 - Adapter (klasowy, obiektowy)
 - Dekorator 
-> Fasada
 - Most (+ modyfikacje) 
-> Pełnomocnik
 - Pyłek i fabryka abstrakcyjna
 - Interpreter
 - Kompozyt 
-> formatowanie wydruku -> cykle -> Odwiedzający -> uogólnienie -> Iterator
 - Metoda szablonowa (implementacja w oparciu o polimorfizm i w oparciu o delegacje)
 - Obserwator (klasyczny) 
-> zdarzenia -> użycie IObserver i IObservable
 - Polecenie 
-> Uogólnienie: RelayCommand
 Szyna/kolejka komunikatów (szyna poleceń, szyna zdarzeń) - por. wzorzec Mediator
- Zadania
 - Projekty "startowe" do ćwiczeń (kod źródłowy C#, projekty Visual Studio)
 - Kod źródłowy z zajęć zima 2025
 - Materiały dodatkowe: Refactoring Guru - wzorce projektowe
 
 - Narzędzia pracy zespołowej (praca samodzielna, tutoriale)
- Wersjonowanie i kopia zapasowa kodu źródłowego
- Git w środowisku Visual Studio z użyciem zdalnego repozytorium w GitLab - tutorial
- + Git flow
 - + CI/CD
 
 
 - Udostępnianie kodu za pomocą pakietów NuGet - tutorial
 
 - Modyfikacja niezrefaktoryzowanego kodu (opis, projekt A, projekt B) (praca samodzielna w domu)
 - Zebranie wymagań (użycie user stories), przygotowywanie specyfikacji i implementacja prostej aplikacji (z wymianą zespołów)
 
 - Ćwiczenia (Łukasz Sikorski, 5h)
- Atliassian Jira
- Podstawy administracji Jira
 - Zasady działania
 - Jira jako narzędzie zarządzania w modelu zwinnym
- Tablica Kanban
 - Typy zadań
 - Sprinty
 - Wydania
 - Oś czasu
 
 - Dodatkowe parametry zadań
 - Dobre praktyki
- Komentarze (prowadzenie komunikacji, adresowanie)
 - Obserwowanie zadań
 
 - Wyszukiwanie zadań (klikane oraz JQL)
 
 - Atlassian Confluence
- Zasady działania
 - Współpraca z Jira
 
 
- Zagadnienia inżynierii oprogramowania do dalszego samodzielnego studiowania:
- przygotowanie samodzielnie lub przy współpracy z zespołem dokumentacji projektowej oprogramowania wraz ze wstępną estymacją czasu i kosztów
 - poznawanie różnych systemów wytwarzania oprogramowania; poznawanie zasad, którymi się kierują
 - praktyczne ćwiczenia w projektowaniu prostych architektur systemów oprogramowania i przygotowania ich dokumentacji funkcjonalnej
 - praktyczne przykłady wykorzystania poznanych wzorców projektowych
 - opracowywanie i nadzorowanie zestawów testów (scenariuszy testowych) dla rozwijanej aplikacji
 - optymalizacje
 - event storming
 
 
 
Linki do innych materiałów dotyczących inżynierii oprogramowania:
Jerzy Nawrocki - wykład Inżynieria oprogramowania na MIMUW (ważniak)
Jerzy Nawrocki - Zaawansowana inżynieria oprogramowania
Literatura rozszerzająca zagadnienia wykładu:
Ian Sommerville Inżynieria oprogramowania (wydanie X), PWN 2020
Robert C. Martin Zwinne wytwarzanie oprogramowania. Najlepsze wzorce, zasady, praktyki, Helion
Vaughn Vernon DDD dla architektów oprogramowania, Helion
Eric Evans Domain-Driven Design. Zapanuj nad złożonym systemem informatycznym, Helion
Martin Fowler Architektura systemów zarządzania przedsiębiorstwem. Wzorce projektowe, Helion
Simon Brown Softrware Architecture for Developers (PDF)
Literatura "mądrościowa" do poduszki (klasyki):
Robert C. Martin Mistrz czystego kodu, Helion
Frederick P. Brooks Mityczny osobomiesiąc. Eseje o inżynierii oprogramowania, WNT