Jakosc kodu, clean code - jak sie go nauczyliscie

Jakosc kodu, clean code - jak sie go nauczyliscie
S8
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Postów:2
0

Takie raczej szybkie pytanie. Juz troche w sumie doswiadczenia komercyjnego mam, a mimo to ciągle mi sie wydaje ze nie za bardzo idzie mi pisanie naprawde dobrego jakościowo kodu, glownie przez niedbalosc o to w mojej obecnej firmie. Nie mówie tutaj o jakichś architekturach, ale o takim prostym DRY, KISS, SRP, Clean Code.

Takze mam pytanie do tych którym udało sie "wyjsc ze spaghetti". Czy dobrym rozwiazaniem byloby np zmiana firmy na taka w ktorej bili by mnie batem za pisanie badziewia i niestosowanie wzroców, czy moze jest to tylko kwestia walki z lenistem, czy moze dobrym rozwiazaniem jest np wieksze zaangazowanie w jakis nowoczesny projekt Open Source? Co u was zadziałało?

szarotka
to marne to twoje doświadczenie skoro cały czas odwalasz fuszerkę a wytłumaczenie "bo inni tak robią" jest słabe
axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Warszawa
  • Postów:2251
4

Niech Cię biją batem :) ja u siebie nie mam bata, ale staram się bić innych linijką (ale tak na sztorc). A tak na serio... to staraj się wymagać najwięcej od samego siebie. A jak się zapominasz to potem refaktoryzuj, z czasem zobaczysz że nie warto pisać na "odpie...l", bo będziesz miał więcej roboty. U mnie zadziałało używanie narzędzi do sprawdzania poprawności kodu, które wychwytuje pewne "brzydkie zapachy" w kodzie :)

edytowany 1x, ostatnio: axelbest
Kooneer
Można wiedzieć jakie to narzędzia?:)
axelbest
PhpCodeSniffer, MessDetector, CopyPasteDetector, PhpStandardFixer
mar-ek1
  • Rejestracja:prawie 14 lat
  • Ostatnio:dzień
  • Postów:525
4

Spróbuj po np. pół roku dodać w swoim większym projekcie nową, albo zmodyfikować istniejącą funkcjonalność mając na to krótki deadline, im większy poziom wkurwienia będzie temu towarzyszył tym szybciej w głowie się utrwali myśl, że nie warto robić czegoś "na szybko", u mnie podziałało i staram się teraz za każdym razem dbać o jakieś przyzwoite minimum jakości kodu :D
Zmiana firmy na taką, która kładzie duży nacisk na jakość pewnie przyspieszy ten proces, bo jednak człowiek nie lubi być krytykowany więc po kolejnych code review gdzie informacja zwrotna to długa lista uwag nt. jakości tego co zostało napisane będzie się dążyło do stanu, w którym będzie jak najmniej tych uwag od osób sprawdzających Twój kod.


Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Pisz unit testy ze 100% pokryciem. Napisanie takiego testu dla słabego kodu jest bardzo trudne więc jak widzisz ze nie wiesz jak sensownie zrobić test (tak zeby nie miał 1000 linii) to znaczy że kod jest do refaktoringu.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
EL
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
2

Koledzy z pracy którzy nie przepuszczą pull requesta z chociażby jedną literówka czy głupotą w kodzie idealnie wspomagają proces pisania czystego kodu ;).
Warto też moim zdaniem czytać ogólnodostępne biblioteki.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:5 minut
  • Postów:8398
6

Juz troche w sumie doswiadczenia komercyjnego mam, a mimo to ciągle mi sie wydaje ze nie za bardzo idzie mi pisanie naprawde dobrego jakościowo kodu, glownie przez niedbalosc o to w mojej obecnej firmie.

Doświadczenie komercyjne != pisanie czystego kodu.
Są firmy, w których się dba o to, są firmy, w których się na to kładzie lachę. Ty trafiłeś do takiej, gdzie się kładzie lachę. Wnioski sam sobie wysnuj...

Nie mówie tutaj o jakichś architekturach, ale o takim prostym DRY

