It gets worse when dependencies have changed and now you've installed a library that's incompatible with the dependencies of an app you need and everything grinds to a halt.
Yeah, I've found that enough things change between installs that it's really tough to automate the process. Instead I keep a document that lists all the steps I need to set up my dev machine from scratch (with a data backup), and each time I go through the process I update the document. That makes it much less taxing than trying to figure out and remember everything without a guide, but is flexible enough to handle the inevitable differences from one time to the next.
If you're provisioning machines on a regular basis it's a different story, but if it's your own personal machine that you're reinstalling maybe every couple years this seems like the most straightforward approach.
Also: Use LVM and snapshot before updating to save yourself a lot of headaches.
I went one step farther and built an Ansible role for my workstation and try to install everything via that role. I don’t always, but it sure makes reloads and new machines easier to deal with. I have since split it into a couple roles for full desktop vs somewhere I just ssh into but have enough access to install things to suit me.