Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Adaptive and evolvable apps
Search
Ben Longden
May 08, 2015
Technology
0
420
Adaptive and evolvable apps
Ben Longden
May 08, 2015
Tweet
Share
More Decks by Ben Longden
See All by Ben Longden
Spryker, an architecture for the web
blongden
0
310
Building better clients
blongden
0
67
Silex, the micro-framework
blongden
3
590
Other Decks in Technology
See All in Technology
15 years with Rails and DDD (AI Edition)
andrzejkrzywda
0
190
顧客との商談議事録をみんなで読んで顧客解像度を上げよう
shibayu36
0
230
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
270
ブロックテーマ、WordPress でウェブサイトをつくるということ / 2026.02.07 Gifu WordPress Meetup
torounit
0
180
クレジットカード決済基盤を支えるSRE - 厳格な監査とSRE運用の両立 (SRE Kaigi 2026)
capytan
6
2.7k
Tebiki Engineering Team Deck
tebiki
0
24k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
13k
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
5
1.6k
Greatest Disaster Hits in Web Performance
guaca
0
230
量子クラウドサービスの裏側 〜Deep Dive into OQTOPUS〜
oqtopus
0
110
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
68k
M&A 後の統合をどう進めるか ─ ナレッジワーク × Poetics が実践した組織とシステムの融合
kworkdev
PRO
1
450
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
81
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
HDC tutorial
michielstock
1
380
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.6k
The Pragmatic Product Professional
lauravandoore
37
7.1k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
Why Our Code Smells
bkeepers
PRO
340
58k
Fireside Chat
paigeccino
41
3.8k
Accessibility Awareness
sabderemane
0
51
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
130
Transcript
Adap%ve(and(evolvable(applica%ons Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 1
What%is%hypermedia? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 2
What%does%it%look%like? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 3
How$can$I$make$use$of$it$in$my$ apps? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 4
There%are%two%types%of%API%client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 5
Machine(driven Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 6
Human&driven Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 7
Consider)the)web)browser Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 8
The$data Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 9
What%the%client%should%do%next Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 10
Hypermedia*is*defined*by*the* presence*of*applica5on*control* informa5on*embedded*within,*or*as* a*layer*above,*the*presenta5on*of* informa5on —"Roy"Fielding Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 11
<a href=“http://example.org/next”>next</a> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 12
<form method=“GET” action=“http://example.org/search”> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 13
<img src=“http://example.org/thing.gif” title=“thing”> Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 14
A"browser"is"designed"so"that"its" hypermedia"affordances"are" controlled"by"humans Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 15
What%about%when%the%consumer%is%a% smartphone/web%applica4on? Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 16
Hypermedia*Applica.on*Language { "_links": { "self": { "href": "/orders/1" }, "next":
{ "href": "/orders/2" } }, "_embedded": { "items": [ { "_links": { "self": { "href": "/items/1" } } "price": "10" } ] }, "total": "10" } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 17
HAL$contains$two$types$of$link$affordance Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 18
Outbound(naviga-onal { "_links": { "self": { "href": "http://example.org/thing/2" }, "prev":
{ "href": "http://example.org/thing/1" }, "next": { "href": "http://example.org/thing/3" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 19
Embedded { "_embedded": { "things": [ { ... } ]
} } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 20
This%allows%the%message%to%contain% both%the%data%and%the%context Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 21
Less$logic$in$the$client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 22
weluse/hyperagent Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 23
{ "_links": { "self": { "href": "http://example.org/thing/2" }, "prev": {
"href": "http://example.org/thing/1" }, "next": { "href": "http://example.org/thing/3" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 24
root.links['next'].fetch().then(function (thing) { // do something with the 'next' item
}); Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 25
Clients(can(adapt(to(change Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 26
The$server$can$evolve$independently$ from$the$client Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 27
URLs Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 28
Avoid&assembling&URLs var link = 'http://example.org/thing/' + id; Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 29
Use$a$link$template$on$the$home$if$you$need$to$convert$an$id$to$a$URL { "_links": { "self": { "href": "/" }, "thing":
{ "href": "http://example.org/thing/{id}", "templated": "true" } } } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 30
Link%templates%with%hyperagent var link = root.link('thing', { id: id }); Adap%ve(and(evolvable(applica%ons(0(Ben(Longden
31
RFC6570()(URI(Templates Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 32
JSON%Schema Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 33
{ "title": "Example Schema", "type": "object", "properties": { "firstName": {
"type": "string" }, "lastName": { "type": "string" }, "age": { "description": "Age in years", "type": "integer", "minimum": 0 } }, "required": ["firstName", "lastName"] } Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 34
JSON%Form (or$Angular$Schema$Form) Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 35
Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 36
Three%good%things Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 37
• Hypermedia • Link.templates • JSON.Schema Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 38
One$goal Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 39
Put$control$back$on$the$server Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 40
React&to&change&in&a&posi.ve&way Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 41
Ben$Longden CTO$Inviqa @blongden Adap%ve(and(evolvable(applica%ons(0(Ben(Longden 42