Chci se živit programováním - jak začít?

andy

Re:Chci se živit programováním - jak začít?
« Odpověď #15 kdy: 11. 05. 2013, 15:39:23 »
V Javě je mnohem složitější (i když ne že by to také nešlo) napsat program, který se v různých prostředích bude chovat různě.

Mohli by ste prosim Vas blizsie vysvetlit, ako ste to mysleli? Dakujem.
Asi třeba tohle: http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html


Jakub Galgonek

Re:Chci se živit programováním - jak začít?
« Odpověď #16 kdy: 11. 05. 2013, 15:39:43 »
V Javě je mnohem složitější (i když ne že by to také nešlo) napsat program, který se v různých prostředích bude chovat různě.

Mohli by ste prosim Vas blizsie vysvetlit, ako ste to mysleli? Dakujem.

Například tento C kód:

Kód: [Vybrat]
#include <stdio.h>

int foo(int i, int j){ return i+j; }


int main()
{
    int x = 1, y = 2;

    int r = foo(x++,x+y);
    printf("%i\n", r);
}

V C není jasné, zda program vypíše hodnotu 4 anebo hodnotu 5. Záleží, v jakém pořadí se budou vyhodnocovat parametry funkce foo. Pravděpodobně to u tebe vypíše hodnotu 4, protože pro překladač je výhodné vyhodnotit parametry zprava doleva.

V Javě obdobný kód vypíše hodnotu 5, neboť Java jasně říká, že parametry se se vyhodnocují zleva doprava, což je zase přirozenější pro programátora. V Javě se můžete na hodně věcí spolehnout, nejsou tak často implementation-dependent jako u C.

Ale na druhou stranu byste se neměl spoléhat, že tam implementation-dependent nic není a že, co bude fungovat u tebe, musí nutně stejně fungovat i jinde. Teď mne napadá třeba třída MyClass, která v konstruktoru otvírá nějaký soubor a ve finalizeru ho zavírá. Instance třídy pak můžete vytvářet ve smyčce:

Kód: [Vybrat]
for(File file : directory.listFiles())
  new MyClass(file)

Což u vás může fungovat, ale jinde nemusí. Pokud garbage collector nevolá finalizery dostatečně hbitě, tak vám můžou poměrně rychle dojít deskriptory a už si žádný další soubor neotevřete. Nikde totiž není řečeno, za jak dlouho od ztráty reference na instanci by se měl její finalizer zavolat.

Dalším problémem je třeba představa tvrzení: "V Javě nejsou memory leaky, protože má garbage collector". Ano, hard memory leak tu nepotkáte, nestane se vám, že nedojde k uvolnění paměti, na kterou již nesměřují reference. Ale soft memory leak si tu vytvoříte snadno. Stačí, pokud stále existuje reference na instanci, která již ale nebude nikdy potřeba.

Prostě je třeba nenechat se ukolébat pocitem bezpečí :)

edx

Re:Chci se živit programováním - jak začít?
« Odpověď #17 kdy: 11. 05. 2013, 15:57:45 »
Vidím to tak, že budu pokračovat v Pythonu co nejvíc do hloubky, naučím se OOP a opráším PHP a naučím se dělat i s frameworky. Spíš bych se zaměřil na webové technologie a u toho se naučil alespoň základy C nebo Javy. Zdá se mi to jako nejlogičtější cesta pro mě.

Na PHP se vykašli, když budeš dělat Python. Nevím, co by ti to přineslo. Nic dalšího se neuč, pokud to nechceš používat, což teď tak dva roky nechceš. To budeš umět základy a nějaké frameworky. Pak si můžeš najít pěknou práci a pár let na to zkoušet C nebo Javu. Nebo začni něčím jiným, to je jedno, ale na nový jazyk potřebuješ spíše roky a ne pár dní.

