71
Design by Contract in Elixir “Let it crash” meets “it shouldn’t crash”

Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Design by Contract in Elixir

“Let it crash” meets “it shouldn’t crash”

Page 2: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Guillermo Iguarán Suarez

ride.com@guilleiguaran

Elba Sánchez Márquez ride.com

@elbasanchezm

Page 3: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Bugs and crashes

how Did we gEt here

Page 4: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Did you know?

There are really expensive software errors

NASA’s Mars Climate Orbiter

non-SI metric units

Page 5: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Did you know?

There are really expensive software errors

Heathrow Terminal 5 Opening

Page 6: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Did you know?

There are really expensive software errors

The Mariner 1 Spacecraft

Page 7: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Did you know?

There are really expensive software errors

The Morris worm

Page 8: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Did you know?

There are really expensive software errors

Page 9: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

"Ariane 501 Cluster" by Phrd/de:user:Stahlkocher - Own work. Licensed under CC BY-SA 3.0

Ariane 5 flight 501

Its fastest engines exploited a bug that was not found in

previous models

Page 10: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

What happened?

the software had tried to cram a 64-bit number into a 16-bit space

Page 11: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

What happened?

Page 12: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Blame management

Blame the language

They couldn’t

Page 13: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

They couldn’t

Blame implementation

Blame testing

Page 14: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

the reuse specification

They blamed

Page 15: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

horizontal_bias <= maximum_bias

Page 16: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

A little bit of theory

Back to design by contract…

Page 17: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

History

Design by contract has its roots in work on formal verification, formal specification and

Hoare logic.

Page 18: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

History

Hoare described the use of representation invariants and abstract functions to prove

correctness of abstract data types

Page 19: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Basics of Hoare logic

Formal reasoning about program correctness using pre and postconditions

Hoare Logic is at the core of the deductive approach of the DbC.

Page 20: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Basics of Hoare logic

Page 21: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Basics of hoare logic

• Provides axioms and inference rules

• There are rules for concurrency, procedures, jumps, and pointers.

Page 22: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

DbC vs. Testing

Unit tests

• Used to verify that the software works correctly

• Hard to detect all possible edge cases during development.

Design by contract (DbC)

• Software correctness methodology

• Programmatically asserts the change in state caused by a piece of a program

Page 23: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

What is Design by Contract?

Each party benefits and accepts obligations

One party’s benefits are the other party’s obligation

It is described so that both parties understand what would be guaranteed without saying how.

Obligations Rights

Passenger

Buy Airline ticket, bring accepted

baggage and be at airport 2 hours

before

Reach destination

Airline Bring passenger to destination

No need to carry passenger who is late, or has unacceptable baggage, or hasn’t paid

ticket

Page 24: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Structure of a Contract

Page 25: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Structure of a contract

PRECONDITIONRequires clause

Page 26: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Structure of a contract

POSTCONDITIONEnsures Clause

Page 27: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Structure of a contract

IF PRECONDITION TRUE

EXECUTE

POSTCONDITION TRUE

Page 28: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Structure of a contract

IF PRECONDITION FALSE

NOTHING

Page 29: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Example

https://www.eiffel.com/values/design-by-contract/introduction/

Page 30: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Example

https://www.eiffel.com/values/design-by-contract/introduction/

Page 31: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Example

https://www.eiffel.com/values/design-by-contract/introduction/

Page 32: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Example

https://www.eiffel.com/values/design-by-contract/introduction/

Page 33: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

in Ariane’s case

Where the precondition (require…) states

clearly and precisely what the input must

satisfy to be acceptable.

Eiffel Version

Page 34: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

how can this help?

Page 35: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

–K. Fujino Vice President of NEC Corporation’s C&C Software

Development Group

“When quality is pursued, productivity follows.”

Page 36: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

And also we look for…

Reliability

Correctness Robustness

Page 37: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Advantages

• Assertions (preconditions and postconditions in particular) can be automatically turned on during testing.

Page 38: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Advantages

• Assertions can remain turned on during execution, triggering an exception if violated.

Page 39: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Advantages

• Assertions are a prime component of the software and its automatically produced documentation.

Page 40: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Language support

There are several implementations of DbC libraries for some languages

Page 41: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Language support

And languages with native support

Page 42: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

and now with Elixir

Page 43: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Metaprogramming In Elixir

Macros

Book

by C

hris

McC

ord

- O'R

eilly

Page 44: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Macros Rules

Rule #1 Don’t write Macros

Page 45: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Macros Rules

Rule #2 Use Macros gratuitously

Page 46: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Macros

• A macro is code that writes code

• Many constructs in Elixir are macros (def, if, unless, defmodule)

• Elixir code runs at compile time and can be used to manipulate language AST.

Page 47: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Abstract Syntax Tree

Macros

Page 48: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Abstract Syntax Tree

Macros

Page 49: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Abstract Syntax Tree

Macros

Page 50: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Abstract Syntax Tree

Macros

Page 51: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Quote Macro

Page 52: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Quote Macro

Page 53: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Quote Macro

Page 54: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Quote Macro

Page 55: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Unquote Macro

Page 56: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Back to DbC

• We used Elixir macros to extend the language adding support for basic DbC constructs.

• We tagged existing functions with “requires” and “ensures” tags.

• Macros manipulate function body to insert precondition and postconditions inside of functions.

Page 57: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

What we had to do

Page 58: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

demo

Page 59: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously
Page 60: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Precondition

Page 61: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Postcondition

Page 62: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously
Page 63: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Precondition

Page 64: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Postcondition

Page 65: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Command

Page 66: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously
Page 67: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Github: epsanchezma elixir-contracts

https://goo.gl/5f9GiU

Page 68: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

FURTHER WORK

Generate test-cases from Contracts

Add configuration options to turn-on/off contracts in development and production

Generate automated documentation from contracts

Generate QuickCheck tests

Page 69: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

To conclude

Design by contract does not replace regular testing strategies

Contracts add an extra grade of reliability

It’s not a silver bullet

Page 70: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

References

Ariane’s case: http://se.inf.ethz.ch/~meyer/publications/computer/ariane.pdf

DbC History: http://c2.com/cgi/wiki?DesignByContract

Hoare Logic: https://www.cs.cmu.edu/~aldrich/courses/654-sp07/slides/7-hoare.pdf

DbC: http://ansymore.uantwerpen.be/system/files/uploads/courses/SE3BAC/06DesignContract.pdf, http://web.cse.ohio-state.edu/software/2221/web-sw1/extras/slides/09.Design-by-Contract.pdf

Examples: https://www.eiffel.com/

Page 71: Design by contracts · Metaprogramming In Elixir Book by Chris McCord - Macros O'Reilly. Macros Rules Rule #1 Don’t write Macros. Macros Rules Rule #2 Use Macros gratuitously

Thank you!