SlideShare a Scribd company logo
1 of 196
Download to read offline
Life of an immutant
3 years with Clojure
About me
• @michaelklishin	

• github.com/michaelklishin
Setting expectations
Setting expectations
• This is an experience report
Setting expectations
• This is an experience report	

• Not a language primer
Setting expectations
• This is an experience report	

• Not a language primer	

• Assumes no familiarity except basic facts
Setting expectations
• This is an experience report	

• Not a language primer	

• Assumes no familiarity except basic facts	

• ~200 slides.This is gonna be fast.
Background
Background
• Data processing
Background
• Data processing	

• Scheduling systems
Background
• Data processing	

• Scheduling systems	

• Specialized Web crawlers
Background
• Data processing	

• Scheduling systems	

• Specialized Web crawlers	

• Billing, accounting
Background
• Data processing	

• Scheduling systems	

• Specialized Web crawlers	

• Billing, accounting	

• Infrastructure automation
Wanted
Wanted
• An environment that does not suck
Wanted
• An environment that does not suck is
operationally sane
Wanted
• An environment that does not suck is
operationally sane	

• A runtime that has decent tooling
(profilers, concurrency-related metrics, GC
metrics)
Wanted
• An environment that does not suck is
operationally sane	

• A runtime that has decent tooling
(profilers, concurrency-related metrics, GC
metrics)	

• A runtime that yields good baseline
performance
Wanted
• An environment that does not suck is
operationally sane	

• A runtime that has decent tooling
(profilers, concurrency-related metrics, GC
metrics)	

• A runtime that yields good baseline
performance	

• Painless upgrade paths
Wanted
• Community
Wanted
• Community	

• Benefit from existing libraries and tools
Wanted
• Community	

• Benefit from existing libraries and tools	

• Concurrency and parallelism
Wanted
• Community	

• Benefit from existing libraries and tools	

• Concurrency and parallelism	

• A productive, concise language
Wanted
JVM
JVM
JVM
• One of the most mature runtimes you can
find
JVM
• One of the most mature runtimes you can
find	

• Excellent tooling
JVM
• One of the most mature runtimes you can
find	

• Excellent tooling (VisualVM,YourKit, jstack,
jhat,VM/+XX flags, BTrace, …)
JVM
• One of the most mature runtimes you can
find	

• Excellent tooling	

• Excellent baseline performance
JVM
• One of the most mature runtimes you can
find	

• Excellent tooling	

• Excellent baseline performance	

• Multilingual: Clojure, Java, JRuby, Scala, JS
implementations
Clojure
Clojure
• Very high level, concise, expressive
Clojure
• Very high level, concise, expressive	

• Excellent concurrency/parallelism story
Clojure
• Very high level, concise, expressive	

• Excellent concurrency/parallelism story	

• Very good baseline performance
Clojure
• Very high level, concise, expressive	

• Excellent concurrency/parallelism story	

• Very good baseline performance	

• Consistent, well designed
Clojure
• Very high level, concise, expressive	

• Excellent concurrency/parallelism story	

• Very good baseline performance	

• Consistent, well designed	

• Decent tooling
Clojure
• Very high level, concise, expressive	

• Excellent concurrency/parallelism story	

• Very good baseline performance	

• Consistent, well designed	

• Decent tooling	

• Fun to work with (motivation)
Clojure
• No bored academics, built by a practicioner
Clojure: concurrency/
parallelism story
Clojure: concurrency/
parallelism story
• Immutable data structures by default
Clojure: concurrency/
parallelism story
• Immutable data structures by default	

• Identity/values separation
Clojure: concurrency/
parallelism story
• Immutable data structures by default	

• Identity/values separation	

• Concurrency-aware reference types
Clojure: concurrency/
parallelism story
• Immutable data structures by default	

• Identity/values separation	

• Concurrency-aware reference types	

• java.util.concurrent
Clojure: concurrency/
parallelism story
When I find myself in times of trouble	

Prof. Doug Lea comes to me	

Coding lines of wisdom	

j.u.c.
Clojure: concurrency/
parallelism story
• Immutable data structures by default	

• Identity/values separation	

• Concurrency-aware reference types	

• java.util.concurrent	

