Praktyczne code reviews - PHPConPl

42
Praktyczne code reviews Sebastian Marek - Internal Systems Technical Architect

description

Wbrew powszechnym opiniom, nie tak prosto jest zrobić dobre Code Review. Robione w pośpiechu, tylko po to by je "odbębnić", często stwarza więcej szkody niż pożytku. Opowiem wam dlaczego code review jest ważne i jak wykorzystać ten proces aby upewnić się, że napisany kod jest najwyższej jakości. Będę nie tylko mówił o tym kto powinien robić code reviews, i dla kogo, jakie informacje są potrzebne do przeprowadzenia skutecznego code review, ale także jak zrobić dobre code review w najkrótszym możliwym czasie.

Transcript of Praktyczne code reviews - PHPConPl

Page 1: Praktyczne code reviews - PHPConPl

Praktyczne code reviews

Sebastian Marek -

Internal Systems Technical Architect

Page 2: Praktyczne code reviews - PHPConPl

@proofek

!• ponad  12  lat  doświadczenia  w  

programowaniu  • zwolennik  automatyzacji  

procesów  • TDD  i  CI  • w  miarę  wolnego  czasu  

wspiera  open  source

h"ps://joind.in/9759

Page 3: Praktyczne code reviews - PHPConPl

https://www.codeclub.org.uk/

Ochotnik Projekt Miejsce Dzieci

+ + +

Światowa sieć klubów programistycznych dla dzieci od 9 do 11 roku życia

Page 4: Praktyczne code reviews - PHPConPl

Dla kogo?

Page 5: Praktyczne code reviews - PHPConPl

Na początek

Wszystkie wydarzenia i postacie w tej prezentacji są fikcyjne.

!Jakiekolwiek podobieństwo jest całkowicie przypadkowe.

Page 6: Praktyczne code reviews - PHPConPl

Zespół

Stefan “Ma być zrobione” –  Kierownik

Roman “Potrzebuję to na wczoraj” –  Właściciel firmy

Page 7: Praktyczne code reviews - PHPConPl

Zespół

“Nocny Marek” – programista

Krzysiek “Haker” –  doświadczony programista

Paweł “Będzie dobrze” – praktykant

Page 8: Praktyczne code reviews - PHPConPl

Sytuacja 1

Jak długo zajmie wam skończenie tego projektu?

Hmm, projekt, programowanie, code review, testy…

Code review? A po co code review? Co, programować nie umiecie? Poza tym przecież będą testy...?

Page 9: Praktyczne code reviews - PHPConPl

Sytuacja 2

Hmmm… ale wszyscy mają kupę roboty! Nie ma nikogo wolnego. Dajmy sobie spokój i puśćmy to prosto do testów…

Ok. Prawie gotowe! Jeszcze tylko code review...

Page 10: Praktyczne code reviews - PHPConPl

Sytuacja 3

Cześć Stefan, Potrzebuję Marka, żeby zrobił mi to code review.

Marek pracuje nad czymś ważnym teraz, ale Paweł może na to spojrzeć.

Ale Paweł jest stażystą i nie zna jeszcze tego systemu...

Chcesz mieć to code review zrobione czy nie?! Mam tylko Pawła.

Page 11: Praktyczne code reviews - PHPConPl

Sytuacja 4

Ciągle robimy te code review, patrzymy na ten kod, spędzamy nad tym masę czasu, a za każdym razem jak wypuszczamy nowy produkt mamy problemy. Marnujemy tylko czas!

Page 12: Praktyczne code reviews - PHPConPl

Code review

Marek - programistado  Krzysiek  -­‐  inspektor

21:31 (0 minut temu)

Krzysiek,  !Możesz proszę spojrzeć na to? Właśnie skończyłem nad tym pracować.  Zmiany są w moim repozytorium w gałęzi “problem-naprawiony”.  !Dzięki  !---  Marek

Kliknij tutaj, aby Odpowiedz or Przekaż dalej

Page 13: Praktyczne code reviews - PHPConPl

Prośba o code review

Tylko  nie  (e)mail!

Page 14: Praktyczne code reviews - PHPConPl

Jak poprosić?

Systemy  śledzenia  błędów  -­‐ JIRA  -­‐ Bugtrak  -­‐ ManFs  !Narzędzia  -­‐ Crucible/Fisheye  -­‐ Gerrit  -­‐ Github  -­‐ Phabricator

Page 15: Praktyczne code reviews - PHPConPl

Code review

21:31 PM (13 minut temu)

Krzysiek - Inspektordo  Marek  -­‐  programista

21:44 (0 minut temu)

