I'll tell you one of my personal hells:
Overabstraction.
"Ce qui vaut la peine d'être fait vaut la peine d'être bien fait". ("What is worth doing is worth doing well".) You've heard that one before. That's just a gateway drug, though. Doing something well leads to wanting to understand the patterns and causes and then, once you can start to get a grip on the classes and methods of that something it's only natural to want to start building a machine of some sort to do that something for you.
(I'm saying "you" but I know I'm thinking "me". Bear with me on this one. I need to talk about this like it's your problem. It's easier to deal with, etc.)
My big Home Project now is building some steps from the back door of the garage down to the back yard—the Backyard Steps Project. In isolation: it's not that difficult of a problem.
Plot twist.
My wife would also like the backyard to be leveled—the Backyard Leveling Project. In its current state (which I was tempted to call its "natural state", although this would be a casual lie because it was certainly modified during the installation of these suburbs in the ~1960s, and perhaps even before that, I don't know) there is a downslope from north-to-south and from west-to-east. As the proud owner of a shovel (a collection of shovels, really, don't judge), the solution to the leveling problem is simple: take a shovelful of dirt from the high side and put it on the low side. Repeat until there is no high side or low side.
Simple specification, simple implementation. I'd crawl on my knees and beg for a spec to be this easy to implement at work. However, there is some coupling between the Backyard Steps Project and the Backyard Leveling Project that is giving me a headache.
How many steps does one need? Assuming you care about your user (you should—I do), the steps should be an equal height—an obvious assumption, sure, but we're just building out the model here. Now you have h_step, and n_steps * h_step will be the total elevation change (h_total) from the landing at the top (z_top) to the landing at the bottom (z_bottom); or, in reverse, the total elevation change will give you n_steps, just divide h_total by h_step. z_top is fixed—the garage slab is not going anywhere. But z_bottom is z_backyard, and the value of z_backyard to use is its future value, after leveling. h_step—we'll limit the values for this one between 6 and 7.5 inches.
And, to some extent, since setting z_bottom affects the rise-over-run of the whole set of steps, z_bottom also affects d_step, the depth (or amount of run) of each step—and we'll also assume d_step to be equal for all steps. But this can be somewhat mitigated by changing the length of the top and bottom landing. (w_step, the width of the path, was fixed at 60 inches through what we might call stakeholder feedback.)
A diagram would be helpful, no?
[TBD: diagram]
I've also gathered measurements (good ol' stick, string, and bubble level) for the project. The measurements break down into two groups: (1) the ground leading from the garage door to the edge of the deck (a single arc); and (2) the back yard measured in 2-ft increments 32 feet south of each deck pier (so, basically, six arcs of data). Call it data_1 and data_2 for reference.
data_1 is easy because it is just measured from the deck (the top edge of the deck planks) down to the ground with a (large) ruler. It assumes that the deck level is fixed because otherwise why bother. It also assumes that the east-west slope here is zero, which is not accurate, but not far off—since this bit is not part of the yard leveling scheme, it doesn't need to be accurate, I'm not accounting for the volume of dirt to move.
data_2 was massively annoying to capture. I attached the string a clamp on the wood supports one inch above each of the concrete piers to provide a reference height for each series of measurements. But each pier has a different absolute height—so, essentially, there is a z_string for each series of measurements that defines the height of the fixed string above the ground to give the raw measurements.
h_pier | 16.00 | 14.50 | 16.00 | 16.25 | 15.50 | 18.00 |
h_string_offset | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
z_string | 17.00 | 15.50 | 17.00 | 17.25 | 16.50 | 19.00 |
y_raw | z_1_raw | z_2_raw | z_3_raw | z_4_raw | z_5_raw | z_6_raw |
inches | inches | inches | inches | inches | inches | inches |
0.0 | 17.0 | 15.5 | 17.0 | 17.3 | 16.5 | 19.0 |
24.0 | 23.0 | 20.5 | 22.0 | 21.0 | 21.5 | 22.0 |
48.0 | 29.5 | 29.0 | 29.5 | 28.5 | 28.0 | 31.0 |
72.0 | 35.0 | 34.0 | 36.0 | 33.0 | 34.5 | 34.0 |
96.0 | 39.0 | 40.0 | 40.5 | 37.5 | 38.0 | 40.0 |
120.0 | 45.5 | 45.5 | 45.0 | 43.5 | 43.0 | 44.0 |
144.0 | 49.5 | 49.0 | 49.0 | 46.0 | 47.0 | 48.0 |
168.0 | 54.0 | 53.0 | 55.0 | 49.0 | 50.0 | 51.0 |
192.0 | 56.0 | 57.0 | 59.0 | 52.0 | 52.0 | 55.0 |
216.0 | 57.5 | 58.0 | 60.0 | 55.0 | 55.0 | 58.0 |
240.0 | 63.0 | 61.0 | 63.0 | 59.0 | 58.0 | 59.0 |
264.0 | 64.0 | 62.0 | 64.0 | 61.0 | 61.0 | 61.0 |
288.0 | 64.0 | 63.0 | 65.0 | 62.0 | 64.0 | 64.0 |
312.0 | 71.0 | 69.0 | 67.0 | 69.0 | 67.0 | 68.0 |
336.0 | 73.0 | 71.0 | 71.0 | 70.0 | 69.0 | 71.0 |
360.0 | 77.0 | 77.0 | 73.0 | 77.0 | 73.0 | 75.0 |
384.0 | 77.0 | 78.0 | 78.0 | 78.0 | 80.0 | 77.0 |
This all needs to be adjusted so that the height measurements are taken from the same level—deck level.

