Jak ludzie zwykle bardzo szybko zwracają uwagę, jedną z zalet oprogramowania jest to, że jego wymiana w porównaniu ze sprzętem powinna być łatwa i stosunkowo tania. Jest to szczególnie ważne, gdy późno zdasz sobie sprawę, że masz coś zasadniczo nie tak. Zrób to samo ze sprzętem, a stracisz milion dolarów, więc, jak powiedziałeś, używasz symulatorów itp. I testujesz na nim bazingę. Wydaje mi się, że w tym przypadku paradygmat zawodzi, gdy przechodzisz na oprogramowanie.
Wejdź do głowy przeciętnego programisty, a to, co masz, to bardzo zajęta osoba z niewiarygodnie krótkim terminem. Jego menedżer twierdzi, że można zostawić kilka błędów, ponieważ zawsze można to naprawić później. Testy są często przemyślane, ale nawet w scenariuszu opartym na testach testy są utrzymywane na minimalnym poziomie, a kod jest zapisywany na minimum testów, a często są stosowane skróty, aby można było pominąć wiele przypadków granicznych. System może być dokładnie testowany jednostkowo, ale rzadko jest rygorystycznie testowany jako całość, a równie rzadko w dużym stopniu testowany pod obciążeniem. Dodaj do tego, że piszesz oprogramowanie od zera, a istnieje niewielka szansa na symulację oprogramowania, zanim zdecydujesz się go napisać, głównie dlatego, że rzadko piszemy oprogramowanie z tego samego rodzaju drobnoziarnistych elementów konstrukcyjnych, które można znaleźć w sprzęcie.
Powrót do pytania PO. Czy potrafisz zdefiniować system bloków konstrukcyjnych, z których będzie czerpać całe oprogramowanie? Możliwie. Czy byłoby to bardzo opłacalne? Prawdopodobnie nie, ponieważ zanim zaczniesz opracowywać wystarczająco solidny system komponentów, testów i innych akcesoriów, aby wesprzeć ten ideałsystem programowania, przekonasz się, że konkurencja pokonałaby cię już na rynku, a co gorsza, z punktu widzenia przeciętnego programisty prawdopodobnie znalazłbyś styl programowania typu „ciasteczka”, który jest bardzo ograniczający i bardziej prawdopodobne nudny. Osobiście pracuję nad interfejsem API, w którym większość kodu modułu została dopracowana i ujednolicona tak całkowicie, że teraz wszystko, co robię, to wygenerowanie szablonu kodu i wypełnienie pustych pól. Większość czasu spędzam na pisaniu prostego kodu złącza i jak najszybszym wyciągnięciu modułów z drzwi. Poważnie odrętwia umysł. Jest bardzo mało okazji do zrobienia więcej niż tylko kodowania tego samego rodzaju rzeczy w kółko, więc kiedy pojawia się kolejna szansa na projekt, podskakuję na okazję, by móc zrobić WSZYSTKO.
Jak więc uzyskać wysokiej jakości i dobrze przemyślane oprogramowanie, a jednocześnie czerpać z tego przyjemność? Wierzę, że sprowadza się to do wyboru narzędzi i metodologii. Dla mnie odpowiedzią było zastosowanie dobrego API BDD, ponieważ pozwoliło mi to na stworzenie bardzo łatwego do odczytania, ale bardzo szczegółowego kodu. Potrafię zbudować zestaw testów z minimalnej liczby metod wielokrotnego użytku i opisać je w języku specyfikacji. W ten sposób zbliżam się do bardziej złożonego podejścia programistycznego, z wyjątkiem tego, że jestem odpowiedzialny za projektowanie i sprawdzanie bloków konstrukcyjnych. Ponadto dane wyjściowe testu wskazują dokładną część testu, w której występuje awaria, dzięki czemu nie muszę zgadywać, czy awarie występują w konfiguracji, czy w stwierdzeniu.
Pomaga także dostosowanie metodologii. Jestem wielkim zwolennikiem stosowania zasad Lean Development i łączenia ich z wieloma innymi technikami i zasadami, o których ruch Agile walczy od wielu lat. Po wyeliminowaniu większości marnotrawnych praktyk, które uważałem za tak frustrujące, bardzo pomogłem uczynić rozwój przyjemniejszym. Nadal mam problem z tym, że czasami - ale mam nadzieję, że niezbyt często - błędy pojawią się w moim kodzie, ale teraz mam więcej czasu i jeszcze więcej motywacji, by spędzać więcej czasu na pisaniu solidniejszych testów i dążeniu do 100 % pokrycia testowego. Co więcej, naprawdę fajnie jest widzieć te wszystkie zielone światła, które pojawiają się pod koniec mojego dnia,