Šta svaki programer početnik treba da zna? Programiranje za sebe: zašto svi moraju naučiti kako pisati kod Programi koje bi programer trebao znati.

Bez obzira na to koje obrazovanje ima – tehničar ili inženjer, da bi se mogao baviti ovom profesijom, potreban mu je skup nekih posebnih ličnih kvaliteta. Prije svega, mora biti sposoban da logično razmišlja i izračunava događaje mnogo koraka unaprijed. Također će mu trebati pažnja, upornost i biti u stanju raditi ne samo kreativan, već i prilično rutinski. Ponekad, kako bi oživjela kreativnu ideju, morat će potrošiti više od 90% vremena na njenu implementaciju i otklanjanje grešaka u programu. Naravno, ne može se bez svrsishodnosti i upornosti u ovoj profesiji, kao i bez razvijenog intelekta, sposobnosti za tačne nauke i sposobnosti koncentracije.

Da bi se zaposlio kao softverski inženjer, osoba mora imati srednje stručno obrazovanje, jako je dobro ako ima i radno iskustvo u ovoj specijalnosti.

Koje su obaveze softverskog inženjera?

Naravno, kakav će biti posao softverskog inženjera umnogome zavisi od oblasti u kojoj će raditi, kojom vrstom delatnosti se kompanija bavi. Ali postoje, naravno, opći zahtjevi i znanja koja će mu biti od koristi na svakom radnom mjestu. Prije svega, potrebno je savršeno poznavati kompjutere i uređaje koji se s njima koriste, kao i uređaje za prikupljanje, obradu i prijenos informacija, pravila za njihovo održavanje i rad. Biće potrebno poznavanje metoda i tehnologije automatizovane obrade informacija, glavnih programskih jezika, specijalizovanih softverskih proizvoda koji se koriste u radu ovog preduzeća.

Posao tehničara programera obično uključuje rad na osiguravanju nesmetanog rada računarskih sistema i opreme instalirane na radnim mjestima korisnika. On će morati obaviti pripremne radnje vezane za rad lokalnih računarskih mreža, pratiti kako funkcionišu radne stanice i pružiti tehničku pomoć.

Od njega se može tražiti da razvije najjednostavnije uslužne programe i radne programe za optimizaciju proizvodnog procesa, mora ih otkloniti i testirati. U nekim slučajevima može mu se povjeriti izrada najjednostavnijih shema tehnoloških procesa za obradu različitih tokova informacija u preduzeću ili pojedinačnih algoritama za rješavanje onih problema s kojima se suočava IT odjel. U mnogim preduzećima tehničari-programeri se bave održavanjem baza podataka, njihovim popunjavanjem, skladištenjem, obradom. Softverski inženjer u svakom preduzeću mora biti sposoban da radi sa velikim količinama podataka, da poznaje pravila za njihovo arhiviranje i skladištenje, mora da ima ideju kako

Svoj put do karijere programera trebali biste započeti odgovorom na pitanje da li vam je programiranje uopće potrebno? Ovo pitanje se ne odnosi na one koji studiraju ili su studirali u specijalnosti bliskoj programiranju. Ako ste u školi bili bolji u matematici od humanističkih nauka, ako volite da provodite puno vremena za kompjuterom, ako želite da naučite nešto novo, onda će vam programiranje odgovarati.

Gdje početi

Postoji nekoliko opcija za razvoj događaja, zbog čega osoba postaje programer. Prvi su roditelji programeri koji su svoju djecu svemu naučili. Ova djeca čak i ne moraju ići na fakultet. Druga opcija je moderna profesija programera. Nakon škole, morao sam da biram gde ću ići da učim, a oni su izabrali moderan smer IT, činilo se da im se sviđa. I posljednja opcija je hobi koji je prerastao u posao.

Ako vam se ništa od gore navedenog nije dogodilo, onda imate izbor između četiri opcije:

  • samoobrazovanje. Ova opcija se može koristiti samostalno ili u kombinaciji s drugim metodama. Internet je pun aplikacija koje vam pomažu da naučite različite programske jezike i tehnologije. Ali ovo je najteži način za početnike.
  • Univerzitet. Ako završavaš školu i želiš da budeš programer, onda idi na fakultet. Ako ne zbog znanja, onda zbog kore. Može poslužiti kao bonus prilikom prijave za posao. Mada ćete steći i neko znanje. Ali ne zaboravite da se obrazujete. Izboru univerziteta treba pristupiti vrlo odgovorno. Pažljivo proučite programe obuke i odaberite najbolje tehničke univerzitete.
  • Mentor. Bit će jako dobro ako nađete osobu koja će pristati da vam pomogne i uputi vas u pravom smjeru. On će predložiti odgovarajuće knjige i resurse, provjeriti vaš kod i dati korisne savjete. Inače, već smo pisali o tome gdje možete pronaći mentora. Mentora možete potražiti među poznatim programerima, na IT zabavama i konferencijama, na online forumima i tako dalje.
  • Specijalizovani praktični kursevi. Pokušajte potražiti kurseve u svom gradu na kojima ćete naučiti neki programski jezik ili tehnologiju. Bio sam prijatno iznenađen brojem takvih kurseva u Kijevu, uključujući i besplatne i sa naknadnim zapošljavanjem.

Koji jezik, tehnologiju i smjer odabrati

Kada postanete programer, za godinu ili dvije bićete slobodni da birate jezik koji želite. Ali pri odabiru prvog programskog jezika, početnik bi trebao uzeti u obzir sljedeće kriterije:

  • Dostupnost na tržištu rada. Krajnji cilj ovog puta je pronaći posao programera. A to će biti teško učiniti ako niko ne traži programere u vašem programskom jeziku na tržištu rada. Provjerite sajtove za zapošljavanje, vidite ko najviše traži, napišite desetak jezika. I prijeđite na sljedeći kriterij.
  • Low Entry. Ako morate provesti dugo vremena učeći jezik, to vas može obeshrabriti od programiranja općenito. Pročitajte o jezicima koje ste odabrali iznad. Pregledajte literaturu koju ćete morati pročitati da biste naučili ove jezike. I odaberite one za koje se piše da su svjetlost, ili za koje ste mislili da su svjetlost. Takvi jezici mogu biti PHP, Ruby, Python.
  • Uzbuđenje procesa. Ako ne uživate u pisanju koda na odabranom jeziku, nećete uživati ​​u procesu, poslu ili životu. Da li ti treba? Napravite pravi izbor.

Također ćete morati odlučiti o smjeru programiranja. Mobilni, desktop, igre, web, programiranje niskog nivoa i tako dalje. Najpopularnije i relativno jednostavne industrije su razvoj za web, mobilne i desktop klijente. Jedan jezik može biti prikladan za svaki smjer, a drugi uopće ne odgovara. Odnosno, pri odabiru programskog jezika također vrijedi poći od ovog faktora.

