List

Growing Software From Seed

Growing Software From Seed

by Sweta Sanghavi

In the talk titled "Growing Software From Seed" delivered by Sweta Sanghavi at RailsConf 2021, the speaker draws an insightful parallel between gardening and software development, emphasizing the importance of careful observation, patience, and a methodical approach to problem-solving in both domains.

Key Points Discussed:
- Observation and Debugging: Sweta shares her experiences in her garden, where she initially overlooked small signals of trouble, like caterpillars feasting on her kale. This prompts a discussion on how just like plants, applications also exhibit behaviors that require consistent observation to identify underlying issues.
- Systemic Thinking: The speaker highlights the need to look at issues holistically. In gardening, this means understanding the entire ecosystem and not just the plants. In programming, it involves understanding the entire code system rather than focusing solely on the visible symptoms.
- Learning from Mistakes: Despite initial mistakes in gardening—like using pots too small for healthy vegetable growth—Sweta emphasizes the need for learning from past experiences and assumptions. Focusing too narrowly on specific issues can blind one to the root causes of problems.
- Code Mechanics: Sweta illustrates a debugging scenario where she faces an error in coding. Instead of making hasty assumptions about the problem's source, she encourages a stepwise examination of the issue, similar to how one would investigate problems in a garden.
- Patience in Growth: She describes her journey of planting new seeds (both literally in gardening and metaphorically in software) and waiting to see what sprouts can teach about their needs. This illustrates the necessity for patience in both growing plants and developing robust code.
- Methods to Improve Observation: Sweta suggests practical tools, such as having daily review sessions ("daily diffs") and discussing assumptions aloud while coding, to enhance awareness and understanding of software systems.
- Weeding and Maintenance: She stresses the importance of addressing "weeds" in programming, which are the irrelevant errors and deprecation warnings that can clutter the codebase and distract developers from more critical issues.

In conclusion, the talk offers a compelling perspective on how gardening principles can apply to software development. By cultivating a mindset of observation, patience, and systemic thinking, developers can create more resilient applications and avoid common pitfalls associated with assuming the root causes of problems. The overarching message from Sweta Sanghavi highlights the profound impact of treating software development as a nurturing process, akin to tending a garden.

Pam Pierce writes, “Look at your garden every day. Study a plant or a square foot of ground until you’ve learned something new". In debugging my own garden, the practice of daily observation has revealed signals previously overlooked. This practice has followed me to the work of tending to our growing application.

This talk visits some familiar places, code that should work, or seems unnecessarily complicated, and digs deeper to find what we missed at first glance. Let’s explore how we can learn to hear all our application tells us and cultivate a methodical approach to these sticky places.

RailsConf 2021

