Programowanie dla każdego

W tym artykule:

  1. Programowanie we współczesnym świecie
  2. Dlaczego programują specjaliści?
  3. Jak będziemy programować?
  4. Co będziemy programować?
  5. Problem i rozwiązanie
  6. Zmiany
  7. Abstrakcja
  8. Podsumowując

Programowanie we współczesnym świecie

Programowanie to umiejętność, która daje olbrzymią przewagę w dzisiejszych czasach. Komputery dają olbrzymie możliwości przetwarzania informacji, organizacji, kompensacji naszych cech, które nie działają najlepiej. W związku z tym programowanie jest bardzo uprzywilejowane na rynku pracy, jednak moim zdaniem jest to tylko poboczny wątek, który swoją efektownością odwraca uwagę osób, które nie wnikają w temat głębiej niż możliwość zarobienia dużych pieniędzy.

Umiejętność programowania daje istotną przewagę, niezależność od oferowanych na rynku rozwiązań, które siłą rzeczy są projektowane, aby zadowolić możliwie dużą ilość konsumentów. Z tego względu, praktycznie nigdy na rynku nie znajdziemy programów szytych na miarę naszych potrzeb, jeśli mamy takie wrażenie, prawdopodobnie wynika to stąd, że taki produkt ułatwia znacząco życie, co nas zadowala, jednak nie mamy pojęcia o innych, potencjalnych możliwości użycia komputerów w naszym życiu (dla ścisłości, przez komputer rozumiem dowolne urządzenie oparte o procesor, tak więc również smartfon, tablet, czytnik e-booków, nawigacja, telewizor, itd).

Tu dochodzimy do pierwszego punktu: możliwości wykorzystania komputerów są ledwie poznane. Nie sposób ich poznać inaczej niż programując, jednak jeśli programuje specjalista nie ma dostatecznej wiedzy i doświadczenia nie wymyśli tego za nas. Dlatego, moim zdaniem, z punktu widzenia rozwoju technologii opartych o komputery, taki moment w którym programowanie stanie się umiejętnością powszechną, jest konieczne. Poza tym, jak każda inna nauka — matematyka, języki obce, biologia, czy polityka — kształtuje nas umysł, wzbogacając nas jako ludzi.

Uważam, że obecnie istnieją już techniczne możliwości, żeby ta perspektywa stała się faktem. Okazja już czeka, kto pierwszy skorzysta, będzie uprzywilejowany w przyszłości, kto prześpi okazję, pozostanie w tyle. Dlaczego tak się nie dzieje? Przyczyn jest co najmniej kilka. Przede wszystkim nie do końca wiadomo jak tego uczyć, duże zapotrzebowanie rynku zaś kierunkuje tę dziedzinę w stronę kształcenia specjalistów, którzy będą tworzyć przynoszące olbrzymie zyski usługi. Programowanie przemyślane aby było powszechną umiejętnością to coś zupełnie innego.

Dlaczego programują specjaliści?

Na samym początku, chcę poruszyć temat zawodu programisty, bo przecież w mojej ocenie, ten rynek pracy powinien się skurczyć aby ludzie mogli odblokować potencjał komputerów. Zawód ten powstał mniej, więcej w latach `70-`80. Do tego czasu programowanie było powierzane pracownikom z najdłuższym stażem, aby zaczęli rozwiązywać swoje zawodowe problemy przy pomocy komputera.

Najważniejszym chyba czynnikiem, który tę sytuację odmienił, jest upowszechnienie komputerów i stojąca za nim decyzja, aby komputer był dobrem, które umie używać każdy. Na daną chwilę było to bardzo istotne, bo pozwoliło zbudować podstawy, rozwinąć technologię, między innymi języki programowania, które znacząco ograniczają złożoność programowania samego w sobie. Jest to bardzo istotne, bo od samego początku, właściwie po dziś dzień, programowanie wiąże się rozwiązywaniem problemów podyktowanych obsługą sprzętu, nie zaś rozwiązaniem problemu samego w sobie. Ten margines znacząco się zmniejszył, w ciągu trzech ostatnich dekad i zasadniczo osiągnął poziom, w którym można programować, nie poruszając tych kwestii.