U svakom slučaju, naučite web tehnologije. Ovo su HTML markup jezik, CSS stilovi i koji će vašu stranicu učiniti dinamičnom. Sljedeći korak je učenje jezika na strani servera (Python, PHP, Ruby i više) i web okvira koji su za to prikladni. Istražite baze podataka: skoro svaki posao programera navodi ovo.

Kako steći početno iskustvo

Bez iskustva nećete dobiti posao. Bez posla nećete steći iskustvo. Začarani krug stvarnog života. Ali ne brinite, izvući ćemo se iz toga.

Prvo, nemojte čekati da pročitate sve knjige na odabranom programskom jeziku. Počnite pisati svoje prve linije koda nakon drugog poglavlja knjige. Dovršite sve zadatke iz knjiga, preštampajte primjere, razumite ih. Komplikujte primjere i zadatke iz knjiga vlastitim idejama. Kreirajte vlastite zadatke za obrađeni materijal. Riješite ove probleme.

Drugo, morate pronaći svoje prve projekte. Ovo je vjerovatno najteža opcija, ali funkcionira. Morat ćete sami tražiti narudžbe, ispunjavati ih, mučiti se s plaćanjem. Za početnika je ovo zastrašujuće, ali tada će se sve druge opcije činiti beznačajnim. Završeni projekti se mogu zabilježiti u iskustvu i pokazati budućem poslodavcu. Pravi projekti su veliki plus u vašem životopisu.

Ako znate engleski, registrujte se bolje na berzi na engleskom. Tržište je veće. Ako ne znate engleski, naučite ga. U međuvremenu, dostupne su vam berze slobodnih radnika na ruskom jeziku. Potražite male projekte koji su na ili iznad vašeg nivoa znanja. Prijavite se za nekoliko desetina ovih poslova. I pripremite se da dobijete mnogo odbijanja. Ali ako jedna ili dvije aplikacije rade, imat ćete priliku steći pravo iskustvo.

Još jedna dobra opcija za stjecanje stvarnog iskustva je open source. Takvi projekti uvijek trebaju nove ljude, čak i početnike. Možete tražiti greške u projektu ili pogledati u program za praćenje grešaka i predložiti metode za njihovo rješavanje. Pronalaženje takvih projekata je jednostavno na GitHubu ili . Slobodno postavljajte pitanja tamo.

Četvrta opcija za sticanje iskustva je pomoć poznatim programerima. Zamolite ih da vam daju male i lake zadatke. Ako nešto ne uspije, uvijek ćete imati kome da se obratite. A istovremeno ćete učestvovati u pravom projektu.

Posljednji način je kroz vlastite projekte, razne hakatone ili rad u co-working prostoru. Teško je pokrenuti vlastite projekte, bolje je tražiti poznanike ili prijatelje.

Zašto odabrati Python

Hajde da pričamo malo više o izboru prvog programskog jezika. Prvi jezik bi trebao biti jednostavan i popularan na tržištu. Takav jezik jeste Python. Preporučujem vam da ga odaberete kao svoj prvi programski jezik.

Python kod je čitljiv. Ne morate čak ni biti programer da biste općenito razumjeli šta se dešava u programu. Zbog jednostavne sintakse Pythona, trebat će vam manje vremena za pisanje programa nego, na primjer, u Javi. Ogromna baza biblioteka koja će vam uštedjeti mnogo truda, živaca i vremena. Python je jezik visokog nivoa. To znači da ne morate mnogo razmišljati o memorijskim ćelijama i o tome šta ćete tamo smjestiti. Python je jezik opšte namene. A tako je jednostavno da ga čak i djeca mogu naučiti.

Iskreno rečeno, vrijedno je spomenuti i druge programske jezike. Java Možda je dobar izbor za početnika. Ovaj jezik je popularniji od Pythona, ali i malo komplikovaniji. Ali razvojni alati su mnogo bolje razvijeni. Treba samo uporediti Eclipse i IDLE. Nakon Jave, bit će vam lakše preći na rad sa programskim jezicima niskog nivoa.

PHP je još jedan veoma popularan jezik. I mislim da je čak i lakši od Pythona. Na forumu je vrlo lako pronaći mentora ili rješenje problema. To je zato što u svijetu postoji ogroman broj PHP programera različitih nivoa. U PHP-u nema normalnog uvoza, postoji mnogo opcija za rješavanje istog zadatka. I to otežava učenje. A PHP je izoštren isključivo za web.

Jezici C I C# veoma teško za početnika. ruby je dobar izbor kao drugi jezik, ali ne i prvi. JavaScript- veoma jednostavan jezik, ali vas neće naučiti ničemu dobrom. A zadatak prvog programskog jezika je i dalje da te nauči nečemu ispravnom, da postavi neku vrstu logike.

Je li engleski važan

Bitan! Ne znam? Teach. Znaš li? Poboljšati. Naučite čitati, pisati, slušati i govoriti engleski. Fokusirajte se na tehničku literaturu. Slušajte podcaste na engleskom jeziku. Čitajte udžbenike programiranja na engleskom jeziku.

Šta treba da znate, osim programskog jezika

Naravno, osim programskog jezika i engleskog, potrebno je još nešto znati. Ali šta - ovisi o smjeru koji odaberete. Web programer mora poznavati HTML, CSS, JavaScript. Desktop programer podučava API-je operativnog sistema i različite okvire. Programer mobilnih aplikacija uči Android, iOS ili Windows Phone okvire.

Svako treba da nauči algoritme. Pokušajte pohađati kurs na Courseri ili pronađite knjigu o algoritmima koja vam odgovara. Osim toga, potrebno je poznavati jednu od baza podataka, obrazaca programiranja, strukture podataka. Također je vrijedno upoznati spremišta koda. Barem sa jednim. Potrebno je poznavanje sistema kontrole verzija. Odaberite Git, najpopularniji je. Morate znati alate sa kojima radite, operativni sistem i razvojno okruženje. A glavna vještina programera je da zna guglati. Nećeš živjeti bez toga.

Poslednji koraci

Morate pripremiti životopis. Ne samo životopis, već. Ne treba tu pisati, ali ne treba ni da ćutite o svojim veštinama. Nakon što ste pozvani na intervju, morate se pripremiti za njega. Prođite kroz materijal koji je naveden u vašem životopisu. Morate biti sigurni u svoje znanje. Pregledajte projekte na kojima ste radili, zapamtite tehnologije koje ste koristili. I naprijed - u svijetlu budućnost sa novom profesijom programera.

