Roman Gonzalez will introduce Elm, an opinionated language that is inspired on a simplified Haskell syntax. Elm provides all the guarantees that good statically typed languages give, plus:
- An architecture that enforces correct design from the get-go
- A set of libraries that use types to ensure foreseeable errors are always dealt with
- Futuristic user experience on tooling for developers (error messages that are actuall helpful)
- Semantic versioning guarantees from package manager
We will explore Elm’s architecture, and go through a few examples, we will also cover limitations in comparison to other languages.
- What is Elm?
- Begginings of Elm
- Created by Evan Czaplicki 4 years ago (so not that new in terms of Front-End tech)
- Based out of an PHd thesis work, so serious background
- Gateway drug to Haskell
- Have you ever tried Haskell and gave up because you where not able to do anything real world with it?
- Less powerful version of Haskell (get a small sub-set of Haskell features and exploit them as much as you can)
- Begginings of Elm
- When to Elm?
- Great for the majority of JS requirements out there
- Has a very opinionated architecture, however it is flexible enough to model many different domains in it
- Why Elm?
- Development UX is a main concern
- Error messages is way ahead from any other error reporter out there
- There is a versioned error database where you can add suggestions for better error messages
- Package Manager guarantees semantic versioning
- Did I say it is very opinionated?
- Probably there is never going to be JSx
- notes: elm-html or go home (for now)
- elm-format is pretty rad
- Probably there is never going to be JSx
- How does the Elm Architecture work?
- Do you know redux? Well is like redux, but done right
- sub-components don’t share references with parents
- can’t have mutable state
- side-effects can only happen in one place
- Diagram section here with Elm architecture
- This is what is going to be represented in the diagram:
- A
Model
type: represents all the data stored in the view logic - A
Cmd
type: represents all the commands that can be performed on theModel
- An
init
tuple: provides an initialModel
value for the component, and a batchCmd
that get returned when performing the side-effects you need to get started right away- note: explain what are “side-effects” in this context
- An
update
function: Applies theCmd
operation to theModel
value, returning a tuple with a possibly alteredModel
and a batch ofCmd
to perform more side-effects - A
view
function: Receives aModel
value and returns an Html view whose callback emitsCmd
that are going to be received by theupdate
function
- A
- This is what is going to be represented in the diagram:
- Do you know redux? Well is like redux, but done right
- Development UX is a main concern
- Elm APIs
- You have to deal with all the known error scenarios before your code
compiles
- HTTP Example (vs Javascript)
- You have to deal with all the known error scenarios before your code
compiles
- Interoperability with JS is limited
- Communication is similar to an HTTP server, want to use that JS library for UI? out of luck
- Native libraries make development less reliable
- If you plan to release a library that has native support, get prepared to wait
- Can’t support React (yet)
- Huge deal breaker for us @ Unbounce
- We have been working on a PR proposal to allow it, maybe you can +1 it?
- Well integrated with Emacs, Sublime & Atom
- Can be used with webpack
- If Elm re-invents the wheel, there is normally a good explanation on why that is
- How Unbounce discovered Elm?
Disclaimer: 3rd Party Integrations & API Team Perspective
- We knew we wanted to use the VirtualDom concept, and we were comfortable
with Rx, so we decided to merge those two libraries together to implement
our UI code
- notes: we knew about the existence of Redux, but none of us had used it before; we truly believed Rx + VirtualDom was all we needed.
- We also tried (partially) Facebook’s flux gradual type system in our code,
but it didn’t hold up too long because it was difficult to integrate
existing work
- notes: also given that it is optional typing, none of use really enforced is usage and didn’t get true benefits out of that
- What could wrong?
- Spent a long time doing framework like code, not focusing on our Business Domain problems (also known as undifferentiated heavy lifting)
- There was awesome tooling on React libraries and Redux, we were missing out some goodies
- Other teams bited the bullet and went React + Redux, and now cross-squads techs were out of sync (no easy reusability)
- Half of our journey (after so much pain) we decided to look out for
alternatives
- Natural choice was React + Redux, halfway on the Redux tutorial we found out it was inspired from a language called Elm
- Given my personal familiarity with Haskell I started investigating what was it all the fuzz about.
- :mindblown gif:
- Re-implemented part of our current project in Elm
- :mindblown gif:
- First time compilation, first time it worked
- Components were separated on a sane fashion
- Side-effects were separated from pure transformations and it was easier to understand what was going on
- Some big refactorings in the middle, (around 1000 lines of code) worked on the first valid compilation
- We knew we wanted to use the VirtualDom concept, and we were comfortable
with Rx, so we decided to merge those two libraries together to implement
our UI code
- This is awesome! Did we use it in the end?
- big slide with NOPE and grumpy cat picture
- We still needed to do on-boarding to the rest of the team, and even though 50% of the work was done, bus factor was going to be a big issue
- When not to Elm
- You depend heavily on JS libraries that provide views (jQuery + plugins, etc.)
- There is no such thing a Polymorphic interfaces (unless you code on the
compiler)
- Who here is familiar with Haskell’s typeclasses, Java interfaces?
- Give a comparison between Haskell & Elm regarding this
- If multiple components on an UI tree require the same data, you need to traverse it all the way down, this kind of calls normally yells “need more Monadz”
- Are you going to use for future projects?
- There is a high chance, we need to allow Elm to render Facebook’s React views, and this require a pull request to be accepted (slow process)
When to Elm
for me.code-plumbing errors
like manual regression testing for NPEI hope you go into the definition of
native
because it means different things to different types of developers.If people don't know Redux, should there be some explanation like: