YAGNI - stosujecie?

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
1

Siema,

Pytanie na dziś - podczas implementacji myślicie dużo o przyszłości czy nie (YAGNI - You ain't gonna need it)?

Np. wykryto bug X, więc go naprawiasz, jednocześnie widzisz że JEST MOŻLIWY w przyszłości bug Y, chociaż według obecnego używania systemu, nie widać buga Y - uwidoczni się on dopiero, jak się doda pewną inną funkcjonalność (nie jest powiedziane czy się doda czy nie)

Co wtedy?

  1. Zmieniasz kod również pod kątem buga Y (myślimy o przyszłości, łatamy wszelkie możliwe dziury, dbamy o wszystko),
    czy też....
  2. Naprawiam buga X, a jak się pojawi bug Y, to wtedy dopiero zmienię kod pod kątem buga Y (YAGNI, po co dodatkowy koszt na coś co obecnie nie jest używane)

Zapraszam do dyskusji.

neves
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Kraków
  • Postów:1114
6

Bug jest kiepskim przykładem bo YAGNI w oryginale się odnosi do featurów, czyli rzeczy których implementacja trwa jednak trochę dłużej niż naprawa buga. A bugi zwykle chcemy naprawić jak najszybciej, póki w miarę pamiętamy kontekst w którym on występuję.

Pomijając to, temat jest bardzo ciekawy, jak bardzo wybiegać w przyszłość przy programowaniu.

Jeśli chodzi o bugi to ja bym poprawiał prawie wszystko, jeśli chodzi o design/ficzery/abstrakcję to tu jednak wyznaje agilowe podejście, czy unikanie jak to oni ładnie określają speculative design(próbę przewidzenia przyszłości).


cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:2 dni
  • Lokalizacja:Poznań
  • Postów:8759
2

Pytanie trochę zbyt ogólne.
To zależy od wielu czynników - przede wszystkim od dostępnego czasu oraz ilości potrzebnej pracy.
Jeśli naprawienie drugiej usterki to drobiazg, raczej bym od razu to wyczyścił.
Ale w sytuacji, kiedy wymaga to wielu godzin pracy (plus inne niespodzianki, które pewnie wyskoczą w trakcie), a projekt jest "na wczoraj", to jeśli mam pewność, że na chwilę obecną drugi ZONK nie wyskoczy - zostawiłbym. Aczkolwiek cały czas pamiętając, że taka potencjalna słabość istnieje i w wolnej chwili, albo przy kolejnych pracach, będę starał się zarezerwować czas na załatanie.


somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Wrocław
3

Jeśli widżę, że jakiś błąd może wystąpić, to przed tym zabezpieczam - jeśli implementacja jest szybka i łatwa. Jeśli nie, to robię oddzielnego taska i informuję zespół o problemie.

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 19 godzin
1

Pytanie na dziś - podczas implementacji myślicie dużo o przyszłości czy nie (YAGNI - You ain't gonna need it)?

Np. wykryto bug X, więc go naprawiasz, jednocześnie widzisz że JEST MOŻLIWY w przyszłości bug Y, chociaż według obecnego używania systemu, nie widać buga Y - uwidoczni się on dopiero, jak się doda pewną inną funkcjonalność (nie jest powiedziane czy się doda czy nie)

Co wtedy?

To zależy, czy to jest dużo roboty czy nie i czy jest na to czas czy nie.
Zazwyczaj robimy coś dopiero jak jest na to task.

Pipes
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 3 lata
  • Postów:459
1

Fajny temat się tutaj pojawił. Warto jest by znaleźć złoty środek między "programowaniem zachłannym" czyli robimy asap a "arcydziełem sztuki" czy cyzelowaniem nawet najmniejszych detali. Generalnie staram się myśleć o tym jak sprawić, by kod który jest w chwili obecnej był w jak najlepszym stanie - najbardziej czytelny, logicznie uporządkowany, pokryty testami etc. bo założenie jest, że kod jest żywy i ważne jest, by jak najłatwiej (niekoniecznie najszybciej) go sensownie rozwijać. Ostatnio w pracy miałem przypadek który oddaje myśl tej zasady- miałem zaimplementować rozwiązanie, które zadziała dla pewnych kombinacji możliwych przypadków - może być sam przypadek lub jego kombinacja z innym. Póki nie ma kombinacji z trzema czynnikami (przypadek A - przypadek B - przypadek C) nie dodałem takiego kawałka kodu, bo nie jest potrzebny, ale obecny kod jest na tyle sensownie napisany, że gdy przyjdzie prośba od product ownera, by zrobić kombinację trzech przypadków, dodanie tego będzie analogiczne, a co za tym idzie łatwe.
Dostrzegam, że dla pewnego grona programistów YAGNI czy KISS są usprawiedliwieniem "robienia na szybko", a zupełnie nie o to chodzi :)

Edit: Inna sprawa, gdy ktoś np. założył taska, by dodać pole A, a też chcą pole B etc. to wtedy robi się to za jednym zamachem, nie czekając aż wystawią kolejny "tiket". Są różne szkoły i niektórzy opóźniają development innych zespołów tłumacząc się jirą czyt. biurokracją, ale wtedy się przydaje trochę rozsądku i empatii :)