Programer je jedna od najvažnijih profesija. U većini modernih područja djelovanja koriste se računari, a glavni je specijalista odgovarajućeg profila koji je odgovoran za njihove funkcije koje su praktično značajne za osobu, a u mnogočemu i za njihov učinak. Koje veštine treba da poseduje programer da bi uspešno rešio svoje probleme? Koja su osnovna znanja potrebna osobi da postane takav specijalista?

  • karakteristike zadataka koje rješava osoba u ovoj specijalizaciji, kao i potrebne vještine i znanja u vezi s njima;
  • specifičnost pojedinih jezika za razvoj softvera kao glavne komponente programskog alata.

Razmotrimo detaljnije suštinu navedenih aspekata.

Šta bi programer trebao znati da riješi svoje probleme?

Osoba koja radi kao programer može se nositi s velikim brojem zadataka. među ovim:

  • Pisanje računalnih programa;
  • razvoj softverskih koncepata;
  • prilagođavanje programa različitim kategorijama korisnika (u smislu interfejsa i funkcija);
  • testiranje softvera i otklanjanje grešaka.

Proučit ćemo suštinu ovih područja djelovanja programera, kao i koje vještine moraju posjedovati da bi uspješno obavljali odgovarajuće funkcije.

Jezička kompetencija

Pisanje programa je glavna kompetencija specijaliste ovog profila. "Softver" se kreira pomoću posebnih jezika, a osoba mora savladati odgovarajući nivo znanja o njima. Ovo je stoga ključni uslov za znanje programera.

Što se prvog zadatka tiče, softver se može razviti za interne potrebe kompanije (na primjer, za organiziranje rada s bazama podataka i opreme, upravljanje finansijskim tokovima) ili za vanjskog potrošača (kao dio korporativne narudžbe ili uvođenjem proizvoda). na maloprodajnom tržištu pod komercijalnim brendom).

Koje programske jezike treba da zna programer? To uvelike zavisi od toga kakav softver kreira. Kao dio unutar-korporativnih zadataka, programer najčešće radi sa bazama podataka, serverima, otklanja greške, testira, piše algoritme upravljanja opremom. Ove kompetencije će najvjerovatnije zahtijevati poznavanje univerzalnih, multifunkcionalnih jezika: C, C ++, Java, Ruby. Ako govorimo o radu sa bazama podataka, ne možete bez poznavanja SQL-a. Stručnjaku će biti korisno da poznaje Python - jedan od najlakših za učenje, ali vrlo potreban i tražen jezik.

Što se tiče puštanja softvera po narudžbi za eksterno tržište, zahtjevi za vještinama programera su obično širi – budući da komercijalni uspjeh kompanije koja ga zapošljava ovisi o funkcionalnosti i kvaliteti izdanih rješenja. Osim ovih univerzalnih jezika, osoba će morati da savlada i one „uskog profila“ – kao što su, na primer, C#, Javascript, PHP, Objective-C.

Malo kasnije ćemo detaljnije proučiti karakteristike svakog od označenih jezika.

Učešće u konceptu

Kompetencija programera može biti i rješavanje konceptualnih problema vezanih za kreiranje "softvera". Specijalista razmatranog profila često je uključen u raspravu o projektu razvoja softvera, procjenjuje izglede za njegovu implementaciju u praksi. Na primjer, programer može reći kolegama da predloženi proizvod nije baš optimalan za određeni proizvodni proces i da njegov projekt treba poboljšati u tom i tom pogledu.

U rješavanju problema vezanih za koncept softvera, funkcije programera zahtijevaju i visok nivo njegovog poznavanja jezika. Konkretno, stručnjak bi trebao biti u stanju ispravno odabrati optimalni jezik u smislu kompatibilnosti s projektom. Na primjer, Objective-C, koji smo gore spomenuli, je glavni pri razvoju mobilnih aplikacija za iOS, ali što se tiče rješenja za Android, jedan od najoptimalnijih alata za njihovu izradu je Java.

Činjenica da će uvijek postojati jezik koji određenoj platformi odgovara bolje od drugih jedan je od glavnih postulata profesije, to je ono što bi programer početnik trebao znati prije nego što započne karijeru. Dakle, dobar specijalista ovog profila je definitivno „poliglota“ u pogledu poznavanja kompjuterskih jezika i uvek ima mogućnost da izabere optimalni „dijalekt“ za pisanje softvera.

Prilikom rješavanja problema u "konceptualnom" smjeru aktivnosti, programer mora imati i dovoljno znanja iz područja tržišta hardvera: softver koji će kreirati najvjerovatnije će zahtijevati prilagođavanje jednom ili drugom tipu računara ili gadžeta. Specijalista će morati osigurati kvalitetnije nego u konkurentskim rješenjima, performanse funkcija "softvera" koji kreira u odnosu na određenu vrstu opreme.

Sve komponente su važne

Bilo koja vrsta softvera sastoji se od dvije osnovne komponente: koda i interfejsa. Prvi element su matematički i logički algoritmi napisani u posebnom programskom jeziku koji obezbjeđuju funkcionalnost proizvoda. Drugi je kako će softverske mogućnosti koristiti korisnik, kako će upravljati funkcijama. Program može biti proizvoljno savršen u smislu koda, ali nezgodan interfejs će otežati njegovu efektivnu praktičnu primenu.

Istovremeno, izuzetno je važno da kontrole programa odgovaraju željama ciljne grupe korisnika. Teško je razviti proizvod čija bi upotreba karakteristika bila ugodna za sve. Sigurno će postojati značajan procenat ljudi nezadovoljnih interfejsom. Ono što je najvažnije, na način da programer prilagodi rješenje "svom potrošaču". Bitno je da je, prije svega, bio zadovoljan.

Položiti testove

Računalni program može nuditi široku funkcionalnost i karakterizirati ga korisničko sučelje, ali ako je njegov rad praćen stalnim kvarovima i greškama, tada odgovarajuće prednosti neće biti važne. Stoga, programer softvera mora imati vještine koje će omogućiti otklanjanje grešaka i neophodno testiranje rješenja.

Postoji mnogo vrsta softvera za provjeru ispravnosti programa. Među popularnim su Device Anywhere, Jira, Android Debug Bridge, iPhone Configuration Utility. Programer mora biti u stanju da ih koristi, osim, naravno, znanja iz oblasti jezika koji se koriste za kreiranje softvera za platforme na kojima se vrši testiranje.

Treba napomenuti da u modernim kompanijama programeri po pravilu rade u timu. Tako su navedene kompetencije najčešće raspoređene među pojedinim specijalistima. Na primjer, identifikaciju kvarova i kvarova u softveru može obaviti osoba na poziciji testera. Razvoj koncepata, poboljšanje sučelja također često provode pojedini stručnjaci. Ali često se dešava da sve označene zadatke rješava ista osoba. Ovaj scenario je najčešći u malim kompanijama ili startupima.

