Programavimo pagrindai: ką būtina suprasti dar prieš pirmą kodo eilutę

Programavimo pagrindai: ką būtina suprasti dar prieš pirmą kodo eilutę
Geras kodas prasideda ne nuo klavišų barškinimo, o nuo mąstymo. Prieš atsidarant redaktorių verta susidėti aiškius pamatus: suprasti, kaip veikia kompiuteris ir programa, kas yra algoritmas ir duomenų struktūros, kaip pasirinkti aplinką, tvarkyti versijas su „Git“, testuoti, taisyti klaidas ir saugiai dirbti su duomenimis. Šis gidas – jūsų „žemėlapis“ prieš pirmą kodo eilutę: trumpai, praktiškai ir su patikrintomis gairėmis.

Kaip veikia kompiuteris ir programa (trumpai, bet esmė)

  • CPU, RAM, diskas: procesorius vykdo instrukcijas, RAM laiko aktyvius duomenis, diskas – ilgalaikę atmintį. Kuo mažiau bereikalingų operacijų – tuo greičiau.
  • OS ir procesai: operacinė sistema (Windows, macOS, Linux) planuoja procesus, tvarko failus, teises ir tinklą. Programa yra procesas su savo atmintimi ir teisėmis.
  • Kompiliuojama vs interpretuojama: C/Go kompiliuojamos į mašininį kodą; Python/JavaScript dažniausiai interpretuojamos (vykdymo metu verčiamos į instrukcijas). Java/ .NET veikia virtualiose mašinose (JVM/CLR).
  • Bibliotekos ir paketai: kodą retai rašote „nuo nulio“ – naudojate už kitus darbus atsakingas bibliotekas. Tvarkykite jas paketų tvarkytuvėmis (npm, pip ir pan.).
Kaip veikia kompiuteris ir programa
Kaip veikia kompiuteris ir programa. Nuotrauka: https://www.freepik.com/

Skaičiavimo mąstymas: problema prieš kodą

Programavimas – tai problemų sprendimas. Prieš rašydami kodą, išsigryninkite:

  • Įvestis → išvestis: ką gaunate ir ką turite grąžinti? Kokia formato, vienetų (m/s, €, ISO data) ir ribų (min/max) tvarka?
  • Apribojimai: kiek duomenų? kiek laiko? kiek atminties? ar reikalingas realus laikas?
  • Kraštiniai atvejai: tušti sąrašai, nuliai, dublikatai, neteisingas formatas, labai dideli skaičiai, ilgos eilutės, netikėtos kalbos.
  • Dekompozicija: skaidykite į mažas, savarankiškas užduotis. Kiekvienai – trumpas aprašas ir testinis pavyzdys.
  • Abstrakcija ir pseudokodas: parašykite sprendimą natūralia kalba arba pseudokodu. Jei pseudokodas neaiškus – kodas irgi bus neaiškus.

Algoritmai ir duomenų struktūros: stuburas

Net paprastos programos naudoja keletą pagrindinių struktūrų ir veiksmų.

  • Algoritmas: nuoseklių žingsnių taisyklės rezultatui gauti. Vertiname pagal sudėtingumą O(…) – kiek žingsnių ir atminties reikės augant duomenims.
  • Masyvas / sąrašas: tvarkinga seka. Greitas indeksavimas, bet lėtas vidurio įterpimas.
  • Žemėlapis (map/dict): poros „raktas→reikšmė“; labai greita paieška pagal raktą.
  • Rinkinys (set): unikalios reikšmės, naudinga dublikatams ir priklausymui tikrinti.
  • Stekas / eilė: LIFO (paskutinis–pirmas) ir FIFO (pirmas–pirmas) tvarkai, pvz., atšaukimams ar apdorojimo eilėms.
  • Medžiai / grafai: hierarchijoms, keliams, „rekomendacijoms“. Praverčia vėliau, bet gerai žinoti, kad jie egzistuoja.

Duomenų tipai ir kintamieji

  • Skaičiai: sveikieji ir slankiojo kablelio (atsargiai su tikslumu, pinigams naudokite decimal).
  • Eilutės ir simboliai: „tekstas“ – prisiminkite UTF-8 ir rašmenis su diakritikais.
  • Loginiai: true/false – naudojami sąlygoms.
  • Kolekcijos: sąrašai, rinkiniai, žemėlapiai – pagrindiniai konteineriai.
  • Null/None/undefined: „nėra reikšmės“ – planuokite, kaip su tuo elgsitės.
  • Mutabilumas: kintami (mutable) ir nekintami (immutable) tipai – svarbu, kai dalijatės duomenis tarp funkcijų.
  • Tipų sistemos: dinaminė (Python, JS) vs statinė (TypeScript, Java). Statiniai tipai padeda klaidas pamatyti prieš vykdymą.
