Jaka jest rzeczywista wartość spójnego stylu kodu

47

Należę do zespołu konsultantów wdrażającego nowe rozwiązanie dla klienta. Jestem odpowiedzialny za większość recenzji kodu w bazie kodu po stronie klienta (React i javascript).

Zauważyłem, że niektórzy członkowie zespołu używają unikalnych wzorców kodowania do tego stopnia, że ​​mogłem losowo wybrać plik i powiedzieć, kto był autorem tylko z tego stylu.

Przykład 1 (jednorazowe funkcje wbudowane)

React.createClass({
  render: function () {
    var someFunc = function () {
      ...
      return someValue;
    };
    return <div>{someFunc()}</div>
  }
});

Autor twierdzi, że poprzez przypisanie znaczącej nazwy someFunc kod będzie łatwiejszy do odczytania. Uważam, że poprzez wstawienie funkcji i dodanie komentarza można uzyskać ten sam efekt.

Przykład 2 (funkcje niezwiązane)

function renderSomePart(props, state) {
    return (
      <div>
        <p>{props.myProp}</p>
        <p>{state.myState}</p>
      </div>
    );
}

React.createClass({
  render: function () {
    return <div>{renderSomePart(this.props, this.state)}</div>;
  }
});

Tak zazwyczaj to robimy (unikasz konieczności przekazywania stanu i rekwizytów):

React.createClass({
  renderSomePart: function () {
    return (
      <div>
        <p>{this.props.myProp}</p>
        <p>{this.state.myState}</p>
      </div>
    );
  },
  render: function () {
    return <div>{this.renderSomePart()}</div>;
  }
});

Chociaż te wzorce kodowania są technicznie poprawne, nie są spójne z resztą bazy kodu ani ze stylem i wzorami, na które Facebook (autor React) wskazuje w tutorialach i przykładach.

Musimy utrzymywać szybkie tempo, aby dotrzymywać terminów, a ja nie chcę niepotrzebnie obciążać zespołu. Jednocześnie musimy być na rozsądnym poziomie jakości.

Usiłuję sobie wyobrazić siebie jako programistę obsługi klienta, który boryka się z takimi niespójnościami jak te (każdy element może wymagać zrozumienia innego sposobu robienia tego samego).

Pytanie:

Jaka jest wartość postrzegana przez klienta i deweloperów zajmujących się konserwacją spójnej bazy kodu w porównaniu z pozostawieniem takich niezgodności i potencjalnym ich rozprzestrzenianiem się?

Andreas Warberg
źródło
50
Jaka jest wartość spójnej ortografii? Stałe, stałe przyspieszenie czytania i pisania tekstów. Jaka jest wartość spójnego stylu kodu? Stałe, spójne przyspieszenie w czytaniu i pisaniu kodu. Czego jeszcze możesz chcieć?
Kilian Foth,
9
Kiedy czytasz rzeczy, przyzwyczajasz się do wzorców w tym, co czytasz, i zaczynasz przewidywać, jak czytać rzeczy przyszłe. Jeśli nie ma spójności, nie można przewidzieć wzorców i należy dokonać większej interpretacji kodu, spowalniając czytnik.
Kanadyjski Coder,
1
Joel ma kilka dobrych pomysłów na ten temat. Krótko mówiąc, dobry standard kodowania sprawia, że ​​błędy są dobrze widoczne. joelonsoftware.com/articles/Wrong.html
13
Chcę dodać, że funkcje nazwane są prawie zawsze preferowane w stosunku do funkcji anonimowych w JavaScript. Podczas debugowania pomaga to tonie ustalić, gdzie jesteś na stosie.
Mike McMahon,
1
@yoniLavi powinieneś zapytać o to na meta.
RubberDuck,

Odpowiedzi:

48

Zaleta transferu kodu

W Reacttwoim przypadku przestrzeganie wzorców dostarczonych przez bibliotekę oznacza, że ​​dostarczony produkt będzie łatwo odbierany i obsługiwany przez innych programistów znających również React.

Potencjalne problemy z kompatybilnością wsteczną

Niektóre biblioteki będą miały nową główną wersję, a kompatybilność wsteczna może być zagrożona, jeśli wzorce są znacząco różne, co spowalnia / zatrzymuje przyszłe uaktualnienia. Nie jestem pewien, jak Reactporadziłbym sobie z nowymi wydaniami, ale widziałem to już wcześniej.

Nowi członkowie zespołu zaczynają być produktywniejszymi Quickerami

