Konfiguracja vs hardkodowanie

2

Szczególnie dwa przypadki prowadzą do niezwykle rozbudowanej konfiguracji:

  • Korpopotwory sprzedawane innym firmom. M.in. systemy ERP. Jest nacisk, że wdrożenia (którzy nie są programistami) mają mieć możność dostosowywania programu pod potrzeby klientów bez konieczności zaglądania do kodu źródłowego i bez konieczności rekompilacji. Dlatego nic nie można napisać konkretnie, wszystko, kazdy wymóg biznesowy musi być od razu uogólniony i zgeneralizowany, tak by wdrożeniowcy dopiero mogli sobie wyklikać w konfiguracji to, czego potrzebują.
  • Gry. Tutaj z kolei zamiast wdrożeniowców mamy designerów, którzy mają mieć możność ustawiania sobie wszystkiego i dostrajania gry, modyfikowania balansu itp, znów bez konieczności zaglądania do kodu źródłowego (bo nie chcemy musieć przekompilowywać, bo designerzy nie sa i nie mają być programistami). Dlatego znowu, nic nie można zaimplementować po prostu, wszystko musi być od razu uogólnione i zgeneralizowane, tak by designer mógł w edytorze Unity, klikając w same komponenty, bez zaglądania do plików .cs wyklikać sobie to, czego potrzebuje.

Wszyscy upierają się, że postępowanie takie, jak opisałem wyżej jest konieczne. Cóż, zazwyczaj jeśli wszyscy cos podkreślają, a ja miałbym inne zdanie, to jednak to ja się mylę... więc pewnie mylę się i tym razem. Niemniej nie rozumiem tego podejścia.

W praktyce, moim zdaniem, to podejście prowadzi donikąd. Mam dokument z wymogami biznesowymi. Przepisując je do kodu C# zaimplementowałbym to w 2 dni. Nie wolno, bo to hardcoding. Muszę więc robić skomplikowaną konfigurację, która dopiero pozwoli wyklikać to, co jest potrzebne. Niektóre fragmenty dokumentu z wymogami bizensowymi są trudne do uogólnienia, bo zawierają w zasadzie arbitralną logikę (np. "zwróć 5 jeśli fizzlewumpy mają zakończenia będące grumpywumpami, a jednocześnie pole XXX opisywane dwa akapity wyżej ma wartość YYY"). Jakoś jednak się to udaje, zajęło mi to 2 tygodnie, mój kod w zasadzie przypomina interpreter, a nie kod biznesowy, jest więc bardzdziej skomplikowany, niż ot koniecznie, kolejny dzień muszę poświęcić by wyprodukować dokument, który opisuje dokładnie konfigurację, tak by wdrożeniowcy mogli sobie to wyklikać, dokument jest na wiele stron.

Ale niby działa.

Ale teraz uwaga uwaga, DOCHODZI KOLEJNY WYMÓG BIZNESOWY! Np zamiast wartości 5 mam zwracać sumę pól XXX na zakończeniach fizzlewumpów będących grumpywumpami. Ups, tego nie da się obecnie wyklikać w konfiguracji, trzeba dopisywać kolejne dziwne parametry konfiguracyjne, sprawdzać, czy nasze nowe parametry konfiguracyjne w ogóle dobrze współdziałają ze wszystkimi możliwymi kombinacjami istniejących... To jest męka i zajmuje czas. Znowu, gdybym po prostu zahardkodował na pałę ten wymóg w C#, zrobiłbym to natychmiast. Zaraz zaraz, czy nacisk na to, by to było konfigurowalne nie brał się stąd, że wdrożeniowcy mają mieć możliwość wyklikiwania sobie, czego potrzebują BEZ konieczności przechodzenia do kodu? No cóż, nie jest tak. I tak każdy nowy wymóg oznacza konieczność angażowania zespołu programistów i dalszego rozdmuchiwania już i tak gargantuicznej konfiguracji.