• Reactor,Akka, Disruptor, RxJava…
Clojure: concurrency/
parallelism story
• Async I/O: NIO, Netty,Vert.x…
Clojure: concurrency/
parallelism story
• You have choice
Clojure: concurrency/
parallelism story
• You have choice	

• Runtime parallelism (on JVM, CLR)
Clojure: concurrency/
parallelism story
• You have choice	

• Runtime parallelism (on JVM, CLR)	

• Hundreds, thousands of threads at the
same time
Clojure: baseline
performance
Clojure: baseline
performance
• What matters the most is what bytecode
the compiler produces
contextneeded.com
Clojure: baseline
performance
• What matters the most is what bytecode
the compiler produces	

• Java interop bytecode is typically the same
as produced by javac
Clojure: baseline
performance
• What matters the most is what bytecode
the compiler produces	

• Java interop bytecode is typically the same
as produced by javac	

• Watch out for reflective calls, primitive
boxing
Clojure: baseline
performance
• Optional type hints
Clojure: baseline
performance
• Optional type hints	

• Type inference in simple cases
Clojure: baseline
performance
(let [d (java.util.Date.)]	

d)
Clojure: baseline
performance
(let [d (java.util.Date.)]	

d)
Clojure: baseline
performance
• Optional type hints	

• Type inference in simple cases
Clojure: baseline
performance
• Optional type hints	

• Type inference in simple cases	

• If JVM can optimize your bytecode, things
run screaming fast
Clojure: baseline
performance
• Optional type hints	

• Type inference in simple cases	

• If JVM can optimize your bytecode, things
run screaming fast	

• From 2% (Java lib wrappers) to 200% (naïve
numerics heavy code, tight loops) penalty
compared to Java
Clojure: baseline
performance
• Immutable data structures have O(log32 n)
access complexity
Clojure: baseline
performance
• Immutable data structures have O(log32 n)
access complexity	

• Immutable data structures have associated
GC tax
Clojure: baseline
performance
• Immutable data structures have O(log32 n)
access complexity	

• Immutable data structures have associated
GC tax	

• Focus on exploiting parallelism over
squeezing µs from a single thread
Clojure: baseline
performance
• Poor startup time, excellent execution
performance
Clojure: baseline
performance
• Poor startup time, excellent execution
performance	

• Anecdotal evidence: 10 — 50 times
throughput improvements compared to
Ruby in real apps
Clojure: stability
Clojure: stability
• Have been using 1.3 since alpha1
Clojure: stability
• Have been using 1.3 since alpha1	

• Hit by 4 Clojure bugs in ~3 years
Clojure: stability
• Have been using 1.3 since alpha1	

• Hit by 4 Clojure bugs in ~3 years	

• 1 bug is an edge case that is not worth
fixing (I did something really stupid)
Clojure: stability
• Have been using 1.3 since alpha1	

• Hit by 4 Clojure bugs in ~3 years	

• 1 bug is an edge case that is not worth
fixing (I did something really stupid)	

• Alphas more solid than GA releases of
almost all other languages I’ve worked with
Clojure: stability
• Hit by 4 Clojure bugs in ~3 years	

• 1 bug is an edge case that is not worth
fixing (I did something really stupid)	

• Alphas more solid than GA releases of
almost all other languages I’ve worked with	

• Others (e.g.ThoughtWorks) report the
same experience
Clojure: stability
• Upgraded 28 apps & libraries from 1.3 to
1.4. Just 1 change due to a tricky 3rd party
library.The rest was a drop-in replacement.
Clojure: stability
• Upgraded 28 apps & libraries from 1.3 to
1.4. Just 1 change due to a tricky 3rd party
library.The rest was a drop-in replacement.	

• When upgrading is this easy, people do it
happily
Clojure: stability
• Upgraded 28 apps & libraries from 1.3 to
1.4. Just 1 change due to a tricky 3rd party
library.The rest was a drop-in replacement.	

• When upgrading is this easy, people do it
happily	

• No library binary compatibility hell some
other JVM languages suffer from
Clojure: stability
• Many active developers are conservative
with versioning & calling things “done”
Clojure: stability
• Many active developers are conservative
with versioning & calling things “done”	