Re:Chci se živit programováním - jak začít?
« Odpověď #18 kdy: 11. 05. 2013, 16:20:45 »
Ale soft memory leak si tu vytvoříte snadno. Stačí, pokud stále existuje reference na instanci, která již ale nebude nikdy potřeba.
Typickej je substring z velkého stringu. Problémy tohodle typu existují i v Erlangu, kde by to člověk už vůbec nečekal. Jestli je to vůbec někde lepší (Haskell?) nevím. Prostě nic není úplná automatika, pořád ještě musí programátor občas na něco i myslet :)

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Chci se živit programováním - jak začít?
« Odpověď #19 kdy: 11. 05. 2013, 16:24:27 »
Mně celkem děsí "naučím se OOP, pak PHP a frameworky". Obojí je běh na dlouhou trať (několik let), nejde to ze dne na den.

OOP je svět plný objektů, které se neustále vytvářejí, mizí, mění se Ti pod rukama a když zavoláš nějakou funkci na nějakém objektu, není zaručeno, že dostaneš stejný výsledek jako před 5 vteřinami. Není to zcela triviální koncept a zvlášť u vícevláknových aplikací je to občast dost na pokálení. Navíc zjistíš, že objekty se dělají trochu jinak v Pythonu (třídy) než v Javascriptu (prototypy).

OOP v dnešní době hýbe světem, ale není samospasitelné (viz např. to, že i do mainstreamových jinak objektových jazyků se dostávají věci z funkcionálních jazyků). Každopádně chceš-li získat práci jako programátor, je nutnost znát nejen "jak vytvořím třídu a její instanci", ale také návrhové vzory, tedy návody "jak řešit určité druhy problémů" (my, zlí jazykové, tvrdíme, že je to návod "jak obejít nedokonalost jazyka"). Základní balík návrhových vzorů je v této knize: http://en.wikipedia.org/wiki/Design_Patterns . Ne všechny je samozřejmě nutné využívat všude, např v C# se na rozdíl od Javy moc nepoužívá vzor Observer tak, jak je uveden v té knize, neboť jsou v tom jazyku konstrukce, které jej zjednoduší. Ale je dobré je znát všechny - alespoň na té úrovni k čemu slouží a jak zhruba vypadají. (Jak přesně vypadají je nutné znát pouze ke zkoušce na vysoké škole; v praxi si buď otevřeš knížku (já ji mám v kanclu na stole) nebo to vygooglíš.)