DRY - to akurat najprostsze. Wystarczy:

  • nie stosować metody kopiuj-wklej
  • zamiast robić zmienne typu zmienna1, zmienna2, zmienna3, zastosować tablicę/listę
  • starać się ogranicząć ify. Szczególnie, jak masz w jednej funkcji z 5 podobnych ifów, które niewiele się różnią zarówno pod kątem warunku, jak i tego co jest wykonywane jeśli warunek jest prawdziwy -- to wiedz, że coś się dzieje i że jest tu code smell...
  • wydzielać powtarzającą się logikę gdzieś (np. do klasy, do funkcji, ale czasem wystarczy do zwykłej pętli)
  • jeśli potrzeba, to wydzielone funkcjonalności wsadzić do osobnych plików
  • pamiętać o decouplingu
  • umieć postrzegać podobieństwa różnych use'caseów. Jeśli masz mysz, kota i psa, to nie musisz rozpatrywać każdego przypadku z osobna, wystarczy, że gdzieś zrobisz jakąś strukturę danych dla każdego zwierzęcia, gdzie wypiszesz cechy dystynktywne dla każdego zwierzaka (np. pokarm, wygląd itp.) a potem będziesz pobierać te dane z tej struktury. Uogólniaj po prostu.
    czyli nie:
Kopiuj
PSEUDOKOD
if (kot) {
  jedzMieso()
}
if (mysz) {
  jedzSer()
}

tylko

Kopiuj
PSEUDOKOD
kot.jedzenie = 'mięso';
mysz.jedzenie = 'ser';
...
zwierze = kot
jedz(zwierze, zwierze.jedzenie);

może to banał, ale często widzę, że ludzie tego nie umieją uogólniać, nawet zaawansowani rzekomo programiści. Łatwiej jest im zrobić kopiuj wklejkę i zmodyfikować niż stworzyć strukturę/słownik/klasę/obiekt z danymi.

, KISS.

KISS - to akurat najtrudniejsze. Niestety dopiero dochodzę do tego etapu, więc nie mam sprawdzonych recept. Zazwyczaj dochodzę do zachowania zasady KISS po iluś próbach przepisania czegoś od zera. Niestety nie zawsze mogę sobie na to pozwolić (w projektach komercyjnych, gdzie goni deadline często trzeba zrobić jakkolwiek, zamiast najlepiej).

Anyway, jest taki fajny cytat o zasadzie KISS:
Doskonałość osiąga się nie wtedy, kiedy nie można już nic dodać, ale kiedy nie można nic ująć.
Antoine de Saint-Exupéry

zazwyczaj na początku człowiek napakuje niepotrzebnie kod podobnie do tego, jak się pakuje wędliny wodą, żeby więcej ważyły. dopiero potem się zauważa, że nie chodzi o to, ile ficzerów czy ile wzorców projektowych się włoży do kodu, ale raczej bardziej ważne jest to, żeby w projekcie znajdowało się tylko to, co naprawdę potrzebne.

Nie wiem w jakim języku programujesz, ale np. jesli chodzi o JavaScript to radziłbym się zainteresować projektami Dana Abramova (Redux i toole do niego), bo to gość, który robi biblioteki właśnie w stylu KISS (przynajmniej na poziomie koncepcji oraz ich używania, co do kodu to mało zaglądałem, ale też ponoć dość prosty kod pisze).


edytowany 4x, ostatnio: LukeJL
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Wrocław
2
Sarkofag89 napisał(a):

Czy dobrym rozwiazaniem byloby np zmiana firmy na taka w ktorej bili by mnie batem za pisanie badziewia i niestosowanie wzroców

Bicie nie pomoże, jeśli sam nie chcesz tego robić. Znając zasady w teorii, trzeba je po prostu starać się stosować w praktyce. Nawet jeśli w pracy nikt nie kładzie nacisku na jakość, to nie znaczy, że Ty nie możesz pisać dobrego kodu w swoich klasach.

AreQrm
  • Rejestracja:prawie 11 lat
  • Ostatnio:20 dni
  • Lokalizacja:Londyn
  • Postów:873
1