Neki IT stručnjaci radije rangiraju ove specijalizacije prema nivou vještina. Dakle, testeri se ponekad u principu ne smatraju programerima zbog činjenice da rijetko rade sa “kodom”. Međutim, sposobnost pravilnog provjeravanja softvera na greške je, na ovaj ili onaj način, važna kompetencija programera. Čak i ako ne uspije dati program nekom drugom na testiranje, morat će sam obaviti potreban posao.

Isto se može reći i za programski interfejs. Specijalista sa dizajnerskim vještinama vjerovatno će bolje obaviti posao optimizacije funkcija upravljanja softverom nego "generalni" programer. Ali ako osoba radi u startupu i nema priliku zatražiti pomoć stručnjaka uskog profila, onda će sve morati učiniti sam.

Koje programske jezike treba da zna programer?

Iznad smo naveli da je ključna kompetencija programera poznavanje specijaliziranih jezika koji se koriste za kreiranje softvera, te naveli one koji se aktivno koriste na modernom IT tržištu. Koje oblasti poslovanja i IT razvoja su najbolje prilagođene određenim jezicima? Kako programer odlučuje koji će studirati?

Dakle, među najpopularnijim jezicima danas su: C, C++, C#, Java, Javascript, Ruby, PHP, Python, Objective-C, SQL. Koji je razlog da ih savremeni programer poznaje?

Što se tiče jezika C, treba napomenuti da je on jedan od najsvestranijih i najmoćnijih u pogledu karakteristika. Na njemu će biti moguće kreirati gotovo svaki program. Ovaj jezik je veoma teško naučiti, ali zbog toga je posebno časno znati ga. Isto se može reći i za C++ i dodati da je još raznovrsniji i traženiji.

Zauzvrat, jezik C# nije baš blizak C-u, ali je preuzeo mnogo od C++, kao i Jave. Što se njegove primjene tiče, on je nezamjenjiv za programere koji rade s korporativnim tipovima Windows softvera.

Mnogi IT profesionalci Javu nazivaju najsvestranijim jezikom. Može se koristiti na gotovo bilo kojoj platformi - Windows, Linux, Mac, mobilni operativni sistemi, web razvoj. Java jezik je relativno težak za naučiti, ali kada ga savlada, programer će moći da reši širok spektar problema.

Javascript nije direktno povezan sa Javom, uprkos sličnosti u nazivu. Uglavnom se koristi u oblasti web razvoja. Uz Javascript, web stranice se mogu fleksibilno konfigurirati u smislu izgleda, kontrola, animacija i drugih funkcija. Stoga, za one programere koji odluče da se upuste u izradu web stranica, učenje Javascripta je neophodno. Slično tome, web razvoj je glavno područje primjene PHP-a. Nije teško naučiti i vrlo je funkcionalan.

Šta programer treba da zna o Pythonu i Rubyju? Prije svega, činjenica da se, unatoč lakoći proučavanja, koriste u raznim područjima. Na primjer, Python aktivno koriste programeri najvećih internetskih korporacija - Google, Facebook. Ruby jezik je odličan za male startupove, ali ne samo - na primjer, veliki projekti kao što su Slideshare i Groupon imaju iskustvo njegove uspješne upotrebe.

Tržište mobilnih aplikacija danas je jedno od najdinamičnijih i najprofitabilnijih. Ako programer želi da se udobno snađe na iOS platformi, onda bi trebao naučiti jezik Objective-C - kao što smo gore napomenuli, on je posebno kreiran za razvoj odgovarajuće vrste softvera. Ako je osoba bliža tržištu Android uređaja, onda morate naučiti Javu.

SQL je jedan od najčešće korišćenih jezika za rad sa bazama podataka. Relativno ga je lako naučiti, ali će njegovo znanje uvijek biti korisno stručnjaku koji planira izgraditi karijeru u velikoj korporaciji.

Karijera programera privlači mnoge ljude. To je povezano ne samo s visokom platom, već i sa mogućnošću da učestvujete u realizaciji najzanimljivijih projekata koji mogu biti značajni ne samo za jednu kompaniju ili startup, već i za cijelu zemlju i globalno IT tržište. .

Proučićemo koja neophodna znanja i veštine treba da poseduje osoba koja planira da postane programer.

Šta bi programer početnik trebao znati?

Rašireno je gledište da samo specijalista sa matematičkim ili tehničkim obrazovanjem može razviti konkurentan softver. Upravo iz tog razloga, kao ispiti za IT-specijalnosti na univerzitetima, morate polagati predmete odgovarajućeg profila. Može se primijetiti da matematika nije kriterij održivosti programera, već njegov neophodan alat. Znanje u okviru ove discipline ne garantuje da će osoba moći da kreira softver visokog kvaliteta, ali bez njega će mu biti problematično da savlada čak i najelementarnije jezike za razvoj „softvera“.

Ovaj tekst se pojavio kao odgovor na standardnu ​​reakciju "pravih programera" na moje riječi da sam 1C programer. "Ahh, 1s-nick, kakav si ti programer, dakle scenarista u najboljem slučaju. Tu se zadubiš u svoje računovodstvo i iz nekog razloga sebe smatraš programerima. Znaš li koliko bi pravi programer trebao znati?"

Kada sa interesovanjem pitam šta tačno PRAVI PROGRAMER treba da zna, obično dobijem kao odgovor neke konkretne probleme konkretnog programera sa kojim u tom trenutku razgovaram. I izdato gotovo za pravu suštinu cjelokupnog programiranja kao takvog. Pa, nešto poput - "Ako ne znate kako da koristite semafore u Delphiju, niste programer." Ili -- "ako ne znate kako funkcionišu heš tabele, niste programer." Dojadilo mi je to, pročeprkao sam po internetu i odlučio da u jednom postu sakupim sve što PRAVI PROGRAMER treba da zna prema samim PRAVIM PROGRAMERIMA. Lista razbijena po dijelovima znanja pod rezom

MATEMATIKA

Numeričke metode, dihotomija/Newton metoda, inter- i ekstrapolacija, splajns, Gauss/Jacobi/Seidel metoda, QR i LU dekompozicija, SVD, LSM, Runge-Kutta metode, Adamsova metoda, Newton-Kotesove formule, Ritz metoda, Bubnov metoda - Galerkin, metoda konačnih razlika/elementa, FFT/STFT, konvergencija i stabilnost, l-bfgs i druge kvazi-njutnove metode, adagrad, PARAFAC, kazuar, metode unutrašnje tačke, varijacione metode za Bayesovo zaključivanje, nesterov, automatska diferencijacija, naizmjenični najmanji kvadrati , šta bi svaki informatičar trebao znati o aritmetici s plutajućim zarezom od Goldberga, Nocedala & Wrighta/Boyda & Vandenberghea