A teraz mamy przypadek, że dwóch klientów, każdy o nieco innych wymogach biznesowych korzysta z naszej funkcjonalności. Znowu dochodzi kolejny wymóg, ale tylko od pierwszego klienta, drugi klient chce, by wszystko było po staremu. Dodajemy więc dziesięcziotysiączny parametr konfiguracyjny. Ten sam kod obsługuje różne potrzeby różnych klientów, nasz nowy parametr konfiguracyjny wymaga dostosowania działania istniejących parametrów, by nie byly ze sobą sprzeczne --> ups, właśnie popsuliśmy drugiego klienta, jest wściekły, bo po instalacji jego procesy biznesowe przestały działać. Drugi klient uczula się, że każda nowa wersja naszej aplikacj to potencjalne problemy, dlatego odtąd każda próba aktualizacji czegokolwiek u tego klienta to będzie droga przez mękę, bo co do zasady klient będzie wymagał, by nic nie było aktualizowane, a jeśli już coś jest aktualizowane, to ma być zmienione tylko to, czego on sobie zażyczył, a nic innego - tak więc musimy utrzymywać pięćdziesiąt wersji naszej aplikacji na pięćdziesięciu gałęziach w giciei pilnować, by do każdej wersij wchodziły tylko te commity, które dany klient zamawiał. Ups, ale czy konfiguracja nie miała służyć właśnie temu, byśmy mogli mieć JEDEN kod dla wszystkich klientów pomimo, że ich potrzeby biznesowe się różnią?

Tymczasem konfiguracja jest tak skomplikowana, że nie ogarnia jej nikt, ani programiści, ani wdrożeniowcy. Kod obsługujący tę konfigurację także jest tak ogromny, dziwny, skomplikowany i niekoherentny, że nikt go nie ogarnia. Praca się wlecze i jest męką.

======================

Nic dziwnego, że w praktyce to jest fail. Bo to się nie klei w teorii. Założenie, again, jest takie: Wdrożeniowcy, którzy nie są programistami, mają mieć możliwość wyklikiwania DOWOLNEJ LOGIKI i implementowania DOWOLNYCH WYMOGÓW BIZNESOWYCH poprzez konfigurację. Ma to nie wymagać przechodzenia do kodu źródłowego.

TO JEST SPRZECZNOŚĆ. Platforma, która pozwala na implementowanie DOWOLNEJ LOGIKI nazywa się JĘZYK PROGRAMOWANIA. Tym samym nasza konfiguracja zaczyna być JĘZYKIEM PROGRAMOWANIA - wizualnym, bo możliwym do wyklikania w edytorze konfiguracji, ale nadal jest to JĘZYK PROGRAMOWANIA.

Wyżej pisałem o korpobestiach i istotnie, jakby się zastanowić, to się okaże, że konfiguracja jest tak naprawdę Turing-complete, chociaż nikt nigdy nie zakładał, że tak ma być.

Ale w grach jest to jeszcze bardziej oczywiste. Do wyklikania są bardzo często ZMIENNE, które się nawet nazywają "zmienne" (i oczywiście sa globalne!), do wyklikania są warunki logiczne (mamy możność wyklikania ANDów oraz ORów), i tak dalej!

