Programowanie dawno już przestało być domeną samotnych jeźdźców i stało się prawdziwą grą zespołową. Oczywiście nadal da się w pojedynkę stworzyć sensowną aplikację, ale zawsze będzie to trwało znacznie dłużej niż w przypadku pracy kilkuosobowego zespołu. Dopracowanie szczegółów również jest bardziej efektywne w przypadku pracy zespołowej.
Praca zespołu niesie ze sobą sporo wyzwać organizacyjnych. Na szczęście przez ostanie lata powstały setki rozwiązań usprawniające komunikację, zarządzanie i współtworzenie projektów. Przy odrobinie wysiłku współdzielony projekt nie jest już problemem. Ale nie to jest głównym tematem tego wpisu.
Jednakowe formatowanie kodu
Dziś chciałbym przekazać Ci prostą wskazówkę, o której często zapominają poszczególni członkowie zespołu (a szczególnie Ci dołączający do zespołu w trakcie trwania prac nad projektem). Wskazówkę, która jest banalnie łatwa w realizacji, a znacząco ułatwi życie Twoim współpracownikom. Chodzi mianowicie o skonfigurowanie formatowania kodu w Twoim IDE w dokładnie taki sam sposób jak ma reszta członków zespołu.
Sam niejednokrotnie doświadczyłem sytuacji, w której dołączając do jakiegoś projektu i będąc w niego wdrażany zapominałem (lub osoba mnie wdrażająca zapominała) właśnie o jednakowej konfiguracji formatowania kodu. Możesz sobie teraz pomyśleć: „No i co z tego? W czym to przeszkadza?”. Mimo błahości wskazówki ma ona większe znaczenie, niż mogłoby się wydawać.
Najczęstsze problemy
Wymienię teraz kilka przykładów sytuacji, z którymi miałem do czynienia, a które były spowodowane właśnie przez inne ustawienia formatowania.
Importy
Najprostszym i chyba najmniej uciążliwym przykładem jest konfiguracja organizowania importów zewnętrznych klas i bibliotek. W każdym sensownym IDE masz możliwość skonfigurowania na przykład kolejności importów lub tego przy ilu importach z danego pakietu importy będą kondensowane w import całego pakietu. Często zdarza się również, że IDE jest skonfigurowanie w ten sposób, żeby przy każdej edycji i zapisie automatycznie reorganizowało importy. Jeśli więc zechcesz edytować plik, choćby poprzez zmianę nazwy zmiennej, który stworzył kolega z zespołu posiadający inne ustawienia, to przy zapisie Twoje IDE przeorganizuje importy po Twojemu. Ty wrzucisz taką zmianę do repozytorium, Twój kolega pobierze plik, edytuje go i sytuacja powtórzy się po jego stronie. I możecie tak bez końca 🙂
Cykl artykułów "Vademecum Juniora"
Ten wpis jest częścią cyklu, w ramach którego opisuję moje doświadczenia i spostrzeżenia na temat programistycznego rzemiosła. Cykl jest dedykowany osobom rozpoczynającym swoją przygodę z zawodowym programowaniem lub planują taki krok w przyszłości.
Artykuły składające się na Vademecum Juniora zawierają różne porady, wskazówki i przykłady z pracy jako programista. Nie są one ani uporządkowane chronologicznie, ani mocno ze sobą powiązane. Możesz je więc czytać niezależnie od siebie i w dowolnej kolejności. Polecam jednak zapoznać się z treścią wszystkich wpisów, gdyż wierzę, że z każdego możesz dowiedzieć się czegoś wartościowego.
Znaki końca linii i kodowanie plików
Kwestia problemów z kodowaniem i separatorami linii w plikach pojawia się głównie wtedy gdy członkowie zespołu pracują na różnych systemach operacyjnych. Zazwyczaj bowiem IDE domyślnie czerpią te ustawienia z systemów, a te się między sobą różnią. Jeśli nie chcesz widzieć co chwilę jakichś dziwnych znaczków w kodzie, to sprawę możesz ogarnąć na poziomie IDE lub w lokalnych ustawieniach niektórych systemów kontroli wersji (np. Gita).
Spacje vs. tabulatory
Spór o to czego używać do wcięć w kodzie jest tak samo kluczowy jak ten o to co jest bardziej kultowe – Star Wars, czy Star Trek 🙂 Nie ważne czego używasz i w jakich ilościach. Mogą być dwie spacje, mogą być 4, może być tabulator. Używaj czego chcesz. Byle koledzy z zespołu używali tego samego. Najważniejszym jest nie mieszać 😉
Niespójność w wyborze pomiędzy spacją, tabulatorem i ich ilością, to najbardziej upierdliwy z wymienionych tu przypadków. Wyobraź sobie bowiem sytuację, w której kod w repozytorium skonfigurowany został na dwie spacje. Ty u siebie masz ustawiony jeden tabulator. Twój kolega z zespołu ma dwie spacje zgodnie z ogólną konwencją. Zarówno ty, jak i Twój kolega edytujecie ten sam plik u siebie lokalnie. Ty zapisujesz swoje zmiany, a IDE automatycznie formatuje Ci kod całego pliku i zamienia dwie spacje na tabulatory. Wysyłasz zmiany do wspólnego repozytorium. Twój kolega wprowadził swoje zmiany, ale cały czas ma plik, w którym na początku linii są spacje. Również postanowił wrzucić swój kod do repozytorium. Co się stanie? Wielki konflikt. System kontroli wersji nie poradzi sobie z tą sytuacją i przy próbie mergowania, podczas porównywania plików, Twój kolega zobaczy tylko tyle, że cały plik się zmienił. Wszystkie linie zaświecą się mu na czerwono. Ręczne łączenie jest w tym momencie uciążliwe i bardzo łatwo jest pominąć faktycznie wprowadzone zmiany.
Ujednolicenie konfiguracji jest bardzo proste
Na chwilę obecną wszystkie kluczowe IDE dobrze wspierają ujednolicenie konfiguracji pomiędzy środowiskami kilku deweloperów. Dzięki możliwości importu/eksportu ustawień wystarczy kilka kliknięć i konfigurację jednego IDE można skopiować do dowolnego innego.
Dla starych wyjadaczy dzisiejszy wpis nie jest zapewne niczym odkrywczym. Jeśli jednak zaliczasz się do tej grupy i doczytał[a|e]ś do tego miejsca, to jestem Ci za to bardzo wdzięczny. Chętnie dowiem się jeśli masz na powyższy temat inne zdanie. Jeżeli z kolei jesteś osobą dopiero rozpoczynającą swoją karierę programistyczną, to zastosowanie się do dzisiejszych wskazówek pomoże Ci uniknąć złości kolegów z zespołu, którzy nie będą musieli przebijać się przez setki linii konfliktów z Twojego powodu 🙂 Gdybyś miał(a) jakieś uwagi do powyższej treści, to zapraszam do podzielenia się nimi w komentarzu poniżej. Na pewno odniosę się do każdego z nich.
Bądź na bieżąco!
Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową:
lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować
Dołącz do grup na Facebooku
Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.
W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (niekoniecznie młodego) programisty.
Wesprzyj mnie
Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.
Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.
BTW. Oczywiście, że Star Wars 😉
Picture Credits
16 lutego 2017 at 11:46
Co ma formatowanie kodu do konfiguracji IDE? Formater powinien być narzędziem zewnętrznym. Wpis na blogu ma zrzut ekranu z Emacsa, a pisany jest z perspektywy osoby siedzącej w IDE.
Może inaczej: wspólne formatowanie kodu – jak najbardziej i jest to zadanie dla zewnętrznych narzędzi (które mozesz sobie zbindować z IDE czy edytorem). Konfiguracja programu, w którym „wklepujesz tekst” powinna być indywidualna dla developera (skróty klawiszowe, mody/pluginy).
16 lutego 2017 at 12:02
Czy ja wspomniałem cokolwiek o takim samym konfigurowaniu skrótów, czy pluginów w IDE/edytorze? Bynajmniej. Pisałem tylko o konkretnej części jaką jest formatowanie kodu. To czy rozwiążesz to zewnętrznym narzędziem (jak EditorConfig), czy poprzez IDE to już sprawa indywidualna. Ale samo wykorzystanie EditorConfiga (czy czegoś podobnego) też nie pomoże, bo patrząc po liście edytorów ( http://editorconfig.org ) tylko część z nich ma wbudowane wsparcie dla tego narzędzia więc instalując plugin też ingerujesz w konfiguracje IDE/edytora.
16 grudnia 2017 at 15:49
Wg mnie też tytuł wpisu jest mylący — gdy zobaczyłem Twojego tweeta, w którym tytuł posta przypominał niemalże jakieś tldr, w pierwszej chwili zbulwersowałem się również na myśl o tych wszystkich praktykach pair programmingu wdrażanych bez dzielenia konfiguracji na indywidualną i do pracy w kilka osób przy jednej maszynie, począwszy od wyłączenia IdeaVima a skończywszy na dużo trudniejszych do zmiany z dnia na dzień elementach konfiguracji.
15 lutego 2017 at 13:23
Przerabiam ten problem za każdym razem w nowym zespole/projekcie. Problem w tym że zawsze znajdzie się indywidualista, który nie zastosuje się do ww. wytycznych albo zacznie dyskutować dlaczego „jego lepsze”. Rozwiązujemy ten problem w bardzo prosty sposób – Checkstyle. Konfigurujemy reguły zgodnie z wcześniejszymi ustaleniami i za pomocą pluginów do Maven/Gradle włączamy je jako część builda. Jeśli choć jedna z reguł zostanie naruszona to wywalamy builda. Proste i skuteczne.
15 lutego 2017 at 13:45
Checkstyle! Tak! Prawda! Dzięki Marcin za przypomnienie. Faktycznie, współpracowałem z jednym klientem, u którego mieli poustawiany bardzo rygorystyczne reguły Checkstyle i PMD i odpowiedni profil Maven do tego. Na początku wydawało mi się to mega upierdliwe, bo każdy drobiazg był do poprawienia, ale jak już się przyzwyczaiłem i wróciłem do „wolnej amerykanki” w innych projektach to wtedy dopiero zacząłem zauważać bałagan i doceniać rygor i porządek Checkstyle 😉 Zapisałem sobie, żeby napisać kiedyś o tym odrębny artykuł. Dzięki!
16 lutego 2017 at 11:29
Z checkstylem jest problem o tyle, że taka praca może być na początku męcząca bo dopiero przy budowaniu zobaczysz, że napisałeś coś nie tak jak trzeba. Dopiero jak przywykniesz do wymaganego stylu będzie ok. A co jeśli pracujesz dla kilku klientów, którzy mają rygorystyczne zasady i każdy swoje?
Przyszedłem tutaj z zamiarem napisania o .editorconfig ale już ktoś mnie ubiegł 🙂 To jest o tyle fajne, że edytor sam po prostu formatuje kod tak jak należy i nie trzeba się tym mocno przejmować.
Przypuszczam, że w przypadku takich rygorystycznych reguł o jakich napisał Piotr najlepsze efekty dałoby wykorzystanie obu narzędzi (editorconfig + checkstyle). Jeden poprawia drugi weryfikuje. Tylko może być źle jeśli się konfiguracje rozjadą 🙂
Nie wiem tylko czy editorconfig potrafi, aż tyle co checkstyle i zależy też od wsparcia różnych edytorów.
16 lutego 2017 at 11:38
Dzięki Marcin za kolejny wartościowy komentarz 🙂 Masz rację, przełączanie się pomiędzy kontekstami/klientami, którzy używają innych stylów jest strasznie upierdliwe. Ale pomysł z wykorzystaniem editorconfig + checkstyle godny rozważenie 🙂
14 lutego 2017 at 23:15
To ja tylko dorzucę: http://editorconfig.org/
15 lutego 2017 at 05:39
No tak – jest problem, to znajdzie się również tool na jego rozwiązanie 🙂 Dzięki!
15 lutego 2017 at 13:24
Nice. TIL Editorconfig 🙂