SlideShare a Scribd company logo
Simple by Design: 
Clojure 
@stuarthalloway 
stu@cognitect.com 
Copyright Cognitect, Inc. 
This presentation is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License. 
See http://creativecommons.org/licenses/by-nc-sa/3.0/us/
Thoughtworks Radar 
Oct 2012: 
Adopt Clojure 
http://www.thoughtworks.com/radar
Redmonk Top 20 
Clojure 
http://redmonk.com/sogrady/2014/06/13/language-rankings-6-14/
Design 
! 
specification of an artifact 
using components to meet 
goals subject to constraints
Simple 
! 
not compound
Valuable But Not Simple 
convenience 
beginner-friendliness 
ease 
familiarity 
smaller size 
lesser count
Simple 
! 
not compound
Agenda 
examples of simplicity in Clojure 
benefits of simplicity in Clojure 
producing Clojure
Examples of Simplicity 
syntax 
protocols 
values and references
Examples of Simplicity 
syntax 
protocols 
values and references
"Hello World"
"Hello World" 
that is the program
Everything is Data
type examples 
string "foo" 
character f 
integer 42, 42N 
floating point 3.14, 3.14M 
boolean true 
nil nil 
symbol foo, + 
keyword :foo, ::foo
type properties examples 
list sequential (1 2 3) 
vector sequential and 
random access 
[1 2 3] 
map associative 
{:a 100! 
:b 90} 
set membership #{:a :b}
Function Call 
semantics: fn call args 
(+ 2 2) 
structure: symbol longs 
list
Function Definition 
define a fn fn name 
docstring 
(defn greet! 
"Returns a friendly greeting"! 
[your-name]! 
(str "Hello, " your-name)) 
arguments 
fn body
…Still Just Data 
symbol symbol 
string 
(defn greet! 
"Returns a friendly greeting"! 
[your-name]! 
(str "Hello, " your-name)) 
vector 
list
Complexities Avoided 
lots of syntax to learn 
ordering dependencies 
operator precedence 
code over data bias 
tedious metaprogramming
Examples of Simplicity 
syntax 
protocols 
values and references
Reversible 
Jacket Belt String
Reversible 
interface 
implementation 
Jacket Belt String
Reversible 
interface 
implementation 
extension 
Jacket Belt String
(defprotocol Reversible! 
(reverse [_]))! 
! 
! 
! 
(defrecord ReversibleTie [a b])! 
! 
! 
! 
(extend-protocol Reversible! 
ReversibleTie! 
(reverse [tie] (->ReversibleTie (:b tie) (:a tie)))! 
String! 
(reverse [s] (-> s! 
StringBuilder.! 
.reverse! 
.toString))) 
interface 
implementation 
extension
Complexities Avoided 
adapter pattern 
wrapper pattern 
translator pattern 
monkey patching 
StringUtils 
note that these are all combinatorial
Examples of Simplicity 
syntax 
protocols 
values and references
Me 182
Me 182 
nachos
Me 182 
nachos 
184
Watch OO Flounder 
Me 182 
nachos 
184 
instance? 
field? 
method? 
??
If you have more things 
than names, your design 
is broken.
Clojure’s Simplicity 
Me 182 
nachos 
184 
reference 
value 
pure 
function 
succession function new value
Values and References 
(defprotocol Nachos! 
(yum [_] "eat some nachos"))! 
! 
(defrecord Person [name lbs]! 
Nachos! 
(yum [person]! 
(update-in person [:lbs] + 2)))! 
! 
(def me (atom (->Person "Stu" 182)))! 
! 
(def me-before @me)! 
! 
(swap! me yum)! 
! 
(def me-after @me)
Values and References 
(defprotocol Nachos! 
(yum [_] "eat some nachos"))! 
! 
(defrecord Person [name lbs]! 
Nachos! 
(yum [person]! 
functional 
(update-in person [:lbs] + 2)))! 
! 
(def me (atom (->Person "Stu" 182)))! 
! 
(def me-before @me)! 
! 
(swap! me yum)! 
! 
(def me-after @me)
Values and References 
(defprotocol Nachos! 
(yum [_] "eat some nachos"))! 
! 
(defrecord Person [name lbs]! 
Nachos! 
(yum [person]! 
(update-in person [:lbs] + 2)))! 
! 
(def me (atom (->Person "Stu" 182)))! 
! 
(def me-before @me)! 
! 
(swap! me yum)! 
! 
(def me-after @me) 
update 
semantics
Values and References 
(defprotocol Nachos! 
(yum [_] "eat some nachos"))! 
! 
(defrecord Person [name lbs]! 
Nachos! 
(yum [person]! 
(update-in person [:lbs] + 2)))! 
! 
(def me (atom (->Person "Stu" 182)))! 
! 
(def me-before @me)! 
! 
(swap! me yum)! 
! 
(def me-after @me) 
multiple 
point-in-time 
values
Complexities Avoided 
incidental complexity temporal reasoning 
single-threading 
locking 
defensive copying 
setter methods 
String vs. StringBuilder vs. StringBuffer 
note (again!) that these are all combinatorial
Benefits of Clojure 
concision 
generality 
robustness 
agility
Benefits of Clojure 
concision 
generality 
robustness 
agility
StringUtils 
indexOfAny 
https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html
indexOfAny Spec 
StringUtils.indexOfAny(null, *) = -1! 
StringUtils.indexOfAny("", *) = -1! 
StringUtils.indexOfAny(*, null) = -1! 
StringUtils.indexOfAny(*, []) = -1! 
StringUtils.indexOfAny("zzabyycdxx",['z','a']) = 0! 
StringUtils.indexOfAny("zzabyycdxx",['b','y']) = 3! 
StringUtils.indexOfAny("aba", ['z']) = -1
// From Apache Commons Lang, http://commons.apache.org/lang/! 
public static int indexOfAny(String str, char[] searchChars) {! 
if (isEmpty(str) || ArrayUtils.isEmpty(searchChars)) {! 
return -1;! 
}! 
for (int i = 0; i < str.length(); i++) {! 
char ch = str.charAt(i);! 
for (int j = 0; j < searchChars.length; j++) {! 
if (searchChars[j] == ch) {! 
return i;! 
}! 
}! 
}! 
return -1;! 
} 
indexOfAny Impl
public static int indexOfAny(String str, char[] searchChars) {! 
when (searchChars)! 
for (int i = 0; i < str.length(); i++) {! 
char ch = str.charAt(i);! 
for (int j = 0; j < searchChars.length; j++) {! 
if (searchChars[j] == ch) {! 
return i;! 
}! 
}! 
}! 
}! 
} 
- Corner Cases
indexOfAny(str, searchChars) {! 
when (searchChars)! 
for (i = 0; i < str.length(); i++) {! 
ch = str.charAt(i);! 
for (j = 0; j < searchChars.length; j++) {! 
if (searchChars[j] == ch) {! 
return i;! 
}! 
}! 
}! 
}! 
} 
- Type Decls
indexOfAny(str, searchChars) {! 
when (searchChars)! 
for (i = 0; i < str.length(); i++) {! 
ch = str.charAt(i); ! 
when searchChars(ch) i;! 
}! 
}! 
} 
+ When Clause
indexOfAny(str, searchChars) {! 
when (searchChars)! 
for ([i, ch] in indexed(str)) {! 
when searchChars(ch) i;! 
}! 
}! 
} 
+ Comprehension
Lispify 
(defn index-filter [pred coll]! 
(when pred ! 
(for [[idx elt] (indexed coll) :when (pred elt)] idx)))
Benefits of Clojure 
concision 
generality 
robustness 
agility
imperative functional 
searches strings searches any sequence 
matches characters matches any predicate 
returns first match returns lazy seq of all 
matches
; idxs of heads in stream of coin flips! 
(index-filter #{:h} 
[:t :t :h :t :h :t :t :t :h :h]) ! 
-> (2 4 8 9)! 
! 
; Fibonaccis pass 1000 at n=17! 
(first ! 
(index-filter #(> % 1000) (fibo)))! 
-> 17 
+ Generality
Clojure 
programs can have fewer 
lines of code than OO 
programs have files
Benefits of Clojure 
concision 
generality 
robustness 
agility
imperative functional 
functions 1 1 
classes 1 0 
internal exit points 2 0 
variables 3 0 
branches 4 0 
boolean ops 1 0 
function calls* 6 3 
total 18 4
Benefits of Clojure 
concision 
generality 
robustness 
agility
Plain Immutable 
Collection Objects 
(PICOs)
PICOS Everywhere 
collections 
directories 
files 
XML 
JSON 
result sets 
web requests 
web responses 
sessions 
configuration 
metrics 
logs
Consuming JSON 
What actors are in more than one movie 
currently topping the box office charts? 
http://developer.rottentomatoes.com/docs/ 
read/json/v10/Box_Office_Movies
Consuming JSON 
find the JSON input! 
download it! 
parse json! 
walk the movies! 
accumulating cast! 
extract actor name! 
get frequencies! 
sort by highest frequency 
http://developer.rottentomatoes.com/docs/ 
read/json/v10/Box_Office_Movies
Consuming JSON 
(->> box-office-uri! 
slurp! 
json/read-json! 
:movies! 
(mapcat :abridged_cast)! 
(map :name)! 
frequencies! 
(sort-by (comp - second))) 
http://developer.rottentomatoes.com/docs/ 
read/json/v10/Box_Office_Movies
Consuming JSON 
["Shiloh Fernandez" 2] ! 
["Ray Liotta" 2] ! 
["Isla Fisher" 2] ! 
["Bradley Cooper" 2] ! 
["Dwayne "The Rock" Johnson" 2] ! 
["Morgan Freeman" 2] ! 
["Michael Shannon" 2] ! 
["Joel Edgerton" 2] ! 
["Susan Sarandon" 2] ! 
["Leonardo DiCaprio" 2] 
http://developer.rottentomatoes.com/docs/ 
read/json/v10/Box_Office_Movies
PICOs for Big Data 
(defn my-data-2 [] 
(->> 
(pig/load-tsv "input.tsv") 
(pig/map (fn [[a b c]] 
{:sum (+ (Integer/valueOf a) (Integer/valueOf b)) 
:name c})) 
(pig/filter (fn [{:keys [sum]}] 
(< sum 5))))) 
! 
=> (pig/dump (my-data-2)) 
[{:sum 3, :name "foo"}] 
https://github.com/Netflix/PigPen
Me 182 
nachos 
184 
reference 
value 
pure 
function 
new value 
succession 
function
Me t-1 
transact 
t-2 
connection 
db value 
pure 
function 
new db value 
ACID
ACID data of record 
persistent data structures: “scm for business data” 
distributed, componentized, read scalable & elastic 
information and logic as PICOs in any peer process
Connect and Query 
Connection conn = ! 
connect("datomic:ddb://us-east-1/mb/mbrainz");! 
! 
! 
Database db = conn.db();! 
! 
! 
Set results = q(..., db);! 
! 
! 
Set crossDbResults = q(..., db1, db2);! 
! 
! 
Entity e = db.entity(42);
Connect and Query 
Connection conn = ! 
connect("datomic:ddb://us-east-1/mb/mbrainz");! 
! 
! 
Database db = conn.db();! 
! 
! 
Set results = q(..., db);! 
! 
! 
Set crossDbResults = q(..., db1, db2);! 
! 
! 
Entity e = db.entity(42); 
database is a lazily 
realized value, available 
to all peers equally
Producing Clojure
Design 
! 
specification of an artifact 
using components to meet 
goals subject to constraints
Goal 
! 
give skilled devs superpowers 
to build business software 
systems
Goal 
! 
give skilled devs superpowers 
to build business software 
systems
Goal 
! 
give skilled devs superpowers 
to build business software 
systems
Constraints 
for wide adoption 
open source 
target established platforms 
for viability 
performance 
stability
Constraints 
for wide adoption 
open source 
target established platforms 
for viability 
performance 
stability
Open Source 
licensed under EPL 
contributor agreement 
artifacts in Maven Central 
not just language: bunch of libs too
Might Surprise You 
we take patches, not pull requests 
we prefer designs over patches 
we prefer problem statements over designs
Constraints 
for wide adoption 
open source 
target established platforms 
for viability 
performance 
stability
Server Performance 
Clojure 
note: 
log 
scale! 
http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php
Constraints 
for wide adoption 
open source 
target established platforms 
for viability 
performance 
stability
2009
Maintaining Programming Clojure 
release date breakage* 
1.0 05/2009 - 
1.1 12/2009 None 
1.2 08/2010 None 
1.3 09/2011 Small 
1.4 04/2012 None 
1.5 03/2013 None 
1.6 03/2014 None 
1.7 TBD None
One size does not fit all
Examples of Simplicity 
syntax 
protocols 
values and references 
PICOs!
Benefits of Clojure 
concision 
generality 
robustness 
agility
@stuarthalloway
Clojure 
http://clojure.com. The Clojure language. 
http://cognitect.com/. The company behind Clojure, ClojureScript, & Datomic. 
http://blog.cognitect.com/cognicast/. The Cognicast. 
http://bit.ly/clojure-bookshelf. 40 recommendations from Rich. 
http://clojure.in/. Planet Clojure. 
! 
@stuarthalloway 
https://github.com/stuarthalloway/presentations/wiki. Presentations. 
https://github.com/stuarthalloway/exploring-clojure. Sample Code. 
http://pragprog.com/book/shcloj2/programming-clojure. Programming Clojure. 
mailto:stu@cognitect.com

More Related Content

What's hot (20)

PDF
Fast as C: How to Write Really Terrible Java
Charles Nutter
 
PDF
ElasticSearch
Luiz Rocha
 
PPTX
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome
 
KEY
SD, a P2P bug tracking system
Jesse Vincent
 
KEY
A million connections and beyond - Node.js at scale
Tom Croucher
 
ODP
700 Tons of Code Later
Alexander Shopov
 
PDF
Akka and the Zen of Reactive System Design
Lightbend
 
PDF
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
Jeongkyu Shin
 
PDF
Need for Async: Hot pursuit for scalable applications
Konrad Malawski
 
PDF
Unit Testing Lots of Perl
Workhorse Computing
 
PPTX
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Takayuki Shimizukawa
 
PPT
Mining Ruby Gem vulnerabilities for Fun and No Profit.
Larry Cashdollar
 
PDF
Effective Benchmarks
Workhorse Computing
 
PPTX
A Replay Approach to Software Validation
James Pascoe
 
PDF
Cより速いRubyプログラム
kwatch
 
PDF
From Zero to Application Delivery with NixOS
Susan Potter
 
PDF
WordPress Plugin Unit Tests (FR - WordCamp Paris 2015)
Ozh
 
PDF
The Rust Borrow Checker
Nell Shamrell-Harrington
 
PDF
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Pôle Systematic Paris-Region
 
ZIP
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Guillaume Laforge
 
Fast as C: How to Write Really Terrible Java
Charles Nutter
 
ElasticSearch
Luiz Rocha
 
Running Ruby on Solaris (RubyKaigi 2015, 12/Dec/2015)
ngotogenome
 
SD, a P2P bug tracking system
Jesse Vincent
 
A million connections and beyond - Node.js at scale
Tom Croucher
 
700 Tons of Code Later
Alexander Shopov
 
Akka and the Zen of Reactive System Design
Lightbend
 
연구자 및 교육자를 위한 계산 및 분석 플랫폼 설계 - PyCon KR 2015
Jeongkyu Shin
 
Need for Async: Hot pursuit for scalable applications
Konrad Malawski
 
Unit Testing Lots of Perl
Workhorse Computing
 
Sphinx autodoc - automated api documentation - PyCon.KR 2015
Takayuki Shimizukawa
 
Mining Ruby Gem vulnerabilities for Fun and No Profit.
Larry Cashdollar
 
Effective Benchmarks
Workhorse Computing
 
A Replay Approach to Software Validation
James Pascoe
 
Cより速いRubyプログラム
kwatch
 
From Zero to Application Delivery with NixOS
Susan Potter
 
WordPress Plugin Unit Tests (FR - WordCamp Paris 2015)
Ozh
 
The Rust Borrow Checker
Nell Shamrell-Harrington
 
Syncing up with Python’s asyncio for (micro) service development, Joir-dan Gumbs
Pôle Systematic Paris-Region
 
Groovy and Grails in Action - Devoxx 2008 - University - Guillaume Laforge
Guillaume Laforge
 

Viewers also liked (20)

PPTX
Considerations for Operating an OpenStack Cloud
All Things Open
 
PPTX
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
All Things Open
 
PDF
Software Development as a Civic Service
All Things Open
 
PDF
Open Source in Healthcare
All Things Open
 
PDF
HTML for the Mobile Web, Firefox OS
All Things Open
 
PDF
What Academia Can Learn from Open Source
All Things Open
 
PPTX
Great Artists (Designers) Steal
All Things Open
 
PPTX
JavaScript and Internet Controlled Hardware Prototyping
All Things Open
 
PPTX
All Things Open Opening Keynote
All Things Open
 
PDF
Developing Apps for Google Glass Using Javascript & Ruby
All Things Open
 
PPTX
Sustainable Open Data Markets
All Things Open
 
PPTX
Giving a URL to All Objects using Beacons²
All Things Open
 
PPTX
How to Use Cryptography Properly: Common Mistakes People Make When Using Cry...
All Things Open
 
PDF
Trademarks and Your Free and Open Source Software Project
All Things Open
 
PPT
Open Sourcing the Public Library
All Things Open
 
PDF
Battle of the Stacks
All Things Open
 
PPTX
Apache Spark: Lightning Fast Cluster Computing
All Things Open
 
PDF
Version Control and Git - GitHub Workshop
All Things Open
 
PDF
What Does Big Data Really Mean for Your Business?
All Things Open
 
PDF
Building the iRODS Consortium
All Things Open
 
Considerations for Operating an OpenStack Cloud
All Things Open
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
All Things Open
 
Software Development as a Civic Service
All Things Open
 
Open Source in Healthcare
All Things Open
 
HTML for the Mobile Web, Firefox OS
All Things Open
 
What Academia Can Learn from Open Source
All Things Open
 
Great Artists (Designers) Steal
All Things Open
 
JavaScript and Internet Controlled Hardware Prototyping
All Things Open
 
All Things Open Opening Keynote
All Things Open
 
Developing Apps for Google Glass Using Javascript & Ruby
All Things Open
 
Sustainable Open Data Markets
All Things Open
 
Giving a URL to All Objects using Beacons²
All Things Open
 
How to Use Cryptography Properly: Common Mistakes People Make When Using Cry...
All Things Open
 
Trademarks and Your Free and Open Source Software Project
All Things Open
 
Open Sourcing the Public Library
All Things Open
 
Battle of the Stacks
All Things Open
 
Apache Spark: Lightning Fast Cluster Computing
All Things Open
 
Version Control and Git - GitHub Workshop
All Things Open
 
What Does Big Data Really Mean for Your Business?
All Things Open
 
Building the iRODS Consortium
All Things Open
 
Ad

Similar to Clojure: Simple By Design (20)

PDF
Effective Object Oriented Design in Cpp
CodeOps Technologies LLP
 
PPT
An Overview Of Python With Functional Programming
Adam Getchell
 
PDF
When RegEx is not enough
Nati Cohen
 
PDF
Introduction to clojure
Abbas Raza
 
PDF
Golang Performance : microbenchmarks, profilers, and a war story
Aerospike
 
PDF
Introduction to source{d} Engine and source{d} Lookout
source{d}
 
PDF
Go 1.10 Release Party - PDX Go
Rodolfo Carvalho
 
PPT
Groovy Introduction - JAX Germany - 2008
Guillaume Laforge
 
PDF
Modern C++
Michael Clark
 
PDF
Happy Go Programming
Lin Yo-An
 
PDF
Refactoring to Macros with Clojure
Dmitry Buzdin
 
PDF
An Introduction to Go
Cloudflare
 
PDF
Pune Clojure Course Outline
Baishampayan Ghose
 
KEY
Mongo db勉強会20110730
Akihiro Okuno
 
PDF
Serializing EMF models with Xtext
meysholdt
 
PDF
Opa hackathon
Henri Binsztok
 
PDF
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Codemotion
 
PPT
Profiling and optimization
g3_nittala
 
PDF
支撐英雄聯盟戰績網的那條巨蟒
Toki Kanno
 
PDF
Programming with Python and PostgreSQL
Peter Eisentraut
 
Effective Object Oriented Design in Cpp
CodeOps Technologies LLP
 
An Overview Of Python With Functional Programming
Adam Getchell
 
When RegEx is not enough
Nati Cohen
 
Introduction to clojure
Abbas Raza
 
Golang Performance : microbenchmarks, profilers, and a war story
Aerospike
 
Introduction to source{d} Engine and source{d} Lookout
source{d}
 
Go 1.10 Release Party - PDX Go
Rodolfo Carvalho
 
Groovy Introduction - JAX Germany - 2008
Guillaume Laforge
 
Modern C++
Michael Clark
 
Happy Go Programming
Lin Yo-An
 
Refactoring to Macros with Clojure
Dmitry Buzdin
 
An Introduction to Go
Cloudflare
 
Pune Clojure Course Outline
Baishampayan Ghose
 
Mongo db勉強会20110730
Akihiro Okuno
 
Serializing EMF models with Xtext
meysholdt
 
Opa hackathon
Henri Binsztok
 
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Codemotion
 
Profiling and optimization
g3_nittala
 
支撐英雄聯盟戰績網的那條巨蟒
Toki Kanno
 
Programming with Python and PostgreSQL
Peter Eisentraut
 
Ad

More from All Things Open (20)

PDF
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
All Things Open
 
PPTX
Big Data on a Small Budget: Scalable Data Visualization for the Rest of Us - ...
All Things Open
 
PDF
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
All Things Open
 
PDF
Let's Create a GitHub Copilot Extension! - Nick Taylor, Pomerium
All Things Open
 
PDF
Leveraging Pre-Trained Transformer Models for Protein Function Prediction - T...
All Things Open
 
PDF
Gen AI: AI Agents - Making LLMs work together in an organized way - Brent Las...
All Things Open
 
PDF
You Don't Need an AI Strategy, But You Do Need to Be Strategic About AI - Jes...
All Things Open
 
PPTX
DON’T PANIC: AI IS COMING – The Hitchhiker’s Guide to AI - Mark Hinkle, Perip...
All Things Open
 
PDF
Fine-Tuning Large Language Models with Declarative ML Orchestration - Shivay ...
All Things Open
 
PDF
Leveraging Knowledge Graphs for RAG: A Smarter Approach to Contextual AI Appl...
All Things Open
 
PPTX
Artificial Intelligence Needs Community Intelligence - Sriram Raghavan, IBM R...
All Things Open
 
PDF
Don't just talk to AI, do more with AI: how to improve productivity with AI a...
All Things Open
 
PPTX
Open-Source GenAI vs. Enterprise GenAI: Navigating the Future of AI Innovatio...
All Things Open
 
PDF
The Death of the Browser - Rachel-Lee Nabors, AgentQL
All Things Open
 
PDF
Making Operating System updates fast, easy, and safe
All Things Open
 
PDF
Reshaping the landscape of belonging to transform community
All Things Open
 
PDF
The Unseen, Underappreciated Security Work Your Maintainers May (or may not) ...
All Things Open
 
PDF
Integrating Diversity, Equity, and Inclusion into Product Design
All Things Open
 
PDF
The Open Source Ecosystem for eBPF in Kubernetes
All Things Open
 
PDF
Open Source Privacy-Preserving Metrics - Sarah Gran & Brandon Pitman
All Things Open
 
Agentic AI for Developers and Data Scientists Build an AI Agent in 10 Lines o...
All Things Open
 
Big Data on a Small Budget: Scalable Data Visualization for the Rest of Us - ...
All Things Open
 
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
All Things Open
 
Let's Create a GitHub Copilot Extension! - Nick Taylor, Pomerium
All Things Open
 
Leveraging Pre-Trained Transformer Models for Protein Function Prediction - T...
All Things Open
 
Gen AI: AI Agents - Making LLMs work together in an organized way - Brent Las...
All Things Open
 
You Don't Need an AI Strategy, But You Do Need to Be Strategic About AI - Jes...
All Things Open
 
DON’T PANIC: AI IS COMING – The Hitchhiker’s Guide to AI - Mark Hinkle, Perip...
All Things Open
 
Fine-Tuning Large Language Models with Declarative ML Orchestration - Shivay ...
All Things Open
 
Leveraging Knowledge Graphs for RAG: A Smarter Approach to Contextual AI Appl...
All Things Open
 
Artificial Intelligence Needs Community Intelligence - Sriram Raghavan, IBM R...
All Things Open
 
Don't just talk to AI, do more with AI: how to improve productivity with AI a...
All Things Open
 
Open-Source GenAI vs. Enterprise GenAI: Navigating the Future of AI Innovatio...
All Things Open
 
The Death of the Browser - Rachel-Lee Nabors, AgentQL
All Things Open
 
Making Operating System updates fast, easy, and safe
All Things Open
 
Reshaping the landscape of belonging to transform community
All Things Open
 
The Unseen, Underappreciated Security Work Your Maintainers May (or may not) ...
All Things Open
 
Integrating Diversity, Equity, and Inclusion into Product Design
All Things Open
 
The Open Source Ecosystem for eBPF in Kubernetes
All Things Open
 
Open Source Privacy-Preserving Metrics - Sarah Gran & Brandon Pitman
All Things Open
 

Recently uploaded (20)

PDF
The Growing Value and Application of FME & GenAI
Safe Software
 
PPTX
𝙳𝚘𝚠𝚗𝚕𝚘𝚊𝚍—Wondershare Filmora Crack 14.0.7 + Key Download 2025
sebastian aliya
 
PPTX
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
PDF
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
PDF
Kubernetes - Architecture & Components.pdf
geethak285
 
PPTX
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
PPTX
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
PPTX
Smarter Governance with AI: What Every Board Needs to Know
OnBoard
 
PDF
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
PDF
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Ravi Tamada
 
PPTX
Simplifica la seguridad en la nube y la detección de amenazas con FortiCNAPP
Cristian Garcia G.
 
PDF
Salesforce Summer '25 Release Frenchgathering.pptx.pdf
yosra Saidani
 
PDF
Python Conference Singapore - 19 Jun 2025
ninefyi
 
DOCX
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
PDF
Redefining Work in the Age of AI - What to expect? How to prepare? Why it mat...
Malinda Kapuruge
 
PDF
ArcGIS Utility Network Migration - The Hunter Water Story
Safe Software
 
PDF
Plugging AI into everything: Model Context Protocol Simplified.pdf
Abati Adewale
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
PDF
“Scaling i.MX Applications Processors’ Native Edge AI with Discrete AI Accele...
Edge AI and Vision Alliance
 
PDF
Why aren't you using FME Flow's CPU Time?
Safe Software
 
The Growing Value and Application of FME & GenAI
Safe Software
 
𝙳𝚘𝚠𝚗𝚕𝚘𝚊𝚍—Wondershare Filmora Crack 14.0.7 + Key Download 2025
sebastian aliya
 
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
Cracking the Code - Unveiling Synergies Between Open Source Security and AI.pdf
Priyanka Aash
 
Kubernetes - Architecture & Components.pdf
geethak285
 
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
Smarter Governance with AI: What Every Board Needs to Know
OnBoard
 
“MPU+: A Transformative Solution for Next-Gen AI at the Edge,” a Presentation...
Edge AI and Vision Alliance
 
Hyderabad MuleSoft In-Person Meetup (June 21, 2025) Slides
Ravi Tamada
 
Simplifica la seguridad en la nube y la detección de amenazas con FortiCNAPP
Cristian Garcia G.
 
Salesforce Summer '25 Release Frenchgathering.pptx.pdf
yosra Saidani
 
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
Redefining Work in the Age of AI - What to expect? How to prepare? Why it mat...
Malinda Kapuruge
 
ArcGIS Utility Network Migration - The Hunter Water Story
Safe Software
 
Plugging AI into everything: Model Context Protocol Simplified.pdf
Abati Adewale
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
“Scaling i.MX Applications Processors’ Native Edge AI with Discrete AI Accele...
Edge AI and Vision Alliance
 
Why aren't you using FME Flow's CPU Time?
Safe Software
 

Clojure: Simple By Design

  • 1. Simple by Design: Clojure @stuarthalloway [email protected] Copyright Cognitect, Inc. This presentation is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License. See http://creativecommons.org/licenses/by-nc-sa/3.0/us/
  • 2. Thoughtworks Radar Oct 2012: Adopt Clojure http://www.thoughtworks.com/radar
  • 3. Redmonk Top 20 Clojure http://redmonk.com/sogrady/2014/06/13/language-rankings-6-14/
  • 4. Design ! specification of an artifact using components to meet goals subject to constraints
  • 5. Simple ! not compound
  • 6. Valuable But Not Simple convenience beginner-friendliness ease familiarity smaller size lesser count
  • 7. Simple ! not compound
  • 8. Agenda examples of simplicity in Clojure benefits of simplicity in Clojure producing Clojure
  • 9. Examples of Simplicity syntax protocols values and references
  • 10. Examples of Simplicity syntax protocols values and references
  • 12. "Hello World" that is the program
  • 14. type examples string "foo" character f integer 42, 42N floating point 3.14, 3.14M boolean true nil nil symbol foo, + keyword :foo, ::foo
  • 15. type properties examples list sequential (1 2 3) vector sequential and random access [1 2 3] map associative {:a 100! :b 90} set membership #{:a :b}
  • 16. Function Call semantics: fn call args (+ 2 2) structure: symbol longs list
  • 17. Function Definition define a fn fn name docstring (defn greet! "Returns a friendly greeting"! [your-name]! (str "Hello, " your-name)) arguments fn body
  • 18. …Still Just Data symbol symbol string (defn greet! "Returns a friendly greeting"! [your-name]! (str "Hello, " your-name)) vector list
  • 19. Complexities Avoided lots of syntax to learn ordering dependencies operator precedence code over data bias tedious metaprogramming
  • 20. Examples of Simplicity syntax protocols values and references
  • 23. Reversible interface implementation extension Jacket Belt String
  • 24. (defprotocol Reversible! (reverse [_]))! ! ! ! (defrecord ReversibleTie [a b])! ! ! ! (extend-protocol Reversible! ReversibleTie! (reverse [tie] (->ReversibleTie (:b tie) (:a tie)))! String! (reverse [s] (-> s! StringBuilder.! .reverse! .toString))) interface implementation extension
  • 25. Complexities Avoided adapter pattern wrapper pattern translator pattern monkey patching StringUtils note that these are all combinatorial
  • 26. Examples of Simplicity syntax protocols values and references
  • 30. Watch OO Flounder Me 182 nachos 184 instance? field? method? ??
  • 31. If you have more things than names, your design is broken.
  • 32. Clojure’s Simplicity Me 182 nachos 184 reference value pure function succession function new value
  • 33. Values and References (defprotocol Nachos! (yum [_] "eat some nachos"))! ! (defrecord Person [name lbs]! Nachos! (yum [person]! (update-in person [:lbs] + 2)))! ! (def me (atom (->Person "Stu" 182)))! ! (def me-before @me)! ! (swap! me yum)! ! (def me-after @me)
  • 34. Values and References (defprotocol Nachos! (yum [_] "eat some nachos"))! ! (defrecord Person [name lbs]! Nachos! (yum [person]! functional (update-in person [:lbs] + 2)))! ! (def me (atom (->Person "Stu" 182)))! ! (def me-before @me)! ! (swap! me yum)! ! (def me-after @me)
  • 35. Values and References (defprotocol Nachos! (yum [_] "eat some nachos"))! ! (defrecord Person [name lbs]! Nachos! (yum [person]! (update-in person [:lbs] + 2)))! ! (def me (atom (->Person "Stu" 182)))! ! (def me-before @me)! ! (swap! me yum)! ! (def me-after @me) update semantics
  • 36. Values and References (defprotocol Nachos! (yum [_] "eat some nachos"))! ! (defrecord Person [name lbs]! Nachos! (yum [person]! (update-in person [:lbs] + 2)))! ! (def me (atom (->Person "Stu" 182)))! ! (def me-before @me)! ! (swap! me yum)! ! (def me-after @me) multiple point-in-time values
  • 37. Complexities Avoided incidental complexity temporal reasoning single-threading locking defensive copying setter methods String vs. StringBuilder vs. StringBuffer note (again!) that these are all combinatorial
  • 38. Benefits of Clojure concision generality robustness agility
  • 39. Benefits of Clojure concision generality robustness agility
  • 41. indexOfAny Spec StringUtils.indexOfAny(null, *) = -1! StringUtils.indexOfAny("", *) = -1! StringUtils.indexOfAny(*, null) = -1! StringUtils.indexOfAny(*, []) = -1! StringUtils.indexOfAny("zzabyycdxx",['z','a']) = 0! StringUtils.indexOfAny("zzabyycdxx",['b','y']) = 3! StringUtils.indexOfAny("aba", ['z']) = -1
  • 42. // From Apache Commons Lang, http://commons.apache.org/lang/! public static int indexOfAny(String str, char[] searchChars) {! if (isEmpty(str) || ArrayUtils.isEmpty(searchChars)) {! return -1;! }! for (int i = 0; i < str.length(); i++) {! char ch = str.charAt(i);! for (int j = 0; j < searchChars.length; j++) {! if (searchChars[j] == ch) {! return i;! }! }! }! return -1;! } indexOfAny Impl
  • 43. public static int indexOfAny(String str, char[] searchChars) {! when (searchChars)! for (int i = 0; i < str.length(); i++) {! char ch = str.charAt(i);! for (int j = 0; j < searchChars.length; j++) {! if (searchChars[j] == ch) {! return i;! }! }! }! }! } - Corner Cases
  • 44. indexOfAny(str, searchChars) {! when (searchChars)! for (i = 0; i < str.length(); i++) {! ch = str.charAt(i);! for (j = 0; j < searchChars.length; j++) {! if (searchChars[j] == ch) {! return i;! }! }! }! }! } - Type Decls
  • 45. indexOfAny(str, searchChars) {! when (searchChars)! for (i = 0; i < str.length(); i++) {! ch = str.charAt(i); ! when searchChars(ch) i;! }! }! } + When Clause
  • 46. indexOfAny(str, searchChars) {! when (searchChars)! for ([i, ch] in indexed(str)) {! when searchChars(ch) i;! }! }! } + Comprehension
  • 47. Lispify (defn index-filter [pred coll]! (when pred ! (for [[idx elt] (indexed coll) :when (pred elt)] idx)))
  • 48. Benefits of Clojure concision generality robustness agility
  • 49. imperative functional searches strings searches any sequence matches characters matches any predicate returns first match returns lazy seq of all matches
  • 50. ; idxs of heads in stream of coin flips! (index-filter #{:h} [:t :t :h :t :h :t :t :t :h :h]) ! -> (2 4 8 9)! ! ; Fibonaccis pass 1000 at n=17! (first ! (index-filter #(> % 1000) (fibo)))! -> 17 + Generality
  • 51. Clojure programs can have fewer lines of code than OO programs have files
  • 52. Benefits of Clojure concision generality robustness agility
  • 53. imperative functional functions 1 1 classes 1 0 internal exit points 2 0 variables 3 0 branches 4 0 boolean ops 1 0 function calls* 6 3 total 18 4
  • 54. Benefits of Clojure concision generality robustness agility
  • 55. Plain Immutable Collection Objects (PICOs)
  • 56. PICOS Everywhere collections directories files XML JSON result sets web requests web responses sessions configuration metrics logs
  • 57. Consuming JSON What actors are in more than one movie currently topping the box office charts? http://developer.rottentomatoes.com/docs/ read/json/v10/Box_Office_Movies
  • 58. Consuming JSON find the JSON input! download it! parse json! walk the movies! accumulating cast! extract actor name! get frequencies! sort by highest frequency http://developer.rottentomatoes.com/docs/ read/json/v10/Box_Office_Movies
  • 59. Consuming JSON (->> box-office-uri! slurp! json/read-json! :movies! (mapcat :abridged_cast)! (map :name)! frequencies! (sort-by (comp - second))) http://developer.rottentomatoes.com/docs/ read/json/v10/Box_Office_Movies
  • 60. Consuming JSON ["Shiloh Fernandez" 2] ! ["Ray Liotta" 2] ! ["Isla Fisher" 2] ! ["Bradley Cooper" 2] ! ["Dwayne "The Rock" Johnson" 2] ! ["Morgan Freeman" 2] ! ["Michael Shannon" 2] ! ["Joel Edgerton" 2] ! ["Susan Sarandon" 2] ! ["Leonardo DiCaprio" 2] http://developer.rottentomatoes.com/docs/ read/json/v10/Box_Office_Movies
  • 61. PICOs for Big Data (defn my-data-2 [] (->> (pig/load-tsv "input.tsv") (pig/map (fn [[a b c]] {:sum (+ (Integer/valueOf a) (Integer/valueOf b)) :name c})) (pig/filter (fn [{:keys [sum]}] (< sum 5))))) ! => (pig/dump (my-data-2)) [{:sum 3, :name "foo"}] https://github.com/Netflix/PigPen
  • 62. Me 182 nachos 184 reference value pure function new value succession function
  • 63. Me t-1 transact t-2 connection db value pure function new db value ACID
  • 64. ACID data of record persistent data structures: “scm for business data” distributed, componentized, read scalable & elastic information and logic as PICOs in any peer process
  • 65. Connect and Query Connection conn = ! connect("datomic:ddb://us-east-1/mb/mbrainz");! ! ! Database db = conn.db();! ! ! Set results = q(..., db);! ! ! Set crossDbResults = q(..., db1, db2);! ! ! Entity e = db.entity(42);
  • 66. Connect and Query Connection conn = ! connect("datomic:ddb://us-east-1/mb/mbrainz");! ! ! Database db = conn.db();! ! ! Set results = q(..., db);! ! ! Set crossDbResults = q(..., db1, db2);! ! ! Entity e = db.entity(42); database is a lazily realized value, available to all peers equally
  • 68. Design ! specification of an artifact using components to meet goals subject to constraints
  • 69. Goal ! give skilled devs superpowers to build business software systems
  • 70. Goal ! give skilled devs superpowers to build business software systems
  • 71. Goal ! give skilled devs superpowers to build business software systems
  • 72. Constraints for wide adoption open source target established platforms for viability performance stability
  • 73. Constraints for wide adoption open source target established platforms for viability performance stability
  • 74. Open Source licensed under EPL contributor agreement artifacts in Maven Central not just language: bunch of libs too
  • 75. Might Surprise You we take patches, not pull requests we prefer designs over patches we prefer problem statements over designs
  • 76. Constraints for wide adoption open source target established platforms for viability performance stability
  • 77. Server Performance Clojure note: log scale! http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php
  • 78. Constraints for wide adoption open source target established platforms for viability performance stability
  • 79. 2009
  • 80. Maintaining Programming Clojure release date breakage* 1.0 05/2009 - 1.1 12/2009 None 1.2 08/2010 None 1.3 09/2011 Small 1.4 04/2012 None 1.5 03/2013 None 1.6 03/2014 None 1.7 TBD None
  • 81. One size does not fit all
  • 82. Examples of Simplicity syntax protocols values and references PICOs!
  • 83. Benefits of Clojure concision generality robustness agility
  • 85. Clojure http://clojure.com. The Clojure language. http://cognitect.com/. The company behind Clojure, ClojureScript, & Datomic. http://blog.cognitect.com/cognicast/. The Cognicast. http://bit.ly/clojure-bookshelf. 40 recommendations from Rich. http://clojure.in/. Planet Clojure. ! @stuarthalloway https://github.com/stuarthalloway/presentations/wiki. Presentations. https://github.com/stuarthalloway/exploring-clojure. Sample Code. http://pragprog.com/book/shcloj2/programming-clojure. Programming Clojure. mailto:[email protected]