Transcript
This transcript was autogenerated. To make changes, submit a PR.
Hi there. Welcome to my session. It's good to see you.
Well, actually, I don't see you, but it's good that you're watching this.
And I'm excited that you are, because it shows me that you care
about more than just making software. But youre
also interested in the delivery part,
which is, if you ask me, very crucial. My name is Abel Ferhover.
I'm a quality and test automation engineer, and I work for a company called Testcoders.
Now, the reason I became a consultant is so that I got
to work with many different clients,
many different companies and groups and teams and people.
And the funny thing is that I did not know before is
that all these different groups, all these different teams,
they're all struggling with this very same issues,
which almost reminds me of parenting. Now,
I don't know if you have any kids. I do. I've got two kids.
And only yesterday I was grocery shopping with my
son, and at some point he decides he's
had enough and he does not want to walk any further.
So luckily we were almost done. So I had to pick him
up, put him under my right arm, and in my
left arm I had a heavy grocery bag. So we were
walking to the car, back to the car, and there were two women.
They were sort of laughing at me. And once I walked
past them, they said, well, it's the same everywhere.
They were clearly recognizing some of my
strategies that they probably experienced themselves.
And it's the same in our world of software development
and software engineering, we have the same problems and have
to deal with the same issues and the same pitfalls.
And that's what this session is all about. Now, before we
get started, I'd like to do a show of hands, but this is
a virtual conference, so I can't do that.
But I will run a few scenarios, a few statements by you
anyway, because I think you will recognize a few
of them. All right, so let's see. Here we go. Let me
move over to a different view.
Right. Do you recognize this situation specifically?
Have you ever had a dedicated sprint to work
on bugs or technical debts Specifically?
And be honest, I know that I have another
one. Do you often find items on your product
backlog that date back more than twelve months ago?
Oh, yeah. This is a classic one. What you actually see here is
a sprint board, a sprint
backlog where you'll find a lot of items
sitting and waiting in the testing column.
So there's a lot of work to be done in that area.
This is what we call a bottleneck. So do you recognize
a bottleneck in your sprint board?
Another great one. Yeah. Canceled retrospectives
to finish the almost done work. So instead of
doing a valuable retrospective session, we finish that
item that was almost done so that we don't have to bring it
on into sprint planning for the next sprint. Have you
ever done that? This is a classic one.
Product owners who do testing.
Now, these are actual things I've seen out there,
things that I've actually been a part of as well, to be honest.
And to me, all of these situations are typical examples
of signals and symptoms and characteristics,
if you will, of teams that are not performing well, teams typically,
that are complaining, for example, about the amount
of unaccounted work that comes up during a sprint in
the form of bugs or technical debt or whatever. And these
are also the teams that struggle with pressure from their
business to deliver more stuff that they can't in time.
Teams that typically finish less
than 90% of what they originally planned for. Now,
if youre recognized a few of these scenarios yourself,
don't be alarmed. It's not that you are part of a team that's
not doing well. It's just that there are some opportunities
for you to improve. These opportunities to
improve typically revolve around three major
areas, so to speak. And the first one is
bugs, dealing with bugs,
preventing bugs, all that stuff. The second one is
legacy. There's quite a lot of legacy out there.
I think everyone deals with legacy on a daily basis, so therefore,
it's important that you have a way of dealing that. And the third
one is technical depth.
Many, many teams do not have a way of working that involves the
definition of technical depth and how they should deal with technical debt.
There's no strategy, there's no clear vision. So first of all, I'd like
to align on the definition of these three areas
so that we're speaking the same language. I think that makes sense.
Let me move over. Let's start with bugs.
All right. So to me, a bug is very clear.
Let there be no mistake. It is something
that we have delivered and that worked before.
It's been tested, it's been through the whole software development lifecycle,
and now it's not working anymore.
So that's very straightforward. All right.
Now, the second one, the second area was legacy,
and that's a bit more difficult, a bit
more tricky. There's no clear definition, but I think
there are a few signals you can spot, if you will,
that point to a legacy system. And the first one is
that the system outdates the current tech
stack or team, if you will. So there's no one around anymore
who knows how to deal with the system, who has developed the system, has actively
worked on it, or it's from a
technical framework built in a technical framework or with a technology that
you are not no longer using anymore.
Another characteristic or symptom
of legacy is when youre
see around you or you feel it yourself, that people are afraid of
touching a system. It's so delicate, it's so fragile.
You might even be afraid of cloning a certain repository on youre local machine.
Just because you're afraid you accidentally make a commit,
merge the whole thing, and then break the system,
which is not going to happen, of course, but you get what I'm saying.
And another one is that if
there is no or zero testing
for this project available, so, like, let's say there are only a couple of
unit tests. For example, I'm not talking about things as
test coverage or code coverage here, like when
you would have an 80% coverage and you say,
oh, it's a legacy system, because there's 20% uncovered,
or that 20% is now considered legacy.
Now, not like that. It's a bit more pragmatic, if you will.
But if there is no testing, there's no way
of learning what the system is supposed to do.
And I think that's the whole thing with legacy. You need to want
to learn what the system does because you are unfamiliar with it. And tests
are a very good way to do that. All right, so the
next item was technical debt.
And that's the one we'll be going into. A little bit
more into debt. Technical debt can
be split up into four categories, hence the quadrant.
And on one hand, we have prudent
actions, careful actions, careful decisions, and on the other hand,
we have reckless decisions. Then on the other axis, we've got deliberate
choices, deliberate decisions, and we've got the accidental
decisions, like not knowingly.
So let's go over all four of these categories.
So this green block simulates the
best form of technical debt, the non harmful,
let's say. And that is when you say,
okay, I know that I'm taking on technical debt. In this case,
it's a deliberate action, and I will deal with it later. I know
that I have to deal with this later, otherwise it's not going to go away
and it will slow me down. Then there's the reckless form of
this, the reckless thing where we say,
well, we don't have the time to do it right now, so we take on
the technical debt and we'll see what happens after that.
There's no plan for paying back that debt. There's no plan
for fixing it. Then we have the other one where it's an
accidental decision. We did not know it. But we have a
careful mindset. We take a careful mindset here. So at some point
we figure out, or it comes to our attention that we have taken on
technical debt, and at that point we say, oh, wait, hold on, we should
have done it better. We shouldn't have done it differently, and we're going to do
it that way from now on. And then there's the final
one, the one that you should definitely avoid.
That is when you did not know that youre did make a mistake or
you took on technical debt. And at some point you do know and you still
ignore it, right? Someone points out we have
taken on technical debt and you say, oh, well, we don't care. We don't know
how to do it. We don't know how to fix it. Let's not do it.
That's the horrible one. Make sure you're not in that last category.
All right, so let's have a look at an
example for that. So let's look at a very simple
example of technical debt in a mathematical
form. Let's say for argument's sake, I want
to take a trip. I love holidays. I love taking
holidays and going on trips. And this trip that I
have in mind is going to cost me €6000.
It's good for my health, it's good for my family, it's good for
everything, basically. And it's a must have. It's very
important to me and it will solve a lot of issues and everyone's going
to be really happy after this trip, however,
I have only managed to save up €2400,
200 a month. Right? That's what I can save.
So I'm short quite a lot, actually. Now I
can take on this 3600 as a debt.
I can do that. Which makes me
having to pay this. Let's for argument's sake, say that I have to pay this
back in one year. And on the previous slide,
we just learned I can only save 2400
a year, in other words, 200 a month.
So I would be short another 1200
after one year. And that doesn't even go to savings. That goes
to paying back the debt.
How do I get an extra hundred a month?
That's the question. So here I've sketched our
monthly spending pattern, if you
will. So we pay something like mortgage
or rent. We have insurances. We have utilities like
Wifi and also water and power,
but most of all wifi. Of course we have a car that
we need to drive around and we need to eat and of
course we have that 200 on savings. So we
need an extra hundred. And the bank is going to come every month going
to charge that other account on. Where is that money going to
come from? Where is that hundred going to come from? That's the big
question. Are you going to pay less rent?
Don't think your landlord would like that. Are you going to
stop some insurances? Sounds very,
very risky. Pay less for utilities. No,
go, stop driving the car. Could be,
but that way we can't drive to work, eat less food.
Maybe we can find something there.
But that's the whole idea. That's what we're doing right now. We're planning to
come up with the extra hundred. This is the planning phase.
If you do not do this, you will slow down.
You will be forced into changing your
spending pattern in this case, or the effects
will be that you won't be
able to deliver as much stuff because
you have to deal with the implications of that debt
that you did not pay. For example, there could be more bugs on
your backlog because you didn't pay back your technical debt
and now you have got a temporary dirty fix
still out there in production and you have to deal with
the consequences. So please, oh please,
just pay back your debt. Do not plan
to be clever or add more resources. Pay back the
debt. Accept the pain. Because yes, it hurts a
little at first, but you should spend time
every sprint to pay back technical debt,
even if your technical debt is minimal every day. I'm sorry,
every sprint, you put technical debt on the top
of your backlog. That's it. You put
technical debt on the top of your backlog every sprint,
and you finish it first. 1st thing when a new
sprint starts, you work on that. Simple as that.
If you fail to do that, if you just ignore your technical
debt, it'll become a vicious cycle and it'll
drag you down. And I want to sketch a
simple example of that from the field of test automation because
that's where I'm specialized at. So what I've seen a lot
in continuous deployments and continuous delivery pipelines
is when there is like failing tests at a late
stage, there's perhaps an end to end test or something that is flaky
or it gives back a false positive because some
technical reason it is failing and it's blocking our
build. Right. What I've seen developers do
is to turn off that test just to make that build pass.
That is the moment youre take on technical debt. And it can be
for good reason. It can be, but there are some follow
up actions you should do, and if you don't do them, youre build passes,
you get a lower test coverage results into more
bugs, or at least more bug reports. And bugs
result into you having to deploy a hot fix and
you forgot to update your tests because you've turned them off.
And you get to the same cycle again and
again and again. Youre box result into
more bugs, result into more bugs, and you
get where I'm going at right now, as I said before,
I worked in various teams and in my experience,
it is the DevOps teams that are typically
better in handling technical depth. I think the reason
why is because true DevOps teams
that contain both developers and operational engineers,
true DevOps teams that work together on a daily basis,
they feel the pain of technical debt in each
phase of the software development lifecycle that you'll see on this image,
the DevOps logo. Because now developers
do not only feel the pain of technical debt when they
have to perform testing or building or releasing or coding,
they feel it during the entire lifecycle. And it's the
other way around. Ops engineers now feel the pain of
technical debt also in the development lifecycle, in the
coding phase or the building phase. All right,
so another very big thing in DevOps is
automation. It's super important, and it's
for the simple reason that in DevOps, what we try to achieve,
first of all, is flow. It's actually the
first way of DevOps is realizing or creating flow.
And that means that work flows from left to
right, from dev to ops, without having
to wait a lot in between. We're not going to make this
whole big release window once a week or once a month,
where we put all of our commits together,
we squash them, and then we give it to an end user and it becomes
a very big release. What we try to achieve is really
small bits all the time, and maintainable,
containable. And in order to
do that, you need a lot of automation. You need automating tests an
awful lot. You need automate, CI pipelines,
deployment processes, release processes,
everything you can imagine you want to automate, because you want to
be able to release or give stuff to an end user
all day long, ten times a day if
necessary. And this is something you can pick up
yourself, even if you're not practicing DevOps, even if you're
not part of a DevOps team, or you don't even have DevOps teams within your
organization. Even then you can still pick up
on this very important item of automation.
And a good way to start is with the definition of done,
right? So the definition of done in agile and scrum is a
list or a description of stuff that need to
be completed, tasks that need to be completed before you
call your work done. So if you haven't got a definition of
done, I think that's the first thing to do. And if
you need inspiration for what to automate,
then go look at this list because it typically contains
the stuff we don't like to do in my experience,
like writing release notes and doing some manual
testing, or preferably not actually,
but all kinds of quality gates,
peer reviews, all of that. See where
you can automate and start with that.
So another big thing that can slow
down a team without them even realizing it
is the decision making process.
Decisions need to be made on a daily basis, and sometimes they're
big decisions, sometimes they're small decisions, typically. The bigger ones,
of course, tend to take longer and require
more thought and are slowing down
our productivity and sometimes even our quality as well.
Because we have no way of doing this. It's all gut feeling,
discussion, opinions, and DevOps
advocates that you practice data driven decision making
over gut feeling, as clearly sketched in
this funny image. Now this is a very difficult thing,
because all decisions ever, always, all the
time, no exceptions, are made by emotions,
are based on emotions. So how do you quantify that?
That's a challenge. All right, so I understand this
is not a workshop, but I do want to mention two tools in
particular. I found them very useful in
the past when having to make a decision as a team,
when there are multiple solutions out there. Now, these tools are
called the AHP matrix and the pew matrix,
and they are complementary to one another. So we use the AHP
matrix as a team exercise to define
what aspects of the possible
solution we find important. And the AHP
metrics can be used to quantify that
and find out what is most important. Now, we use the output
from the AHP matrix in the pew matrix. So in
the pew matrix, we ultimately compare
the final solutions that we have to pick from. So let
me give you a bit of an example of an AHP matrix and what it
looks like. I was working with a team that needed to select a
contract testing tool to ultimately test
API versions and contracts, actually. So there
are many different solutions out there, but before we get to the solution,
before we choose the best tool, for youre job,
we needed to identify what we found important about this tool,
and that's where we did the HP matrix.
So first we've identified pricing is
important, then collaboration and source control is
important. It needed to support open API
3.0. We wanted to look
at the learning curve, because if it's a very difficult tool to
master, that may influence the decision we want to make.
It would be nice if there was a mocking service or mock
server available within the tool and it needed to
support graphQL in the future, even though we weren't
now, the exercise goes as following only.
The yellow highlighted cells are the ones youre need to fill in,
and it is every time we do a compare
between two attributes and two only,
that's all youre need to discuss with your team. So the first one,
I'm highlighting it right here, is collaboration
and source control versus pricing versus the
column. So row versus column, which do we found more
important? And if you find, for example,
collaboration more important, you give it 12358
points, basically Fibonacci sequence. And if you find
pricing more important, you do the same, but it's like a negative.
So this is like, I find pricing important two
versus zero or three
versus zero. In this case, if I would put in a three,
let me select it. Whoops, here we go.
Then I would say collaboration is more important than pricing.
If I find it way more important, I could use the Fibonacci
sequence to say in, for example, eight.
That's a lot more important. So you do that for each yellow
cell. You don't need to look at the white cells because they, in this case,
got automatically filled. Otherwise youre have to do the opposite.
If you don't have a spreadsheet that does that, if you don't have the formula,
then just fill in the opposite and you'll be fine.
So you do that for each and every yellow cell,
and what it ultimately does, it comes up with a weight.
That's the output of the HP matrix. It's the weight for
each property. We will use this in the pew
matrix. Yeah, there it is. So we use this in the pew matrix to
ultimately compare the different solutions with one another. But first we needed
to identify which one we found most important.
So, in this case, you can see that we found the second row, which is
collaboration and source control and open API 3.0,
most important. So if we change this,
for example, the learning curve now
becomes a lot less important. But then again,
this is a team exercise. So you should decide with a team and have discussion
on each matter. All right, so let me
just copy the values of these properties,
the weight that we basically calculated.
Let me just copy it in right here. And here
we have it. So this is the Q matrix you're looking at.
We have a list of properties that
we've defined that are important to take into an account when
we make a decision. We have the calculated weight that we did from the Ahb
matrix. So this is no longer AhB matrix, this is
the pew matrix. And now we have three different solutions listed
up that we want to select from, that we want to choose from.
For contract testing, you can use postman,
you can use pactflow, and you can use pact.
All right, so I've cleared the values, set them all to zero
for all the different solution. Now, the first thing we do is we
identify or we select one of the three,
in this case, one of the three solutions as a baseline.
And that could be any one of them. It doesn't matter, none at
all. It could be the current solution. That could be one of the suggested solutions
in this case. As you can see, we have selected pact as the
baseline. I've highlighted it in yellow. So that means
we don't change those values, there's zeros, we don't change those scores.
What we are going to do as a team is we going to compare,
for each solution, each attribute with the baseline
with pact in this case. So as first, we could
compare packed flow with packed on
pricing, and we give that a score. So, for example, I say packed flow
is more expensive than pact and therefore gets minus
one, or it's a lot more expensive than packed and it gets minus
two. And you do that for each of the attributes.
And if they're equal, youre give it a zero.
And if they're better or worse, give them a minus
or plus number. And the options I have
selected here is minus one, minus 20,
and plus one, plus two. That's the one you get to select.
You can change the math if you think that makes the decision ultimately more clear.
So you do this as a team. And let me just randomly
put some stuff out there just so that we have a
clear winner. Minus one.
Actually, learning curve and postman is quite easy.
So that I'm going to give that to backflow is going to be a bit
more difficult or actually as difficult as pact.
There's a mocking service. Yes, they have it.
Graphql support yes. But I suppose that's the same
with pact. So let's say this is the final
output in my case, as you can see, there's a clear winner.
Now, I've altered the numbers that way, so that would
be for this example. But the clear winner is postman.
It could also be that your baseline is the clear winner. And if we
would alter the numbers and have to score all the
other solution with minus numbers, you can guess that, of course.
Let me just tweak it a little bit here. If this
would be the output of the pew metrics, the pact,
the baseline would be the clear winner. So this is how you can
use that. Hopefully you understand that this tool helps you
avoid discussions based on opinions.
Right? So it's no longer, I think Packflow is better than packed because
I've worked with it in the past and it was so good. Now you
get to dive deep on the matter, dive deep
in the solutions and compare them
based on what you have identified that you find
important about this decision, in this moment, with this team.
Now, I would love to give you more tips and tricks to
lead these exercises, these group discussions, and how
to put together the right group, for example, put together the right
people, how to select them, how to find and identify the criteria
that are the basis of this entire exercise. But as
I said, we are limited in time and I have to move on. If youre
like to learn more, please come visit one of my workshops.
I give them at conferences as well. You can check me out on abletohoova.com
schedule, or you can book one of these workshops
virtually, go to my website and you'll
find a submission form and all about this workshop.
So let's move on. All right, so there's one final thing
I'd like to say about decision making. And if you
remember only one thing from this session, let it be this one. And it
is good. Is good enough.
And what I mean to say by that is I've seen many,
many different teams and individual developers struggle
with the decision making process because they thought there was
more information out there to be gathered to
be taken into an account. I've seen developers
that had to select, let's say, between three or
four solutions, make the entire proof of concept for each solution into
an mvp, almost like building the entire
thing like four times, and then say, I want that solution because
that's the best one. That is going to take ages.
You're never going to get things done that way. So please make
informed decisions, but stop overanalyzing.
Good is good enough. I actually had to learn and understand this
principles the hard way.
It was about ten years ago, I think, when I was parking
my car. Actually, I was locking up my car almost
in front of my house when I heard footsteps coming
in from the left. And it was a Saturday night,
I think it was around eleven ish or twelve, and I had just come home
from visiting friends and I heard footsteps coming towards
me. But I lived in the city, so people walk,
and that's not a thing to pay attention to,
I suppose. But all of a sudden, as I'm locking up
my car, I hear these footsteps stop right behind me.
And just before I pick up on that,
I get a hit on the head from behind.
I get hit pretty hard and I fell over onto my car.
Now I immediately get up and turn around and I see
a man standing there, holding a
knife in his hand. Now from that moment on,
everything went dark at that moment, and it took
quite a few months, actually, before I remembered more or less what
happened after that moment. So after I had
turned around, there was a fight.
I immediately jumped onto the knife. I realized
it like that, that this is a critical
situation and it's a life or death
thing. So as that takes
about eight milliseconds, youre body jumps into a mode or
your mind actually changes into a mode. And luckily my
mind chose to fight because I don't think there was actually any
other way I would have gotten out of it.
There was a fight. Ultimately I survived, obviously, because I
wouldn't be here sitting having this talk. And it
had a lot of impact after that. It was not the
fight, not the injuries. There were injuries, but they were minor,
really minor, nothing to be really concerned about,
but that had a mental impact on me. So at this point in my
life, I was actually in the army, I was in the infantry
in the Royal dutch army. And luckily for me, they have
got specialists who know very well how to treat PTSD
and PTSD symptoms, which is what I was showing
now. They treated me and it worked very well, actually.
So I was happy to do not have those symptoms anymore.
But still, I could not make sense of this
whole event. I couldn't make sense out of it because
everything that happened that night was very illogical.
I mean, someone just doesn't walk up to you and
start attacking you if he's after your money
or something, because that is what happened during the fight. I got knocked out
somehow, and when I woke up, my wallet
was gone and it had been found by the police later that very
night. But if someone's after your money,
they are likely to warn you before they attack
you, just so to avoid the whole physical confrontation, because it's
risky for the Margaret as well. But that didn't happen.
Also, he attacked me with a knife, but he hit me with his
fist, I assume first from behind. If you
want to attack someone with a knife, you want to inflict
damage, you do that with a knife. And this guy,
he didn't stab me, really. He cut me,
and I got injured, but never fatally injured.
Luckily for me, my injuries weren't even close. And this guy
clearly did not know how to work
the knife or how to do most damage.
And if he did, it wasn't his intention,
but it seemed like it didn't. So that
didn't make any sense either. So what I
was left with was a lot of nonsensible
facts, and that kept bothering me.
At some point, the police stopped the investigation
because there were no more leads. I mean, they did some investigation that
night, but there were no leads coming in. They never caught
the guy. And I was
left with a dead end, basically. And I
noticed, I was very much bothered by this. I kept
analyzing this. I kept analyzing this until the moment someone actually
mentioned to me, like, are there any new facts
coming in? Is there something you can do or anyone can do
to make sense of this all? And the answer to that question
was, no, there's nothing we can do.
That's the whole reason the police had to close down the investigation.
So at that point, I had to say to myself, all right,
it's enough. We know what we know.
It doesn't make any sense. We have to move on.
Don't overanalyze. Good is good
enough, even in a horrible or bad situation.
Right. So I'd like to wrap up this session and
briefly summarize the stuff that we talked about.
So we talked a lot about technical debt, and I hope you get that.
The point here is to not take on technical debt unless
you are willing to pay back the debt. If you're
not willing to pay back the debt or you can't, you don't have a plan,
do not take it on. Please keep to your own quality standards and
do not take shortcuts, because that's essentially what technical
debt is. Technical debt goes to the top of the backlog.
That's the rule. That's the only way youre can deal with it on
a daily basis. So please make sure
your sprint backlog always contains one or two
or more. Three perhaps. I don't know. It depends on your team items of
technical depth, and make sure you handle them first.
Very important. I'm afraid this is the only way you
can deal with it that is sustainable.
Then we talked about how DevOps teams are typically a lot better in
handling technical depth because their responsibility
for the entire software development lifecycle and how they
incorporate automation to do that. Now that's something you can pick
up on yourself. And a good way of starting there is to
analyze your definition of done and see what tasks there are in
there that you could possibly automate. That's where you should
start. And then finally we talked about decision
making and how data driven decision making is a lot better than gut
feeling, and how data driven decision making can offer
you a bit more structure. So we talked about the AHP matrix and the
pew matrix and how you can easily incorporate them in
the decision making when having to select out of multiple
solutions with an entire team or group of people,
which can be tricky. So thank you for listening.
If you have any questions, comments, remarks or anything,
please reach out to me on GitHub,
LinkedIn or send an old fashioned electronic
mail through to ablet at testcoders NL or visit
my website awoltforhoova.com and I'd love to get in
touch. I'd love to hear your thoughts and ideas
for now. Thanks again and enjoy. Conf 42 DevOps
2024 cheers.