- definiowanie problemu,
- określanie wymagań,
- planowanie,
- projektowanie architektury,
- projektowanie szczegółowe,
- pisanie kodu i debugowanie,
- testy jednostkowe,
- testy integracyjne,
- integrowanie,
- testy systemowe,
- konserwowanie (pielęgnowanie) systemu.
(Kod doskonały, s. 39)
Główne czynności wchodzące w skład programowania to projektowanie, pisanie kodu, debugowanie, integrowanie składników i testy programisty (jednostkowe oraz integracyjne).
(Kod doskonały, s. 42)
Najpierw decydujesz, jaki rodzaj domu ma zostać zbudowany - odpowiada to w programowaniu fazie definiowania problemu. Następnym krokiem jest opracowanie we współpracy z architektem ogólnego projektu i uzyskanie jego akceptacji, co jest analogią fazy projektowania architektury oprogramowania. Rysujesz plany i schematy, po czym podpisujesz umowę z wykonawcą. Przypomina to fazę projektowania szczegółowego w programowaniu. Przygotowujesz plac budowy, wylewasz fundamenty, stawiasz ściany i dach, montujesz instalacje. To etap programowania lub budowy oprogramowania. Gdy dom jest gotowy, architekci wnętrz, krajobrazu i dekoratorzy starają się nadać jego konstrukcji możliwie korzystny wygląd. Można to porównać do optymalizacji oprogramowania. W trakcie całego procesu towarzyszą nam najróżniejsi inspektorzy, którzy kontrolują przygotowanie placu budowy, wykonanie fundamentu, ścian, dachu, instalacji i innych elementów. Podobnie kontrolowane są poszczególne elementy oprogramowania i całość przygotowywanego systemu.
(Kod doskonały, s. 51)
- organizacja programu,
- podstawowe klasy programu,
- organizacja danych,
- reguły biznesowe,
- projekt interfejsu użytkownika,
- zarządzanie zasobami,
- zabezpieczenia,
- wydajność,
- skalowalność,
- współdziałanie,
- internacjonalizacja i lokalizacja,
- wejście-wyjście,
- przetwarzanie błędów,
- zabezpieczenia przed awariami,
- wykonalność,
- nadmiar konstrukcyjny,
- kupować czy budować,
- decyzje o wykorzystaniu istniejącej bazy,
- strategia zmian.
(Kod doskonały, ss. 78-86)
Zarządzanie złożonością to najważniejsze zagadnienie w procesie tworzenia oprogramowania (...) Na poziomie architektury złożoność problemu redukuje podział na podsystemy. Człowiekowi łatwiej jest zrozumieć kilka prostych elementów niż jeden skomplikowany. Celem wszystkich technik projektowania oprogramowania jest więc uzyskanie podziału złożonego problemu na proste części. Im bardziej niezależne są podsystemy, tym bezpieczniej można koncentrować się na wybranych elementach złożonej całości. Dobrze zaprojektowane obiekty oddzielają więc różne mechanizmy, pozwalające pracować nad każdym z nich niezależnie.
Dwie podstawowe metody radzenia sobie ze złożonością:
- redukowanie liczby istotnych składowych złożoności, z którymi człowiek musi mieć do czynienia jednocześnie,
- unikanie wprowadzania złożoności akcydentalnej.
(Kod doskonały, ss. 114-115)
- minimalny poziom złożoności,
- łatwość wprowadzania zmian,
- luźne wiązanie,
- rozszerzalność,
- możliwość ponownego użycia,
- wysokie zwielokrotnienie wejściowe,
- niskie lub średnie zwielokrotnienie wyjściowe,
- przenośność,
- szczupłość,
- stratyfikacja,
- standardowe metody.
(Kod doskonały, ss. 116-117)
- System.
- Podział na podsystemy lub pakiety.
- Podział na klasy.
- Podział na procedury.
- Wewnętrzne projektowanie procedur.
(Kod doskonały, ss. 117-122)
- identyfikacja obiektów i ich atrybutów (metod oraz danych),
- określenie, co można zrobić z każdym obiektem,
- określenie dla każdego obiektu, co może on robić z innymi obiektami,
- określenie, które części każdego z obiektów będą widoczne dla innych obiektów, które składowe będą publiczne, a które prywatne,
- zdefiniowanie interfejsu publicznego każdego obiektu.
(Kod doskonały, s. 123)
- Znajdź obiekty świata rzeczywistego.
- Buduj spólne abstrakcje.
- Hermetyzuj szczegóły implementacji.
- Stosuj dziedziczenie - gdy upraszcza to projekt.
- Ukrywaj tajemnice (ukrywanie informacji).
- Identyfikuj obszary potencjalnych zmian.
- Zachowaj luźne powiązania.
- Szukaj typowych wzorców projektowych.
(Kod doskonały, s. 144)
- modelowanie obiektów świata rzeczywistego,
- modelowanie obiektów abstrakcyjnych,
- redukowanie złożoności,
- izolowanie złożoności,
- ukrywanie szczegółów implementacji,
- ograniczanie skutków zmian,
- ukrywanie danych globalnych,
- usprawnianie przekazywania parametrów,
- centralizowanie kontroli,
- ułatwianie ponownego użycia kodu,
- planowanie pod kątem rodziny programów,
- łączenie pokrewnych operacji,
- wykonywanie określonej refraktoryzacji.
(Kod doskonały, ss. 191-192)