Napisaliśmy więc język programowania. Niestety, nasz język programowania jest, kolokwialnie mówiąc, do d**y. Ja, musząc pracować z tym wizualnym gównem, które jest w komponentach Unity i które pozwala mi deklarować zmienne oraz implementować pętle oraz ANDy, NOTy i ORy marzę o tym, by móc zapisać to samo, tylko po porstu w pliku .cs. (akurat w gamedevie nie pracowałem, piszę tu na przykładzie tych gównianych szablonów dostępnych w Unity które mają pozwolić mi wyklikać sobie grę bez pisania linijki kodu C# albo na przykładzie RPG Maker, ale zakładam, że zawodowym gamedevie jest tak samo, że programiści dają coś takiego właśnie designerom, którzy sobie klikają.

Wdrożeniowcy i designerzy, którzy mieli nie być programistami, SĄ programistami! Nauka konfiguracji to ilość wiedzy porównywalna z przyswojeniem sobie sensownych podstaw jakiegoś języka programowania.

=============================

Ogólnie zdaje mi się, że ten problem ma trzy rozwiązania:

  • Konfiguracja (tak się zawsze robi);
  • Hardkodowanie (ZUO!!!);
  • Wystawienie API w języku np. LUA i niech wdrożeniowcy piszą sobie kod LUA implementujący dowolną logikę, jakiej potrzebują (np. piszą sobie w LUA, że pole ABC mam mieć wartość 5, jeśli fizzlewumpy mają zakończenia będące grumpywumpami, a oprócz tego opisywane w tym samym dokumencie dwa akapity wyżej pole XXX ma wartość YYY) - czemu tego sie nie robi?
Konfiguracja Hardkodowanie Skrypty LUA
Zmiana wymogów najczęściej oznacza konieczność zmiany kodu źródłowego wbrew założeniom, a jednocześnie oznacza konieczność zmiany konfiguracji Zmiana wymogów z założenia wiąże się ze zmianą kodu źródłowego, natomiast nie trzeba zmieniać konfiguracji, bo jej nie ma Zmiana wymogów oznacza zmianę kodu w LUA, rzadko trzeba także zmieniać kod źródłowy
Zarówno kod źródłowy, jak i konfiguracja są gigantyczne i skomplikowane ponad wszelką miarę, te same partie kodu odpowiadają za różne potrzeby różnych klientów, każda modyfikacja to męka i wprowadzanie kolejnych bugów Kod jest prosty, istnieje odpowiedniość 1-1 między kodem a wymogami bizensowymi, różne wymogi są implementowane w różnych plikach .cs, modyfikacja jest szybka i prosta, ale wymaga angażowania programistów Wymogi są implementowane w plikach LUA, jest osobny plik LUA na każdy wymóg, jest odpowiedniość 1-1 między zawartością plików LUA a wymogami bizensowymi więc pliki LUA powinny być proste a ich modyfikacja szybka i łatwa
Wdrożeniowcy muszą uczyć się absurdalnie skomplikowanej konfiguracji, której nikt nie ogarnia (a później męczyć programistów wiecznymi pytaniami, na które programiści także nie znaja od razu odpowiedzi, tylko muszą jej szukać) Wdrożeniowcy nic nie muszą wiedzieć, niech tylko rozmawiaja z klientami i prezentują programistom wymogi Wdrożeniowcy muszą nauczyć się podstaw LUA, ale ponieważ LUA jest bardziej przyjemny w użyciu, bardziej spójny, bardziej wygodny, bardziej koherentny niż gargantuiczna konfiguracja, to powinno się to opłacić

Zakładam, że dokładnie analogicznie będzie dla gier, trzeba tylko w powyższej tabeli zastąpić "wdrożeniowców" przez "designerów".

===============================

Podsumowując:

Powszechnie wyklęte hardkodowanie wydaje mi się być DUŻO lepszą opcją, niż powszechnie przyjęte rozbudowywanie konfiguracji!

Najlepsze mogłoby być wystawienie API w Lua, ale przyznaje, że tylko wyobrażam to sobie, bo nigdy tego nie próbowałem. Na pewno rozwiązałoby to problem pojawiającej się ciągle logiki w konfiguracji (na przykład konieczności wyklikiwania, że cośtam ma być sumą cośtamów innych, ale tylko jeśli cos jeszcze innego spełnia arbitralny warunek logiczny).

================================

Gdzie popełniam błąd?

===================================

PS. Ten post jest wynikiem mojej frustracji związanej z pracą.

1

Przy porównaniu "konfiguracja" i "hardcodowanie" to klasyczna dychotomia - sprowadzenie zagadnienia do dwóch skrajnych wartości. Część rzeczy może być konfigurowalna część nie. Co do hardcodowania, nie należy też hardcode'ować wszystkiego tam gdzie jest użyte. Należy zrobić odpowiedni design, tak żeby poszczególne komponenty i widoki dostawały pewne informacje z parametrów które dostaną z "wyżej", ale wyższe elementy, np. moduły mogą je mieć konfigurowalne, ale mogą je też mieć zahardcode'owane. Ale ważne żeby były zahardcode'owane w miejscu gdzie widać ich połączenie, a nie głęboko w niskopoziomowych elementach.

3

Gdzie popełniam błąd?

Pracujesz przy ERPach. To tak pół żartem, ale również pół serio. Bylem, uciekłem.

Jeżeli nie jesteś konsultantem SAPa za 500erło/day, to może nie warto? ;)


Moim zdaniem ERPy to jest branża ekspertów domenowych mających minimalne ogarnianie technologii aby tylko być w stanie zaklepać jakąś logikę biznesową oraz wdrożeniowców którzy również coś tam ogarniają domenę, potrafią pogadać z klientem, ale technicznie to tylko podstawy obsługi komputera i SQL.

Generalnie fajny temat, fajny problem.