Algoritmi, Knuth-Graham-Patashnik/Zoric/Winberg, Spivak/Dummit-Foote, račun, linearna algebra, kompleksna analiza, funkcionalna analiza, diferencijalna geometrija, teorija brojeva, diferencijalne jednadžbe/integralne jednadžbe/račun varijacija/optimalna kontrola, generiranje funkcija , nizovi, kombinatorika, teorija vjerovatnoće/matematička statistika/stohastički procesi/teorija redova čekanja, Markovi lanci, integralne transformacije (Fourier, Laplace, Wavelet), NZQRCHOS, mat paketi (Mathematica, Maple), teorija kategorija

Teorija informacija, kompresija, Huffman, RLE, BWT, LZ, kodovi za ispravljanje grešaka, kompresija sa gubicima (slike, audio, video), entropija informacija, Šenonova formula, Kolmogorovljeva kompleksnost, problem maksimalne entropije, kullback-leiblerova divergencija, elias/shanon-elias kodiranje

Diskretna matematika, K2, Postov teorem, kola, konačni automati (DFA i NDFA), automat Kalašnjikov, ćelijski automati

Kriptografija, Schneier/Yaschenko, Kerckhoffsov princip, simetrična (DES, AES), asimetrična (RSA), PRNG kvalitet, Diffie-Hellmanov algoritam, eliptičke krive, heširanje (MD5, SHA, CRCn), DHT, kriptografska snaga, kriptonapadi (baba ) , WEP/WPA/WPA2 i napadi, digitalni potpis i certifikati, PKI, HTTPS/SSL, dokaz bez znanja, šema praga, murmurhash/cityhash, DKIM

Kvantno računarstvo, Shorov algoritam, kvantna kriptografija

OPĆE OSNOVE PROGRAMIRANJA

Multithreading, dining filozofi, zastoj/livelock/trka stanje/izgladnjivanje, atomičnost, upute za zaključavanje procesora, memorijski model/barijera/naručivanje, CAS ili LL/SC, čekanje/zaključavanje/bez prepreka, ABA problem, pisanje kontejnera bez zaključavanja, spin-lock, TLS/podaci po niti, Amdahlov zakon, OpenMP, MPI, map-reduce, kritična sekcija/muteks/semafor/promenljiva stanja, WaitForSingleObject/WaitForMultipleObjec ts, zelena nit/korutina, pthreads, budućnost/odloženo/obećanje, model aktera, server parametara, RDD (kao što se vidi u iskri), pljusak SGD, bez čekanja, stackful vs stackless

Izračunljivost, Turingova mašina, normalni Markovljevi algoritmi, Post mašina, Diofant Matijasevičeve jednadžbe, Church lambda funkcije, djelomično rekurzivne Kleeneove funkcije, Sheinfinkel kombinatorno programiranje, Brainfuck, ekvivalencija Turingovog močvara, problem zaustavljanja i samoprimjenjivosti, prebrojivost skupa funkcija, RAM mašina, Tarski algoritam, SAT/SMT rešavači, formalna teorija sistema, interaktivni dokazi, Levin-Cookova teorema, 3SAT, PSPACE = NPSPACE,

Algoritmi i kombinatorna optimizacija, Kormen/Skiena/Sedgwick/Knuth/Aho-Hopcroft-Ulman/Papadimitriou/Shriver-Goldberg/Preparata-Sheimos/e-maxx.ru, strukture podataka, algoritmi, složenost, Landau simbolizam, Akra-Buzzy -prostorni kompromis, klase složenosti, NP-potpuni problemi, KMP, grafovi i stabla, mrežni tokovi, Kirchhoffova matrica, stabla pretraživanja (posebno RB-stablo i B-stablo), detekcija okluzije, hrpa, hash tablice i savršeni hash, Petrijeve mreže , ruski seljački algoritam, Karatsuba metoda i množenje Winograd-Strassen matrice, sortiranja, pohlepni algoritmi i matroidi, dinamičko programiranje, linearno programiranje, diff algoritmi, randomizirani algoritmi i fuzzy algoritmi pretraživanja, pseudoslučajni logički brojevi, fuzzy drvo poravnanje niza), pretraživanje motiva, skeniranje linije, keš zaborav, sortiranje lijevka, VEB-izgled, optimizacija korijena, algoritmi za dinamičke grafove, proračunski modeli (RAM-mašina/pokazivač/stabla odlučivanja, itd.) , A algoritmi u memorijskim hijerarhijama/algoritmima strujanja, obrada vremena unapred, opseg i rang, LSM-stabla, baferovana a-b-stabla, toku stabla, trajne strukture, sažete strukture, strukture sa gubicima (filter cvetanja/procveta, hash-tabele sa lažnim pozitivnim rezultatima), heširanje osjetljivo na lokalitet, kompromis prostor-vrijeme u hash tablicama, strategije planiranja

Strojno učenje, Tibshirani/Bishop, pristupi AI modeliranju, prekomjerno prilagođavanje/unakrsna validacija, Bayesove mreže, neuronske mreže, Kohonenove mreže, ograničena Boltzmannova mašina, gradijentni spust/penjanje, stohastička optimizacija (Monte Carlo metoda, metoda žarenja, genetski algoritmi, kolonija mrava algoritmi), SVM, povećanje gradijenta, analiza klastera, analiza glavnih komponenti, LSH, učenje s pojačavanjem, MDP, dohvaćanje informacija/vađenje podataka/obrada prirodnog jezika, mašinski vid, Szeliski, OpenCV, obrada slike, OCR, Sobel filteri, Haar kaskada, Viola-Jones framework, SURF, uvod u psihofiziologiju vida, IPython/pandas/scikit-learn, (ME)HMM, CRF, problem pristranosti etikete, složeni NN, LeToR, mašine za faktorizaciju, autoenkoderi, RNN/CNN, individualni zadaci su bolje umjesto NLP-a (jezičko modeliranje, detekcija koreferenci, lomljenje teksta, POS-označavanje, probabilističko raščlanjivanje, statističko mašinsko prevođenje, ispravka pogrešnog pravopisa, odgovaranje na pitanja, NER, detekcija kolokacije, sažetak teksta izacija, prepoznavanje govora, izdvajanje činjenica, analiza sentimenta), softmax efikasno računanje, inženjering/odabir karakteristika, procjena kvaliteta, Manning/Jurafsky/McCallum/Koehn, latentne teme (LDA, kineski restoran, pLSI), paralelne koordinate, vowpal wabbit , strukturirano učenje, EM algoritam, kontrastivna divergencija, optimalna operacija mozga, širenje uvjerenja, polu-nadgledano učenje, induktivno naspram transduktivnog učenja, kernel trik, diskriminativni/generativni parovi (kao što ga vide Ng i Jordan), učenje sekvence do slijeda, baging, analiza društvenih grafova, sistemi preporuka/saradničko filtriranje, multimodalno učenje

OPŠTI PRINCIPI PISANJA PROGRAMA