Jinak jestli Tě chytl Python, uč se na Pythonu. Na MIT se taky učí programovat v Pythonu, nedávno na něj přešli ze Scheme. Není to špatný "startovací jazyk" (Scheme je lepší, ale v praxi se téměř nepoužívá, Java/C#/C/C++ nejsou ideální na začátek a začátky v PHP = skoro vždy katastrofa). Autor Pythonu má motto "Existuje 1 cesta k výsledku a to je ta nejvíce zřejmá". Pro startovací jazyk je to dobrá vlastnost. A ideálně nemíchej verze 2 a 3, které jsou rozdílné (což ale asi víš). PHP opravdu není dobrý jazyk k tomu se učit OOP, neboť je to tam dolepované a v návrhu základní knihovny se s tím nepočítá, je to velmi znát. V Pythonu se sice některé věci dělají hůře (např. GUI, protože v něm nelze napsat více-vláknovou aplikaci - vždy v 1 čase běží 1 a jen a pouze 1 vlákno, takže na dlouhé operace "na pozadí", které tu a tam updatnou GUI, přičemž uživatel chce s aplikací dále pracovat, jsou mimo realitu. Stejně jako ve většině ostatních skriptovacích jazycích.), ale jedná se o celkově lépe navržený jazyk než PHP. Pracovní pozice na Python také nějaké jsou a kdyby ne, můžeš se pak naučit C#/Javu/Perl/PHP - když budeš umět obecné základy a velmi dobře Python, učení druhého jazyka půjde mnohem rychleji.


Re:Chci se živit programováním - jak začít?
« Odpověď #20 kdy: 11. 05. 2013, 17:05:58 »
Mně celkem děsí "naučím se OOP, pak PHP a frameworky". Obojí je běh na dlouhou trať (několik let), nejde to ze dne na den.
na zednika nebo lekare taky nevystugujes za rok.
Děkuji za možnost editace příspěvku.

petr_berg

Re:Chci se živit programováním - jak začít?
« Odpověď #21 kdy: 11. 05. 2013, 18:05:30 »
eMKo, edx: Mezitím jsem si už našel i další informace a už chápu, že PHP mi bude nanic. Taky samozřejmě vím, že to není na pár dnů a plné pochopení přijde tak za pár let. Ze začátku budu rád, když budu umět alespoň něco a získám práci, kde to budu moct rozvíjet. Jak tak koukám na pracovní inzeráty, hodí se mi umět databáze, takže kombinace Python + SQL bude podle mě ideální.

Ještě jednou díky všem, pomohlo mi to v rozhodování.

Matej

Re:Chci se živit programováním - jak začít?
« Odpověď #22 kdy: 11. 05. 2013, 18:23:01 »
V Javě je mnohem složitější (i když ne že by to také nešlo) napsat program, který se v různých prostředích bude chovat různě.

Mohli by ste prosim Vas blizsie vysvetlit, ako ste to mysleli? Dakujem.

Například tento C kód:

Kód: [Vybrat]
#include <stdio.h>

int foo(int i, int j){ return i+j; }


int main()
{
    int x = 1, y = 2;

    int r = foo(x++,x+y);
    printf("%i\n", r);
}

V C není jasné, zda program vypíše hodnotu 4 anebo hodnotu 5. Záleží, v jakém pořadí se budou vyhodnocovat parametry funkce foo. Pravděpodobně to u tebe vypíše hodnotu 4, protože pro překladač je výhodné vyhodnotit parametry zprava doleva.

V Javě obdobný kód vypíše hodnotu 5, neboť Java jasně říká, že parametry se se vyhodnocují zleva doprava, což je zase přirozenější pro programátora. V Javě se můžete na hodně věcí spolehnout, nejsou tak často implementation-dependent jako u C.

Nedalo mi na tuto koninu neodpovedat. Samozrejme ze nie je jasne, ze co ta hovadina vypise, lebo podla standardu ani vysledok definovany nie je. Dokonca na tej istej platforme moze byt vysledok iny pri pouziti ineho prekladaca. Kto s normalnymi umyslami chce pouzivat kod o ktorom vie, ze jeho vysledok bude implementation-dependent a uz toboz podla standardu nedefinovany?? Odporucam precitat aspon http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points.

Jakub Galgonek

Re:Chci se živit programováním - jak začít?
« Odpověď #23 kdy: 11. 05. 2013, 18:36:23 »
Nedalo mi na tuto koninu neodpovedat.

Koninu? Můj příspěvek jen uváděl příklad něčeho, co je v C implementation dependend a v Javě není.

Matej

Re:Chci se živit programováním - jak začít?
« Odpověď #24 kdy: 11. 05. 2013, 18:49:30 »
Nedalo mi na tuto koninu neodpovedat.

Koninu? Můj příspěvek jen uváděl příklad něčeho, co je v C implementation dependend a v Javě není.
Ano, koninu. Porovnavat jazyky podla toho co je kde nedefinovane a kde nie je absurdne.

Re:Chci se živit programováním - jak začít?
« Odpověď #25 kdy: 11. 05. 2013, 18:54:48 »
Ano, koninu. Porovnavat jazyky podla toho co je kde nedefinovane a kde nie je absurdne.
Kuba psal snad jasně, že výhoda Javy je v tom, že je tam nedefinovaných věcí míň a tímpádem je menší šance, že začátečníka zmate. Co je na tom jako nepochopitelného?

Napsal jsi, že napsal koninu a pak zopakoval přesně to samý, co říkal. Gratulace...

eMko

  • ****
  • 456
    • Zobrazit profil
    • E-mail
Re:Chci se živit programováním - jak začít?
« Odpověď #26 kdy: 11. 05. 2013, 18:55:53 »
@Petr: No, pozor. Umět databáze není rovno umět SQL. Je to jak kdyby někdo napsal, že umět OOP = umět Python. Umět správně navrhnout tabulky (když se chceš učit SQL, pravděpodobně chceš přijít do styku s relačními databázemi; existují i jiné), pospojovat je, definovat nad nimi indexy a triggery a to všechno tak, aby vše bylo rychlé, snadno použitelné a blbuvzdorné, jsou léta praxe a odříkání, stejně jako OOP.

Pak do toho vstupuje ještě mezivrstva, ORM (Object-relational mapper), která slouží k usnadnění komunikace mezi programem, který pracuje s objekty, a databází, která na data pohlíží jako na relace. Samozřejmě ne vše lze mapovat 1:1 a tak ORMka nebývají triviální. Nicméně to, aby program přímo pracoval s databází, není moc časté; spíš se hledají důvody PROČ NEnasadit ORM než proč nasadit. (Komunitu nadšeneckých PHP vývojářů, kde častý důvod proč nepoužít framework nebo ORM zní "nerozumím tomu", moc nepočítej.) Očekávej, že ve firmě budou něco takového mít (ať už obecný již hotový framework nebo vlastnoručně napsané) a na databázi Tě sahat nenechají. Bordel v programu se opraví snadno, bordel v datech nikoliv.

Každopádně vidím, že jsi odhodlaný. Tak možná ještě jeden off-topic: Moc nepočítej s tím, že bys za měsíc až dva sehnal práci a pokud ano, tak hodně blbě placenou a takovou, která by Tě netěšila. Spíš se zatím uč doma a práci v oboru nech na později. Když tomu budeš systematicky věnovat každý den třeba hodinu-dvě a občas víc, za půl roku budeš úplně někde jinde. A co se týče zdrojů k učení - nešetři na knihách. Manning Publishing a O'Reilly Media jsou the best pro samostudium.

Někdo tu zmiňoval open-source projekty - ano, v životopise vypadají dobře a budoucí zaměstnavatel je ocení jako alespoň nějakou praxi. Ale proniknout do nich není lehké a většina z nich vyžaduje spíš práci na stávajícím kódu (opravy chyb, zpřehlednění ...) než nové vlastnosti. Bohužel typická otázka na přijímacím pohovoru bude typu "A který plugin pro Drupal je Váš?", takže cvič i to, jak se nenaštvat na personalistu :-) .

