Nazwa przedmiotu:
Sztuka wytwarzania oprogramowania
Koordynator przedmiotu:
Rajmund Kożuszek
Status przedmiotu:
Obowiązkowy
Poziom kształcenia:
Studia I stopnia
Program:
Informatyka
Grupa przedmiotów:
Przedmioty techniczne
Kod przedmiotu:
SWO
Semestr nominalny:
4 / rok ak. 2021/2022
Liczba punktów ECTS:
4
Liczba godzin pracy studenta związanych z osiągnięciem efektów uczenia się:
1. Liczba godzin kontaktowych - 50 godz., w tym a. obecność na wykładach 30 godz. b. obecność na zajęciach laboratoryjnych 16 godz. c. udział w konsultacjach związanych z realizacją przedmiotu 4 godz. 2. Praca własna studenta - 60 godz., w tym: a. analiza literatury, dokumentacji, materiałów wykładowych związana z przygotowaniem do kolejnych wykładów: 20 godz. b. instalacja oprogramowania, analiza dokumentacji, eksperymenty, związane z przygotowaniem się do laboratorium: 30 godz. c. przygotowanie do kolokwiów: 10 godz. Łączny nakład pracy studenta wynosi 110 godz, co odpowiada 4 pkt. ECTS
Liczba punktów ECTS na zajęciach wymagających bezpośredniego udziału nauczycieli akademickich:
2 pkt. ECTS, 50 godz. kontaktowych
Język prowadzenia zajęć:
polski
Liczba punktów ECTS, którą student uzyskuje w ramach zajęć o charakterze praktycznym:
1,75 pkt. ECTS, 30 + 16 = 46 godz. realizacji ćwiczeń
Formy zajęć i ich wymiar w semestrze:
  • Wykład30h
  • Ćwiczenia0h
  • Laboratorium15h
  • Projekt0h
  • Lekcje komputerowe0h