To zależy co robisz i gdzie. Pomaga mieć otoczenie, które ciągnie Ciebie w górę, a nie Ty otoczenie. Praca z dobrym kodem pozwala się z nim obyć, napatrzeć na niego ;-) i przez to samemu lepiej pisać, gdy już widzisz ciekawe rozwiązania a nie musisz sam do nich dochodzić zawsze.
Jak Twoja praca polega tylko na grzebaniu w spaghetti, to nawet coś nowego robiąc może być ciężko zrobić to dobrze, jeśli masz dopisać tylko kilka linijek i nie możesz zrobić refactoringu. Jak piszesz zupełnie nowe rzeczy, nowe klasy - tutaj masz duże pole do popisu sam. Ciężko od razu dobrze coś napisać, często nawet nie powinno się, tylko powinno to wyjść przez refactoring.

Ja pracowałem z takim spaghetti, że jedynym wyjściem była zmiana firmy.


NE
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 8 lat
  • Postów:186
4

Trochę zależy od stopnia rozgotowania tego spaghetti. Jeśli uważasz, że w obecnej pracy jest straszny chaos, inni uważają, że to jedyne słuszne rozwiązanie i brniecie tak dalej, to wiej czym prędzej. Jeśli jest neutralnie tzn. jest jakiś tam bałagan, nikogo to nie rusza, ale jeśli zrobisz po swojemu, to też ich nie ruszy, to możesz w miarę samodyscypliny popróbować pisać porządnie chociaż w swoich obszarach. Niemniej jednak jeśli znalazłbyś firmę, gdzie dają linijką po łapach za słaby kod, to z mojej strony gratulacje i ruszaj tam w podskokach.

Ja zaczynałam od pierwszego przypadku. Aplikacja była już mocno rozbudowana i próby robienia dobrze to byłoby łamanie konwencji. ;) Na szczęście gdzieś na boku udało mi się zakumplować z kimś bardziej doświadczonym, komu jakość kodu się nie podobała, i zaraziłam się jego poglądami. Potem naczytałam się książek, powędrowałam po innych firmach (mniej lub bardziej lepszych) i samo przyszło.


(konto nieaktywne)
0

Pisz unit testy ze 100% pokryciem.

Straszna bzdura.
Pokrycie testami kodu w 100% zazwyczaj oznacza (a w sumie zawsze oznacza) testy pisanie byle jak i bez jakiegokolwiek sensu.
Wiarygodne i rzetelne testy statystycznie obejmują około 85% kodu.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

To był skrót myślowy -> chodziło mi o 100% pokrycia dla klas dla których w ogóle piszesz testy, czyli dla serwisów i logiki. Względem całego kodu to oczywiście nie będzie 100% bo nikt przy zdrowych zmysłach nie pisze testów dla konstruktorów, setterów, getterów, DTO itd bo to nie ma sensu. Ale jeśli już piszesz test dla jakiegoś serwisu to uważam że jak najbardziej da sie i powinno się zrobić 100% pokrycie kodu takiego serwisu testami.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
hcubyc
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 2 lata
1

Różne materiały np.
Mi najwięcej jednak dało code review, chociaż to akurat trochę, dziwne, bo widzę drzazgę w czyimś oku nie widząc belki w swoim - jak mam zrobic komus CR to dostrzege dużo, ale mój kod to wiadomo...idealny xD
Do tego zawsze może wrzucić kod w jakiegoś sonara i zobaczyć co tam wypluwa


Limitations are limitless > ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.
CZ
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 dni
  • Postów:180
1

Klep dużo kodu, jakość przyjdzie z czasem. Gdy już osiągniesz dobry poziom w klepaniu, to poznasz przy okazji biblioteki/frameworki, które nauczą Cię pośrednio pisać dobry kod. Na pewnym etapie rozwoju poznasz też zapewne paru wymiataczy, którzy będą po Tobie poprawiac 90% kodu, co mało kto znosi dobrze :D Wtedy powstanie to tarcie, które spowoduje, że staniesz się porządnym developerem.

nalik
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 2 lata
  • Postów:1039
1

Na początek polecam przeczytać "Czysty Kod" - Robert C. Martin.
Poza tym polecam zapoznanie się jakimś standardem kodowania i trzymaniem się go. Przeglądanie projektów open sourcowych.

Potem to jest kwestia dyscypliny, dbałości o szczegóły i czasu.

axelbest
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Warszawa
  • Postów:2251
1