Edit2: Zakładanie, że naprawimy buga dopiero jak poleci na produkcji, bo np. może się trafić race condition to najgorsze możliwe założenie... W tym wypadku trzeba przewidywać zawczasu, bo naprawienie buga, którego się samo stworzyło to żaden powód do dumy.

edytowany 2x, ostatnio: Pipes
zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:101
2

Raczej nie pamiętam sytuacji, że "błąd będzie możliwy, jak ktoś doda funkcjonalność X" :). Albo jest błąd, albo go nie ma, a jak sytuacja jest wątpliwa, to się siada, dyskutuje i zastanawia przez chwilę.

Trochę inaczej sprawa się ma z nowymi funkcjonalnościami. Czasami jest już jakaś wizja, że chcielibyśmy w przyszłości dodać funkcjonalność X, albo to jest kwestia "kiedy" a nie "czy" dana funkcjonalność się pojawi. Tu zdarza się robić coś pod przyszłość:

  1. np. koszt przygotowania kodu pod funkcjonalność X, gdy ten kod dopiero powstaje, jest bardzo niski, a oszczędzi dużo pracy w przyszłości,
  2. żeby wprowadzić funkcjonalność X, trzeba najpierw coś zmienić w architekturze. Nie wiemy jeszcze jak dana funkcjonalność będzie wyglądać i kiedy będzie realizowana, ale po prostu najpierw musimy sobie w ogóle odblokować drogę do niej.

Tu się już bazuje na doświadczeniu i "intuicji" :).


edytowany 1x, ostatnio: zyxist
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 11 godzin
  • Postów:3169
0

Zalezy. Jak zabezpieczneie przed drugim bugiem jest szybkie i wydaje sie realne ze to zaboli w przyszlosci -> naprawiam. Jesli wydaje sie ze zaboli ale jest sporo roboty -> informuje zespol, zglaszam Jire itp.

Za to ze wzgledu na specyfike swojej pracy czesto robie jakies skrypty do mielenia danych, automatyzacji rzeczy itp. To tam przewaznei wg. zasady jak najszybciej, byle dzialalo. (na zasadzie prototypu do wyrzucenia).

JU
  • Rejestracja:około 22 lata
  • Ostatnio:30 dni
  • Postów:5042
1

Jeśli widzę możliwy bug, to naprawiam go. Bo jeśli coś się może spieprzyć, to na pewno się stanie. YAGNI, jak już było mówione, odnosi się do ficzerów. Często łapię się na tym, że piszę sobie jakąś metodę, której aktualnie nie potrzebuję, ale "na pewno mi się przyda". Jednak staram się tego unikać jak ognia. Nawet jak się złapię na tym, to po prostu wykomentowuję kod i piszę sobie jakieś todo, chociaż nie zawsze. Gotowy projekt powinien być oddany w miarę szybko, na zabawę przyjdzie czas w tzw. "międzyczasie" :) A im lepiej system pisany, tym łatwiej go rozwijać, więc tym więcej zostaje czasu na zabawy później :)

Podsumowując - YAGNI jest dobrym rozwiązaniem. Przekładając to na życie, wyobraź sobie, że mama/żona/kochanka prosi Cię, żebyś obrał ziemniaki. A Ty zaczynasz zmywać, ogarniać podłogi, robisz pranie i na koniec (jak masz jeszcze czas) obierasz ziemniaki. Tak właśnie wygląda życie bez YAGNI :)

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
  • Postów:2787