• Fits JVM ecosystem maturity really well
Clojure: stability
• The real reason: Clojure is small and was
designed to be simple
Clojure: stability
• No monkey patching (there are features
that give you all the good parts of teh)
Clojure: consistency
Clojure: consistency
• Collections/sequences library is very
unified
Clojure: consistency
• Collections/sequences library is very
unified	

• Easy to implement your own data types
that work just like core Clojure types
Clojure: consistency
• Collections/sequences library is very
unified	

• Easy to implement your own data types
that work just like core Clojure types	

• Almost no “bad baggage” in the core
Clojure: consistency
• Collections/sequences library is very
unified	

• Easy to implement your own data types
that work just like core Clojure types	

• Almost no “bad baggage” in the core	

• The language was actually designed
Clojure: deployment
Clojure: deployment
• Pretty standard JVM deployment options
Clojure: deployment
• Pretty standard JVM deployment options	

• Compile everything AOT into a single jar
(“überjar”), including dependencies, assets,
etc
Clojure: deployment
• Pretty standard JVM deployment options	

• Compile everything AOT into a single jar
(“überjar”), including dependencies, assets,
etc	

• A tiny shell script + start-stop-daemon
Clojure: deployment
• Pretty standard JVM deployment options	

• Compile everything AOT into a single jar
(“überjar”), including dependencies, assets,
etc	

• A tiny shell script + start-stop-daemon	

• Chef or Capistrano
Clojure: deployment
• CloudFoundry
Clojure: deployment
• CloudFoundry	

• Heroku
Clojure: deployment
• CloudFoundry	

• Heroku	

• Immutant/JBoss AS
Clojure: deployment
• CloudFoundry	

• Heroku	

• Immutant/JBoss AS	

• OpenShift
Clojure: operations
Clojure: operations
• VisualVM, jstack, jheap, …
Clojure: operations
• VisualVM, jstack, jheap, …	

• nREPL
Clojure: operations
• VisualVM, jstack, jheap, …	

• nREPL	

• Remote REPL over HTTP(S)
Clojure: operations
• VisualVM, jstack, jheap, …	

• nREPL	

• Remote REPL over HTTP(S)	

• Not quite Erlang but still impressive
Clojure: operations
• VisualGC gives real insight into what is
going on with object allocation, tenuring,
death rate
Clojure: operations
• VisualGC gives real insight into what is
going on with object allocation, tenuring,
death rate	

• JVM DTrace support (Solaris, SmartOS,
FreeBSD, OS X)
Clojure: operations
• VisualGC gives real insight into what is
going on with object allocation, tenuring,
death rate	

• JVM DTrace support (Solaris, SmartOS,
FreeBSD, OS X)	

• BTrace
Clojure: community
Clojure: community
• Full of intelligent engineers who don’t give
two shits about Hacker News
Clojure: community
• Full of intelligent engineers who don’t give
two shits about Hacker News	

• Over 10 conferences to date
Clojure: community
• Full of intelligent engineers who don’t give
two shits about Hacker News	

• Over 10 conferences to date	

• ~10K people on the mailing list
Clojure: community
• Full of intelligent engineers who don’t give
two shits about Hacker News	

• Over 10 conferences to date	

• ~10K people on the mailing list	

• Users from small and not-so-small startups
to Fortune 50 corporations in finance,
biotech, retail
Clojure: fun to work
with
Clojure: fun to work
with
• Profoundly changes the way you think
Clojure: changes the
way you think
Clojure: changes the
way you think
• About managing your program state
Clojure: changes the
way you think
• About managing your program state	

• About the value of experimenting (REPL
driven development)
Clojure: changes the
way you think
• About managing your program state	

• About the value of experimenting (REPL
driven development)	

• About metaprogramming
Clojure: changes the
way you think
• About managing your program state	

• About the value of experimenting (REPL
driven development)	

• About metaprogramming	

• About isolating side effects
Clojure: changes the
way you think
Clojure: changes the
way you think
• Program = pure core + parts that
communicate with the outside world
(network, disk I/O)
Clojure: changes the
way you think
• Program = pure core + parts that
communicate with the outside world
(network, disk I/O)	

• Pure parts are ridiculously easy to reason
about, test, experiment with and reuse
Clojure: changes the
way you think
• Program = pure core + parts that
communicate with the outside world
(network, disk I/O)	

• Pure parts are ridiculously easy to reason
about, test, experiment with and reuse	

