Giter Club home page Giter Club logo

kiss's Introduction

The KISS Principle

KISS - "Keep it simple stupid."

-- a design principle noted by the U.S. Navy in 1960

What does Dijkstra say?

If Dijkstra was right (and who dares to object that), simplicity seems to be a "crucial matter" in programming:

Simplicity is prerequisite for reliability.

-- Dijkstra (1975) How do we tell truths that might hurt? (EWD498)

Simplicity is a great virtue but it requires hard work to achieve it and education to appreciate it. And to make matters worse: complexity sells better.

-- Dijkstra (1984) On the nature of Computing Science (EWD896).

How do we convince people that in programming simplicity and clarity โ€” in short: what mathematicians call "elegance"โ€” are not a dispensable luxury, but a crucial matter that decides between success and failure?

-- Dijkstra Why is software so expensive? (EWD648).

Simplicity is at the heart of the KISS Principle (every known version of the KISS-Acronym contains the word "simple"). So maybe, KISS is the most important programming principle out there.

Why Shoud I Care?

If you've read your SICP ("Structure and Interpretation of Computer Programs") book (and if you haven't you definitly should, then you already know, that there are three elements of programming:

  • primitive expressions, which represent the simplest entities the language is concerned with,
  • means of combination, by which compound elements are built from simpler ones, and
  • means of abstraction, by which compound elements can be named and manipulated as units.

The most important part without any doubt is the "abstraction". An abstraction is essential for higher level concepts, which in turn let us talk about things without considering every single component they are made out of. The other two elements are those, you need to from an abstraction. And beacuse the primitve expressions are mostly already given, you have to put he most work and attentiveness into "combineability"!

If applied in the right way (read "not leaky"), abstractions should enable you to "program exponentially": In an environment where everything you create can easily be combined with every other thing already existing (given the same abstraction-level) and where you can build a higher abstraction-Level without loosing combinability, every step you do take should help to the next step more effectivly. So it should give you an ever increasing development-speed.

In short: Ensure true combineabiltity to create meaningful abstractions!

For technical progress as a whole this promise seems to hold true. But up to today i think this didn't work out for programming environments: Neither did I ever get this "ever increasing speed' nor did i ever find an environment truly made for it. Perhaps such a thing is just impossible or to hard to do and there is nothing to hope for.

Another explanation may be, that combineability wasn't assessed at its true worth and never taken seriously enough. Maybe the YAGNI-principle ("You Ain't Gonna Need It") worked too well and a huge amount of work towards simplicity deemed not appropriate.

But after all you can combine things freely if and only if you have truly simple building blocks at hand. That's exactly why we should care about simplicity!

BTW: If you don't like to read SICP, you can watch the lessons on youtube instead. You can start with that one:

Hal Abelson explains the three elements of programming in about 2 minutes (from 28:08 to 29:57) introducing them as "the most important thing in this course".

Simplicity ain't easy

Contrary to intuition, the meaning of the word "simple" is astoundingly difficult to nail down. Fortunately there are two talks that can help a lot, to guide out of this mess:

  1. Simplicity Ain't Easy - Stuart Halloway

  2. Simple Made Easy - Rich Hickey

Both talks state that the true meaning of "simple" is "not compound" or - as Rich puts it - "not complected". This is clearly not how "simplicity" is usually understood: The KISS principle is often taken as a justification for "making things comprehensible ("easy to read") or to reduce the amount of constructs." But this is not what simplicity is about! If you try not to complect things, you should expect to need more things! And if you're not familiar to that kind of architecture, it will be more difficult to understand and to get right.

So probably the KISS Principle is not only the most important, but also the most misunderstood principle out there!

Stay consistent and you will start a revolution.

-- unknown

kiss's People

Contributors

st-keller avatar

Watchers

 avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.