The Developer's Journey: A Graph of Code Complexity vs. Experience
Description
A hand-drawn graph plots 'code complexity' on the y-axis against 'years of programming' on the x-axis, illustrating the evolution of a developer's coding style. The graph starts at 'super simple code,' then ascends steeply through phases labeled 'oop everywhere' and 'design patterns.' It peaks at maximum complexity with annotations like 'abstractions,' 'interfaces,' '"i might need this later,"' and 'this is what the experts do.' Finally, the curve descends back to the baseline, ending at 'super simple code' again. This chart is a classic representation of the developer's journey. It humorously depicts the common trajectory of moving from naive simplicity to a period of over-engineering - where developers, armed with new knowledge, create unnecessarily complex systems. The final return to simplicity signifies true mastery: the ability to solve complex problems with elegant, maintainable, and straightforward solutions, having learned the high cost of complexity through experience
Comments
42Comment deleted
You know you're on the right side of that curve when you replace a 12-class strategy pattern with a single 'if' statement and call it a win
My proudest senior moment: a PR diff of - 3,421 / +1 replacing AbstractVisitorFactoryServiceInterface with `return data;` - merged in twelve seconds and a collective sigh of “finally.”
After 20 years, you realize the AbstractFactoryFactoryBuilder pattern you architected for that config file parser could have just been a JSON.parse() call with a try-catch
This graph perfectly captures the arc of every architect's career: you start writing procedural spaghetti, discover the Gang of Four and suddenly everything needs seventeen layers of abstraction and a factory factory, then after debugging your tenth AbstractSingletonProxyFactoryBean at 3 AM, you realize the junior who just wrote a 50-line function that actually works might be onto something. The real senior move is knowing when NOT to use that design pattern you spent three years mastering
Real seniority is deleting the AbstractFactoryFactoryManager and replacing it with two small functions and a map, because YAGNI pages less than inheritance
The expert's secret: every abstraction layer you add today is just future tech debt you'll pay off tomorrow - with interest
Peak architecture is the day you justify an IStrategyFactoryProvider; true seniority is deleting it and shipping a 30‑line function with tests
База Comment deleted
English only Comment deleted
Baza Comment deleted
Whatever that is Comment deleted
that means something "super obvious thing", like smoke after eat Comment deleted
baza = based Comment deleted
Ah makes sense Comment deleted
base, not based Comment deleted
Lol, “Based” is a well-known meme and nobody uses “base” in this context Comment deleted
yes, but russian meme "это база!" (eng. "it's a base!") has a different meaning and typically used in different context Comment deleted
all your base are belong to us Comment deleted
you have no chance to survive make your time Comment deleted
True story Comment deleted
is this meme correct? any super experienced programmers here? Comment deleted
I'm not that experienced, but I know I'm past the maximum. I sometimes used really complex patterns in the past, but nowadays I just do what works. Comment deleted
non-professional self-taught dev of 7 years btw Comment deleted
well, semi-professional. I had an internship this summer, and the company seemed to be happy with my work, so. Comment deleted
lol what were you doing all that time)))) Comment deleted
school Comment deleted
yes. at least couple of super experienced devs that I watch say that. didn’t get their position for some years, now understanding the meme myself fck oop, btw… ruined my early dev life Comment deleted
non-professional dev of 2 years, going through my functional programming arc atm. which part of the slope is that? Comment deleted
the slope is quite simplified, but I'd guess just a bit before the peak. Depends on how you use it ig Comment deleted
I am in Oop everywhere now Anyone else? Comment deleted
Part of the reason IMO is that OOP (FSVO OOP, Alan Kay would beg to differ) and design patterns are taught as to how, but not why and when. Comment deleted
Have you noticed how OOP has died? Yes, it happened a long time ago, and no one noticed. Comment deleted
It died like four times by now. 🤷♀ There wasn't agreement on what it meant in the first place. Comment deleted
Since C++ it was about inheritance, polymorphism and encapsulation. After IoC we have: 1) inheritance has been substituted by injection, 2) single implementation of an interface - yes, no one wants to write unit tests = no polymorphism 3) DTO/POCO everywhere. Encapsulation is the last man standing, but it will surrender any time soon to reflection and code generators. Comment deleted
Inheritance has been replaced by composition. Because no one wants to guess what will happen with the base class after an update. Comment deleted
CLU got it right and Simula wrong :] Comment deleted
yes, this is more accurate definition. Comment deleted
Without inheritance most functional languages with typed interfaces (Standard ML, Haskell) or in general structurally typed procedural languages (Modula2/3, Algol68, probably Go) would now count as OO languages. A way to implement virtual methods was the addition to Caml to make it OCaml. Comment deleted
We've talked through this extensively here https://loup-vaillant.fr/articles/deaths-of-oop https://t.me/devs_chat/52446 https://t.me/devs_chat/52487 Comment deleted
Good article. I would be glad to see an example of a code, that would substitute a C++ method Render(listOfObjects) that wouldn't use polymorphism with the same or faster performance and that would've increase of developers KPI. Comment deleted
Well, listOfObjects kind of implies that the list contains references to things with different behaviors. The traditional functional approach here would be closures. Both methods and closures are something that you can call/evaluate to access some local state. There are no clear wins in performance here. The main performance advantage we see with ECS is move from what http://canonical.org/~kragen/memory-models/ calls LISP memory model (which the regular OOP-y use of C++ has) to Fortran memory model by using memory pools and thus having huge locality improvements. And that's quite general concept. However I think this article might be closer to what you intended to ask: https://blog.janestreet.com/why-gadts-matter-for-performance/ Comment deleted
Yeah ignore catch just have them there to not take the whole docker container down Comment deleted