0
Juhas napisał(a):

Jeśli widzę możliwy bug, to naprawiam go. Bo jeśli coś się może spieprzyć, to na pewno się stanie. YAGNI, jak już było mówione, odnosi się do ficzerów. Często łapię się na tym, że piszę sobie jakąś metodę, której aktualnie nie potrzebuję, ale "na pewno mi się przyda". Jednak staram się tego unikać jak ognia. Nawet jak się złapię na tym, to po prostu wykomentowuję kod i piszę sobie jakieś todo, chociaż nie zawsze. Gotowy projekt powinien być oddany w miarę szybko, na zabawę przyjdzie czas w tzw. "międzyczasie" :) A im lepiej system pisany, tym łatwiej go rozwijać, więc tym więcej zostaje czasu na zabawy później :)

Podsumowując - YAGNI jest dobrym rozwiązaniem. Przekładając to na życie, wyobraź sobie, że mama/żona/kochanka prosi Cię, żebyś obrał ziemniaki. A Ty zaczynasz zmywać, ogarniać podłogi, robisz pranie i na koniec (jak masz jeszcze czas) obierasz ziemniaki. Tak właśnie wygląda życie bez YAGNI :)

@Juhas
Hehe no spoko, fajnie piszesz, tylko jedno mnie ciekawi - macie w projekcie zakomentowany kod? Wydaje mi się że to zła praktyka

edytowany 1x, ostatnio: Pinek
koszalek-opalek
  • Rejestracja:około 9 lat
  • Ostatnio:około 2 lata
2
Juhas napisał(a):

Podsumowując - YAGNI jest dobrym rozwiązaniem. Przekładając to na życie, wyobraź sobie, że mama/żona/kochanka prosi Cię, żebyś obrał ziemniaki. A Ty zaczynasz zmywać, ogarniać podłogi, robisz pranie i na koniec (jak masz jeszcze czas) obierasz ziemniaki. Tak właśnie wygląda życie bez YAGNI :)

Rozszerzając analogię na bugi -- ale jak masz obrać ziemniaki i nóż jest tępy, to jednak go najpierw ostrzysz. Ale tylko ten, co Ci akurat potrzebny... :)

aurel
Moderator
  • Rejestracja:prawie 15 lat
  • Ostatnio:2 minuty
0

Ja pracuję głównie w przetwarzaniu tekstu naturalnego, i żeby nie było za prosto - w języku polskim. Jeśli chciałabym się zasadzić na wszystkie możliwe błędy, to nigdy bym nie wydała nowej wersji ;)
Jeśli mam dokładny opis wymagania, gdzie ktoś niby zrobił analizę i twierdzi, że słowa występują w jakimś konkretnym schemacie i ja mam coś z tego wywnioskować, to ja już nie powtarzam analizy, tylko programuję, co mi zadano i przekazuję do testów. Wtedy zazwyczaj wychodzi na jaw, że język polski jest zaskakujący i zadanie wraca do mnie z dodatkową analizą. Często już oddając do testów dobrze wiem, że zadanie wróci, albo że nie obsłużyliśmy pewnych skrajnych przypadków. Mimo to przekazuję, bo:

  1. analityk też musi przecież coś robić, jeśli ja mam i implementować, i analizować, to ja poproszę pensję analitykę dodatkowo do mojej...
  2. bez przykładu na żywo zazwyczaj nie idzie przetłumaczyć,
  3. skrajne przypadki występują tak rzadko, że decyzją biznesową jest niemarnowanie mojego czasu na ich obsługę (redaktor robiący korektę ręczną jest tańszy).
Zobacz pozostałe 8 komentarzy
aurel
E tam ;) Takie samo przetwarzanie informacji, jak w innych działkach, tylko informacje trudniejsze w obsłudze, niż np. xml. Formatki też klepię i statystyki też wyliczam ;) Sztucznej inteligencji na razie nie stosuję, za to ogrom mojej pracy to zmyślne zastosowanie wyrażeń regularnych :P
cerrato
Teraz to zabrzmiało mniej seksownie, niż Twój wpis oraz pierwszy komentarz :(
LS
@aurel: Przetwarzanie tekstu naturalnego bazujące na regexpach? :P
cerrato
@monterinio: możesz wyjaśnić o co Ci chodziło?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)