• Typical Rails app: 95% of methods have side
effects
Clojure: changes the
way you think
• Typical Clojure app: 40% of functions have
side effects
Clojure: changes the
way you think
• Typical Clojure app: 40% of functions have
side effects	

• Anecdotal evidence: 3-4 times less time
spent on tests
Clojure: changes the
way you think
• Typical Clojure app: 40% of functions have
side effects	

• Anecdotal evidence: 3-4 times less time
spent on tests	

• Moral of the story: make more of your
code not have side effects
Clojure: fun to work
with
• Profoundly changes the way you think
Clojure: fun to work
with
• Profoundly changes the way you think	

• Motivates you to learn
Clojure: fun to work
with
• Profoundly changes the way you think	

• Motivates you to learn	

• Easy things are easy, hard things are
possible
Clojure: fun to work
with
• Profoundly changes the way you think	

• Motivates you to learn	

• Easy things are easy, hard things are
possible	

• Wheels are already invented in clojure.core
or JDK
Clojure: fun to work
with
• Stable: fewer distractions, get in the flow
Clojure: fun to work
with
• Stable: fewer distractions, get in the flow	

• REPL driven development keeps you in the
flow for longer periods
Clojure: fun to work
with
• Stable: fewer distractions, get in the flow	

• REPL driven development keeps you in the
flow for longer periods	

• Polymorphism done right <3
Clojure: fun to work
with
“Clojure demands that you raise your game	

and rewards you greatly for it…”
Clojure: fun to work
with
• The community is full of smart and down
to earth people.
Clojure: use cases
Clojure: use cases
• Data processing
Clojure: use cases
• Data processing	

• Stream processing
Clojure: use cases
• Data processing	

• Stream processing	

• Micro-services
Clojure: use cases
• Data processing	

• Stream processing	

• Micro-services	

• Machine learning
Clojure: use cases
• Data processing	

• Stream processing	

• Micro-services	

• Machine learning	

• Web development
Clojure: misc
Clojure: misc
• Leiningen (leiningen.org) is excellent
Clojure: misc
• Leiningen (leiningen.org) is excellent	

• Deps management, build tool, custom tasks
are just Clojure functions
Clojure: misc
• Leiningen (leiningen.org) is excellent	

• Deps management, build tool, custom tasks
are just Clojure functions	

• Packages your code + all deps into a single
jar for deployment
Clojure: misc
• Leiningen (leiningen.org) is excellent	

• Deps management, build tool, custom tasks
are just Clojure functions	

• Packages your code + all deps into a single
jar for deployment	

• Makes it trivial to develop against multiple
Clojure versions
Clojure: misc
• clojars.org
Clojure: misc
• clojars.org	

• Deploy via SSH (SCP) or HTTPS
Clojure: misc
• clojars.org	

• Deploy via SSH (SCP) or HTTPS	

• Very easy to deploy snapshot releases
Clojure: misc
• clojars.org	

• Deploy via SSH (SCP) or HTTPS	

• Very easy to deploy snapshot releases	

• Clojars and Leiningen are maintained by the
same core team
Clojure: misc
• travis-ci.org support
Clojure: misc
• travis-ci.org support	

• Test against multiple JDKs
Clojure: ecosystem
• Feels a bit like Ruby circa 2009
Clojure: ecosystem
• Feels a bit like Ruby circa 2009	

• But with the entire JVM ecosystem at your
reach
Clojure: ecosystem
• Feels a bit like Ruby circa 2009	

• But with the entire JVM ecosystem at your
reach	

• And Leiningen + clojars.org
Clojure: ecosystem
• Feels a bit like Ruby circa 2009	

• But with the entire JVM ecosystem at your
reach	

• And Leiningen + clojars.org	

• Community ~ doubles every year in size
Clojure: ecosystem
• Feels a bit like Ruby circa 2009	

• But with the entire JVM ecosystem at your
reach	

• And Leiningen + clojars.org	

• Community ~ doubles every year in size	

• Google for “The State of Clojure” survey
Clojure: ecosystem
• ~35% of people come from Java, ~35% from
Ruby or Python
Clojure: ecosystem
• ~35% of people come from Java, ~35% from
Ruby or Python	

