Ask HN: How do you find the "why" behind old code decisions?
Posted by siddhibansal9 2 days ago
Curious how teams actually handle this in practice.
When you’re modifying existing code and need to understand why a decision was made:
Where do you look first?
How often do you fail to find a clear answer?
What do you do when the original author is gone?
I’ve been running into this more often lately --digging through PRs, Slack threads, and half-written docs just to piece together context, and I’m wondering how common this really is across teams.
Comments
Comment by sloped 1 day ago
Commit logs, slack/email/etc, documentation silos, or issue trackers are your best bet, other than actually being able to talk to the author(s) of the code.
But in general, the decision was made because in the time the developer had to implement the feature or fix, this was the best solution they could come up with. Hopefully if there were clear tradeoffs, there is some comment as to what they might have done with more time. Likely though they were rushed, told their team they wanted to go back and fix this, and then were ushered into a new project the second this one stabilized.
I think gghhjnuhbb has the best alternative to finding actual documentation and that is sitting and putting yourself in their headspace. That can sometimes lead to insights you might have missed.
Comment by SAI_Peregrinus 1 day ago
Comment by birthdaywizard 1 day ago
We're more diligent about ticket descriptions these days, but we weren't always. Obviously the best is to be able to to talk to people, followed by documentation, either explicit documentation or on the ticket itself .
After that it can be useful to look at all commits that were related to the change itself. You can often piece together why something was done from looking at how the changes happened as whole, or even which parts were rewritten as requirements changed.
Another option is to talk to people in your org closer to clients. Support or client managers can sometimes have a better idea of how features are actually used, meant to be used, or what parts are more valuable than product or engineering will, especially if they're revisiting a feature for the first time in many years.
But yeah, often you can't. You're best bet then is to make sure you really understand the feature look at it with fresh eyes. Say "Well this is how it DOES behave, how do we want it to behave from here?" Actually talking to clients can be helpful here if any of them are willing to talk to you. In enterprise software, you can probably find a client who wants to shape the direction of the feature and has some strong thoughts.
Comment by FrostViper8 1 day ago
Most of the time I don't know why something was done a particular way .
Comment by nuc1e0n 1 day ago
Comment by FrostViper8 1 day ago
Comment by nuc1e0n 1 day ago
Comment by FrostViper8 12 hours ago
Obvious display issues in a mobile app on the login which is the first thing you see. Like the login not being on the page, things being misaligned (by quite a lot). Fixed in like literally 2 minutes.
This is basically due to laziness.
> If you must do unprioritised work at the bare minimum create a issue tracker ticket to provide more information than can fit in a commit message.
I create tickets for each commit I do. So people know why I have done things. These people don't do anything of the sort.
> Something like selenium is good to automate acceptance testing (with screenshotting) cross browser as well.
I can't even get these guys to write basic unit tests for React components.
There are two different worlds. There is the world where things are done more or less properly and there is the rest of us. I've heard of some places that don't even use source control, CI builds or anything that may have been novel 25 years ago.
Comment by ivoryweb 1 day ago
Comment by tmsh 1 day ago
Then the answer is just one prompt away… (I wish our team was more committed to 2 - will push for it more in the future). Having acceptance criteria in stories linked at the start of each sprint is so important though I think for alignment of work.
Comment by pella 1 day ago
- https://github.com/peter-evans/lightweight-architecture-deci...
- https://www.thoughtworks.com/radar/techniques/lightweight-ar...
Comment by digikata 1 day ago
Lightweight ADRs are a good recommendation. I've put similar practices into place with teams I've worked with. Though I prefer to use the term "Technical Memo", of which some contain Architectural Decisions. Retroactive documentation is a little misaligned with the term ADR, in that it isn't really making any sort of decision. I've found the term ADR sometimes makes some team members hesitant to record the information because of that kind of misalignment.
As for retroactively discovering why, code archeology skills in the form of git blame and log, and general search skills are very helpful.
Comment by austin-cheney 1 day ago
In some cases there are many options and great talent is readily working on the problem for the given organization. Its nice to have options, but this is an exceedingly rare scenario. For example there are tons of options available today, but from reading HN job posts it looks like the answer is still a CRUD app that does some SAAS solution with React, AI, and Python. I could guess that and be right more than 60% of the time, which is extraordinary considering these businesses have thousands of technology combinations and unlimited ideas to pick from. Its all about the talent available, but when I say talent I just mean people because when you are that restricted it isn't very talented.
Comment by cweagans 1 day ago
Comment by Fred27 1 day ago
Comment by taklimakan 1 day ago
To actually answer your question, do a git blame, check the commit messages and anything linked in commit messages. Do some search in the company’s internal knowledge base, architecture documents, specs, whatever you have available. Even if you don’t find a direct answer, understanding some more context might eventually lead to one.
If you have no documentation at all anywhere, then you have to analyze the code yourself. It’s part of your job. When you’re done be sure to document your findings.
Comment by krupers 1 day ago
Comment by cweagans 1 day ago
Comment by gcheong 1 day ago
Comment by alexhans 1 day ago
1. Either literally as a comment in the code. Immediately findable
2. As a description in the commit (easy to find with git blame).
3. As a comment in the Code Review/Pull Request system. This works for very stable things but is more brittle than the other ones. Usually exposes the discussion among parties but the outcome of that discussion should probably be in 1. And 2.
Another benefit of keeping comments in the context of where they happen is that you'll actually remember to update them. Otherwise, they're duplication (code smell) and introduce a risk of divergence.
That's why WYSIWYG standalone word docs or similar for design or manually written wikis are so dangerous for code that lives and keeps changing. The thing that keeps teams tidy is often single sources of truth where you can generate/render other things easily.
---
Reading tests or talking to someone is possible but if you had to do that for everything you might waste a lot of time so while it can be extremely beneficial I don't consider it my thought process.
Comment by atmosx 1 day ago
Now with AI it’s a lot easier to ask the bot to put together the reason behind this or that by sharing commit history.
Comment by pjdkoch 1 day ago
Comment by time4tea 1 day ago
The diff tells the 'what' - no point in writing 'added method bob()'
The message tells the why.
You can bet that over time, the jiras, the issues and the confluence, slack, o365, will all have been deleted, "upgraded" or whatever, and all you have is what's in the repo.
Using in-repo ADR, and in-repo 'what's missing, what's next' files are also useful, because they co-evolve with the code.
Comment by solaris2007 1 day ago
Comment by strogonoff 1 day ago
Comment by xupybd 1 day ago
Comment by mierz00 1 day ago
I see this a lot with developers who come in and start to criticise before understanding.
There is always a reason for why something is as it is, and it’s unlikely that the people before you were just idiots.
Comment by aristofun 1 day ago
If the requirement was never documented or lost, then you can only deduce it like Sherlock Holmes.
Low level answer is always- because this is the best way current developer could come up with given the organizational context and his level of experience.
Comment by SomeUserName432 1 day ago
Git commit will generally explain why it was done. The task it references may or may not explain the decision process that lead to it. Usually not.
It's rarely related to code, more often a business decision due to some obscure reason/desire which may or may not provide any actual value.
Comment by palmotea 1 day ago
Sometimes, not generally. A lot of people are bad at commit messages, and commits migrated from older tools may be unusably terse because those tools didn't support multi-line commit messages well.
Comment by treadmill 1 day ago
Comment by gghhjnuhbb 1 day ago
Edit: typo
Comment by Moldoteck 1 day ago
Comment by wonger_ 1 day ago
Comment by heenrik 1 day ago
TL;DR: You have to reimplement the application or features to understand the "why" regarding technical decisions.
Comment by Artoooooor 1 day ago
Comment by ahoka 1 day ago
Comment by kypro 1 day ago
- Every change beyond the most insignificant package bump should be ticketed, and specifically tickets should document the business why.
- Every PR should include a high-level description of the change, and should document any technical whys. It should also link to the ticket.
- Code comments should be used where appropriate to document code-level whys and hows.
- For significant architectural changes ADRs should written up to document why the architectural change was made.
Failure for your team to do this results in the problem you're experiencing now.
Comment by moomoo11 1 day ago
So in practice it was usually not too bad. Git blame on any line could point me to the PR and any associated ticket.
You just need to have some discipline among the team because there would be slackers who didn’t want to take an extra 5 min. But you know. You weed them out.
Comment by hahahahhaah 1 day ago
Otherwise cross reference ticket.
Otherwise search docs.
Otherwise ask teammates.
Otherwise don't change it.
If you have to change it have a careful rollback / DR plan.
Comment by bni 1 day ago
When it comes to code, run the unit tests.
Comment by abstractspoon 1 day ago
Comment by AnnKey 1 day ago