Inżynieria oprogramowania

Opis

W latach 60. ubiegłego wieku zaczęto budować bardzo duże oprogramowania takie jak na przykład system operacyjny IBM OS/360. Pojawiły się wtedy problemy natury poza-algorytmicznej, związane z zarządzaniem tego typu przedsięwzięciami, ewolucją oprogramowania itp. Zaczęło rodzić się przeświadczenie, że tworzenie oprogramowania mogłoby być bardziej efektywne, gdyby skorzystać z doświadczeń innych dziedzin inżynierskich, takich jak budownictwo czy elektronika. Termin „inżynieria oprogramowania” (ang. Software Engineering) powstał w trakcie seminarium zorganizowanego w Niemczech pod auspicjami NATO w 1968 roku.
Przedmiot obejmuje następujące jednostki wiedzy z zakresu inżynierii oprogramowania, wymienione w standardzie kształcenia dla studiów I stopnia na kierunku Informatyka: projektowanie oprogramowania; procesy wytwarzania oprogramowania; wymagania i ich specyfikacja; walidacja i testowanie oprogramowania; ewolucja oprogramowania; zarządzanie przedsięwzięciem programistycznym.
Po zaliczeniu przedmiotu student powinien mieć podstawowe umiejętności w zakresie: posługiwania się wzorcami projektowymi; projektowania oprogramowania zgodnie z metodyką obiektową; dokonywania przeglądu projektu oprogramowania; specyfikowania wymagań dotyczących oprogramowania i przeprowadzania ich przeglądu; tworzenia, oceny i realizacji planu testowania; uczestniczenia w inspekcji kodu; zarządzania konfiguracją oprogramowania.
Zagadnienia dotyczące projektowania oprogramowania będą rozwijane w ramach przedmiotu „Zaawansowane projektowanie obiektowe", natomiast problemy i metody zarządzania przedsięwzięciem programistycznym (ze szczególnym uwzględnieniem planowania) będą szczegółowo dyskutowane w ramach przedmiotu „Zaawansowana inżynieria oprogramowania".

Sylabus

Autor

  • Jerzy Nawrocki — Politechnika Poznańska

Wymagania wstępne

  • Podstawy programowania
  • Funkcje, relacje i zbiory. Elementy logiki matematycznej: rachunek zdań i tautologie. Rekurencja
  • Programowanie obiektowe

Zawartość