• Libraries, not frameworks
Clojure: ecosystem
• ~35% of people come from Java, ~35% from
Ruby or Python	

• Libraries, not frameworks	

• Decent libraries just for almost every
problem
Clojure: ecosystem
• ~35% of people come from Java, ~35% from
Ruby or Python	

• Libraries, not frameworks	

• Decent libraries just for almost every
problem	

• 15 books, 2 outdated (cover 1.2)
Clojure: ecosystem
• ~35% of people come from Java, ~35% from
Ruby or Python	

• Libraries, not frameworks	

• Decent libraries just for almost every
problem	

• 15 books, 2 outdated (cover 1.2)	

• clojure-doc.org, tryclj.com, …
Clojure: ecosystem
Clojure: what sucks
Clojure: what sucks
• clojure.org
Clojure: what sucks
• clojure.org	

• Documentation (guides, the ref is mostly
OK, books are great)
Clojure: what sucks
• clojure.org	

• Documentation (guides, the ref is mostly
OK, books are great)	

• Compiler messages can be cryptic
Clojure: what sucks
• clojure.org	

• Documentation (guides, the ref is mostly
OK, books are great)	

• Compiler messages can be cryptic	

• JVM startup time + code compilation on
each run (without REPL or tools such as
Drip)
Clojure: what sucks
• Paper contributor agreement
ClojureWerkz
ClojureWerkz
“A growing collection of open source	

Clojure libraries…”
ClojureWerkz
“It just werkz…”
ClojureWerkz
• Modern targets (Clojure 1.5+, JDK 6)
ClojureWerkz
• Modern targets (Clojure 1.5+, JDK 6)	

• Feature rich
ClojureWerkz
• Modern targets (Clojure 1.5+, JDK 6)	

• Feature rich	

• Well documented
ClojureWerkz
• Modern targets (Clojure 1.5+, JDK 6)	

• Feature rich	

• Well documented	

• Friendly license (EPL, the same as Clojure)
ClojureWerkz
• Modern targets (Clojure 1.5+, JDK 6)	

• Feature rich	

• Well documented	

• Friendly license (EPL, the same as Clojure)	

• Tested against multiple Clojure versions, 3
JDKs on travis-ci.org
ClojureWerkz
clojurewerkz.org
ClojureWerkz
• Projects reuse a lot of Java libraries
ClojureWerkz
• Projects reuse a lot of Java libraries	

• Which are often officially supported (e.g.
RabbitMQ, ElasticSearch, MongoDB, Riak,
Reactor)
“ClojureWerkz stuff is really improving my	

Clojure experience, which is rapidly becoming	

my language of choice…”
Clojure: the takeaway
Clojure: the takeaway
• A lot of merit of its own
Clojure: the takeaway
• A lot of merit of its own	

• Great stability
Clojure: the takeaway
• A lot of merit of its own	

• Great stability	

• Hosted (symbiotic) language is a great thing
Clojure: the takeaway
• A lot of merit of its own	

• Great stability	

• Hosted (symbiotic) language is a great thing	

• Don’t fear the JVM
Clojure: the takeaway
• A lot of merit of its own	

• Great stability	

• Hosted (symbiotic) language is a great thing	

• Don’t fear the JVM	

• Immutability is essential for sane
concurrent programming
Clojure: the takeaway
• Clojure greatly rewards those who choose
to use it
The real reason?
The real reason?
???
clojure.core/lazy-cat
Thank you
• @michaelklishin	

• github.com/michaelklishin	

• clojurewerkz.org	

• michael@clojurewerkz.org

More Related Content

What's hot

High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014Derek Collison
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threadsmperham
 
London devops logging
London devops loggingLondon devops logging
London devops loggingTomas Doran
 
The Wix Microservice Stack
The Wix Microservice StackThe Wix Microservice Stack
The Wix Microservice StackTomer Gabel
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data storesTomas Doran
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itMichael Klishin
 
Gophers Riding Elephants: Writing PostgreSQL tools in Go
Gophers Riding Elephants: Writing PostgreSQL tools in GoGophers Riding Elephants: Writing PostgreSQL tools in Go
Gophers Riding Elephants: Writing PostgreSQL tools in GoAJ Bahnken
 
