Wymagania biznesowo-funkcjonalne MoneyStorm

Wstęp

Praktycznie każdy projekt programistyczny zaczyna się od zebrania i analizy wymagań. Nawet w przypadku niewielkiej aplikacji pisanej „na własne zlecenie”, takiej jak MoneyStorm. Najczęściej zaczyna się od jakiegoś pomysłu. A później zastanawiamy się co właściwie aplikacja ma robić i jakie funkcje udostępniać aby ten pomysł zrealizować – to jest właśnie faza analizy wymagań biznesowych i funkcjonalnych. W przypadku małych programów wynik takiej analizy często zostaje tylko i wyłącznie w głowie autora ale wydaje mi się, że nawet w takiej sytuacji warto poświęcić chwilę na spisanie tego w jakimś trwałym miejscu. Choćby po to aby w przyszłości móc wrócić do takiej analizy i sprawdzić postęp prac, zobaczyć jakie elementy systemu udało się już wykonać, a co nadal czeka na implementację. I to właśnie będzie celem niniejszego posta.

Rozmowa z klientem

W normalnych warunkach taka analiza zaczyna się od rozmowy z klientem/przyszłym użytkownikiem, ale jako że sam jestem swoim klientem będzie to raczej monolog w formie opowiadania (Minister Zdrowia ostrzega – mogą pojawić się nudne szczegóły z mojego życia prywatnego):

Od jakiegoś czasu mam problem z finansami. Nie żebym miał jakieś wielkie długi i był na skraju bankructwa ale zauważyłem, że im więcej zarabiam tym mniej mi zostaje. A co gorsze nawet nie wiem na co ta kasa idzie. Jednym słowem nie mam kontroli na własnymi wydatkami i chciałbym coś z tym zrobić. Pomyślałem sobie, że fajnie byłoby mieć jakąś aplikację, która byłaby w stanie pokazać mi na co wydaję swoje pieniądze. Wiem, w Internecie są miliony aplikacji do domowego budżetu i śledzenia wydatków – na smartfony, desktopy, webowe. W ostatnim czasie przetestowałem kilka(naście) różnych i w zasadzie nie znalazłem niczego co by mi przypadło do gustu. Najbliżej ideału był chyba GoodBudget ale w wersji darmowej miał trochę zbyt dużo ograniczeń.

Od aplikacji takiej oczekuję, że będę mógł w niej łatwo stworzyć miesięczny budżet i na bieżąco monitorować stan jego realizacji. Powinna być możliwość dodawania wydatków w trakcie miesiąca co powinno automatycznie aktualizować stan realizacji budżetu. Fajnie byłoby mieć jakąś podpowiedź czy na dany dzień miesiąca wydałem już za dużo i powinienem ograniczyć wydatki lub jestem „na plusie” i mogę zaszaleć. Jeśli chodzi o wydatki to część jest takich, na które w każdym miesiącu wydaję taką samą kwotę i najczęściej jest to wydatek jednorazowy (czynsz, prąd, internet, itp.), a część jest bardziej zmienna i rozkłada się w czasie (jedzenie, chemia, itp.). Część pieniędzy odkładam co miesiąc na różne, dobrze sprecyzowane cele (remont, nowy samochód, wakacje na Karaibach, itp.) i tutaj też chciałbym mieć możliwość śledzenia ile jeszcze zostało do uzbierania założonej kwoty. Na koniec miesiąca chciałbym mieć możliwość zobaczenia jakiegoś podsumowania na jakie kategorie wydatków przeznaczyłem ile pieniędzy i czy udało się zmieścić w wyznaczonym budżecie. Jeśli tak to ekstra i zaoszczędzoną kwotę chciałbym móc przenieść na kolejny miesiąc lub odłożyć jako dodatkową kasę na wybrany cel. Jeśli nie to trzeba ten brak uzupełnić biorąc pieniążki z innej kategorii, na której udało się zaoszczędzić lub  z rezerwy „na wszelki wypadek”, którą trzymam na koncie, ewentualnie z kolejnej wypłaty.

Analiza

Ok, pogadaliśmy z klientem, dowiedzieliśmy się jaki ma problem i jak wyobraża sobie jego rozwiązanie. Opis nie jest może zbyt szczegółowy ale już z tak krótkiego tekstu można wyciągnąć kilka kluczowych elementów systemu (są to rzeczowniki, które pojawiają się w tekście):

  • budżet
  • wydatek
  • kategoria
  • konto
  • wypłata

Druga rzecz to akcje jakie można na tych bytach wykonać:

  • zaplanowanie budżetu
  • monitorowanie budżetu
  • dodanie wydatku
  • przeniesienie pieniędzy do kategorii z innej kategorii, konta lub wypłaty

