Polyglot and Poly-paradigm Programming for Better Agility

90
Polyglot and Poly-paradigm Programming for Better Agility Dean Wampler [email protected] @deanwampler 1

Transcript of Polyglot and Poly-paradigm Programming for Better Agility

Page 1: Polyglot and Poly-paradigm Programming for Better Agility

Polyglot and Poly-paradigm Programming

for Better AgilityDean Wampler

[email protected]@deanwampler

1

Page 2: Polyglot and Poly-paradigm Programming for Better Agility

2

Co-author,Programming

Scala

programmingscala.com

Page 3: Polyglot and Poly-paradigm Programming for Better Agility

Polyglot: many languages

Poly-paradigm: many modularity

paradigms3

Page 4: Polyglot and Poly-paradigm Programming for Better Agility

Today’s applications:

•Are networked,

•Have graphical and “service” interfaces,

flickr.com/photos/jerryjohn 4

Page 5: Polyglot and Poly-paradigm Programming for Better Agility

Today’s applications:

•Persist data,

•Must be resilient and secure,

•Must scale,flickr.com/photos/jerryjohn 5

Page 6: Polyglot and Poly-paradigm Programming for Better Agility

Today’s applications:

•… and must do all that by Friday.

flickr.com/photos/jerryjohn 6

Page 7: Polyglot and Poly-paradigm Programming for Better Agility

flickr.com/photos/deanwampler

Mono-paradigm:

Object-Oriented Programming:

right for all problems?

7

Page 8: Polyglot and Poly-paradigm Programming for Better Agility

twitter.com/photos/watchsmart

Is one languagebest for all domains?

Monolingual

8

Page 9: Polyglot and Poly-paradigm Programming for Better Agility

Symptoms of Monocultures

• Why is there so much XML in my Java?

• Why do I have similar persistence code scattered all over my code base?

• How can I scale my application by a factor of 1000!

• My application is hard to extend!

• I can’t respond quickly when requirements change!

9

Page 10: Polyglot and Poly-paradigm Programming for Better Agility