Jeśli podążasz za tym, co zapewnia autor, bardziej prawdopodobne jest, że zatrudniasz utalentowanych programistów korzystających z twojego frameworka i uruchamiasz ich szybciej z systemem niż ucząc nowych wzorców.

Potencjalne nieodkryte problemy

W przyszłości mogą pojawić się problemy, których jeszcze nie odkryłeś w swoim podejściu, które są rozwiązywane przez autora.

To powiedziawszy, innowacja zawsze stanowi ryzyko, jeśli mocno czujesz, że twoje podejście jest lepsze i działa dla twojego zespołu, idź!

Alexus
źródło
Dziękuję za te doskonałe punkty. Generalnie stosujemy się do wzorów dostarczonych przez bibliotekę. Podane przeze mnie przykłady (znalezione w recenzjach kodu) różnią się. Martwiłem się, że klient może odrzucić i wymagać od nas ponownej realizacji części naszej dostawy, ponieważ nie wyglądało to jak React. Teraz wiem, dlaczego mieliby to zrobić.
Andreas Warberg,
2
+1 "rather than teaching new patterns"- szkolenie proceduralne zajmuje bardzo dużo czasu dzięki nowym pracownikom. Zawsze staraj się minimalizować koszty czasu,
nakładając
1
@Alexus: Jeśli chodzi o kompatybilność wsteczną, React wciąż nie jest w wersji 1.0. Obecna wersja, 0.13, zepsuła kompatybilność w dość drastyczny sposób, jednak to, czy te awarie się zdarzają, zależy od tego, jaki mechanizm jest używany do wywoływania komponentów React. Posiadanie bardzo spójnych reguł wywoływania React może nie zapobiegać uszkodzeniu kodu przez aktualizacje React, ale ustalanie spójnego kodu jest łatwiejsze, szybsze i bardziej niezawodne. Twoje obawy dotyczące problemów ze zgodnością wsteczną są zdecydowanie uzasadnione w przypadku React. Np. Zobacz mój komentarz na stackoverflow.com/a/20913637/18192
Brian
53

Niespójności zmuszają cię do zatrzymania się i zastanowienia, dlaczego , które i gdzie :

  • Kiedy czytasz część kodu i widzisz, że używa on innego stylu niż reszta kodu, zastanawiasz się - dlaczego ta część jest inna? Czy to jakiś szczególny powód, o którym muszę wiedzieć? Jest to niebezpieczne, ponieważ jeśli naprawdę istnieje powód, dla którego ta część jest inna, musisz być tego świadomy, w przeciwnym razie możesz stworzyć paskudne błędy. Zamiast myśleć o oryginalnym problemie, który spowodował, że dotknąłeś tego kodu, tracisz teraz czas na zastanawianie się, dlaczego jest on inny, i nie możesz tego rozgryźć, więc idź do oryginalnego autora, aby go zapytać, marnując także czas i co gorsza - w trakcie procesu oboje tracicie mentalny model problemów, nad którymi pracowaliście.

    Pomnóż przez każdego innego programistę w zespole, który musi dotknąć / odczytać ten kod.

  • Kiedy musisz dodać do kodu, który używa wielu stylów, musisz zatrzymać i zdecydować, którego stylu użyć do dodania. Musisz podjąć wystarczającą liczbę decyzji, które mają znaczenie - marnowanie czasu na marnowanie czasu na myślenie o decyzjach, które nie mają znaczenia.

  • Gdy styl jest spójny, łatwo jest poruszać się po kodzie, ponieważ spójność pomaga szybko znaleźć miejsce, w którym się znajduje. W przypadku niespójnego stylu nawet grepowanie staje się trudniejsze, ponieważ nie wiesz, jakiego stylu używasz.

Idan Arye
źródło
6
Świetny, fanstastyczny wgląd. Dlaczego niektórzy programiści po prostu to „łapią”, a inni walczą z tym?
Dogweather
2
Podejrzany, ponieważ zaproponowany teraz spójny styl jest głęboko niezgodny z tym, nad czym pracowali w poprzednich projektach. Szczególnie dla osób z dużym doświadczeniem w różnych środowiskach.
Kickstart,
4

Kod może być dobrze napisany, ale nie do końca spójny, więc niektórym klientom nie zależy. Kiedy wszystko zaczyna się psuć, czy chcesz dać im jeszcze jedno pukanie? Gdybym zatrudnił firmę do pracy nad projektem złożonym z wielu programistów i nie wskazali mi, że mają standard kodowania i postępują zgodnie z nim, byłbym sceptyczny.

