Uvědomuji si, že jsem se zabývám programováním už 28 let. Ano, bylo to ZX Spectrum, pokud vás to zajímá. Ve 14ti letech jsem si začal hrát s Basicem, pak jsem rychle přešel k assembleru, Pascalu, následovalo Céčko, …, až jsem nakonec na dlouhou dobu zakotvil u Javy, která mě živí.
Poslední dobou se nemůžu zbavit pocitu, že v některých oblastech stále používáme způsoby a koncepty programování, které nejsou hodny možností dnešních technologií. Dovolím si uvést pár příkladů, které mě nejvíc dráždí.
Při tvorbě softwaru si občas připadám hloupě, protože většinu času programuju některou z těchto oblastí: ukládání dat, načítání dat, přenášení dat nebo konverze dat. Jsem v tu chvíli degradován na jakéhosi vidláka, který nepřehazuje hnůj, ale nuly a jedničky. Sedím pak u notebooku a v podstatě se nudím, protože se musím soustředit na to, abych neudělal syntaktickou chybu v SQL selectu a abych dobře poskládal data do řady.
Proč není možné mít podporu persistence přímo v programovacím jazyku? Na to se ptám už minimálně 5 let. Pokud si tady začnu vymýšlet virtuální Javu mých snů, tak bych chtěl mít možnost napsat tohle:
persistent Company mojeFirma;
if (mojeFirma == null) mojeFirma = new Company(“Firma s.r.o.”);
Dostal bych proměnnou mojeFirma a v ní bych měl uložený objekt Company tak dlouho, jak bych jen potřeboval. Nechci také mazat data z žádné databáze. V okamžiku, kdy bych udělal tohle:
mojeFirma = null;
tak by objekt s textem “Firma s.r.o.” zmizel, protože by na něj nebyl žádný odkaz. Fungoval by prostě jakýsi garbage collector, ale ne jen pro RAM paměť, ale prostě pro paměť jako takovou. Čímž se vlastně dostávám k problému, který se týká neustálého rozlišování volatilní rychlé paměti a permanentní pomalé paměti. Já fakt nechci neustále přehazovat data mezi dvěma typy pamětí.
Dle mého názoru musí SQL databáze (v podobě, v jaké je známe dnes) vychcípat. Když se nad tím zamyslíte, tak v oblasti ukládání dat děláme pořád to, co jsme v RAM paměti přestali dělat před 15ti lety. Když chceme uložit objekt Address
do databáze, tak si napřed musíme nachystat skrukturu ( create table
), pak to tam vložit ( insert
) a až to nepotřebujeme, tak musíme myslet na odstranění záznamu ( delete
). Já už hodně dlouho nemusím řešit uvolňování RAM paměti, tak proč to musím řešit jinde?
Práce s SQL databází mi připomíná low-level práci s přidělováním paměti. Zjistíte si, jak je velká struktura, pak si přidělíte pole bytů, nakopírujete tam data a po skončení pole uvolníte.
Dál tuhle kapitolku asi nemá cenu rozvádět. Jako programátor chci pouze přemýšlet o tom, který objekt si chci nechat na delší dobu a který potřebuju jen dočasně. Nechci přemýšlet o volatilní a ne-volatilní paměti.
Komunikace po síti je networ, se kterým nechci neustále bojovat. Je to vlastně podobný problém. Proč bych měl řešit, jestli se nějaký kus dat nachází na lokálním heapu a nebo někde jinde na jiném stroji. Co, kdyby šlo třeba napsat:
mojeFirma = new Company();
a jako programátoři byste nemuseli řešit, kde jsou data fyzicky uložena. Všichni dobře víme, že proměnná je ve skutečnosti ukazatel do nějaké paměti. Proč nemůže existovat univerzální ukazatel (pointer), který by byl schopen adresovat data v RAMce, na disku nebo někde v oblacích.
Ano, uvědomuji si, že odstínění programátora od konceptu disku nebo sítě přináší nové výzvy, ale domnívám se, že i ty jsou uspokojivě řešitelné. Jako programátoři jsme zvyklí, že řádek:
speed = maxSpeed / 2;
nemůže vyhodit žádnou výjimku. Pokud ale bude možné, že maxSpeed je kus dat v cloudu nebo na nějakém jiném zařízení, tak může klidně nastat IO error. Stejně tak je trochu problém, že nemůžeme udělat žádný předpoklad o tom, jak rychle tento příkaz proběhne a tím pádem se dostávám k dalšímu bodu.
Jako programátoři jsme zvyklí neustále pracovat sekvenčně a synchronně. Jelikož jsem už ve 14ti letech psal na ZX Spectru v assembleru, tak si dokážu představit, co procesor dělá, když se napíše:
speed = maxSpeed/2;
CPU vezme integer z RAMky, kam ukazuje pointer maxSpeed a uloží jej do registru, tam udělá shift, čím jej podělí dvěma a obsah registru přesune do RAMky na místo, kde ukazuje speed. Celá operace se provede za 35 nanomžiků. Pokud po tomto řádku dojde ke změně proměnné maxSpeed
, na speed
už to nemá žádný vliv.
Mozek takhle nefunguje, protože příroda možná sama vyhodnotila, že to je stupidní způsob. Pokud bychom měli v mozku dva neurony s názvem maxSpeed
a speed
, určitě by se neuron speed
neptal neustále toho předchozího, jestli se nezměnil stav. Všechna data jsou tlačena dopředu, nikoliv tahána zezadu. Jakmile je neuron maxSpeed
excitován, okamžitě informuje následující neuron, který provede dělení dvěma a hned pošle neuronu speed
nový výsledek. Mozek prostě pracuje jen když musí.
Když šlápneme bosou nohou na kus skla, tak noha prostřednictvím nervů vyšle do mozku “event” a mozek ihned reaguje. Kdyby byl Bůh programátor, tak by mozek možná fungoval takhle:
do { Connection con = Noha.connect(); PainStatus ps = con.readPainStatus(); if (ps.isPain()) { sayAu(); } Thread.sleep(100); } while (true);
To by Bůh pěkně podělal, protože se tam nezavírá con
. Když se vrátím zpátky k počítačům a nechám mozek stranou, tak se teď pokusím vysvětlit, co je dle mého názoru správný způsob. Řádek
speed = maxSpeed/2;
by neměl být vnímán jako jednorázová operace, ale spíše jako vytvoření malinké asynchronní sítě, která spojuje uzel maxSpeed
s uzlem dělení a dále na uzel speed
. Uzel maxSpeed
může být klidně persistentní hodnota na jiném stroji v cloudu a když jiný klient zapíše do maxSpeed
nové číslo, chci aby se mi automaticky změnilo to, co je v uzlu speed
. Když udělám webovou stránku, ve které budu mít napsáno tohle:
<div>Vaše rychlost je <b>{{speed}}</b> km/h</div>
tak se mi s přiměřenou prodlevou projeví změna v browseru. Jenom se musím postarat, aby browser věděl, co je speed
.
Programy, které teď běžně píšeme, vlastně dělají opakovaně tuto posloupnost:
Takhle se dneska běžně programuje a inteligentnost celého řešení bych přiblížil následující metaforou:
Naštěstí v oblasti, o které mluvím v tomto budě se už začíná něco dít. Doufám, že funkcionální programování a tzv. reaktivní programování nás posune správným směrem.
Snad se dočkám toho, že přestaneme přešmodrchávat data mezi diskem, pamětí a sítí. Doufám, že za deset let už nebudu muset trávit čas tím, že budu řešit, jak z SQL dat udělat objekty, ty pak předělat na JSON, ten pak přesunout přes HTTP(s) a pak z toho zase vyrobit jiné objekty a z těch zase udělat DOM, atd.
Smrt SQL. Smrt HTTP. :-)
Programováním se zabývám trochu kratší dobu, ale zřejmě jste se nezabýval programováním dostatečně.
1) Persistence přímo v programovacím jazyku funguje. Račte se pěkně prosím seznámit s programovacím jazykem Smalltalk, který pracuje podobně jak o tom sníte z hlediska persistence.
2) Networking přes (dokonce paměťové pointery) už je také řadu desetiletí vyřešený, a to technologiemi zvanými ORB (Object Request Broker). Například známá je CORBA, byť starší provenience. Ale stejně funguje třeba Windowsovské DCOM.
Nutno podotknout, že mikrokernelové operační systémy fungují na několika počítačích najednou, třeba na celé síti už z podstaty, a komunikace mezi počítači je naprosto přirozená. Kromě zastaralých konceptů, jako je monolitický Linux či trochu lépe navržené Windows, jde budoucnost spíše směrem mikrokernelu. Například QNX, wxWorks, Plan9, atd.
3) Ohledně tahání dat versus tlačení. Myslím, že za 28 let byste mohl pochopit naprostý základ, a to že existují imperativní programovací jazyky, kde to musíte tlačit, a pak procedurální programovací jazyky, kde se data sama táhnou. Počet imperativních a počet procedurálních programovacích jazyků je tak půl na půl.
Dále už jsem nečetl. Spíše mi přijde, že autor zná jen Javu a z toho usuzuje.
Chybí základy programátorských znalostí
Máte úplnou pravdu, zcela souhlasím. Ono, nechť to autor přijme jako konstruktivní, byť je to od člověka, který "tahal kačera v době, kdy on už programoval (pro) MacOS", ale:
1) Java vznikla v roce 1998, takže má své nedostatky, které se bohužel ukázaly až časem a s nimi v rozjetém vlaku toho už mnoho nenaděláte, když jsou hotové aplikace. Viz například JAR balíčky a jejich verzování. Hotová lahůdka udržet to v nějakém souladu a přehledu. Program složený z komponent třetích stran, kde jedna využívá verzi 1, druhá verzi 2, třetí verzi 1.1., atp.. Zkrátka Windows má DLL hell, Java zase JAR hell, bohužel, nemůžu si pomoci. Ostatně i proto v Javě programuji jen velmi nerad a jen, když se jí nemůžu vyhnout.
2) Persistence opravdu funguje v řadě jazyků, možná to chce jinou technologii, která toto podporuje. I když, řekl bych, že i Java už tohle podporuje.
3) Pokud jde o SQL databáze a manipulace s SQL daty, zajisté jste slyšel o (dynamicky generovaných) objektových datových rámcích, například nHibernate. Má sice svou značnou režii, ale nebudete se muset tolik dřít s funkcemi, objekty mapujícími DB tabulky, atd. Vše byste "tahal" a tvořil v diagramu a framework by se postaral o tvorbu na pozadí. Režie u NHibernate je (aspoň svého času byla) sice značně velká, ale používat se dá, když to ušetří práci.
Vy, programátoři v Javě, jste na vyšší paměťové nároky svých aplikací dozajista zvyklí. Kromě Data Manageru od Oracle jsem totiž neviděl žádnou, z hlediska práce se zdroji, efektivně napsanou aplikaci. Sotva se nahraje do paměti, hned máte minimálně 128 MB zabraných. Co to je? U .NETu je to obvykle u srovnatelné aplikace tak 1/4 tohoto, ale dá se s tím fungovat.
Pokud jde o SQL databáze, nečekejte, že se budou zásadně měnit. Jsou tu už dobrých 30 let nejméně. Rozšíření? Možná. Zásadní změny? Nepravděpodobné. Jestli se Vám nelíbí SQL databáze, zkuste noSQL databáze (http://cs.wikipedia.org/wiki/NoSQL), ale i tam, obávám se, budete aspoň někde potřebovat SQL. A ve výhyn SQL databází nedoufejte, nanejvýš ustoupí do menšiny oproti noSQL, ale ani to se možná nestane. Poměr obou typů bude podle mě někde 60 : 40 ve prospěch standardního SQL.
Pokud jde o tvorbu struktur, tak to je nezbytnost. Jak si to vlastně představujete? Že ta DB bude sama detekovat, jestli to a to mohu převést na číslo nebo datum? Jak pozná ze řetězce binární obsah? Jak pozná rozsahy datového typu? To je bude měnit pokaždé, co tam něco dáte? A když budete dávat různá data různých struktur, tak se bude rozšiřovat počet polí a dodávat NULL tomu, co zrovna v těch datech není nastaveno? Nereálné. Používejte tedy v takovém případě serializaci. MS.NET ji umí a Java taky. Pokud jde o SQL databázi, můžete použít i nějakou embedded - SQL Lite a podobně. Tam si tvořte, co jen chcete a protože je to souborové, dá se to i pohodlně smazat diskovou operací, až budou uzavřené handlery, vynulované pointery a uzavřená spojení.
4) Networking: tady není pomoci, Java je prostě Java a má řadu svých specifických tříd (.NET to má stejné) dědících z jedné nadřízené. Možná zkuste zvážit, zdali by nebyla použitelná ta nadřízená s pomocí přetypování. Nevím, jak postupujete, těžko se pak radí. Pokud Vám vadí testy na vyjímky, těm se také nevyhnete (nejen v Javě, ale kdekoli), má li program správně fungovat. Nevím, zkusil jste si třeba vytvořit třídu s proměnnými a specifickými get metodami, kde byste si podobné věci (sken po zařízeních, pamětech, heapu, atp.)? Napsal byste to jednou a revyužil v budoucnu v jiných projektech a měl byste později půl práce.
5) Tahání dat místo tlačení:
Pokud jde o dotazování, už nevím jak to bylo v Javě, ale v .NETu máte možnost "připojovat" funkce objektů na delegáta se shodným funkčním předpisem a poté, když objekt něco provede, aktivuje delegáta a tím i všechny na něj napojené funkce z cizích objektů. O vzoru Observer jste zajisté už musel slyšet (dávno dříve, než my jsme začali tahat toho kačera :-)). Neříkejte, že v Javě nejde provést obdobná věc.
6) To, že se v Javě dělají některé věci viditelně hůř než jinde, jak jste sám částečně naznačil, s tím se nedá nic dělat. Je to prostě jazyk, který byl ve svých začátcích na tu dobu převratný a často tehdy "dláždil" cestu jiným (například: MS.NET) a tím samozřejmě odkrýval nedokonalosti, slepé cesty, těžkopádná řešení, atp. To tak zkrátka je a každý jazyk/technologie se jednou přežije a musí nastoupit nová, která ty věci bude zvládat lépe a pružněji. To je vývoj.
6) Existuje řada (dynamicky typovaných a třeba i skriptovacích) jazyků, například Python, který Vám vezme řadu "sv*nstev" a "nezjančí" se z toho, jako Java, která zkrátka všude potřebuje try ... catch, aby ustála případné problematické stavy. Případně můžete použít všeobecný Exception a tu vyjímku "zahladit" prázdným obslužným blokem a pokračovat dál. Sprosté a dělat se to nemá, ale program bude fungovat i dál.
7) Jazyk nemusí být virtuální, vytvořte si svůj a udělejte všechny konstrukty tak, jak Vám vyhovují. Práce plno, běh na dlouhou trať a s každou verzí každého systému aby se to pomalu předělalo, ale pak budete spokojen. Pokud se do toho rozhodnete jít, klobouk dolů.
8) Jak byste nahradil HTTP, SQL, JSON a DOM? Jsou nějaké náhrady? Kromě XML nebo XSLT specifikace a XML z ní?
1. Co autora nutí pořád psát to samé SQL? Pokud jde jen o persistenci, může použít jednu z mnoha knihoven, napsat si vlastní dle svých představ, použít jiný prostředek komunikace než SQL atd.
2. Proč by mělo SQL brzo vychcípat? Na některé operace (např. komplikované dotazy nad množstvím dat, která nemohu přenášet po síti) je celkem dobré.
3. Univerzální ukazatel do sítě: URL tu už je hodně let, krom jiných metod. Má-li se síťový objekt chovat jako lokální, proč jej nepřipojit nějakým síťovým filesystémem? A na některé typy síťových objektů (SSH tunely apod.) to stejně nedává smysl.
4. Tahání: co brání autorovi psát kód tak, aby data tlačil, a při updatu položky vždy provedl i update těch závislých? Dělají to třeba tabulkové kalkulátory.
It is such a cool thing. Does anybody know where to buy it? I know the cool place where you can buy custom essays.
Luar biasa sekali informasinya,,,Ciri Atau Gejala Penyakit Meningitis Radang Selaput Otak
Di tunggu informasi bagus lainny ya gan Cara Mengatasi Nyeri Haid Dan Keputihan Dengan Cepat
Témata, do kterých si troufám kecat, jsou CRM (protože jedno dělám), zpravodajské agregátory (protože to dělám taky), řízení firmy (protože mám strach to nedělat – musím), jídlo (protože jej mám rád a občas o něm píšu), Apple (protože jsem programoval Mac ještě v době, kdy jste tahali kačera), Java (protože to je můj šálek kávy), webové technologie (protože bez nich by to teda nešlo), grafika a kreslení (protože bych na to chtěl mít víc času).