Marek,  !Spoko, tylko na bazie jakiej gałęzi stworzyłeś tą gałąź?  Bez tego nie dam rady zidentyfikować zestawu zmian.  !---  Krzysiek

Marek - programistado  Krzysiek  -­‐  inspektor

Krzysiek,  !Możesz proszę spojrzeć na to? Właśnie skończyłem nad tym pracować.  Zmiany są w moim repozytorium w gałęzi “problem-naprawiony”.  !Dzięki  !---  Marek

Kliknij tutaj, aby Odpowiedz or Przekaż dalej

Page 16: Praktyczne code reviews - PHPConPl

Na co zwracać uwagę?

Systemy  kontroli  wersji  • konkretne  zestawy  zmian  (changesets)  

• unikanie  konkretnych  commitów  

• inspekcja  łatek  (patches)  ryzykowna,  chyba  że  zautomatyzowana

Page 17: Praktyczne code reviews - PHPConPl

Code review

21:31 (25 minut temu)

Krzysiek, Możesz proszę an to spojrzeć? Właśnie skończyłem nad tym pracować…

21:44 (12 minut temu)

Marek,  !Spoko, tylko na bazie jakiej gałęzi stworzyłeś tą gałąź?  Bez tego nie dam rady zidentyfikować zestawu zmian.  !---  Krzysiek

21:56 PM (0 minut temu)

Krzysiek,  !No tak, przepraszam. Gałąź stworzyłem na podstawie mastera.  !---  Marek

Marek - programista

Krzysiek - Inspektordo  Marek  -­‐  programista

Marek - programistado  Krzysiek  -­‐  inspektor

Page 18: Praktyczne code reviews - PHPConPl

Po co?

Co i !

dlaczego?

Page 19: Praktyczne code reviews - PHPConPl

Tak też można…

Paweł  “Będzie  dobrze”

• ma  sens  • działa  • poprawne  syntaktycznie  • ok

Tradycyjne  komentarze:

Page 20: Praktyczne code reviews - PHPConPl

Ale można i tak…

Krzysiek  “Doświadczony  Inspektor”

• PHP  linter  • PHP  Code  Sniffer  • PHPUnit  • phpDocumentor  • PHP  Depend  • PHP  Mess  Detector  • SonarQube

Używane  narzędzia:

Page 21: Praktyczne code reviews - PHPConPl

Automatyzacja - PHP linter i PHP CodeSniffer

$ php -l Libraries/Action.class.php  No syntax errors detected in Libraries/Action.class.php

$ php -l Libraries/Action.class.php  Errors parsing Libraries/Action.class.php

$ phpcs –standard=Zend Libraries/Action.class.php  !FILE: /Volumes/git/modules/AccountChange/Libraries/Action.class.php  --------------------------------------------------------------------------------  FOUND 2 ERROR(S) AND 1 WARNING(S) AFFECTING 3 LINE(S)  --------------------------------------------------------------------------------   44 | ERROR | Protected member variable "arrOptions" must contain a leading   | | underscore   66 | WARNING | Line exceeds 80 characters; contains 82 characters   97 | ERROR | Line exceeds maximum limit of 120 characters; contains 135   | | characters  --------------------------------------------------------------------------------  !Time: 0 seconds, Memory: 5.75Mb

Page 22: Praktyczne code reviews - PHPConPl

Unit testy z PHPUnit

$ phpunit  PHPUnit 3.6.12 by Sebastian Bergmann.  !Configuration read from phpunit.xml.dist  !..................IIII................IIIIIIIIIIIIIIIIIIIIIII.. 63 / 240 ( 26%)  .............................................I.....I........... 126 / 240 ( 52%)  ............................................................... 189 / 240 ( 78%)  ...................................................  !Time: 02:01, Memory: 26.75Mb

OK, but incomplete or skipped tests!  Tests: 240, Assertions: 514, Incomplete: 29.

Page 23: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z PHP Depend

PHP_Depend 0.10.6 by Manuel Pichler  !Parsing source files:  .................... 20  !Executing CyclomaticComplexity-Analyzer:  ............. 261  !Executing ClassLevel-Analyzer:  ............ 247  !Executing CodeRank-Analyzer:  . 28  !Executing Coupling-Analyzer:  ............. 267  !Executing Hierarchy-Analyzer:  ............ 246  !Executing Inheritance-Analyzer:  . 30  !Executing NPathComplexity-Analyzer:  .............. 283  !Executing NodeCount-Analyzer:  ........ 174  !Executing NodeLoc-Analyzer:  .......... 205  !Generating pdepend log files, this may take a moment.  !Time: 00:05; Memory: 25.50Mb

Page 24: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z PHP Mess Detector