Jestem przekonany, że programowanie już nie będzie łatwiejsze niż obecnie może być. To inne kwestie sprawiają, że programowanie nie jest powszechne, wciąż raczej jest postrzegane jako wiedza tajemna. Myślę, że już na przełomie I i II dekady XXI w.. komputery były dość szybkie, żeby dać konsumentowi możliwość programowania bez poruszania tych pobocznych kwestii, a zatem kwestią jest tylko stworzenie odpowiednich narzędzi i przekazanie odpowiedniej wiedzy.

Jednak z punktu widzenia obecnych potentatów rynku, rozwijanie tego to jak strzelić sobie w stopę, zniszczenie swojego rynku. Pieniądze zarabia się kontynuując rozwój po to by zwiększać zakres usług, rozwiązywać problemy z nieprawdopodobnym skupieniem władzy nad informacją (po pierwsze, wydajność w skali milionów użytkowników staje się większym problemem; po drugie, im bardziej skupiona władza tym więcej chętnych na przejęcie jej, stąd między innymi rozkwit dziedziny cyberbezpieczeństwa).

Z drugiej strony, historia zna już przypadki upadku giganta w wyniku wypierania konieczności rozwoju. Choćby Kodak, miał wszystko, był potężny. W laboratoriach tej firmy powstał pierwszy aparat cyfrowy. Jednak cyfrowa rewolucja musiała się zdarzyć i ci gracze na rynku, którzy się temu opierali stracili, a wygrali ci, którzy weszli z nową technologią.

Jak będziemy programować?

Jak już wspomniałem, czynnikiem, który utrudnia nauczenie się programowania jest zajmowanie się sprawami pobocznymi. Dlatego nie będziemy się uczyć żadnego popularnego języka programowania (przynajmniej na początku). Również dlatego, że większość języków projektuje się tak by były możliwie uniwersalne, co czyni je bardziej skomplikowanymi (potrzeby rynku zdecydowanie nadają taki kierunek, zdrowy rozsądek niekoniecznie). Zamiast tego, posłużymy się prostym środowiskiem pracy, szytym na miarę, w celu pokazania najważniejszych idei, które pozwolą łatwiejszy start w owych popularnych językach ogólnego przeznaczenia.

Będziemy programować poprzez określanie tego, co chcemy osiągnąć. Jest to coś zasadniczo innego niż dominujące obecnie programowanie przez wydawanie rozkazów. Taki stan rzeczy jest podyktowany naturą procesora, który potrafi tylko bezrefleksyjnie wykonywać polecenia. Ten fakt, przez długi czas, zmuszał programistę do wyrażania się w kategoriach zrozumiałych dla procesora, co znacznie utrudnia sprawę. Obecnie nic nie stoi na przeszkodzie by powierzyć te szczegóły istniejącym programom, przynajmniej dopóki mówimy o zastosowaniu na małą skalę — na poziomie olbrzymich korporacji i rządów państw, problemów nie brakuje.

Inną sprawą, jest to, że myślenie przepisami na osiągnięcie celu jest naturalne, każdy się tego uczy (brak takiej umiejętności uchodzi już za upośledzenie). Czym innym jest umiejętność określania co czym jest, co odróżnia to od tamtego. Do tego pierwszego jesteśmy przysposobieni ewolucyjnie, aby dochodzić do takich rzeczy metodą prób i błędów, to drugiego wymaga nauczenia się. Myślę jednak, że poradzimy sobie i z tym.

Chcę zacząć od programowania obrazów, gdyż obraz jest czymś co trafia bezpośrednio do świadomości. Spróbujemy wykorzystać to aby zbudować podstawy, to o czym wspomniałem w poprzednim akapicie, i móc stopniowo przechodzić w stronę rzeczy trudniejszych do pojęcia przy pomocy wyobraźni.

Co będziemy programować?

