Jacek Matulewski
Inżynieria oprogramowania

Zaliczenie zajęć:
Warunek konieczny: zadania domowe
Warunek wystarczający: kolokwium (nie ma alternatywy!)
Dodatkowo: konkursy umożliwiające podniesienie oceny.


Plan zajęć i prezentacje:

  1. Wykład (Jacek Matulewski, 10h)
    1. Podstawy
      1. Przypomnienie podstaw programowania obiektowego
      2. Testy jednostkowe
      3. Zasady SOLID i GRASP. Zapachy kodu
      4. Odwrócenie kontroli (IoC) i wstrzykiwanie zależności (DI)
      5. Materiały dodatkowe:
        1. Bob Martin SOLID Principles of Object Oriented and Agile Design
        2. Testy jednostkowe:
    2. Inżynieria wymagań
    3. Wprowadzenie do UML
    4. Praca inżynierska
      1. Zawartość i wymagania
      2. Szablon pracy: Word, PDF, TeX
      3. Krótko o strukturze IMRaD
      4. Egzamin inżynierski
      5. Zagadnienia na egzamin
    5. Zespół. Role w zespole (teoria Belbina). Kwestionariusz Belbina
    6. Szybki przegląd katalogu wzorców projektowych Gangu Czworga
    7. Projektowanie architektury oprogramowania i wybrane wzorce architektoniczne:
      1. Architektura MVC na przykładzie aplikacji konsolowej
      2. Architektura trójwarstwowa (dane, BLL, prezentacja)
      3. Wzorzec MVVM dla aplikacji z GUI
      4. + Domain Driven Design (DDD) i Architektura zorientowana na usługi (SOA)
      5. Materiały dodatkowe:
        1. Mikrousługi:
    8. Problemy tradycyjnych metodyk wytwarzania oprogramowania: trójkąt Kerznera, prawa Lehmanna, prawa Brooksa (antycypacja drugiej części wykładu)

  2. Wykład (Łukasz Sikorski, 5h)
    1. Tradycyjne i zwinne metodyki wytwarzania oprogramowania
      1. Trójkąt Kerznera
      2. Model kaskadowy, iteracyjno-przyrostowy, równoległy i inne
      3. Prawa Lehmana dotyczące rozwoju oprogramowania
      4. SCRUM
      5. Kanban
      6. Typy umów na tworzenie oprogramowania, w tym umowy time&material i fixed price
      7. Materiały dodatkowe:
        1. Agile i SCRUM:
        2. Kanban:
        3. Zalety i wady kontraktów fixed price i time & materials
    2. Narzędzia pracy zespołowej
      1. Atlassian Jira, Asana, Trello
      2. Discord, Slack
    3. Krótkie wspomnienie o narzędziach do prototypowania i projektowania interfejsu aplikacji
      1. Figma (WWW: https://www.figma.com/)
      2. Justinmind Prototyper (WWW: https://www.justinmind.com/)
      3. Microsoft Blend (Visual Studio)

  3. Ćwiczenia (Jacek Matulewski, 10h)
    1. 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 2024
      • Materiały dodatkowe: Refactoring Guru - wzorce projektowe
    2. Narzędzia pracy zespołowej (praca samodzielna, tutoriale)
      1. Wersjonowanie i kopia zapasowa kodu źródłowego
        1. Git w środowisku Visual Studio z użyciem zdalnego repozytorium w GitLab - tutorial
        2. + Git flow
        3. + CI/CD
      2. Udostępnianie kodu za pomocą pakietów NuGet - tutorial
    3. Modyfikacja niezrefaktoryzowanego kodu (opis, projekt A, projekt B) (praca samodzielna w domu)
    4. Zebranie wymagań (użycie user stories), przygotowywanie specyfikacji i implementacja prostej aplikacji (z wymianą zespołów)

  4. Ćwiczenia (Łukasz Sikorski, 5h)
    1. Atliassian Jira
      1. Podstawy administracji Jira
      2. Zasady działania
      3. Jira jako narzędzie zarządzania w modelu zwinnym
        1. Tablica Kanban
        2. Typy zadań
        3. Sprinty
        4. Wydania
        5. Oś czasu
      4. Dodatkowe parametry zadań
      5. Dobre praktyki
        1. Komentarze (prowadzenie komunikacji, adresowanie)
        2. Obserwowanie zadań
      6. Wyszukiwanie zadań (klikane oraz JQL)
    2. Atlassian Confluence
      1. Zasady działania
      2. Współpraca z Jira

  5. 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