Page 25: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 26: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 27: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 28: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 29: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 30: Praktyczne code reviews - PHPConPl

Statyczna analiza kodu z SonarQube

Page 31: Praktyczne code reviews - PHPConPl

…zwraca uwagę na najważniejsze rzeczy

Sprawdza:• przejrzystość  kodu  • wydajność  • nadmierna  złożoność  (complexity)  

• wpływ  na  inne  systemy  • czy  problem  został  rozwiązany

• duplikacja  kodu  • jakość  kodu  • problemy  z  wdrażaniem  systemu  (deployment)  

• niedociągnięcia  na  etapie  projektowania  (soZware  design)

Krzysiek  “Doświadczony  Inspektor”

Page 32: Praktyczne code reviews - PHPConPl

Największa zaleta – korzystają na tym wszyscy!

• Przekazywanie  wiedzy  • Szkolenie  nowych/początkujących  

programistów  • Wczesne  wykrywanie  błędów  i  

problemów    • Poprawa  jakości  kodu  • Promowanie  zbiorowej  

odpowiedzialności  za  kod  

Page 33: Praktyczne code reviews - PHPConPl

Relacje międzyludzkie - programiści

• Zaakceptuj  fakt,  że  każdy  popełnia  błędy  (ty  też!)  !

• “dziurawy”  kod  !=  kiepski  programista  !

• nieważne  jak  dużo  wiesz,  zawsze  znajdzie  się  ktoś  kto  wie  więcej  !

• Nie  przepisuj  kodu  bez  wcześniejszych  uzgodnień  

PRO

GR

AM

IŚC

I

Page 34: Praktyczne code reviews - PHPConPl

Relacje międzyludzkie – inspektorzy

• Prawdziwy  autorytet  jest  poparty  wiedzą  i  doświadczeniem,  a  nie  stanowiskiem  !

• Krytykuj  kod  a  nie  ludzi

INSP

EKTO

RZY

Page 35: Praktyczne code reviews - PHPConPl

Podsumowanie - co zawrzeć w code review

• Gdzie  szukać  kodu  – Repozytorium,  nazwa  gałęzi,  podstawa  gałęzi  

• Opis  zmiany  – Co  zostało  zmienione?  

• Powód  zmiany  – Dlaczego  kod  został  zmieniony?

CO

?

Page 36: Praktyczne code reviews - PHPConPl

Podsumowanie - kto powinien przeprowadzić inspekcję kodu?

• Pytaj  ekspertów  – W  razie  wątpliwości  proś  o  pomoc    

• KwesFonuj  implementację  – Upewnij  się,  że  problem  został  właściwie  

rozwiązany

KTO

?

Page 37: Praktyczne code reviews - PHPConPl

Podsumowanie – jak zgłosić code review?

• Historia  zmian  – systemy  śledzenia  błędów,  np.  Jira,  Trac,  ManFs,  itd.  – narzędzia  do  inspekcji  kodu,  np.  Fisheye/Crucible,  gerrit,  

Phabricator    • Rozmowa/Programowanie  w  parach  

– upewnij  się,  że  komentarze  są  udokumentowane

GD

ZIE?

Page 38: Praktyczne code reviews - PHPConPl

Podsumowanie - jak przeprowadzić dobrą inspekcję?

• Używaj  narzędzi,  automatyzuj  • Zwracaj  uwagę  na  duplikację  i  zbyt  skomplikowany  kod  

• Oceń  wpływ  na  inne  systemy  • Upewnij  się,  że  kod  jest  dobrze  udokumentowany  i  łatwy  do  zrozumienia

JAK

?

Page 39: Praktyczne code reviews - PHPConPl
Page 41: Praktyczne code reviews - PHPConPl

…i dodatkowe materiały

The  Ten  Commandments  of  Egoless  Programming:  hgp://alturl.com/q4dpa  !The  Code  review:  hgp://www.soulbroken.co.uk/blog/2010/07/the-­‐code-­‐review/    !Fisheye/Crucible:  hgp://www.atlassian.com/soZware/crucible/overview  !Gerrit:  hgp://code.google.com/p/gerrit/  !Github:  hgps://github.com/  !Phabricator:  hgp://phabricator.org  !PHPUnit:  hgp://phpunit.de    !PHP  CodeSniffer:  hgp://pear.php.net/PHP_CodeSniffer    !PHP  Depend:  hgp://pdepend.org/    !PHP  Mess  Detector:  hgp://phpmd.org/    !SonarQube:  hgp://www.sonarqube.org/  

Page 42: Praktyczne code reviews - PHPConPl

Pytania

Pytania?

h"ps://                          /9759