Wymagania wstępne:
Programowanie obiektowe, Systemy operacyjne
Limit liczby studentów:
150
Cel przedmiotu:
Przedmiot ten ma na celu nauczenie podstaw technik i dobrych praktyk stosowanych w przemysłowym wytwarzaniu oprogramowania. Nacisk położony jest na pracę projektanta kodu i programisty rozbudowanego systemu informatycznego, ale zakres przedmiotu wykracza poza rozwiązywanie problemów programistycznych, ukazując kodowanie jako element większej całości. Student po zakończeniu przedmiotu będzie mógł wykazać się wiedzą z zakresu stosowanych rozwiązań inżynieryjnych i metodyk pracy wykorzystywanych w procesie wytwarzania i utrzymania złożonych systemów informatycznych. Student zdobędzie umiejętności z zakresu ustandaryzowanego rozwiązywania częstych problemów inżynieryjnych, oceny jakości kodu i metod jej poprawy, pracy nad istniejącym kodem oraz technik stosowanych dla długofalowego utrzymania wysokiej wiarygodności i jakości oprogramowania. Student zapozna się także z różnorodnymi narzędziami i kompleksowymi środowiskami wspomagającymi proces wytwarzania oprogramowania oraz technikami pracy w zespole programistycznym.
Treści kształcenia:
WYKŁADY: 1. Wprowadzenie (2 godz.) Regulamin i informacje o przedmiocie. Potok wytwarzania oprogramowania - powtórzenie i rozwinięcie, od edytora, poprzez repozytorium kodu do narzędzi do ciągłego integrowania i dostarczania oprogramowania (CI/CD). Omówienie typowych narzędzi, git, Jenkins. 2. Styl kodowania (4 godz.) Techniki pracy w zespole programistów (rewizje kodu i mentor), rola testów w procesie wytwarzania oprogramowania, testy jednostkowe. Zaawansowane techniki stosowane w programowaniu obiektowym - SOLID. Czysty kod (Clean Code, Lean Development). Tworzenie oprogramowania w oparciu o testy (TDD). 3. Obiektowe wzorce projektowe (4 godz.) Zalety stosowania wzorców projektowych i poprawne ich aplikowania. Antywzorce. Omówienie wzorców: kompozyt, most, fabryki, singleton, obserwator, model-widok-kontroler, dekorator, adapter, iterator, strategia, wizytator, wielometoda, komenda, fasada i inne. 4. Współbieżne wzorce projektowe (6 godz). Stosowanie wzorców do rozwiązywania problemów współbieżnych. Asynchroniczność a wielowątkowość i zrównoleglenie wykonania. Pętla zdarzeń, asynchroniczna obsługa urządzeń i asynchroniczne przetwarzanie danych. Skalowalność. Komunikacja międzywątkowa i międzyprocesowa. 5. Monitorowanie aplikacji (1 godz.) Logowanie i śledzenie pracy programu. Automatyczne reagowanie na błędy. 6. Analiza aplikacji (2 godz.) Debugowanie, profilowanie i badanie uruchomionej aplikacji. Automatyzacja wykrywania problemów czasu wykonania. 7. Analiza kodu (2 godz.) Analiza statyczna kodu, metryki kodu, pomiar pokrycia, ocena jakości kodu i testów. 8. Refaktoring (4 godz.) Wykrywanie “zapachów” kodu, techniki poprawy jakości kodu. Utrzymywanie dużych projektów i praca z kodem zastanym. 9. Systemy heterogeniczne (2 godz.) Tworzenie aplikacji, gdzie różne moduły są implementowane w różnych językach programowania, przykład - łączenie Pythona i C++, Javy i C++, R i C++. Różne techniki łączenia systemów, problemy architektoniczne i techniczne. 10. Zasoby internetowe (1 godz.) Konferencje i czasopisma poświęcone programowaniu, standardy języków programowania. Umiejętne wykorzystanie dostępnych zasobów. LABORATORIA: 1. Zapoznanie się z podstawowymi narzędziami. Zaawansowane wykorzystanie narzędzia git. Obsługa przygotowanego potoku. Praca w parach i rewizja kodu. 2. Przygotowanie własnego projektu i środowiska dla niego. Zestawienie potoku CI/CD dla projektu, z testami i walidacją. 3. Profilowanie i debugowanie złożonej aplikacji. Poszukiwanie przyczyn błędów i wykrywanie miejsc potencjalnej optymalizacji. 4. Refaktoring istniejącego kodu. Praca z zastanym kodem. Walidacja działania z wykorzystaniem istniejącego potoku.
Metody oceny:
Realizacja przedmiotu obejmuje następujące formy zajęć: - wykład - 2 godziny tygodniowo, na którym, oprócz tradycyjnego omawiania zagadnień z wykorzystaniem slajdów, będą prezentowane przykłady tworzenia kodu źródłowego kodu w czasie rzeczywistym - zajęcia laboratoryjne w wymiarze 4 godz.; w ramach zajęć studenci samodzielnie, pod opieką prowadzącego, w grupach dwuosobowych będą realizować wskazane ćwiczenia. Sprawdzanie założonych efektów kształcenia realizowane jest przez: - ocenę umiejętności i wiedzy wykazanych w trakcie realizacji zadań laboratoryjnych, - ocenę wiedzy wykazanej na dwóch kolokwiach pisemnych.
Egzamin:
nie
Literatura:
1. Andrew Hunt, David Thomas - Pragmatyczny programista. Od czeladnika do mistrza. Helion 2014 2. Robert C. Martin - Czysty kod. Podręcznik dobrego programisty. Helion 2010 3. Robert C. Martin - Mistrz czystego kodu. Kodeks postępowania profesjonalnych programistów. Helion 2013 4. Erich Gamma et al. - Wzorce projektowe. Helion 2010 5. Martin Fowler - Refaktoryzacja. Ulepszanie struktury istniejącego kodu. Helion 2011
Witryna www przedmiotu:
https://usosweb.usos.pw.edu.pl/kontroler.php?_action=katalog2/przedmioty/pokazPrzedmiot&prz_kod=103A-INxxx-ISP-SWO
Uwagi:
(-)

Efekty uczenia się

Profil ogólnoakademicki - wiedza