Scalable and Available, Patterns for Success
Scalable and Available, Patterns for SuccessScalable and Available, Patterns for Success
Scalable and Available, Patterns for SuccessDerek Collison
 
Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTokuhiro Matsuno
 
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common Lisp
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common LispLisp Meet Up #31, Clake: a GNU make-like build utility in Common Lisp
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common Lispmasayukitakagi
 
RabbitMQ Data Ingestion at Craft Conf
RabbitMQ Data Ingestion at Craft ConfRabbitMQ Data Ingestion at Craft Conf
RabbitMQ Data Ingestion at Craft ConfAlvaro Videla
 
Fun with Functional Programming in Clojure
Fun with Functional Programming in ClojureFun with Functional Programming in Clojure
Fun with Functional Programming in ClojureCodemotion
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lispfukamachi
 
The Actor Model - Towards Better Concurrency
The Actor Model - Towards Better ConcurrencyThe Actor Model - Towards Better Concurrency
The Actor Model - Towards Better ConcurrencyDror Bereznitsky
 
Improvements in RabbitMQ
Improvements in RabbitMQImprovements in RabbitMQ
Improvements in RabbitMQAlvaro Videla
 
State of Akka 2017 - The best is yet to come
State of Akka 2017 - The best is yet to comeState of Akka 2017 - The best is yet to come
State of Akka 2017 - The best is yet to comeKonrad Malawski
 
Message:Passing - lpw 2012
Message:Passing - lpw 2012Message:Passing - lpw 2012
Message:Passing - lpw 2012Tomas Doran
 
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...Flink Forward
 
Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Charles Nutter
 

What's hot (20)

High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threads
 
London devops logging
London devops loggingLondon devops logging
London devops logging
 
The Wix Microservice Stack
The Wix Microservice StackThe Wix Microservice Stack
The Wix Microservice Stack
 
Empowering developers to deploy their own data stores
Empowering developers to deploy their own data storesEmpowering developers to deploy their own data stores
Empowering developers to deploy their own data stores
 
Troubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use itTroubleshooting RabbitMQ and services that use it
Troubleshooting RabbitMQ and services that use it
 
Gophers Riding Elephants: Writing PostgreSQL tools in Go
Gophers Riding Elephants: Writing PostgreSQL tools in GoGophers Riding Elephants: Writing PostgreSQL tools in Go
Gophers Riding Elephants: Writing PostgreSQL tools in Go
 
Scalable and Available, Patterns for Success
Scalable and Available, Patterns for SuccessScalable and Available, Patterns for Success
Scalable and Available, Patterns for Success
 
Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
 
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common Lisp
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common LispLisp Meet Up #31, Clake: a GNU make-like build utility in Common Lisp
Lisp Meet Up #31, Clake: a GNU make-like build utility in Common Lisp
 
RabbitMQ Data Ingestion at Craft Conf
RabbitMQ Data Ingestion at Craft ConfRabbitMQ Data Ingestion at Craft Conf
RabbitMQ Data Ingestion at Craft Conf
 
Fun with Functional Programming in Clojure
Fun with Functional Programming in ClojureFun with Functional Programming in Clojure
Fun with Functional Programming in Clojure
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lisp
 
The Actor Model - Towards Better Concurrency
The Actor Model - Towards Better ConcurrencyThe Actor Model - Towards Better Concurrency
The Actor Model - Towards Better Concurrency
 
Improvements in RabbitMQ
Improvements in RabbitMQImprovements in RabbitMQ
Improvements in RabbitMQ
 
State of Akka 2017 - The best is yet to come
State of Akka 2017 - The best is yet to comeState of Akka 2017 - The best is yet to come
State of Akka 2017 - The best is yet to come
 
Scala profiling
Scala profilingScala profiling
Scala profiling
 
Message:Passing - lpw 2012
Message:Passing - lpw 2012Message:Passing - lpw 2012
Message:Passing - lpw 2012
 
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...Flink Forward SF 2017: Tzu-Li (Gordon) Tai -  Joining the Scurry of Squirrels...
Flink Forward SF 2017: Tzu-Li (Gordon) Tai - Joining the Scurry of Squirrels...
 
Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014Bringing Concurrency to Ruby - RubyConf India 2014
Bringing Concurrency to Ruby - RubyConf India 2014
 

Viewers also liked

