YAGNI & KISS Principles

Eugeniu Cozac
8 min readMay 26, 2021

As software application developers, you’ll accept that we encounter a wide variety of situations, ranging from the simplest to the more challenging projects. However, we often fall into the pit of modeling them in a more complicated manner than might be required.

KISS

“Keep It Simple, Stupid” — This principle, in general, is critical. Try and hold this in mind while you go about your work. The clearer your code is to manage in the future, the better it would be to maintain. This would be much appreciated by potential examiners of the code.

Kelly Johnson invented the KISS principle, which says that most structures perform better when held straightforward rather than complex; thus, consistency should be a primary design objective and undue complexity should be prevented.

KISS is an acronym for Keep It Simple, Stupid. This principle focuses on keeping the code clear. Excessive ambiguity can be avoided. It is simpler to manage and comprehend a basic code.

This concept can be applied in both the design and execution of code. You should avoid duplicating code, removing redundant functions, not using unnecessary variables and methods, naming variables and methods in a manner that is acceptable and corresponds to their roles, and complying with known code development standards. Separate the duties of the classes and the responsibilities of the project layers as well.

You don’t necessarily need to introduce anything innovative to satisfy your needs; alternatively, you should take advantage of the capabilities of the programming language you’re using. It helps if you are familiar with the functionality of the programming language you are using.

If you’re dealing with existing code and see stuff that isn’t appropriate or could be made clearer, you might try refactoring it.

Despite the rising curiosity among developers in these concepts, there is an abundance of confusion and misconceptions. Neglecting this approach could result in substandard results and a loss of customer loyalty, particularly given the industry’s high level of competition. According to a study conducted by Compare Metrics and the e-tailing community, 64% of customers prefer a simple buying method.

Complex coding is a source of various challenges and uncertainties from the developer’s view. This not only results in wasted time but also renders implementation incredibly challenging.

We provide an outline of the KISS principle in software design in the following sections, describing its meaning, processes, and much more.

What does the word ‘Simple’ represent in the KISS Principle?

To truly appreciate the KISS theory, whether in software design or otherwise, it is important to realize what the word ‘Simple’ implies in this sense.

To begin, it does not imply ‘easy,’ although adhering to these concepts eventually results in ease of access. Simple does not mean that anything is effortlessly done. Second, adopting simplistic codes (or adhering to KISS principles) would not prevent developers from writing complicated code. Simplicity should not exclude the developer from incorporating required complexities. The aim is to keep the program ‘as basic as possible but also including many of the functionalities required by its intended use.

Simple, in the KISS context, refers to systems with fewer components and, most specifically, fewer integrated components. Applications must be easy to code and have no avoidable, connected elements.

In this way, the KISS principles imply an interpretation of software development in which neither less nor more is desired. We want to include just what is completely appropriate — both in terms of coding and functionality.

Thus, enterprise or project owners often contribute to the required flexibility of software development. Both decisions on the features and architecture of an application must include the developer at all phases. This guarantees that overcomplicated specifications are prevented.

Why Should Software Design Follow the KISS Principles?

Numerous benefits arise from developing an application using basic backend and frontend coding. It facilitates teamwork by rendering the initial coding readily understandable to those on the team, encouraging successors to function fluently on an existing application.

KISS concepts allow developers to overcome the most challenging part of software development — updating existing technology.

To begin, it enables the developer to more easily imagine the different aspects of the application, visually projecting the potential consequences of any transition. This requires an understanding of dependencies, states, and more.

Second, after modifications are created, testing a basic device is much simpler than testing an incredibly complicated one. Additionally, simplified processes allow automated testing to be more effective.

Third, a framework with fewer developer specifications modules is more likely to be simple to use for the end consumer.

Software Development Using the KISS Principle

The KISS Principle can be followed by complying with the following elements:

Refrain from Using Global Functions or The elements

The global states, global variables, or simply globals are those states or variables whose scope spans the entirety of the application. Additionally, their condition is changeable at runtime. On the opposite, locals are restricted to exclusive areas of the application.

Global names colliding, poor testability and concurrency concerns are all problems created by globals. Additionally, global variables add to the code’s overall difficulty. They always behave as secret elements, the status of which is unknown to the developers, let alone to co-developers or others.

Avoid Lasagna Architecture

The Lasagna Architecture is the product of a rather rigid layering strategy in which each layer is unaware of any layers below it. Rather than achieving the desired ‘perfection,’ this method always results in an overly complicated structure.

Such a structure is incredibly challenging to read, and creating improvements to it is extremely difficult. Particularly the smallest modification requires the developer to check the majority of the code, decide if the change affects other layers, imagine the operation of several layers, and deal with unidentifiable verification errors.