Jak już wspomniałem, uznałem, że najlepszym początkiem będzie obraz, będziemy więc rysować. Aby zacząć programować, musimy mieć narzędzie, które można zaprogramować, jakiś punkt wyjściowy. Zatem, jak łatwo się domyśleć, takim punktem będzie proste rysowanie na ekranie. Dla ułatwienia udostępniam to bezpośrednio na stronie. Wymagana jest współczesna przeglądarka z włączoną obsługą javascript i canvas. Problematyczne mogą być telefony. Jeśli projekt będzie się rozwijać i będzie potrzeba, postaram się dostarczyć aplikację dla Androida.

Oczywiście, zanim cokolwiek zaczniemy automatyzować, musi być podstawowe działanie w 100% ręczne jako podstawa do dalszych działań. A zatem, na poniższym polu możesz coś narysować:

Błąd: brak canvas!

Celowo nie ma żadnych opcji. Jak gdybym miał tylko kartkę papieru i pisak. Programowanie jest sztuką rozwiązywania problemów, a zatem jeśli chcemy robić to dobrze, trzeba najpierw zdać sobie sprawę z tego jak się sprawy mają na początku i jak możemy to usprawnić. Bardzo ważne jest to, że zaczynamy od rzeczy elementarnych i małymi podstawowymi krokami dążymy do celu, rozkładając problemy na czynniki pierwsze.

Zachęcam do zapoznania się powyższym rysownikiem i zastanowienia się czego tu brak. Oczywiście nie ma tu jedynej prawidłowej odpowiedzi, można przytoczyć wiele różnych pomysłów. Spróbuj wymyślić co najmniej 3, zanim przejdziesz dalej. Jest to ćwiczenie o tyle istotne, że zanim zaczniemy ułatwiać sobie życie programując, musimy nauczyć się porządkować myśli, określać pomysły i nie zniechęcać się ogromem możliwości i nie gubić się w nim.

Problem i rozwiązanie

Myślę, że nie trudno wymyślić jakieś usprawnienie, w końcu chyba każdy pracował w jakimś programie graficznym, więc raczej ma znacznie wyższe oczekiwania niż tylko możliwość rysowania czarnych linii. Już patrząc na słowny opis tego co można zrobić można wpaść na jakiś trop. Przyjrzyjmy się: „możliwość rysowania czarnych linii”. „Możliwość rysowania” jest niejako punktem wyjścia, bardzo ogólnie wyrażonym kierunkiem. Dalsze określenia to już opis bardzo szczególnego przypadku od którego zacząłem: „czarnych”, „linii”. Oczywiście, można rysować innymi kolorami, nie tylko „czarnym”, i inne kształty, nie tylko „linie”. Idąc dalej tym tropem, można wymyślić grubość linii i tysiące rozwinięć tych podstawowych pomysłów i każdy z nich jest zasadniczo poprawny.

Jednak ja zajmę się czymś innym, z doświadczenia, z uwagi na porządek i użyteczność; również ze względu, że zmierzam do określonego celu, pokazania sposobu myślenia, jakie przynosi dobre rezultaty w programowaniu. To trochę jak ze spacerem po nieznanym lesie (możliwości). Na pierwszy spacer raczej nie chcę się zbyt oddalać od punktu wyjścia. Wolę poznać okoliczne ścieżki, dopiero poznawszy okolicę, stopniowo oddalać się co raz bardziej,w miarę równomiernie na różne strony.

Wracając do świata pomysłów, oznacza to, że będę chciał najpierw zastanowić się czy ten szczególny przypadek, o którym wspominałem jest taki jak trzeba? Ano, moim zdaniem, jest jedno bardzo poważne ograniczenie. Co zostało namalowane już tam zostanie (ewentualnie mogę wyczyścić pole przeładowując stronę). Jeśli na prawdę chcę coś ładnego namalować, przydałoby się chociaż cofnąć nieudaną kreskę, podobnie jak poznając las, czasem najlepiej wrócić po swoich własnych śladach. Mogę namalować coś ładnego bez koloru i bardziej skomplikowanych kształtów, ale bez możliwości poprawienia się, narażam się na dużą ilość frustracji. Podobnie, prawdopodobnie będę chciał potem zapisać stan swojej pracy.

Błąd: brak canvas!zmiany…

Zmiany