Good luck!

Kozzi

Re:Chci se živit programováním - jak začít?
« Odpověď #27 kdy: 11. 05. 2013, 19:23:14 »
V Pythonu se sice některé věci dělají hůře (např. GUI, protože v něm nelze napsat více-vláknovou aplikaci - vždy v 1 čase běží 1 a jen a pouze 1 vlákno, takže na dlouhé operace "na pozadí", které tu a tam updatnou GUI, přičemž uživatel chce s aplikací dále pracovat, jsou mimo realitu. Stejně jako ve většině ostatních skriptovacích jazycích.).

To neni zcela pravda, v pythonu se samozrejme da psat vicevlaknova aplikace s GUI (PyQt), ale jinak se zbytkem souhlasim.

Kozzi

Re:Chci se živit programováním - jak začít?
« Odpověď #28 kdy: 11. 05. 2013, 19:54:54 »
Ahoj, moje otázka je jasná: Chci z úplně jiného oboru přesedlat na programování a všechno se sám naučit a získat práci jako programátor. Lépe řečeno, ze začátku vezmu cokoliv, co se k tomu alespoň blíží a můžu se u toho dál vzdělávat.

Momentálně se intenzivně učím Python. Cca 6 let dozadu jsem ještě dělal (lépe řečeno - hrál si) v Pascalu/Delphi, umím taky HTML a základy CSS, PHP a MySQL. Úplný nováček teda nejsem. Myslím si, že dokážu samostatně tvořit algoritmy, jejich náročnost nedokážu posoudit. Naopak, zatím neumím třeba OOP. Taky nemám dostudovanou žádnou VŠ (zkusil jsem informatiku i humanitní směr, obojí jsem zrušil).