Duomenų tipai ir kintamieji
Duomenų tipai ir kintamieji. Nuotrauka: https://www.freepik.com/

Valdymo srautas ir funkcijos

Programos „ritmą“ kuria sąlygos ir ciklai; supratimas apie funkcijas leidžia kurti mažus, testuojamus modulius.

  • if / else: šakos pagal sąlygą. Paprasčiau – geriau (venkite „if“ labirintų).
  • for / while: kartojami veiksmai. Kai įmanoma – naudokite aukštesnio lygio operacijas (map/filter/reduce).
  • Funkcijos: vardas, parametrai, grąžinama reikšmė. Mažos, daro vieną dalyką, turi aiškų pavadinimą.
  • Šalutiniai poveikiai: kuo mažiau – tuo lengviau testuoti. Skirkite grynąsias funkcijas (be IO) nuo „pasaulį keičiančių“ (failai, tinklas).
  • Rekursija: kartais gražiau už ciklą, bet žinokite apie kaminą (stack) ir galimą perpildymą.

Aplinka: terminalas, redaktorius ir paketai

  • Terminalas ir failų medis: mokėkite judėti (cd, ls/dir), kurti katalogus, paleisti skriptus, skaityti klaidas.
  • Redaktorius: VS Code ar alternatyvos su plėtiniais: linteris (ESLint/flake8), formatteris (Prettier/Black), automatinis tipų patikrinimas (TypeScript, mypy).
  • Paketų tvarkytuvės: npm/pnpm/yarn (JS), pip/venv/poetry (Python), cargo (Rust), go modules (Go). Tvarkykite versijas, fiksuokite lockfile.
  • Konfigūracijos: aplinkos kintamieji (ENV), .env failai, slaptos informacijos nesaugokite repozitorijoje.

Versijų kontrolė su Git (minimali praktika)

  • Repozitorija: git init, pirmas commit, .gitignore (node_modules, .venv, .env ir pan.).
  • Šakos: main stabiliai versijai, funkcijos – atskiroje šakoje. Viena užduotis → vienas pull request.
  • Commit žinutės: trumpos, veiksmažodžiu: „Add login form“, „Fix price rounding“.
  • Grįžimas atgal: git checkout --, git revert, git reset – nebebaisu, kai žinote, kaip atšaukti.

Kodas kaip komanda: stilius, pavadinimai, dokumentacija

  • Stiliaus taisyklės: nuoseklus įtraukimas, kabutės, vardų konvencijos (snake_case, camelCase). Įjunkite linterį ir formatterį.
  • Vardai: aiškūs, ne trumpiniai: total_price, o ne tp.
  • Komentarai: „kodėl“ yra svarbiau nei „ką“. Ką – matosi iš kodo.
  • README ir dokai: kaip paleisti, priklausomybės, pavyzdžiai, architektūros eskizas. Sutaupo kolegoms valandas.

Klaidų paieška ir testavimas (įpročiai, kurie gelbsti)

  • Minimalus pavyzdys: sumažinkite problemą iki mažiausio failo ar funkcijos, kuri atkuria klaidą.
  • Debuggeris ir logai: naudokite breakpoint‘us, stebėkite kintamuosius; trumpi, prasmingi logai su kontekstu.
  • Vienetiniai testai: testuokite funkcijas – įvestis / laukiama išvestis. Pradžiai užtenka kelių kritinių atvejų.
  • Testų piramidė: daugiausia unit, mažiau integracinių, nedaug „end-to-end“.
  • TDD (jei norite): pirma testas, tada kodas – priverčia galvoti apie API ir kraštinius atvejus.

Saugumas, našumas ir duomenų privatumas

  • Įvesties validacija: niekada nepasitikėkite vartotojo įvestimi. Patikrinkite tipą, ilgį, formatą.
  • Injekcijos: naudokite paruoštus užklausų parametrus (prepared statements), neconcatinkite SQL ar HTML.
  • Slapukai ir raktai: jokio API_KEY=... kode ar repozitorijoje. Naudokite ENV ir slaptų duomenų saugyklas.
  • Sudėtingumas: O(n) dažnai geriau nei O(n²). Didėjant duomenims – skirtumai tampa milžiniški.
  • Privatumas: saugokite tik tai, kas būtina; anonimizuokite, šifruokite jautrius duomenis transportu (TLS) ir „ant disko“ (at-rest).