h_deckboard | 0.50 | 0.50 | 0.50 | 0.50 | 0.50 | 0.50 |
h_beam | 9.13 | 9.13 | 9.13 | 9.13 | 9.13 | 9.13 |
h_post | 25.75 | 31.88 | 36.50 | 44.50 | 50.63 | 55.50 |
h_string_offset | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
z_ref_offset | 34.38 | 40.50 | 45.13 | 53.13 | 59.25 | 64.13 |
y_raw | z_1 | z_2 | z_3 | z_4 | z_5 | z_6 |
inches | inches | inches | inches | inches | inches | inches |
0.0 | -51.4 | -56.0 | -62.1 | -70.4 | -75.8 | -83.1 |
24.0 | -57.4 | -61.0 | -67.1 | -74.1 | -80.8 | -86.1 |
48.0 | -63.9 | -69.5 | -74.6 | -81.6 | -87.3 | -95.1 |
72.0 | -69.4 | -74.5 | -81.1 | -86.1 | -93.8 | -98.1 |
96.0 | -73.4 | -80.5 | -85.6 | -90.6 | -97.3 | -104.1 |
120.0 | -79.9 | -86.0 | -90.1 | -96.6 | -102.3 | -108.1 |
144.0 | -83.9 | -89.5 | -94.1 | -99.1 | -106.3 | -112.1 |
168.0 | -88.4 | -93.5 | -100.1 | -102.1 | -109.3 | -115.1 |
192.0 | -90.4 | -97.5 | -104.1 | -105.1 | -111.3 | -119.1 |
216.0 | -91.9 | -98.5 | -105.1 | -108.1 | -114.3 | -122.1 |
240.0 | -97.4 | -101.5 | -108.1 | -112.1 | -117.3 | -123.1 |
264.0 | -98.4 | -102.5 | -109.1 | -114.1 | -120.3 | -125.1 |
288.0 | -98.4 | -103.5 | -110.1 | -115.1 | -123.3 | -128.1 |
312.0 | -105.4 | -109.5 | -112.1 | -122.1 | -126.3 | -132.1 |
336.0 | -107.4 | -111.5 | -116.1 | -123.1 | -128.3 | -135.1 |
360.0 | -111.4 | -117.5 | -118.1 | -130.1 | -132.3 | -139.1 |
384.0 | -111.4 | -118.5 | -123.1 | -131.1 | -139.3 | -141.1 |
There is one more transformation that I did, that might be overkill—but what the hell. As mentioned at the start: if it's worth doing, it's worth overdoing. The distance measured south of the deck is really the distance along the ground, not the distance measured along the north-south axis—so a little trigonometry needs to be done to pull out the y-axis (north-south axis) component.

y_1 | y_2 | y_3 | y_4 | y_5 | y_6 |
inches | inches | inches | inches | inches | inches |
0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 |
23.2 | 23.47 | 23.47 | 23.71 | 23.47 | 23.81 |
46.3 | 45.92 | 46.27 | 46.50 | 46.58 | 46.06 |
69.7 | 69.39 | 69.37 | 70.08 | 69.68 | 69.87 |
93.4 | 92.63 | 92.95 | 93.65 | 93.42 | 93.11 |
116.5 | 115.99 | 116.52 | 116.89 | 116.90 | 116.77 |
140.1 | 139.73 | 140.19 | 140.76 | 140.56 | 140.44 |
163.7 | 163.40 | 163.43 | 164.57 | 164.37 | 164.25 |
187.6 | 187.06 | 187.09 | 188.38 | 188.29 | 187.91 |
211.6 | 211.04 | 211.07 | 212.19 | 212.10 | 211.73 |
234.9 | 234.85 | 234.88 | 235.86 | 235.91 | 235.71 |
258.9 | 258.83 | 258.86 | 259.78 | 259.72 | 259.62 |
282.9 | 282.81 | 282.84 | 283.75 | 283.54 | 283.43 |
305.9 | 306.05 | 306.76 | 306.71 | 307.35 | 307.10 |
329.8 | 329.97 | 330.42 | 330.69 | 331.26 | 330.91 |
353.5 | 353.20 | 354.34 | 353.65 | 354.93 | 354.57 |
377.5 | 377.18 | 377.81 | 377.63 | 377.88 | 378.49 |
Then add in the distance between the piers for x-axis (east-west axis):
x_1 | x_2 | x_3 | x_4 | x_5 | x_6 |
inches | inches | inches | inches | inches | inches |
0.00 | 71.00 | 142.50 | 214.13 | 285.50 | 349.50 |
Then, at this point, I've got the transformed (x,y,z) field data for leveling the backyard.