{"id":2567,"date":"2023-12-29T17:45:00","date_gmt":"2023-12-29T14:45:00","guid":{"rendered":"https:\/\/guven.atbakan.com\/blog\/?p=2567"},"modified":"2024-09-09T11:47:31","modified_gmt":"2024-09-09T08:47:31","slug":"code-review-hazirlik","status":"publish","type":"post","link":"https:\/\/guven.atbakan.com\/blog\/tr\/code-review-hazirlik\/","title":{"rendered":"Code review: Haz\u0131rl\u0131k"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Code review, ekibimiz i\u00e7erisinde en \u00f6nem verdi\u011fimiz konular\u0131n ba\u015f\u0131nda geliyor. Moneo K\u00fclt\u00fcr\u00fc olarak tan\u0131mlad\u0131\u011f\u0131m\u0131z birka\u00e7 madde var ve bu onlardan birisi. Di\u011fer maddelere \u00f6n\u00fcm\u00fczdeki yaz\u0131larda mutlaka de\u011finiriz, \u015fimdilik code review s\u00fcre\u00e7lerimizden ba\u015flayal\u0131m.<\/p>\n\n\n\n<p>Bu yaz\u0131ya \u201chaz\u0131rl\u0131k\u201d dememin bir sebebi var. Code review\u2019da bizim i\u00e7in olmazsa olmaz baz\u0131 konular var. Bu yaz\u0131da \u00f6n haz\u0131rl\u0131k konular\u0131n\u0131 inceleyece\u011fiz.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Mental haz\u0131rl\u0131k: Code review, bilgi payla\u015f\u0131m&nbsp;arac\u0131d\u0131r<\/h4>\n\n\n\n<p>Code review, sadece kodlar\u0131n incelenmesi de\u011fildir. Elbette kod kalitesi, hatalar\u0131n tespiti gibi konular i\u00e7in yap\u0131l\u0131r. Ama her\u015feyin \u00f6tesinde her bir pull request, yaz\u0131l\u0131m ekibi i\u00e7erisindeki en \u00f6nemli bilgi transfer arac\u0131d\u0131r. Yap\u0131lan i\u015fin ve i\u015fle ilgili teknik bilgilerin payla\u015f\u0131laca\u011f\u0131 yerlerden biridir.<\/p>\n\n\n\n<p><strong>Ger\u00e7eklerden ba\u015flayal\u0131m<\/strong>, hayaller vs hayatlar. \u00c7al\u0131\u015ft\u0131\u011f\u0131m\u0131z projelerin b\u00fcy\u00fck bir \u00e7o\u011funlu\u011fu m\u00fckemmel proje y\u00f6netim s\u00fcre\u00e7leri, m\u00fckemmel task detaylar\u0131 i\u00e7ermeyecek. Daily toplant\u0131lar\u0131nda muhtemelen bir developer di\u011ferini can kula\u011f\u0131yla dinlemeyecek. Jira(vb) i\u00e7erisindeki bir ba\u015fkas\u0131n\u0131n i\u015flerini detayl\u0131ca incelemeyecek. Zaten en ba\u015fa d\u00f6nd\u00fc\u011f\u00fcm\u00fczde, yap\u0131lacak i\u015fler yeteri kadar detayland\u0131r\u0131lmayacak. Bunlar\u0131n ger\u00e7ekler olmad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnen varsa, yorumlara beklerim&nbsp;:)<\/p>\n\n\n\n<p>Bu ger\u00e7ekleri kabul etti\u011fimizde, bir pull request developerlar aras\u0131 <strong>en iyi<\/strong> bilgi payla\u015f\u0131m arac\u0131 haline geliyor. \u00c7\u00fcnk\u00fc developer bunun i\u00e7in ger\u00e7ekten vakit harcayacak. Orada verilen her bilgiyi \u00f6z\u00fcmseyecek ve sorgulayacak. Tabi bunu yapabilmesi i\u00e7in de pull requestlerin iyi tan\u0131ml\u0131 olmas\u0131 gerekiyor.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Pull Request&nbsp;Template<\/h4>\n\n\n\n<p>Pull Request Template, bizim i\u00e7in code review s\u00fcre\u00e7lerinin \u00f6n ko\u015fuludur. 1 sat\u0131rl\u0131k bir de\u011fi\u015fiklik bile olsa, belli ba\u015fl\u0131 bilgilerin PR a\u00e7\u0131klamas\u0131nda bulunmas\u0131n\u0131 bekliyoruz.<\/p>\n\n\n\n<p>Peki nedir bu PR template?<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/cdn-images-1.medium.com\/max\/1600\/1*VWAYD3H9bin1vm6bbWoXPw.png\" alt=\"Bir pull request a\u00e7\u0131klamas\u0131nda bulunan \u015fablon g\u00f6r\u00fcn\u00fcm\u00fcd\u00fcr. De\u011fi\u015fiklik t\u00fcr\u00fc, a\u00e7\u0131klama, test etme y\u00f6ntemi, ekran g\u00f6r\u00fcnt\u00fcleri, notlar, ba\u011f\u0131ml\u0131l\u0131klar gibi bilgileri i\u00e7ermektedir.\" style=\"width:350px\"\/><figcaption class=\"wp-element-caption\">Credit: G\u00f6rseldeki \u015fablon <a href=\"https:\/\/github.com\/csonuryilmaz\" rel=\"noreferrer noopener\" target=\"_blank\">Onur Y\u0131lmaz<\/a> taraf\u0131ndan olu\u015fturulmu\u015ftur.<\/figcaption><\/figure>\n\n\n\n<p>Basit\u00e7e, o PR ile ilgili a\u00e7\u0131klamalar\u0131n yap\u0131laca\u011f\u0131 bir \u015fablon. Bu i\u015f \u015fablonsuz da yap\u0131l\u0131r elbette ama en az\u0131ndan temelde hangi bilgileri istedi\u011fimizi belirtmek i\u015fleri h\u0131zland\u0131r\u0131yor ve her PR i\u00e7in el al\u0131\u015fkanl\u0131\u011f\u0131 sa\u011fl\u0131yor.<\/p>\n\n\n\n<p><strong>Motivation&amp;Context<\/strong> k\u0131sm\u0131nda, bu PR neden a\u00e7\u0131ld\u0131 bilgisi yan\u0131tlan\u0131yor. Bir issue ile ili\u015fkiliyse linklendiriliyor. Ya da a\u00e7\u0131lmas\u0131na sebep olan konu, \u00e7\u00f6z\u00fclen konu vs detaylar\u0131yla aktar\u0131l\u0131yor.<\/p>\n\n\n\n<p><strong>Types of Changes<\/strong>, bu PR\u2019\u0131n ne gibi de\u011fi\u015fiklikler i\u00e7erdi\u011fini belirledi\u011fimiz alan oluyor. Se\u00e7enekleri artt\u0131rabilirsiniz. Bu bir Bugfix\u2019tir ve Breaking Change i\u00e7erir diye i\u015faretleyebiliyoruz. B\u00f6yle bir durumda, review yapan ki\u015fi buna g\u00f6re \u00f6zen g\u00f6stererek yap\u0131yor.<\/p>\n\n\n\n<p><strong>Description<\/strong> k\u0131sm\u0131nda ise, yapt\u0131\u011f\u0131m\u0131z kodsal de\u011fi\u015fiklikleri yaz\u0131ya d\u00f6k\u00fcyoruz. Nas\u0131l \u00e7\u00f6zd\u00fck, ne yapt\u0131k, neleri de\u011fi\u015ftirdik gibi konular\u0131 a\u00e7\u0131k u\u00e7lu bi\u00e7imde yazabiliyoruz.<\/p>\n\n\n\n<p><strong>How has this been tested<\/strong> k\u0131sm\u0131nda ise, developer yapt\u0131\u011f\u0131 i\u015fleri nas\u0131l test etti\u011fini yaz\u0131yor. Review yapan ki\u015fi buradaki bilgilere g\u00f6re kendisi de senaryolar\u0131 tekrarlayabilir ya da developer\u0131n senaryolar\u0131n\u0131n eksik\/ge\u00e7ersiz oldu\u011funu belirleyebilir. Bazen bir i\u015fi yanl\u0131\u015f test edebiliyoruz. Ya da buraya \u201ctest etmedim\u201d de yazabilir.<\/p>\n\n\n\n<p><strong>Screenshots<\/strong> k\u0131sm\u0131 bizim en \u00e7ok \u00f6nem verdi\u011fimiz konu asl\u0131nda. G\u00f6rsel olarak ne de\u011fi\u015fti bilgisini burada g\u00f6r\u00fcyoruz. Bu k\u0131s\u0131m asl\u0131nda bir self kontrol de sa\u011fl\u0131yor. Peki diyelim ki g\u00f6rsel de\u011fi\u015fiklik i\u00e7ermeyen bir de\u011fi\u015fiklik yap\u0131ld\u0131. Bu durumda ne ekliyoruz buraya? Her i\u015fin bir \u00e7\u0131kt\u0131s\u0131 olmak zorunda. Diyelim ki bir cli arac\u0131 de\u011fi\u015ftirildi. Bu durumda bunun \u00e7\u0131kt\u0131lar\u0131 buraya ekleniyor. Ya da veritaban\u0131nda de\u011fi\u015fiklik yap\u0131yorsa bu MR, onunla ilgili de\u011fi\u015fiklikleri ekleyebiliyoruz. Asl\u0131nda nas\u0131l test edildi k\u0131sm\u0131ndaki \u00e7\u0131kt\u0131lar\u0131 buraya y\u00fckl\u00fcyoruz.<\/p>\n\n\n\n<p><strong>Dependencies<\/strong> k\u0131sm\u0131nda ise bunun ba\u011f\u0131ml\u0131 oldu\u011fu di\u011fer i\u015fleri belirtiyoruz. \u00d6rne\u011fin bu PR\u2019dan \u00f6nce ba\u015fka bir PR\u2019\u0131n yay\u0131na al\u0131nmas\u0131 gerekiyordur. Bu durumda onu burada belirtiyoruz. Ya da PR yay\u0131na al\u0131nd\u0131ktan sonra sunucu \u00fczerinde bir i\u015flem yap\u0131lmas\u0131 gerekiyordur. Yine burada belirtiliyor.<\/p>\n\n\n\n<p><strong>Participiants<\/strong> k\u0131sm\u0131 ise, bu PR ile ilgili olan ki\u015filerin listesini tuttu\u011fumuz yer. A,B,C ki\u015filerini\/tak\u0131mlar\u0131n\u0131 ilgilendiriyor gibi bir bilgi ge\u00e7iyoruz.<\/p>\n\n\n\n<p>Bakt\u0131\u011f\u0131n\u0131z zaman sanki \u00e7ok detayl\u0131, \u00e7ok uzun s\u00fcren bir i\u015fmi\u015f gibi g\u00f6r\u00fcnebilir. Ama emin olun eliniz h\u0131zl\u0131ca bu \u015fablona al\u0131\u015facak ve her PR a\u00e7t\u0131\u011f\u0131n\u0131zda t\u0131k\u0131r t\u0131k\u0131r dolduracaks\u0131n\u0131z. Elbette kendi i\u015f s\u00fcre\u00e7lerinize uygun yeni alanlar \u00fcretebilirsiniz.<\/p>\n\n\n\n<p>Yaz\u0131n\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 \u201cCode Review: Haz\u0131rl\u0131k\u201d olarak belirlemi\u015ftim. \u0130lk etapta mental bir haz\u0131rl\u0131ktan bahsettim ve bu etapta da PR\u2019\u0131n sunum haz\u0131rl\u0131\u011f\u0131ndan bahsetmi\u015f oldum. Developerlar\u0131n genel eksi\u011fi sunumlar\u0131 iyi yapamamas\u0131d\u0131r. \u0130llaki s\u00fcper slide\u2019lar, gifler haz\u0131rlamam\u0131za gerek yok. Teknik olarak b\u00f6yle basit bilgiler, bizim sunumlar\u0131m\u0131z oluyor. Code review yapacak ki\u015finin i\u015flerini ne kadar kolayla\u015ft\u0131r\u0131rsak, o kadar faydal\u0131 olur.<\/p>\n\n\n\n<p>Bunun yan\u0131 s\u0131ra proje haf\u0131zas\u0131na \u00e7ok b\u00fcy\u00fck bir katk\u0131 sunuyor buradaki bilgiler. Bir i\u015f neden yap\u0131lm\u0131\u015ft\u0131 sorusunun yan\u0131nda nas\u0131l yap\u0131lm\u0131\u015ft\u0131 sorusunun yan\u0131t\u0131 burada kolayca bulunabiliyor.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Static Analyzers &amp;&nbsp;CI\/CD<\/h4>\n\n\n\n<p>Code review ile ilgili do\u011fru bilinen yanl\u0131\u015flar var. Code review, \u00f6z\u00fcnde hata bulma i\u015flemi de\u011fildir. Bunu asl\u0131nda zaten s\u00f6yledim. Ama yazd\u0131\u011f\u0131m\u0131z koda bakan bir ba\u015fka g\u00f6z, hatalar\u0131n tespiti i\u00e7in faydal\u0131 olabilir. Bazen bir typo yakalar, bazen kod hatas\u0131 bazen de logic hatas\u0131. Yukar\u0131da verdi\u011fimiz bilgilerden beslenerek bu i\u015flemleri daha kolay sa\u011flar. Asl\u0131nda bunu ChatGPT gibi d\u00fc\u015f\u00fcnebilirsiniz. Ne kadar context verirseniz, o kadar iyi sonu\u00e7 al\u0131rs\u0131n\u0131z. Ayn\u0131 zamanda ne kadar az gereksiz bilgi verirseniz, alaca\u011f\u0131n\u0131z sonu\u00e7ta yine daha iyi olur.<\/p>\n\n\n\n<p>Statik analiz ara\u00e7lar\u0131, bizim i\u00e7in temel hatalar\u0131 tespit etmeye yar\u0131yor. Syntax hatas\u0131 olabilir, unutulmu\u015f bir kod olabilir, kullan\u0131lmayan bir method olabilir, siz commit atmadan \u00f6nce kediniz klavyeye basm\u0131\u015f ve yanl\u0131\u015f bir\u015fey eklemi\u015f olabilir. Bunlar hep ya\u015fand\u0131. \u0130\u015fte bu noktada, code review yapan ki\u015finin bu detaylarla u\u011fra\u015fmamas\u0131 i\u00e7in, statik analiz ara\u00e7lar\u0131ndan faydalanabilirsiniz. Code review yapacak ki\u015fi, \u00f6n\u00fcne PR geldi\u011finde \u201cacaba burada syntax hatas\u0131 var m\u0131d\u0131r\u201d diye bir d\u00fc\u015f\u00fcnceyle incelemeyecek. Yani beyni asl\u0131nda bunu arkaplanda d\u00fc\u015f\u00fcnmeyecek \u00e7\u00fcnk\u00fc bu ara\u00e7lar sayesinde syntax hatas\u0131 varsa ki\u015finin \u00f6n\u00fcne gelmeyecek. Code review i\u00e7in bir aday olmayacak.<\/p>\n\n\n\n<p>Bu statik analiz ara\u00e7lar\u0131 nedir derseniz, a\u00e7\u0131k\u00e7as\u0131 dilden dile de\u011fi\u015fir. Kulland\u0131\u011f\u0131n\u0131z ara\u00e7lar\u0131 yorum olarakta yazabilirsiniz. Biz PHP taraf\u0131nda hemen hemen t\u00fcm ara\u00e7lar\u0131 projelere dahil ediyoruz. php-cs-fixer, phpcs, phpstan, phan, var-dump-checker, parallel-linter bu ara\u00e7lar\u0131n ba\u015f\u0131nda geliyor.<\/p>\n\n\n\n<p>Peki CI\/CD bu i\u015fin neresinde? Asl\u0131nda CD, code review a\u015famas\u0131nda bir yerde de\u011fil (eklenebilir, ama temel olarak de\u011fil). Bizi ilgilendiren k\u0131s\u0131m CI yani continuous integration, her branch g\u00f6nderildi\u011finde\/PR a\u00e7\u0131ld\u0131\u011f\u0131nda sizin belirledi\u011finiz tan\u0131mlamalarla \u00e7al\u0131\u015f\u0131r ve istedi\u011finiz kontrolleri yapar. E\u011fer bir sorun varsa, fail olur ve developer\u0131n d\u00fczeltmesi beklenir. Bir projeye ba\u015flad\u0131\u011f\u0131m\u0131zda olmazsa olmazlar\u0131m\u0131z\u0131n ba\u015f\u0131nda CI ortam\u0131n\u0131 kurmak gelir. Zaten bir kere kurduktan sonra, t\u00fcm projelere benzer ortam\u0131 kopyalayabiliyorsunuz. O y\u00fczden buna harcayaca\u011f\u0131n\u0131z 1\u20132 g\u00fcnl\u00fck bir vakit, size gelecekte \u00e7ok b\u00fcy\u00fck zaman kazand\u0131racakt\u0131r. Bir de \u00fcst\u00fcne otomatize testler ekler ve onlar\u0131 da CI \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131rsan\u0131z, code review yapacak ki\u015fi sadece i\u015fin kalitesine, \u00e7\u0131kt\u0131 kalitesine odaklan\u0131r.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>Bu yaz\u0131mda sizlere code review yap\u0131lmas\u0131 i\u00e7in \u201c\u00f6n ko\u015fullardan\u201d bahsettim. Asl\u0131nda anlayaca\u011f\u0131n\u0131z \u00fczere bunlar birer zorunluluk, olmazsa olmaz de\u011fil. Ama i\u015fin kalitesini artt\u0131ran, review s\u00fcre\u00e7lerini h\u0131zland\u0131ran ve bizim her projede uygulad\u0131\u011f\u0131m\u0131z pratikler bunlar. E\u011fer buna benzer pratikleri uygulam\u0131yorsan\u0131z, ufak ufak kullanmaya ba\u015flay\u0131n derim. D\u00fczenli code review yap\u0131lmayan bir projede sadece PR description bile i\u015flerinizin kalitesini artt\u0131racakt\u0131r \u00e7\u00fcnk\u00fc size self-control imkan\u0131 sa\u011flayacakt\u0131r. Siz de kendi projelerinizde uygulad\u0131\u011f\u0131n\u0131z pratikleri yorumlara iletebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Code review, ekibimiz i\u00e7erisinde en \u00f6nem verdi\u011fimiz konular\u0131n ba\u015f\u0131nda geliyor. Moneo K\u00fclt\u00fcr\u00fc olarak tan\u0131mlad\u0131\u011f\u0131m\u0131z birka\u00e7 madde var ve bu onlardan birisi. Di\u011fer maddelere \u00f6n\u00fcm\u00fczdeki yaz\u0131larda mutlaka de\u011finiriz, \u015fimdilik code review s\u00fcre\u00e7lerimizden ba\u015flayal\u0131m. Bu yaz\u0131ya \u201chaz\u0131rl\u0131k\u201d dememin bir sebebi var. Code review\u2019da bizim i\u00e7in olmazsa olmaz baz\u0131 konular var. Bu yaz\u0131da \u00f6n haz\u0131rl\u0131k konular\u0131n\u0131 inceleyece\u011fiz. Mental [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4],"tags":[],"class_list":["post-2567","post","type-post","status-publish","format-standard","hentry","category-yazilim"],"blocksy_meta":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_likes_enabled":true,"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/comments?post=2567"}],"version-history":[{"count":2,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2567\/revisions"}],"predecessor-version":[{"id":2570,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/posts\/2567\/revisions\/2570"}],"wp:attachment":[{"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/media?parent=2567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/categories?post=2567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/guven.atbakan.com\/blog\/wp-json\/wp\/v2\/tags?post=2567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}