Arhitektura i stil koda, McConnell/Fowler/Leblanc/Gamma/Alexander Rescu-Sutter/Butch, defanzivno programiranje, obrasci, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, metrika koda, ujak Bob

Metodologije razvoja, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE

Razvojni alati, IDE, IntelliSense, programi za otklanjanje grešaka (VS/Olly/WinDbg/kdb/gdb) i tragači (strace/ltrace), DWARF format informacija za otklanjanje grešaka, rastavljači i dekompilatori (IDA/HexRays/Reflector), sistemi za kontrolu verzija (SVN, GIT ), spajanje/grana/trunk, sistemi imenovanja datoteka i grana, kontinuirana integracija, ant, pokrivenost koda, statička analiza (lint, cppcheck), dinamička analiza (valgrind, fuzzing), verifikacija i validacija softvera (Frama-C, RAISE (RSL ), Coq), profiliranje, praćenje grešaka, dokumentacija koda, sistemi za izgradnju (CMake), menadžeri paketa (NuGet)

Okviri, Qt, moc i meta-informacije, koncept slot-signala, Summerfield-Blanchet/Schlee, PoCo, industrijske biblioteke: GMP, i18n, lapack, fftw, pcre

GUI dizajn i prezentacija informacija, Ruskin/Tufty, upotrebljivost, osnove dizajna i tipografije, Fittsov zakon, osnove izgleda, LaTeX, algoritmi za vizualizaciju podataka (kao što se vidi u d3), renderiranje podpiksela

Testiranje, jedinični testovi, funkcionalno, opterećenje, integracijsko testiranje, UI testiranje, sprdnje/stubovi/špijuni, fiksiranje, mirisi i test obrasci (Osherove/Meszaros)

PROGRAMSKI JEZICI

Opće razumijevanje programskih jezika, gramatike, Chomsky hijerarhija, Myhill-Nerode teorema, pumpa lema i Ogdenova lema, Kleene algebra, NDFA → DFA, algoritamski nerješivi problemi u formalnim jezicima, Dragonbook, Friedl, regexps i njihova složenost, PCRE, BNF .Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, analiza statičnog koda, kompajliranje/dekompiliranje/zamagljivanje/deobfuskanje, Clang/LLVM/XMLVM/Emscripten , GCCXML, OpenC++, izgradnja virtuelnih mašina, JiT/AoT/GC, DSL/DSEL, zamjena na stogu, provjera tipa/algoritmi za zaključivanje tipa, CYK parser, napredni dizajn kompajlera i implementacija od strane Muchnicka

Asemblerski jezik, Zubkov/Hyde/Drapper/Kaspersky/Fog/Abrash, x86, FPU/MMX/SSEN/AVX, AT&T i Intel sintaksa, masm32, makroi, stek, heap/heap menadžeri, konvencije o pozivima, heksadecimalni kodovi, izvorno predstavljanje podataka , IEEE754, mali/veliki endian, SIMD, hardverski izuzeci, prekidi, virtuelna memorija, preokretanje, slaganje steka i hrpe, programiranje usmjereno na povratak, alfanumerički shellcode, greška L1/L2/RAM/stranica i njihovo vrijeme, ARM asemblerski jezik

C++, standard, Comeau, 1TBS, Straustrap/D&E/Josattis/Vanderwood, Dewhurst/Meyers/Sutter, RAII/copy-and-swap/exception-safety, pravilo pet, Alexandrescu/Abrahams-Gurtovoy, brisanje tipa, CRTP, NVI , SFINAE, Koenig lookup, Duffov uređaj, Boost, Sick-Lumsdane/Carlsson, TR na C++ performansama, Stepanovov test, problem prosljeđivanja/semantika kretanja, SPECS, GotW, Meyerov singleton, cppgm

C++ kompajleri, karakteristike implementacije standarda, ograničenja implementacije, intrinzike, razlike u standardnim bibliotekama (kontejneri, rand), ABI, implementacija virtuelnih funkcija, virtuelno nasleđivanje, izuzeci, RTTI, prekidač, pokazivači na funkcije i metode; optimizacije, elizija kopiranja (RVO, NRVO), sizeof na različitim platformama, kompajler i definicije okruženja, __declspec, kompajlerski prekidači, optimizacija prazne baze, statičko i dinamičko povezivanje, mangling, distribuirana kompilacija, unaprijed kompajlirano zaglavlje, pojedinačna jedinica kompilacije, (strogo) aliasing/restrict, inline/_forceinline, volatile, brzo izračunavanje matematičkih funkcija putem bithackova, linkera i učitavača od Levinea

Aplikacijsko programiranje, C#/F#, Schildt/Troelsen/Richter, generici, prinos, linq/plinq, refleksija, AST, WCF, WinForms/WPF/Silverlight, AOP, okviri za evidentiranje, .NET sklop, Scala, Horstmann/Oderski, podudaranje uzoraka , makroi/kvazi-navodnici

Funkcionalno programiranje, Haskell/Ocaml/Scheme/Alice ili Oz, SICP/TaPL/YAHT/Čisto funkcionalne strukture podataka/Harrison Field, HOF (mapa/fold/filter), Hindley-Milner sistem tipa, monade, klase tipova, ADT, zavisni tipovi , lijenost/energija, logičko programiranje (Prolog ili Mercury), istovremeno programiranje (Erlang ili Oz)

Web programiranje i jezici skriptiranja, Flanagan/Zend PHP5 kurs za certifikaciju + vodič za učenje, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine ili Propel/CodeIgniter ili Symphony ili Yii, Python/Django/Twi Ruby/RoR, ASP.NET MV*, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, OOP u JavaScriptu, HTML5, CSS3/tabela/blok raspored, RSS, canvas/WebGL, Ajax/WebSockets, sigurnost pitanja (XSS, SQL injekcija, CSRF), visoko opterećenje, C10k problem, SWIG, CDN, DOM u sjeni, nedoumice u pregledniku, licitiranje/trgovanje u stvarnom vremenu, detekcija anomalija, arhitektura aplikacija na jednoj stranici, uređaj za indeksiranje weba, nasumično hodanje web/društvenog grafa, asm .js i kompilacija u js, v8/spidermonkey interne, PaaS/IaaS, SPDY

BAZA PODATAKA

Baze podataka/Distribuirani sistemi, Gruber/Datum, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, pohranjene procedure, okidači, Codd/A algebra, Tutorial D, normalni oblici, optimizacija i upit izvršenje, indeksne strukture podataka, transakcije i ACID, Brewerova CAP teorema, DB grafova, skladište dokumenata, skladište široke kolone, skladište ključ-vrijednosti, teorija distribuiranih sistema, CRDT, problem podjele mreže, protokoli konsenzusa, teorija dijeljenja/replikacije, ORM (C++ ODB), ERD, OLAP, semantički web, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, reasoner, DBpedia, big table/hbase vs. dynamodb/cassandra/riak, 2/3PC, bucmast/čuvar zoološkog vrta, izbor vođe (paxos/raft), hdfs/gfs/glusterfs, problem deduplikacije, detekcija uzročnosti (vektorski sat/žigovi), R/W kvorum, balansiranje opterećenja, uređaj indeksi pretraživača, izvor događaja, CRDT, dizajn protokola i principi komunikacije, u smislu evolucije, proširivosti, robusnosti, API dizajna