Mały kroczek. Znaczny, choć pewnie to stanie się widoczne niedługo. Ten zamysł jest jedną z podstawowych umiejętności dobrego programisty (właściwie, nie tylko). Odłożenia na bok pomysłów, które choć są twoje i fascynujące lecz wybrania czegoś więcej. Aby to rozwinąć potrzebna jest pokora (aby przyznać, że jest lepszy pomysł) i spostrzegawczość (aby go dostrzec).

Może Cię zastanawiać, drogi czytelniku, po co to? Po co pokazuję Ci tylko, że coś zrobiłem, zamiast pochwalić się kodem źródłowym i wziąć się za objaśnianie? Kilka przyczyn przychodzi do głowy. Zanim przestraszę cię jakimś kodem źródłowym (nie oszukujmy się, kodu źródłowego nie boją się tylko prawdziwi twardziele), chcę żebyś zwrócił(a) uwagę na coś ważnego.

Ta prosta zmiana jest jednocześnie szkicowym, szybkim studium dominującego paradygmatu programowania, paradygmatu, w którym rysujemy suwaczki i guziczki, żeby użytkownik mógł się nimi pobawić i nauczyć używać programu. To popisowy numer z punktu widzenia tworzenia produktu. To świetny model biznesowy, który zapewnia dużo pracy programistom. Jest konkret, od razu widać, nic nie trzeba się uczyć. Bajer!

Jednak o tym napisano wiele, nie ma sensu już więcej pisać, tym bardziej, że nie tego, jak sądzę, teraz potrzeba. Dlatego pokażę wam inną ścieżkę. Poza tym, chcę zwrócić uwagę na to jak olbrzymie znaczenie ma to jak rozwiązujemy problem.

A zatem proszę, zobaczcie co tutaj mamy:

Błąd: brak canvas!
OK

A co będzie jak wkleisz to? Pamiętaj żeby usunąć to co tam było wcześniej.

