{"id":23,"date":"2019-03-27T23:31:03","date_gmt":"2019-03-27T23:31:03","guid":{"rendered":"https:\/\/kalkus.dev\/?p=23"},"modified":"2023-08-24T23:30:19","modified_gmt":"2023-08-24T23:30:19","slug":"fundamentalny-problem-rozwoju-oprogramowania","status":"publish","type":"post","link":"https:\/\/kalkus.dev\/blog\/2019\/03\/27\/fundamentalny-problem-rozwoju-oprogramowania\/","title":{"rendered":"Fundamentalny problem rozwoju oprogramowania"},"content":{"rendered":"\n<p>Gdyby zapyta\u0107, czym zajmuje jest programista? \u2013 wi\u0119kszo\u015b\u0107 os\u00f3b odpowiedzia\u0142aby \u2013 pisaniem kodu program\u00f3w. Niekt\u00f3rzy, bardziej zorientowani w temacie lub zwi\u0105zani z bran\u017c\u0105 odpowiedzieliby \u2013 analiz\u0105 wymaga\u0144, projektowaniem aplikacji, programowaniem, do pewnego stopnia te\u017c testowaniem i wdra\u017caniem. To wida\u0107. To perspektywa operacyjna. <\/p>\n\n\n\n<p>To czego jednak nie wida\u0107, przynajmniej na pierwszy rzut oka, jest istotniejsze i skutkuje ogromem problem\u00f3w zwi\u0105zanych z rozwojem oprogramowania.&nbsp;<\/p>\n\n\n\n<p>\u015awiat jest z\u0142o\u017cony. Niesko\u0144czenie omal z\u0142o\u017cony. Przedmioty z\u0142o\u017cone s\u0105 z element\u00f3w, elementy z materia\u0142\u00f3w, materia\u0142y ze zwi\u0105zk\u00f3w chemicznych, te z cz\u0105stek, dalej mamy atomy, cz\u0105stki elementarne i tak dalej. Z drugiej strony przedmioty skupiaj\u0105 si\u0119 w miejsca, miejsca w miasta, dalej mamy regiony, pa\u0144stwa, kontynenty, planety, uk\u0142ady gwiezdne, ich skupiska, galaktyki, gromady galaktyk etc.&nbsp;<\/p>\n\n\n\n<p>Ludzie operuj\u0105 na uproszczeniach. Widz\u0105c \u015bwiat &#8211; szacujemy. Opisuj\u0105c grup\u0119 ludzi m\u00f3wimy: para, kilka os\u00f3b, kilkoro, t\u0142um. Nie liczymy ilo\u015bci i nie m\u00f3wimy 27 os\u00f3b. Widz\u0105c kolory m\u00f3wimy jasnozielony, ciep\u0142y lub zimny, ponury, pozytywny. Nie podajemy matematycznego opisu ilo\u015bci&nbsp; czerwieni, zieleni i koloru niebieskiego.<\/p>\n\n\n\n<p>Komputery operuj\u0105 na warto\u015bciach. Nie mo\u017cemy zdefiniowa\u0107 w nich samochodu albo benzyny. Musimy stworzy\u0107 abstrakcje tych przedmiot\u00f3w, wybra\u0107 pewne warto\u015bci, kt\u00f3re je opisz\u0105 w spos\u00f3b uproszczony (obj\u0119to\u015b\u0107, liczba oktanowa), wyselekcjonowa\u0107 relacje mi\u0119dzy nimi (typ paliwa dla samochodu).<\/p>\n\n\n\n<p>Ludzie I komputery s\u0105 fundamentalnie odmienni. Oprogramowanie jest pomostem mi\u0119dzy dwoma \u015bwiatami. Programowanie jest budowaniem warstwy po\u015brednicz\u0105cej mi\u0119dzy katastrofalnie nieprzystaj\u0105cymi do siebie rzeczywisto\u015bciami.<\/p>\n\n\n\n<p>Konsekwencje takiego stanu rzeczy s\u0105 ogromne. Z uwagi na te r\u00f3\u017cnice tworzenie oprogramowania jest trudne, d\u0142ugotrwa\u0142e i z\u0142o\u017cone. Z powodu tej odmienno\u015bci programi\u015bci nie mog\u0105 si\u0119 porozumie\u0107 z klientami. Z tej samej przyczyny nie powsta\u0142y do tej pory znane z film\u00f3w sci-fi roboty, dlatego nie przeprowadzimy ciekawej rozmowy z Siri, a autonomiczne auta napotykaj\u0105 na problemy.<\/p>\n\n\n\n<p>Co szczeg\u00f3lnie zwraca moj\u0105 uwag\u0119 po latach pracy nad tworzeniem oprogramowania to naturalna tendencja ludzka do oszcz\u0119dzania energii (patrz: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Law_of_triviality\">Prawo trywialno\u015bci<\/a>). Bardzo niewielka cz\u0119\u015b\u0107 populacji jest sk\u0142onna w\u0142o\u017cy\u0107 wysi\u0142ek w dog\u0142\u0119bne przemy\u015blenie tematu, nad kt\u00f3rym pracuje. Wi\u0119kszo\u015b\u0107 os\u00f3b sp\u0142yci wszystko najbardziej jak si\u0119 da. Wida\u0107 to w problemach programist\u00f3w z testowaniem wynik\u00f3w w\u0142asnej pracy. Ma\u0142o kt\u00f3ry jest w stanie u\u017cywa\u0107 swojego oprogramowania inaczej ni\u017c w spos\u00f3b w jaki je tworzy\u0142. Jest to najprostszy scenariusz, bo scenariusz znany. Tworzenie nowego wymaga wysi\u0142ku. Ta optymalizacja umys\u0142owa widoczna jest r\u00f3wnie\u017c w pracy projektant\u00f3w \u017ce strony biznesu. Zawsze omal, po jakim\u015b czasie okazuje si\u0119, \u017ce wielu scenariuszy nie przewidziano, a ograniczono si\u0119 do najprostszych. W zasadzie na chwil\u0119 obecn\u0105 nawet zak\u0142ada si\u0119, \u017ce wszystkich mo\u017cliwo\u015bci nigdy si\u0119 nie przewidzi (fundamentalnie odmienn\u0105 zasad\u0119 przyj\u0119to w zespole pracuj\u0105cym nad specyficznym projektem w postaci programu promu kosmicznego, a sam proces prac skutkuj\u0105cych &#8211; mimo dw\u00f3ch katastrof &#8211; niewielk\u0105 ilo\u015bci\u0105 b\u0142\u0119d\u00f3w ciekawie opisano <a href=\"https:\/\/www.fastcompany.com\/28121\/they-write-right-stuff\">tutaj<\/a>).<\/p>\n\n\n\n<p>Dla rozwoju oprogramowania potrzebna jest niestety precyzja. Na ka\u017cdym etapie od projektu przez implementacj\u0119 po testy potrzebny jest wysoki rygor umys\u0142owy. I to jest g\u0142\u00f3wny wniosek, jaki p\u0142ynie z fundament\u00f3w, z natury samej oprogramowania. Nie mo\u017cemy sobie pozwoli\u0107 na lenistwo. Musimy zawsze, w ka\u017cdym momencie pracy by\u0107 tak precyzyjni jak tylko mo\u017cliwe. W przeciwnym wypadku dopadn\u0105 nas konsekwencje \u2013 b\u0142\u0119dy, niedopatrzenia, luki. Tak, jak kompilator jest bezlitosny i w starciu z nim mo\u017ce myli\u0107 si\u0119 tylko programista, nigdy za\u015b komputer, tak samo szeroko poj\u0119ty rozw\u00f3j oprogramowania jest bezlitosny. Co zignorujemy \u2013 wr\u00f3ci do nas rykoszetem, rani\u0105c. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gdyby zapyta\u0107, czym zajmuje jest programista? \u2013 wi\u0119kszo\u015b\u0107 os\u00f3b odpowiedzia\u0142aby \u2013 pisaniem kodu program\u00f3w. Niekt\u00f3rzy, bardziej zorientowani w temacie lub zwi\u0105zani z bran\u017c\u0105 odpowiedzieliby \u2013 analiz\u0105 wymaga\u0144, projektowaniem aplikacji, programowaniem, do pewnego stopnia te\u017c testowaniem i wdra\u017caniem. To wida\u0107. To perspektywa operacyjna. To czego jednak nie wida\u0107, przynajmniej na pierwszy rzut oka, jest istotniejsze i [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[204,7],"tags":[9],"_links":{"self":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/23"}],"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=23"}],"version-history":[{"count":2,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions"}],"predecessor-version":[{"id":25,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/posts\/23\/revisions\/25"}],"wp:attachment":[{"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/media?parent=23"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/categories?post=23"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kalkus.dev\/blog\/wp-json\/wp\/v2\/tags?post=23"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}