Wzrost złożoności systemów jest nieustępliwy, uciążliwy i ostatecznie okaleczający. Dla mnie, jako programisty starszej generacji, jest to również bardzo rozczarowujące.
Programuję od ponad 40 lat, pisząc kod w 50-100 różnych językach lub dialektach, i staję się ekspertem w 5-10. Powodem, dla którego mogę twierdzić tak wielu, jest to, że przeważnie są one w tym samym języku, z drobnymi poprawkami. Ulepszenia zwiększają złożoność, dzięki czemu każdy język jest nieco inny.
Wdrożyłem te same algorytmy niezliczoną ilość razy: kolekcje, konwersje, sortowanie i wyszukiwanie, kodowanie / dekodowanie, format / parsowanie, bufory i łańcuchy, arytmetyka, pamięć, operacje we / wy. Każda nowa implementacja dodaje złożoności, ponieważ każda jest tylko trochę inna.
Zastanawiam się nad magią stworzoną przez wysoko latających artystów trapezowych z ram internetowych i aplikacji mobilnych, z tego, jak potrafią wyprodukować coś tak pięknego w tak krótkim czasie. Wtedy zdaję sobie sprawę, jak bardzo nie wiedzą, ile będą musieli dowiedzieć się o danych, komunikacji, testowaniu, wątkach lub czymkolwiek, zanim to, co zrobią, stanie się przydatne.
Nauczyłem się swojego rzemiosła w erze języków czwartej generacji, gdzie szczerze wierzyliśmy, że stworzymy serię języków na wyższym i wyższym poziomie, aby stopniowo przechwytywać coraz więcej powtarzających się części oprogramowania do pisania. Jak to się dokładnie skończyło?
Microsoft i IBM zabili ten pomysł, wracając do C w celu pisania aplikacji dla systemu Windows i OS / 2, podczas gdy dBase / Foxpro, a nawet Delphi, marnowali. Następnie sieć zrobiła to ponownie, wykorzystując swoje najlepsze trio języków asemblacyjnych: HTML, CSS i JavaScript / DOM. Stamtąd wszystko było z górki. Zawsze więcej języków i więcej bibliotek oraz więcej frameworków i większa złożoność.
Wiemy, że powinniśmy robić to inaczej. Wiemy o CoffeeScript i Dart, o Less i Sass, o szablonie, aby uniknąć konieczności pisania HTML. Wiemy i tak robimy. Mamy nasze frameworki, pełne nieszczelnych abstrakcji i widzimy, jakie cuda mogą zrobić ci wybrani, którzy uczą się tajemnych zaklęć, ale my i nasze programy jesteśmy uwięzieni w decyzjach podjętych w przeszłości. Zmiana lub rozpoczęcie od nowa jest zbyt skomplikowane.
W rezultacie rzeczy, które powinny być łatwe, nie są łatwe, a rzeczy, które powinny być możliwe, są prawie niemożliwe z powodu złożoności. Potrafię oszacować koszt wprowadzenia zmian w celu wprowadzenia nowej funkcji w ustalonej bazie kodu i mieć pewność, że będę miał rację. Potrafię oszacować, ale nie mogę tego uzasadnić ani wyjaśnić. To zbyt skomplikowane.
W odpowiedzi na twoje ostatnie pytanie zdecydowanie zalecam młodszym programistom, aby zaczynali tak wysoko od ciasta warstwowego, jak to tylko możliwe, i nurkowali tylko do niższych warstw, ponieważ potrzeba i pragnienie zapewniają impuls. Preferuję języki bez pętli, z małym rozgałęzieniem lub bez rozgałęzień i jawnym stanem. Przychodzą mi na myśl Lisp i Haskell. W praktyce zawsze kończę na C # / Java, Ruby, JavaScript, Python i SQL, ponieważ tam są społeczności.
Ostatnie słowa: złożoność jest największym wrogiem! Pokonaj to, a życie stanie się proste.