slides

Transcription

slides
Web Development:
You’re (Still) Doing it Wrong
Stefan Tilkov | innoQ | @stilkov
Thursday 17 October 13
Annoying your users
Thursday 17 October 13
Forbid the use of the back
and forward buttons
Thursday 17 October 13
Send them to the home page
when they hit “refresh”
Thursday 17 October 13
… or ensure the browser
pops up a warning window
Thursday 17 October 13
Make sure they can’t open a
second browser window
Thursday 17 October 13
Let them see UI chrome and
ads first, content last
Thursday 17 October 13
Make sure they can’t
bookmark or send a link
Thursday 17 October 13
Don’t let Google index
anything
Thursday 17 October 13
Ensure disabling JavaScript
gives them a blank page
Thursday 17 October 13
Things that seem like a good
idea, but aren’t
Thursday 17 October 13
Fix HTTP’s basic flaw: its
statelessness
Thursday 17 October 13
Go beyond the page model
because we’re r/w now
Thursday 17 October 13
Avoid CSS because who
understands how it works?
Thursday 17 October 13
Avoid HTML because that’s
so 20th century
Thursday 17 October 13
Avoid JavaScript because it’s
not for real programmers
Thursday 17 October 13
Go beyond Client/Server and
introduce bidirectional,
binary communication
Thursday 17 October 13
Let’s take a step back
Thursday 17 October 13
Let’s build a generic client runtime
Define a protocol so it can work with any server
Allow it to mix services from different backends
Define a generic, declarative data format
Separate content and layout
Allow for extensibility with client-side scripting
Make it work on any device, with any resolution
Thursday 17 October 13
We’re not done yet
Thursday 17 October 13
Standardize it, with (rough) consensus
Ensure there are multiple client, server and
intermediary implementations to choose from
Have every client OS ship with an implementation of
the generic client
Let every programming environment support it
Thursday 17 October 13
How hard can it be?
Thursday 17 October 13
Competing with the Web may
not be the best idea
Thursday 17 October 13
My personal theory as to
why things suck so much:
Thursday 17 October 13
1. Hiding “Details”
Thursday 17 October 13
2. Preserving Expertise
Thursday 17 October 13
3. Misjudging Skills
Thursday 17 October 13
Web-centric web UIs
Thursday 17 October 13
Server-side
components
Avoid HTML, JS, CSS
Trade Familiarity for Complexity
Session-centric
ROCA
Server-side POSH
Client-side components
Web-centric
Single Page
Apps
Advanced Client Frameworks
Server-side REST APIs
Thursday 17 October 13
ROCA
(Resource-oriented Client Architecture)
Thursday 17 October 13
Make your HTML semantic
Thursday 17 October 13
Content
HTML
Thursday 17 October 13
Layout
CSS
Minimal load times
Accessibility
Self-descriptiveness
Readability
Thursday 17 October 13
“HTML?”
“I don’t do that –
I’m a programmer.”
Thursday 17 October 13
<order>
<shippingAddress>Paris, France</shippingAddress>
<items>
<item>
<productDescription>iPad</productDescription>
<quantity>1</quantity>
<price>699</price>
</item>
</items>
<link href="http://om.example.com/cancellations"
rel="cancel" />
<link href="https://om.example.com/orders/123/payment"
rel="payment" />
</order>
Thursday 17 October 13
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<div class="order">
<p class="shippingAddress">Paris, France</p>
<ul class="items">
<li class="item">
<p class="productDescription">iPad</p>
<p class="quantity">1</p>
<p class="price">699</p>
</li>
</ul>
<a href="http://om.example.com/cancellations"
rel="cancel">cancel</a>
<a href="https://om.example.com/orders/123/payment"
rel="payment">payment</a>
</div>
</body>
</html>
Thursday 17 October 13
Operations
WSDL
WS-* XML
SOAP
Service Interface
Service Logic
Parameters
Messages
Business Rules
Data Access
Data
Resources
HTTP
JSON
XML
Hypermedia
Representations
Thursday 17 October 13
Client Logic
Service Interface
Thursday 17 October 13
Service Interface
Client Logic
Service Interface
Thursday 17 October 13
Service Interface
Client Logic
Service Interface
Thursday 17 October 13
Service Interface
Presentation Logic
Orchestration Logic
Service Interface
Thursday 17 October 13
Service Interface
Presentation Logic
Orchestration Logic
Thursday 17 October 13
Orchestration Logic
Presentation Logic
Business Logic
Thursday 17 October 13
Business Logic
Use Javascript unobtrusively
Thursday 17 October 13
<a href="javascript:doSomething();">
Some Link
</a>
Thursday 17 October 13
<a href="#"
onclick="doSomething();">
Some Link
</a>
Thursday 17 October 13
<a href="/some-resource"
onclick="doSomething(this.href);">
Some Link
</a>
Thursday 17 October 13
<a href="/some-resource"
class="whatever">
Some Link
</a>
Thursday 17 October 13
<a href="/some-resource"
class="whatever">
Some Link
</a>
+
$("a.whatever").click(function() {
doSomething(this.href);
});
Thursday 17 October 13
<div id="tabs">
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
<li><a href="#tabs-3">Aenean lacinia</a></li>
</ul>
<div id="tabs-1">
<p>Proin elit arcu, rutrum commodo, vehicula ...</p>
</div>
<div id="tabs-2">
<p>Morbi tincidunt, dui sit amet facilisis feugiat, odio ...</p>
</div>
<div id="tabs-3">
<p>Mauris eleifend est et turpis. Duis id erat ...</p>
</div>
+
$("#tabs").tabs();
Thursday 17 October 13
Thursday 17 October 13
<div class="filter-column">
<label for="project">Project</label>
<select class="multiselect" id="project"
name="project" size="5" multiple>
<option>DISCOVER</option>
<option>IMPROVE</option>
<option >MAGENTA</option>
<option>ROCA</option>
<option>ROCKET</option>
</select>
</div>
$('.multiselect', context).each(function() {
$(this).multiselect({
selectedList: 2,
checkAllText: "Alle",
uncheckAllText: "Keinen"
}).multiselectfilter({label:"",
width:"200px"});
});
Thursday 17 October 13
Content
HTML
Thursday 17 October 13
Layout
CSS
Content
HTML
Layout
CSS
Behavior
JavaScript
Thursday 17 October 13
Server / Backend
responds
with
styles
Base
Markup
Layout/CSS
HTML
Ajax
initializes
styles
JS component
Methods
Events
JS glue code
Component 2
Thursday 17 October 13
Component 3
...
Or: Just go the SPA way …
Thursday 17 October 13
Browser
GET /
application/json
Filter
Application
GET /
Google
text/html
GET /
text/html
JS-to-HTML
Thursday 17 October 13
application/json
Thursday 17 October 13
Use URIs to identify a single
meaningful concept
Thursday 17 October 13
http://.../A
A
Thursday 17 October 13
http://.../A
B
A
Thursday 17 October 13
C
?
http://.../B
http://.../A
B
A
b
C
c
+ AJAX + CSS
Thursday 17 October 13
http://.../C
http://.../A
B
A
Thursday 17 October 13
C
Don’t disable Browser
Features – use them
Thursday 17 October 13
Multiple tabs & windows
Bookmarks
Back/Forward/Refresh
Personalization
Menus
Thursday 17 October 13
ROCA
http://roca-style.org/
Thursday 17 October 13
Now get serious, please.
When to use what?
Thursday 17 October 13
Single Page Apps: Good reasons
Pure JavaScript Programming Model
Server-side data API
“Closed”, desktop-style app
Browser as portable runtime platform
Offline capability
Thursday 17 October 13
Single Page Apps: Bad reasons
“That’s how you do it in 2013”
“Progressive enhancement is dead”
Required for modern, interactive UIs
Thursday 17 October 13
ROCA: Bad reasons
RESTfulness
Accessibility
Thursday 17 October 13
ROCA: Good reasons
Use of browser features
General web affinity
Separation of concerns
Front-end integration
Technology independence
SEO
Thursday 17 October 13
In summary …
Thursday 17 October 13
Not everything new is good,
not everything old is bad.
(Surprise.)
Thursday 17 October 13
Don’t repeat the mistakes we
used to make on the server
on the client.
Thursday 17 October 13
Learning details of how the
web works might be time
well spent.
Thursday 17 October 13
Working with the web is a lot
easier than fighting it.
Thursday 17 October 13
Q&A
Stefan Tilkov, @stilkov
stefan.tilkov@innoq.com
Phone: +49 170 471 2625
www.innoq.com
innoQ Deutschland GmbH
Krischerstr. 100
40789 Monheim am Rhein
Germany
Phone: +49 2173 3366-0
Ohlauer Straße 43
10999 Berlin
Germany
Phone: +49 2173 3366-0
Robert-Bosch-Straße 7
Germany
Phone: +49 2173 3366-0
Radlkoferstraße 2
D-81373 München
Telefon +49 (0) 89 741185-270
innoQ Schweiz GmbH
Gewerbestr. 11
CH-6330 Cham
Switzerland
Phone: +41 41 743 0116
info@innoq.com
Thursday 17 October 13

Similar documents