Můj cíl: Získat práci jako programátor, dál se vzdělávat (na VŠ zatím nemyslím, možná v budoucnu a ideálně v zahraničí). Nejvíc mě asi baví web, taky by nebylo špatné se orientovat na mobilní aplikace. Dlouhodobě bych chtěl získat nějakou práci, která by byla někde mezi programováním a "humanitní" oblastí (mám bohatou praxi se žurnalistikou).

Co mě teda zajímá:
1. Co a jaké jazyky se učit, na co se zaměřit? (krátkodobě / dlouhodobě) Pustit se pořádně do HTML/CSS/PHP nebo si spíš osvojit některý ze "základních" jazyků jako C / Java?

2. Je možné hned ze začátku, až nastuduji tutorialy a pochopím třeba Python, získat nějakou práci v oboru? Jasně, neočekávám žádnou vysokou pozici, klidně úplně něco nejnižšího, kde budu kódit a zároveň se učit?

Děkuji předem za jakékoliv rady.

Pokud chces sehnat rychle praci jako programator, tak bych PHP nezavrhoval. Je to sice jazyk bastlicu, ale da se v nem programovat i pomerne slusne objektove a ciste. Dalsi vyhodou je prave poptavka po PHP programatorech. Jinak clovek se zajmem se ucit a psat slusne (ackoliv zatim nema moc praxe a znalosti) ma vetsi sanci ziskat praci nez nejakej bastlic co tvrdi ze 10 let programuje v PHP a tvrdi ze OOP nikdy nepotreboval a ze kdyz neco resi tak si najde hotovy PHP kod (rozumej bastl) na netu.
Pokud uz se ale PHP ucit tak urcite doporucuji si zkusit psat v nejakem frameworku, treba jiz zminovane Nette.

No a behem toho ti nic nebrani se zlepsovat a do budoucna se stat opravdu dobrym programatorem a naucit  se i jinaci jazyky.


Jinak opravdu zajimavy jazyk na uceni programovani je jazyk D, ktery se zacina pomalu vyucovat i na nekterych americkych univerzitach. Ale zde bych neocekaval ze by ses snim nekde zatim uplatnil (ne proto ze by nebyl dobry ba naopak, ale proste jeste neni rozsireny). Existuje je i zdarma dostupna online knizka zamerena na vyuku jazyka D pro uplne zacatecniky, kteri nikdy neprogramovali (http://ddili.org/ders/d.en/index.html)

Co se tyce Pythonu, tak to je taky velmi vhodny jazyk pro zacatek, a co se tyce moznosti prace tak to sice neni tak slavne jako u PHP, ale casem by se mozna neco naslo, ale od python programatora se ocekva vice nez od PHP, takze najit si v nem praci muze trvat klidne i vice nez rok.

Tomáš Marný

Re:Chci se živit programováním - jak začít?
« Odpověď #29 kdy: 11. 05. 2013, 20:34:23 »
Mě třeba naprosto nejvíc dal dvouletej kurz Mikroprocesory na ČVUT - FJFI. Nicméně poud chceš jen doporučit konkrétní literaturu, tak to opravdu nevím.

Jestli myslíš tu samou tragédii na KJR, co já, tak v tom případě jsi o mikroprocesorech nevěděl před tím zhola nic a po této přednášce jsi poučený laik.