00:00:05.819 I'm sitting in my garden surrounded by New Growth basking in the sun when I see
00:00:12.900 a white butterfly fluttering through the air and land in front of me
00:00:18.060 we lock eyes and I'm seething
00:00:23.580 there lands my foe come here about our long-standing Feud
00:00:29.640 and also some things butterflies taught me about writing code I'm swata sanghavi I'm a developer at
00:00:37.140 backer kit I'm also a proud tender of Earth in Sunny Berkeley on a lonely land
00:00:43.680 today we're going to talk about how careful observation and patience can be pivotal in both gardening and writing
00:00:50.820 software and talk about a few times that I didn't have either I'm going to first walk you through some
00:00:57.420 examples of the garden and then the reflections they LED in code we'll end with some tools that has
00:01:04.019 helped me Implement these lessons on my day-to-day cup to this past spring my friend asked
00:01:11.100 if I wanted her extra veggie seedlings at this point I had no space of my own
00:01:16.320 for them and I hadn't grown anything edible since I left a basil plant on a
00:01:21.900 radiator all winter but I dreamed of stepping out into my Lush
00:01:27.240 garden and picking out whatever was in season for dinner after some light persuasion of my
00:01:34.619 boyfriend we were back with 12 Solo cups of seedlings I quickly repotted them and we were off
00:01:42.720 y'all I was committed to making my babies thrive I read and worried about things like
00:01:49.619 hours of direct sun how often to water the NPK ratio of different fertilizers
00:01:56.700 and as an avid stack Overflow reader I found gardening forums to post all my
00:02:02.220 beginner questions how do my plants look could I expect a bountiful summer Harvest
00:02:09.360 well the comments I got spanned from that's a lot of information that's a lot at once too information about how my
00:02:16.980 veggies were growing you may notice one common theme
00:02:23.940 my friends from garden stew agreed my pots were too small to grow the flavorful veggies I was looking for
00:02:31.319 Hank says I agree with Mark plant your veggies directly into the ground if you
00:02:36.660 can it's time to give the roots more space the thing is as I alluded to before this
00:02:43.920 wasn't my backyard and I didn't have space for even larger pots nor could I
00:02:49.739 transplant my plants into the soil I thought if I got everything else right
00:02:55.260 I could make this work these are all direct quotes to show you how kind informative and downright funny
00:03:03.120 gardeners are
00:03:08.340 meanwhile I diligently watered and I waited one day I was checking in on the growth
00:03:13.920 of my squash blossoms and went on to water my kale well as you can see Michael Lee have
00:03:19.620 said oh he's been full of character a little crinkled a little misshapen but this time I did a double take
00:03:27.120 it's like that character morphed in front of my eyes into holes
00:03:33.060 and they were everywhere I go into a slight Panic what was
00:03:38.159 causing these did the roots not have enough space to grow and was this impacting the leaves
00:03:44.340 well I took my problem to the people my friend Brad said it looked like I had
00:03:50.459 caterpillars that were feasting on my tail I'm gonna be honest I didn't think that's what it was I had looked at my
00:03:57.299 kale every day when I watered it I would have noticed caterpillars and I was still thinking about my crowdsourced
00:04:04.019 advice about the small pot size but a humored Brad and want to take a
00:04:09.540 closer look and at first glance as I thought I didn't see anything
00:04:15.060 but then I saw something moving and then I saw multiple things moving
00:04:21.199 Wrigley froze foe's just munching away on my kale I didn't realize we were on a true
00:04:27.840 debugging Mission here I was pretty bewildered as committed as
00:04:33.000 I was to Growing healthy kale I didn't notice multiple caterpillars on them
00:04:38.220 well I move the caterpillars onto a different plant and we keep moving towards our Dream Garden
00:04:45.320 except it gets worse and I look again and there are more
00:04:51.120 caterpillars how is this possible I thought back to a quote I had read by
00:04:57.960 Pam Pierce in Golden Gate gardening make a conscious effort to look at your
00:05:03.419 garden look to spot problems in time to solve them look to develop a feel for
00:05:09.120 the plants how they grow and how they react to stress turn leaves over notice what's flying or
00:05:15.780 crawling about sit down and study a plant or a square foot of ground until you've learned
00:05:22.259 something new well I sat down in the dirt and took Pam's advice
00:05:28.860 I took a look at the soil I turned over a leaf I held it in my hand and looked
00:05:34.800 closer under the leaves to find some white specks
00:05:41.039 specs I certainly would not have noticed while watering my kale
00:05:46.199 sotha you don't just have caterpillars you have eggs and then a memory flashed into my head
00:05:54.180 I'm drinking coffee in my garden I'm watching the hummingbirds and butterflies fly around and I'm like I'm
00:06:01.320 really doing it out here these beautiful butterflies were the
00:06:06.720 culprits they were laying the eggs that were hatching caterpillars that were eating the kale
00:06:13.139 I'd like to kill for me to eat not these adorable caterpillars and it wasn't just
00:06:19.259 enough to move the caterpillars I had to remove the eggs from my kale
00:06:25.319 this experience is fertile ground for some lessons in and out of the garden
00:06:31.740 it's a reminder of how the unknown or weakest part of the system is not necessarily the root of the undesired
00:06:37.919 Behavior I was so fixated on solving the problem of the holes and then of the
00:06:43.199 caterpillars never to dig into the root of the problem the butterflies that were
00:06:48.360 laying the eggs similarly because I knew my plants
00:06:54.419 didn't have enough space it was really easy for me to fixate on that and that was me carrying forward an
00:07:00.419 assumption that any problems in my plants are going to come from the size of the pots
00:07:05.819 that Focus made it harder to look for the other signals for my system and to
00:07:10.979 look at my plants holistically while I was looking at my kale every day
00:07:16.020 I was always looking for something very specific new kale leaves as I water them from above
00:07:22.800 it can be so easy to look at something regularly and yet miss some key details about it
00:07:29.160 I wasn't looking at my kale holistically looking under the leaves or the soil nor
00:07:34.620 was I looking at my kale as an element of a larger system examining the critters that were around
00:07:40.560 it perhaps I could have noticed these holes earlier and identified them as bite
00:07:46.500 marks if I'd slowed down to look closer at my kale and perhaps if I'd examined the whole
00:07:53.160 system of the garden I could have asked myself the question why are there more butterflies in the backyard recently
00:08:00.180 a quieter sign but in our case the root of our chewed up kale
00:08:06.840 this experience taught me the value of a different way of looking from scanning for signs of progress to being curious
00:08:14.460 about every change that happens in the why behind it and examining my garden
00:08:20.099 and kale holistically I thought expert gardeners knew exactly
00:08:25.560 what to do in the right concoction of inputs the Sun the fertilizer what I didn't realize is that my crops
00:08:32.580 had something to say back to me and expert gardeners are just expert observers hearing these signals
00:08:39.839 and it's not that these girders never get past except they observe them early so they can act quickly
00:08:47.580 I'd love to tell you that I learned my lesson but alas
00:08:52.740 you see recently I wanted to use my leaf grower to remind myself what the sun requirements of kale was
00:08:59.459 and so I called Fetch and from our new new leaf grower saved into a variable
00:09:07.320 and I keyed into some requirements only to see this error and I thought wait was
00:09:13.380 it actually a symbol wait was there no underscore in the key or just some
00:09:18.660 requirements not exist on this object I'm feeling myself wanting to go into
00:09:24.300 debug Overdrive but wait let's apply our previous lesson what
00:09:31.620 would it be look like to examine our system and to look under the kill leaf
00:09:37.380 let's look closely at the error at first glance I didn't even really understand this error and so I reactively changed
00:09:44.760 the key well okay our error is a type error with no implicit conversion of string into
00:09:50.940 integer and then we see those square brackets underneath
00:09:56.399 all right square bracket is just syntactic sugar for a method that is throwing this error
00:10:02.640 and the keyword passing is the parameter for this method didn't really even think about that when
00:10:09.779 I encounter this all right let's think further of the no implicit conversion of string into
00:10:15.959 integer well I guess in this case the string is the key Sun requirements
00:10:22.560 why are we trying to convert that into an integer well as I slow down I consider that also
00:10:30.899 my first instinct was to change the key but actually if I were to key into a
00:10:36.899 plant object or kill object with a key that doesn't exist we would
00:10:42.060 actually return nil not an ER that was me following an assumption that the q's wrong
00:10:48.180 so it's not necessarily what the issue is I think further and the integer is still
00:10:54.060 mysterious to me why is Ruby trying to take our string Sun requirements and
00:11:00.360 convert it into an integer to pass back to the square bracket method
00:11:06.720 oh man I think of the other implementation of square brackets and integers make me think of indices and a
00:11:13.980 kind of all comes together for me to realize I thought my method was returning a
00:11:20.760 plant object but instead it's an array of plant objects this is one of those funny cases where
00:11:26.940 Ruby is trying to help us out by assuming we meant to call an index because that's what the square bracket
00:11:33.899 for arrays expects but that conversion bubbles up to an error that we might not
00:11:38.940 expect I thought back to my lesson from growing
00:11:44.100 kale it can be so easy to assume that it's the size of my pots or in this case the
00:11:50.940 formatting of the key or the key that I'm using that was the actual issue and that assumption that I was carrying
00:11:58.620 forward led me kept me from investigating the caterpillars to find the eggs or in this case from fully
00:12:05.399 understanding the error both signals that my system was serving to me
00:12:11.399 this is a pretty simple example but it's not an unfamiliar one and I use
00:12:16.860 this as a stand-in for the many times we react to unknown or unexpected Behavior
00:12:22.980 there are countless times that I had misread a stack trace or misdiagnosed a bug or misunderstood what a line of code
00:12:29.640 was doing just because I totally thought I knew and carry that assumption forward
00:12:37.440 I think of certain errors that I see frequently that it can be easy to kind
00:12:43.320 of be numb to the specific error and reflexively change what I'm most unsure
00:12:48.540 about sometimes it's a mock I don't feel confident I wrote correctly or it's a
00:12:54.120 new API that I'm working with so I'm sure I've misunderstood what the keys are
00:13:00.260 often the complexity of the task at hand obscures the simple stepwise process of
00:13:07.260 reading the error fully so what can we learn about these tricky
00:13:12.779 places we find ourselves regularly sometimes these resolve these resolve
00:13:19.079 themselves just on a Second Glance or a simple put somewhere but
00:13:24.959 how often do we carry these assumptions further shifting into autopilot mode I think of being confused by something's
00:13:32.940 erroring and going to check if it's related to a bug that I saw last week
00:13:38.120 instead of fully even just reading this to actually so notice where this instance of the error is coming from
00:13:46.079 I've noticed that when I commit to a practice of observation of reading the
00:13:51.360 signals and signs of our application I can save time and frustration
00:13:57.660 so we ask what can we learn from our chewed up kale moments and develop an eye for those earlier quieter hints of
00:14:05.639 things in this well going back to our gardening Adventures
00:14:11.639 spring turns into summer and summer cools into fall and Lucky For Us East
00:14:16.860 Bay Growers we've got a long season of cool weather gardening ahead of us
00:14:21.959 this time we're going to grow carrots and beets from seed and another exciting development since we last gardened
00:14:28.380 together we've got a backyard so we're going to be growing into the ground no
00:14:33.420 more crimped pots for us hold your excitement well to do this we need to make some
00:14:39.480 space in the yard for our new vegetables and so I dig up the weeds growing in a patch of ground amend the soil with some
00:14:46.320 compost and then so carrot and beet seeds and then we wait
00:14:53.160 several weeks pass and some seedlings start popping up I realize though that some of these are
00:14:59.519 the weeds from before and since now that we're growing outside
00:15:04.680 of pots we're more subject to deeper rooted plants and volunteer plants plants from seeds that are removed
00:15:11.040 organically think wind or squirrels the thing about root vegetables is that
00:15:17.040 they need lots of room to grow those thick roots and when they're crowded their growth can be stunted
00:15:23.279 I wanted to protect my carrots and beets from other root systems growing too close to them and to do that I knew I
00:15:30.180 had to diligently weed but I didn't know how to teleport the plants I wanted versus the weeds that I
00:15:35.940 didn't well to answer this question to a new gardening group we go
00:15:44.279 Harris says I'd wait until those Sprouts are big enough to actually ID before starting to pull weeds
00:15:51.899 I thought that the gardeners that I queried would point out what to keep and what goes
00:15:57.720 but I sense we're getting a bigger lesson than just a task at hand
00:16:02.940 seedlings look alike when first sprouted and time needs to pass before we know if the seeds be planted belong where they
00:16:09.540 where they're growing Hera also asks us a question with what is a weed
00:16:15.660 at the end of the day weeds are just plants and I realize I was labeling
00:16:20.880 anything that wasn't a sprout from the seeds I'd planted a weed labeling anything I didn't expect
00:16:29.399 as a weed what was the cost of demand growth I hadn't predetermined to grow in my
00:16:35.760 garden patch as something that didn't belong there when we dictate what grows and where
00:16:42.420 based on expectations we're letting those expectations guide the growth of our garden instead of the seedlings
00:16:48.120 themselves and we lose the possibility of organic growth that can benefit our garden in ways we couldn't have
00:16:54.300 predicted by weeding my garden before I even knew what I had or how this new growth would
00:17:00.420 interplay with my beets and carrots I lost the possibility of volunteers and
00:17:05.699 other great addition to my garden SO waiting to see what I was sprouting allows me to instead be dictated by the
00:17:13.199 health of the seedlings or the utility they serve instead of just what I was expecting to see
00:17:19.679 naturally I thought about the seedlings we plant in our code when we build our applications on
00:17:26.220 predictions we similarly lose this benefit of organic growth
00:17:31.799 do you know that butterflies that lay eggs on my kale
00:17:37.080 they those same butterflies hate the smell of thyme and planting Time by your
00:17:43.320 kale can help deter those Butterflies from laying eggs
00:17:48.360 here's the other gift Hera gifted us let your seedlings grow to find out what
00:17:53.760 needs to be weeded great software is not built it is grown
00:17:59.760 let's dive into an example well we have a new requirement we need
00:18:05.820 to import new data from the plant API and uh that are leaves and we need to
00:18:12.840 store those leaves locally and we also need to associate them with existing stems in the database
00:18:21.000 so we've got a fetch Leaf objects and Associate them with stems
00:18:26.640 the first question is what's the entry point where are we going to plant our new code
00:18:32.700 one option is the root grower an existing service where we fetch roots from the same API and attach them to
00:18:39.900 stems there's already a lot of coup that we're going to need like code to instantiate
00:18:46.980 the connection with the API to grab existing stems from a database and
00:18:52.140 iterate through them to set those associations I could imagine adding some code simply
00:18:58.919 into that existing service um
00:19:03.960 we can add some new code to this existing service so that we first are attaching The Roots
00:19:10.260 and then attaching the leaves are new requirement so let's think of the trade-offs from
00:19:15.960 this approach it's probably just a few lines of Code A
00:19:21.059 change in an existing file we'll probably get our feature to the you the hands of the users really
00:19:27.179 quickly well what are the downsides now the attaching of the leaf and the
00:19:34.799 attaching of the root are coupled actions so we're gonna have to follow the existing order of operations and be
00:19:41.400 coupled to the timing and architecture of that existing root grower
00:19:46.860 we'll also be adding some complexity to our root grower where the exist to the
00:19:52.020 root grower so now our root grower is also going to have to know how to grab leaves and how to associate them with
00:19:58.380 stems well another option is to plant a whole new object into our app
00:20:05.940 this process can feel less attractive because it's adding a lot more code uh
00:20:11.760 new files new tests Etc including a fair amount of code we already have in our
00:20:16.799 root grower and now if in the future if we wanted to
00:20:24.419 make an update in let's say the coup that connects to the specific API we're gonna have to make it in multiple places
00:20:31.740 so this can feel like some downsides but what is the flexibility this is going to give us
00:20:38.039 well now sprouting this new class will allow us to decouple our new feature the
00:20:44.760 growing of leaves from our grow our growing of roots
00:20:50.580 this will allow us to let this new feature where planting develop independently from that previous feature
00:20:58.740 and we can let the organic forces of our application bug fixes feature editions
00:21:04.200 adjacent refactors grow our seedlings letting this object grow can reveal the
00:21:11.940 abstraction that connects these two surfaces instead of coupling them by just adding
00:21:18.059 to the same place taking this concept further we could
00:21:23.400 even plant two new objects one to fetch the leaves and the other to associate
00:21:28.919 the stems
00:21:37.740 we could even add two different triggers that are not automated like the previous service and worker was let's say two
00:21:45.360 different buttons that our users will push previously we had to attach the leaves
00:21:51.480 right exactly where we were attaching the roots to take advantage of some of that code that was already there for
00:21:58.020 example to be at the iterating of the stems well instead if we had two different
00:22:04.500 buttons each connected with each of these triggers we we could have two different places
00:22:12.059 where our users could control this feature and it can seem like a downside because
00:22:17.460 now the user has to click two buttons instead of getting stems with leaves already attached and it introduces a new
00:22:25.380 place for bugs but it could be really powerful to wait to
00:22:31.080 automate our users are part of our system and they re reveal information about the way
00:22:37.500 in which they choose to use our new features that information would be lost if we dictated when this data would be
00:22:43.980 fetched this method of planting new objects into
00:22:49.500 our code base also allows us to leave some seams in our application a seam is a place where you can alter
00:22:56.460 behavior in your program without editing that place so creating two different objects with
00:23:02.460 different call sites allows us to create seams for each of these behaviors
00:23:07.919 a seam can serve as an entry point and delineation of a separate feature and
00:23:13.020 could also be a seam towards code that's more likely to change so one that lets us go in and out
00:23:20.460 leaving seams where we plant seedlings allows us to have an edge around a flexible decoupled object that can
00:23:27.539 adapt to our changing requirements through this process we kind of we let
00:23:33.960 the abstraction grow out on its own maybe we'll find that the abstraction that's most useful is the piece that's
00:23:40.620 actually attaching to the stems we really see this approach shine when the next verb requirement comes in
00:23:46.700 instead of squishing into the same object as our root grower we can have
00:23:51.900 different scenes to consider and choose from this can be a really good framework for
00:23:58.200 approaching Legacy code when we add to code that already exists
00:24:03.539 we can ask whatever factors are necessary to leave the scene leave seams where they did not exist previously
00:24:14.159 this technique really drives home the point that Sandy mats has made previously of duplication is far cheaper
00:24:21.840 than the wrong abstraction and when we build modular objects into our app it can grow and evolve in the
00:24:29.280 wild of our application and as objects grow towards each other we can make abstractions that make sense and that
00:24:36.480 were made in the react in reaction to our growing needs instead of because where we happens a couple or code
00:24:42.179 together or because code looks similar this process can really avoid premature
00:24:49.620 or factors or coupling features based on implementation and let our seedlings grow to tell us which refactors our
00:24:57.120 application needs
00:25:02.820 I wanted to show you what happened in my case which is three weeks later
00:25:07.919 I was sure this seedling was definitely a beat only to find out
00:25:14.100 I was wrong and I show this for y'all because one of
00:25:20.039 the harder parts of waiting to weed or transplant your seedlings is you have to
00:25:25.140 keep around seedlings you're not sure about in one word patience the difficulty of this philosophy shared
00:25:32.580 between code and gardening gardening is that it can require discipline to let a
00:25:37.799 plant grow larger and become harder to move when we're unsure it belongs where
00:25:43.260 it is and when we revisit code that we know is still growing it can take discipline to
00:25:50.279 leave it there and wait for new Sprouts to inform your abstraction
00:25:55.860 action can feel easier than letting time pass and let our garden grow
00:26:01.500 but it does bring up an important question of when to refactor when we have different objects each with
00:26:08.520 their own call site it can result in code that could look duplicative or redundant
00:26:14.039 a simple rule of Threes where you wait until you have three different places doing the same thing can serve you well
00:26:21.840 for me the more powerful idea has been that the bigger mistake is to refactor too early
00:26:28.020 wait to see what your seedlings are before you eat
00:26:34.200 talk about some tools that could be helpful for me the biggest skill that has served
00:26:39.960 me is an awareness of a very specific feeling close your eyes picture that it's 4 30
00:26:47.360 you are been solving a bug all day and your inches from a solution and you know
00:26:53.100 you're missing something obvious perhaps imagine the last time you were there and think are you listening to
00:27:00.299 your application reading errors fully being thoughtful about what changes you
00:27:06.120 make to your code you can open your eyes to me this is all about identifying that
00:27:12.120 feeling and throwing tools at it that's the place we don't want to be and
00:27:17.640 we want tools to reset from that place well the first tool I'll offer is to
00:27:24.299 talk to your plants in general incorporate the practice of stating assumptions
00:27:30.299 and by its nature this is the power to naturally slow you down
00:27:36.240 when we're working that can mean things like saying out loud how we expect our tests to fail stating what hypothesis
00:27:43.320 we're testing while debugging for example I wonder if the variable is not being set correctly in the controller
00:27:49.620 let's go check out that file it can mean reading each error out loud
00:27:55.140 the method that that through the error and working up the stack Trace in a
00:28:00.779 stepwise manner or even asking the question what and what question are we answering right now
00:28:08.279 these practices and the slowing down that follows can be a really good antidote to that Panic feeling
00:28:15.600 this could be useful in both pairing and soloing with your rubber duck I've had pairing sessions where my pair
00:28:22.500 and I grew increasingly confused by a bug each wanting to quickly try hunches grabbing keyboards
00:28:29.159 and while I can feel like we're getting to the bottom of something honestly more often than not This Is Us
00:28:36.900 spinning our wheels and it's usually the kind of dynamic that leads to testing far out theories that would have been
00:28:43.500 quickly that would have been quickly invalidated if we had looked a little closer
00:28:50.880 I've also had times where I was confused by some code and I brought in a pair and
00:28:56.100 then I was frustrated because my pair made me start at the top I've stepped through each piece of the code path
00:29:01.679 however those seemingly not useful practices because I totally know where the issue is often bear the most fruit
00:29:09.600 these practices unearth assumptions assumptions at the root of most bugs
00:29:15.960 so shifting coding Dynamics to being more open to being slowed down and holding ourselves to strive for the
00:29:22.260 force that goes back to the simplest thing can be really useful
00:29:27.480 practicing the stepwise approach on the regular will make it be one that you're
00:29:32.640 more likely to turn to when it's more more of the frustrating spots
00:29:39.299 the second tool I'll offer is walk in your garden as Pam told us to do
00:29:44.820 one way to do that is to adopt the practice of daily diff into your deaf process
00:29:51.240 at backer kit we spend the 15 to 20 minutes after stand up reviewing the commits of the last day to familiarize
00:29:58.440 the team with all the changes that that are happening in the code base this serves to surface the areas of the
00:30:05.100 code base that are changing which informs ongoing Feature work or also
00:30:10.500 when we notice any unexpected behavior that either we notice or users report or really helpful in triaging some
00:30:18.899 exceptions that our app is throwing it's really not uncommon for me to say I
00:30:24.659 think we saw something about that in Daily diffs it also serves as a great way to zoom
00:30:31.919 out on all the Sprouts that are growing in our code base and watching them change it gives us an idea of the
00:30:37.799 patterns through our app now for a larger teams this may not be a
00:30:43.559 15-20 minute exercise if you want to review all the commits from the day before but there may be some Cuts you can make
00:30:50.100 whether it's commits for a product or an epic or from certain teams perhaps labeling commits to review the next day
00:30:57.480 could be useful another tool that can work is just a time box of reviewing however many
00:31:03.539 commits you get through in 15 to 20 minutes just a general awareness and surfacing
00:31:10.320 of the changes can be really useful and the last tool I'll offer is weeding
00:31:16.440 and I know I asked y'all to be thoughtful about what you label as weeds but some of some parts of our garden are
00:31:24.360 more we'd like than others what I'm talking about is noise in the form of deprecation warnings console
00:31:30.720 errors and logging and these can Sprout up in your terminal or the console that's running your tests
00:31:38.279 or CI and can be tempting to ignore it could be really easy to build a
00:31:44.940 tolerance to that noise and then not notice when you've committed a new one into the code base
00:31:50.700 or not notice when there's an error while you're working on a feature
00:31:56.399 where sometimes these are warnings of upcoming changes to gems and other dependencies and it can really hurt to
00:32:02.760 get the rug pulled out from under you when it's no longer a warning and it's an error
00:32:09.059 there's a question of when to tend to these I'd say as soon as you see them building
00:32:14.399 that practice of taking that detour to solve them there or at least put a
00:32:19.440 ticket if some investigation reveals it'll take longer can lead to keeping your garden as close to Weed Free as
00:32:25.440 possible if you're in a place where there's a lot
00:32:30.840 of noise already one effective tool is to just make a ticket for each one and committing to
00:32:37.020 let's say 20 of each Sprint to paying down that debt
00:32:42.299 well I want to thank you for coming to uh um growing software from seed this is
00:32:48.600 a beet seedling that the butterflies have yet gotten to um let me know if you end up trying
00:32:54.000 something different on your team or in your garden there's my Discord nickname and my Twitter handle and my email and
00:33:00.659 I'll be checking this channel through railsconf I wanted to give a shout out to backer
00:33:06.419 kit where I get to explore these ideas and more with my team backer kit at backer kit we make some
00:33:12.299 rad things for creators and crowdfunding we strive to grow both our code and our
00:33:17.460 people and we're currently hiring for both the dev and a designer position I'd love to tell you more
00:33:25.019 all right y'all thanks again have a great time