Ja miałem doświadczenie z wtyczkami do ERPów które nie były zbyt duże (kilka K LoC) i z tego co pamiętam, to gdy dana wtyczka znacząco się zmieniała pod danego klienta, to robiło się forka (raczej się nie skaluje gdy masz wielu klientów). A może wydzielało jakiś core/shared module który jest wspólny, a później te forki per klient je includowały i rozszerzały swoją customizacją? nie pamiętam.

Słyszałem nawet o takich podejściach jak dynamicznie pobierane .dllki przy starcie przygotowane pod danego klienta, ale jak to od strony kodu wyglądało? idk

PS: Czy wdrożniowiec klepiący w LUA nie staje się programjerem, a zatem trzeba mu zapłacić więcej? ;)

0

Jakoś jednak się to udaje, zajęło mi to 2 tygodnie, mój kod w zasadzie przypomina interpreter, a nie kod biznesowy,

Jeśli łapiesz się na tym, że coś przypomina interpreter - może powinieneś iść w to i napisać interpreter (jako oddzielny moduł, z określonymi strukturami danych, na których będzie działać, i które potem będziesz mógł podpiąć pod jakieś GUI, żeby generowały te struktury danych dla interpretera. Ew. z możliwością edycji tego w jakimś YAML, jeśli twoi użytkownicy są na tyle biegli technicznie, żeby sobie poradzili z edycją pliku tekstowego).

mój kod w zasadzie przypomina interpreter, a nie kod biznesowy, jest więc bardzdziej skomplikowany, niż ot koniecznie,

Czemu skomplikowany? Napisanie interpretera może być proste, jeśli faktycznie chcesz napisać interpreter, a nie że ci przypadkiem wyszedł zahardkodowany większą ilością ifów niż to konieczne.

To jest męka i zajmuje czas. Znowu, gdybym po prostu zahardkodował na pałę ten wymóg w C#, zrobiłbym to natychmiast.

Jest możliwość, że to niepotrzebne, że biznes przesadza, z drugiej strony jeśli masz takie wymaganie biznesowe, a jesteś programistą...? Widzę w twoim poście narzekanie na to, że jednak programista powinien pisać pod potrzeby biznesowe, a nie jak mu łatwiej.

Chociaż być może biznes nie wie, czego chce i być może warto mocniej dookreślić, które rzeczy są istotne, żeby je móc skonfigurować (i w jakiej sytuacji), a które niekoniecznie. Np. być może zamiast tysiąca parametrów wystarczy kilka oddzielnych gotowych presetów do wybrania/przełączenia? Albo coś innego.

Ten sam kod obsługuje różne potrzeby różnych klientów, nasz nowy parametr konfiguracyjny wymaga dostosowania działania istniejących parametrów, by nie byly ze sobą sprzeczne --> ups, właśnie popsuliśmy drugiego klienta, jest wściekły, bo po instalacji jego procesy biznesowe przestały działać

Gdyby były jakieś presety do przełączenia to nie mielibyście tej sytuacji, że coś zmieniacie u jednego klienta i u drugiego się psuje wszystko. To przecież powinno być niezależne. To nawet nie chodzi o konfigurację od strony klienta, tylko od strony kodu. Pisząc coś warto wydzielać logikę, o której wiadomo, że będzie się zmieniać w zależności od klienta/przypadku użycia, a nie mieszać wszystkiego w jednym kotle.

Wyżej pisałem o korpobestiach i istotnie, jakby się zastanowić, to się okaże, że konfiguracja jest tak naprawdę Turing-complete, chociaż nikt nigdy nie zakładał, że tak ma być.

Inner-platform effect. Czyli antywzorzec, który się bierze z tego, że ludzie chcą konfigurować wszystko i w rezultacie piszą jakby drugą platformę/wrapper, której ciągle czegoś brakuje, więc trzeba ciągle dopisywać coś albo robić escape-hatche. A sama "platforma" jest zabugowana i trudna w obsłudze.

No niestety tak może się to skończyć.

Np zamiast wartości 5 mam zwracać sumę pól XXX na zakończeniach fizzlewumpów będących grumpywumpami.

Z drugiej strony... być może powinieneś wygenerować po prostu zapytanie do bazy danych?

0

