Panel diskusijaUsporedba web frameworka
Uvod
Ideja
• Svi su se susreli s nekim tehnologijama
• Rijetko tko je probao sve• Dovesti top stručnjake za svaku
tehnologiju
Ekipa
Mislav Marohnić / Rails
• Rails Core• Programiranje kao hobi i posao• Povijest: C++ (faks), PHP
(standardno)• Radio uglavnom za web startupe
Stjepan Zlodi / Django
• 24 sata digital Rođen u godini čovjekovog prvog
poznatog spuštanja na Mjesec Računalima se počeo baviti u
Orwellovoj godini Razvio sklonost prema RAD-u Produktivna lijenost
Hrvoje Hudoletnjak / .NET
• Novatec• Visual Basic -> ASP -> ASP.NET (c#)• Izrada poslovnih aplikacija na
internet platformi (RIA, SOA, ...)• Silverlight• MVC + HTML/Javascript• TDD, DDD, Agile
Goran Jurić / Zend Framework
• NCL Media Grupa• Prvu stranicu napravio 1998.godine• PHP-om se bavi > 8 godina • Zend Framework prati od v 0.1• Sa v1.5 započeo razvoj CMS-a za
potrebe kompanije
Zoran Regvart / Spring
• CROZ• Z80 asm/Basic, Pascal , C/C++ , PHP,
Java, Ruby, Python, C#• PHP/HTML freelancer (davno)• arhitekt @ Croz d.o.o.
www.croz.hr (predugo)
Moderator
Tomislav Car
• Infinum• ex.PHP• svašta non web (Java Micro Edition,
Flash)• Danas: Ruby on Rails
Programski jezik
Programski jezik / Rails
• Ruby dynamic & strongly typed sintaksa dizajnirana da sadrži što manje
“interpunkcije” (npr. zagrada, točke-zarez)
među nekoliko najkorištenijih skriptnih jezika na svijetu (osim u našim krajevima)
započet 1995 puts “hello world”
Programski jezik / Django
• Python 1991. Guido van Rossum I objektno i strukturirano i funkcionalno Održavajte razmak Čitljivost na razini pseudo koda Baterije uključene Vrti se na svim (glavnim) platformama
Programski jezik / .NET
• C# Statički, objektni, kompajlirani, managed▪ V3: LINQ (funkcijske karakteristike)▪ V4: dynamic (dinamički tipovi)
Common Language Runtime Predstavljen 2001
Programski jezik / .NET
• Uz C#VB.NET F# IronPython IronRuby ...
Programski jezik / ZF
• PHP dynamically typed C-like sintaksa ($, {}, ;) Kreiran 1995 (Personal Homepage Tools) 2000 – PHP 4 (Zend Engine) 2004 – PHP 5 (novi objektni model) 2009 – PHP 5.3 (namespaces, late static
binding, lambda račun,…)
<?php echo “Hello World”;?>
Programski jezik / Spring
• Java objektno-orijentirani statički prevedeni (compiled) u bytecode interpretiran u virtualnoj mašini (JVM)
[JIT!] garbage collector
Programski jezik / Spring
• ideja je izbjeći tipične programerske pogreške
• ~15 godina, Open Source (GPL) verzija 6 od 2006, zadnji update prošli
mjesec verzija 7 ove godine (invokedynamic,
closures, fork/join)
Framework
Framework / Rails
• Objavljen 2004• MVC, REST• convention over configuration• open source• cross-platform• razvojna okolina
napredni tekstualni editor Postoje i IDE-u, ali nisu toliko popularni
Performanse / Rails
• zadovoljan performansama• pruža puno mehanizama za
skalabilnost• ako nečime nisam zadovoljan, to
promijenim/popravim (Rails core contributor)
Framework / Rails
• Template sustav sličan PHP<html><%= ruby_code_here %></html>
• AJAX helpers Prototype.js/jQuery
• Ugrađena podrška za XSS CSRF SQL injection
Framework / Django
2003. 2005. - prva objava Open source (MIT) Linux, Mac, Windows, FreeBSD,
Solaris... Okruženje više razine, čisti,
pragmatični dizajn Modularnost
Framework / Django
• Skalabilnost• Cache – na razini aplikacije, procedura,
dijelova template koda• memcached, baza, memorija, datotečni sustav
• Odvojeni statični i dinamični dijelovi aplikacije
• Sigurnost• urls.py – prva linija obrane• SQL injections• XSS, CSRF
• django.contrib
Framework / Django
• MTV• Models • Templates• Views
• URL-s• Regex• Imenovanja• {% url ima_ime %}
Framework / Django
• Razvojna okolina• Python, Django, napredan editor• Ugrađeni razvojni web poslužitelj
• manage.py• syncbd, inspectdb, loaddata - dumpdata, shell, dbshell,
makemessages – compilemessages, sqlflush, sqlreset
• Posebni alati• django-command-extensions• django-debug-toolbar
Forma / Django
Forma / Django
Framework / ASP.NET
• 2001. v1, 2010 v4• WebForms, MVC, REST-style
(OpenRasta)• konfiguracija ili/i konvencija• Open source, MS licenca• Windows (IIS)• Implementacija CLI specifikacije
Mono, veći dio .NET Framoworka radi na Linuxu (MVC radi)
Framework / ASP.NET
• visoke performanse, jednostavan multithreading
• Osmišljen na skalabilnost• Veliki framework, pokriva enterprise
scenarije WCF, WF, WPF, Azure
• MVC pogodan za web2.0 Stackoverflow.com: 1 mil. hits / dan – 1
web server, 1 db server MySpace.com
Framework / ASP.NET
• View engines: WebForms, Spark, nHaml, nVelocity, ...
• ASP.NET AJAX, jQuery• Security
XSS, CSRF, SQL injection – većim dijelom ugrađeno u framework
U v4 automatska enkodiranje za html
Framework / ZF
• Razvoj započet 2006 godine• MVC paradigma, ali i set nezavisnih
komponenti• Puno više konfiguracije (od
konvencije)• Zahtijeva PHP 5.2.0 ili noviji • open source (New BSD licenca)
▪ svi kontributori potpisuju CLA
Performanse / ZF
• Hello world benchmark
• Opcode cache (APC) neophodan
Framework Req/s
PHP 1320
Cake 1.1.19 118
Symphony 1.1.0 67.41
Zend Framework 1.6 77.85
Performanse / ZF
• Zend_Cache Frontend: Core, File, Class,
Frontend_Output, Page Backend: File, APC, Xcache,Memcached,
Sqlite, TwoLevels
Skalabilnost / ZF
• Skalabilnost Podrška za pohranu sessiona u
memcached ili bazu podataka Zend_Db nema podršku za rad sa više
instanci baze podataka (master – slave replikacije)
Dijelove frameworka je moguće prilagoditi (i pojednostaviti) bez diranja core-a
Templating / ZF
• View & Layout Two-Step View Pattern
• Zend_View je moguće zamijeniti sa implementacijom po želji Smarty?
• ZendX_Jquery komponenta• Podrška za escape-anje prilikom
ispisa• View Helperi
Framework / Proljeće
• ~2002/3 g. trenutna verzija 3.0
• Open Source, Apache License 2.0• Plain Old Java Objects (POJO)• Inversion Of Control (IOC),
Dependency Injection (DI)• Aspect-oriented programming (AOP)• Konfiguracija i konvencije
Spring Web Stack
Spring Core
Spring MVC
Spring Web Flow
Spring JavaScript
Spring Security
Spring FacesSpring BlazeDS
Integration
Framework / Spring
• jedna od komponenti Spring Framework-a
• izgrađen nad JEE standardima i best practices
• Servlet (standalone) i Portlet varijante (portal)
• Representational State Transfer (REST)
• Konvencija naspram konfiguracije
Framework / Spring
• Podrška za view tehnologije templateing (od JSP, freemarker, Facelets
do Tiles, Sitemesh) razni output-i (PDF, Excel, RTF, XML,
JSON...)• za AJAX @MVC support ili DWR
(potpunije)• (Spring) Security
Autentikacija / Autorizacija (RBAC) ACL
Obrada podataka / Spring
• custom validatori, bean validation (JSR-303)
• fleksibilne validacijske poruke• podrška za bindanje i transformaciju
podataka (spring taglib, property editors, type converters)
Framework / Spring
• nasljeđuje izvrsne performanse JVM-a / JEE-a
• horizontalna i vertikalna skalabilnost (jasno ovisi o aplikaciji)
• development proces je izuzetno produktivan
• application serveri se bave resursima (connection pool, transaction management, clustering, load balancing)
Obrada podataka / Form
<html><body> <form:form modelAttribute="account" method="post"> <p> <form:label for="name" path="name" cssErrorClass="error">Name</...> <form:input path="name" /> <form:errors path="name" /> </p> <p> <form:label for="balance" path="balance" cssErrorClass="error">Balance</...> <form:input path="balance" /> <form:errors path="balance" /> </p> <p> <input type="submit" /> </p> </form:form></body></html>
Obrada podataka / Modelpublic class Account {
private Long id;
@NotNull@Size(min=1, max=25)private String name;
@NotNull@NumberFormat(style=Style.CURRENCY)private BigDecimal balance = new
BigDecimal("1000");
// getteri setteri...}
Obrada podataka / Controller@Controller@RequestMapping(value = "/account")public class AccountController {
@Autowired private AccountDao dao;
@RequestMapping(method = RequestMethod.POST) public String create(@Valid Account account, BindingResult result) { if (result.hasErrors()) { return "account/createForm"; }
dao.create(account);
return "redirect:/account/" + account.getId(); }
@RequestMapping(value = "/account/{id}" method = RequestMethod.GET) public Account create(Long id) { return dao.read(id); }}
Pristup bazi podataka
Baza podataka / Rails
• ORM ActiveRecord
• Nije nužan, po novome je relativno jednostavno ugraditi drugi ORM DataMapper, Sequel, MongoMapper...
• MySQL, PostgreSQL, SQLite• druge relacijske baze podržane kroz
adaptere instalirane dodatno
Baza podataka / Rails
• podrška za validacije• laka izgradnja kompleksnih HTML
forma
Baza podataka / Django
PostgreSQL, MySQL, SQLite, Oracle Django ORM SQLAlchemy, Storm
Firebird, MS-SQL, DB2 CouchDB, MongoDB Migracija
django-evolution, south, dmigrations
Rad s podacima / Django
Baza podataka / .NET
• ORM od MSa Entity Framework , Linq2SQL
• Open Source Nhibernate, ActiveRecord, SubSonic, ...
• Komercijalni LLBGen, LightSpeed, ...
• Baze MSSQL, Oracle, MySQL, PostgreSQL, SqlLite,... (L2S
samo MSSQL, EF i Oracle)• LINQ podržavaju svi:
Var comments = from c in db.Comments where c.Post.Author == „John Doe” select c;
Baza podataka / .NET
• Automatska client i server validacija• DynamicData Scaffolding framework• Templating engine za kreiranje View-
ova prema danom modelu• MVC data binderi, custom binderi
(Castle)
Baza podataka / ZF
• Zend_Db – Database abstraction layer Lazy loading konekcija na bazu Parametrizirani upiti Transakcije Profiler Paginator
• Zend_Db_Table Table & Row Data Gateway Pattern
• MySQL, Sqlite, MsSQL, Oracle, Postgres
Baza podataka / ZF
Baza podataka / ZF
• Validacija podataka vezana uz forme• Zend_Form
Elementi Dekoratori Validatori
• Nažalost ne postoji mogućnost automatskog kreiranja administracije (CRUD) iz modela
• Doctrine kao ORM
Baza podataka / Spring
• od JDBC (osnovni Java API)• do Hibernate (fullblown ORM)• Konzistentni API / Exception handling• Template Method Pattern pristup• Deklarativni transaction
management
Spring + Hibernate
@Repositorypublic class HibernatePersonDao extends HibernateDaoSupport implements AccountDao {
public void create(Account account) { getHibernateTemplate().save(account); }
public Account read(Long id) { return getHibernateTemplate().load(Account.class, id); }
public void update(Account account) { getHibernateTemplate().update(account); }
public void delete(Account account) { getHibernateTemplate().delete(account); }}
Testing
Testing / Rails
• Rails ohrabruje testing• unit testing (models), functional
testing (controllers), performance testing
• 3rd party alati za ubrzavanje testova• jednostavna sintaksa
osnovni test se može napisati u 2-3 linije• ovisno o testing frameworku, testovi
mogu biti vrlo opisni (pri čitanju)
Testing / Django
test.py u svakoj aplikaciji doctest
pythonic unittest
JUnit like django.test.client.Client
jednostavni web klijent
doctest
unittest
django.test.client.Client
Testing / .NET
• MSTest, nUnit, xUnit• MSpec, NSpec, Nbehave
ala Ruby Cucumber • Test Runners, CI• Mocking i Stubing:
Moq, Rhino Mocks, Type Moq• IoC/DI (StructureMap, Unity, AutoFac,
Castle Winsdor,...) Za bolji dizajn i arhitekturu (SOLID
principi)
Testing / ZF
• Prošireni PHPUnit (Controller_Test_Case) PHPUnit test case sa dodacima za
testiranje MVC dijelova frameworka Inspekcija DOM-a koristeći CSS
selektore:
$this->assertQueryCount('form#loginForm', 1);
• Zend_Test_PHPUnit_Db
Testing / Spring
• podrška za Junit ali slobodno je koristiti neki drugi
(TestNG)• unit testing• function testing (+populacija (in
memory) baze)• svi moderni alati za testiranje
mocks, stubs, coverage...
Reusability
Reusability / Rails
• pluginovi• “Rails Engines” - vertical slices• extra mounted frameworks
Reusability / Django
Django projekt se sastoji od aplikacija Dobro koncipirane aplikacije se mogu
koristiti u bilo kojem projektu Modeli, template, url-ovi… Primjer projekta: pip install -r
requirements.txt Middleware Template tagovi
Reusability / .NET
• ASP.NET Custom Controls – resuable• MVC Html Helpers• Veliki broj open source i
komercijalnih biblioteka gotovih komponenti CodePlex.com
Reusability / ZF
• Controller Pluginovi ,action i view helperi se nalaze u vlastitom “namespace-u”
• Postoji podrška za module no nisu baš najsretnije riješeni
Reusability / Spring
• mnogi Java projekti nude integriraciju sa Spring Framework-om (npr.:) validacije (Hibernate Validation) AJAX (DWR) WS-* / SOAP (Apache CXF)
• generalno, dobar dio kôda se generalizira i iskoristi na slijedećem projektu razni util-*, validation-*, conf-* i sl.
Razvoj
Razvoj / Rails
• troškovi razvoja mali• Ruby profesionalci su često skupi• Ruby programeri slabo dostupni u
Hrvatskoj i Sloveniji
Učenje / Rails
• dokumentacija Railsa je u početku bila jedna od velikih mana, ali danas je jako dobra
• “learning curve” - lagan• community je obilan kvalitetnim
blogovima i screencastovima
Razvoj / Django
Troškovi razvoja Razvojni alati od 0 kn Produkcijska okolina od 0 kn
Troškovi programera Isplati se platiti više
Dostupni programeri Malo ih je Laka prilagodba
Učenje / Django
Learning curve– Potrebna predznanja
Dokumentacija– http://docs.djangoproject.com– http://djangobook.com/– http://diveintopython.org/
Zajednica– http://djangopeople.net/
Razvoj / .NET
• Visaul Studio Express 2008 – besplatan Vrhunski, najbolji IDE ;) Resharper, CodeRush, ... MonoDevelop na Linuxu
• MS SQL Server Express – besplatan• Hosting:
Shared: od 5$/mj (hr: cca 200-300 kn/god) VPS: od 15$/mj BizSpark, WebSpark programi (besplatne
licence)
Učenje / .NET
Potrebno poznavati OOP ASP.NET
mogućnost Mouse Driven Developmenta ASP.NET WebForms za Windows
programere MSDN Library
300 namespaceova, 14 000 klasa, 70 000 metoda
Specijalizacija za web, win, data, ... Mnoštvo video tutoriala
(www.asp.net)
Razvoj / ZF
• Zend Studio 399$ (godinu dana)
• Još uvijek relativno mali broj programera s naprednim poznavanjem frameworka
• Za razliku od drugih PHP frameworka iza ZF-a stoji kompanija Symphony i Solar su više-manje one-
man band projekti
Učenje / ZF
• Krivulja učenja je dosta strma Neophodno dobro poznavanje OOP-a
• Dokumentacija Solidna, ali mogla bi biti i bolja Ponekad neophodno zaviriti i ispod haube
• IDE: Zend Studio, Netbeans, ... Autocomplete!
• Community Blogovi, mailing lista, Confluence wiki
Razvoj / Spring
• razvoj je nešto sporiji u početku (ukoliko se ne nasljeđuje znanje) primjeri sa predhodnog projekta npr.
• na tržištu postoji puno Java programera nažalost vrlo malo gurua
• Java developeri voze dobra kola napunjena manekenkama
Učenje / Spring
• u CROZ-u za 2-3 tjedna developer je produktivan naravno ovisno o predznanju - inhouse tečaji,
mentorstvo• barem 3 state-of-the-art razvojna alata
Eclipse (SpringSource Tool Suite), Idea, NetBeans
• nevjerojatno (za developere) ažurna i potpuna dokumentacija
• pregršt blog-ova, izvrstan forum, plativi support
Top lista nadrealista
Top 5 + / Rails
1. “opinionated”2. RESTful konvencije3. form builder4. ActiveRecord5. caching helpers
Top 5 - / Rails
1. nije za sve aplikacije2. do nedavno su se koristile loše
JavaScript prakse3. nije dobar za početnike u web
developmentu4. “skriva” neke mogućnosti relacijskih
baza5. nije optimalan za izgraditi aplikaciju
na “legacy” bazama
Top 5 + / Django
1. Kompletno rješenje2. Kvaliteta izrade3. Admin4. URL-ovi5. Dokumentacija
Top 5 - / Django
1. Slaba podrška kod hosting providera2. (Pre)dinamični razvoj3. Mali broj raspoloživih programera4. Ne postoji Django IDE5. Ne ide bez komandnije linije
Top 5 + / .NET
1. C# (OOP, LINQ, dynamic)2. Visual Studio 2010 + Resharper3. Brzina i skalabilnost4. RAD: WebForms vs MVC5. Silverlight
Top 5 - / .NET
1. Kompleksna konfiguracija, malo konvencije
2. Over-engineered3. Zatvorenost frameworka - tight
coupling4. MSDN vs ALT.NET: 5. Slaba navika open source-anja
Top 5 + / ZF
1. Prilagodljivost2. Velik broj komponenti i podržanih
servisa3. Razdrađena podrška za caching4. Backward compatibility5. Baratanje formama
Top 5 - / ZF
1. Podrška za drop-in module2. Punokrvi ORM (Doctrine u 2.0)3. Generiranje admin sučelja4. Neke komponente nisu održavane5. Službena podrška za Dojo ?!?
Top 5 + / Spring
1. Loose coupling (DI, POJO) = Maintainability
2. REST podrška u v33. Auto konfiguracija (konvencije)4. Spring Roo = Rails kakav bi
Springovci napisali5. Web Flow = podrška za kompleksne
forme, wizardi, tokovi ekrana
Top 5 - / Spring
1. Količina tehnologije / frameworka / opcija / troslovnih akronima za pohvatati
2. Hosting? (AppEngine)3. Sloboda developera da brljavi (ako
uspoređujemo sa striktnim konvencijama drugih frameworka)
4. @Hell - više anotacija nego kôda5. XML hell - više XML-a negko kôda
(manjak primjene konvencija)
Završna misao
Rails
• stavite framework na probnu vožnju na nekom konkretnom problemu.
• ne vjerujte popularnosti, samo dojmu koji steknete u tom pokusu.
Django
• Django je cjelovito rješenje, ali bilo koji modul se može zamijeniti bez da se ostatak konstrukcije sruši
• Django je moćno jednostavan. Za sve ostalo...
$ python>>> import this
ASP.NET
• Framework prilagođen za enterprise korporativne scenarije i za web 2.0 start-upove
• RIA sa Silverlightom• Slušati zajednicu, pridonositi,
pokušati pratiti izdavanje novih frameworka
Zend Framework
• Odabir frameworka je dugoročna investicija
• Odličan izbor za sve koji traže fleksibilnost i sigurnost
• Mogućnost korištenja dijelova frameworka kao zasebnih komponenti je veliki plus
• Još uvijek nisam požalio
Spring
• de facto Java standard za razvoj (i web) aplikacija
• enterprise grade što zapravo znači best-practices
Pitanja publike
Top Related