[[[236,174],[236,172],[236,170],[236,168],[235,166],[234,164],[230,160],[224,157],[222,156],[218,154],[216,153],[210,150],[204,149],[200,149],[196,149],[194,149],[190,150],[183,153],[181,154],[180,156],[179,158],[175,163],[173,169],[172,171],[171,177],[171,181],[171,185],[170,191],[170,199],[170,205],[170,207],[170,213],[171,219],[172,221],[173,223],[173,225],[175,228],[180,235],[181,237],[186,243],[191,249],[194,253],[200,253],[205,253],[207,253],[209,252],[211,252],[213,251],[220,247],[223,244],[225,244],[228,241],[229,239],[231,235],[231,233],[231,231],[229,230]], [[213,210],[213,208],[211,207],[211,205],[209,205],[207,204],[205,203],[203,203],[201,203],[199,206],[197,207],[197,209],[197,213],[198,215],[199,217],[200,219],[202,220],[204,221],[206,221],[208,221],[210,220],[212,219],[213,217],[214,215],[214,213],[216,212],[216,210],[214,207],[212,206],[210,206],[208,206],[206,207],[205,209],[205,211],[208,213],[210,213],[212,212],[212,210],[210,210],[208,211],[210,211],[210,209],[208,209],[204,209],[204,211]], [[273,176],[274,174],[275,172],[276,170],[278,169],[282,164],[286,162],[290,159],[293,156],[295,155],[299,154],[302,152],[304,151],[310,150],[316,149],[318,149],[322,150],[324,151],[327,154],[330,157],[331,159],[331,161],[333,162],[333,164],[333,168],[333,172],[333,176],[331,180],[329,186],[329,188],[329,192],[328,198],[327,200],[326,204],[325,210],[324,212],[324,214],[322,220],[322,222],[321,226],[321,228],[318,234],[316,235],[312,239],[306,242],[304,243],[302,244],[300,244],[296,245],[294,245],[288,245],[286,244],[285,242],[284,238],[282,234],[282,232],[282,230],[283,228]], [[289,201],[288,203],[286,204],[286,206],[285,208],[284,210],[284,212],[284,214],[286,215],[289,218],[291,218],[293,217],[295,216],[298,213],[300,213],[301,209],[301,207],[302,205],[302,203],[301,201],[299,201],[295,203],[293,204],[290,207],[288,208],[288,210],[290,211],[292,211],[294,211],[296,210],[296,208],[294,208],[296,209],[298,209],[300,209],[302,209],[304,209],[302,208],[300,208],[298,208],[296,208],[294,208]], [[202,311],[203,313],[204,315],[205,317],[205,321],[208,325],[212,330],[216,334],[218,337],[218,339],[222,346],[227,352],[230,355],[232,355],[235,359],[244,366],[250,368],[256,369],[264,369],[268,369],[270,369],[275,366],[280,362],[282,361],[286,356],[288,352],[289,350],[291,346],[293,342],[293,340],[294,332],[295,328],[296,326],[296,324],[296,322],[298,316],[298,314]], [[261,270],[263,271],[266,275],[268,276],[270,279],[271,281],[274,286],[275,288],[275,290],[278,293],[278,295],[276,296],[274,297],[272,298],[270,299],[266,299],[264,299],[260,299],[258,299],[252,299],[250,298],[252,298]], [[193,71],[197,72],[199,75],[202,81],[204,82],[207,89],[209,95],[213,105],[216,106],[221,121],[225,125],[223,124],[223,122]], [[224,73],[226,75],[226,77],[227,85],[234,100],[234,105],[234,111],[235,115],[235,117],[235,119],[234,121],[236,121]], [[259,68],[258,70],[257,74],[256,76],[256,80],[255,88],[254,90],[253,94],[251,95],[250,99],[249,101],[247,102],[246,106]], [[284,75],[283,81],[280,87],[278,91],[277,93],[271,99],[269,103],[265,108],[265,110],[264,112],[262,113],[262,115],[260,116]], [[292,124],[299,120],[302,117],[303,115],[304,113],[306,112],[308,108],[309,106],[314,101],[317,97],[324,92],[330,86],[331,84]], [[148,143],[146,142],[142,140],[140,139],[136,137],[134,136],[132,136],[131,138],[131,140],[131,142],[131,146],[131,148],[131,150],[133,156],[135,162],[137,170],[138,172],[141,180],[145,187],[145,189],[146,191],[144,191]], [[355,151],[357,150],[359,150],[361,150],[365,149],[369,148],[373,147],[375,147],[379,147],[381,147],[379,148],[377,150],[376,152],[371,156],[360,166],[351,171],[342,179],[338,185]], [[451,69],[451,71],[450,75],[449,77],[449,83],[449,85],[448,91],[447,99],[447,105],[449,103],[450,101],[452,98],[454,95],[457,92],[459,91],[459,93],[460,95],[461,99],[462,103],[462,105],[462,107],[464,107],[466,106],[467,104],[469,100],[470,98],[472,92],[474,81],[475,79],[475,77],[474,79],[471,82],[471,84],[466,88],[464,92]], [[478,100],[477,104],[476,106],[476,108],[477,106]], [[484,83]], [[500,67],[500,73],[496,80],[495,88],[495,94],[495,96],[494,100],[494,102],[493,108],[493,112],[493,114],[493,116],[495,116],[498,113],[503,108],[507,103],[509,99],[511,95],[513,94]], [[491,85],[503,78],[505,78],[509,77],[515,76],[517,76],[515,76],[514,78]], [[523,85],[525,85],[527,85],[529,85],[531,85],[533,86],[535,86],[535,88],[537,90],[539,92],[539,94],[539,96],[539,102],[541,103],[540,105],[538,105],[530,106],[528,107],[526,107],[517,108],[513,109],[511,109],[509,109],[508,105],[507,103],[508,101],[510,101],[514,100],[520,99],[527,101],[536,103],[543,107],[546,109],[546,111],[548,111]], [[562,85],[565,87],[566,91],[567,93],[567,95],[568,99],[568,101],[568,113],[568,121],[567,123],[567,127],[563,134],[560,137],[558,137],[556,138],[552,138],[544,140],[538,141],[536,141],[530,141],[525,140],[515,138],[509,137],[505,137],[503,137],[501,136],[499,136],[497,136],[495,135],[489,134],[487,134],[483,133],[479,133],[477,133],[477,131],[479,130]], [[556,68],[558,68],[562,67],[564,66]], [[452,163],[450,163],[446,163],[442,163],[440,162],[436,162],[434,162],[432,162],[430,162],[428,162],[426,162],[424,163],[424,165],[426,165],[428,165],[432,165],[440,164],[444,164],[446,164],[451,168],[455,171],[457,172],[455,172],[453,172],[451,172],[449,173],[443,173],[439,173],[437,173],[433,174],[431,174],[429,174],[427,175],[426,173],[428,172],[430,172]], [[443,132],[444,134],[444,138],[445,140],[445,142],[445,146]], [[462,149],[462,151],[463,155],[464,161],[464,163],[465,165],[465,167],[467,167],[467,165],[469,165],[471,162],[473,158],[474,156],[476,158],[476,160],[476,162],[477,164],[479,165],[480,163],[482,162],[482,160],[484,159],[484,157],[486,156],[486,154],[486,152],[487,150]], [[494,165],[494,167],[494,169],[494,171],[494,173],[494,175],[494,177],[494,179],[492,180],[491,178]], [[493,151],[495,151],[495,153],[496,155]], [[504,167],[504,169],[504,171],[506,171],[508,171],[510,171],[514,171],[518,170],[520,169],[520,167],[520,165],[520,163],[518,162],[516,162],[514,162],[512,162],[510,163],[510,165],[508,166],[506,170],[504,171],[503,173],[502,175],[501,177],[501,179],[501,181],[503,182],[507,183],[511,183],[517,183],[519,183],[521,183],[523,183],[525,183]], [[549,169],[547,169],[545,169],[543,169],[541,169],[539,170],[536,173],[533,175],[532,177],[530,179],[530,181],[530,183],[531,185],[533,185],[537,186],[541,186],[543,186],[545,186],[547,185],[549,185],[549,183]], [[562,169],[561,171],[561,173],[558,177],[558,180],[556,184],[556,186],[558,186],[560,186],[562,186],[562,184],[563,182]], [[569,155]], [[574,175],[574,177],[576,178],[580,178],[586,177],[588,176],[590,176],[591,174],[591,172],[591,170],[589,168],[587,167],[587,165],[585,165],[583,165],[581,165],[578,167],[576,168],[571,171],[568,173],[567,175],[566,177],[564,178],[564,180],[563,182],[564,184],[566,185],[570,187],[572,187],[574,188],[580,188],[584,188],[588,189],[590,189],[592,189],[592,187]], [[470,214],[470,220],[470,228],[470,230],[470,234],[470,242],[470,244],[470,248],[471,252],[471,258],[472,262]], [[466,289],[468,290]], [[499,212],[500,224],[500,232],[500,234],[500,238],[500,240],[499,250],[499,252],[501,252]], [[498,282],[498,286],[498,288],[498,292],[498,294],[499,296]], [[470,282],[470,286],[470,288],[470,290],[472,290],[472,294],[472,296]], [[528,213],[531,224],[531,226],[533,235],[533,241],[535,258],[537,263],[537,269],[537,267]], [[539,288],[539,290],[539,292],[539,294],[539,298],[537,298],[537,300]]]