Musimy utrzymywać szybkie tempo, aby dotrzymywać terminów, a ja nie chcę niepotrzebnie obciążać zespołu.

Dopóki standardy kodowania nie są zbyt szalone, nie powinno być dla wszystkich tak trudne. Projekty utknęły w martwym punkcie, ponieważ ludzie nie wiedzą, jaki kod pisać lub nie pisać, a nie z powodu pisania i formatowania. Dowiesz się, że zaszedłeś za daleko, gdy przyleganie zajmuje nieproporcjonalnie dużo czasu. Mam nadzieję, że to nie jest twoje pierwsze rodeo.

Przeprowadź własny test Wszystko, co musisz zrobić, to przełączyć zadania w połowie z jednego programisty na drugiego i pozwolić im dokończyć czyjąś plik. Czy spędzają czas całkowicie zmieniając formatowanie swoich wersji? Czy jest to zbyt trudne do naśladowania? Będzie gorzej dla zespołu obsługi klienta.

JeffO
źródło
2

Miałem szczęście, traktując style kodu tak, jak traktuję pisanie stylów w naturalnym języku angielskim. Istnieje szeroki wachlarz stylów, od konwersacyjnego języka angielskiego, który naśladuje sposób, w jaki mówimy w codziennej rozmowie, po formalny angielski, który jest często ciężki i naznaczony zawsze bardzo precyzyjnym znaczeniem.

Zastanów się, jak chcesz wyglądać produkt końcowy w tym sensie. Niektóre sytuacje bardzo pomagają w użyciu najlepszej struktury w danym momencie. Inne wymagają jednolitej kadencji i struktury. Jest to szczególnie ważne, jeśli twój produkt jest najlepszy, jakby został napisany w języku angielskim. W tym przypadku mogą pomóc kolokwializm, ale łzawią nadrzędny charakter produktu.

Ogólnie rzecz biorąc, im bardziej spójny jest Twój standard kodowania, tym mniej wysiłku programista musi podjąć, aby zwrócić uwagę na coś interesującego. Jeśli popierasz dużą różnorodność standardów kodowania, programiści muszą głośniej ogłaszać, że robią coś niezwykłego lub wyjątkowego. Ta próba wyrażenia tego, co programista uważa za ważny, może często przyćmić dynamiczny zakres samego kodu. Kiedy tak się dzieje, łatwo jest przeniknąć błędy, ponieważ po prostu zbyt trudno je zobaczyć.

Z drugiej strony, im bardziej luźne są twoje standardy kodowania, tym więcej twórców swobody musi dostosować swoją składnię do problemu. W ironicznym kontraście z argumentem pro-kodowania standardów, zbyt duża standaryzacja może prowadzić do stilted struktury kodu, co może również ułatwić przechodzenie błędów.

To, czego szukasz, to radosne medium twojego zespołu.

Cort Ammon
źródło
2

Jak zauważyło kilku innych, gdy programiści zajmujący się konserwacją muszą iść za tobą, sekcja kodu w innym stylu spowoduje, że zatrzymają się i spróbują dowiedzieć się, co jest specjalnego w tej sekcji. Istnieje również bardzo realne ryzyko, że niespójny styl zostanie przeniesiony do innych sekcji, co spowoduje ogromny bałagan później.

Mam wrażenie, że w głębi duszy znasz już odpowiedź na to pytanie, a nawet nie stawiłbyś jej czoła, gdyby nie to:

Musimy utrzymywać szybkie tempo, aby dotrzymywać terminów, a ja nie chcę niepotrzebnie obciążać zespołu.

To zawsze wydaje się być uniwersalnym kompromisem ... robienie tego szybko vs robienie tego dobrze. Tylko Ty możesz ocenić konsekwencje poświęcenia dobrych praktyk kodowania w przypadku zmiany terminów klientów. Muszę jednak zgodzić się z JeffO, gdy zauważa, że ​​przestrzeganie (prawdopodobnie nietypowego lub sprzecznego z intuicją) stylu kodowania nie powinno spowalniać twojego zespołu tak drastycznie, że terminy znacznie się przesuwają.

Chociaż od lat znałem tę koncepcję, dopiero niedawno poznałem termin „ dług techniczny ”. Naprawdę musisz wziąć pod uwagę dług techniczny, który ostatecznie będzie musiał zostać spłacony, jeśli nie będziesz postępować zgodnie z zdyscyplinowanym stylem.

