f691ad9a
extracted
SUPER AIN'T SUPER From OOP To FP and Beyond! - Nick Sutterer - wroc_love.rb 2018.txt1f9aaeeba927| Status | Model | Tokens (in/out) | Duration | Cost | Nodes/edges | Read set (nodes/edges) | Time |
|---|---|---|---|---|---|---|---|
| completed | claude-opus-4-7 |
259,929
/
12,038
98,262 cached · 16,377 write
|
202.0s | - | 23 / 44 | 105 / 7 | 2026-04-17 16:18 |
hello everyone welcome to Russ love
[Laughter]
sorry I'm not Aaron Patterson I'm not
good at pants but I thought this was so
funny I had to put this in my
presentation and I'm not gonna start the
presentation you as usual with drunk
photos I'm gonna start with this
beautiful backdrop that I created with
[ __ ] on Linux not on Mac OS as you can
see I'm quite talented now with like
fonts and stuff it looks pretty cool so
I'm not going to show and Ray in
underpants I'm not going to show anyone
drunk from last night
I'm going to tell you so I learned how
to eat Tata and Poland's basically you
mix two of the most dangerous things in
the world raw like raw meat and raw egg
and then you put stuff on top and then
you mix it and it's delicious when I
came to Poland and what it takes is that
an extremely extremely talented Polish
person to put salt and pepper on top in
a specific way that's how you eat
tartare so today I had this and it was
great I'm feeling amazing I want you I
want to draw here or what no it wasn't
that salty because I already had a salty
breakfast which ah it was assault it was
at a pun hey hey hey come on stage so I
want to draw your attention to my
beautiful backdrop again because I'm so
proud of it took me like 10 minutes to
get the scaling and everything so I'm
lots of people were laughing saying ha
ha ha et cetera is coming he doesn't
have a talk titled he's probably gonna
talk about trailers it's like super
surprising that people talk about their
projects when they are invited to
conferences I'm not gonna talk about
railways this slide is all these people
remind me I have stickers and lanyards
pretty cool for Trailblazer so if if you
like tribe if you hate trail visit just
come get a sticker and I don't know like
burn it on camera or something like that
again like look at this like okay so
today is a beautiful day it's Saturday I
guess so I'm I'm planning to walk you
through my life from
basically a day one of my programming at
Korea if you can call it Korea to to
today which and trying to explain how I
like how my programming style changed
from like the stuff we learn in like
books and and so on to you know stuff we
were just discussing in the panel with
like event sourcing and components and
all this kind of stuff
so when people ask me when I started
programming I always say I was eight
because it sounds cool I have no idea
when I started programming but this is
my friends and myself I can you spot me
like this is me about eight years old so
this when I started programming
officially so my first programming book
was a book called tricks of the Mack
game programming gurus back then I
thought it's pronounced gurus but that
was because I didn't speak English and
so I wanted to start programming to to
program it on game basically and I was
using a Mac before it was cool and this
book was basically teaching programming
on Mac and I remember exactly that I
learned like C++ with a different book
and I was really struggling with like I
loved the concept of a function I kind
of got the idea but I didn't understand
why you can like do you have the
parameter like int a and int B and then
use a and B in that function but when
you call that function the a and B can
have different names for example VAR a
or something that it might example so I
was talking to my dad and he kind of
explained me like hey man just think of
just think of a function as a component
you call and you throw in the arguments
or like the values you want to process
and the implementer of the function like
myself you don't care about how that
variables call on the outside so that's
kind of how I understood okay a in my
function can actually be called variable
from another planet in the out in in the
calling code so and that was kind of for
me that was a like a traumatic event in
a positive way so I kind of I kind of
answered hey cool so I can use functions
to
and capsulate behavior and the outside
world doesn't know what I'm doing in
that function because I can name my
variables the way I want in the outside
world doesn't know about it and I don't
give a [ __ ] about how the outside world
the caller is processing variables
because I can like it's just two
different components and so I took that
stuff from C++ my C++ code thank you I'm
I I didn't know what I was doing I agree
I was just copying stuff from C++ books
to C++ compilers I don't know the name
anymore but and it worked so but I love
the idea of functions and I took this to
Perl because I started programming Perl
this was the actual first programming
book you should all read it not and kind
of am from Perl I learned programming
and then I started to use Ruby rails and
Ruby and I was instantly unsatisfied
with the way functions you know and
encapsulation was handled in rails not
in Ruby Ruby has functions Ruby has
methods Ruby is all this kind of stuff
but in rails it was always like I don't
know like there was one big thing
handling everything so I started rails
and it was like absolutely amazing but I
was struggling to find the architectural
ideas behind it and so I started writing
my first gem cut cells and what cells
did was super simple like you know you
have like a huge web page this is Amazon
this is not I didn't write anything and
so so for example you have a sidebar and
you want to have that sidebar on every
page so in rails the only way was like a
partial and controller and before filter
and you share logic in the controller
and all this kind of stuff so basically
I wanted to have a class you know like
this don't worry about the actual code
so basically I wanted to have this in an
object and that object exactly like a
function doesn't know what's happening
on the outside and the outside doesn't
know what's happening in the cell so I
kind of wrote this blah blah blah you
know cell jam and you had like a class
and the class could render could be
rendered with a helper so you said
render cell and then it would call that
function and a partial or sidebar or an
entire page would be rendered and the
the rendering didn't know anything about
the other
ring and what was pretty awesome was
that you could do that you could attest
that stuff in isolation yeah like so I
could render my cell and it would do
exactly what it will do in production
because I had to pass in the
dependencies and I got out HTML as a
HTML string that was pretty cool and the
cool thing is I liked it so here
actually that was like a 2008 or
something let me check that here 2008 so
he emailed me like hey this is actually
a cool idea and so he liked the idea of
encapsulation so just to remind you
that's the same guy who now tells
everyone that concerns are a great idea
and you should push as much code as
possible into one class called their
model in rails and so he liked it it was
pretty proud of myself and nothing ever
happened after this so so the next
proper Oliver was approaching was reform
so I kind of hid the idea hey there's a
forum in a web UI why the hell would I
have this forum in my models and stuff
like why don't I let's introduce a new
class for that model and that class is
only mapping to that forum you just saw
so you define properties you can define
collections blah blah blah blah blah you
could define validations only for that
forum yeah like contextual validation in
a class and the cool thing was you could
test that in isolation again and you
wouldn't know what is happening inside
and the inside wouldn't know what
happening outside and the cool thing is
that you can test that without having to
run a [ __ ] HTTP request sorry for my
words I'm already wholly aggressive so
yeah she's liked it high enough okay
yeah he kind of is so we hit this chat
on my email again and he said hey I can
see how this is helpful and actually I
don't like accepts nice attributes for I
forgot before and so I I'm still
wondering why do we have it in rails if
they don't like it but yeah it's cool to
have features and put them into the
society and people think it's good but
it's bad anyway so I kind of work with
rails and I kind of like I wrote some
gems and stuff and I didn't really see
why are we making our life so difficult
with this like monolithic thinking like
one controller for everything and
my code sits in the model and model is
an object and where are the boundaries
no idea because it's cool like it's just
fast and you can build Basecamp and you
can make millions of dollars if you're
good at it
good this is so and the problem was that
I introduced objects and I introduced
encapsulation but we still have this
problem of now I have those objects now
I have my like scope but how do I tweak
those objects how to customize them yeah
like a cell is a cell but if you want to
have another cell phone I don't know for
Christmas with a different theme how do
you customize it if you have a new form
with a different validation how do you
do that and you're always like since you
have an object you have to in the Ruby
you have to use inheritance or beautiful
mix-ins and you just you know use the
mechanics that we have in Ruby because
Ruby hasn't changed in more than 10
years or 20 years so we we always use
like extend and super and you override
methods I'm gonna talk about this in a
little bit and you kind of have really
low level and lower level when I say low
level now I mean lower level like
mechanics to customize objects so we
have objects now which is great but
we're still struggling to customize them
and then they introduce refinements I'm
a hundred percent sure no one in this
room has ever used refinements because
they are so [ __ ] hard to understand
and like no one knows what they do and
come on raise your hand
ah oh my goodness I'm leaving give me a
drink so yeah oh so refined it was a
nice idea but it didn't work so it's
like customizing object add run to him
and compare time we don't have that
concept in Ruby yet and so I stood on a
mountain with a cloth on my hands and I
liked looking towards the horizon the
Sun was rising and so what do you when
when you're unhappy with something you
write your own framework of course
because again it's a great tool on there
whether you can do like your own cover
and by the way I'm not going to talk
thirty minutes I'm gonna talk longer and
so so so the idea was I had the cells
and reform another
so I kind of started okay now let's
focus on business logic like how do we
get rid of really big controllers how do
we get rid of like models that are you
doing your drugs again this guy right so
so I started to think about let's make
controllers great again and I started to
introduce these constant operations or
inner controller instead of having like
500 lines of code you would just
delegate to a specific object we call it
operation and it's from this gem called
trailblazer and so if you look at it you
really only call a function again like
it's it's it's the same concept as we
have with cell or with the form object
or something like that you call an
object and that object does something
and it's not like crazy it's just have
responsibilities scoped okay and so the
operation was well accepted but lots of
people thought it's like a monolithic
object and it has too many things and
it's basically just an object delegating
to other objects that's an Orchestrator
yeah and here's like an example of in
Trevor's at one point one the object was
doing lots of stuff and with this big
DSL and like you hit the process method
and in the process method you would do
your business logic and you know like
it's creating a model and validating and
all this kind of stuff the cool thing
was you could test it in isolation
that's great and there what do you have
objects you can actually test them
without having to run an entire HTTP
stack and that's why I like testing and
ehh doesn't so so you could run this
operation test it test the outcome test
the side effects done and this stuff
will work exactly the same way in
production you could also use operations
as a factory so if I want to create a
comment the way it's done in my web
application
I run the operation that does that and I
have the exact same application set in
my test which is amazing because Factory
Girl is an approach to make your test
State like your application state but
it's not because we forgot about the is
admin flag or something like that so you
run that operation everything is exactly
as it is in production the problem was
in 1.1 we had this process method and in
that method you would run you drag your
Ruby code like literal ruby code and you
know if you had if you had lots of logic
you had to split it up in
to methods and classes and it was all up
to you so the idea of tribes' a 1.1 was
you run this object and everything
behind that is up to you and then like
it was a nightmare because you had to
know the exact scald stack yeah you know
I mean you don't have to understand all
the methods but like when you run an
object there will be methods call the
methods calling method or mebiner and if
you want to override something specific
for example there was always a policy
check run automatically in an operation
yeah like is this user allowed to create
a comment and you had to know where this
happens and what is the call second what
method you have to override and then
your own code would be run in the
process method and again here this call
ii need to know where what is called how
and it was super messy like it if you
want to do over at specific behavior for
example hey
in that case i don't want to run a
policy you had to override the check
policy method but you had to know that
it's called check policy with a bash and
you had to know where and it was just
horrible yeah so um what so the example
with the policy is right here like if
you over at something you have to
inherit yeah so I'm inheriting and I'm
overriding actually this is a complete
whatever so so if you have to over at
that specific method because you have to
know that method exists in that class
and it's called at that point and then
you can do stuff like you called super
and super will call the original
implementation but it only works if you
include a module because if you don't
include module its whatever it's like
super messy and like I started to
realize hey maybe maybe Ruby doesn't
give me the tools out of the box i I
need you know like if I want to have
workflows and I want to be able to
override specific parts maybe I need a
different tool set now and this was
especially if funny if you had like
multiple modules included they were all
over at the same method and you know
like the last included module overrides
the method and then if you call super it
will call the other method before and if
you want to skip something for example
it's impossible in Ruby you can't say
let's call the original method and the
method from the third module include
sighs it's just [ __ ] basically and
but these are the mechanics Ruby gives
us and it's I'm not blaming Ruby and
blaming my bad design choice basically
yeah and every time I talk to people
they all told me this is Ruby this is
how you do it and just do it like that
you know modules are awesome inheritance
is great do it like this is what we have
like this is how we do it okay so I've
kept they're moving alright so the idea
and red laser was have those operations
you call them there's no other way to
invoke them you call basically a
function and the function will delegate
to different other stakeholder objects
without knowing what they do again like
it's an encapsulation some people from
rails don't know this and then the
problem was we had this cost I get to
know what is happening in the operation
it was really hard to communicate that
you have to document that [ __ ] and
documentation sucks and so you always
had this object floating around and
people could call methods on the
operation instance in the wrong order
and it was just terrible the [ __ ]
cool thing was DHH liked it not I I
didn't paste the email he sent me but so
[Music]
so did I already mention I'm gonna talk
more than thirty minutes that's great so
I kept you know working with code and I
hated the call stack and I hated to use
super and modules to override stuff and
to know what operation does and what
order and it's kind of hey didn't you
promise me to give me a B on my talk
here we go so I slowly moved into the
direction of you know functional
programming like I realized hey maybe
object-oriented programming maybe I just
hit the boundaries maybe my style of
writing software is not it's warm right
okay open please so and so I kind of
left the left the the thinking of
object-oriented programming actually
paratus own it's one of my great
inspirations I kind of nudged me to that
direction did I tell you that I can say
two things in Polish one thing is
oscillator
the other one is Tina Pierre doll
[Laughter]
just delicious so I kind of moved into
the direction of let's but like
functional programming is nothing you
know crazy or something you just call
something and it does something and
gives you something back yeah so
basically you you throws arguments into
an object on a into an object method in
that case in Ruby because we don't have
like functions and this function does
something gives you something back and
that was basically what we already had
with trailblazer like you call an
operation there's no way like calling an
operation with the dot bracket which
looks really weird but it's basically
like calling a function y and you had
your input and you throw that into the
operation and you you get a result back
and we just defined that the result has
a state successful and not successful
and the result also allows you to access
the state that comes out of the function
like the output of the function is
basically accessible by the result
object so the the the idea was already
kind of function I didn't realize it but
my great inspiration killed us Alyssa
made me wear it so what we wanted to get
rid of in Trevor's
2.0 was that you don't hear this call
stack master that we had I wanted to get
rid of that and so basically what we did
is instead of letting the user define
their methods and call call call call
call we gave them a DSL that allows them
to define workflows yeah so for example
like you have that pass and step and
fail in ba-ba-ba-ba-ba so in the end of
the day what you will get is a diagram
or a flow like this like you look at it
and you know exactly what's happening I
don't have to explain it right because
everyone here's really smart so without
the details so what inspired me to kind
of come up with that DSL is I didn't
invent it because I'm not smart I'm just
stealing a lot of ideas and put them in
my own gems and then I say Nick cetera
and it's like another thing so I saw
that for what's that the right way
oriented programming exactly so that's a
function of parent from dotnet community
Microsoft who I really
so I think Microsoft and so the railway
oriented programming is basically you
define two tracks and then you run logic
and if something like fails in a certain
step it jumps to the left track to the
error track and nothing of the of the
right track is executed anymore so it
kind of stops the execution and goes to
the error handling and you can have as
many tracks as many steps on each track
as you want yeah this is kind of
beautiful illustration again my gym
skills are amazing i also use
libreoffice for this and it took me like
20 minutes to do to prepare this wait
should we look at it again like just
because it's so beautiful okay so m so
you call this operation this railway
animation is running and you can AskMe
result hey were you successful meaning
you ended on the upper track or were
you're not successful meaning you ended
on the lower track and you can ask the
result for a state from the inside so
I'm gonna talk about this in a second so
that was kind of the idea and the DSL
you can like it or you can not like it
but it was can people kind of started
accepting it okay that's pretty cool you
can you can define workflows without
having to know how to wire Ruby
functions together and without calling
them manually so every step in
trailblazer is a callable object or an
instance method so I'm only showing the
instance method because it's the easiest
to understand if you just define
everything every step as a method the
step gets a context object and keyword
arguments from the outside and basically
what you do in that step is up to you
but you write state to the context
object and that is exactly what you will
retrieve in the end in the result object
yeah so there's an instance variables no
like weird global variables you write to
the context object and then you can ask
the context object for that state you
wrote in on the inside yeah so that's
the only way to communicate with the
outer world in an operation and it's
it's a concept that was really well
accepted in in the community basically
the other thing is depending on the
result of a state true or false means
true we stay on the right on the
successful track and the upper track
false means you jump to the lower track
remember my beautiful animation the
thing is that
we also allowed to do compositions yeah
so you can nest those operations and
that's lots of people started over using
I mean it's great to use composition but
I wasn't aware that people love
compositions which is amazing like
people used the nesting feature
everywhere so it's like they built
reusable components and use the reusable
components in every operation so
basically by using nested you kind of
built a composition and when you call it
when you use nested what happens is
basically this is the nested activity
that is being run and so the the nesting
operation calls that activity and then
you can why are the ends of that nested
activity two different connections and
kind of process different outcomes in a
different way so this is all i bla bla
bla they look at this picture you see
lots of arrows is great so again we had
functions which are operations and steps
and the only writable or mutable object
was this context object that we passed
through all those steps and if you have
compositions you pass in the same
context object and operations can write
to the context object and the only way
to communicate is by the context object
so that was pretty well received but
this is just normal JPEG I just copied
it so it didn't take me longer than 15
seconds to like prepare I'm not good at
3d modeling so what we also allowed
people and this is kind of the learning
from you know overriding methods with
modules and calling super is like now
that we have this beautiful structuring
in steps let's allow people for example
to exchange a step here like I'm gonna
I'm gonna replace notify happen with
another step called mail so you had to
use subclass it and you can use the
replace option and replace a certain
step like impossible in Ruby with super
or something like that you can't replace
something specific
or you can do stuff like inserting a
step with the like just by using the DSL
and saying after blah blah blah or
before blah blah blah you could
at steps to that workflow in a sub class
without interfering with original code
again almost impossible in Ruby unless
you use like include in the right order
it's just a nightmare
was it prepend prepared yeah exactly but
then prepend is and again a feature no
one uses in Ruby I don't know what oh
I'm wrong hey let's talk about event
sourcing so another thing you could do
is the for example you could delete and
now you come with your pre pendant
there's no way like in Ruby you can't
delete a method that is in a specified
work for drivers you could just say okay
delete that last step in my subclass
with the delete option just as an
example and so you basically so you have
all the mechanics to rearrange your
workflow to customize a workflow
out-of-the-box so we didn't have this
nightmare of including objects and sorry
modules and all this kind of stuff yeah
many people appreciated it and lots of
people said how can you this can stuff
like we have Ruby I want to be my own
like I want to be in control of my
workflows like don't do this with Ruby
we've been writing Ruby the way we were
writing it since 2001
how can you introduce this kind of stuff
that was the ranting session and also
there were people who asked you for more
features because once you give them food
they will ask for more food so for
example people ask hey let's give us
tracing or something we want to know it
did that way did we go that way or did
we go that way and or did we go that way
so people are asked for like a feature
called tracing and it sounds like you
know hilarious but I mean the feature
itself is amazingly for debugging and
for reconstructing but it was really
hard to kind of change the internals to
make that stuff happen so in 2.0 2.0 we
had we still had this call style
actually it's wrong because there should
be a dot between create and the bracket
but whatever and so we introduced the
DSL to make you know workflows defining
the diagrams simpler and we still had
this concept of you throw something into
the operation and the
operation calls different steps but the
steps don't know what the operation is
doing and so on like you know like
functional information hiding basically
and the most amazing feature was that
you could also push like you could use
the developer gem and throw in an
operation and the operation would be
rendered as a diagram automatically
which was pretty cool because people
didn't have to understand what the
operation does they just look at the
diagram I'm better at visual stuff then
at non visual stuff so people this guy
is basically asking me why are you being
an [ __ ] you idiot why do you change
the API from 1.12 2.0 and I said because
I can like people were really angry with
me like hey how can you change the API
like it's a and it's like a major
version and semantic versioning implies
that's exactly the point of a major
version release right but you change the
API whatever so people don't like
innovation please stay in the same way
you have always been the same way that
res does it and hasn't changed for ten
years it's great okay let me drink a sip
of this beautiful voice often aghh okay
so um we had the I mean the 2.0 version
was kind of well received lots of people
were using it you know they like the way
they can structure this stuff and the
first thing we did in 2.1 is we get them
tracing so they basically could see okay
this and that happened when i run a
specific operation which was pretty cool
feature and we also gave them the
ability to you know like have different
workflows not only linear railway also
like different branches and going back
and all this kind of stuff and that was
exactly the time when i started working
for the police like for the band because
they needed a new bass player i'm just
kidding i'm actually working for the
german police and they had lots of
documents you know describing their
workflows and this is this is how our
like this is confidential stuff stop
reading it so they had lots of workflows
and you know like they were using like a
pseudo diagram language and the problem
was the they the code didn't match the
diagrams and diagrams didn't match the
code so I kind of came up I read about
BPMN I was really intrigued by it bpmn
is the business process modeling
notation and this is the point where
yeah I'm going Enterprise now so I'm the
VPN is a pretty cool thing like you know
arbitrary a businessman like BPM and
Chuck Norris like CPM and Trump OSP he's
a businessman so he knows everything
about business if he likes people it
must be good also thh like selfie
feeling not so BPM ends basically a
diagram language you just design
processes and activities and they're
like those diagrams they call activities
and that's how you model your entire
workflow in the application and that
goes hand-in-hand with the event
sourcing stuff we were talking about
earlier so basically you have boxes your
circles you have arrows and your
vomiting unicron's I'm just kidding
about the vomiting unicron's of course
because there's only boxes and circuses
and errors in vtn and so BPMN allows you
to like you know you have like pools and
the pools can talk to each other and you
have like functions where one little box
means there's actually a sub activity
being called and you have like events so
every activity ends in some end event
basically and you can map those end
events to other events and to other you
know connections and this kind of stuff
is super cool and super simple way to
model
why are you loving okay I thought I said
something stupid so and you also have
like the idea of like throwing events so
you can say hey something happened
events or sync event DDD whatever and
you also have catching events like you
can say tell me if something happened in
BPM and so you basically have a lot of
cool mechanics and I kind of loved the
idea that I don't have to reinvent the
diagram language because it's already
there it's from Java and people in Ruby
community hate Java but it's kind of
like pretty useful so what we did and
2.1 inch red laser is we introduced a a
new like concept called activity not
operation activity activity is basically
like an operation has the exact same
behavior like you have methods to
fighting the steps or the boxes and then
you have the exact same DSL to define
like this is gonna be my tears this is
gonna be my tivity and it gives you like
those diagrams for free basically and
you can't have like different ends so we
added like a little bit of DSL it
doesn't really matter and you you can
like nest stuff and you know like
actually totally like irrelevant how it
works but you can look at that but you
can do this kind of diagrams which is
pretty cool and you can like map nest
diagrams to other nestled activities to
other activities you know here's again
like cold but it actually doesn't really
matter because online so but they're
surprising new thing we did in 2.1 was
we introduced a concept called workflow
so it's basically the idea of having the
little operations being a defining
application wide workflows did I mention
that I'm gonna be over time you're the
organizer you should tell me to stop or
something like that okay that's good
it's great when the organizer doesn't
care so what do you see here for example
what do you see here is a workflow at
the police for a one-time password login
like you know people sign up they get a
one-time password they have to login
with that one-time password if they'd
wanted password is okay we have to
change their password like like they
can't do anything else so that's
basically defining that workflow
visually and we're using the exact same
concept again like you every step is
just a function that gets input and
returns output so this is just some
weird pseudo code I throw in just to
show you how those work for us look in
Ruby like those again like every step
can be a callable Ruby object there can
be a method or I can be whatever like it
doesn't really matter so just to give
you a quick example how those workflows
actually operate let's look at this one
time password login so you usually start
a workflow by like triggering a start
event and this will basically run the
machine or the process as long as
possible until it hits resume event yeah
so so this is like and this is an
example how you would do that like you
you trigger workflows for example from a
controller action it's not like you know
a fancy thing running in the background
you just change the way you think in my
controller action i trigger the workflow
this is again back to event sourcing I
think we have lots of stuff to talk
about later at the pub before I'm drunk
procedural programming I love that
because it's almost functional so you
trigger that machine it starts running
you know excuse as much code as possible
and stops at the next
resume suspend event basically and as
every time this machine stops at a
resume event it will give you an event
object and that event object you can
persist or you can memorize or whatever
it's up to you and throughout all the
eggs because I could talk like 545 hours
about this stuff so it just you trigger
something you run the workflow and when
the workflow finishes it gives you an
event object and that event object you
reuse to continue from that point again
okay so and again the details are
completely irrelevant like you have an
event ID and bla bla bla bla bla but
what do you do is basically throw events
into that process engine and it will
continue the workflow for you where it
stopped it's really interesting I don't
know if you heard of event sourcing but
I hear that it's pretty close to that
kind of stuff so on the event the
process energy will like continue and
bla bla bla and go to the next like step
and execute everything until it hits
another suspend event and this way you
can model really complex applications
like at the police we have you know this
is just a sign-up process for example
but we have like you know inquiries
about people and so if you have a
problem in Germany just tell me I can
fix it and so we you know acquire ease
about criminal people or maybe they're
not criminal and we have fair you know
like a lot of administrational workflows
and all this kind of stuff so everything
in that application was modeled with
those kind of workflows and it was
actually pretty well and the cool thing
was that tracing since we have it in 2.1
it also works like it gives you this
weird thing or it just kind of shows you
this is what happens so you can see what
happened in my activity and my events
and you can see the flow of my of the
application visually and that's kind of
pretty cool so and the the change or the
for me what I would have extracted as
usable components is that we finally
could have workflows and in Ruby you
just have like controller actions and in
red saree and like blur and something
works now we had like now we have like a
building blocks to build workflows we
have you can have parts of your workflow
like an activity coming from gems so for
example in tyrant which is a replacement
for device you have lots of work lost if
predefined for you so like a one-time
password signup is predefined in the
tyrant gem you don't have to know what
it does it just you know executes of the
steps necessary and you just say cool my
user is signed up and I have control
what's happening so you have reusable
workflow of fragments and you can do
that stuff visually and many other
things I couldn't show because I only
have 45 minutes and I'm already 6
minutes overtime so the the the my
thinking has changed from like you know
using rubies mechanics with like modules
and objects to let's define little
blocks those boxes in as callable ruby
code and let trailblazer do the workflow
execution basically yeah and every block
every task every box doesn't know [ __ ]
about the outside world and the outside
world doesn't know what's happening
inside so very functional concepts
because you pass in stuff you get stuff
out it's really cool then the process
engine takes care of you know running
complex workflows for you and you know
taking care of when is this work for
finish when is the request over when
where do we have to continue and we got
this amazing like visual element that
you can trace what happened that you can
visualize what happened so the police
was like super excited hey cool now we
actually see what our code does and our
code does what we see which is like
something that normally doesn't work
because code generators we learned that
25 years ago don't work yeah
so my entire last the last couple of
years of my precious life has basically
evolved around how do I have small
working units of code we're throw-in
stuff and I get stuff out and how do I
compare compose those pieces of code
into a working software basically yeah
and so I realized this is exactly what
my dad told me like like a 25 years ago
because I'm that old
that you know you've built a small
component in a big system and the small
component doesn't know anything that
happens on the outside and that is kind
of the idea that I kept working on in
the last of 20 years more or less that I
you know it simplifies my life I don't I
don't know what in a sign-up process and
a one-time Hospital process what is
happening in step number five I just
know it does something and it gives me
back a specific output that I'm
expecting and I don't care about the
workflow I don't care about the you know
environment like give me small pieces
and I arrange them and everything else
happens automatically and this is
basically the extract of my journey from
the last 30 years that break stuff down
to little pieces and let someone else
take care of the workflow and I mean
you've been an amazing audience so
thanks for listening to my presentation
[Laughter]
[Applause]
Nikki no not sure I have Twitter but I
don't use it we don't have time I'm 10
minutes over [ __ ]
15 15 no my timer says 9 minutes I'm
sorry I was wondering have you ever
thought about changing the tolling for
instance because you said that you try
to build your flow but Ruby didn't help
you because of this inheritance modules
instance states that there are super
yeah and then you removed all of them
and used more like a functional approach
so I was wondering this is the first
thing that came to my mind well maybe I
need to change the tooling for instance
language for instance functional
language for instance you're right so I
so first of all I'm in the
programming language definitely but the
cool thing about Ruby is you can't go to
conferences and meet coal people doesn't
work in other languages like Haskell
imagine half the conference like and the
other thing is that you know even in
Alexi or something so I was talking to
just say well even the creator of elixir
and he actually likes the stuff we do
you know like the workflows because they
also don't have that they have functions
there are a function language they have
the pipeline process the pipeline
operator but that's only a linear flow
so they still have the problem what if a
method D in ABCD once we have two out
three outputs yeah how do we handle that
so elixir doesn't do that so they also
will end up with with something pretty
close to our you know step DSL in a way
so I figured out that as much as I
criticized Ruby all the time because it
doesn't move on the language it's
probably not gonna change it because I
haven't seen any language with this kind
of abstraction of activities and you
know mapping outputs to different flows
unless you use like either monads and
this kind of stuff but hey sorry and I'm
not a mathematic professor so I just
wanna like look at code and understand
it so yeah I thought it was wrong in
Ruby but I'm still feeling a premium
welcome in a way we're very good
question okay thank you
[Applause]