Przy porównaniu "konfiguracja" i "hardcodowanie" to klasyczna dychotomia - sprowadzenie zagadnienia do dwóch skrajnych wartości. Część rzeczy może być konfigurowalna część nie.

Jeżeli jest to tworzenie ERP na zlecenie, to chyba klient powinien decydować. Rozważanie sprowadza się do pytania, czy w wymaganiach biznesowych stawianych przez klienta jest możliwość konfiguracji i w jakim zakresie. Moim zdaniem, najlepiej podejść dwufazowo, czyli zhardkodować, uruchomić, przetestować, a dopiero później dorobić konfigurację.

Jeśli łapiesz się na tym, że coś przypomina interpreter - może powinieneś iść w to i napisać interpreter (jako oddzielny moduł, z określonymi strukturami danych, na których będzie działać, i które potem będziesz mógł podpiąć pod jakieś GUI, żeby generowały te struktury danych dla interpretera. Ew. z możliwością edycji tego w jakimś YAML, jeśli twoi użytkownicy są na tyle biegli technicznie, żeby sobie poradzili z edycją pliku tekstowego).

Jeżeli wydajność nie jest kluczowa, to można jeszcze prościej, czyli praktycznie użyć czegoś gotowego: No i światło dzienne ujrzał... W tym "interpreterze" chodzi o uruchamianie skryptów (programów) w jakimś języku wysokiego poziomu. A ponieważ już istnieje kompilator SDCC, a do tego niektóre procesory 8-bitowe mają prostą architekturę, to pozostaje zrobić symulator procka, bo kompilator jest gotowy (jest nim program SDCC). Dlatego w wymienionym projekcie "wystarczyło", że zrobię interpreter kodu binarnego, który jest znacznie prostszy niż interpreter tekstu. To zamiany tekstu na kod binarny jest już gotowy program SDCC.

Oczywiscie można też skorzystać z interpretera LUA, a jeżeli jest to program desktopowy w technologii z możliwością osadzania "wnętrza" przeglądarki internetowej, lub w technologii przeglądarkowej (webowej), to można jeszcze prościej. To, co ma móc zrobić użytkownik, to napisać plik JavaScript i najzwyczajniej w świecie go uruchomić. Programista systemu jedynie musi wymyślić pakiet funkcji, które ów skrypt może uruchomić. To wszystko, nie potrzeba tworzyć żadnego interpretera ani kompilatora.

1

Myślę że nie dawałbym ludziom nietechnicznym możliwości klepania koda, bo więcej zepsują niż będzie z tego korzyści :D

1

Erpami zajmuje się od przełomu 2000 roku. Tylko ja rozumiem to tak, że sporo musi być w konfiguracji aby mozna było to dostosować do wymagań klienta.
Nie możesz patrzeć przez pryzmat Twojego czasu na zakodowanie czegoś, zgodzę się że jakbyś na sztywno w kodzie to robił to będzie szybciej. Musisz patrzeć przez pryzmat produktu który tworzysz, a raczej klientów którzy go używają.
Jeżeli powiedzmy masz 1000 użytkowników i każdy chce jakoś inaczej aby w danym fragmencie program działał to czy z hrdkodowaniem nadal będzie prościej?
Oczywiście to kwestia wyważenia co konfigurować, a co hardkodować, ale jak pisałem musisz zmienić perspektywę.

2

Erpami zajmuje się od przełomu 2000 roku. Tylko ja rozumiem to tak, że sporo musi być w konfiguracji aby mozna było to dostosować do wymagań klienta.

W przypadku ERP, to można powiedzieć, ze co firma (potencjalny użytkownik ERP) to inaczej, inne wymagania postawi. Oczywiście, że jest pewna baza, która jest i powinna być identyczna w każdej firmie, na przykład rachunkowość i księgowość, która musi być realizowana zgodnie z przepisami odpowiednich ustaw. Żeby uprościć sprawę, dajmy na przykład, że mam zaimplementować generowanie listy płac. To, jakie kwoty zawiera i jak są one liczone, jest regulowane przepisami i te kwoty zawsze muszą być.

Pierwsza rzecz: Procent do podatku, procenty składek ZUS. Z jednej strony może być hardkoding, bo ustawa określa te procenty i nie zmieniają się od lat, czy zrobić konfigurator, w którym użytkownik wpisuje te procenty.

