Ktoś mi wyjaśnił, że ponieważ w zwinnym programowaniu polityka i logika aplikacji powinny być ważniejsze niż szczegóły, takie jak metoda trwałości, decyzja o trwałości powinna zostać podjęta na końcu. Dobrym pomysłem może być rozpoczęcie od prostszej trwałości, takiej jak pliki płaskie, aż do momentu, gdy słabość tej metody stanie się widoczna, i dopiero wtedy zmienimy trwałość, np. Za pomocą relacyjnej bazy danych.
Czy to prawda, czy też źle zrozumiałem tę koncepcję? Czy w ten sposób zwinny zespół zwykle buduje aplikacje? Jakie są tego powody i kiedy nie powinienem przyjmować takiego podejścia?
architecture
agile
database
persistence
Louis Rhys
źródło
źródło
Odpowiedzi:
Przekazana koncepcja jest z pewnością częścią zwinnej i istotnej idei przeniesienia rzeczy do ostatniej odpowiedzialnej chwili.
Jednak podany przykład faktycznie opiera się na całkowicie fałszywym założeniu na początek:
że wdrożenie bazy danych o płaskich plikach jest łatwiejsze / mniejsze niż korzystanie z RDBMS. - Często całkowicie fałszywe
Przykładem powinno być: Warstwa trwałości jest utrzymywana do możliwie najprostszej implementacji, dopóki nie zostanie podjęta decyzja, że jest nieodpowiednia.
Dla wielu zespołów programistów przygotowanie bazy danych do zrobienia tego jest kwestią godziny lub dwóch (lub 15 minut dla małej bazy danych z ORM), podczas gdy baza danych z płaskimi plikami, z którą nie muszą się wtrącać, może być ogromny ból i irytacja, ponieważ muszą ręcznie napisać cały kod typu wyszukiwania i konstrukcji tabeli danych ręcznie, gdy baza danych może być tak prosta, jak utworzenie tabeli w interfejsie użytkownika, dodanie kilku kolumn, a następnie ORM wygeneruje wszystko inaczej potrzebujesz.
Ponadto, jeśli nie znasz swojej warstwy trwałości na początek, jeszcze bardziej odpowiednie jest rozpoczęcie od wspólnego RDBMS, który Twój zespół dobrze zna, aby zmiana późniejsza z płaskiego pliku na RDBMS była znacznie większa niż później. zmiana jednego RDBMS na inny. Istnieje wiele narzędzi do konwersji z większości popularnych RDBMS na inne takie i wskazówki, ponieważ jest to dobrze przebyta ścieżka. Istnieje bardzo niewiele narzędzi do konwersji z pliku płaskiego do dowolnego RDBMS, w którym plik płaski ma zastrzeżony format, dla którego oprzyrządowanie nie zostało wcześniej zapisane poza własnymi bibliotekami.
Podsumowując: koncepcja jest poprawna i dokładna, ale przykład oparty jest na strasznie dużym i często (prawie zawsze) niedokładnym założeniu .
źródło
Ponieważ wiesz, że będziesz używać bazy danych, pisanie kodu do obsługi plików płaskich nie ma większego sensu. Możesz przejść przez kilka iteracji przy użyciu plików CSV tylko do odczytu, ale szybko odkryjesz, że piszesz kod, o którym wiesz, że go wyrzucisz.
Jedną z rzeczy, które możesz zrobić, aby uprościć początkową złożoność, jest użycie czegoś takiego jak SQLite (biblioteka, która udostępnia bezserwerową bazę danych SQL przechowywaną w pliku). Ma elastyczny system typów, więc nie musisz poważnie przypisywać się do schematu, żaden serwer do skonfigurowania / połączenia z bazą danych i odbudowania jej nie jest tak prosty, jak usunięcie pliku. Pozwala także w razie potrzeby dołączyć obraz DB wraz z kodem do kontroli wersji.
źródło
Jest to przykład wykorzystany do przedstawienia koncepcji, a nie samej koncepcji.
Chodzi o to, że nie podejmujesz decyzji architektonicznej do ostatniej odpowiedzialnej chwili , ale nie później. Ale w rzeczywistości często podejmujesz decyzję dotyczącą bazy danych, z której będziesz korzystać bardzo wcześnie. To może nie być idealne, ale to fakt.
Po podjęciu tej decyzji nie aktywnie jej unikasz. Przechowywanie czegoś w istniejącej bazie danych jest często tak proste, jak przechowywanie go w płaskim pliku.
Ale przejście z MySql w systemie Linux na SQL Server w systemie Windows może nie być tak proste, jak przejście z płaskiego pliku w dowolnym miejscu do SQL Server w systemie Windows. To jest prawdziwy punkt. Tak więc, chociaż istnieją wątpliwości co do ostatecznego rozwiązania, wybierz najprostszą możliwą opcję, uwzględniając zmianę. Po podjęciu decyzji trzymaj się jej.
źródło
Co upierasz się?
Jestem zwinnym zespołem i dla jednej aplikacji utrzymujemy prawie wszystko w bazie danych. Pamiętaj, że gdybyśmy tego nie zrobili, to nie byłoby wiele do zrobienia dla tej aplikacji - utrwalanie rzeczy w bazie danych jest dużą częścią jej racji bytu .
Więc: co nadal trwa i co robi twoja aplikacja? Jeśli aplikacja tak naprawdę nie dba o to, gdzie przechowywane są jej dane, możesz napisać małą warstwę, która podejmie decyzję (tę decyzję można zapisać gdzieś w pliku konfiguracyjnym) pliku płaskiego kontra baza danych. Myślę, że trzeba ocenić aplikację i swoje dane i zdecydować, czy ma to sens w przypadku konkretnego zainwestować czas utrzymywania się w bazie danych, lub po prostu odczytu / zapisu plików płaski (który będzie prawdopodobnie szybciej pod względem czasu rozwój).
źródło
Wiele osób błędnie interpretuje ten aspekt zwinności, co oznacza, że nie powinni planować z wyprzedzeniem przyszłych funkcji. Nic nie może być dalej od prawdy. To, czego nie robisz, pozwala zaplanować przyszłe funkcje, aby opóźnić dostarczanie wartości swoim klientom teraz.
To, jak odnosi się to do trwałości, zależy w dużej mierze od twojej aplikacji. Jednym z moich bieżących projektów hobby jest kalkulator. W końcu chciałbym móc przechowywać stałe i funkcje zdefiniowane przez użytkownika oraz zapisywać stan po zamknięciu programu. Wymaga to wytrwałości, ale nawet nie zastanawiałem się, jaką formę by to przybierało. Mój program będzie bardzo użyteczny bez wytrwałości, a dodanie go teraz spowoduje znaczne opóźnienie mojej pierwszej wersji. Wolę mieć działający kalkulator z mniejszą liczbą funkcji niż w ogóle, czekając na jego perfekcję.
Innym moim hobby jest korekcja kolorów wideo i zdjęć. Ta aplikacja będzie całkowicie bezużyteczna bez możliwości zapisania mojej pracy w toku, a kod potrzebny do tego jest wszechobecny w całym programie. Jeśli nie rozumiem od samego początku, zmiana może być zbyt trudna, więc sporo wysiłku poświęciłem wytrwałości.
Większość projektów mieściłaby się gdzieś pomiędzy, ale nigdy nie powinieneś czuć się źle z planowaniem przyszłych funkcji, jeśli nie doda to teraz żadnego dodatkowego wysiłku. Bazy danych mogą być złożone, ale większość tej złożoności jest ukryta za solidnym, dobrze przetestowanym interfejsem. Praca, którą będziesz musiał wykonać w swojej aplikacji, może być znacznie mniejsza w przypadku bazy danych niż zwykłego pliku, ze względu na wszystkie funkcje, które baza danych oferuje za darmo. Istnieją opcje „hybrydowe”, takie jak SQLite, jeśli nie chcesz jeszcze radzić sobie z problemem serwera bazy danych.
źródło
Myślę, że koncentrujesz się na niewłaściwych wartościach. W zwinnym kluczem jest wartość biznesowa. Tworzysz produkt w celu zapewnienia wartości biznesowej niektórym użytkownikom końcowym.
Jeśli tworzysz warstwę trwałości z opóźnieniem lub nadrabiasz ją po drodze, twoja strategia dostarczania wartości biznesowej klientowi. Nie wierzę, że sam termin „zwinny” decyduje o tym, czy powinieneś to zrobić.
W tej prezentacji Robert C. Martin (jeden z autorów zwinnego manifestu) popiera pogląd na odroczenie strategii przechowywania danych .
To bardzo dobra prezentacja, mogę polecić jej obejrzenie.
Ale nie zgadzam się z tym! Przynajmniej do pewnego stopnia.
Nie wierzę, że można nazwać historię użytkownika „Gotowe”, jeśli historia użytkownika zawiera dane, które powinny zostać utrwalone, a tak naprawdę nie ma zaimplementowanego żadnego rodzaju trwałości.
Jeśli właściciel produktu zdecyduje, że teraz jest czas na uruchomienie, nie możesz tego zrobić. A jeśli nie zacząłeś wdrażać trwałości do późnej fazy projektu, nie masz również informacji o tym, ile czasu zajmie wdrożenie warstwy trwałości, pozostawiając poważne ryzyko projektu.
Zwinne projekty, nad którymi pracowałem, nie odroczyły strategii dostępu do danych. Ale został oddzielony, co pozwala nam to zmienić po drodze. A cały schemat bazy danych nie został zaprojektowany z góry. Po drodze tworzone są tabele i kolumny, ponieważ są one wymagane w celu zaimplementowania przechowywanego przez użytkownika użytkownika, który ostatecznie zapewnia wartość biznesową.
źródło
Potrzeba dobrego osądu i doświadczenia, aby zobaczyć, na które pytania należy najpierw odpowiedzieć, rozpoczynając nowy projekt.
Jeśli produkt końcowy jest nadal nieznany, szybkie budowanie / prototypowanie pomoże ci to rozgryźć, i tak, iteracja w zwinny sposób pomoże. To oczywiście wiąże się z ryzykiem, takim jak odkrycie na późnym etapie procesu, że wdrożenie uporczywości zajmie więcej czasu niż poinformowałeś swoich interesariuszy.
Jeśli produkt końcowy jest dobrze znany, ważniejsze jest wcześniejsze zrozumienie, jak wytrwałość będzie działać w aplikacji. Istnieje ryzyko, że znajdziesz problemy ze specyfikacją produktu na późniejszym etapie procesu programowania.
źródło
Pliki płaskie nie są proste!
Pozwalają na przechowywanie i to wszystko. Struktura danych, ścieżki dostępu itp. Zależą od Ciebie i istnieje wiele sposobów, aby to naprawić.
Istnieją powody, dla których istnieją bazy danych, a jednym z nich jest uproszczenie dla programistów.
Większość mojego rozwoju dotyczy dużych systemów w dużych firmach. Zawsze mamy kompletny i przemyślany model danych, zanim przystąpimy do dalszego projektowania lub rozwoju. Model danych pomaga zrozumieć problem i pozwala na czystą implementację.
Zapomnianych elementów danych, niedopasowanych struktur danych i innych koszmarów można uniknąć, tworząc model danych z góry.
Możesz pozostawić swój faktyczny wybór technologii baz danych aż do modelu danych. Ale większość technologii „trwałości” to ściśle związane programowanie, a nawet style projektowania. Jeśli kodujesz relacyjną bazę danych, a później zdecydujesz się na zmianę na chmurną wartość klucza, będziesz musiał całkowicie ponownie napisać połowę kodu.
Jeśli zaczniesz od płaskich plików i przełączysz się na relacyjną bazę danych, prawdopodobnie skończysz wyrzucaniem połowy kodu, ponieważ programiści zmarnują czas na wdrożenie słabej bazy danych.
źródło
Czy powinieneś spróbować wytrwałości w płaskim pliku przed bazą danych?
Tak, powinieneś spróbować. Zwłaszcza jeśli nigdy wcześniej tego nie próbowałeś. Bez względu na to, jak się okaże, nauczysz się czegoś.
źródło