Clojure: The Art of Abstraction
Clojure: The Art of AbstractionClojure: The Art of Abstraction
Clojure: The Art of AbstractionAlex Miller
 
Clojure Intro
Clojure IntroClojure Intro
Clojure Introthnetos
 
Troubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesTroubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesMichael Klishin
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data ScienceMike Anderson
 
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Stefan Richter
 
Clojure: an overview
Clojure: an overviewClojure: an overview
Clojure: an overviewLarry Diehl
 
Writing DSL in Clojure
Writing DSL in ClojureWriting DSL in Clojure
Writing DSL in ClojureMisha Kozik
 
Crank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxCrank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxJim Crossley
 
Introducing Immutant
Introducing Immutant Introducing Immutant
Introducing Immutant Jim Crossley
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web FrameworksJoe Kutner
 
Hypervisor Selection in CloudStack and OpenStack
Hypervisor Selection in CloudStack and OpenStackHypervisor Selection in CloudStack and OpenStack
Hypervisor Selection in CloudStack and OpenStackTim Mackey
 
Erlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-SubramanyaErlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-SubramanyaHakka Labs
 
Winning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test CycleWinning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test CycleRusty Klophaus
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John StevensonJAX London
 

Viewers also liked (20)

Clojure: The Art of Abstraction
Clojure: The Art of AbstractionClojure: The Art of Abstraction
Clojure: The Art of Abstraction
 
Scalable Open Source
Scalable Open SourceScalable Open Source
Scalable Open Source
 
Clojure Intro
Clojure IntroClojure Intro
Clojure Intro
 
RabbitMQ Operations
RabbitMQ OperationsRabbitMQ Operations
RabbitMQ Operations
 
Troubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issuesTroubleshooting common oslo.messaging and RabbitMQ issues
Troubleshooting common oslo.messaging and RabbitMQ issues
 
Clojure for Data Science
Clojure for Data ScienceClojure for Data Science
Clojure for Data Science
 
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
Using Clojure, NoSQL Databases and Functional-Style JavaScript to Write Gext-...
 
Open source responsibly
Open source responsiblyOpen source responsibly
Open source responsibly
 
Clojure: an overview
Clojure: an overviewClojure: an overview
Clojure: an overview
 
Writing DSL in Clojure
Writing DSL in ClojureWriting DSL in Clojure
Writing DSL in Clojure
 
ETL in Clojure
ETL in ClojureETL in Clojure
ETL in Clojure
 
Crank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBoxCrank Up Your Apps With TorqueBox
Crank Up Your Apps With TorqueBox
 
Introducing Immutant
Introducing Immutant Introducing Immutant
Introducing Immutant
 
Devignition 2011
Devignition 2011Devignition 2011
Devignition 2011
 
Immutant
ImmutantImmutant
Immutant
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
Hypervisor Selection in CloudStack and OpenStack
Hypervisor Selection in CloudStack and OpenStackHypervisor Selection in CloudStack and OpenStack
Hypervisor Selection in CloudStack and OpenStack
 
Erlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-SubramanyaErlang - Because s**t Happens by Mahesh Paolini-Subramanya
Erlang - Because s**t Happens by Mahesh Paolini-Subramanya
 
Winning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test CycleWinning the Erlang Edit•Build•Test Cycle
Winning the Erlang Edit•Build•Test Cycle
 
Clojure made-simple - John Stevenson
Clojure made-simple - John StevensonClojure made-simple - John Stevenson
Clojure made-simple - John Stevenson
 

Similar to 3 years with Clojure

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and AbstractionsMetosin Oy
 
Software Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with ScalaSoftware Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with ScalaBrian Topping
 
Adopting Elixir in a 10 year old codebase
Adopting Elixir in a 10 year old codebaseAdopting Elixir in a 10 year old codebase
Adopting Elixir in a 10 year old codebaseMichael Klishin
 
Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)Martijn Verburg
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Metosin Oy
 
Clojure Conj 2014 - Paradigms of core.async - Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian GambleClojure Conj 2014 - Paradigms of core.async - Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian GambleJulian Gamble
 
The Economies of Scaling Software
The Economies of Scaling SoftwareThe Economies of Scaling Software
The Economies of Scaling SoftwareAbdelmonaim Remani
 
Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...SQALab
 