Niestety, jak stwierdzono w eBiznesie, chyba że twój klient jest szczególnie bystry technicznie lub nie zamierza później sam utrzymywać kodu, trudno jest mu docenić wartość spójnych standardów kodowania. Jednak każdy rozsądny biznesmen powinien być w stanie pojąć koncepcję, że „odrobina konserwacji zapobiegawczej teraz” (w postaci dobrego kodowania) „pomoże uniknąć znacznych kosztów naprawy później” (w postaci zmarnowanego czasu programisty później na sprzątanie bałagan).

Michael C.
źródło
Klient jest doświadczony technicznie i najprawdopodobniej przejmie konserwację i dalszy rozwój rozwiązania w pewnym momencie. Dotychczasowe pytania i odpowiedzi koncentrowały się na układzie wizualnym, a nie na funkcjonalności. Gdy zaczną pojawiać się błędy funkcjonalne, poczujemy, jak wygląda konserwacja. Myślę, że recenzje kodu byłyby szybsze i bardziej spójne (ograniczanie zaskakujących nowych sposobów robienia tego samego). Klient oczywiście chce maksymalnej spójności (ale może nie za to dodatkowo płacić).
Andreas Warberg,
2

Najpopularniejsze odpowiedzi tutaj powtarzają łatwe do zaakceptowania teoretyczne najlepsze praktyki opisujące szczegółowo, jak wszyscy chcielibyśmy, aby nasze bazy kodu były. Ale prawdziwy kod jakoś nigdy tak nie wygląda. Jeśli spróbujesz stworzyć tę idealną bazę kodów, prawie nieuchronnie zawiedziesz. Nie oznacza to, że nie powinniśmy próbować robić lepiej, ale musi istnieć limit określający, jak daleko od realistycznie osiągalnych celów wyznaczamy nasze cele.

Zbyt duży nacisk na drobne rzeczy grozi utratą koncentracji na ważniejszych kwestiach, takich jak rozwiązanie zadania w sposób najbardziej efektywny.

Pierwszego przykładu nie nazwałbym stylem, styl to wybory, w których nie ma wyraźnego dobra lub zła, w tym przypadku dodatkową funkcją jest rozdęty kod bez dodatkowej korzyści. To tylko 2 dodatkowe wiersze, wciąż łatwe do odczytania i łatwe do naprawienia, więc sam ten przykład nie jest dużym problemem.

Dużo większym problemem jest zawijany kod. Funkcje opakowania, hierarchie klas i wszelkiego rodzaju inne konstrukcje, w których otaczający kod jest na tyle złożony, że nie jest oczywiste, że nie służą one żadnemu rzeczywistemu celowi. Jeśli w kodzie jest oczywisty wzdęcie, prawdopodobnie jest o wiele więcej nieoczywistych wzdęć. Dużo trudniej jest coś z tym zrobić i trudniej jest go dostrzec, ale jest to również znacznie większy problem.

O klientach

Klienci zwykle koncentrują się na uzyskaniu działającego produktu, który zaspokoi ich potrzeby. Nawet jeśli masz jednego z niewielu klientów, którzy martwią się jakością kodu, będzie to drugi priorytet, a ich idea jakości kodu może nie być całkowicie zgodna z twoją. Firma klienta może mieć własnych programistów, ale to zarządzanie decyduje, czy wykonałeś dobrą robotę, a zarządzanie najprawdopodobniej nawet nie wie, co oznacza jakość kodu.

aaaaaaaaaaaa
źródło
Podczas przeglądania kodu szukam kilku rzeczy, które moim zdaniem są zdecydowanie ważne, takich jak bezpośrednia manipulacja DOM, nielokalizowane ciągi użytkownika, możliwości ponownego użycia (istniejący komponent, pomocnik, już załadowana biblioteka innej firmy itp.), Niezgodne lub niewłaściwe zmiany do wspólnego kodu, odstępstwo od konwencji klienta i konwencji. Wartość spójności stylu i wzorców kodowania nie była dla mnie jasna, więc nie byłem pewien, jak odpowiedzieć na te w recenzjach kodu.
Andreas Warberg,
0

Chodzi przede wszystkim o czytelność różnic. Jeśli styl kodu krąży wokół, różnice ukrywają zmiany bez semantycznego znaczenia dla programu i mogą utrudniać lub uniemożliwiać scalanie.

Obrabować
źródło