To te podstawowe, które wynikają bezpośrednio z „rozmowy” z klientem ale na pewno w trakcie prac wiele rzeczy trzeba będzie doprecyzować.

Mając na uwadze powyższe informacje mój pomysł (dość mocno inspirowany wspomnianym już wcześniej GoodBudget) rysuje się następująco:

System będzie oparty o znany i sprawdzony system zarządzania budżetem domowym zwany potocznie „systemem kopertowym” – w wersji analogowej z powodzeniem stosowany od pokoleń w wielu domach. System jest prosty i polega na tym, że na początku każdego miesiąca naszą wypłatę dzielimy pomiędzy przygotowane wcześniej koperty. Na każdej kopercie zapisujemy cel na jaki przeznaczone są umieszczone w niej pieniądze i wkładamy do środka odpowiednią kwotę. To co zostaje po operacji wypełniania kopert odkładamy do „skarpety”. W trakcie miesiąca każdy wydatek regulujemy z odpowiedniej koperty (za prąd płacimy z koperty oznaczonej „prąd”, za zakupy w spożywczaku z koperty „jedzenie”, itd.) – dzięki temu łatwo możemy sprawdzić ile nam zostało do wydania do końca miesiąca.

Jeśli chodzi o samą aplikację to będzie się ona składała z 3 głównych części:

  • konta – tutaj będziemy mogli zarządzać naszymi kontami – tworzyć je, edytować, uzupełniać o wpływy
  • koperty – główna część aplikacji umożliwiająca dodawanie/edytowanie kopert, uzupełnianie ich kasą z kont, przenoszenie kasy miedzy kopertami; koperta będzie ekwiwalentem kategorii tylko bogatszym bo posiadającym dodatkowe informacje i możliwość wykonywania w ich kontekście operacji biznesowych
  • wydatki – lista wydatków z możliwością dodawania/edytowania; możliwość dodania wydatku z koperty lub bezpośrednio z konta; fajnie byłoby mieć możliwość importowania wydatków na przykład z wyciągu z konta ale to jest funkcjonalność „ekstra”

Koperty zamierzam podzielić na dwa rodzaje:

  • koperty na wydatki – ustalamy początkową kwotę w kopercie i każdy wydatek z koperty powoduje pomniejszenie kwoty – do tego rodzaju kopert trafiają wszystkie wydatki, zarówno te jednorazowe (czynsz) jak i te rozłożone w czasie (jedzenie)
  • koperty celowe – ustalamy kwotę jaką chcemy uzbierać na dany cel i każde dołożenie kasy do koperty powoduje, że coraz bardziej zbliżamy się do upragnionego celu

Poniżej można zobaczyć jak to wszystko prezentuje się na nieco chaotycznej mapie myśli jaką stworzyłem zastanawiając się co chciałbym zawrzeć w MoneyStorm. Wydaje mi się, że mapa taka jest całkiem pomocna w gromadzeniu informacji o wymaganiach aplikacji i z całą pewnością będzie ewoluować wraz z rozwojem projektu.

mindmap

MoneyStorm technicznie

Od strony technicznej MoneyStorm na pewno będzie korzystać z .Net/C#. Na początku chciałem stworzyć aplikację desktopową w WPF z wykorzystaniem SQLite jako miejsca przechowywania danych i EntityFramework do dostępu do tych danych. W każdym razie tak stoi w opisie projektu na stronie DajSiePoznac ale im dłużej myślę o tym projekcie tym bardziej przemawia do mnie zrobienie tego w formie strony web w ASP.NET MVC lub bardziej nowocześnie jako UWP (Universal Windows Platform) app. Na szczęście zamierzam zabrać się do tego projektu od środka tzn. od modelowania w kodzie domeny biznesowej w całkowitym oderwaniu od szczegółów takich jak bazy danych czy GUI co da mi czas na podjęcie decyzji, w którą stronę pójść.

Aplikację będę się starał rozwijać zgodnie z TDD. Chciałbym też trochę bardziej poznać podejście DDD – szczególnie w praktyce bo do tej pory znam co najwyżej teoretyczne podstawy – z tego względu będę się starał zgłebić ten temat nieco bardziej, z czego mam nadzieję narodzi się kilka ciekawych postów na blogu.

Słowo podsumowania

Mamy opisane założenia konkursowej aplikacji MoneyStorm – rozpoznane potrzeby klienta, zaproponowane rozwiązanie w sensie biznesowym i technicznym. Następny krok? Nic tylko rzucić się w wir kodowania – czyli to co programiści lubią najbardziej 🙂