There is no software maintenance
henrikwarne.com
henrikwarne.com
Fortunately this idea is not mentioned anywhere in the article.
Imagine that all of those physical machines stop working tomorrow -- let's call it the fictitious but notorious y2.023k bug. Imagine the software won't install or run on the a current day computer+operating system. Imagine you cannot install the old version of the operating system on new hardware (missing drivers / the operating system vendor pulls an Apple and explicitly prevents that / it's against the ToS and you'll get sued / your license has expired / etc).
Now what?
I would argue that this model does describe maintenance, but a very bad form (due to the permanent addition of ill-fitting new features to justify the expense). In fact, I think that scrum's failure showed us that projects (what scrum apologists try to disregard as "waterfall") are the way to develop software. Iterations are the way to maintain it. One can put small features into the latter, but everything that's large or has business value deserves a project. You don't know the requirements yet? Then go get them before we start development!
Note that projects don't need to be long and projects can easily hang onto an established agile maintenance process, e.g., for releases and other infra. But they need to be planned properly, have an agreed-upon scope and don't need to fit into arbitrary sprints.
I think worse for business is not maintained software. When you move devs to another project after 6 months they lose connection with old code. Fixing anything non-trivial becomes 10x more expensive.
When you have team constantly working on code it is a lot easier to have stuff fixed.
IMO that is why we see everything moving to a SaaS model.
Where SaaS model allows multiple companies to get some software running in perpetuity by essentially sharing cost by paying subscription.
This code is in 100% maintenance. It is done - the existing functionality works reliability, and while I can think of some new features, I have no intention to add them as I am busy with other things which are more interesting and important.
Does it take me longer to fix bugs because I don't work on code daily? Probably. Would it be better (for my happiness or for business) if I start adding features people don't care about to maintain "connection with old code"? Nope.
Let me give a hypothetical example: in report FOO, field "Secondary Record" used to contain record number but now it's something else. Should the parser change output type to string? Or try to see if there is a record number somewhere in that string and return it? Or just pretend that this unparseable field does not exist? In my opinion, all of those options are terrible. The parser should stop parsing and alert human maintainer (me). A human will look at new data and decide what to do with it - maybe change the output type, or maybe there is now a record title as well which needs to be handled separately.
As for "pro-actively adjusted" -- well, that would be great, but the data comes through a long chain of services, and while each individual one has tests, there is no overall test for the whole chain. Could I make one and hook it up to each team's CI, so that parser never fails? Sure, but the service is in maintenance mode, so I am not going to do it.
Right now the downstream consumers are OK with the fact that sometimes data stops updating and they have to live with the stale data until I fix the parser. If they ever want more, great! We can set up the project, decide a priority, allocate time (mine or someone else's) and do it. But until this happens, the project is in maintenance mode.
There is a ton of software that is less a true product and more an integration of systems that only gets improvements and updates when things break. That’s maintenance and you weigh when to make larger changes against what’s valuable to the business, how much toil is associated with it, impact on team morale, etc. If you don’t you’re just making uninformed decisions for the sake of some fuzzy metric representing how connected to code you are.
Some are on retainers for ad-hoc support, some are under constant feature development as that is what the business demands, and some we put together and handover to the client complete per a spec.
We don't even use scrum/agile on every project, some just have really light weight agile scaffolding, some we do waterfall if it's small and the client doesn't want to participate in the goings on. It isn't one size fits all in software dev, clients have various situations and expectations you have to meet.
I also have small tools that can run after 5 years but I don't see these as interesting argument in the context of article.
It’s the same model as car repairs. You can do checkups and small maintenance every month, or have the whole thing checked and repaired when enough time passed or something critical broke.
IMO it comes down to wether you can afford for it to break . If it’s a subsystem that can be broken for 2 weeks, regular maintenance might not make much sense for instance.
I see the actual problem being that management is rarely simultaneously deep enough and strong enough to make the right choices around work organization so everything just defaults into hierarchies.
For instance if there was a “blue check” team of 3 people at Twitter, they’d have a hard time justify keeping the team 100% committed to it for years after the feature is released even if there is some small amount of ongoing work needed.
Looking at estimated output vs the costs, they’d probably hibernate the team most of the time, as you do with projects basically.
If your core business isn't the software you're building, I tend to agree, but then building instead of "buying" would usually be a mistake.
And buying is impossible in a lot of cases: if we're gonna be differienciating vs the competition, we wont use an off the shelves software, and sometimes the clients want customization so complex, we could have bought the thing and still need a big team to customize it.
I think the guy is basically saying projects need to come back, which I can accept but then we need to know: are deadlines good or bad ? is the client supposed to invest his time in the product or wait for completion ? can requirement be known before progressive iterations have shown a building skelleton to the client ? are developers wasting more time waiting for project design completion or fitting arbitrary scrum sprint scoping ?
Couldn't really disagree with this more.
Sure, don't start development before you know any requirements. But also don't wait to start development until you (think you) know all of the requirements.
The client doesn't know what is possible, we need to understand their business.
For the latter case, classic project management simply leads to failure and it needs iterative development with tight feedback loops.
Ye I have come to this conclusion too. I am not even reading "waterfall" as a pejorative anymore after all the agile I have had to endure.
"Every time I hear about software maintenance as a distinct activity, I cringe."
The author seem to suggest that never ending agile grind is the way to go and that programs can't be more or less done. Maybe he is doing Cloud™ stuff SaaS, where ongoing costs are a feuture not a bug.
But sometimes you sell a product, and the product or some component of it (perhaps some integration with another tool) of it really is in maintenance mode.
You decide that acquiring new customers is unlikely, or not worth the cost, and you make the bare minimum of changes necessary to keep the lights on. No one touches it for months, and when they do, there's a bug fix. Perhaps customers have new ideas for using the software, but you're not going to do them.
That's maintenance mode. It still exists. It's not a fun place to be, but it's real. It even can be valuable (since fixing the occasional bug report can be very low effort, but necessary to keep customers around).
A lot of established APIs are pretty stable, so you may not even need a single full-time person (when averaged over a year).
I hope not sound too critical, but the authors product model perspective is one I would expect a junior software developer to propose; as it does not consider a wider perspective that includes sales/business side of things. When I sell a software product, customers have certain contractual expectations about what they are buying, and what support they are paying for.
Such a product can well be developed on a project basis and with successful completion the development can then halt altogether and those resources redeployed in a subsequent project which can actually be completely unrelated to the first.
But the simplest of cases is not what is usually found.
At the other end of the spectrum the hardware area has some good examples where sometimes the physical hardware "product" purchased and delivered amounts to a much less significant contribution to the Total Cost of Ownership when it comes to the product aquisition itself. Some products just by nature or design whether because of complexity, or maybe just defects, aren't really that useful without essential ongoing factory support and maintenance which ends up costing much more than the purchase price of the "product" initially. Sometimes even a hardware purchase is just the ticket in the door for the manufacturer to provide more profitable follow-up services, resulting in more steady cash flow for years to come.
Things can get a bit nebulous when the product doesn't really have a tin to say everything you need to know before buying it, but it's definitely possible and sometimes the only acceptable thing, for the most suitable software product to be the one that requires no ongoing support or maintenance.
Unlike hardware there's nothing physical to wear out or replace. So there'e even more chance with software to come up with a clean separation between those projects which are best brought to successful completion, resulting in a product that can stand on its own, versus having the project itself be the actual "product" and having that be never-ending.
What the author's saying is everything should be never-ending which is ruling out some of the most effective solutions to some of the most important probems.
Most software applications get there. Take your favorite IDE. It's in maintenance. Vim and Emacs are in maintenance. Your bank's web app is in maintenance. Chrome is in maintenance.
I admit this is somewhat arbitrary, but there are things that you do less of, and things you do more of on a lot (most) of production applications with users. Sometimes the needed functionality target was missed the first time. Maybe the second time. Maybe users massively changed their minds. So you might not get into maintenance for a long time, but that might be more due to a poor understanding of what the market wanted, rather than there being no such thing as maintenance.
I used to work in a (Scrum) team where 80% of our projects were in maintenance mode exactly the way you described. It felt horrible to work there as an engineer (at least for me who enjoys creative processes and development).
You still get all the meetings, administration, rituals, debates over minuscule stuff - without delivering any customer value. There were entire sprints where most of the team hasn't shipped any useful feature, only fixing cryptic bugs in "other people's code" that nobody really cares about or keeping up with the latest changes in the NIH syndrome-ridden microservice environment.
Realizing that such a large organization can't be fixed, I moved over to a different company where the engineering team works more with a "product engineer" mindset. Probably the best decision in my career so far!
We're still "maintaining" software, fix bugs and refactor etc., but due to how Shape Up [1] works, creating customer value vs. maintenance is almost always 6 weeks vs. 2 weeks so 3:1.
But even for a Scrum team in a large org where some projects are passed around like hot potatoes, I'd never assign more than 50% maintenance mode projects to any team. This may not be the most efficient from the organization's standpoint, but it would probably do wonders for preventing burnout and employee churn.
Unfortunately this is not good example, because Chrome undergoes continuous refactoring and is always adding new web features. Even V8, which I worked on for almost 7 years, is definitely not in "maintanence", as JS changed radically in that time and we added the Wasm engine subcomponents.
I kind of agree with your other points, but this is really a spectrum. For example, a 115 year old house is in "maintenance mode", yet it needs new insulation, wiring, upgrading the heating/cooling, interior redesign, floors, windows, etc.
The truth is that most long-living systems are composed of many different subsystems which run the spectrum from "install once, fix it when it breaks" to constantly being rejiggered.
Regarding the project vs product model, it fully depends on the business. Venture outside of the SaaS/FAANG/etc type businesses that HN seems to focus on and you'll see countless businesses that are very happy to just have a project done for X cost in Y time. After that, the project goes onto a maintenance contract, where the development team is just expected to keep the lights on, fix bugs and keep it secure. From my experience, it's a huge part of software development, considering the amount of systems that exist in this form is only increasing.
Projects develop new products but are expensive to undertake. The enterprise products that resukt from these projects are largely profitable though deployment and maintenance efforts.
The issue is creating a shared understanding that "software is never done-done". The decaying corpses of marketing iPad apps from 2010 show the only area where this is not the case - there is one very specific period when the app is relevant, and everyone knows that after nobody cares about the software even if some users would.
What can help against the "maintenance trap" if the business is listening:
* "Legacy" is a taboo word. Replace all instances of "legacy" with "this pays our salaries" * When you build a system, stay cognizant of when you want to put it to rest. If the system outlives that horizon - which often does happen esp. if it does pay your salaries - examine and extend that horizon. * Be very, very alert about people let into the organisation who pitch a "full rework to get rid of all the maintenance", and - if the system already in place is not absolute shite - just give those people a pass.
The topic is very, very underresearched and the only article I saw about it which was truly astounding was https://apenwarr.ca/log/20171213
One could say that all office workers do the same job -- reading text on the screen, clicking with their mouses and pushing buttons on their keyboards. But this misses the reasons why people are pushing those buttons or clicking things with their mouses.
> However, if you consider that the environment the program works in can change (library or OS upgrades for example), then you could compare this to handling wear and tear.
> There are systems that are maintained only in this sense: fixing bugs, and making sure that it can keep running. But I would argue that this is a very small part of all software development work being done. Furthermore, when it comes to fixing bugs, there can be ambiguity. Is this really a bug, or is it in fact a request for new functionality? And why fix the bug at all, if it has worked up until now, and the only objective is to keep the system running. So, in some sense, this form of maintenance is also just ordinary software development.
I’m not sure what to think about this in particular. A program runs on a computer, which has an OS, and over time those OS’s are updated. Is “make sure it runs on RHEL 9, when it already ran on RHEL 8” a development or maintenance task? I would characterize maintenance as dealing with the inevitable decay of things over time. Technically the computer+RHEL 8+program system should still work but of course you probably want to benefit from the new development work put into RHEL 9. And if you let your OS become too old, it becomes unsupported and insecure…
Depends on the domain. There are millions of native Android and iOS apps that are only (slightly) updated when Google/Apple forces developers to.
I work on business software that serves an industry for at least 10 or 20 years, and there is never any end to development. There is always value in making the industry-serving software better at serving that industry.
Sometimes that means fixing bugs. Often it means tweaking the schema to better match real life.
There are companies that can afford the "product model" but it would require that everything developed by a company maintains a full dev team per software component. However, not everything needs to have features being added to it continually. It makes more sense from a people management perspective to move that team off and have them work on something else. In which case you have something in maintenance.
If you have to budget software it does make sense to think of it in terms of the capital expense of upfront development and the operating expense of it's maintenance. Much of the operating expense may involve hardware upkeep, recurring licensees, etc. People are an operating expense too but they can be moved around. Nevertheless the 'software' (without you) needs to be thought of as something that will be maintained when you're not working on it and what the cost of doing this will be.
I'm not sure if I see the value in making such distinctions though.
So yeah, there is a development and there is a maintenance phase. On big projects that can spawn years eventually the maintenance phase can be seen as continuous integration, which is what the article's author is talking about, and that phase can be 90% of the project budget/lines of code/lifetime but is still the maintenance phase.
As Ray says it, he is seeing this through corporation colored glasses.
Some people, not many, take software maintenance seriously and conduct studies on it - in the study at the link below they point out that comprehending existing code took on average 57% of developer's time. Actual editing consumed 5%.
And software maintenance is no different - think again.
https://www.researchgate.net/publication/318811113_Measuring...
And then those projects passed UAT, then went on production, a round of change requests and the teams were disbanded, with maybe a single developer giving some of their time to fix a bug. Sometimes such project went many months or even a few years with no development time spent on them. Some had backlogs of bugs, but it was very hard to mobilize resources to fix them. The company was chasing new project that were bringing more money, so after delivery the old projects had huge opportunity costs, even if there were maintenance fees.
There's a clear difference between the early life of a software product where there is a lot of fast paced development to create the product, deadlines, etc. and the maintenance phase of a product where most of the team goes off and does new things and a smaller team remains to keep the thing going. It's a bit of a grey area where one stops and the other begins. And of course some popular products keep on evolving at the same pace because there's a large team working on them doing major new releases once in a while.
However, there's a lot of software out there that is still being tinkered with but that does not really change that much over time anymore. Most of that development is just keeping it going, doing some small changes as needed, adding features, fixing compatibility issues with new hardware/software, etc. This usually gets broken down into perfective, corrective, and adaptive maintenance. Software is never really done. If it's useful/valuable, people will keep on coming up with ideas on how to make it more useful.
What sets maintenance apart from regular development is that it is more reactive and unplanned. It involves less people and might not even be a full time job for the few people that are still able to work on the system, which usually requires having some history with the system.
1. Perfect software that doesn't run in a vacuum. Assume the software has no "bugs". It still operates within limits, and within an imperfect world. The hardware fails, it gets upgraded and is no longer compatible with the original software, the disks fill up, invisible particles shooting through the universe flip bits. All sorts of things outside the control of the application will cause the application to not function as intended. And as such, maintenance will be needed.
2. Imperfect software run by imperfect people. Even without any of the above problems, users will input the wrong data that the program didn't expect and cause an error. Sure, you could just assume that "software development never ends" (assuming that you will just find new bugs constantly and need to fix them constantly). But you don't have to fix a bug if an acceptable mitigation exists. People who still run Windows 98 or XP can't fix bugs, but they do work around them. And so maintenance can take the form of performing tasks which aren't changing the software, but are tasks that make it continue to function.
3. Actually shipping updates to the code to fix bugs. This isn't strictly necessary. There are many bug-riddled software systems that have been going for 40 years without patches (for the most part). But in the modern era, we have so gotten used to the website model of daily updating a piece of software, that this is what we assume 'software maintenance' means.
Once you write a piece of code, you might continue to maintain it using #3, but even if you don't, you will absolutely have to perform #1 and #2, if you want it to keep working. If you are very lucky, and the system is "on" but doesn't actually do anything, you can get away with not doing any maintenance. But the more you use it, the faster it needs maintenance.
I don't really agree that the line between a bug fix and a feature request is blurry. Those two activities are clearly distinct in my mind.
Another example is the classic, "users would never expect it to work like this" vs "it was designed to work that way (even though it is ass backwards)". Is fixing something to fit user expectations a bug fix, or a feature request? It can really be that the question hinges on an original design spec, which seemingly should not be determining factor (but it is, and who knows whether it was just done badly, or done wrong)
Debating all the linguistic similes we can use to describe the process is fruitless.
Despite that freedom of interpretation, I think your hypotheticals have really clear answers that most software engineers would agree with based on what was originally promised and intended.
If a user expects a sorting function to have ascending and descending, but I only originally delivered and promised ascending, later adding descending is a feature/enhancement. It doesn’t matter that the user didn’t like my original implementation, I didn’t promise descending.
Conversely, if I add the descending function because I originally intended for that function to be there and wrote some amount of code for that function, but it doesn’t work, that’s a bug fix.
I don’t understand the ambiguity, the difference is clear as day to me.
In any event, the whole debate revolves around the language of intent. Truthfully, a group of people can make up whatever language they want to describe their approach.
I think this kinda goes to the point of the article. No matter whether you call it defect remediation, bug fixing, feature work, it's all the same thing - updating an existing software system. I think the point is that the very _vast_ majority of work in software is on existing systems and its almost all is more-or-less the same thing. Which is to say, "maintenance" and "enhancement" are just about the same activity for the software developer. EG: if a feature can be added with a quick 'if' statement, and a bug fix can be fixed the same, are they really different activities? What are the implications relative to the time to understand the system before making that modification?
It doesn’t matter that the physical activity taking place is the same, because what the activity is for determines where the company puts the expense on the income statement.
So, for the developer, the activity is the same. Given most software is existing and not green-field, if you extrapolate this idea out further, it implies that feature and maintenance work have a lot more overlap and are fundamentally the same thing for even larger projects /features than just small bug fixes. It raises the question, at what points and when does feature work and maintenance work become distinct activities?
Well, we can nitpick on the wording all we want, but there are times when I feel I'm cleaning my apartment or repairing it (maintenance) and times when I'm extending it (developing).
Now if the point of the author (I'm not sure) is that you cannot develop without maintaining because both go hand in hand then I agree.
This brings about the distincion of the phases pre and post acceptance.
The 'maitainance' is a customary upkeep as no one but the outside developer can in practice economicaly assure the system's ongoing operation. It also incentivises the service provider to respond to keep servicing smaller adaptation requests.
And when you say 'the developer pays', that is 'the customer pays', as the insurance premium would be embedded in the project cost. Apart from the insurance industry, who wins here?
For there not being two distinct phases: well.... it depends on how you draw the line. "Prototype works" -> every change after that is arguably maintenance, not development, since it has been developed. What you're doing is then "just" handling its interactions with the real world - roughly equivalent to repair (fix bug / replace broken component) and maintenance (prevent total failure when one host dies / lubricate parts so they don't fail as quickly).
We don't refer to lubricating and replacing parts as building the machine though. I'm not building my laptop when I plug it into a charger.
---
Even if we both stop taking things to absurd extremes: I agree things are not "developed" and then "maintained" in most modern, always-updating systems, but I can definitely separate much of what I do into "development" and "maintenance". Development is whatever is focused on getting a thing working. Maintenance is whatever is focused on adjusting the system to make that development reasonable beyond the minimum hack, or make the changes long-term palatable, or updating libraries, or enhancing observability to resolve issues faster, or restructuring things to make future changes easier, or...
The list of things we do beyond initial "development" of a feature almost totally regardless of where that line is drawn is vast, and you can often adjust how much of it you do now vs later... but you generally cannot do "some" development later. It either works or it doesn't. You have a button that does nothing or a button that does something. Sure, you might be able to split a feature into MVP and nice-to-have sub-features, but you can't say "oh we'll figure out the conditions of that if statement next month, ignore it for now".
Thats where features grow, were software is properly maintained and tested. The further away it is from this route, the more it becomes a stagnant resource backwater, until the software - which might be alive in other sections, actually starts to die and bitrot, basically a forked away stand alone thing, with its own library, tucked into a corner, visited only on rare occasions.
One or more developers gets tasked with maintenance of this product and can bugfix fast instead of trying to ressurect the original software team.
So in my opinion maintenance is real and often used in different industries. :)
I've always been a strong, strong believer in an analogy like: How much time would you estimate that nuclear engineers spend operating and maintaining existing reactors, versus building new ones? How about public highway departments and building new roads, versus fixing or improving existing ones?
No analogy is ever perfect, but the only logical conclusion I can reach is that software engineering is a really weird discipline relative to practically all of its "we build things that last years" peers. Its weird because, well, our organizations in my experience chronically under-invest in maintenance then act flustered when new developments don't meet deadlines or take forever; but its also weird because all of my experience screams at me "I'm not even sure if we know how to maintain systems well".
I've seen this in one org (a public company you'd recognize); where years ago we had and met lofty goals like "99.999% availability"; today its a good month if we hit three-nines, API wide. In team meetings with really senior, smart engineers when we ask How Can We Improve This, you start observing this learned helplessness where they suggest small changes like, you know, adding a cache for some external API, or replacing the built-in HTTP client with some other one that has a more comprehensive knob for timeouts, or whatever. I talk with them privately and say: Is this really the best we can do? It isn't; everyone knows that; but we will literally never have the product dev time to really fix the problem; maybe, taking what we've learned from some old system and building a new one, cut out layers of abstraction, reduce and simplify. So instead, we supplement the problem with complexity; and the thing we won't admit is that this is like putting a bandaid on a skin tumor; it may improve the metrics on the short-term, but ultimately it is more complexity, it is more code, and in a lot of cases we've replaced one way that something fails, predictably, with N ways it can now fail, unpredictably, hopefully less often.
The other thing that no one will admit is: If the state-of-art way to fix something that needs fixed is to "take what we've learned from the old thing and rebuild it" (oftentimes, this is the best way; but that's another discussion): No one lives forever, and No one stays at a company forever. Knowledge is Temporary. Through leaking knowledge or increasing scope, taking on maintenance today is almost always easier than taking it on tomorrow; and it usually leads to productivity boons which magnify over time.
I word a lot of that from the perspective of developer experience/productivity, but it fits just as well with Security maintenance. I'm working alongside a company impacted by the recent LastPass breach. They were storing hundreds of internally minted JWTs in there like API keys; no expiration, and no way to revoke. "We have to rotate these"; well, lets take a look at this Jira ticket from four years ago where one of your senior engineers who left three years ago said we need to make these things expire, or at least add some kind of revocation list (ok, never word it like that to people; but that's what we're all thinking). We don't have that; we can build it, but now the app has 5000x the traffic and complexity, so it'll take time.
I share this talk by Johnathan Blow [1] all the time, because its fantastic and in this case he hits on a really good point: We only know how to do things by doing them. If we, as an organization, invest 10% of our time doing everything we can to keep existing systems running and productive; that may not be enough time to even develop the skills to know how to keep them running well and highly productive if we could fight for more time. One of the phrases I hear all the time, across many orgs: "small steps toward improvement". I think people who say that have either given up (learned helplessness), and/or they're critically unobservant of the inherent entropy of software systems. There is, no doubt in my mind, a "rate of decay" of every software system; its different for all of them, its influenced by factors like product velocity, external integrations, language, etc; but they all have it. And if you aren't investing more time in maintenance than your system's rate of decay, you're going to cause your People, your Customers, and if you're very unlucky (cough LastPass) your Business a lot of pain.
But; my special variety of learned helplessness is that I think the people in charge of most orgs actually like pain, and like inflicting it on others. Most likely something to do with the observation that psychopaths and sociopaths tend to rise through the ranks a businesses faster than those with empathy.
Imagine interviewing for a job and the CTO says, "Here at HyperAgileCorp, we believe that software maintenance does not exist. We realized that software development is just the act of adding features to products, and, amazingly, there's no end to the features we can add. Using continuous integration and deployment, we are able to add and ship features fast enough that no part of the code is ever in a stable state. Because nothing is ever finished, there is nothing to maintain.
"You might think this would lead to bugs, but actually, bugs are an impossibility. To have a bug would require a deviation from the designed or expected behavior; a bug is a problem with the code. We don't do any design or have any expectations at the level of the fine-grained behavior of the software. Remember, this is a product, and products have features. Like, the other day, I wanted someone to add tables to our rich text editor. You should be able to click the little icon of a table and it should insert a table. That's a feature. Making the software crash less often could be considered a feature--that is, something we could implement. But we don't know if a missing feature is a "problem" until we evaluate how it impacts the customer and our bottom line. If adding a row to a table crashes the app 1% of the time, or 10% of the time, for example... true, that is an opportunity for a feature (not crashing) which could enhance some customer's experience of using the software, and maybe it could even lead to more sales and a more successful product. Keep in mind, though, that we have a lot of other features we are working on that will also enhance the customer's experience, and we have some ideas about how they could lead to a lot more sales.
"Besides, we ship new versions of our software every day. Even if something 'works correctly' or 'doesn't crash' today, a junior dev might change the code tomorrow and make it work 'incorrectly' again, according to somebody. And that's a good thing, because that change is probably part of some way we are making the product even better. We're not trying to keep this code the same. That's the old 'maintenance' thinking. 'Maintaining' something means 'preserving' it. Preservation is for jams and jellies. We're developers. Builders. That junior dev is probably building a big and important feature. It's not practical for him to understand all the code he's changing. His lack of experience doesn't matter, though, because, as I've explained, his code won't have any bugs and won't require any future maintenance! We'll just keep building."