Včera v Microsoftu proběhla diskuze na téma „ASP.NET MVC best practices“, na které byli přítomni nejen lidi od .NETu (Michal Bláha, Aleš Roubíček a řada dalších), ale i zástupci jiných technologií (Karmi – Ruby on Rails, David Grudl – PHP, Honza Král – Django, Vlasta Vávrů – Java a PHP, a určitě další). Díky tomu debata přesahovala svět .NETu, což bylo dobře – díky Jardovi za svolání takové společnosti!
Během večera jsem si udělal pár poznámek k věcem, ke kterým bych se chtěl v tomto zápisku vrátit. Pro mě osobně je nejzajímavější otázka, jestli se MVC ve srovnání s Web Forms vyplatí – vrátím se k ní, ale pěkně po pořádku…
Na začátku se hodně řešilo srovnávání ASP.NET MVC s Web Forms. Zaujalo mě, jak dlouho byla debata orientovaná na uživatelskou stránku věci – řešilo se, jestli se Web Forms aplikace návštěvníkovi dobře používá, jestli jsou třeba Web Forms vhodnější na nějaký typ aplikace a MVC zase na jiný a podobně. Můj názor zde je jasný – uživatel by neměl poznat, na jaké technologii web běží. Dobře udělaný Web Forms web může být stejně dobře použitelný jako MVC web. Pro mě je MVC vs. Web Forms o technologické volbě, která má dopady především na způsob vývoje, jeho efektivitu a podobně (jiná otázka je, jestli je vývoj v MVC skutečně efektivnější než ve Web Forms – o tom níže).
Docela dlouho se řešilo HTTP a jestli je problém, že Web Forms od něj abstrahují. Ne-dotnetisti říkali, že abstrakce od request-response modelu je zásadní chybou Web Forms a že díky tomu je to „mrtvá“ technologie, Tomáš Herceg zase oponoval, že překonat některá omezení HTTP na vyšší úrovni abstrakce může být užitečné. Zde se stavím do druhého tábora, REST přístup je mi sice sympatický a preferuji ho, nicméně proti abstrakci HTTP we Web Formsech nemám vůbec nic. V určitých scénářích to přináší zajímavé výhody, takže proč ne. S MVC to ale moc nesouvisí…
Karmi povídal o některých stále se opakujících problémech, které vídá v cizím MVC kódu. Tyto body platí takřka bezvýhradně i na ASP.NET MVC, takže zde uvedu aspoň nejdůležitější dva:
- Controller dělá víc, než by měl. Typickou chybou je, že se doménová/business logika dává do Controlleru místo do Modelu.
- Příliš mnoho začátečníků dává rovnítko mezi Model a databázi, čímž velmi omezují svůj pohled na svět. Osobně bych byl pro, aby se v jednoduchých příkladech pro začátečníky vůbec relační databáze nepoužívala, ale DB jsou „bohužel“ tak dobře podporované v nástrojích a tak běžně se používají jako persistentní úložiště, že je to asi nereálné.
Hodně času jsme potom strávili debatou, jaká funkčnost kam v MVC patří, a tady bylo zajímavé vidět, jak se naše názory někdy drobně, někdy více liší. David s Nette například některou funkčnost, která se v ASP.NET MVC dává do Controlleru, považuje za součást View. Honza s Djangem přišel s pro mě úplně neznámým modelem „Model-Template-View“, Aleš mi cestou do hospody vyprávěl, jak úspěšně kombinuje MVC s MVP, a bavili jsme se i o mnoha dalších detailech, které každý řešíme trochu jinak.
Čím víc podobné debaty slyším, tím víc se mi líbí, co řekl David: návrh aplikace je správný, když je kód tak jednoduchý, že již žádné další vylepšování jeho struktury nezlepšuje jeho čitelnost. Já bych ještě dodal, že dalším důležitým měřítkem je pro mě testovatelnost kódu: moje zkušenost je taková, že testovatelný kód je téměř vždy i dobrý kód. MVC v tomto ohledu velmi pomáhá a aplikaci směřuje správným směrem, ale dobrý softwarový návrh nezaručuje (ve světě ASP.NET viz aféra s „ukázkovou“ MVC aplikací Oxite, která byla zkritizována tak, že to snad už víc nešlo).
Na závěr zásadní otázka, kterou během večera několikrát zopakoval Michal Bláha: je vývoj v ASP.NET MVC efektivnější než ve Web Forms? Když mám tým lidí s desetiletou praxí s Web Forms, vyplatí se mi přechod na MVC?
Moje upřímná odpověď je: nevím. Nějak fungující aplikaci bez důrazu na dobrý návrh je podle mého názoru rychlejší udělat ve Web Forms – komponenty, abstrakce od HTTP, skvělá podpora ve Visual Studiu a podobné věci mají z hlediska času velkou přidanou hodnotu. V MVC musím víc věcí řešit „ručně“, musím toho o HTML, HTTP, JavaScriptu a dalších vědět daleko víc, možná i řádek kódu, které reálně napíšu, bude víc (nevím, nechci se dohadovat).
Ale: napsat kvalitní Web Forms aplikaci je taky časově náročné, jen jinak. Taková aplikace bude nejspíš využívat nějakou variaci vzoru MVP a podle mé zkušenosti je správné použití tohoto vzoru obtížnější než aplikování MVC. Rovněž se v reálu naráží na to, že HTTP/HTML je skryto až moc a je potřeba Web Forms přemlouvat, aby se chovalo podle našeho gusta (v Atlasu například Web Forms radši nahradili vlastním komponentovým frameworkem – ostatní výhody ASP.NET zůstaly samozřejmě zachovány).
Co bych si zvolil já osobně, kdybych stál na začátku nového projektu? Asi by to bylo ASP.NET MVC, ale neumím tu volbu podpořit jednoznačnými argumenty. Styl vývoje v MVC mi zkrátka vyhovuje víc – aplikace má jasnou strukturu, jsem veden k vytváření testovatelného kódu (v jednom projektu jsem došel velmi daleko jen s Modelem, Controllerem a unit testy, aniž bych vůbec řešil View), líbí se mi kontrola nad HTML výstupem a podobně. V současnosti by se mi nelíbilo, že v MVC není úplně jasný koncept znovupoužitelných komponent (typicky např. grid nebo kalendář), ale tyhle věci přijdou: někteří dodavatelé komponent už vytvářejí „MVC controly“ a časem asi vznikne unifikovaný způsob, jak tento problém řešit (něco už je v MVC Futures). RoR a jiné frameworky už možná svoji odpověď dávno mají, nevím.
A kdybych byl expert na Web Forms s řadou vyfintěných komponent a ustálenou architekturou aplikací, která podporuje testovatelnost a udržovatelnost kódu? Podíval bych se na MVC a zkusil, jestli mi náhodou tento styl vývoje nesedne. Jsou lidi, kteří byli experti na Web Forms, a přesto dobrovolně a rádi prchli k MVC. Může se stát. Pak je samozřejmě početná skupina lidí, kteří hype kolem MVC nechápou ani poté, co si MVC vyzkoušeli. A já rozumím – Web Forms nabízí hodně, hodně skvělé funkcionality. Pokud vývojáři umí řešit potenciální problémy, není asi k přechodu na MVC velký důvod.
Náčelníku, tak tak bych to viděl já :)
Díky všem lidem za podnětnou diskuzi!
Díky za shrnutí. Bohužel jsem se nemohl zúčastnit, tak alespoň takhle si rád počtu, o čem že to vlastně bylo. I tak ale 3 lidi z naší firmy už bylo tak akorát dost.
Jinak – měl jsem za to, že šlo o diskuzi o best pract v APS.NET MVC. S takovou to budete muset uspořádat ještě jednou. Tentokrát bez formsů ;)