Przedmiot składa się z 30 godzin wykładów podzielonych na moduły i związanych z nimi ćwiczeń laboratoryjnych (w takim samym wymiarze). Poniżej opisano zawartość poszczególnych modułów wykładów.

  • Wprowadzenie (2 godz.). W ramach pierwszego wykładu zostanie zaprezentowana studentom koncepcja przedmiotu i jego zakres.
  • Zasady skutecznego działania (3 godz.). Stephen Covey zaproponował siedem zasad skutecznego działania, które mają charakter uniwersalny, czyli odnoszą się do wszelkiego typu aktywności ludzkiej. Ed Yourdon, jeden ze światowej sławy ekspertów w zakresie inżynierii oprogramowania, stwierdził, że dla ludzi związanych z wytwarzaniem oprogramowania zasady Covey’ego są ważniejsze niż szczegółowe techniki prezentowane w opasłych tomach dotyczących inżynierii oprogramowania. W trakcie tego modułu zostanie omówionych siedem zasad skutecznego działania:

    • Bądź proaktywny;
    • Zaczynaj mając koniec na względzie;
    • Aby rzeczy pierwsze były pierwsze;
    • Myśl o obopólnej korzyści;
    • Najpierw staraj się zrozumieć;
    • Dbaj o synergię;
    • Ostrz piłę.
  • Specyfikacja wymagań (3 godz.). Wymagania opisują system informatyczny, jaki należy zbudować. W trakcie modułu zostaną omówione wymagania funkcjonalne oraz pozafunkcjonalne. Wymagania funkcjonalne opisują, co system ma robić. Ponadto zaprezentowane zostaną przypadki użycia, jako metoda specyfikacji wymagań funkcjonalnych. Wymagania pozafunkcjonalne dotyczą takich aspektów, jak wydajność, użyteczność, niezawodność i bezpieczeństwo. Zostanie też omówiony model Sommerville’a-Sawyera dotyczący dojrzałości procesów związanych z tzw. inżynierią wymagań.
  • Kontrola jakości artefaktów (2 godz.). Jeśli warto coś robić, to warto to robić dobrze. Ta prawda w szczególny sposób odnosi się do systemów informatycznych. Ale jak w efektywny sposób sprawdzić, czy specyfikacja wymagań albo kod programu zostały dobrze napisane? W trakcie tego wykładu podjęta zostanie próba odpowiedzi na to pytanie. Najpierw zostanie krótko omówione pojęcie jakości oraz testowanie, które jest bardzo popularną metodą kontroli jakości kodu. Ale jakość należy oceniać nie tylko w stosunku do kodu. Bardzo ważna jest kontrola jakości w odniesieniu do specyfikacji wymagań. W trakcie wykładu przedstawimy inspekcje jako bardzo ogólną metodę kontroli jakości, którą można stosować zarówno do kodu, jak i do innych artefaktów związanych z oprogramowaniem (np. specyfikacji, testów, dokumentacji). Ponadto zaprezentowane zostaną metody szacowania liczby defektów, jakie pozostały nie wykryte w danym artefakcie.
  • Język UML (5 godz.). Jest to język modelowania systemów informatycznych i ma w inżynierii oprogramowania bardzo duże znaczenie. W trakcie tego modułu zostaną przedstawione następujące zagadnienia:
    • historia i geneza języka UML
    • koncepcja modeli UML
    • modelowanie funkcjonalności
    • diagram klas,
    • diagram obiektów,
    • diagram komponentów,
    • diagram pakietów,
    • diagramy interakcji,
    • rodzaje komunikatów,
    • diagramy stanu i czynności,
    • mechanizm rozszerzeń UML,
    • język OCL,
    • narzędzia związane z językiem UML.
  • Metody formalne (3 godz.). Wielu naukowców jest przekonanych, że wytwarzanie niezawodnego oprogramowania musi być oparte na metodach o charakterze matematycznym. Jak zauważył E.W. Dijkstra, testowanie może pokazać, że oprogramowanie ma błędy, ale nie można w ten sposób wykazać, że jest ono wolne od błędów. W ramach tego wykładu przedstawione zostaną specyfikacje aksjomatyczne bazujące na notacji RAISE, implementacje niestandardowe oraz sieci Petri’ego jako graficzną i w pełni formalną metodę opisu systemów informatycznych.
  • Wzorce projektowe (2. godz.). Według Christophera Alexandra, wzorzec projektowy jest to sprawdzona koncepcja rozwiązania powtarzającego się wielokrotnie problemu, opisana w sposób abstrakcyjny. To podejście, wywodzące się z architektury, zostało w latach 90. przeniesione na grunt informatyki. W trakcie wykładu zostaną przedstawione geneza wzorców i katalog wzorców projektowych zaproponowany przez tzw. Bandę Czterech oraz zostaną omówione wybrane wzorce projektowe wraz z ich zastosowaniami.
  • Zarządzanie konfiguracją (2. godz.). Zmiany dotyczące oprogramowania są nieuniknione. Są one inicjowane zarówno przez klienta (który dopiero po pewnym czasie zdaje sobie sprawę, jak faktycznie powinien działać budowany dla niego system), jak i przez samych programistów (którzy dopiero w trakcie realizacji zdają sobie sprawę z ograniczeń związanych z przyjętym podejściem i stosowanymi narzędziami). Aby zapanować nad zmianami i uniknąć chaosu, konieczne jest sprawne zarządzanie konfiguracją. W trakcie wykładu zostaną omówione podstawowe operacje systemu CVS, struktura plików związanych z przedsięwzięciem i wzorce zarządzania konfiguracją.
  • Wprowadzenie do testowania (2 godz.). Testowanie jest najpopularniejszą metodą kontroli jakości kodu. W trakcie wykładu zostaną omówione podstawowe zasady dotyczące testowania i rodzaje testów. Zostaną też przedstawione dwa podstawowe podejścia do testowania: metoda czarnej i białej skrzynki. Zaprezentowane zostaną również relacje między testowaniem a inspekcjami.
  • Automatyzacja wykonywania testów (2 godz.). Coraz więcej jest narzędzi automatyzujących wykonywanie testów. Niekiedy można wręcz odnieść wrażenie, że wystarczy kupić odpowiednie narzędzie, a ono nam rozwiąże wszelkie problemy związane z testowaniem. Niestety, nie jest to takie proste. W trakcie wykładu zostaną omówione wady i zalety automatyzacji testowania, zostanie też zaprezentowane narzędzie JUnit służące do automatycznego wykonywania testów na programach napisanych w języku Java.
  • Programowanie Ekstremalne (2 godz.). Jedną z najbardziej popularnych metodyk wytwarzania oprogramowania jest Programowanie Ekstremalne (w skrócie XP). Zostało ono opracowane przez Kenta Becka pod koniec lat 90-tych ubiegłego wieku. W trakcie wykładu zostanie zaprezentowany manifest zwinności prezentujący zasady, na których – między innymi – opiera się Programowanie Ekstremalne. Zostaną także omówione wartości i główne praktyki XP oraz czynniki ryzyka związane z tą metodyką.
  • Ewolucja oprogramowania i refaktoryzacja (2 godz.). Zmiany są nieuniknione, również w odniesieniu do oprogramowania. W trakcie tego wykładu zostaną omówione: prawa Lehmana dotyczące ewolucji oprogramowania, pielęgnacja oprogramowania i związane z nią koszty oraz refaktoryzacja jako technika bezpiecznego wprowadzania zmian do kodu.

Literatura

  1. K.Beck, A.Cynthia, Wydajne programowanie – Extreme Programming, Mikom, 2005.
  2. A. Cockburn, Jak pisać efektywne przypadki użycia, WNT, Warszawa 2004.
  3. S.Covey, 7 nawyków skutecznego działania REBIS, 2002.
  4. M.Fowler, K.Scott, UML w kropelce, LTP, 2002.
  5. R. Pressman, Software Engineering, McGraw-Hill, New York 1997.

Moduły


Wykłady

  1. Wprowadzenie
  2. Zasady skutecznego działania
  3. Specyfikacja wymagań
  4. Kontrola jakości artefaktów
  5. Język UML cz. I
  6. Język UML, cz. II
  7. Metody formalne
  8. Wzorce projektowe
  9. Zarządzanie konfiguracją oprogramowania
  10. Wprowadzenie do testowania
  11. Automatyzacja wykonywania testów
  12. Programowanie Ekstremalne
  13. Ewolucja oprogramowania i refaktoryzacja