Kalbos pasirinkimas ir pirmas projektas

„Geriausia“ kalba priklauso nuo tikslo:

  • Žiniatinklio sąsajos: JavaScript / TypeScript (naršyklėje), React/Vue/Svelte – jeigu UI.
  • Back-end / automatizacija: Python (greitas startas, daug bibliotekų), Node.js (viena kalba visur), Go (paprasta, greita).
  • Duomenys / AI: Python (NumPy, Pandas), R (statistika).
  • Mobiliosios: Kotlin (Android), Swift (iOS).
  • Sisteminė / našumas: C/C++, Rust (saugus našumas).

Pirmas projektas: rinkitės mažą, bet „naudingą sau“. Pvz., užduočių (TODO) CLI, biudžeto skaičiuoklė, asmeninio tinklaraščio generatorius. Turėkite aiškų „baigtumo“ kriterijų ir funkcijų sąrašą (MVP).

Mokymosi strategija ir klaidos, kurių verta vengti

  • „Tutorinių“ spąstai: mažiau pasyvaus žiūrėjimo, daugiau rašymo. Po kiekvieno video – perrašykite iš atminties.
  • Kasdienė rutina: 30–60 min. per dieną su tikslu: „šiandien parašau funkciją X ir testą Y“.
  • Kodo peržiūra: prašykite grįžtamojo ryšio (mentorystė, bendruomenės). Klausimai turi turėti minimalų pavyzdį.
  • Užrašai: kaupkite „receptus“ (snippets), blog‘o įrašus – atmintis dėkos.
  • Nelyginkite savęs: pažanga nevienoda; svarbu nuoseklumas, ne greitis.

DUK: dažniausiai kylantys klausimai

Ar privalau mokėti matematiką, kad galėčiau programuoti?
Kasdieniam verslo ar žiniatinklio kūrimui užtenka aritmetikos, logikos ir mąstymo apie duomenis. Sudėtingesnei sričiai (grafika, duomenų mokslas) prireiks daugiau matematikos, bet pradėti galite be jos.

Kiek laiko reikia, kad pradėčiau rašyti „normalų“ kodą?
Su nuosekliu mokymusi (30–60 min./d.) per 6–8 savaites jau kursite smulkius įrankius ir automatizacijas. Raktas – praktika ir mažų projektų užbaigimas.

Ar verta pradėti nuo OOP ar funkcijų programavimo?
Pirmiausia – funkcijos, duomenys ir kompozicija. Objektai pravers vėliau, kai modeliuosite didesnes sistemas.

Kaip pasirinkti bibliotekas tarp dešimčių alternatyvų?
Rinkitės gyvas (aktyvūs atnaujinimai), turinčias dokumentaciją, testus ir bendruomenę. Mažiau priklausomybių – mažiau rizikos.

Ką daryti, kai „viskas neveikia“?
Sumažinkite problemą iki mažiausio pavyzdžio, išjunkite „magiją“ (framework‘o pagalbą), patikrinkite versijas, perinstaliuokite priklausomybes, peržiūrėkite logus ir klaidos tekstą nuo pradžios iki pabaigos.

Ar būtina iš karto mokytis Git?
Taip – bent minimaliai. Git suteikia laisvę eksperimentuoti be baimės prarasti darbą ir padeda mokytis „nebijant klaidų“.

Pirmi žingsniai per 7 dienas (praktiškas planas)

  1. 1 diena: įsidiekite redaktorių (VS Code), Git, paketų tvarkytuvę. Susikurkite projects/hello katalogą.
  2. 2 diena: „Hello, world“ + skaitymas iš įvesties ir spausdinimas į ekraną. Įrašykite pirmą README.md.
  3. 3 diena: parašykite 2–3 funkcijas su testais (pvz., konvertuoti valiutą, apskaičiuoti PVM, suformatuoti datą).
  4. 4 diena: sukurkite mažą CLI įrankį (pavyzdžiui, „užduočių sąrašą“) ir išsaugokite duomenis JSON faile.
  5. 5 diena: išmokite naudoti Git šakas, atidarykite pull request savo repozitorijoje (pvz., GitHub) – net jei dirbate vienas.
  6. 6 diena: pridėkite linterį ir formatterį, sukurkite automatinį testų paleidimą (GitHub Actions ar pan.).
  7. 7 diena: sutvarkykite dokumentaciją: instrukcijos, pavyzdžiai, „žinomos problemos“. Pasidalinkite su draugu atsiliepimams.