Widzisz? Zamiast robić dwa guziki, tylko jedno pole tekstowe z listą pól, przez które były poprowadzone linie. Dalej mogę z łatwością cofać zmiany (CTRL+Z, CTRL+Y na polu tekstowym normalnie uwzględnia automatyczne zmiany). Jednocześnie zyskuję możliwość zapisania obrazka i wysłania go komuś.

Edytowanie obrazków zmieniając współrzędne pojedynczych punktów to mało wdzięczne rozwiązanie, ale jednak możemy usunąć zbędne punkty. Stosunkowo łatwo mogę usuwać poszczególne kreski nawet poza kolejnością. Tak więc nawet na funkcjonalnym poziomie, mamy więcej zmniejszając ilość elementów, płacąc niewielką cenę — potrzebę paru chwil i spostrzegawczości, żeby zobaczyć jak jedno przekłada się na drugie. Komercyjne oprogramowanie stroni od takich rozwiązań, bo traciłoby klienta bardziej leniwego, a co więcej bardziej inteligentny użytkownik mógłby sam uzupełnić oprogramowanie o potrzebne mu cechy. W taki sposób tworzy się uzależnienie, który stopniowo pozbawia użytkownika kontroli.

Dla porównania ruch wolnego oprogramowania (ang. free software) skupia ludzi, którzy dzielą się swoją pracą z dobrej woli i wiary w to, że informacja powinna być wolna. Ten rodzaj oprogramowania (np. Linux, Gimp) czasem może być trudniejszy w pierwszym kontakcie, jednak w perspektywie daje większą elastyczność.