Keep Abstractions and Dependencies to a Minimum

Abstraction is a technique for enclosing a complicated code block in a simpler layer of code. Even though this approach uses a clear name to call the feature, it inherently complicates the overall procedure.

The feature may include a large number of interconnected components, dependencies, and implementations of which the developer may be ignorant at the time of the call. Indeed, where abstractions are not adequately managed, they eventually result in a lasagna architecture, with all of its associated problems and undesirable complications.

Additionally, abstractions increase the possibility of incorrect or redundant pairing, which is a significant barrier to simplicity. Dependencies are the same way. Although dependencies are unavoidable at times, they must be avoided wherever possible.

Stop Outdated Coding

Developers have a propensity to add lines of code that serve little function now but can prove valuable in the future. There are Non-Existent Codes. By overly complicated processes, they do more damage than good.

YAGNI

You Aren’t Gonna Need It” — “You Aren’t Going to Need It” — Sometimes, as developers, we attempt to look further forward, towards the future of the project, coding any new functionality “only in case we need them” or hoping that “we will probably need them.” Only one word: Wrong! You didn’t need that, you don’t need it, and you aren’t going to need it in certain situations.

The extreme programming (XP) theory of “Do the Simplest Thing That Might Possibly Work” is known as YAGNI. Even though this theory is part of XP, it can be applied to a wide range of development methodologies and procedures. You can save resources and be willing to press on ventures more quickly if you follow the principles of “You Aren’t Gonna Need It” programming.

If you get an unexplained impulse to code any additional features that aren’t required right now but you think would be useful in the future, slow down and look at all the pending work you have. You can’t afford to spend time coding functionality that you will eventually need to fix, modify, or delete because they don’t fulfill the product’s specifications.

Coding ventures don’t often have a straightforward conclusion. The dream will come to an end because the developer abandons the concept (and does not move it on to anyone else). However, there is almost no stage at which the code is “nice enough.” There’s still plenty to focus on. It’s a smart idea to think of what you want the code to appear like in the future. However, unless intelligently used or a necessary element, leaving “extension points” (places intended to conveniently allow for new functionalities) isn’t desired in development. It expands the scale of your codebase and introduces needless difficulty. When you think about that, it also goes against the KISS theory that we previously mentioned.

This principle is identical to the KISS principle in that all strive for the simplest solution possible. The distinction between them is that YAGNI emphasizes eliminating redundant features and logic, while KISS stresses complexity.

This ensures that you do not introduce functionality solely because you imagine you might need it eventually, but only when you do. By doing so, you will stop wasting resources on implementations that were not needed and could never be used.

Each method can fix a single small issue, not a vast number of use cases. If the system has a large range of requirements, split it up into smaller strategies. Not only will it be simpler to read and manage, but it will also allow you to identify bugs even more quickly.

YAGNI in agile/XP

Although some may claim that this is a useless principle and that specifications should be best trained, anyone who deals with the agile approach should be mindful of potential shifts in client requirements. That is why potential tasks are often dependent on the outcome of the existing project state and can be altered accordingly. If you complete a huge number of features that might be needed in advance, you not only lose the time and resources required to complete those. Additionally, you waste time restoring or refactoring them as they prove to be obsolete. Developers can stop creating conclusions since they are likely to be unworthy of a programmer’s time and effort.

Advantages of YAGNI

The primary reasons to use YAGNI are the following:

  • Minimizing downtime equals saving money (this is the most vital factor), and
  • Getting faster, simpler, and unpredictable code.
  • The deadlines are met.
  • The clients are happy because visible and frequent changes are made by the specifications.
  • That code quality is improved when developers focus on critical tasks
  • The code is more flexible
  • The number of necessary transformations is decreased.

YAGNI vs KISS

KISS suggests that it can be achieved as quickly as possible. It enables team members to quickly work on extensions, bug fixes, refactoring and comprehending designed features. The differentiation is in the scope. The KISS theory asks for the whole solution to be coded as clearly as possible. On the other side, YAGNI would not need a full solution so programmers have no idea whether the specifications will remain unchanged or whether they will be needed in future project progress. Regardless of the rule selected, both need the least amount of difficulty necessary.

Conclusion

Adhering to these concepts would allow you to compose more effective code. Keep in mind that clean code is simpler to manage, easier to learn, and would certainly save you time while changing or implementing things. Avoid duplicating code, keep the code as basic as possible, and just incorporate features as required.

--

--

Eugeniu Cozac

JavaScript Developer. I am proficient in building SPA with React.js