Ja z kolei opierałem się sporo na tej książce, http://helion.pl/ksiazki/refaktoryzacja-ulepszanie-struktury-istniejacego-kodu-martin-fowler-kent-beck-john-brant-william-opdy,refuko.htm
Nie wiem jak inni programiści - ale o dziwo, jej lektura najlepiej mi wchodziła podczas "posiedzeń" :D
Może nie jest to typowa książka o clean code - ale refaktoryzacja chyba jako tako wchodzi w skład tego pojęcia.

edytowany 1x, ostatnio: axelbest
1

Clean code to pojęcie bardzo względne.

W każdym razie im czystszy kod będziesz tworzył tym trudniej będzie Ci zaakceptować pracę innych osób i tu nie chodzi, że im się nie chce, że nie umieją (choć tak też może być), lecz o to, że w mniejszych projektach nie zbyt wiele czasu na takie drobnostki, a w większych jest już trochę za późno, żeby taki czysty kod robić.

Patrząc na moje projekty, tam gdzie stawiałem na jakość/czysty kod/naukę nowych rzeczy to te projekty właśnie kończyły na dnie szuflady. Najlepiej mają się tylko te, które faktycznie robią coś pożytecznego, wtedy jak trzeba to się je poprawi i bólu nie ma.

Dlatego zarówno z perspektywy pracy jak i własnych projektów lepiej jest umieć przeprowadzić sprawną refaktoryzację do wzorców i mieć tak z rok doświadczenia nad legacy code. Wtedy zrozumiesz na ile brudny kod możesz pisać, żeby wszyscy byli szczęśliwi :-)

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:11 dni
1

Mi znacznie pomogły lintery maści przeróżnej. Dzięki temu masz tą przyjemną satysfakcję, że na Ciebie nic nie krzyczy w czasie pisania kodu.


KA
maści Ci pomogły? loll
aurel
Jakie maści, co wy? Lintery! http://sjp.pl/lintery
XardasLord
Aaaaa, no to teraz wiele wyjaśnia! :D
RV
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 6 lat
  • Postów:32
0
Mały Kot napisał(a):

Clean code to pojęcie bardzo względne.

W każdym razie im czystszy kod będziesz tworzył tym trudniej będzie Ci zaakceptować pracę innych osób i tu nie chodzi, że im się nie chce, że nie umieją (choć tak też może być), lecz o to, że w mniejszych projektach nie zbyt wiele czasu na takie drobnostki, a w większych jest już trochę za późno, żeby taki czysty kod robić.

Patrząc na moje projekty, tam gdzie stawiałem na jakość/czysty kod/naukę nowych rzeczy to te projekty właśnie kończyły na dnie szuflady. Najlepiej mają się tylko te, które faktycznie robią coś pożytecznego, wtedy jak trzeba to się je poprawi i bólu nie ma.

Dlatego zarówno z perspektywy pracy jak i własnych projektów lepiej jest umieć przeprowadzić sprawną refaktoryzację do wzorców i mieć tak z rok doświadczenia nad legacy code. Wtedy zrozumiesz na ile brudny kod możesz pisać, żeby wszyscy byli szczęśliwi :-)

Ty tak na serio ?

axelbest
Jeśli napisanie czystego kodu w legacy codzie, będzie wiązało się z refaktoryzacją i trwało tydzień, a klient zapłaci np. za 4h (bo to w końcu tylko jeden malutki feature) to ma się do wyboru - albo zmienić firmę, albo pisać kod tak jak napisał Mały Kot.
jarekr000000
@axelbest: tak po prawdzie najlepszy kod udawało mi się pisać w legacy. biznes już doświadczony co to znaczy na szybko i ma czas i kasę, bo system na produkcji. Więc prawie zawsze szacowałem w stylu, mogę to zrobić dobrze w 2 dni, ale chętnie jeszcze posprzątam dookoła w dodatkowe 2. Praktycznie zawsze była wybierana wersja b. Btw. na szybko byłoby w 4h, ale tego nie mówiłem, chyba, że przy dirty fixach na niedziałającą produkcję. Ale nawet wtedy normalnie było potem sprzątanie. Btw. są też legacy bez pieniędzy i to faktycznie równia pochyła - trzeba uciekać.
axelbest
Ja akurat miałem przyjemność pracy przy legacy, gdzie były pieniądze. Zgadzam się w 100%.
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)