How do you deal with, avoid, or accept complexity — differently than you might have earlier in your career?
For further actions, you may consider blocking this person and/or reporting abuse
How do you deal with, avoid, or accept complexity — differently than you might have earlier in your career?
For further actions, you may consider blocking this person and/or reporting abuse
Eduardo Klein -
Pratik Singh -
Giuliana Olmos -
anna -
Top comments (31)
I rarely write in Python, but I follow Python zen:
Before that I felt inadequate for writing very simple code in comparison to sophisticated solutions I've seen around.
Turns out the simpler it is - the better🤦♀️
Thanks for sharing. 👍🏻
And this one got me thinking hard. 🤔
“ Complex is better than complicated.”
Think of it this way, you'd describe the relationship you have with your mother in law as complicated, and the reasons are subtle and different and they are all interrelated. And it really helps if you know all the back story.
However you'd describe the way in which aluminium is mined and purified as a complex process. But it can be broken down into steps, each step does not require knowledge of the step before it.
This metaphore is insanely accurate.
You cant avoid complexity as it is dictated by product requirements.
But as you gain knowledge and experience your start to get better in breaking complex scenarios into smaller chunks that you already either
and thus the problem as a wholeis easier to grasp.
(begin rant)
With web development, it's easy to spend so much time searching for the perfect tool that promises to relieve whatever complexity you might encounter with your project. However, that complexity has to exist somewhere, and any new tool you decide to pick up has the complement of additional mental overhead in learning that tool and relearning that tool when you return to it after a while, which isn't uncommon in large projects.
From being a CS major this past year, I've had to readjust my thinking to accommodate different language types. I had a class in assembly this past semester and it really showed the importance of knowing the extent of a system, but how to manage complexity efficiently in any environment, even at such low levels of the software stack.
The problem with modern Web Development and complexity (at this point I feel like I should make this an entire post lol) is that you have to deal with 3-4 different languages in harmony and modern web development encourages strong interop between them (e.g. css-in-js, TailwindCSS) while also preaching "separation of concerns". This leads to confused and convoluted environments, great disparity between codebases that are difficult to maintain and engineers are terrified to run
npm update
, and tools that you find that you have to ask yourself why it even exists since it covers such a specific edge case.Every modern web development tool is trying to solve the same problem and no one is satisfied with settling on a solution to manage complexity. That's why we're now seeing so much of "just use vanilla HTML/JS/CSS, it works great", but then you ignore the reason that ReactJS/Vue/Angular were invented in the first place: to consolidate complexity. Web development is a delicate balancing act that requires sacrifice in actually solving some of your complexity instead of expecting a tool or library to.
I have found that developers often end up creating complicated solutions (complicated code) when the problem is actually not complex at all.
This results in having this complicated thing you have to deal with (technical debt) that is a layer over the top of what is actually a simple(r) problem.
This is why I try to think, "how can I reduce the amount of code and still design the correct solution &/or fix this problem?"
There are two levels of complexity I've slowly come to terms with. The first is code complexity which you can handle by analysing cyclomatic, N-Path and CRAP scores.
The second is behavioural and project complexity. This is more difficult to handle as it's more theoretical and there is no definitive answer. To deal with it you need to be flexible, adaptable and humble. I'd also advise learning more about complexity theory.
A good place to start is Melanie Mitchell's book, Complexity: A Guided Tour. goodreads.com/book/show/5597902-co...
I've become incredibly paranoid about potential complexity.
Earlier I thought it was bad design/coding/development practices.
Now I've realized most complexity can be solved by determine what the problem actually is, rather than dealing with complexity in the solution. IE most problems aren't actually complex. Identifying them correctly can remove large vast quantities of complexity in any solution you create.
There are some issues that are just plain complex, but most aren't.
Seems you discovered the difference between doing the things right and doing the right things youtube.com/watch?v=OqEeIG8aPPk ;)
@lepinekong
Thank you for the gold nugget of a video ;)
When I was younger, I tended to avoid complexity, or always tried to go on it with some support (either colleague or internet).
But now with some more experience, I'll always deal it the same way with ~3steps :
I recommand having a look at "refactoring guru", the website with the badger mascot, as it explains a lot of it, with detailed examples both theoric and with code.
Some more advices :
Maybe the best advice I can give is that it will never be flawless the first time, and don't try to make 10+ classes for a start.
Most of the time I do a big old "index.php" or "script.js", code on the fly, and when things are finally starting running flawlessly, and your file is 500+ lines : it's a hint that it is time to split your code into multiple folders/files.
Got client stuff ? Create a "Client" classe.
Need to create a new client ? Create "Client->create( )" method
Client needs name and email ? Update your class : name & email properties. "Client->create(name, email)"
And so on.
Once you feel good and confortable about this, to get to the next level go check Unit Testing, and after that TDD > Test Driven Development.
It will help you thinking about your code as input/outputs and stuff, and can really improve code reliability, maintenance, avoid regression, and also make your code really faster.
Sorry for the big block and the approximate english.
Feel free to ask questions if you have some ;)
Have a nice day
I used to think that I can do anything given time. That any complexity can be unravelled if I was just given enough time to sit it out in the corner and think/hack away at the problem. I used to get all excited about the solution and jump at it.
Now, my perspective is more nuanced than that. Some problems maybe beyond reach for my skill level (and experience) no matter how long I hack away at it. Sometimes its as much a "people problem" than a code problem. Overcoming complexity isn't as simple as hacking away at it. It requires us to really think it first and break apart the problem. Consider multiple solutions and what tradeoff it makes against the many facets of the problem.
I can say that I'm no longer as excited in jumping to the solution immediately.
I see complexity arise when people try to fit square pegs in round holes, use tools for purposes they were not intended for and for which they are mismatched. I think complexity can be reduced by 'going with the grain' of tools we use rather than against. Have written more thoughts here: dev.to/yawaramin/reducing-system-c...
I've learned to manage it. I do so by using abstractions and "Bounded Contexts" that closely represent the business domain. If a certain abstraction is too complex to maintain, "grok" or reason about, I "encapsulate it" and defer all its complexity to a consumable contract. This often applies to classes, modules, libraries as well as feature teams! I wish I'd had learned this "domain-focused" approach much earlier in my career. It would have made me more effective at maintaining codebases and designing larger systems.