{"id":10113,"date":"2021-07-10T09:10:08","date_gmt":"2021-07-10T07:10:08","guid":{"rendered":"https:\/\/vived.io\/software-craftsmanship-saturday-vol-45\/"},"modified":"2022-09-19T13:20:10","modified_gmt":"2022-09-19T11:20:10","slug":"software-craftsmanship-saturday-vol-45","status":"publish","type":"post","link":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/","title":{"rendered":"Software Craftsmanship Saturday vol. 45"},"content":{"rendered":"<h2 id=\"1-github-copilot-tydzien-pozniej-nowe-sztuczki-i-problemy-z-licencjami\" data-num=1>1. GitHub Copilot tydzie\u0144 p\u00f3\u017aniej &#8211; nowe sztuczki i problemy z licencjami<\/h2>\n<p>No c\u00f3\u017c, kiedy w zesz\u0142ym tygodniu pisali\u015bmy o Github Copilocie, raczej spodziewal\u015bmy, \u017ce temat b\u0119dzie sobie jeszcze \u017cy\u0142. Od zesz\u0142ej soboty pojawi\u0142o si\u0119 w tej kwestii kilka bardzo interesuj\u0105cych w\u0105tk\u00f3w, wi\u0119c postanowili\u015bmy jeszcze raz ca\u0142o\u015bci si\u0119 przygl\u0105dn\u0105\u0107.<\/p>\n<p>Zacznijmy od tematu licencji &#8211; licencja w IT jest terminem tak magicznym, \u017ce wystarczy go tylko wspomnie\u0107, aby zacz\u0105\u0142 si\u0119 kafszkwa\u0142 o przynajmniej \u015brednim nasileniu. W wypadku Github Copilota, g\u0142\u00f3wny trzon dyskusji sprowadza si\u0119 do tak zwanych licencji copy-left, typu GPL-3. Wymaga ona (w ma\u0142ym uproszczeniu), udost\u0119pnienie na tej samej licencji ka\u017cdego kodu \u017ar\u00f3d\u0142owego, kt\u00f3ry jest \u201cpochodn\u0105\u201d u\u017cycia oryginalnego kodu na licencji GPL. I to w\u0142a\u015bnie o s\u0142owo czym jest w tym wypadku \u201cpochodna\u201d rozbija si\u0119 ca\u0142a dyskusja.<\/p>\n<figure class=\"kg-card kg-embed-card\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">github copilot has, by their own admission, been trained on mountains of gpl code, so i&#8217;m unclear on how it&#8217;s not a form of laundering open source code into commercial works. the handwave of &#8222;it usually doesn&#8217;t reproduce exact chunks&#8221; is not very satisfying <a href=\"https:\/\/t.co\/IzqtK2kGGo\">pic.twitter.com\/IzqtK2kGGo<\/a><\/p>\n<p>\u2014 eevee (@eevee) <a href=\"https:\/\/twitter.com\/eevee\/status\/1410037309848752128?ref_src=twsrc%5Etfw\">June 30, 2021<\/a><\/p><\/blockquote>\n<p><script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/figure>\n<p>Ca\u0142o\u015b\u0107 doprowadzi\u0142a <a href=\"https:\/\/news.ycombinator.com\/item?id=27736650\">do szerokiej debaty<\/a>, kt\u00f3ra \u015bwietnie obrazuje, jak w bardzo \u201cszarej strefie\u201d porusza si\u0119 Microsoft ze swoim nowym produktem. Ca\u0142o\u015b\u0107 bardzo dobrze podsumowuje <a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">post Julii Redy z Europejskiej Partii Pirat\u00f3w<\/a>, specjalistki od licencji. Pr\u00f3buje ona w nim udowodni\u0107, \u017ce Copilot tak naprawd\u0119 nie naruszy\u0142 ani prawa, ani postanowie\u0144 licencyjnych &#8211; przynajmniej je\u015bli prawdziwymi s\u0105 twierdzenia, \u017ce jedyne co jest dokonywane to synteza istniej\u0105cego kodu. Oczywi\u015bcie, ca\u0142o\u015b\u0107 nie sprawia, \u017ce spo\u0142eczno\u015b\u0107 zosta\u0142a uspokojona &#8211; pojawiaj\u0105 si\u0119 <a href=\"https:\/\/thelig.ht\/abandoning-github\/\">np. osoby zach\u0119caj\u0105ce do porzucenia z Githuba<\/a>. Dodatkowym smaczkiem jest te\u017c fakt, \u017ce niekt\u00f3re fragmenty generowanego kodu nie wydaj\u0105 sie by\u0107 syntez\u0105 tylko zwyk\u0142ym copy-pastem (<a href=\"https:\/\/docs.github.com\/en\/github\/copilot\/research-recitation\">do czego zreszt\u0105 tw\u00f3rcy Copilota jawnie si\u0119 przyznaj\u0105<\/a>) \u2026.<\/p>\n<figure class=\"kg-card kg-embed-card kg-card-hascaption\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">I don&#8217;t want to say anything but that&#8217;s not the right license Mr Copilot. <a href=\"https:\/\/t.co\/hs8JRVQ7xJ\">pic.twitter.com\/hs8JRVQ7xJ<\/a><\/p>\n<p>\u2014 Armin Ronacher (@mitsuhiko) <a href=\"https:\/\/twitter.com\/mitsuhiko\/status\/1410886329924194309?ref_src=twsrc%5Etfw\">July 2, 2021<\/a><\/p><\/blockquote>\n<p><script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><figcaption>Mam przeczucie, \u017ce sko\u0144czy si\u0119 to po prostu nowym typem licencji GPL-NO-ML.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\n<p>Tematy licencyjne pewnie b\u0119d\u0105 ci\u0105gn\u0105\u0107 si\u0119 jeszcze przez d\u0142u\u017cszy czas, ale w mi\u0119dzyczasie warto zobaczy\u0107 co tak naprawd\u0119 wspomniany Copilot potrafi. W ci\u0105gu tygodnia ludzie zd\u0105\u017cyli si\u0119 ju\u017c nieco pobawi\u0107 ca\u0142o\u015bci\u0105, do\u015b\u0107 szeroko eksperymentuj\u0105c. Jednym z ciekawszych przyk\u0142ad\u00f3w jest \u0142atwo\u015b\u0107, z jak\u0105 radzi sobie on z problemami z popularnego serwisu <a href=\"https:\/\/leetcode.com\/\">LeetCode<\/a>.<\/p>\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"GitHub Copilot CRUSHES Leetcode Interview Questions! \ud83d\ude33\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/FHwnrYm0mNc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>Robi wra\u017cenie, aczkolwiek LeetCode wydaje si\u0119 by\u0107 w\u0142a\u015bnie idealnym miejscem w kt\u00f3rym sprawdzi si\u0119 taki Copilot &#8211; jasny input, jasny output, du\u017co danych treningowych (GitHub jest ich wr\u0119cz pe\u0142en). Co ciekawe, nie poradzi\u0142 sobie jednak zbyt dobrze z <a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">Advent of Code<\/a>. Udowadnia to tylko, \u017ce o ile Copilot naprawd\u0119 dobrze sprawdza si\u0119 w starciu ze stosunkowo prostymi problemami o ograniczonym zakresie, o tyle te nieco bardziej z\u0142o\u017cone na razie s\u0105 poza jego zasi\u0119giem. Jestem jednak pewien, \u017ce jednym z ma\u0142ych wyzwa\u0144, jakie postawi\u0105 przed sob\u0105 uczestnicy tegorocznej edycji Advent of Code b\u0119dzie w\u0142a\u015bnie takie pokierowanie Copilotem, \u017ceby wygenerowa\u0142 poprawne rozwi\u0105zanie &#8211; wspomnicie moje s\u0142owa .<\/p>\n<p>Wracaj\u0105c jednak do LeetCode, mo\u017ce jednym z pozytyw\u00f3w rozwi\u0105zania GitHuba b\u0119dzie fakt, \u017ce bran\u017ca przestanie u\u017cywa\u0107 test\u00f3w algorytmicznych przy rekrutacji (a przynajmniej na pozycje, kt\u00f3re s\u0105 pisaniem CRUD\u00f3w) &#8211; czego sobie i Wam wszystkim \u017cycz\u0119<\/p>\n<div class=\"embed-responsive embed-responsive-16by9\"><iframe loading=\"lazy\" title=\"Copilot - From now on I&#039;m not writing any Regex myself\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/Qcx0OeRIk_M?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/div>\n<p>Dla mnie jednak najwi\u0119kszym WOW jest fakt, \u017ce Copilot radzi sobie z pisaniem Regexp\u00f3w Je\u017celi ju\u017c nigdy nie b\u0119d\u0119 musia\u0142 r\u0119cznie tworzy\u0107 rzeczonych, to odpowied\u017a jest tylko jedna\u2026<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\" alt=\"\" \/><figcaption>\u2026 panie Microsoft.<\/figcaption><\/figure>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=Qcx0OeRIk_M\">Copilot &#8211; From now on I&#8217;m not writing any Regex myself<\/a><\/li>\n<li><a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">GitHub Copilot is not infringing your copyright<\/a><\/li>\n<li><a href=\"https:\/\/thelig.ht\/abandoning-github\/\">thelig.ht: Abandoning GitHub<\/a><\/li>\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=FHwnrYm0mNc\">GitHub Copilot CRUSHES Leetcode Interview Questions! <\/a><\/li>\n<li><a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">GitHub Copilot Experiences &#8211; a glimpse of an AI-assisted future<\/a><\/li>\n<\/ul>\n<h2 id=\"2-troche-computerscience-na-przykladzie-kompilatora-rusta\" data-num=2>2. Troch\u0119 #ComputerScience na przyk\u0142adzie kompilatora Rusta \u200d<\/h2>\n<p>Przyznam si\u0119 Wam do czego\u015b &#8211; mam troch\u0119 problem z szafowaniem nazw\u0105 \u201cSoftware Craftsmanship\u201d w sobotniej edycji naszego newslettera. S\u0105 takie dni, kiedy z czystym sumieniem m\u00f3g\u0142bym nazwa\u0107 go co najwy\u017cej \u201cTym \u017cy\u0142o IT w zesz\u0142ym tygodniu\u201d. Staramy si\u0119 wybiera\u0107 co prawda rzeczywi\u015bcie tylko rzeczy, kt\u00f3re z naszej perspektywy pozwalaj\u0105 zapozna\u0107 si\u0119 naszym czytelnikom z \u201czeitgeistem\u201d bran\u017cy &#8211; nie zawsze jednak dotykaj\u0105c tytu\u0142owego \u201crzemiel\u015bnictwem kodu\u201d w jaki\u015b mocny spos\u00f3b.<\/p>\n<p>Czasem jednak przychodzi tydzie\u0144, gdy jednym z najcz\u0119\u015bciej dyskutowanych temat\u00f3w w spo\u0142eczno\u015bci by\u0142a NP-trudno\u015b\u0107 procesu kompilacji Rusta &#8211; i wreszcie mo\u017cna sobie troch\u0119 to opisywanie proces\u00f3w s\u0105dowych \u201cFANG vs ka\u017cdy\u201d zrekompensowa\u0107 odrobink\u0105 dobrego computer science, zahaczaj\u0105cego o kompilatory i systemy typ\u00f3w.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img loading=\"lazy\" decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-18.gif\" alt=\"\" width=\"300\" height=\"138\" \/><figcaption>Aczkolwiek nie k\u0142ammy si\u0119 &#8211; Rust przebi\u0142 si\u0119 tylko i wy\u0142\u0105cznie dlatego, \u017ce sezon og\u00f3rkowy trwa w najlepsze.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\n<p>Zanim przejdziemy do clue dzisiejszego artyku\u0142u &#8211; zacznijmy od odrobiny kontekstu. Tak zwany \u201cwyczerpuj\u0105cy pattern matching\u201d jest jednym z tych funkcjonalno\u015bci, kt\u00f3re s\u0105 jednymi z ciekawszych koncept\u00f3w w dzisiejszym programowaniu. Dla niekt\u00f3rych wr\u0119cz odr\u00f3\u017cniaj\u0105 j\u0119zyki, kt\u00f3re nadaj\u0105 si\u0119 do pisania kodu, od \u201cpodj\u0119zyk\u00f3w\u201d kt\u00f3re si\u0119 nie nadaj\u0105 (pozdrawiam Mateusza &#8211; je\u015bli czytasz, to wiesz, \u017ce to o Tobie). Jest ku temu ekstremizmowi pewien pow\u00f3d &#8211; jedn\u0105 z najcz\u0119\u015bciej wyst\u0119puj\u0105cych kategorii b\u0142\u0119d\u00f3w w programowaniu jest brak pokrycia wszystkich dost\u0119pnych wariant\u00f3w przy okazji np. switchy.<\/p>\n<p>\u0141atwo jest sprawdzi\u0107, \u017ce ka\u017cdy wariant np. enuma zosta\u0142 pokryty:<\/p>\n<figure class=\"kg-card kg-code-card\">\n<pre><code>fun checkState(state: State): Unit = when (state) {\n\tState.Loading -&gt; {}\n\tState.Done -&gt; {}\n\tState.None -&gt; {}\n}\n\/\/ &#039;when&#039; expression must be exhaustive, add necessary &#039;Error&#039; branch or &#039;else&#039; branch instead.<\/code><\/pre><figcaption>Przyk\u0142ad w Kotlinie, ale my\u015bl\u0119 \u017ce nawet dla nieznaj\u0105cych j\u0119zyka dobrze obrazuje o co chodzi.<\/figcaption><\/figure>\n<p>Jednak w wypadku wspomnianego pattern matchingu, sytuacja jest niepor\u00f3wnywalnie bardziej skomplikowana.<\/p>\n<p>Przejd\u017amy wreszcie do <a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">g\u0142\u00f3wnego artyku\u0142u<\/a>. Ot\u00f3\u017c autor (co ciekawe Polak, specjalista od Cybersecurity) analizuje z\u0142o\u017cono\u015b\u0107 podobnego procesu dla pattern matchingu:<\/p>\n<figure class=\"kg-card kg-code-card\">\n<pre><code>match todo!() {\n\t(false, _) =&gt; {} \/\/ A\n\t(_, false) =&gt; {} \/\/ B\n\t(false, false) =&gt; {} \/\/ A B\n\t(true, true) =&gt; {} \/\/ !A !B\n }<\/code><\/pre><figcaption>Dla nieznaj\u0105cych sk\u0142adni &#8211; &#8222;_&#8221; oznacza &#8222;dowolna warto\u015b\u0107&#8221;<\/figcaption><\/figure>\n<p>i por\u00f3wnuje go do teoretycznego problemu <a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">problemu spe\u0142nialno\u015bci (Boolean satisfiability, znanego r\u00f3wnie\u017c jako SAT)<\/a>. Autor rozk\u0142ada go na czynniki pierwsze, pokazuj\u0105c, \u017ce wspomniany pattern matching mo\u017cna sprowadzi\u0107 w\u0142a\u015bnie do prostych operacji na arytmetyce boolowskiej. Problem spe\u0142nialno\u015bci za\u015b, w swoich bardziej zaawansowanych przypadkach, nale\u017cy do problem\u00f3w o z\u0142o\u017cono\u015bci wielomianowej i nale\u017c\u0105cych do klasy tak zwanej NP-kompletnej.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img loading=\"lazy\" decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-19.gif\" alt=\"\" width=\"500\" height=\"281\" \/><figcaption>Co ka\u017cdy maj\u0105cy cho\u0107by wprowadzenie do algorytm\u00f3w wie, \u017ce oznacza same problemy. Aczkolwiek w 2020 wszyscy stali\u015bmy si\u0119 specjalistami od wzrostu wyk\u0142adniczego<\/figcaption><\/figure>\n<p>Podobne wyzwanie wyst\u0119puje r\u00f3wnie\u017c w innych j\u0119zykach programowania posiadaj\u0105cych \u201cexhaustive pattern matching\u201d jak np. Haskell, F# czy OCaml (ten ostatni ze swoim state-of-the-art inferowaniem typ\u00f3w to dopiero musi by\u0107 wrzodem do kompilowania). Og\u00f3lnie je\u015bli kto\u015b chcia\u0142bym temat zg\u0142\u0119dbi\u0107, to prawdopodobnie mo\u017cna by na nim zrobi\u0107 niejedn\u0105 publikacje czy doktorat &#8211; je\u015bli interesuje Was fajna analiza tematu z punktu widzenia Haskella, <a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">zapraszam do lektury<\/a>.<\/p>\n<p>Jest to kolejny ju\u017c przypadek, gdy korzystaj\u0105c na dyskusji rustowego \u201ccommunity\u201d jeste\u015bmy w stanie wyci\u0105gn\u0105\u0107 troch\u0119 bardziej og\u00f3lne wnioski, \u0142atwo przenaszalne na reszte bran\u017cy. Po pierwsze &#8211; nasze kompilatory robi\u0105 naprawd\u0119 trudn\u0105 robot\u0119 &#8211; radz\u0105 sobie wielokrotnie z problemami, kt\u00f3re nie posiadaj\u0105cymi (nawet w teorii) optymalnego rozwi\u0105zania. Po drugie &#8211; to, \u017ce co\u015b jest NP-kompletne, nie oznacza wcale, \u017ce w skali \u201cprzemys\u0142owej\u201d nie jeste\u015bmy sobie w stanie z tym poradzi\u0107. Po trzecie &#8211; dodatkowe mo\u017cliwo\u015bci j\u0119zyka przychodz\u0105 z pewnym kosztem, i czasem trzeba ten koszt dobrze wywa\u017cy\u0107.<\/p>\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img loading=\"lazy\" decoding=\"async\" class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/image-2.png\" alt=\"\" width=\"413\" height=\"360\" \/><figcaption>Dlatego, je\u015bli czasem zdarzy nam si\u0119 zakl\u0105\u0107 na d\u0142ugo\u015b\u0107 procesu kompilacji j\u0119zyka albo na brak jakiej\u015b konkretniej opcji w j\u0119zyku &#8211; pami\u0119tajcie: to wszystko jest jaka\u015b forma kompromisu.<\/figcaption><\/figure>\n<h2 id=\"zrodla\" data-num=3>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">Compiling Rust is NP-hard<\/a><\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">Boolean satisfiability problem<\/a><\/li>\n<li><a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">Structural and semantic pattern matching analysis in Haskell<\/a><\/li>\n<li><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Dzisiaj (zgodnie z tradycj\u0105 tego tygodnia) tylko dwa artyku\u0142y &#8211; ale bardzo r\u00f3\u017cnorodne, w tym jeden dotykaj\u0105cy bardzo ciekawego aspektu Computer Science. Zapraszamy do lektury!<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[266],"tags":[],"class_list":["post-10113","post","type-post","status-publish","format-standard","hentry","category-craftsmanship"],"acf":{"weekly_summary":true,"estimated_reading_time":"7"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Software Craftsmanship Saturday vol. 45 - Vived<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Software Craftsmanship Saturday vol. 45 - Vived\" \/>\n<meta property=\"og:description\" content=\"Dzisiaj (zgodnie z tradycj\u0105 tego tygodnia) tylko dwa artyku\u0142y - ale bardzo r\u00f3\u017cnorodne, w tym jeden dotykaj\u0105cy bardzo ciekawego aspektu Computer Science. Zapraszamy do lektury!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\" \/>\n<meta property=\"og:site_name\" content=\"Vived\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-10T07:10:08+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-09-19T11:20:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\" \/>\n<meta name=\"author\" content=\"Artur Skowro\u0144ski\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\"},\"author\":{\"name\":\"Artur Skowro\u0144ski\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\"},\"headline\":\"Software Craftsmanship Saturday vol. 45\",\"datePublished\":\"2021-07-10T07:10:08+00:00\",\"dateModified\":\"2022-09-19T11:20:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\"},\"wordCount\":1366,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\",\"articleSection\":[\"Craftsmanship\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\",\"url\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\",\"name\":\"Software Craftsmanship Saturday vol. 45 - Vived\",\"isPartOf\":{\"@id\":\"https:\/\/vived.io\/pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\",\"datePublished\":\"2021-07-10T07:10:08+00:00\",\"dateModified\":\"2022-09-19T11:20:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/vived.io\/pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Software Craftsmanship Saturday vol. 45\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/vived.io\/pl\/#website\",\"url\":\"https:\/\/vived.io\/pl\/\",\"name\":\"Vived\",\"description\":\"platform empowering IT people and technology companies to synergic growth\",\"publisher\":{\"@id\":\"https:\/\/vived.io\/pl\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/vived.io\/pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/vived.io\/pl\/#organization\",\"name\":\"Vived\",\"url\":\"https:\/\/vived.io\/pl\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"contentUrl\":\"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png\",\"width\":136,\"height\":45,\"caption\":\"Vived\"},\"image\":{\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3\",\"name\":\"Artur Skowro\u0144ski\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g\",\"caption\":\"Artur Skowro\u0144ski\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Software Craftsmanship Saturday vol. 45 - Vived","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/","og_locale":"pl_PL","og_type":"article","og_title":"Software Craftsmanship Saturday vol. 45 - Vived","og_description":"Dzisiaj (zgodnie z tradycj\u0105 tego tygodnia) tylko dwa artyku\u0142y - ale bardzo r\u00f3\u017cnorodne, w tym jeden dotykaj\u0105cy bardzo ciekawego aspektu Computer Science. Zapraszamy do lektury!","og_url":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/","og_site_name":"Vived","article_published_time":"2021-07-10T07:10:08+00:00","article_modified_time":"2022-09-19T11:20:10+00:00","og_image":[{"url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png","type":"","width":"","height":""}],"author":"Artur Skowro\u0144ski","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#article","isPartOf":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/"},"author":{"name":"Artur Skowro\u0144ski","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3"},"headline":"Software Craftsmanship Saturday vol. 45","datePublished":"2021-07-10T07:10:08+00:00","dateModified":"2022-09-19T11:20:10+00:00","mainEntityOfPage":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/"},"wordCount":1366,"commentCount":0,"publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"image":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png","articleSection":["Craftsmanship"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/","url":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/","name":"Software Craftsmanship Saturday vol. 45 - Vived","isPartOf":{"@id":"https:\/\/vived.io\/pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage"},"image":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage"},"thumbnailUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png","datePublished":"2021-07-10T07:10:08+00:00","dateModified":"2022-09-19T11:20:10+00:00","breadcrumb":{"@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/"]}]},{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#primaryimage","url":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png"},{"@type":"BreadcrumbList","@id":"https:\/\/vived.io\/pl\/software-craftsmanship-saturday-vol-45\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/vived.io\/pl\/"},{"@type":"ListItem","position":2,"name":"Software Craftsmanship Saturday vol. 45"}]},{"@type":"WebSite","@id":"https:\/\/vived.io\/pl\/#website","url":"https:\/\/vived.io\/pl\/","name":"Vived","description":"platform empowering IT people and technology companies to synergic growth","publisher":{"@id":"https:\/\/vived.io\/pl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vived.io\/pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/vived.io\/pl\/#organization","name":"Vived","url":"https:\/\/vived.io\/pl\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/","url":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","contentUrl":"https:\/\/vived.io\/wp-content\/uploads\/2020\/03\/logo_vived_color.png","width":136,"height":45,"caption":"Vived"},"image":{"@id":"https:\/\/vived.io\/pl\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/0eb0878110cb27edfbfe46e841fe6db3","name":"Artur Skowro\u0144ski","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/vived.io\/pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/29055786486c8b9dc1507f2744221c5bdb8d7ef6e6217ced0326dd3296aea6ed?s=96&d=mm&r=g","caption":"Artur Skowro\u0144ski"}}]}},"blocks_vived":[{"blockName":null,"attrs":[],"innerBlocks":[],"innerHTML":"<h2 id=\"1-github-copilot-tydzie%C5%84-p%C3%B3%C5%BAniejnowe-sztuczki-i-problemy-z-licencjami-%F0%9F%9A%80\">1. GitHub Copilot tydzie\u0144 p\u00f3\u017aniej - nowe sztuczki i problemy z licencjami<\/h2>\nNo c\u00f3\u017c, kiedy w zesz\u0142ym tygodniu pisali\u015bmy o Github Copilocie, raczej spodziewal\u015bmy, \u017ce temat b\u0119dzie sobie jeszcze \u017cy\u0142. Od zesz\u0142ej soboty pojawi\u0142o si\u0119 w tej kwestii kilka bardzo interesuj\u0105cych w\u0105tk\u00f3w, wi\u0119c postanowili\u015bmy jeszcze raz ca\u0142o\u015bci si\u0119 przygl\u0105dn\u0105\u0107.\n\nZacznijmy od tematu licencji - licencja w IT jest terminem tak magicznym, \u017ce wystarczy go tylko wspomnie\u0107, aby zacz\u0105\u0142 si\u0119 kafszkwa\u0142 o przynajmniej \u015brednim nasileniu. W wypadku Github Copilota, g\u0142\u00f3wny trzon dyskusji sprowadza si\u0119 do tak zwanych licencji copy-left, typu GPL-3. Wymaga ona (w ma\u0142ym uproszczeniu), udost\u0119pnienie na tej samej licencji ka\u017cdego kodu \u017ar\u00f3d\u0142owego, kt\u00f3ry jest \u201cpochodn\u0105\u201d u\u017cycia oryginalnego kodu na licencji GPL. I to w\u0142a\u015bnie o s\u0142owo czym jest w tym wypadku \u201cpochodna\u201d rozbija si\u0119 ca\u0142a dyskusja.\n<figure class=\"kg-card kg-embed-card\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">github copilot has, by their own admission, been trained on mountains of gpl code, so i'm unclear on how it's not a form of laundering open source code into commercial works. the handwave of \"it usually doesn't reproduce exact chunks\" is not very satisfying <a href=\"https:\/\/t.co\/IzqtK2kGGo\">pic.twitter.com\/IzqtK2kGGo<\/a><\/p>\n\u2014 eevee (@eevee) <a href=\"https:\/\/twitter.com\/eevee\/status\/1410037309848752128?ref_src=twsrc%5Etfw\">June 30, 2021<\/a><\/blockquote>\n<script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/figure>\nCa\u0142o\u015b\u0107 doprowadzi\u0142a <a href=\"https:\/\/news.ycombinator.com\/item?id=27736650\">do szerokiej debaty<\/a>, kt\u00f3ra \u015bwietnie obrazuje, jak w bardzo \u201cszarej strefie\u201d porusza si\u0119 Microsoft ze swoim nowym produktem. Ca\u0142o\u015b\u0107 bardzo dobrze podsumowuje <a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">post Julii Redy z Europejskiej Partii Pirat\u00f3w<\/a>, specjalistki od licencji. Pr\u00f3buje ona w nim udowodni\u0107, \u017ce Copilot tak naprawd\u0119 nie naruszy\u0142 ani prawa, ani postanowie\u0144 licencyjnych - przynajmniej je\u015bli prawdziwymi s\u0105 twierdzenia, \u017ce jedyne co jest dokonywane to synteza istniej\u0105cego kodu. Oczywi\u015bcie, ca\u0142o\u015b\u0107 nie sprawia, \u017ce spo\u0142eczno\u015b\u0107 zosta\u0142a uspokojona - pojawiaj\u0105 si\u0119 <a href=\"https:\/\/thelig.ht\/abandoning-github\/\">np. osoby zach\u0119caj\u0105ce do porzucenia z Githuba<\/a>. Dodatkowym smaczkiem jest te\u017c fakt, \u017ce niekt\u00f3re fragmenty generowanego kodu nie wydaj\u0105 sie by\u0107 syntez\u0105 tylko zwyk\u0142ym copy-pastem (<a href=\"https:\/\/docs.github.com\/en\/github\/copilot\/research-recitation\">do czego zreszt\u0105 tw\u00f3rcy Copilota jawnie si\u0119 przyznaj\u0105<\/a>) \u2026.\n<figure class=\"kg-card kg-embed-card kg-card-hascaption\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">I don't want to say anything but that's not the right license Mr Copilot. <a href=\"https:\/\/t.co\/hs8JRVQ7xJ\">pic.twitter.com\/hs8JRVQ7xJ<\/a><\/p>\n\u2014 Armin Ronacher (@mitsuhiko) <a href=\"https:\/\/twitter.com\/mitsuhiko\/status\/1410886329924194309?ref_src=twsrc%5Etfw\">July 2, 2021<\/a><\/blockquote>\n<script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n\n<figcaption>Mam przeczucie, \u017ce sko\u0144czy si\u0119 to po prostu nowym typem licencji GPL-NO-ML.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nTematy licencyjne pewnie b\u0119d\u0105 ci\u0105gn\u0105\u0107 si\u0119 jeszcze przez d\u0142u\u017cszy czas, ale w mi\u0119dzyczasie warto zobaczy\u0107 co tak naprawd\u0119 wspomniany Copilot potrafi. W ci\u0105gu tygodnia ludzie zd\u0105\u017cyli si\u0119 ju\u017c nieco pobawi\u0107 ca\u0142o\u015bci\u0105, do\u015b\u0107 szeroko eksperymentuj\u0105c. Jednym z ciekawszych przyk\u0142ad\u00f3w jest \u0142atwo\u015b\u0107, z jak\u0105 radzi sobie on z problemami z popularnego serwisu <a href=\"https:\/\/leetcode.com\/\">LeetCode<\/a>.\n\nhttps:\/\/www.youtube.com\/watch?v=FHwnrYm0mNc\n\nRobi wra\u017cenie, aczkolwiek LeetCode wydaje si\u0119 by\u0107 w\u0142a\u015bnie idealnym miejscem w kt\u00f3rym sprawdzi si\u0119 taki Copilot - jasny input, jasny output, du\u017co danych treningowych (GitHub jest ich wr\u0119cz pe\u0142en). Co ciekawe, nie poradzi\u0142 sobie jednak zbyt dobrze z <a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">Advent of Code<\/a>. Udowadnia to tylko, \u017ce o ile Copilot naprawd\u0119 dobrze sprawdza si\u0119 w starciu ze stosunkowo prostymi problemami o ograniczonym zakresie, o tyle te nieco bardziej z\u0142o\u017cone na razie s\u0105 poza jego zasi\u0119giem. Jestem jednak pewien, \u017ce jednym z ma\u0142ych wyzwa\u0144, jakie postawi\u0105 przed sob\u0105 uczestnicy tegorocznej edycji Advent of Code b\u0119dzie w\u0142a\u015bnie takie pokierowanie Copilotem, \u017ceby wygenerowa\u0142 poprawne rozwi\u0105zanie - wspomnicie moje s\u0142owa .\n\nWracaj\u0105c jednak do LeetCode, mo\u017ce jednym z pozytyw\u00f3w rozwi\u0105zania GitHuba b\u0119dzie fakt, \u017ce bran\u017ca przestanie u\u017cywa\u0107 test\u00f3w algorytmicznych przy rekrutacji (a przynajmniej na pozycje, kt\u00f3re s\u0105 pisaniem CRUD\u00f3w) - czego sobie i Wam wszystkim \u017cycz\u0119\n\nhttps:\/\/www.youtube.com\/watch?v=Qcx0OeRIk_M\n\nDla mnie jednak najwi\u0119kszym WOW jest fakt, \u017ce Copilot radzi sobie z pisaniem Regexp\u00f3w Je\u017celi ju\u017c nigdy nie b\u0119d\u0119 musia\u0142 r\u0119cznie tworzy\u0107 rzeczonych, to odpowied\u017a jest tylko jedna\u2026\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\" alt=\"\" \/>\n\n<figcaption>\u2026 panie Microsoft.<\/figcaption><\/figure>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/www.youtube.com\/watch?v=Qcx0OeRIk_M\">Copilot - From now on I'm not writing any Regex myself<\/a><\/li>\n \t<li><a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">GitHub Copilot is not infringing your copyright<\/a><\/li>\n \t<li><a href=\"https:\/\/thelig.ht\/abandoning-github\/\">thelig.ht: Abandoning GitHub<\/a><\/li>\n \t<li><a href=\"https:\/\/www.youtube.com\/watch?v=FHwnrYm0mNc\">GitHub Copilot CRUSHES Leetcode Interview Questions! <\/a><\/li>\n \t<li><a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">GitHub Copilot Experiences - a glimpse of an AI-assisted future<\/a><\/li>\n<\/ul>\n<h2 id=\"2-troch%C4%99-computerscience-na-przyk%C5%82adzie-kompilatora-rusta-%F0%9F%96%A5%F0%9F%91%A8%E2%80%8D%F0%9F%94%AC\">2. Troch\u0119 #ComputerScience na przyk\u0142adzie kompilatora Rusta \u200d<\/h2>\nPrzyznam si\u0119 Wam do czego\u015b - mam troch\u0119 problem z szafowaniem nazw\u0105 \u201cSoftware Craftsmanship\u201d w sobotniej edycji naszego newslettera. S\u0105 takie dni, kiedy z czystym sumieniem m\u00f3g\u0142bym nazwa\u0107 go co najwy\u017cej \u201cTym \u017cy\u0142o IT w zesz\u0142ym tygodniu\u201d. Staramy si\u0119 wybiera\u0107 co prawda rzeczywi\u015bcie tylko rzeczy, kt\u00f3re z naszej perspektywy pozwalaj\u0105 zapozna\u0107 si\u0119 naszym czytelnikom z \u201czeitgeistem\u201d bran\u017cy - nie zawsze jednak dotykaj\u0105c tytu\u0142owego \u201crzemiel\u015bnictwem kodu\u201d w jaki\u015b mocny spos\u00f3b.\n\nCzasem jednak przychodzi tydzie\u0144, gdy jednym z najcz\u0119\u015bciej dyskutowanych temat\u00f3w w spo\u0142eczno\u015bci by\u0142a NP-trudno\u015b\u0107 procesu kompilacji Rusta - i wreszcie mo\u017cna sobie troch\u0119 to opisywanie proces\u00f3w s\u0105dowych \u201cFANG vs ka\u017cdy\u201d zrekompensowa\u0107 odrobink\u0105 dobrego computer science, zahaczaj\u0105cego o kompilatory i systemy typ\u00f3w.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-18.gif\" alt=\"\" width=\"300\" height=\"138\" \/>\n\n<figcaption>Aczkolwiek nie k\u0142ammy si\u0119 - Rust przebi\u0142 si\u0119 tylko i wy\u0142\u0105cznie dlatego, \u017ce sezon og\u00f3rkowy trwa w najlepsze.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nZanim przejdziemy do clue dzisiejszego artyku\u0142u - zacznijmy od odrobiny kontekstu. Tak zwany \u201cwyczerpuj\u0105cy pattern matching\u201d jest jednym z tych funkcjonalno\u015bci, kt\u00f3re s\u0105 jednymi z ciekawszych koncept\u00f3w w dzisiejszym programowaniu. Dla niekt\u00f3rych wr\u0119cz odr\u00f3\u017cniaj\u0105 j\u0119zyki, kt\u00f3re nadaj\u0105 si\u0119 do pisania kodu, od \u201cpodj\u0119zyk\u00f3w\u201d kt\u00f3re si\u0119 nie nadaj\u0105 (pozdrawiam Mateusza - je\u015bli czytasz, to wiesz, \u017ce to o Tobie). Jest ku temu ekstremizmowi pewien pow\u00f3d - jedn\u0105 z najcz\u0119\u015bciej wyst\u0119puj\u0105cych kategorii b\u0142\u0119d\u00f3w w programowaniu jest brak pokrycia wszystkich dost\u0119pnych wariant\u00f3w przy okazji np. switchy.\n\n\u0141atwo jest sprawdzi\u0107, \u017ce ka\u017cdy wariant np. enuma zosta\u0142 pokryty:\n<figure class=\"kg-card kg-code-card\">\n<pre><code>fun checkState(state: State): Unit = when (state) {\n\tState.Loading -&gt; {}\n\tState.Done -&gt; {}\n\tState.None -&gt; {}\n}\n\/\/ 'when' expression must be exhaustive, add necessary 'Error' branch or 'else' branch instead.<\/code><\/pre>\n<figcaption>Przyk\u0142ad w Kotlinie, ale my\u015bl\u0119 \u017ce nawet dla nieznaj\u0105cych j\u0119zyka dobrze obrazuje o co chodzi.<\/figcaption><\/figure>\nJednak w wypadku wspomnianego pattern matchingu, sytuacja jest niepor\u00f3wnywalnie bardziej skomplikowana.\n\nPrzejd\u017amy wreszcie do <a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">g\u0142\u00f3wnego artyku\u0142u<\/a>. Ot\u00f3\u017c autor (co ciekawe Polak, specjalista od Cybersecurity) analizuje z\u0142o\u017cono\u015b\u0107 podobnego procesu dla pattern matchingu:\n<figure class=\"kg-card kg-code-card\">\n<pre><code>match todo!() {\n\t(false, _) =&gt; {} \/\/ A\n\t(_, false) =&gt; {} \/\/ B\n\t(false, false) =&gt; {} \/\/ A B\n\t(true, true) =&gt; {} \/\/ !A !B\n }<\/code><\/pre>\n<figcaption>Dla nieznaj\u0105cych sk\u0142adni - \"_\" oznacza \"dowolna warto\u015b\u0107\"<\/figcaption><\/figure>\ni por\u00f3wnuje go do teoretycznego problemu <a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">problemu spe\u0142nialno\u015bci (Boolean satisfiability, znanego r\u00f3wnie\u017c jako SAT)<\/a>. Autor rozk\u0142ada go na czynniki pierwsze, pokazuj\u0105c, \u017ce wspomniany pattern matching mo\u017cna sprowadzi\u0107 w\u0142a\u015bnie do prostych operacji na arytmetyce boolowskiej. Problem spe\u0142nialno\u015bci za\u015b, w swoich bardziej zaawansowanych przypadkach, nale\u017cy do problem\u00f3w o z\u0142o\u017cono\u015bci wielomianowej i nale\u017c\u0105cych do klasy tak zwanej NP-kompletnej.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-19.gif\" alt=\"\" width=\"500\" height=\"281\" \/>\n\n<figcaption>Co ka\u017cdy maj\u0105cy cho\u0107by wprowadzenie do algorytm\u00f3w wie, \u017ce oznacza same problemy. Aczkolwiek w 2020 wszyscy stali\u015bmy si\u0119 specjalistami od wzrostu wyk\u0142adniczego<\/figcaption><\/figure>\nPodobne wyzwanie wyst\u0119puje r\u00f3wnie\u017c w innych j\u0119zykach programowania posiadaj\u0105cych \u201cexhaustive pattern matching\u201d jak np. Haskell, F# czy OCaml (ten ostatni ze swoim state-of-the-art inferowaniem typ\u00f3w to dopiero musi by\u0107 wrzodem do kompilowania). Og\u00f3lnie je\u015bli kto\u015b chcia\u0142bym temat zg\u0142\u0119dbi\u0107, to prawdopodobnie mo\u017cna by na nim zrobi\u0107 niejedn\u0105 publikacje czy doktorat - je\u015bli interesuje Was fajna analiza tematu z punktu widzenia Haskella, <a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">zapraszam do lektury<\/a>.\n\nJest to kolejny ju\u017c przypadek, gdy korzystaj\u0105c na dyskusji rustowego \u201ccommunity\u201d jeste\u015bmy w stanie wyci\u0105gn\u0105\u0107 troch\u0119 bardziej og\u00f3lne wnioski, \u0142atwo przenaszalne na reszte bran\u017cy. Po pierwsze - nasze kompilatory robi\u0105 naprawd\u0119 trudn\u0105 robot\u0119 - radz\u0105 sobie wielokrotnie z problemami, kt\u00f3re nie posiadaj\u0105cymi (nawet w teorii) optymalnego rozwi\u0105zania. Po drugie - to, \u017ce co\u015b jest NP-kompletne, nie oznacza wcale, \u017ce w skali \u201cprzemys\u0142owej\u201d nie jeste\u015bmy sobie w stanie z tym poradzi\u0107. Po trzecie - dodatkowe mo\u017cliwo\u015bci j\u0119zyka przychodz\u0105 z pewnym kosztem, i czasem trzeba ten koszt dobrze wywa\u017cy\u0107.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/image-2.png\" alt=\"\" width=\"413\" height=\"360\" \/>\n\n<figcaption>Dlatego, je\u015bli czasem zdarzy nam si\u0119 zakl\u0105\u0107 na d\u0142ugo\u015b\u0107 procesu kompilacji j\u0119zyka albo na brak jakiej\u015b konkretniej opcji w j\u0119zyku - pami\u0119tajcie: to wszystko jest jaka\u015b forma kompromisu.<\/figcaption><\/figure>\n<h2 id=\"%C5%BAr%C3%B3d%C5%82a-1\">\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n \t<li><a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">Compiling Rust is NP-hard<\/a><\/li>\n \t<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">Boolean satisfiability problem<\/a><\/li>\n \t<li><a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">Structural and semantic pattern matching analysis in Haskell<\/a><\/li>\n \t<li><\/li>\n<\/ul>","innerContent":["<h2 id=\"1-github-copilot-tydzie%C5%84-p%C3%B3%C5%BAniejnowe-sztuczki-i-problemy-z-licencjami-%F0%9F%9A%80\">1. GitHub Copilot tydzie\u0144 p\u00f3\u017aniej - nowe sztuczki i problemy z licencjami<\/h2>\nNo c\u00f3\u017c, kiedy w zesz\u0142ym tygodniu pisali\u015bmy o Github Copilocie, raczej spodziewal\u015bmy, \u017ce temat b\u0119dzie sobie jeszcze \u017cy\u0142. Od zesz\u0142ej soboty pojawi\u0142o si\u0119 w tej kwestii kilka bardzo interesuj\u0105cych w\u0105tk\u00f3w, wi\u0119c postanowili\u015bmy jeszcze raz ca\u0142o\u015bci si\u0119 przygl\u0105dn\u0105\u0107.\n\nZacznijmy od tematu licencji - licencja w IT jest terminem tak magicznym, \u017ce wystarczy go tylko wspomnie\u0107, aby zacz\u0105\u0142 si\u0119 kafszkwa\u0142 o przynajmniej \u015brednim nasileniu. W wypadku Github Copilota, g\u0142\u00f3wny trzon dyskusji sprowadza si\u0119 do tak zwanych licencji copy-left, typu GPL-3. Wymaga ona (w ma\u0142ym uproszczeniu), udost\u0119pnienie na tej samej licencji ka\u017cdego kodu \u017ar\u00f3d\u0142owego, kt\u00f3ry jest \u201cpochodn\u0105\u201d u\u017cycia oryginalnego kodu na licencji GPL. I to w\u0142a\u015bnie o s\u0142owo czym jest w tym wypadku \u201cpochodna\u201d rozbija si\u0119 ca\u0142a dyskusja.\n<figure class=\"kg-card kg-embed-card\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">github copilot has, by their own admission, been trained on mountains of gpl code, so i'm unclear on how it's not a form of laundering open source code into commercial works. the handwave of \"it usually doesn't reproduce exact chunks\" is not very satisfying <a href=\"https:\/\/t.co\/IzqtK2kGGo\">pic.twitter.com\/IzqtK2kGGo<\/a><\/p>\n\u2014 eevee (@eevee) <a href=\"https:\/\/twitter.com\/eevee\/status\/1410037309848752128?ref_src=twsrc%5Etfw\">June 30, 2021<\/a><\/blockquote>\n<script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/figure>\nCa\u0142o\u015b\u0107 doprowadzi\u0142a <a href=\"https:\/\/news.ycombinator.com\/item?id=27736650\">do szerokiej debaty<\/a>, kt\u00f3ra \u015bwietnie obrazuje, jak w bardzo \u201cszarej strefie\u201d porusza si\u0119 Microsoft ze swoim nowym produktem. Ca\u0142o\u015b\u0107 bardzo dobrze podsumowuje <a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">post Julii Redy z Europejskiej Partii Pirat\u00f3w<\/a>, specjalistki od licencji. Pr\u00f3buje ona w nim udowodni\u0107, \u017ce Copilot tak naprawd\u0119 nie naruszy\u0142 ani prawa, ani postanowie\u0144 licencyjnych - przynajmniej je\u015bli prawdziwymi s\u0105 twierdzenia, \u017ce jedyne co jest dokonywane to synteza istniej\u0105cego kodu. Oczywi\u015bcie, ca\u0142o\u015b\u0107 nie sprawia, \u017ce spo\u0142eczno\u015b\u0107 zosta\u0142a uspokojona - pojawiaj\u0105 si\u0119 <a href=\"https:\/\/thelig.ht\/abandoning-github\/\">np. osoby zach\u0119caj\u0105ce do porzucenia z Githuba<\/a>. Dodatkowym smaczkiem jest te\u017c fakt, \u017ce niekt\u00f3re fragmenty generowanego kodu nie wydaj\u0105 sie by\u0107 syntez\u0105 tylko zwyk\u0142ym copy-pastem (<a href=\"https:\/\/docs.github.com\/en\/github\/copilot\/research-recitation\">do czego zreszt\u0105 tw\u00f3rcy Copilota jawnie si\u0119 przyznaj\u0105<\/a>) \u2026.\n<figure class=\"kg-card kg-embed-card kg-card-hascaption\">\n<blockquote class=\"twitter-tweet\">\n<p dir=\"ltr\" lang=\"en\">I don't want to say anything but that's not the right license Mr Copilot. <a href=\"https:\/\/t.co\/hs8JRVQ7xJ\">pic.twitter.com\/hs8JRVQ7xJ<\/a><\/p>\n\u2014 Armin Ronacher (@mitsuhiko) <a href=\"https:\/\/twitter.com\/mitsuhiko\/status\/1410886329924194309?ref_src=twsrc%5Etfw\">July 2, 2021<\/a><\/blockquote>\n<script async=\"\" src=\"https:\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script>\n\n<figcaption>Mam przeczucie, \u017ce sko\u0144czy si\u0119 to po prostu nowym typem licencji GPL-NO-ML.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nTematy licencyjne pewnie b\u0119d\u0105 ci\u0105gn\u0105\u0107 si\u0119 jeszcze przez d\u0142u\u017cszy czas, ale w mi\u0119dzyczasie warto zobaczy\u0107 co tak naprawd\u0119 wspomniany Copilot potrafi. W ci\u0105gu tygodnia ludzie zd\u0105\u017cyli si\u0119 ju\u017c nieco pobawi\u0107 ca\u0142o\u015bci\u0105, do\u015b\u0107 szeroko eksperymentuj\u0105c. Jednym z ciekawszych przyk\u0142ad\u00f3w jest \u0142atwo\u015b\u0107, z jak\u0105 radzi sobie on z problemami z popularnego serwisu <a href=\"https:\/\/leetcode.com\/\">LeetCode<\/a>.\n\nhttps:\/\/www.youtube.com\/watch?v=FHwnrYm0mNc\n\nRobi wra\u017cenie, aczkolwiek LeetCode wydaje si\u0119 by\u0107 w\u0142a\u015bnie idealnym miejscem w kt\u00f3rym sprawdzi si\u0119 taki Copilot - jasny input, jasny output, du\u017co danych treningowych (GitHub jest ich wr\u0119cz pe\u0142en). Co ciekawe, nie poradzi\u0142 sobie jednak zbyt dobrze z <a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">Advent of Code<\/a>. Udowadnia to tylko, \u017ce o ile Copilot naprawd\u0119 dobrze sprawdza si\u0119 w starciu ze stosunkowo prostymi problemami o ograniczonym zakresie, o tyle te nieco bardziej z\u0142o\u017cone na razie s\u0105 poza jego zasi\u0119giem. Jestem jednak pewien, \u017ce jednym z ma\u0142ych wyzwa\u0144, jakie postawi\u0105 przed sob\u0105 uczestnicy tegorocznej edycji Advent of Code b\u0119dzie w\u0142a\u015bnie takie pokierowanie Copilotem, \u017ceby wygenerowa\u0142 poprawne rozwi\u0105zanie - wspomnicie moje s\u0142owa .\n\nWracaj\u0105c jednak do LeetCode, mo\u017ce jednym z pozytyw\u00f3w rozwi\u0105zania GitHuba b\u0119dzie fakt, \u017ce bran\u017ca przestanie u\u017cywa\u0107 test\u00f3w algorytmicznych przy rekrutacji (a przynajmniej na pozycje, kt\u00f3re s\u0105 pisaniem CRUD\u00f3w) - czego sobie i Wam wszystkim \u017cycz\u0119\n\nhttps:\/\/www.youtube.com\/watch?v=Qcx0OeRIk_M\n\nDla mnie jednak najwi\u0119kszym WOW jest fakt, \u017ce Copilot radzi sobie z pisaniem Regexp\u00f3w Je\u017celi ju\u017c nigdy nie b\u0119d\u0119 musia\u0142 r\u0119cznie tworzy\u0107 rzeczonych, to odpowied\u017a jest tylko jedna\u2026\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/img_610d090d1f292.png\" alt=\"\" \/>\n\n<figcaption>\u2026 panie Microsoft.<\/figcaption><\/figure>\n<h3 id=\"%C5%BAr%C3%B3d%C5%82a\">\u0179r\u00f3d\u0142a<\/h3>\n<ul>\n \t<li><a href=\"https:\/\/www.youtube.com\/watch?v=Qcx0OeRIk_M\">Copilot - From now on I'm not writing any Regex myself<\/a><\/li>\n \t<li><a href=\"https:\/\/juliareda.eu\/2021\/07\/github-copilot-is-not-infringing-your-copyright\/\">GitHub Copilot is not infringing your copyright<\/a><\/li>\n \t<li><a href=\"https:\/\/thelig.ht\/abandoning-github\/\">thelig.ht: Abandoning GitHub<\/a><\/li>\n \t<li><a href=\"https:\/\/www.youtube.com\/watch?v=FHwnrYm0mNc\">GitHub Copilot CRUSHES Leetcode Interview Questions! <\/a><\/li>\n \t<li><a href=\"https:\/\/blog.scottlogic.com\/2021\/07\/03\/github-copilot-first-thoughts.html\">GitHub Copilot Experiences - a glimpse of an AI-assisted future<\/a><\/li>\n<\/ul>\n<h2 id=\"2-troch%C4%99-computerscience-na-przyk%C5%82adzie-kompilatora-rusta-%F0%9F%96%A5%F0%9F%91%A8%E2%80%8D%F0%9F%94%AC\">2. Troch\u0119 #ComputerScience na przyk\u0142adzie kompilatora Rusta \u200d<\/h2>\nPrzyznam si\u0119 Wam do czego\u015b - mam troch\u0119 problem z szafowaniem nazw\u0105 \u201cSoftware Craftsmanship\u201d w sobotniej edycji naszego newslettera. S\u0105 takie dni, kiedy z czystym sumieniem m\u00f3g\u0142bym nazwa\u0107 go co najwy\u017cej \u201cTym \u017cy\u0142o IT w zesz\u0142ym tygodniu\u201d. Staramy si\u0119 wybiera\u0107 co prawda rzeczywi\u015bcie tylko rzeczy, kt\u00f3re z naszej perspektywy pozwalaj\u0105 zapozna\u0107 si\u0119 naszym czytelnikom z \u201czeitgeistem\u201d bran\u017cy - nie zawsze jednak dotykaj\u0105c tytu\u0142owego \u201crzemiel\u015bnictwem kodu\u201d w jaki\u015b mocny spos\u00f3b.\n\nCzasem jednak przychodzi tydzie\u0144, gdy jednym z najcz\u0119\u015bciej dyskutowanych temat\u00f3w w spo\u0142eczno\u015bci by\u0142a NP-trudno\u015b\u0107 procesu kompilacji Rusta - i wreszcie mo\u017cna sobie troch\u0119 to opisywanie proces\u00f3w s\u0105dowych \u201cFANG vs ka\u017cdy\u201d zrekompensowa\u0107 odrobink\u0105 dobrego computer science, zahaczaj\u0105cego o kompilatory i systemy typ\u00f3w.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-18.gif\" alt=\"\" width=\"300\" height=\"138\" \/>\n\n<figcaption>Aczkolwiek nie k\u0142ammy si\u0119 - Rust przebi\u0142 si\u0119 tylko i wy\u0142\u0105cznie dlatego, \u017ce sezon og\u00f3rkowy trwa w najlepsze.<span class=\"-mobiledoc-kit__atom\">\u200c\u200c<\/span><\/figcaption><\/figure>\nZanim przejdziemy do clue dzisiejszego artyku\u0142u - zacznijmy od odrobiny kontekstu. Tak zwany \u201cwyczerpuj\u0105cy pattern matching\u201d jest jednym z tych funkcjonalno\u015bci, kt\u00f3re s\u0105 jednymi z ciekawszych koncept\u00f3w w dzisiejszym programowaniu. Dla niekt\u00f3rych wr\u0119cz odr\u00f3\u017cniaj\u0105 j\u0119zyki, kt\u00f3re nadaj\u0105 si\u0119 do pisania kodu, od \u201cpodj\u0119zyk\u00f3w\u201d kt\u00f3re si\u0119 nie nadaj\u0105 (pozdrawiam Mateusza - je\u015bli czytasz, to wiesz, \u017ce to o Tobie). Jest ku temu ekstremizmowi pewien pow\u00f3d - jedn\u0105 z najcz\u0119\u015bciej wyst\u0119puj\u0105cych kategorii b\u0142\u0119d\u00f3w w programowaniu jest brak pokrycia wszystkich dost\u0119pnych wariant\u00f3w przy okazji np. switchy.\n\n\u0141atwo jest sprawdzi\u0107, \u017ce ka\u017cdy wariant np. enuma zosta\u0142 pokryty:\n<figure class=\"kg-card kg-code-card\">\n<pre><code>fun checkState(state: State): Unit = when (state) {\n\tState.Loading -&gt; {}\n\tState.Done -&gt; {}\n\tState.None -&gt; {}\n}\n\/\/ 'when' expression must be exhaustive, add necessary 'Error' branch or 'else' branch instead.<\/code><\/pre>\n<figcaption>Przyk\u0142ad w Kotlinie, ale my\u015bl\u0119 \u017ce nawet dla nieznaj\u0105cych j\u0119zyka dobrze obrazuje o co chodzi.<\/figcaption><\/figure>\nJednak w wypadku wspomnianego pattern matchingu, sytuacja jest niepor\u00f3wnywalnie bardziej skomplikowana.\n\nPrzejd\u017amy wreszcie do <a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">g\u0142\u00f3wnego artyku\u0142u<\/a>. Ot\u00f3\u017c autor (co ciekawe Polak, specjalista od Cybersecurity) analizuje z\u0142o\u017cono\u015b\u0107 podobnego procesu dla pattern matchingu:\n<figure class=\"kg-card kg-code-card\">\n<pre><code>match todo!() {\n\t(false, _) =&gt; {} \/\/ A\n\t(_, false) =&gt; {} \/\/ B\n\t(false, false) =&gt; {} \/\/ A B\n\t(true, true) =&gt; {} \/\/ !A !B\n }<\/code><\/pre>\n<figcaption>Dla nieznaj\u0105cych sk\u0142adni - \"_\" oznacza \"dowolna warto\u015b\u0107\"<\/figcaption><\/figure>\ni por\u00f3wnuje go do teoretycznego problemu <a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">problemu spe\u0142nialno\u015bci (Boolean satisfiability, znanego r\u00f3wnie\u017c jako SAT)<\/a>. Autor rozk\u0142ada go na czynniki pierwsze, pokazuj\u0105c, \u017ce wspomniany pattern matching mo\u017cna sprowadzi\u0107 w\u0142a\u015bnie do prostych operacji na arytmetyce boolowskiej. Problem spe\u0142nialno\u015bci za\u015b, w swoich bardziej zaawansowanych przypadkach, nale\u017cy do problem\u00f3w o z\u0142o\u017cono\u015bci wielomianowej i nale\u017c\u0105cych do klasy tak zwanej NP-kompletnej.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/giphy-19.gif\" alt=\"\" width=\"500\" height=\"281\" \/>\n\n<figcaption>Co ka\u017cdy maj\u0105cy cho\u0107by wprowadzenie do algorytm\u00f3w wie, \u017ce oznacza same problemy. Aczkolwiek w 2020 wszyscy stali\u015bmy si\u0119 specjalistami od wzrostu wyk\u0142adniczego<\/figcaption><\/figure>\nPodobne wyzwanie wyst\u0119puje r\u00f3wnie\u017c w innych j\u0119zykach programowania posiadaj\u0105cych \u201cexhaustive pattern matching\u201d jak np. Haskell, F# czy OCaml (ten ostatni ze swoim state-of-the-art inferowaniem typ\u00f3w to dopiero musi by\u0107 wrzodem do kompilowania). Og\u00f3lnie je\u015bli kto\u015b chcia\u0142bym temat zg\u0142\u0119dbi\u0107, to prawdopodobnie mo\u017cna by na nim zrobi\u0107 niejedn\u0105 publikacje czy doktorat - je\u015bli interesuje Was fajna analiza tematu z punktu widzenia Haskella, <a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">zapraszam do lektury<\/a>.\n\nJest to kolejny ju\u017c przypadek, gdy korzystaj\u0105c na dyskusji rustowego \u201ccommunity\u201d jeste\u015bmy w stanie wyci\u0105gn\u0105\u0107 troch\u0119 bardziej og\u00f3lne wnioski, \u0142atwo przenaszalne na reszte bran\u017cy. Po pierwsze - nasze kompilatory robi\u0105 naprawd\u0119 trudn\u0105 robot\u0119 - radz\u0105 sobie wielokrotnie z problemami, kt\u00f3re nie posiadaj\u0105cymi (nawet w teorii) optymalnego rozwi\u0105zania. Po drugie - to, \u017ce co\u015b jest NP-kompletne, nie oznacza wcale, \u017ce w skali \u201cprzemys\u0142owej\u201d nie jeste\u015bmy sobie w stanie z tym poradzi\u0107. Po trzecie - dodatkowe mo\u017cliwo\u015bci j\u0119zyka przychodz\u0105 z pewnym kosztem, i czasem trzeba ten koszt dobrze wywa\u017cy\u0107.\n<figure class=\"kg-card kg-image-card kg-card-hascaption\"><img class=\"kg-image\" src=\"https:\/\/vived.io\/wp-content\/uploads\/2021\/08\/image-2.png\" alt=\"\" width=\"413\" height=\"360\" \/>\n\n<figcaption>Dlatego, je\u015bli czasem zdarzy nam si\u0119 zakl\u0105\u0107 na d\u0142ugo\u015b\u0107 procesu kompilacji j\u0119zyka albo na brak jakiej\u015b konkretniej opcji w j\u0119zyku - pami\u0119tajcie: to wszystko jest jaka\u015b forma kompromisu.<\/figcaption><\/figure>\n<h2 id=\"%C5%BAr%C3%B3d%C5%82a-1\">\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n \t<li><a href=\"https:\/\/niedzejkob.p4.team\/rust-np\/\">Compiling Rust is NP-hard<\/a><\/li>\n \t<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Boolean_satisfiability_problem\">Boolean satisfiability problem<\/a><\/li>\n \t<li><a href=\"https:\/\/arxiv.org\/pdf\/1909.04160.pdf\">Structural and semantic pattern matching analysis in Haskell<\/a><\/li>\n \t<li><\/li>\n<\/ul>"]}],"_links":{"self":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/comments?post=10113"}],"version-history":[{"count":1,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10113\/revisions"}],"predecessor-version":[{"id":10683,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/posts\/10113\/revisions\/10683"}],"wp:attachment":[{"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/media?parent=10113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/categories?post=10113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vived.io\/pl\/wp-json\/wp\/v2\/tags?post=10113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}