Pracuję w hurtowni danych, która pozyskuje wiele systemów za pośrednictwem wielu strumieni i warstw z zależnościami przypominającymi labirynt łączącymi różne artefakty. Prawie każdego dnia spotykam się z takimi sytuacjami: uruchamiam coś, to nie działa, przeglądam mnóstwo kodu, ale godziny później zdaję sobie sprawę, że udało mi się konceptualizować mapę procesu niewielkiej części tego, co teraz wiem później tego dnia jest wymagane, więc pytam kogoś, a oni mówią mi, że ten drugi strumień musi być najpierw uruchomiony i że jeśli sprawdzę tutaj (wskazując na pozornie dowolną część ogromnego stosu innych zakodowanych zależności), to bym miał widzieć to. To niezwykle frustrujące.
Gdybym był w stanie zasugerować zespołowi, że być może dobrym pomysłem byłoby uczynienie więcej, aby uczynić zależności między obiektami bardziej widocznymi i oczywistymi, zamiast osadzać je głęboko w rekurencyjnych poziomach kodu, a nawet w danych, które musi być obecny, ponieważ wypełnia go inny strumień, być może odwołując się do dobrze znanego, wypróbowanego i przetestowanego paradygmatu oprogramowania - wtedy mogę uprościć swoją pracę, a wszyscy inni są o wiele prostsi.
Trudno mi wyjaśnić mojemu zespołowi korzyści z tego. Zwykle akceptują rzeczy takimi, jakimi są, i nie „myślą za dużo”, widząc korzyści płynące z możliwości konceptualizacji całego systemu w nowy sposób - tak naprawdę nie widzą tego, jeśli można modelować ogromny system sprawniej, dzięki temu jest mniej prawdopodobne, że napotkasz niewydolność pamięci, zatrzymywanie strumienia unikatowych ograniczeń i duplikatów kluczy, bzdurnych danych, ponieważ znacznie łatwiej jest zaprojektować je zgodnie z pierwotną wizją, a później nie napotkasz tych wszystkich problemów, które doświadczamy teraz, co, jak wiem, jest niezwykłe z wcześniejszych prac, ale wydaje się, że są one uważane za nieuniknione.
Czy ktoś wie o paradygmacie oprogramowania, który podkreśla zależności, a także promuje wspólny model koncepcyjny systemu w celu zapewnienia długoterminowego przestrzegania ideału? W tej chwili mamy ogromny bałagan, a rozwiązaniem każdego sprintu wydaje się być „po prostu dodaj tę rzecz tutaj i tu i tutaj”, a ja jestem jedynym, który martwi się, że sprawy naprawdę zaczynają się rozpadać.
źródło
Odpowiedzi:
Wykrywalność
Jego brak nęka wiele organizacji. Gdzie jest to narzędzie, które Fred ponownie zbudował? Oczywiście w repozytorium Git. Gdzie?
Wzorem oprogramowania, który przychodzi na myśl, jest Model-View-ViewModel. Dla niewtajemniczonych ten wzór jest całkowitą tajemnicą. Wyjaśniłem to mojej żonie jako „pięć widżetów unoszących się nad stołem i rozmawiających ze sobą za pośrednictwem jakiejś tajemniczej siły”. Zrozumieć wzór i rozumiesz oprogramowanie.
Wiele systemów nie udokumentowało swojej architektury, ponieważ zakładają, że jest to oczywiste lub naturalnie wyłania się z kodu. Nie jest i nie jest. O ile nie używasz dobrze zdefiniowanej architektury, nowi ludzie się zgubią. Jeśli nie jest to udokumentowane (lub dobrze znane), nowe osoby zgubią się. A weterani też się zgubią, gdy będą od kilku miesięcy nieobecni w kodzie.
Obowiązkiem zespołu jest opracowanie rozsądnej architektury organizacyjnej i udokumentowanie jej. Dotyczy to np
Na zespole spoczywa obowiązek zorganizowania i odkrycia rzeczy, aby zespół nie wymyślał koła na nowo.
Nawiasem mówiąc, koncepcja, że „kod powinien być samodokumentujący” jest tylko częściowo poprawna. Chociaż prawdą jest, że kod powinien być wystarczająco przejrzysty, abyś nie musiał wyjaśniać każdego wiersza kodu komentarzem, relacje między artefaktami, takimi jak klasy, projekty, zespoły, interfejsy i tym podobne są nieoczywiste i nadal muszą być udokumentowane.
źródło
Najlepszym sposobem podejścia do tego rodzaju problemów jest stopniowe. Nie denerwuj się i proponuj szerokie, szerokie zmiany architektoniczne. Te nigdy nie zostaną zatwierdzone, a kod nigdy się nie poprawi. Zakłada się, że możesz nawet określić prawidłowe szerokie, szeroko zakrojone zmiany architektoniczne, które należy wprowadzić, co jest mało prawdopodobne.
Co to jest prawdopodobne, że można ustalić mniejszą zmianę, która pomogłaby Ci specyficzny problem po prostu rozwiązać. Może odwracanie pewne zależności, dodając jakąś dokumentację, tworząc interfejs, pisząc skrypt, który ostrzega o brakującym uzależnienia itp Więc proponuję , że zamiast mniejszą zmianę. Co więcej, w zależności od kultury firmy mogą tolerować, a nawet oczekiwać, że wprowadzisz takie ulepszenia w ramach swojego pierwotnego zadania.
Kiedy uczynisz te mniejsze zmiany regularnymi częściami swojej pracy, a na twoim przykładzie zachęcisz innych do zrobienia tego, z czasem naprawdę się sumują. Znacznie bardziej efektywne niż narzekanie na pojedyncze większe zmiany, których nie wolno wprowadzać.
źródło
Architektura.
Nie ma jednej, konkretnej, uniwersalnej zasady lub praktyki, która rozwiązałaby problemy związane z wykrywalnością i utrzymywalnością, które dotyczyłyby wszystkich aspektów całego oprogramowania. Ale szerokim pojęciem rzeczy, które sprawiają, że projekt jest rozsądny, jest architektura.
Twoja architektura zawiera cały zestaw decyzji dotyczących każdego punktu potencjalnego (lub historycznego) zamieszania - w tym określenie, w jaki sposób decyzje architektoniczne są podejmowane i dokumentowane. Wszystko, co dotyczy procesu programowania, struktury folderów, jakości kodu, wzorców projektowych itp., To wszystko, co może się pojawić w Twojej architekturze, ale żadna z nich nie jest architekturą.
Idealnie, zasady te są ujednolicone przez osobliwość umysłu.
Mały zespół z pewnością może wspólnie tworzyć architekturę. Ale przy różnych opiniach może to szybko doprowadzić do bardzo schizofrenicznej architektury, która nie służy utrzymaniu twojego zdrowia psychicznego. Najprostszym sposobem, aby zapewnić, że twoja architektura, a także wiele TLA i wzorce w nich zawarte, służą sukcesowi zespołu ze szczególnym umysłem, to uczynienie jednego umysłu odpowiedzialnym za nie.
To niekoniecznie wymaga „architekta” do pontyfikatu . I chociaż niektóre zespoły mogą chcieć, aby doświadczona osoba po prostu podejmowała takie decyzje, najważniejsze jest to, że ktoś musi posiadać architekturę, zwłaszcza gdy zespół rośnie. Ktoś trzyma rękę na pulsie zespołu, moderuje dyskusje architektoniczne, dokumentuje decyzje, monitoruje decyzje i kontynuuje prace nad przestrzeganiem architektury i jej etosu.
Nie jestem wielkim fanem żadnej osoby podejmującej wszystkie decyzje; ale, identyfikacji „architekt” lub „właściciel technicznej produktu”, który jest odpowiedzialny za moderowanie dyskusji architektonicznych i dokumentowania decyzji zwalcza większe zło: Dyfuzja odpowiedzialności, która prowadzi do żadnego dostrzegalnego architektury.
źródło
Witamy w inżynierii oprogramowania (w obu aspektach);) To dobre pytanie, ale tak naprawdę nie ma łatwych odpowiedzi, jak jestem pewien. Jest to naprawdę przypadek ewoluowania w kierunku lepszych praktyk w czasie, szkolenia ludzi do większej umiejętności (z definicji większość ludzi w branży ma przeciętne kompetencje) ...
Inżynieria oprogramowania jako dyscyplina cierpi z powodu budowania go w pierwszej kolejności i projektowania mentalności „na bieżąco”, częściowo z konieczności, a częściowo z konieczności. Jest to po prostu natura bestii. I z czasem hacki są budowane na hakach, ponieważ wyżej wspomniani koderzy szybko wdrażają funkcjonalne rozwiązania, które często zaspokajają krótkoterminowe potrzeby często kosztem wprowadzenia długu technicznego.
Paradygmat, którego potrzebujesz, to w zasadzie zdobywanie lepszych ludzi, szkolenie ludzi, których dobrze znasz, i podkreślanie znaczenia poświęcania czasu na planowanie i architekturę. Nie można łatwo być tak „zwinnym” podczas pracy z układem monolitycznym. Wprowadzenie nawet niewielkich zmian może wymagać znacznego planowania. Wprowadzenie doskonałego procesu dokumentacji na wysokim poziomie pomoże również kluczowym osobom szybciej opanować kod.
Pomysły, na których możesz się skupić, to (z czasem, stopniowo) izolowanie i refaktoryzacja kluczowych części systemu w sposób, który czyni je bardziej modułowymi i oddzielonymi, czytelnymi i łatwymi do utrzymania. Sztuczka polega na tym, że jest to zgodne z istniejącymi wymaganiami biznesowymi, dzięki czemu redukcję długu technicznego można osiągnąć jednocześnie z widoczną wartością biznesową. Tak więc rozwiązaniem jest po części doskonalenie praktyk i umiejętności, a po części próba przejścia w kierunku długoterminowego myślenia architektonicznego, jak już mogę powiedzieć.
Zauważ, że odpowiedziałem na to pytanie z perspektywy metodologii tworzenia oprogramowania, a nie z perspektywy techniki kodowania, ponieważ tak naprawdę jest to problem znacznie większy niż szczegóły kodowania, a nawet styl architektoniczny. To naprawdę pytanie, jak planujesz zmiany.
źródło
Podoba mi się pomysł @ RobertHarvey na konwencje i myślę, że one pomagają. Podoba mi się również pomysł @ KarlBielefeldt, aby „dokumentować w ruchu” i wiem, że jest to niezbędne, ponieważ jest to jedyny sposób na utrzymanie aktualności dokumentacji. Ale myślę, że nadrzędnym pomysłem jest to, że dokumentowanie, jak znaleźć wszystkie fragmenty kodu, zbudować je i wdrożyć, jest ważne!
Niedawno wysłałem e-mailem do znaczącego projektu open source, który miał pewną konfigurację XML, która generowała kod, który był całkowicie nieudokumentowany. Zapytałem opiekuna: „Gdzie udokumentowano proces generowania kodu XML? Gdzie udokumentowano konfigurację testowej bazy danych?” i powiedział: „To nie jest”. Zasadniczo jest to projekt jednoosobowy, a teraz wiem, dlaczego.
Słuchaj, jeśli jesteś tą osobą i czytasz to, naprawdę doceniam to, co robisz. Praktycznie czczę owoce waszej pracy! Ale jeśli spędziłeś godzinę na dokumentowaniu tego, jak twoja naprawdę twórcza praca jest złożona, może spędzę kilka dni na kodowaniu nowych funkcji, które mogą ci pomóc. W obliczu ceglanego muru „brak dokumentacji nie stanowi problemu”, nawet nie spróbuję.
W firmie brak dokumentacji to ogromna strata czasu i energii. Takie projekty często trafiają do konsultantów, którzy kosztują jeszcze więcej, tylko po to, aby mogli dowiedzieć się podstawowych rzeczy, takich jak „gdzie są wszystkie elementy i jak się do siebie pasują”.
Podsumowując
Potrzebna jest nie tyle technologia czy metodologia, co zmiana kultury; wspólne przekonanie, że dokumentowanie budowy rzeczy i dlaczego jest ważne. Powinien być częścią recenzji kodu, wymaganiem przejścia do produkcji, powiązanym z podwyżkami. Kiedy wszyscy w to wierzą i działają zgodnie z tym, wszystko się zmieni. W przeciwnym razie będzie to jak mój nieudany wkład open source.
źródło
Aby odpowiedzieć na postawione pytanie (zamiast udzielać porad dotyczących konkretnej sytuacji):
Paradygmat programowania znany jako czystym programowaniem funkcjonalnym wymaga, aby wszystko, co wpływa na wynik funkcji, musi być określone w parametrach wejściowych. Nie ma ukrytych zależności, zmiennych globalnych ani innych tajemniczych sił działających niewidocznie w całej bazie kodu. Nie ma „musisz zrobić to najpierw” sprzężenie czasowe.
źródło
Każda hurtownia danych jest inna, ale możesz zrobić wiele, aby ułatwić sobie życie.
Na początek każdy wiersz w bazie danych miał kolumnę DATE_ADDED i DATA_UPDATED , abyśmy mogli zobaczyć, kiedy został dodany do bazy danych i kiedy został zmieniony. Mieliśmy również kolumnę SOURCE_CODE , abyśmy mogli śledzić, gdzie każdy kawałek danych wchodzi do systemu.
Następnie mieliśmy wspólne narzędzia, które działały we wszystkich naszych hurtowniach danych, takie jak sortowania, dopasowania tabel, krajalnice i dicery itp.
Indywidualny kod był ograniczony do absolutnego minimum i nawet wtedy musiał potwierdzać różne style kodowania i raportowania.
Zakładam, że znasz już ETL pakiety . Istnieje wiele funkcji, które otrzymujesz za darmo w tych dniach, które nie były obecne, kiedy byłem w grze jakieś dziesięć lat temu.
Możesz także spojrzeć na rzutniki danych w celu zaprezentowania bardziej przyjaznej, odkażonej wersji hurtowni danych. Oczywiście nie jest to srebrna kula, ale może pomóc w rozwiązaniu niektórych problemów zamiast konieczności odbudowywania / poprawiania hurtowni danych.
źródło
Nie wiem, jak istotne jest to w twoim przypadku, istnieją pewne strategie, które sprawiają, że zależności są bardziej widoczne i ogólne utrzymanie kodu
źródło