No to mamy listę płac. Ale okazuje się, że wynagrodzenie brutto wcale nie jest taką prostą sprawą. W większości przypadków jest suma dwóch kwot, czyli podstawa i premia. Ale może być tak, że klient chce umieszczać na liście płac więcej kwot, czyli płaca zasadnicza, premia regulaminowa, premia uznaniowa, dodatek funkcyjny itp. Wiadomo, że pracownik chciałby wiedzieć, za co dostaje wynagrodzenie, ale czy nie wystarczy zsumować tego do jednej kwoty, bo to i tak listę przelicza się od jednej kwoty? A w razie czego, to zawsze pracownik może uzyskać informację niezależną od listy płac. W tym momencie powstaje pytanie: Czy zleceniodawcy implementacji obliczania płac wystarczy standardowa kwota wynagrodzenia, czy ma mieć możliwość umieszczania wielu kwot i nazywania ich?

Idźmy jeszcze dalej. Osobiście, nieraz spotkałem się nawet z takim nietypowym manewrem (nie wiem, po co w ogóle robiony, nie tylko nikt poza skarbem państwa nic nie zyskuje, to jeszcze pracownik trochę traci). Załóżmy, że pracownik ma na umowie wpisaną kwotę wynagrodzenia 5000zł brutto i nie przewiduje się premii. Oprócz samego wynagrodzenia, pracownik dostaje kartę multisport na koszt firmy, taki bonus, który firmę kosztuje 100zł miesięcznie. Potem pracownik korzysta z opieki medycznej, również na koszt firmy i to kosztuje firmę dajmy na to 200zł miesięcznie.

Manewr polega na tym, że wynagrodzenie brutto to nie jest 5000zł, tak, jak jest napisane w umowie, tylko do tej kwoty dodaje się te wszystkie bonusy, a więc całą listę oblicza się od kwoty 5300zł, a na końcu, od kwoty "do wypłaty" odejmuje się te 300zł. No, i okazuje się, to też trzeba obsłużyć, ale z drugiej strony, jeżeli w danej firmie nie ma żadnych multisportów, to ta funkcjonalność nie jest potrzebna. To pozostaje pytanie Czy zaimplementować, czy odpuścić?

Potem okaże się, że jeszcze coś innego można dołożyć do obliczania płac, jakieś dodatkowe kwoty.

Przechodząc do sedna, mamy trzy opcje:

  1. Hardkodować standardową procedurę, a jak pracodawca chce robić jakieś manewry, to niech je robi poza samą lista płac.
  2. Hardkodować standardową procedurę i bardzo dużo parametrów konfiguracyjnych w celu umożliwienia obsługi wszystkich możliwych sposobów liczenia.
  3. Umożliwić zleceniodawcy konfigurację całego procesu liczenia, niczym formuły w Excelu, wtedy to zleceniodawca będzie mógł sobie liczyć co chce, jak chce, ale niekoniecznie zgodnie z obowiązującymi przepisami.

Którą opcję wybrać? Na to pytanie najlepiej odpowie zleceniodawca w postaci jego wymagań biznesowych. A jak mu się odwidzi, to formułuje nowe wymagania i jest to nowe zlecenie.

0

@Panczo innymi słowy, w przypadku ERPów inner platform effect to nie jest antywzorzec, tylko konieczność?

WeiXiao napisał(a):

Myślę że nie dawałbym ludziom nietechnicznym możliwości klepania koda, bo więcej zepsują niż będzie z tego korzyści :D

No dobrze, ale na tym polega właśnie problem: z założenia chcemy pozwolić na wyklikanie dowolnych wymogów biznesowych (dowolnej logiki) w konfiguracji, która nie jest kodem. TO jest sprzeczność, bo każde narzędzie, które pozwala na zaimplementowanie dowolnej logiki / dowolnyhc wymogów biznesowych jest językiem programowania, a czynność implementowania tychże jest pisaniem kodu (nawet, jeśli się tylko klika, a nie pisze).

Z tej sprzeczności wynika właśnie inner platform effect i wszelkie związane z nim patologie (moim zdaniem).

LukeJL napisał(a):

Jeśli łapiesz się na tym, że coś przypomina interpreter - może powinieneś iść w to i napisać interpreter (jako oddzielny moduł, z określonymi strukturami danych, na których będzie działać, i które potem będziesz mógł podpiąć pod jakieś GUI, żeby generowały te struktury danych dla interpretera. Ew. z możliwością edycji tego w jakimś YAML, jeśli twoi użytkownicy są na tyle biegli technicznie, żeby sobie poradzili z edycją pliku tekstowego).

