2023.11.09

why i still solve leetcode problems after building real software

leetcode is not production engineering, but that does not make it useless. this is what algorithm problems still give me.

leetcode is not real software engineering.

there is no product manager changing the requirement halfway through the problem. no database connection quietly dying. no user pasting an entire novel into a field designed for a phone number. the input is already clean and somebody has kindly told you what the output should be.

so why do i still solve the problems?

because a thing does not need to imitate production to train a useful part of the brain.

it gives the problem nowhere to hide

in a normal project, there are many ways to feel productive without touching the hardest part. i can adjust the interface, rename things, move files around or spend an unreasonable amount of time choosing a library.

an algorithm problem is less polite. there is an input, a constraint and an expected output. if my reasoning is wrong, the test case will say so.

that direct feedback is useful.

when a brute-force solution works for ten values but collapses at one hundred thousand, the constraint is not merely a number in the question. it is telling me that my mental model is incomplete.

patterns become vocabulary

after enough problems, certain structures stop looking completely new.

a contiguous range suggests a sliding window or prefix state. repeated minimum choices may point toward a heap. dependencies start looking like graphs. a problem asking for the best answer across overlapping choices begins to smell like dynamic programming, unfortunately.

knowing a pattern does not solve the problem automatically. it reduces the size of the dark room.

this carries into real systems. not because i am reversing linked lists inside an API, but because recognising structure is a large part of engineering. queues, caching, scheduling, dependency ordering and rate limiting all become easier to reason about when the underlying ideas are familiar.

the failed attempts matter more

the final accepted solution can make every problem look obvious. it hides the part where i misunderstood the condition, chose the wrong state or wrote something that was correct but too slow.

that is why i like writing down the wrong read before the final approach. the mistake usually contains the transferable lesson.

maybe i treated alternating values as a difference of one instead of changing direction. maybe i stored too much state. maybe i optimised before proving the simple solution.

the green accepted badge is nice. understanding why the earlier idea failed is more useful.

it is a controlled kind of difficulty

real projects are messy in every direction at once. algorithm problems isolate one kind of difficulty: reasoning under constraints.

that isolation is the point. a gym is not real life either. nobody complains that a dumbbell is unrealistic because groceries have handles.

i do not solve leetcode because i think it represents all of software engineering. i solve it because it gives me a small, stubborn problem and asks me to think clearly until there is nowhere left for confusion to hide.