Charakterystyka W01
ma uporządkowaną wiedzę na temat potoku wytwarzania oprogramowania i użytych w nim narzędzi
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W08
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W02
zna techniki zapewniania jakości oprogramowania w ramach pracy w wieloosobowych zespołach programistów
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W09
Powiązane charakterystyki obszarowe: III.P6S_WG, P6U_W, I.P6S_WG.o
Charakterystyka W03
zna reguły SOLID stosowane do poprawy jakości kodu i architektury
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W08, W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W04
zna różnorodne wzorce projektowe (konstrukcyjne, strukturalne i operacyjne)
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W05
zna współbieżne wzorce projektowe i posiada wiedzę o budowaniu wydajnych aplikacji współbieżnych
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W06
zna narzędzia i techniki monitorowania i badania działania aplikacji
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: W08, W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W07
zna metody rozpoznawania niedoskonałości kodu i techniki jego naprawy
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W08, W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W08
zna podstawy reguł tworzenia systemów heterogenicznych
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W09, W08
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG
Charakterystyka W09
zna techniki i narzędzia do analizy i oceny kodu programów
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: W08, W09
Powiązane charakterystyki obszarowe: P6U_W, I.P6S_WG.o, III.P6S_WG

Profil ogólnoakademicki - umiejętności

Charakterystyka U01
potrafi wybrać i skonfigurować zestaw narzędzi potrzebnych do stworzenia potoku wytwarzania i walidacji złożonego systemu
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U01, U02, U06
Powiązane charakterystyki obszarowe: P6U_U, I.P6S_UW.o, III.P6S_UW.o
Charakterystyka U02
potrafi stosować różnorodne wzorce projektowe do rozwiązywania problemów programistycznych i architektonicznych
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U01, U02
Powiązane charakterystyki obszarowe: P6U_U, I.P6S_UW.o, III.P6S_UW.o
Charakterystyka U03
potrafi wykorzystywać techniki pracy w zespole programistycznym w celu podnoszenia jakości oprogramowania
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U08, U02
Powiązane charakterystyki obszarowe: I.P6S_UO, P6U_U, I.P6S_UW.o, III.P6S_UW.o
Charakterystyka U04
potrafi samodzielnie wykorzystać dokumentację narzędzi w celu dostosowania ich działania do konkretnych potrzeb
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U01, U02, U12
Powiązane charakterystyki obszarowe: P6U_U, I.P6S_UW.o, III.P6S_UW.o, I.P6S_UU
Charakterystyka U05
umie przebadać kod oraz działającą aplikację pod kątem jej wydajności i przyczyn problemów z działaniem
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U01, U03
Powiązane charakterystyki obszarowe: P6U_U, I.P6S_UW.o, III.P6S_UW.o
Charakterystyka U06
umie rozpoznać miejsca w kodzie wymagające poprawki i odpowiednio je refaktoryzować
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: U01, U02
Powiązane charakterystyki obszarowe: P6U_U, I.P6S_UW.o, III.P6S_UW.o

Profil ogólnoakademicki - kompetencje społeczne

Charakterystyka K01
rozumie potrzebę stałego aktualizowania i wzbogacania posiadanej wiedzy o technikach i narzędziach stosowanych w wytwarzaniu oprogramowania
Weryfikacja: kolokwium, laboratorium
Powiązane charakterystyki kierunkowe: K01, K03
Powiązane charakterystyki obszarowe: P6U_K, I.P6S_KK, I.P6S_KR
Charakterystyka K02
ma świadomość konieczności komunikowania się z otoczeniem, w szczególności z zespołem, ale także współpracownikami nie będącymi programistami, w sposób zrozumiały dla odbiorcy
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: K05
Powiązane charakterystyki obszarowe: P6U_K, I.P6S_KO
Charakterystyka K03
umie samodzielnie pozyskiwać dodatkowe informacje o dostępnych narzędziach i technikach wytwarzania oprogramowania
Weryfikacja: laboratorium
Powiązane charakterystyki kierunkowe: K01, K03
Powiązane charakterystyki obszarowe: P6U_K, I.P6S_KK, I.P6S_KR