Názory ke článku Řešíme zdrojový kód - vztahy a pravidla
28. 11. 2011
Dobrý den.
Asi jsem vůbec nepochopil, co mi měl článek říci. Nevidím nic zjednodušující nebo zrychlujícího atd. na tom, když chci vypsat čísla od 0 do 9 a budu začínat místo od 0 na -3 a vždy při výpisu přičtu 3. Možná je to jen špatně zvolený příklad, ale vzhledem k tomu, že je na něm celý článek postaven, je to podle mě nesmysl.
Pokud to měl být pokus informovat o refaktoringu, tak spíše doporučuji: http://sourcemaking.com/refactoring
Dobry den,
chci se pripojit k predchozimu komentatoru.... Jiste, je zajimava tahle "aritmetika". Ale cely clanek jsem cekal na nejakou ukazku "k cemu je to v praxi", ale nedockal jsem se.
Takze bych chtel pozadat autora o vysvetleni :)
Diky
Zdravím autora i ostatní,
myslím si, pánové, že ne všechno se musí nutně užívat v praxi. Znám programátory, kteří si třeba tuhle "elektřinu" neuvědomují. Mechanicky pracují s něčím, co jim sice funguje, na povrch tomu rozumí a pokud by měli chvilku přemýšlet, vynaleznou si elektřinu taktéž a mají hotovo.
Oproti tomu začínající programátor si nemusí uvědomovat, že u cyklu může být volnější, než mu někdo ukázal, když ho to učil. Pro začínajícího programátora si myslím, že je tento článek přínosný.
Přijde mi to stejné, jako kdybych napsal pojednání o náboženství pro ateisty a papež za mnou přišel, že už existuje bible.
Autorovi tedy přeji, aby pomáhal i dál rozvíjet znalosti.
A všem přeji hezké pondělí,
Jimmy
#3 Mugsat
Ehm, ty člověče jednoduchý :P On nevynalezl elektřinu, on ji prostě popsal. Myslím si, že je to skvělý článek, který jasně definuje (logicky) nějaké postupy, které už ani nevím, jak zdůvodnit, ačkoliv je děláme denně. Tohoto si já rozhodně vážím.
28. 11. 2011
Otázka skôr znie či je dobrý nápad učiť začiatočníkov písať kód spôsobom aby sa menil na viacerých miestach.
#1 Míra
Ano, v článku šlo o to ukázat princip na tom nejjednodušším
možném příkladě. A souhlasím s Vámi, hloupém příkladě.
Přesto si myslím že to splnilo svůj účel.
Doufám že se později dostanu i k praktičtějším ukázkám použití.
Nebudu se zabývat přímo refaktoringem i když to k němu má blízko.
Pokud se někde v refaktoringu o tom o čem se pokouším psát už píše,
budu jenom rád když mě na to upozorníte.
#2 volftomas
Chápu, pokud by to byl jedinný článek - máte pravdu.
Chci o těch věcech udělat takový menší seriál.
Toto je úvodní článek, budu postupovat od jednodušších
věcí k složitějším. Od základů k použití.
Navíc je to o jednoduchých postupných úpravách kódu.
Nějaká ucelená změna sestává s vícero jednoduchých úprav,
které budu rozepisovat proto volím pro vysvětlení těch
věcí co nejkratší kód, po každé změně ten kód znovu
napíšu s tou změnou, aby bylo jasné co jsem udělal.
Kdybych to ukazoval na nějakém 50-ti řádkovém kódu,
článek by byl jen delší, nepřehlednější ale výsledek stejný.
found, hrach:
Děkuji Vám, lidí vašeho přístupu si velmi vážím.
Měl jsem velké obavy jak to vůbec bude přijato.
Dlouho jsem se rozmýšlel jestli o tom mám vůbec psát. (je to také můj první článek co píšu)
Kdyby to bylo alespoň trošku zajímavé nebo přínosné
pár lidem jako jste Vy, stojí to za to.
Nikomu nic nevnucuju, každý ať se sám rozhodne jestli
je to k něčemu dobré.
Díky.
#6 Peter Lisý
Netroufám si někoho něco učit.
Věřím že lidi se učí sami, nepřejímají jen pasivně to co je jim předloženo.
Lidi nejsou hloupí, umí si když chtějí udělat vlastní názor, nebo pohled na věc.
Já jenom říkám co funguje, co platí a proč to platí to ale není v rozporu s tím
že je platný i jiný pohled. Přemýšlejme o věcech i jinak než je zvykem.
28. 11. 2011
Ak som dobre pochopil, tak tu ide o nieco podobne, ako o zjednodusovanie rovnic, aby sme sa viacej vyznali vo vlastnom kode a to sa vzdy hodi. Ak je to tak, tak ti dakujem za skvely clanok a tesim sa na dalsie casti. ;-)
#11 Maros
Ano, chápeš to správně.
A nejen to, je za tím skryto ještě víc.
Pokusím se některé další věci ukázat v příštích článcích.
Já ti děkuju že sis dal tu práci a napsal svůj názor.
Přeju si více lidí kteří napíší svůj názor.
Ahoj. ;-)
29. 11. 2011
Už teď jsi rámcově vyčerpal možnosti syntaxe a sémantiky a po příštím díle nebudeš mít o čem psát. Předpokládám, že pak buď "seriál" skončí, nebo se bude ubírat úplně jiným směrem (a pak neměl začínat takto).
#13 zlz
Souhlasím, řekl bych, že další látky už moc nebude. Na druhou stranu si myslím, že začátečníci alespoň něco využijí (že x++ odpovídá (x+3)++ se určitě každému hodí;)).
Aha, asi jsem to opravdu vzal za špatný konec,
když si lidi myslí že jde jen o nějaké pochybné triky
typu (x+3)++ odpovídá x++
Ale nemyslím si že je to špatný postup,
od konkrétního k obecnému.
Bude to takový menší seriál ale příštím dílem to ještě nekončí.
Budu se ubírat směrem který jsem stanovil v Úvodu článku.
Po tom menším seriálu ve kterém budou uvedeny ty základy na primitivních příkladech
bych se chtěl dále věnovat praktickým ukázkám různých problémů, kódů a jejich řešení,
tam se budou používat ty základy a budu se na ně odvolávat.
Bude, bude, bude, já vím :-)
Už aby to bylo žejo :-)
29. 11. 2011
Zatím je článek jen úvod, nikdo nevíme, jaké úpravy bude člověk dělat příště.
Ale to takových transformacích musí člověk přemýšlet. Např. při kreslení do okna je počátek vlevo nahoře, při kreslení grafu matematické funkce máte počátek vlevo dole. Očíslování dlaždic ve hře jde také v jiném směru. někdy stačí i podobný posun indexu, aby se věc prosvětlila. Ale myslím, že je lepší to napsat rovnou než zamlženě a pak dělat refaktoring.
Jsem zvědavý, kam to povede. Zatím to vypadá jako samoúčelné hraní...
#16 uf
Máš postřeh, na to o čem píšeš se to zrovna perfektně hodí.
Ano, nejlepší by bylo napsat to rovnou, ale stává se že až
později v souvislosti s dalšími věcmi si člověk uvědomí,
že by bylo lepší to udělat trochu jinak.
Buď to tedy celé přepíše, a nebo provede jen nezbytné změny aby
došel tam kam potřebuje. Záleží kdo co preferuje.
Ono je to podobné jako v matematice.
Máš nějaké napsané slovní zadání, nebo ho máš v hlavě.
Na základě tohoto zadání sestavíš rovnice které pak řešíš.
Jistě by bylo lepší kdyby člověk byl z toho zadání rovnou schopen
napsat řešení, ale to jde jen v jednoduchých případech.
Analogicky lze takto postupovat i v případě psaní programu,
nevidím na tom nic špatného nebo samoúčelného.
Záleží jak k tomu kdo přistupuje.
30. 11. 2011
#17 Pudni tvor
ahoj. Tak jako neřešíš příklad rovnou, nemusíš nabouchat kód rovnou do programu. Stejně si to nejdřív nakreslíš, rozmyslíš, s čím se ti bude líp pracovat, upravíš do nějaké rozumné formy a pak to naboucháš.
Může se to ale použít i při optimalizacích. Např. Brackeen v Programování her v Javě postupně vytváří 3D renderer. Pozn.: Když vidíš výsledek, užasneš, že je to takové jednoduché a průhledné. Pak dělá kvůli rychlosti optimalizaci na zrychlení celočíselné aritmetiky.
Já např. jsem ze staré školy, takže pro mě byl nezvyk v C a Javě indexování od nuly do indexu, který už nechci.
30. 11. 2011
Řekl bych, že autor rozhodně nevyčerpal možnosti tématu, může třeba podrobněji popisovat gramatiky programovacích jazyků nebo jít cestou vyčíslitelnosti, což je jednoduše řešeno matematické popisování programů. Z tohoto pohledu matematika a programování splývá.
#18 uf
Ahoj.
Jasně, souhlas.
To o čem píšu já také není "svatý grál" na všechno.
(snad si někdo nemyslí, že to samo vyřeší všechny problémy)
Nejvýkonnější je asi člověk který inteligentně kombinuje různé přístupy.
Pokud si to člověk nejdřív pěkně nakreslí, rozmyslí o to lehčí má pak tu implementaci.
Sám si často složitější věci kreslím, jsem taky vizuální typ.
Díky za info, na toho Brackeena se někdy podívám, mám rád takové věci a grafiku.
Krásné tutoriály o Raytracingu, 3d a grafice vůbec,
se nachází na http://www.scratchapixel.com
Zajímavé, perfektně a názorně od základů vysvětlené věci tam mají.
Teď ty stránky a články nějak předělali, dlouho byly stránky prázdné
s informací že se na tom pracuje.
Jo, všechno má svoje výhody.
Já to beru podobně tak jako interval v matematice
buď můžu zapsat for cyklus třeba <0, 9> - uzavřený z obou stran
a nebo <0, 10) - otevřený z prava
Cčkový jazyk mi umožňuje přímo zapsat obojí, někdy se mi hodí to, jindy ono.
Je to vzájemně snadno převoditelné
#19 Kolemjdoucí
Rozhodně, pořád mám o čem psát, díky za tipy.
Je to rozsáhlejší téma než si někdo může myslet. :-)
Z mého pohledu matematika a programování v podstatě jedno jsou.
8. 1. 2012
Tento článek ma nulovou informační hodnotu, akorát obfuskuje kód (znepříjemňuje). Zkuste psát odborné články, které někomu k něčemu jsou ... a neučit lidi paskvilní zápis kódu tak, aby se v něm nikdo jiný nevyznal.
8. 1. 2012
Čistá matematika je abstraktní model, v reálném světě fungují omezení.
Výpočty se nedělají ideálně, ale s omezenými rozsahy hodnot.
x - (minimální číslo v rozsahu int) < 10
V článku nejde o obfuskaci, nicméně není to tak špatný
nápad, to co je popsané v článku by šlo zautomatizovat a (zne)užít
i pro obfuskaci kódu, proč ne (díky za nápad).
Zrovna tak je ale možný obrácený postup obfuskovaný kód deobfuskovat.
Ať to či ono, jde spíš o ty pravidla, kterými je možné to udělat.
Na jednoduchém kódu jsem ukázal jak ho
užitím pár pravidel zkomplikovat při zachování stejné funkčnosti
a pokud jste četl pozorně psal jsem že to jde provést stejně tak i obráceně.
Ať už někdo bude chtít obfuskovat, deobfuskovat, refaktorovat nebo optimalizovat
může (ale nemusí) využít mechanická pravidla pro úpravu kódu z nichž některé jsem se snažil
v článku ukázat a kterými to lze postupnými kroky provést.
Další zajímavé využití by bylo udělat nějaký automatický nástroj
který by zparsoval kód nějakého algoritmu, vytvořil
syntaktický strom a užitím různých heuristik pak prováděl
podobné úpravy, po každé takové úpravě by mohl být upravený
program ohodnocen nějakou účelovou funkcí (v závislosti na tom co je cílem)
a podle toho by mohly pokračovat úpravy určitým směrem, nebo zkusit něco
jiného, byla by možná určitá zjednodušená varianta genetického programování,
jakési automatické doladění fungujícího kódu podle kritérií.
Představivosti a schopnostem určité informace využít se meze nekladou.
Ano, pro ty co nemají žádnou představivost může mít článek nulovou informační hodnotu - budiž.
#23 Miloslav Ponkrác
Ano, dobrá poznámka, jednoznačně souhlas.
Se zápisem v programovacím jazyce
můžeme zacházet jednak jako s konkrétním zápisem
určitého algoritmu na počítači,
kde máme různá omezení co se týče rozsahu číselných
typů, rychlosti, paměti.
Můžeme s ním ale také zacházet analogicky jako s matematikou.
Jako s určitým abstraktním modelem určitého
postupu či procesu a tady už nezáleží na omezeních implementace.
Programovací jazyk je také přesný a zároveň flexibilní jazyk jako matematika.
Ty úpravy které jsem ukazoval jsou úpravy na tom abstraktním
modelu. V okamžiku kdy ten program budu chtít přeložit
a spustit se mi samozřejmě všechno musí vejít do rozsahu
použitých číselných typů, pokud nevejde musím použít číselné typy
s větším rozsahem, nebo provést ještě nějakou úpravu aby se mi vešli.
viz druhá poznámka v článku.
Děkuji za ten termín abstraktní model, nedovedl jsem to
to v článku lépe vysvětlit, a tak to možná bylo nesrozumitelné.
10. 1. 2012
Půdní tvor: No hlavně na reálných číslech neplatí všechny Vaše závěry. Záměrně jsem uvedl tu nerovnost.
Úpravy v abstraktní matematice prostě nelze vždy převést do reálného světa. Přetečení rozsahu je v pohodě pro sčítání a odčítání, ale v nerovnosti se Vám všechno zboří jako domeček z karet.
Ideální matematika neexistuje. Není jí možné žádným způsobem realizovat.
Tím nekritizuji článek, ba právě naopak. Téma je excelentní a článek je vynikající. Víc takových témat.
Ale ideální celá čísla, tedy čísla s neomezeným rozsah až do nekonečen na obě strany prostě počítač nenabízí. A operace na pseudocelých číslech, které počítač má mají trochu jiné vlastnosti než to co se učí v běžných školách o číslech.
Berte to jen jako podnět, nikoli jako kritiku či znevážení Vašeho článku, tak to není míněno.
Miloslav Ponkrác:
Výtečně, rozhodně Vaši reakci neberu jako znevážení a
pokud bych to měl brát jako kritiku, pak je to kritika konstruktivní.
Konkrétně nad obsahem vašich přízpěvků jsem se musel nejvíc zamyslet a vážím si toho.
Popravdě byl jsem překvapen že se dosud neobjevil nikdo , kdo by poukázal na věci, na které jste poukázal Vy.
Zvlášť když jsem napsal některá tvrzení, možná až příliš zobecňující, bylo by snadné je napadnout.
Vysvětluju si to tak, buď je to všem jasný a nebo že lidé se nad tím moc nesnaží zamýšlet do hloubky,
buď to nekriticky přijímají, nebo naopak šmahem odmítají.
K samotnému obsahu příspěvku:
Ano u reálných čísel, pokud tím myslíte reálná čísla jako obor hodnor R v matematice.
Tak nevím přesně jak je uchopit, nemám to moc promyšlené. Tvrzení v článku se
vztahují k celým číslům, zatím se budu držet celých čísel.
Co se týče nemožnosti na počítači reprezentovat celá čísla od mínus nekonečna do nekonečna.
Nemyslím si že by to bylo omezující pro ty úpravy které můžeme s určitým abstraktním
zápisem nějakého problému dělat. Ten zápis vyjma definice proměnné (kterou děláme explicitně my) neříká nic
o tom s jak velkými čísly můžeme zacházet. Je to popis určitých relativních vztahů,
který má svoji syntaxi a sémantiku a můžeme s ním zacházet, upravovat ho dle pravidel jazyka
bez ohledu na to jestli existuje v reálném světě stroj, který je schopen to co zápis říká vykonat,
respektive v určitém okamžiku držet v paměti hodnotu konkrétního čísla.
Jinými slovy máme-li číslo n můžeme vždycky k němu přičíst nebo odečíst jedničku
ať už je to číslo jakkoli velké i kdyby bylo tak velké že žádný současný ani budoucí počítač nebude
schopen jeho zápis vyčíslit. Můžeme s tím zacházet symbolicky, máme čísla n a n+1 a můžeme napsat
že nerovnost n < n+1 je true bez ohledu na to jak velké je n a můžeme s tím pracovat např. odečtením 1
dostaneme n - 1 < n při těchto úpravách symbolického zápisu nedochází k žádnému přetečení.
Při těch úpravách které dělám není potřeba existence minimálního číslo v rozsahu int, vždycky
lze symbolicky napsat celé číslo o jedničku nižší. A v praktickych případech reálných problému
ho lze skoro vždycky vyčíslit, nestačí-li pro nějaký praktický problém 32-bitové číslo,
můžeme použít 64-bitové, nestačí-li ani to mohli bychom napsat rutiny pro práci s
n-bitovými čísly seč nám poměť počítače stačí, ale to je extrémní případ, nestalo se mi že bych to
v běžném programování potřeboval.
Moc nerozumím tvrzení "Ideální matematika neexistuje. Není jí možné žádným způsobem realizovat."
Připadá mi prázdné, bezobsažné. První věta říká že něco neexistuje a druhá říká že to
nelze realizovat (protože to neexistuje). Zní to jako tautologie "to co neexistuje, neexistuje"
Možná to ale myslíte jinak. Já matematiku chápu jako abstraktní jazyk pro popis pravidelností
vyskytujících se ve skutečném světě, nejsem většinou moc zastáncem matematického platonismu že ty matematické
objekty nějak skutečně existují v reálném světě. Nicméně to nám nebrání popisovat je úsporným,
přesným jazykem (provádět kompresi těch pravidelností) a dojít k nějakým prakticky použitelným výsledkům.
Nevidím zase takový rozdíl mezi celými čísly na počítači a celými čísly v matematice jak se učí na školách.
Je to víceméně hra se slovy a definicemi.
Lze to brát i tak že to počítačové číslo (jeho rozsah) je jakési konečné okno v nekonečném rozsahu
celých čísel. V rámci toho okna platí vše co platí pro čísla vně okna.
To okno ale nemusí být nutně pevné, lze ho libovolně průběžně přesouvat, zvětšovat, zmenšovat v
celém rozsahu "skutečných" celých čísel jak je zrovna třeba. To okno se může přizpůsobovat automaticky
aby vždycky zachytilo výsledek nějaké operace tak aby ležel uvnitř okna.
Určitá operace např. přičtení nebo odečtení jedničky se dá definovat tak, že také zvětší to okno je-li třeba.
Samozřejmě na skutečném počítači jsou vždy limity jak velké to okno může být.
Když s tím ale zacházíme jako s abstrakcí (v průběhu těch úprav co jsem ukazoval),
můžeme jakékoli limity překonat. Jinými slovy nemůžeme sice pojmout celé nekonečno (aktuální) jak tvrdíte Vy,
to je pravda, ale to nevadí protože s tím můžeme pracovat jako s potenciálním nekonečnem.
To že implicitní na počítačích je, že pro určité mezní číslo se to okno nezvětšuje
a dojde k přetečení je pouze praktická volba v důsledku určitých fyzikálních omezení konstrukce počítačů.
Lze si alespoň představit že by to tak nebylo. Ta modulární aritmetika má jistě své nesporné výhody a aplikace,
ale neznamená to že se na vše musíme dívat jen skrz ni, je to pouze jeden z mnoha světů matematiky.
Děkuji za skvělou reakci a hodnocení článku, udělal jste mi radost. :-)
Mimochodem, připadá mi jako zvláštní souhra náhod, že zrovna
předvčerejškem jsem narazil na starší článek z roku 2005,
který s tím co chci předvádět zdá-se souvisí:
http://scienceworld.cz/…telnost-1776
V článku je uvedeno jméno Yuri Gurevich který přišel s rozšířenou
definicí algoritmu, která se mi zdá velmi podobná mé vlastní představě.
Nyní ten pán pracuje v Microsoftu.
Má osobní stránku: http://research.microsoft.com/…le/gurevich/
Wikipedie: http://en.wikipedia.org/…uri_Gurevich
Vymyslel koncept Abstract State Machines
Z mého laického pohledu se to prozatím zdá odborně zpracované to
jak já sám přibližně chápu zápis určitého algoritmu v programovacím jazyce.
Budu to muset podrobněji prostudovat. :-)
17. 1. 2012
#7 Pudni tvor
Nemyslím si, že to byl hloupý příklad. Naopak, byl tak akorát, aby srozumitelně ilustroval podstatu toho článku. Tím, že tuto podstatu někteří "programátoři" nepochopili, protože "oni přece taky umí naprogramovat cyklus," se nenech odradit.
Sice si nepřišel na nic zcela nového, ale dnes je téměř nemožné přijít s něčím zcela novým. Formální prací s programy (obecně se slovy nějakého jazyka) se informatika/matematika již zabývá poměrně dlouho. Dosud se však nepodařilo dospět do stádia, kdy by bylo možné efektivně pracovat s libovolnými (velkými, složitými nebo paralelními) programy, takže příležitost rozhodně máš. Používá se to jen na rozsahem malé věci (popř. na abstrakce z teěch složitějších), které jsou opravdu důležité a ta pracnost a čas stojí za to.
Jestli tě to zajímá, tak se zaměř na formální metody, formální jazyky, automaty (od konečných až po Turingův stroj), CCS, CSP atd. Já se něčím podobným také zabývám, ale z hlediska abstraktní algebry. A na tvůj další článek bych byl docela zvědav (je fajn vidět, že se někteří lidé zabývají i nečím hlubším než jak "nabouchat" webovou stránku, jakou mají verzi Androidu apod.)
Přeju hodně úspěchů.
19. 3. 2012
Dobrý den.
Mám osobní problém, na němž jsem zůstal viset. Nemám bohužel patřičné vzdělání,
znalost základní matematiky zůstala kdesi na úrovní 1+1.
Přesto jsem se pokusil z čistého zájmu o věc vytvořit "aktivní" tabulku, která by fungovala,
jako v MS Office Excell ve smyslu vzorce =suma() pro převod jednotek. Bohužel, sám na
řešení asi nikdy nepřijdu,přestože jsem si vědom jednoduchosti tohoto řešení. Jenže,
nevím jak na to a kde začít a s čím. Vyzkoušel jsem spoustu postupů. Ve zmíněném Excellu
mi vše funguje naprosto skvěle, ovšem horší to je s napsáním zdrojového kódu, který by fungoval,
jak si přeju.
Je mi naprosto jasné, že se asi zřejmě snažím o směšně jednoduchou záležitost - pro Vás.
Peru se s tím už víc jak měsíc a pořád nemám "splněno".
Podstatou mojí myšlenky je:
do zápisové buňky vložit libovolné kladné číslo (i desetinné),
přičem se ve vedlejší buňce zobrazí požadovaný výsledek.
Příklad:
Chci převést anglické palce do metrické soustavy. Vím, že 1palec se = 2,54 cm, což je tedy pro mne
vlastně jakási "konstanta" s níž musím počítat. Nevím ovšem zda aplikovat tuto součást v HTML,
CSS, nebo JScriptu v PHP.
Možná tu plácám nesmysly a pletu páté přes deváté. Ale vězte, vím co chci, jen si s tím nevím rady.
Snad jsem se tady moc neztrapnil. Děkuji za případnou radu.
Přeji Vám prříjemný den. Jan
#30 Jan
Rozumím tomu tak že píšete nějaký web v HTML. Funkčnost kterou chcete určitě jde jednoduše udělat v JavaScriptu. S tím vám já ale bohužel neporadím, zkuste se zeptat na fóru:
21. 3. 2012
#31 Pudni tvor
Ano, je to tak. Tvořím funkční WEB a chci do něj včlenit aktivní tabulky. Každopádně děkuji za Vaši odpověď a odkaz. Jan