Poza tym znieśliśmy ważną granicę. Rysunek do tej pory był czymś bardzo nieokreślonym. Nawet gdybyśmy mieli pomysł, na zmianę go, to nie wiemy jak, bo ścisła jego postać była ukryta, nie było wiadomo co właściwie musielibyśmy zmienić. Teraz sprawa stała się bardzo jasna, ten obrazek to zestaw punktów, na podstawie których program każdorazowo obrazek odtwarza.

To bardzo istotne, komputer często pokazuje rzeczy wydające się być bardzo ulotne, dźwięki, szybko zmieniające się obrazy, wszystko się zmienia. Przez to możemy łatwo ulec złudzeniu, że naprawdę te rzeczy są tak ulotne. W rzeczywistości, taka sytuacja to rzadkość. To co widzimy na ekranie jest tworzona na nowo i na nowo na podstawie jakiegoś opisu (jak ten zbiór punktów) z którego za każdym razem jest odtwarzany.

Abstrakcja

Wreszcie, może najważniejsze, pojęcie abstrakcji. Pojęcie każdy słyszał, nie każdy wie co to jest (sam nie wiedziałem dopóki nie zacząłem programować). Abstrakcja jest ujęciem problemu z pominięciem pewnych szczegółów, które w danym momencie nie są istotne. W tym przypadku, guziki cofania i przywracania działań separowały nas, jako użytkowników, od tego w jaki sposób jest przechowywany obrazek, tworzyły interfejs do robienia tego, co w drugiej wersji moglibyśmy zrobić pracując na kodzie, który bezpośrednio odpowiada temu jak obrazek jest przechowywany.

Tak jak w tym przypadku, na ogół, użycie abstrakcji odcina pewne możliwości, z drugiej szalenie ułatwia pracę (mniej rzeczy na głowie). Natomiast komputer jest tak złożonym urządzeniem, że abstrakcje układa się warstwami, spośród której każda trochę oddala nas od prostych działań i sprzętu, który je wykonuje coraz bliżej i bliżej naszych ludzkich zamierzeń. Obecnie, przeciętny program komputerowy jest umiejscowiony na ok. 4-7 niższych warstwach, w zależności od potrzeb.

Wybór odpowiedniego poziomu jest bardzo ważny. Jak widzimy, zbyt wysoki poziom abstrakcji może nam utrudnić wykonanie zadania (czasami wręcz uniemożliwić), z drugiej strony zbyt niski poziom abstrakcji też nie jest dobry, bo wymaga zbyt dużego nakładu pracy. W dwóch kolejnych wersjach naszego rysownika napotkaliśmy dwa poziomy abstrakcji, jeden za niski, drugi za wysoki, z czego wniosek, że powinienem zbudować nową abstrakcję na tej niższej. Jednak do tego dojdziemy z czasem. Najpierw nauczymy się absolutnych podstaw.

Podsumowując

W tym odcinku przedstawiliśmy sobie podstawy środowiska, którego użyjemy do nauki. Zobaczyliśmy trzy różne stadia rozwoju tego środowiska, wyjaśniając przy tym pojęcie abstrakcji. Zobaczyliśmy dwie możliwe ścieżki rozwoju narzędzia, wymieniając pewne zasadnicze różnice. Zobaczyliśmy, że możemy tworzyć narzędzia tak, żeby były łatwiejsze, ale za cenę elastyczności. W dalszej części nauczymy się budować abstrakcje o większej elastyczności, zobaczymy jak będzie to rzutować na nasze rozumienie problemu.

Dalszy ciąg — podstawianie