{"id":447,"date":"2020-02-10T12:50:20","date_gmt":"2020-02-10T12:50:20","guid":{"rendered":"https:\/\/kalkus.dev\/?p=447"},"modified":"2020-02-10T12:50:21","modified_gmt":"2020-02-10T12:50:21","slug":"problem-nazw-w-programowaniu","status":"publish","type":"post","link":"https:\/\/kalkus.dev\/blog\/2020\/02\/10\/problem-nazw-w-programowaniu\/","title":{"rendered":"Problem nazw w programowaniu"},"content":{"rendered":"\n<p><strong>Czytanie kodu \u017ar\u00f3d\u0142owego jest trudniejsze, ni\u017c jego pisanie. <\/strong>Przyzna to ka\u017cdy kto pracowa\u0142 z odziedziczonym repozytorium i pr\u00f3bowa\u0142 zrozumie\u0107 jego dzia\u0142anie. Przebijanie si\u0119 przez tysi\u0105ce linii kodu, przez setki definicji funkcji i zmiennych, w pr\u00f3bie zrozumienia co autorzy mieli na my\u015bli jest ci\u0119\u017ckim, m\u0119cz\u0105cym, okrutnie wyczerpuj\u0105cym zadaniem.<\/p>\n\n\n\n<p>Dlaczego tak jest?<\/p>\n\n\n\n<p><strong>Czy zrozumienie przepisu kuchennego jest trudne?<\/strong><\/p>\n\n\n\n<p><strong>Czy jest trudniejsze od napisania go?<\/strong><\/p>\n\n\n\n<p><strong>Czy zrozumienie przepisu kuchennego sprzed trzydziestu lat jest trudniejsze od zrozumienia przepisu sprzed tygodnia?<\/strong><\/p>\n\n\n\n<p>Nie s\u0105dz\u0119.<\/p>\n\n\n\n<p>Czemu wi\u0119c czytanie kodu \u017ar\u00f3d\u0142owego staje si\u0119 trudniejsze z ka\u017cdym kolejnym miesi\u0105cem od jego powstania? Dlaczego nowy kod jest czytelny, a stary niezrozumia\u0142y? Jaka mo\u017ce by\u0107 przyczyn\u0105 &#8220;gnicia oprogramowania&#8221; i nienawi\u015bci do legacy code?<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"1024\" height=\"870\" src=\"https:\/\/kalkus.dev\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1-1024x870.jpg\" alt=\"\" class=\"wp-image-449\" srcset=\"https:\/\/kalkus.dev\/blog\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1-1024x870.jpg 1024w, https:\/\/kalkus.dev\/blog\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1-300x255.jpg 300w, https:\/\/kalkus.dev\/blog\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1-768x653.jpg 768w, https:\/\/kalkus.dev\/blog\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1-1536x1305.jpg 1536w, https:\/\/kalkus.dev\/blog\/wp-content\/uploads\/2020\/02\/4408196113_d2d7db2635_k-1.jpg 1996w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Zastan\u00f3wmy si\u0119 nad czynno\u015bci\u0105\nczytania kodu \u017ar\u00f3d\u0142owego. Co robimy pr\u00f3buj\u0105c zrozumie\u0107 program, wgry\u017a\u0107 si\u0119 w\nkod?<\/p>\n\n\n\n<p>Dzia\u0142amy jak komputery, tylko\nmniej wydajnie. Przegl\u0105damy kod, czytamy go, napotykamy na zmienne i funkcje.\nNie b\u0119d\u0105c maszynami nie jeste\u015bmy w stanie spami\u0119ta\u0107 ka\u017cdej warto\u015bci oraz ci\u0105gu\nkonstrukcji. Pr\u00f3bujemy wi\u0119c &#8220;zrozumie\u0107&#8221; kod. Napotykaj\u0105c na nazw\u0119\nzmiennej staramy si\u0119 domy\u015bli\u0107, co oznacza i w jakim kontek\u015bcie jest u\u017cywana.\nNazwy funkcji lub procedur r\u00f3wnie\u017c pr\u00f3bujemy zrozumie\u0107, najlepiej bez wnikania\nw ich tre\u015b\u0107.<\/p>\n\n\n\n<p>Dok\u0142adnie tak samo dzia\u0142amy w\n\u015bwiecie rzeczywistym. Gdy w przepisie napotykamy na s\u0142owo &#8220;marchew&#8221;\nwyobra\u017camy sobie marchew. Rozumiemy ide\u0119 marchewki bez zapoznawania si\u0119 \u017ce\nszczeg\u00f3\u0142ami takimi jak jej masa, kolor, DNA, czy temperatura.<\/p>\n\n\n\n<p>Kod \u017ar\u00f3d\u0142owy jednak &#8211; mimo stara\u0144\nobozu oprogramowania zorientowanego obiektowo &#8211; nie jest jak \u015bwiat rzeczywisty.\nOdstaje od niego znacz\u0105co.<\/p>\n\n\n\n<p>W \u015bwiecie rzeczywistym dysponujemy ogromn\u0105, lecz ograniczon\u0105 ilo\u015bci\u0105 s\u0142\u00f3w w naszych s\u0142ownikach. <strong>J\u0119zyki naturalne przetwarzane s\u0105 przez ludzkie m\u00f3zgi zupe\u0142nie inaczej ni\u017c kod \u017ar\u00f3d\u0142owy przez kompilatory. Krzes\u0142o na przyk\u0142ad to dla cz\u0142owieka nie tylko konkretne krzes\u0142o, ale idea krzes\u0142a jako takiego.<\/strong> W wi\u0119kszo\u015bci przypadk\u00f3w zb\u0119dne nam s\u0105 szczeg\u00f3\u0142owe informacje\u00a0na temat obiekt\u00f3w by przetwarza\u0107 i rozumie\u0107 j\u0119zyk naturalny, w kt\u00f3rego zdaniach te obiekty, reprezentowane przez s\u0142owa, wyst\u0119puj\u0105. Tam z kolei gdzie jest nam potrzebna precyzja definicji (jak w prawie na przyk\u0142ad) napotykamy na spore problemy.<\/p>\n\n\n\n<p>\u015awietnym przyk\u0142adem ilustruj\u0105cym, co by by\u0142o gdyby\u015bmy przetwarzali j\u0119zyk naturalny tak jak komputery przetwarzaj\u0105 kod \u017ar\u00f3d\u0142owy jest ten filmik:<\/p>\n\n\n\n<iframe loading=\"lazy\" width=\"100%\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/cDA3_5982h8\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"\"><\/iframe>\n\n\n\n<p>Wr\u00f3\u0107my do czynno\u015bci czytania kodu przez programist\u00f3w. C\u00f3\u017c robi developer? Czyta nazw\u0119 zmiennej lub funkcji i pr\u00f3buje zgadn\u0105\u0107, co ona oznacza. P\u00f3ki kod jest &#8220;czysty&#8221; i niezbyt stary instynktowne zrozumienie jest stosunkowo poprawne. Czytanie idzie mu dobrze i praca z kodem jest sprawna.<\/p>\n\n\n\n<p>K\u0142opot zaczyna si\u0119, gdy nie jest w stanie poprawnie domniema\u0107 znaczenia nazw.<\/p>\n\n\n\n<p>Problem jest jednak znacznie powa\u017cniejszy. Jest to jedna z fundamentalnych trudno\u015bci w rozwoju oprogramowania. Cz\u0119\u015bciowo oddaje to poni\u017cszy cytat:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>There are only two hard things in Computer Science: cache invalidation and naming things <\/p><cite>Phil Karlton<\/cite><\/blockquote>\n\n\n\n<p>Chodzi o nazewnictwo.<\/p>\n\n\n\n<p>Nazewnictwo jest punktem styku pomi\u0119dzy \u015bwiatem maszyn i ludzi. Jest jednocze\u015bnie przepa\u015bci\u0105 mi\u0119dzy jednym, a drugim. <strong>W \u015bwiecie rzeczywistym, gdzie j\u0119zyk ludzki rozumiany jest przez m\u00f3zgi, kt\u00f3re s\u0105 w stanie instynktownie zrozumie\u0107 klasy obiekt\u00f3w \/ idee przedmiot\u00f3w rzadko tworzone s\u0105 nowe s\u0142owa. W kodzie \u017ar\u00f3d\u0142owym nowe s\u0142owa tworzone s\u0105 nieustannie. <\/strong><\/p>\n\n\n\n<p>Co dzieje si\u0119, gdy tworzymy nowe\ns\u0142owo w ludzkiej mowie? Uczymy si\u0119 go. Powstaje nowe s\u0142owo \u2013 na przyk\u0142ad \u201ekomputer\u201d\n\u2013 i wszyscy ludzie na \u015bwiecie ucz\u0105 si\u0119, \u017ce oznacza ono tak\u0105, a nie inn\u0105 rzecz.\nNie ma znaczenia, czy mowa o MacBooku, Dellu XPS, ENIACu, czy PC-cie. Nie\ntworzymy odr\u0119bnych s\u0142\u00f3w opisuj\u0105cych komputery stoj\u0105ce w ka\u017cdym z departament\u00f3w firmy,\nnie tworzymy innych s\u0142\u00f3w na r\u00f3\u017cne modele MacBooka maj\u0105ce inn\u0105 wielko\u015b\u0107 pami\u0119ci\nRAM. Nie ma takiej potrzeby. Nowe s\u0142owa tworzymy rzadko. Za nowym s\u0142owem kryj\u0105\nsi\u0119 du\u017ce grupy obiekt\u00f3w.&nbsp; <\/p>\n\n\n\n<p>Inaczej jest w przypadku kodu\n\u017ar\u00f3d\u0142owego. \u201eU\u017cytkownik\u201d znaczy co innego w ka\u017cdym omal programie, jaki do tej\npory napisano. W jednych jest to imi\u0119 i nazwisko, w innych r\u00f3wnie\u017c data urodzenia,\nw jeszcze innych p\u0142e\u0107. W niekt\u00f3rych imi\u0119 i nazwisko mo\u017ce si\u0119 sk\u0142ada\u0107 tylko z liter\n\u0142aci\u0144skich, w pewnych mie\u0107 maksymalnie 20 znak\u00f3w. I tak dalej, etc.<\/p>\n\n\n\n<p>M\u00f3wi\u0105c kr\u00f3tko: <strong>w kodzie \u017ar\u00f3d\u0142owym niczego nie da si\u0119 nazwa\u0107 poprawnie. <\/strong>\u017badna nazwa, jak dobrej by\u015bmy nie wybrali, nie b\u0119dzie odpowiada\u0142a znaczeniu s\u0142\u00f3w wyj\u0119tych z j\u0119zyka naturalnego, ze \u015bwiata ludzi.<\/p>\n\n\n\n<p>Mo\u017cemy by\u0107 tylko zbyt precyzyjni (\u201euser\u201d) lub zbyt og\u00f3lni (\u201euserWithNameAndSurnameAndSexAndDateOfBirth). Nigdy omal nie b\u0119dziemy idealnie precyzyjni w nazywaniu zmiennych, czy funkcji. Nigdy te nazwy nie b\u0119d\u0105 znaczy\u0142y tego, co nam si\u0119 wydaje. Zawsze musimy nawigowa\u0107 si\u0119 do definicji i czyta\u0107 implementacj\u0119. Za ka\u017cdym razem, gdy do\u0142\u0105czamy do istniej\u0105cego projektu musimy \u201enauczy\u0107 si\u0119 jego j\u0119zyka\u201d. Nauka nowego j\u0119zyka jest zawsze trudna, \u017cmudna i m\u0119cz\u0105ca. Dlatego w\u0142a\u015bnie, ze wszystkich wymienionych powy\u017cej przyczyn, czytanie kodu \u017ar\u00f3d\u0142owego jest trudne.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Czytanie kodu \u017ar\u00f3d\u0142owego jest trudniejsze, ni\u017c jego pisanie. Przyzna to ka\u017cdy kto pracowa\u0142 z odziedziczonym repozytorium i pr\u00f3bowa\u0142 zrozumie\u0107 jego dzia\u0142anie. Przebijanie si\u0119 przez tysi\u0105ce linii kodu, przez setki definicji funkcji i zmiennych, w pr\u00f3bie zrozumienia co autorzy mieli na my\u015bli jest ci\u0119\u017ckim, m\u0119cz\u0105cym, okrutnie wyczerpuj\u0105cym zadaniem. Dlaczego tak jest? Czy zrozumienie przepisu kuchennego jest [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":437,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[14,92,93],"_links":{"self":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/447"}],"collection":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/comments?post=447"}],"version-history":[{"count":5,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/447\/revisions"}],"predecessor-version":[{"id":457,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/447\/revisions\/457"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/media\/437"}],"wp:attachment":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/media?parent=447"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/categories?post=447"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/tags?post=447"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}