SlideShare a Scribd company logo
Winning the Application
Server Arms Race
Using Smalltalk to Redefine Web Development
Avi Bryant
Web apps: why bother?
“I’m more of the mind that HTML based
apps suck.”
— James Robertson
Web apps: why bother?
“One of the reasons to use Lisp in writing
Web-based applications is that you ca!
use Lisp. When you’re writing software
that is only going to run on your own
servers, you can use whatever language
you want.”
— Paul Graham
What is a web app?
“A collection of functions that take
HTTP requests as input and produce
HTTP responses as output.”
What is a web app?
User with Web Browser
GET /foo?x=3
...
Content-Type:
text/html
...
/foo
What is a web app?
User with Web Browser
GET /foo?x=3
...
Content-Type:
text/html
<a href=“/bar”
...
/foo /bar /baz
Client/server app
VisualWorks Client
GemStone Server
Get
Shipping
Address
Get
Billing
Address
Get
Payment
Info
Show
Confirmation
Get
Shipping
Address
Get
Billing
Address
Get
Payment
Info
Show
Confirmation
Cart info Cart info
Shipping info
Cart info
Shipping info
Billing info
Cart info
Shipping info
Billing info
Payment info
/shipping
User with Web Browser
cart
/billing
cart
shipping
cart
shipping
/payment
cart
shipping
billing
cart
shipping
billing
cart
shipping
billing
payment
User with Web Browser
cart cart
shipping
cart
shipping
cart
shipping
billing
cart
shipping
billing
cart
shipping
billing
payment
formatting
processing
formatting
do stuff
processing
formatting
do stuffdo stuff
processing
an App
a32cf6d
a Sessiona Sessiona Session
76ebc65
...
User
GET /foo?sid=a32cf6d
... <a href=“/bar?sid=a32cf6d”>...
/foo
an App
a32cf6d
a Sessiona Sessiona Session
76ebc65
...
User
GET /bar?sid=a32cf6d
... <a href=“/baz?sid=a32cf6d”>...
/bar
/shipping
User with Web Browser
/billing
sid
shipping
/payment
sid
billing
sid
payment
a Session
shipping billing
sid sid sid
sessions
Book
flight
Browse
flights
Choose
flight
Choose
seat
Why global session state is evil
Book
flight
Browse
flights
Choose
flight
Choose
seat
Choose
flight
Choose
seat
Why global session state is evil
Book
flight
Browse
flights
Choose
flight
Choose
seat
Choose
flight
Choose
seat
?
Why global session state is evil
an App
a32cf6d
a Sessiona Sessiona Session
76ebc65
...
a Component
f5c
a Component a Component
a21
...
... <input name=“page”
value=“f5b”>...
a Session
a21
a BrowseFlights
POST ... page=a21&flight=747
... <input name=“page”
value=“a21”>...
User a ChooseFlight
f5b
a Session
a21
a BrowseFlights
POST ... page=a21&flight=525
User
... <input name=“page”
value=“cc4”>...
a ChooseFlight
cc4
f5b
a ChooseFlight
WOComponent
subclass: #BillingAddress
instanceVariableNames: ‘ship bill’
response
^ ‘<form ...’
processRequest: aRequest
bill := self addressFrom: aRequest.
^ PaymentInfo new
shippingAddress: ship;
billingAddress: bill;
yourself
“Seaside is to most other Smalltalk web
toolkits as Smalltalk is to most other OO
languages, it’s as simple as that.”
— Cees de Groot
WebObjects
• http://www.apple.com/webobjects/
• http://jakarta.apache.org/tapestry/
WOComponent
subclass: #BillingAddress
instanceVariableNames: ‘ship bill’
processRequest: aRequest
bill := self addressFrom: aRequest.
^ PaymentInfo new
shippingAddress: ship;
billingAddress: bill;
yourself
WOComponent
subclass: #BillingAddress
instanceVariableNames: ‘ship bill’
processRequest: aRequest
bill := self addressFrom: aRequest.
^ PaymentInfo new
shippingAddress: ship;
billingAddress: bill;
next: (ConfirmationPage new)
yourself
WOComponent
subclass: #BillingAddress
instanceVariableNames: ‘ship bill’
processRequest: aRequest
bill := self addressFrom: aRequest.
^ next
shippingAddress: ship;
billingAddress: bill;
yourself
checkoutProcess
^ (ShippingAddress new next:
(BillingAddress new next:
(PaymentInfo new next:
(ConfirmationPage new))))
WOComponent
subclass: #BillingAddress
instanceVariableNames: ‘ship bill’
processRequest: aRequest
bill := self addressFrom: aRequest.
^ next value: bill
“BillingAddress new next:
[:bill |
PaymentInfo new
billingAddress: bill;
....]”
checkoutProcess
^ ShippingAddress new next:
[:ship |
BillingAddress new next:
[:bill |
PaymentInfo new next:
[:pay |
ConfirmationPage new
shippingAddress: ship;
billingAddress: bill;
paymentInfo: pay;
yourself]
checkoutProcess
^ PaymentInfo new next:
[:pay |
ShippingAdress new next:
[:ship |
BillingAddress new next:
[:bill |
ConfirmationPage new
shippingAddress: ship;
billingAddress: bill;
paymentInfo: pay;
yourself]
“...programming language features do well
(all other things being equal) when they
eliminate either distant or dynamic state
and replace it with either close or lexical
state. The underlying point being that we
may favour language features that
facilitate copying and modifying small
bits of code -- fragments which work in
their new context -- as a fundamental
programming activity.”
— Graydon Hoare
checkoutProcess
|pay ship bill|
pay := self call: PaymentInfo new.
ship := self call: ShippingAddress new.
bill := self call: BillingAddress new.
self call:
(ConfirmationPage new
shippingAddress: ship;
billingAddress: bill;
paymentInfo: pay)
“We could write the code to say, if the
user clicks on this link, go to the color
selection page, and then come back
here.... It made our software visibly more
sophisticated than that of our
competitors.”
— Paul Graham
<form>
Name: <input name="name"><br>
Street: <input name="street"><br>
City: <input name="city"><br>
Country:
<select name="country">
<option value="CA">Canada</option>
<option value="US">US</option>
</select>
<br>
<input type="submit">
</form>
aRequest( ‘name’->‘Avi’,
‘street’-> ‘123 W. 15th’
‘city’->‘Vancouver’,
‘country’-> ‘CA’)
renderOn: html
html form: [
html label: ‘Name’.
html textInputNamed: ‘name’; break.
html label: ‘Street’.
html textInputNamed: ‘street’; break.
html label: ‘City’.
html textInputNamed: ‘city’; break.
html label: ‘Country’.
html selectNamed: ‘country’ do: [
html optionNamed: ‘CA’ label: ‘Canada’.
html optionNamed: ‘US’ label: ‘US’.
]; break.
html submitButton.
]
processRequest: aRequest
name := aRequest at: ‘name’.
street := aRequest at: ‘street’.
...
renderOn: html
html form: [
html label: ‘Name’.
html textInputWithCallback: [:v | name := v]; break.
html label: ‘Street’.
html textInputWithCallback: [:v | street := v]; break.
html label: ‘City’.
html textInputWithCallback: [:v | city := v]; ‘city’; break.
html label: ‘Country’.
html selectFromList: self countries; break.
html submitButtonWithAction: [self saveAddress].
]
<form>
Name: <input name="1"><br>
Street: <input name="2"><br>
City: <input name="3"><br>
Country:
<select name="4">
<option value="5">Canada</option>
<option value="6">US</option>
</select>
<br>
<input type="submit" name="7" value="Submit">
</form>
aRequest(
‘1’->‘Avi’,
‘2’->...,
‘7’-> ‘Submit’)
aCallbackStore(
‘1’->[:v | name := v],
‘2’->...,
‘7’->[self saveAddress])

More Related Content

PDF
Comet from JavaOne 2008
PDF
Deliver Business Value Faster with AWS Step Functions
PPT
Develop webservice in PHP
PDF
Text Editor By Harsh Mathur.
PDF
Web service introduction
PDF
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
PDF
RESTful Web API and MongoDB go for a pic nic
PDF
Silt: Lessons Learned
Comet from JavaOne 2008
Deliver Business Value Faster with AWS Step Functions
Develop webservice in PHP
Text Editor By Harsh Mathur.
Web service introduction
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
RESTful Web API and MongoDB go for a pic nic
Silt: Lessons Learned

Viewers also liked (20)

PDF
Erlang in 11 Minutes
PDF
PyPy
PDF
Glass
PDF
Daily Living Solutions Product Catalog v4-02
PDF
Tomar Emergency Vehicle Products - Lightbars, LED Lightheads, Self-contained ...
PDF
Tomar Industrial Signalling Products - Visual Signals, LED, Strobe Lighting, ...
PDF
Sunsplash ohp manual
PDF
ShopLowVision.com Products for Eye Care Professionals product catalog, v. 4.01
PDF
Extreme
PDF
Starting fresh every morning
PDF
Krestianstvo
PPTX
RESTful services Design Lab
PDF
A JIT Smalltalk VM written in itself
PDF
Эмнэлгийн тавилга - Provita general catalogue
PDF
Advanced Techniques for BuildingTestingTools
PDF
Calling Java - JNIPort for VisualWorks
PPS
Para ANAIS
 
PPTX
Tegnologia aplicada
PPT
Vamos De Compras
PPTX
Kundenrezensionen und ihre Wirkung auf das Kaufverhalten
Erlang in 11 Minutes
PyPy
Glass
Daily Living Solutions Product Catalog v4-02
Tomar Emergency Vehicle Products - Lightbars, LED Lightheads, Self-contained ...
Tomar Industrial Signalling Products - Visual Signals, LED, Strobe Lighting, ...
Sunsplash ohp manual
ShopLowVision.com Products for Eye Care Professionals product catalog, v. 4.01
Extreme
Starting fresh every morning
Krestianstvo
RESTful services Design Lab
A JIT Smalltalk VM written in itself
Эмнэлгийн тавилга - Provita general catalogue
Advanced Techniques for BuildingTestingTools
Calling Java - JNIPort for VisualWorks
Para ANAIS
 
Tegnologia aplicada
Vamos De Compras
Kundenrezensionen und ihre Wirkung auf das Kaufverhalten
Ad

Similar to Winning the Application Server Arms Race (20)

PDF
The Future of Progressive Web Apps - View Source conference, Berlin 2016
PPTX
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
PDF
Web I - 04 - Forms
PDF
The Future of the Web - Cold Front conference 2016
PDF
Payments On Rails
PDF
cross-platform-assets-based-front-end-architecture
PDF
08 ajax
PPTX
Implementation of GUI Framework part3
PDF
First impression of the new cloud native programming language ballerina
PDF
ASP.NET 2010, WebServices Full Example for BCA Students
PPT
Web services intro.
PPTX
Distributed Parcel Tracking/Management System Overview
PDF
AWS Step Functions을 활용한 서버리스 앱 오케스트레이션
PDF
MongoDB.local Berlin: App development in a Serverless World
PPTX
Introduction ASP
PPTX
Clean up this mess - API Gateway & Service Discovery in .NET
PDF
Hilfe, wir brauchen ein Frontend
PDF
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
PDF
Building a Single Page Application using Ember.js ... for fun and profit
PPTX
IBM Connect 2016 - Break out of the Box
The Future of Progressive Web Apps - View Source conference, Berlin 2016
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
Web I - 04 - Forms
The Future of the Web - Cold Front conference 2016
Payments On Rails
cross-platform-assets-based-front-end-architecture
08 ajax
Implementation of GUI Framework part3
First impression of the new cloud native programming language ballerina
ASP.NET 2010, WebServices Full Example for BCA Students
Web services intro.
Distributed Parcel Tracking/Management System Overview
AWS Step Functions을 활용한 서버리스 앱 오케스트레이션
MongoDB.local Berlin: App development in a Serverless World
Introduction ASP
Clean up this mess - API Gateway & Service Discovery in .NET
Hilfe, wir brauchen ein Frontend
[drupalday2017] - Drupal come frontend che consuma servizi: HTTP Client Manager
Building a Single Page Application using Ember.js ... for fun and profit
IBM Connect 2016 - Break out of the Box
Ad

More from ESUG (20)

PDF
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
PDF
Micromaid: A simple Mermaid-like chart generator for Pharo
PDF
Directing Generative AI for Pharo Documentation
PDF
Even Lighter Than Lightweiht: Augmenting Type Inference with Primitive Heuris...
PDF
Composing and Performing Electronic Music on-the-Fly with Pharo and Coypu
PDF
Gamifying Agent-Based Models in Cormas: Towards the Playable Architecture for...
PDF
Analysing Python Machine Learning Notebooks with Moose
PDF
FASTTypeScript metamodel generation using FAST traits and TreeSitter project
PDF
Migrating Katalon Studio Tests to Playwright with Model Driven Engineering
PDF
Package-Aware Approach for Repository-Level Code Completion in Pharo
PDF
Evaluating Benchmark Quality: a Mutation-Testing- Based Methodology
PDF
An Analysis of Inline Method Refactoring
PDF
Identification of unnecessary object allocations using static escape analysis
PDF
Control flow-sensitive optimizations In the Druid Meta-Compiler
PDF
Clean Blocks (IWST 2025, Gdansk, Poland)
PDF
Encoding for Objects Matters (IWST 2025)
PDF
Challenges of Transpiling Smalltalk to JavaScript
PDF
Immersive experiences: what Pharo users do!
PDF
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
PDF
Cavrois - an Organic Window Management (ESUG 2025)
ShowUs: Pharo Stream Deck (ESUG 2025, Gdansk)
Micromaid: A simple Mermaid-like chart generator for Pharo
Directing Generative AI for Pharo Documentation
Even Lighter Than Lightweiht: Augmenting Type Inference with Primitive Heuris...
Composing and Performing Electronic Music on-the-Fly with Pharo and Coypu
Gamifying Agent-Based Models in Cormas: Towards the Playable Architecture for...
Analysing Python Machine Learning Notebooks with Moose
FASTTypeScript metamodel generation using FAST traits and TreeSitter project
Migrating Katalon Studio Tests to Playwright with Model Driven Engineering
Package-Aware Approach for Repository-Level Code Completion in Pharo
Evaluating Benchmark Quality: a Mutation-Testing- Based Methodology
An Analysis of Inline Method Refactoring
Identification of unnecessary object allocations using static escape analysis
Control flow-sensitive optimizations In the Druid Meta-Compiler
Clean Blocks (IWST 2025, Gdansk, Poland)
Encoding for Objects Matters (IWST 2025)
Challenges of Transpiling Smalltalk to JavaScript
Immersive experiences: what Pharo users do!
ChatPharo: an Open Architecture for Understanding How to Talk Live to LLMs
Cavrois - an Organic Window Management (ESUG 2025)

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
Empathic Computing: Creating Shared Understanding
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PPTX
A Presentation on Artificial Intelligence
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
KodekX | Application Modernization Development
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Encapsulation theory and applications.pdf
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Cloud computing and distributed systems.
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Machine learning based COVID-19 study performance prediction
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
20250228 LYD VKU AI Blended-Learning.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
The AUB Centre for AI in Media Proposal.docx
Empathic Computing: Creating Shared Understanding
Chapter 3 Spatial Domain Image Processing.pdf
A Presentation on Artificial Intelligence
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
KodekX | Application Modernization Development
Understanding_Digital_Forensics_Presentation.pptx
Dropbox Q2 2025 Financial Results & Investor Presentation
Reach Out and Touch Someone: Haptics and Empathic Computing
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Encapsulation theory and applications.pdf
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
“AI and Expert System Decision Support & Business Intelligence Systems”
Cloud computing and distributed systems.
How UI/UX Design Impacts User Retention in Mobile Apps.pdf

Winning the Application Server Arms Race