OPERATIVNI SISTEMI

Operativni sistemi, Silberschatz/Richter/Solomon-Russinovich/R obačevski/Vahalia/Stevens/Tanenbaum/Lov e/Linux Kernel Internals, menadžer memorije, heap manager i uređaj (LAL/LFH/slab), upravitelj uređaja, upravitelj procesa, prebacivanje konteksta , pravi i zaštićeni način rada, izvršne datoteke (PE/ELF/Mach), objekti kernela, mehanizmi za otklanjanje grešaka (strace/ptrace/dtrace/pydbg, Debug API) i minidumpovi, bash, mrežni stog i serveri visokih performansi, netgraph, CR0, IPC, prozorski podsistem, sigurnosni sistem: ACE/ACL i prava pristupa, tehnologije virtuelizacije, RTOS (QNX), programiranje drajvera, IRQL, IRP, sistemi datoteka, BigTable, NDIS/miniport/FS drajveri/filter drajver, Mm-, Io-, Ldr funkcije, DKOM i rootkiti, GDT/IDT/SDT, Windows/Linux/BSD kerneli, POSIX, TRIM

Formati, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode, jednobajtna/UTF-8/UTF-16/UCS-2/UTF-32 kodiranja, Unicode dužina niza i problemi s poređenjem, base64, smanjenje

Komponentni modeli, Rogerson/Tavares, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, stanovi, monikers, MIDL, XPCOM, CORBA, TAO, D-Bus

Mreža, Stevens, OSI model/Internet model, Ethernet, TCP/IP, TCP prozor, Nagle algoritam, utičnice, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, rutiranje/BGP/OSPF, ARP, Mitnick napad, syn flood, HTTP/FTP, P2P/DHT, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth/GPS, ACE, Wireshark

HARDVER