mój kod w zasadzie przypomina interpreter, a nie kod biznesowy, jest więc bardzdziej skomplikowany, niż ot koniecznie,

Czemu skomplikowany? Napisanie interpretera może być proste, jeśli faktycznie chcesz napisać interpreter, a nie że ci przypadkiem wyszedł zahardkodowany większą ilością ifów niż to konieczne.

andrzejlisek napisał(a):
  1. Umożliwić zleceniodawcy konfigurację całego procesu liczenia, niczym formuły w Excelu, wtedy to zleceniodawca będzie mógł sobie liczyć co chce, jak chce, ale niekoniecznie zgodnie z obowiązującymi przepisami.

Którą opcję wybrać? Na to pytanie najlepiej odpowie zleceniodawca w postaci jego wymagań biznesowych. A jak mu się odwidzi, to formułuje nowe wymagania i jest to nowe zlecenie.

Innymi słowy tworzymy, z założenia, nasz własnościowy język programowania (pewnie wizualny), który będziemy udostępniać wdrożeniom i/lub naweat klientowi. Nie widzę potrzeby tworzenia kolejnego języka programowania przy tak wielkiej ilości już istniejących, zresztą firmy tworzące własny język programowania to chyba kolejny szeroko potępiany antywzorzec?

Ale to już byłoby chyba o niebo lepsze, niż konfiguracja rozbudowana aż do inner platform effect.

Tyle że wtedy wdrożeniowcy znów, z zalożenia, staliby się programistami.

PS. Nie tylko ERPy mają ten problem; w zasadzie każdy program sprzedawany biznesom.

0

@Panczo innymi słowy, w przypadku ERPów inner platform effect to nie jest antywzorzec, tylko konieczność?

@YetAnohterone robione z głową nie jest anty wzorcem. Prosty przykład sprawozdania finansowe do KRS, każdy wysyła (w uproszczeniu) takiego samego XML-a, ale aby zautomatyzować generowanie, trzeba dać możliwość użytkownikowi decydowania co do którego węzła wstawić, niektórzy liczą to z boku i wstawiają na sztywno kwoty, niektórzy chcą pobrać konkretne dane z systemu.
Druga sprawa to raporty, nie ma klienta, który by nie miał jakiegoś którego używa od lat, zarząd nauczony i trzeba coś takiego zrobić w nowym systemie (inaczej klient nie kupi Twojego rozwiązania).
Uogólniając bo nie znam wszystkich systemów, ale każdy z którym się zetknąłem, miał możliwość dopisywania rozszerzeń, jakiś język do poszerzenia funkcjonalności (np X++) itd.
I to nie jest tak, że zwykły użytkownik to robi, a raczej konsultant/wdrożeniowiec, zwykły użytkownik wprowadza dane, a nie konfiguruje/customizuje system.

0
YetAnohterone napisał(a):

Innymi słowy tworzymy, z założenia, nasz własnościowy język programowania (pewnie wizualny), który będziemy udostępniać wdrożeniom i/lub naweat klientowi. Nie widzę potrzeby tworzenia kolejnego języka programowania przy tak wielkiej ilości już istniejących, zresztą firmy tworzące własny język programowania to chyba kolejny szeroko potępiany antywzorzec?

Sam interpreter nie musi być jednoznaczny z napisaniem języka programowania. Tj. nie musi mieć reprezentacji tekstowej. Może interpretować strukturę danych (np. drzewko obiektów. Każdy podobiekt może co innego znaczyć np. AND, OR, odpalenie funkcji itp.).

Wizualność natomiast też nie musi być efektowna pod kątem graficznym, ale może być na zasadzie zwykłego formularza, w którym da się dodać zaawansowane warunki, wybrać z listy parametry tych warunków itp. I na tej podstawie pod spodem generowałaby się odpowiednia struktura danych.

Np zamiast wartości 5 mam zwracać sumę pól XXX na zakończeniach fizzlewumpów będących grumpywumpami. Ups, tego nie da się obecnie wyklikać w konfiguracji,

chociaż tu by się przydało mieć jakiś DSL w stylu SQL.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.