10 Hints to Avoid Over-complexity in Software Projects | by André Müller | Feb, 2022


After over 20 years of working as a software program developer, I read and wrote code in lots of programming languages, like C++, C, C#, R, Python, GO, LISP, Java, Kotlin to call just a few. I noticed initiatives succeeding and a few failing. Some turned caught, the place it was more and more troublesome so as to add new options with out breaking different issues. Another initiatives got here to a state the place it was attainable to increase and restore issues. I might by no means dare to provide the final word recommendation; as what I’ve discovered in all these years is

First assume, then code. That appears to be apparent. Do a minimum of a little bit of architectural design earlier than coding. Somebody who needs to construct a home would often not simply begin off by placing stones on high of one another with no plan. The identical is true in software program growth. Nevertheless, the software program is much more “mushy” in distinction to a home. Subsequently, the plan you must develop part of software program usually wants to not be so actual and sophisticated as that of a home. See e.g. [1]. Do you’ve cyclic dependencies (due to pre-declarations in C++ that is really attainable) amongst lessons, or are they ordered? Examine code smells and refactoring [2].

Design patterns [3] and abstractions are a superb factor. However don’t overdo it! Over-engineering is just not useful; it obscures enterprise logic. Don’t code sensible like “Oh cool, a lambda operate returning a operate which creates a manufacturing facility for creating an object hierarchy — no one will ever perceive that”. Different or future builders within the workforce (otherwise you whenever you come upon your personal code 6 months later) will probably be joyful to grasp what this operate does. The angle have to be to write down code, people can perceive.

Readability and maintainability of supply code are essential. So, when there isn’t a signal to optimize a sure a part of the code, then don’t do it! Positive, you must optimize components of your code when they’re too sluggish to fulfill the necessities. However then, discover the efficiency bottleneck with a profiler and solely contact these components which actually have an affect. People are more often than not fairly dangerous at guessing the place the efficiency actually leak.

There may be loads of hype with the “minimalism” scene concerning wardrobe and family (Joshua Becker a.o.). Nevertheless, I like the concept to be a code minimalist. Each supply code line you don’t write or delete wants to not be examined, maintained, compiled, and skim. So be a bit parsimonious in writing code or including lessons. If it’s not obligatory, throw it away (even when it hurts — see my different article [4]). Hereto, there are supply code versioning techniques like git. If you happen to assume you’re going to want it some day, then put it on a department (and throw the department away after some time).

sort Author interface 
Write(p []byte) (n int, err error)


Do it single-threaded and synchronously; don’t introduce a number of threads with difficult-to-understand interactions if it’s not obligatory!

Positive there are good code mills serving to quite a bit e.g. for creating or consuming REST API (akin to Swagger). However typically extra complexity is launched and may obfuscate the conduct of the code. A easy state machine could be carried out with out utilizing a code generator. Not all people can have the software (akin to Enterprise Architect) and may not to have the ability to perceive what the fundamental concept was.

Creating performance from scratch requires effort. Understanding and utilizing exterior libraries require effort, too. In some programming languages (C++), it may even be a nightmare to “simply” embrace a brand new library (introducing loads of dependencies). So you must discover a steadiness between making, “shopping for” and generalizing. Watch out to not drive the “don’t repeat your self (DRY)” precept to an excessive. It’d result in entire template libraries whenever you solely want it as soon as.

In C++ there may be the STL (structured template library), in Go there’s a base library and so on. These libraries are nicely examined and good and often are be higher than all you’ll be able to write. It’s a little bit of effort to grasp the logic of those base libraries and tips on how to use them. Attempt to face up to the impulse to let exterior frameworks dominate and taint all of your base logic and entities! Simply because already used within the mission, akin to Qt. Positive, you’ll need exterior libraries. However not for only a thread, hash map, listing, or a string.

xkcd dependency https://xkcd.com/2347/
// no remark

Positive, there may be check pushed growth (TDD). All people is aware of that assessments needs to be written. Nevertheless, the code have to be structured and decoupled so as to even be capable to write unit assessments for it. If in case you have components in your code you at the moment don’t wish to check, attempt to construction these, as if you wish to check. With out decoupling issues, this can not work. If all enterprise logic is scattered amongst frontend lessons instantly interacting with the person, this might be barely attainable. Use unit testing libraries serving to you to make testing easy (e.g. Catch2 in C++) with out introducing overwhelming complexity.

Software program growth is rarely a lazy factor. However, too sturdy perfectionism may lead as nicely to overly complicated and arduous comprehensible code. I noticed using sturdy typing introducing loads of complexity when a easy int or double would have executed the job. I noticed using the “pointer to implementation” (pimpl) idiom in C++ pushed to an excessive. Bloating code to tons of of strains the place a easy 10 strains struct would have executed it. I noticed complicated class hierarchies and inheritance, and factories with none want. So: attempt to concentrate on the impact!

I hope you loved my small assortment of hints and attitudes in your each day software program growth. Preserve it easy, and luxuriate in it!

[1] R. C. Martin, Clean architecture: A craftsman’s guide to software structure and design. Boston: Prentice Corridor, 2018.

More Posts