Hardver, Horowitz-Hill/Titze-Schenk, poluprovodnička elektronika/spintronika/fotonika, tranzistor, flip-flop, kola, mikrokod, procesorska tehnologija, sinteza logike, statička analiza vremena, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino uređaji, memorija (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC / CISC, Flynnova taksonomija (ID), Princeton i Harvard pristup, procesorske arhitekture, x86 arhitekture, VID / PID

Procesori, cevovod, hiper-nit, Tomasulo algoritam, spekulativno izvršenje, statičko/dinamičko predviđanje grananja, preddohvaćanje, više asocijativna keš memorija, keš linija/promašaj keš memorije, satovi, zaštitni prstenovi, memorija u višeprocesorskim sistemima (SMP/NUMA), vremenska memorija, intel priručnici za optimizaciju, brojači performansi
___________________________________

Pa, kako impresivno, pitam se da li postoji bar JEDNA OSOBA na svijetu koja zaista sve ovo zna?

Vještine programiranja mogu biti korisne ne samo onima koji žele profesionalno kreirati programe ili web stranice. Ilja Ščurov, vanredni profesor Katedre za višu matematiku na Višoj ekonomskoj školi i predavač u Centru za kontinuirano obrazovanje Fakulteta računarskih nauka Visoke škole ekonomije Nacionalnog istraživačkog univerziteta, govorio je o tome kako sposobnost pisanja koda može olakšati život. T&P objavljuje bilješke s predavanja.

Ilya Shchurov

Vanredni profesor, Katedra za višu matematiku, Viša ekonomska škola i predavač, Centar za kontinuirano obrazovanje, Računarski fakultet, Viša ekonomska škola Nacionalnog istraživačkog univerziteta

Možete razmišljati o mnogim klasifikacijama, ali prije svega, podijelio bih programiranje u dvije široke kategorije: programiranje za nekoga, kada pišete program koji će ljudi koristiti, i programiranje za sebe. Profesionalno programiranje je uglavnom aktivnost za druge i ne bih rekao da je uvijek ugodno. Bilo da ste plaćeni za program ili pišete besplatni softver koji svako može koristiti, ogroman broj ljudi će se žaliti da im nešto ne ide, a uvijek će ih biti više nego onih koji će vas hvaliti . A programiranje za sebe je vrlo ugodno zanimanje i danas ćemo o tome razgovarati.

Ovogodišnje istraživanje profesionalnih programera pokazalo je da 81% njih kodira kao hobi. To znači da je programiranje zabavno, da nije samo posao, već i zabava. Možete koristiti gotove programe, a u 95% slučajeva ćete to učiniti, čak i ako ste profesionalni programer. Ali u bilo kojoj oblasti postoje zadaci koje niko prije vas nije riješio, a sposobnost programiranja vam omogućava da ih rješavate mnogo efikasnije. Jednog dana sam bio u pozivnom centru i zamolili su me da se spojim za dva stola. Osoba koja mi je dodijelila ovaj zadatak očekivala je da počnem kopirati ćelije jednu po jednu iz prve tablice u drugu. Prebacio sam par zapisa, dosadilo mi je, i napisao sam kratku skriptu koja je uzela podatke iz jedne tabele i umesto mene popunila Google formular, što nije baš teško. Svidjelo mi se, ali najviše mi se svidjelo to što me kolege gledaju kao da imam neku magiju.

Pisanje koda je zanimljivo, ali s druge strane je test. Vi komunicirate sa računarom i vrlo često ta interakcija, posebno ako savladate novu tehnologiju, novi jezik, izgleda ovako. Pišete kod, mislite da ste ga dobro napisali, a kompjuter kaže da imate sintaksičku grešku. Zaista, zaboravio sam tačku i zarez, ispravio, ponovo pokrenuo. I kompjuter kaže: "Zatvori držač." Nakon nekoliko takvih iteracija, program počinje s radom i postaje jasno ko je gazda u kući. Činjenica je da i vještina programiranja i proces učenja imaju neke nuspojave (uključujući i pozitivne) efekte.

1. Ekstremno lidersko iskustvo

Kompjuteri su veoma glupi u poređenju sa ljudima, razumeju sve bukvalno, a ako ste naučili da vozite auto, onda ćete najverovatnije moći da upravljate bilo kojim ljudima.

2. Novi pristup informacijama

Počinjete na drugačiji način gledati na obradu informacija, organizaciju tokova informacija i upravljanje. Na primjer, kada prikupljate nizove podataka, već razmišljate o tome da li su prikladni za naknadnu automatsku obradu. Ovo je veoma važno ako imate veliku organizaciju ili projekat sa mnogo tokova informacija kojima treba efikasno upravljati. Ako imate iskustva u automatizaciji, brzo ćete shvatiti u kojem obliku trebate primiti informacije da biste ih kasnije spretno obrađivali.

3. Profesionalna komunikacija

Ako makar malo naučite programirati, bit će vam mnogo lakše komunicirati s programerima. Korisno je barem na osnovnom nivou razumjeti kako funkcionira IT svijet i komunicirati u ovoj oblasti bez posrednika. Ljudi uče jezike kako bi bolje razumjeli drugu kulturu, a programski jezici uče tehnologije.

4. Odgovornost

Zašto programiranje može biti opasno? Prvi razlog je „vi programer“. Ako iznenada neko sazna da možete programirati, počnu da vam padaju zahtjevi: „Ponovo instaliraj moj operativni sistem, molim te, ti si programer“, „Popravi čajnik, ti ​​si programer“ i tako dalje. Ovo nije najgori problem, ima i gorih. Na primjer, 2001. godine na prvoj godini, kada je internet još bio spor, odlučio sam da moram nešto učiniti kako bih brže razmjenjivao informacije sa prijateljima. Pomislio sam: ima pošte i radi. Zatim sam otvorio zasebno sanduče za našu zabavu i napisao scenarij. Robot bi ušao u to poštansko sanduče, uzeo pisma koja su stigla i proslijedio ih svima koji su se pretplatili na ovu stvar. Ovako sada rade Google grupe. Ako sam htio pisati svima, poslao sam pismo u ovo opšte sanduče; ako je neko hteo da odgovori, odgovarao je, pismo je stiglo do svih i moglo se o nečemu razgovarati.

Ali nečija kutija se prepunila, a kada je kutija puna, mail server kao odgovor na bilo koje pismo šalje udarac, što je takođe pismo. Također je završio u zajedničkoj kutiji, moja skripta ju je poslala na sve adrese, uključujući i onu koja se prepunila. Mail server je generirao novi udarac i tako dalje. Kao rezultat toga, u nedjelju ujutro probudio me je poziv mog prijatelja, koji je nježno rekao: „Možda je tu neki problem, jer imam 6.000 pisama u poštanskom sandučetu, a njihov broj je sve veći.“ Nije se dogodilo ništa posebno strašno, ali je bio problem. Tada sam shvatio da se kod lako može izmaknuti kontroli i izazvati probleme, tako da morate biti oprezni.

To je priča kao u Malom princu: ti si odgovoran za one koje si pripitomio. Ljudi i procesi zavise od koda koji pišete. Odnosno, čim učinite nešto korisno za druge, cijena greške raste.

Kako učiti?

Postoje dva suprotna gledišta o ovoj temi. Prvo, programiranje je vrlo lako naučiti, osnovne komande se mogu savladati za tri dana. Ali postoji velika vjerovatnoća da će osoba kada naiđe na poteškoće odlučiti da je prevarena i da programiranje nije za njega. Programiranje nije lako, javljaju se poteškoće. Jedan od razloga za to je što kada programirate, svaki put naučite nove tehnologije, što je uvijek muka.

Suprotan stav je da ako niste kodirali od školskih dana, onda nema šta da počnete. Ovo takođe nije tačno. Programiranje zahtijeva trud, ali ulaz u ovo područje je otvoren, čak i ako to nikada niste radili.

Vjerovatno je da je problem sa kojim se suočavate već riješen i to rješenje negdje leži. Ponekad je teže shvatiti kako to funkcionira nego ponovno napisati. Ovo je standardni problem programiranja, ali za to imamo Stack Overflow, jedan od glavnih izuma čovječanstva u oblasti programiranja. Ovo je stranica na kojoj programeri dijele svoja iskustva i odgovaraju jedni drugima na pitanja. Svaki učesnik ima svoj nivo reputacije, sve je jako dobro osmišljeno, tako da se na jednostavna pitanja može odgovoriti u roku od deset sekundi. Pomaže puno. U današnjem svijetu ne pišete samo program - vi istovremeno koristite ogroman broj programa i alata koje su već kreirali drugi ljudi.

Dobar način da naučite da kodirate je da sebi postavite problem za koji biste bili zainteresovani, a zatim ga pokušate riješiti. Naravno, postoji mnogo online kurseva - pročitajte recenzije kako biste pronašli pravi za vas. Prvi programski jezik je težak jer morate redizajnirati način na koji komunicirate sa računarima i analizirate procese. Ne postoje univerzalni odgovori, sve je vrlo individualno. Dovoljno je da neko pročita dokumentaciju, pogleda primjere koda i sve je jasno. U drugoj situaciji, dobro je imati mentora koji bi odgovarao na osnovna pitanja. Evo nekoliko savjeta koji mi se čine važnima.

1. Najbolji način da se nešto shvati je pronaći radni dio koda, početi ga modificirati i proučiti šta se dešava. Ovo treba uraditi nakon što razumete osnovnu sintaksu. Prilagodite kod prema svojim potrebama ili jednostavno eksperimentirajte.

2. Ako tek učite kako da programirate, nemojte odmah pokušavati da napišete mnogo koda dok ne budete mogli ispravno objasniti šta želite. Ovo je neophodno kako bi računar izvršavao komande jasno i u malim koracima. Svaki put vaši eksperimenti ne bi trebali završiti činjenicom da ste slučajno naišli na pravo rješenje, već razumijevanjem zašto i kako ono funkcionira.

3. Ne brinite o matematici. Poželjno je znati koliki je ostatak od dijeljenja broja drugim brojem, ali sve ovisi o zadacima s kojima se suočavate. Naravno, ako želite genijalno manipulirati podacima, onda vam je potrebna količina matematike za to.

4. Ne bojte se. Kada počnete programirati za sebe, vjerovatno nećete pisati kod koji će se svidjeti profesionalnim programerima. Reći će da to nije tako napisano, da je suvišno, da će takav kod biti težak za održavanje itd. Vjerovatno će biti u pravu. Ali ako pišete za sebe i ako tek počinjete, normalno je da vaši prvi pokušaji nisu tekstovi na nivou Lava Tolstoja. Ako napišete program koji će raditi i riješiti vaš problem, onda je to dobro.

Postoji mišljenje da u pozadini razvoja umjetne inteligencije i strojnog učenja, programeri uskoro više neće biti potrebni: računari će naučiti sami programirati. Ali čini mi se da to nije tako. Sve dok ima zadataka i dok je potrebno objasniti kako ih riješiti, programiranje će postojati. Naravno, programiranje se dosta razvija, u proteklih 20 godina jako se promijenilo. Ali činjenica da su računari postali pametniji nije smanjila broj programera – naprotiv, postali su mnogo više. I čini mi se da će se isto dešavati i dalje.



Učitavanje...
Top