switch (elementItem){ case "header1:SearchBox" : { __doPostBack('header1:goSearch',''); break; } case "Text1": { window.event.returnValue=false; window.event.cancel = true; document.forms[0].elements[n+1].focus(); break; } ...

thedailywtf.com

Pervasive IT problem:

Too much

code!10

Page 11: Polyglot and Poly-paradigm Programming for Better Agility

SolutionsThe symptoms reflect

common problemswith similar solutions.

11

Page 12: Polyglot and Poly-paradigm Programming for Better Agility

I need extensibility and agility.

Specific problem #1

flickr.com/photos/arrrika 12

Page 13: Polyglot and Poly-paradigm Programming for Better Agility

Symptoms• Features take too long to implement.

•We can’t react fast enough to change.

•Uses want to customize the system themselves.

13

Page 14: Polyglot and Poly-paradigm Programming for Better Agility

SolutionApplication

Kernel of Components

User Scripts Built-in Scripts

(C Components) + (Lisp scripts) = Emacs

14

Page 15: Polyglot and Poly-paradigm Programming for Better Agility

Components + Scripts =

Applicationssee John Ousterhout, IEEE Computer, March ’98

15

Page 16: Polyglot and Poly-paradigm Programming for Better Agility

Kernel Components•Statically-typed language:

•C, C++, Java, C#, ...

•Compiled for speed, efficiency.

•Access OS services, 3rd-party libraries.

•Lower developer productivity.16

Page 17: Polyglot and Poly-paradigm Programming for Better Agility

Scripts•Dynamically-typed language:

•Ruby, Python, JavaScript, Lua, ...

• Interpreted for agility.

•Performance less important.

•Glue together components.

•Raise developer productivity. 17

Page 18: Polyglot and Poly-paradigm Programming for Better Agility

In practice, the boundaries between components and scripts

are not so distinct...

18

Page 19: Polyglot and Poly-paradigm Programming for Better Agility

Ola Bini’s Three Layers•Domain layer

• Internal and External DSLs.

•Dynamic layer

•e.g., JRuby, application code

•Stable layer

• JVM + generic libraries19

Page 20: Polyglot and Poly-paradigm Programming for Better Agility

Other Examples of This Approach

•UNIX/Linux + shells.

•Also find, make, grep, ...

•Have their own DSLs.

•Tektronix Oscilloscopes: C + Smalltalk.

20

Page 21: Polyglot and Poly-paradigm Programming for Better Agility

Other Examples...

• Adobe Lightroom: C++ + Lua.

• 40-50% written in Lua.

• NRAO Telescopes: C + Python.

• Google Android: Linux + libraries (C) + Java.

21

Page 22: Polyglot and Poly-paradigm Programming for Better Agility

<view-state id="displayResults" view="/searchResults.jsp"> <render-actions> <bean-action bean="phonebook" method="search"> <method-arguments> <argument expression="searchCriteria"/> </method-arguments> <method-result name="results" scope="flash"/> </bean-action> </render-actions> <transition on="select" to="browseDetails"/> <transition on="newSearch" to="enterCriteria"/> </view-state></flow>

XML in Java

Why not replace XML with JavaScript , Groovy

or JRuby??

22

Page 23: Polyglot and Poly-paradigm Programming for Better Agility

Other Examples:Multilingual VM’s

• On the JVM:

• JRuby, Groovy, Jython, Scala.

• Ruby on Rails on JRuby.

23

Page 24: Polyglot and Poly-paradigm Programming for Better Agility

Other Examples:Multilingual VM’s

• Dynamic Language Runtime (DLR).

• Ruby, Python, ... on the .NET CLR.

24

Page 25: Polyglot and Poly-paradigm Programming for Better Agility

Benefits

• Optimize performance where it matters.

• Optimize productivity, extensibility and agility everywhere else.

Application

Kernel of Components

User Scripts Built-in Scripts

25

Page 26: Polyglot and Poly-paradigm Programming for Better Agility

DisadvantagesApplication

Kernel of Components

User Scripts Built-in Scripts

26

• More complexity with 2+ languages (idioms, tools, ...).

Page 27: Polyglot and Poly-paradigm Programming for Better Agility

An underutilized architecture!

Application

Kernel of Components

User Scripts Built-in Scripts

27

Page 28: Polyglot and Poly-paradigm Programming for Better Agility

Parting Thought...

Cell phone makers are drowning in C++.

(One reason the IPhone and Android are interesting.)

28

Page 29: Polyglot and Poly-paradigm Programming for Better Agility

I don’t know what my code is

doing.

flickr.com/photos/dominic99

Specific problem #2

Page 30: Polyglot and Poly-paradigm Programming for Better Agility

The intent of our code

is lost in the noise.

30

Page 31: Polyglot and Poly-paradigm Programming for Better Agility

Symptoms

•Business logic is obscure when I read the code.

•The system breaks when we change it.

•Translating requirements to code is error prone.

31

Page 32: Polyglot and Poly-paradigm Programming for Better Agility

Solution #1

Write less code.

Profound statement.

32

Page 33: Polyglot and Poly-paradigm Programming for Better Agility

Less Code• Means problems are smaller:

• Maintenance

• Duplication (DRY)

• Testing

• Performance

• etc.33

Page 34: Polyglot and Poly-paradigm Programming for Better Agility

How to WriteLess Code

• Root out duplication.

• Use economical designs.

• Functional vs. Object-Oriented?

• Use economical languages.

34

Page 35: Polyglot and Poly-paradigm Programming for Better Agility

Solution #2

Separate implementation details from business logic.

35

Page 36: Polyglot and Poly-paradigm Programming for Better Agility

Domain Specific Languages

Make the code read like “structured” domain prose.

36

Page 37: Polyglot and Poly-paradigm Programming for Better Agility

Example DSLinternal { case extension when 100...200 callee = User.find_by_extension extension unless callee.busy? then dial callee else voicemail extension

when 111 then join 111

when 888 play weather_report('Dallas, Texas')

when 999 play %w(a-connect-charge-of 22 cents-per-minute will-apply) sleep 2.seconds play 'just-kidding-not-upset' check_voicemail end}

Adhearsion=

Ruby DSL+

Asterisk+

Jabber/XMPP+...

37

Page 38: Polyglot and Poly-paradigm Programming for Better Agility

DSL Advantages• Code looks like domain prose:

• Is easier to understand by everyone,

• Is easier to align with the requirements,

• Is more succinct.38

Page 39: Polyglot and Poly-paradigm Programming for Better Agility

DSL Disadvantages

• DSLs are hard to design, test and debug.

• Some people are bad API designers.

39

Page 40: Polyglot and Poly-paradigm Programming for Better Agility

Brueghel the Elder

A DSL Tower of Babel?40

Page 41: Polyglot and Poly-paradigm Programming for Better Agility

Parting Thought...

Perfection is achieved, not when there is nothing left to add,

but when there is nothing left to remove.

-- Antoine de Saint-Exupery

41

Page 42: Polyglot and Poly-paradigm Programming for Better Agility

Parting Thought #2...

Everything should be made as simple as possible, but not simpler.

-- Albert Einstein

42

Page 43: Polyglot and Poly-paradigm Programming for Better Agility

Corollary:

Entia non sunt multiplicanda praeter necessitatem.

-- Occam’s Razor

43

Page 44: Polyglot and Poly-paradigm Programming for Better Agility

Corollary:

All other things being equal, the simplest solution is the best.

-- Occam’s Razor

44

Page 45: Polyglot and Poly-paradigm Programming for Better Agility

We have code duplication everywhere.

Specific problem #3

deanwampler

Page 46: Polyglot and Poly-paradigm Programming for Better Agility

Symptoms

• Persistence logic is embedded in every “domain” class.

• Error handling and logging is inconsistent.

Cross-Cutting Concerns.46

Page 47: Polyglot and Poly-paradigm Programming for Better Agility

Solution

Aspect-Oriented Programming

47

Page 48: Polyglot and Poly-paradigm Programming for Better Agility

Removing Duplication

• In order, use:

• Object or functional decomposition.

• DSLs.

• Aspects.

48

Page 49: Polyglot and Poly-paradigm Programming for Better Agility

An Example...

49

Page 50: Polyglot and Poly-paradigm Programming for Better Agility

class BankAccount attr_reader :balance def credit(amount) @balance += amount end def debit(amount) @balance -= amount end … end

Clean Code

50

Page 51: Polyglot and Poly-paradigm Programming for Better Agility

But, real applications need:def BankAccount attr_reader :balance def credit(amount) ... end def debit(amount) ... endend

Transactions

Persistence

Security

51

Page 52: Polyglot and Poly-paradigm Programming for Better Agility

def credit(amount) raise “…” if unauthorized() save_balance = @balance begin begin_transaction() @balance += amount persist_balance(@balance) …

So credit becomes…

52

Page 53: Polyglot and Poly-paradigm Programming for Better Agility

… rescue => error log(error) @balance = saved_balance ensure end_transaction() endend

53

Page 54: Polyglot and Poly-paradigm Programming for Better Agility

We’re mixing multiple domains,

Transactions

Persistence

Security

with fine-grained intersections.

“Problem Domain”

“tangled” code

“scattered” logic54

Page 55: Polyglot and Poly-paradigm Programming for Better Agility

Objects alone don’t prevent tangling.

55

Page 56: Polyglot and Poly-paradigm Programming for Better Agility

Aspect-Oriented Programming:

restore modularity for cross-cutting concerns.

56

Page 57: Polyglot and Poly-paradigm Programming for Better Agility

Aspects restore modularity byencapsulating the intersections.

Transactions

Persistence

Security

TransactionAspect

PersistenceAspect

SecurityAspect

57

Page 58: Polyglot and Poly-paradigm Programming for Better Agility

If you have used the Spring Framework,

you have used aspects.

58

Page 59: Polyglot and Poly-paradigm Programming for Better Agility

• Ruby

• Aquarium

• Facets

• AspectR

Aspect-Oriented Tools

• Java

• AspectJ

• Spring AOP

• JBoss AOP

shameless plug

59

Page 60: Polyglot and Poly-paradigm Programming for Better Agility

I would like to write…

Before returning the balance, read the current value from the database.

Before accessing the BankAccount, authenticate and authorize the user.

After setting the balance, write the current value to the database.

60

Page 61: Polyglot and Poly-paradigm Programming for Better Agility

I would like to write…

Before returning the balance, read the current value from the database.

Before accessing the BankAccount, authenticate and authorize the user.

After setting the balance, write the current value to the database.

61

Page 62: Polyglot and Poly-paradigm Programming for Better Agility

require ‘aquarium’class BankAccount … after :writing => :balance \ do |context, account, *args| persist_balance account end …

reopen class

add new behavior

Aquarium

aquarium.rubyforge.org62

Page 63: Polyglot and Poly-paradigm Programming for Better Agility

def credit(amount) @balance += amountend

Back to clean code

63

Page 64: Polyglot and Poly-paradigm Programming for Better Agility

Parting Thought...

Metaprogramming can be used for some aspect-like functionality.

DSLs can solve some cross-cutting concerns.

(We’ll come back to that.)

64

Page 65: Polyglot and Poly-paradigm Programming for Better Agility

Specific problem #4

flickr.com/photos/wolfro54

Our service must be

available 24x7 and highly scalable.

Page 66: Polyglot and Poly-paradigm Programming for Better Agility

Symptoms

• Only one of our developers really knows how to write thread-safe code.

• The system freezes every few weeks or so.

66

Page 67: Polyglot and Poly-paradigm Programming for Better Agility

Solution

Functional Programming

67

Page 68: Polyglot and Poly-paradigm Programming for Better Agility

Functional Programming

•Works like mathematical functions.

Fibonacci Numbers:

F(n) = F(n-1) + F(n-2)where: F(1) = 1 and F(2) = 1

68

Page 69: Polyglot and Poly-paradigm Programming for Better Agility

Functional Programming

• Variables are assigned once.

• Functions are side-effect free.

• They don’t alter state.

y = sin(x)

69

Page 70: Polyglot and Poly-paradigm Programming for Better Agility

Functional Programming Makes Concurrency

Easier

• Nothing to synchronize.

• Hence no locks, semaphores, mutexes...

70

Page 71: Polyglot and Poly-paradigm Programming for Better Agility

Which fits your needs?

Object Oriented

71

Account

deposit(...)withdraw(...)

CheckingAccount

deposit(...)withdraw(...)

SavingsAccount

deposit(...)withdraw(...)

??

deposit(...)withdraw(...)

Page 72: Polyglot and Poly-paradigm Programming for Better Agility

list map

fold/

reduce

filter

Which fits your needs?

Functional

72

Page 73: Polyglot and Poly-paradigm Programming for Better Agility

flickr.com/photos/deanwampler

What if you’re

doing cloud computing?

73 deanwampler

Is it object-orientedor functional?

Page 74: Polyglot and Poly-paradigm Programming for Better Agility

FP Code is declarative rather thanimperative.

F(n) = F(n-1) + F(n-2)where: F(1) = 1 and F(2) = 1

74

Page 75: Polyglot and Poly-paradigm Programming for Better Agility

… and so are DSLs.

class Customer < ActiveRecord::Base has_many :accounts

validates_uniqueness_of :name, :on => create, :message => ‘Evil twin!’end

75

Page 76: Polyglot and Poly-paradigm Programming for Better Agility

A FewFunctional Languages

76

Page 77: Polyglot and Poly-paradigm Programming for Better Agility

Erlang

• Ericsson Functional Language.

• For distributed, reliable, soft real-time, highly concurrent systems.

• Used in telecom switches.

• 9-9’s reliability for AXD301 switch.

77

Page 78: Polyglot and Poly-paradigm Programming for Better Agility

Erlang

• No mutable variables and side effects.

• All IPC is optimized message passing.

• Very lightweight and fast processes.

• Lighter than most OS threads.

• Let it fail philosophy.

78

Page 79: Polyglot and Poly-paradigm Programming for Better Agility

Scala

• Hybrid: object and functional.

• Targets the JVM and .NET.

• “Endorsed” by James Gosling at JavaOne.

• Used at Twitter, Linkedin, ...

• Could be the most popular replacement for Java.

79

Page 80: Polyglot and Poly-paradigm Programming for Better Agility

Clojure

• Functional, with principled support for mutability.

• Targets the JVM and .NET.

• Best buzz?

• Too many good ideas to name here...

80

Page 81: Polyglot and Poly-paradigm Programming for Better Agility

Functional Languages in Production

• Erlang

• CouchDB

• GitHub

• Jabber/XMPP server ejabberd.

• Amazon’s Simple DB.

81

Page 82: Polyglot and Poly-paradigm Programming for Better Agility

Functional Languages in Production

• OCaml

• Jane Street Capital

• Scala

• Twitter

• LinkedIn

82

Page 83: Polyglot and Poly-paradigm Programming for Better Agility

Parting Thought...

Is a hybrid object-functional language better than using an object language

with a functional language??

e.g., Scala vs. Java + Erlang??

83

Page 84: Polyglot and Poly-paradigm Programming for Better Agility

Polyglot and Poly-paradigmProgramming (PPP)for Better Agility

Recap:

84

Page 85: Polyglot and Poly-paradigm Programming for Better Agility

Disadvantages of PPP

• N tool chains, languages, libraries, “ecosystems”, ...

• Impedance mismatch between tools.

• Different meta-models.

• Overhead of calls between languages.

85

Page 86: Polyglot and Poly-paradigm Programming for Better Agility

Advantages of PPP

• Can use the best tool for a particular job.

• Can minimize the amount of code required.

• Can keep code closer to the domain.

• Encourages thinking about architectures.

• E.g., decoupling between “components”.

86

Page 87: Polyglot and Poly-paradigm Programming for Better Agility

Everything old is new again.

• Functional Programming Comes of Age.

• Dr. Dobbs, 1994

• Scripting: Higher Level Programming for the 21st Century.

• IEEE Computer, 1998

• In Praise of Scripting: Real Programming Pragmatism.

• IEEE Computer, 2008

Page 88: Polyglot and Poly-paradigm Programming for Better Agility

Why go mainstream now?

• Rapidly increasing pace of development,

➔ Scripting (dynamic languages), DSLs.

• Pervasive concurrency (e.g., Multicore CPUs)

➔ Functional programming.

• Cross-cutting concerns

➔ Aspect-oriented programming.

88

Page 89: Polyglot and Poly-paradigm Programming for Better Agility

Common Themes

• Less code is more.

• Keep the code close to the domain: DSLs.

• Be declarative rather than imperative.

• Minimize side effects and mutable data.

89

Page 90: Polyglot and Poly-paradigm Programming for Better Agility

Thank You!

[email protected]

• Watch for the IEEE Software special issue, Sept/Oct 2010.

• polyglotprogramming.com

90