W pobocznym komentarzu tego wątku Narzędzia wspomagajace pisanie kodu a plagiaty i licencje wirusowe zaczęliśmy sobie dyskutować o czymś, co nie ma większego znaczenia, ale chyba warto przegadać temat.
W tradycyjnej inżynierii celem jest stworzenie czegoś materialnego. Architekt, czy projektant przygotowuje projekt, następie wykonawcy stawiają ściany, kładą instalacje, podłogi, tynki itd. Po tym etapie zmiana czegokolwiek w projekcie jest trudne i kosztowne, odzyskanie raz zużytych materiałów praktycznie nie możliwe.
W uproszczeniu mamy projekt za 5000 złotych, wytworzenie tego co on definiuje, kosztuje 500 000 zł. Możliwe, że z czasem rozwój technologii w budownictwie spowoduje, że koszty replikacji spadną (roboty, inne materiały), ale na razie jest tak jak napisałem.
Dla odmiany w programowaniu produktem jest instrukcja dla maszyny, w jaki sposób powinna działać. Powstaje ona od poziomu ogólnego do coraz bardziej szczegółowego:
- Chcę system który potrafi dodawać liczby wprowadzone przez użytkownika.
- Parametry i wynik mają być przyjmowane jako parametry żądania http.
- Usługa ma działać w chmurze.
4 Deploy usług ma się odbywać zgodnie z definicją umieszczoną w CD. - Ktoś wpisuje
return a+b
, co stanowi ostateczne uszczegółowienie tego co i jak system ma robić. - Wpisujemy git push i następuje wykonanie wcześniej zaplanowanych czynności, usługa staje się dostępna.
Kwestią drugoplanową jest, czy w trakcie któregoś z tych kroków powstaje diagram UML, dokument w Wordzie, czy jedziemy na żywca z kodem i czy robi to wszystko jedna osoba, czy 50 osobowy zespół. Większość czasu i kosztów tego projektu jest związane z pisaniem (dokumentacji, lub kodu), zaledwie drobna część z faktycznym deploymentem, aka "produkcją". To sugeruje, że metody stosowane w tradycyjnej inżynierii ni jak się mają do tworzenia oprogramowania, a praktycznie całość procesu tworzenia oprogramowania, to tak na prawdę coś, co można nazwać "projektowaniem" na coraz wyższych stopniach precyzji.
O ile w przypadku domu projekt to 2% jego wartości, to w przypadku systemu komputerowego projektem jest 99.99% Jeżeli usługa sieciowa nie przemawia, to pomyślcie o grze - "wyprodukowanie" egzemplarza gry to pobranie jej przez użytkownika. Błędy to skutki tego, że ktoś nie zaprojektował czegoś, lub zrobił to niedostatecznie starannie i nie zalicza nam jakiegoś lvl, pomimo zastrzelenia bossa. Zmiana definicji co i jak ta gra ma robić jest stosunkowo prosta (dobra, bywa różnie, ale wciąż, to nie przebudowa domu publicznego na kościół). Rozpropagowanie tej poprawki, to grosze.
Teza:
Blisko 100% tworzenia oprogramowania to tworzenie (uwaga, abstrakcja) projektu co i w jaki sposób, to oprogramowanie ma robić.