The economies of scaling software - Abdel Remani
The economies of scaling software - Abdel RemaniThe economies of scaling software - Abdel Remani
The economies of scaling software - Abdel Remanijaxconf
 
Into the Land of lambda, One Programmer's Journey Into Functional Programming
Into the Land of lambda, One Programmer's Journey Into Functional ProgrammingInto the Land of lambda, One Programmer's Journey Into Functional Programming
Into the Land of lambda, One Programmer's Journey Into Functional ProgrammingMike Pence
 
Kevin Whinnery: Write Better JavaScript
Kevin Whinnery: Write Better JavaScriptKevin Whinnery: Write Better JavaScript
Kevin Whinnery: Write Better JavaScriptAxway Appcelerator
 
A web app in pure Clojure
A web app in pure ClojureA web app in pure Clojure
A web app in pure ClojureDane Schneider
 
WebGL Camp 4 - A3 3D Engine
WebGL Camp 4 - A3 3D EngineWebGL Camp 4 - A3 3D Engine
WebGL Camp 4 - A3 3D Engineaerotwist
 
My Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicMy Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicApollo Clark
 
Seattlerb why jruby
Seattlerb why jrubySeattlerb why jruby
Seattlerb why jrubysnacktime
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptTroy Miles
 

Similar to 3 years with Clojure (20)

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slides
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and Abstractions
 
Software Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with ScalaSoftware Engineering Thailand: Programming with Scala
Software Engineering Thailand: Programming with Scala
 
Adopting Elixir in a 10 year old codebase
Adopting Elixir in a 10 year old codebaseAdopting Elixir in a 10 year old codebase
Adopting Elixir in a 10 year old codebase
 
Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)Modern Java Concurrency (OSCON 2012)
Modern Java Concurrency (OSCON 2012)
 
33rd degree
33rd degree33rd degree
33rd degree
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014
 
Clojure Conj 2014 - Paradigms of core.async - Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian GambleClojure Conj 2014 - Paradigms of core.async - Julian Gamble
Clojure Conj 2014 - Paradigms of core.async - Julian Gamble
 
The Economies of Scaling Software
The Economies of Scaling SoftwareThe Economies of Scaling Software
The Economies of Scaling Software
 
Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...Generalization in Auto-Testing. How we put what we had into new Technological...
Generalization in Auto-Testing. How we put what we had into new Technological...
 
The economies of scaling software - Abdel Remani
The economies of scaling software - Abdel RemaniThe economies of scaling software - Abdel Remani
The economies of scaling software - Abdel Remani
 
Polyglot Grails
Polyglot GrailsPolyglot Grails
Polyglot Grails
 
Into the Land of lambda, One Programmer's Journey Into Functional Programming
Into the Land of lambda, One Programmer's Journey Into Functional ProgrammingInto the Land of lambda, One Programmer's Journey Into Functional Programming
Into the Land of lambda, One Programmer's Journey Into Functional Programming
 
Kevin Whinnery: Write Better JavaScript
Kevin Whinnery: Write Better JavaScriptKevin Whinnery: Write Better JavaScript
Kevin Whinnery: Write Better JavaScript
 
A web app in pure Clojure
A web app in pure ClojureA web app in pure Clojure
A web app in pure Clojure
 
WebGL Camp 4 - A3 3D Engine
WebGL Camp 4 - A3 3D EngineWebGL Camp 4 - A3 3D Engine
WebGL Camp 4 - A3 3D Engine
 
My Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is MagicMy Little Webap - DevOpsSec is Magic
My Little Webap - DevOpsSec is Magic
 
Seattlerb why jruby
Seattlerb why jrubySeattlerb why jruby
Seattlerb why jruby
 
Enterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScriptEnterprise Strength Mobile JavaScript
Enterprise Strength Mobile JavaScript
 
Cucumber in Practice(en)
Cucumber in Practice(en)Cucumber in Practice(en)
Cucumber in Practice(en)
 

Recently uploaded

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfCionsystems
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 

Recently uploaded (20)

Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
Exploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the ProcessExploring iOS App Development: Simplifying the Process
Exploring iOS App Development: Simplifying the Process
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Active Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdfActive Directory Penetration Testing, cionsystems.com.pdf
Active Directory Penetration Testing, cionsystems.com.pdf
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 

3 years with Clojure