Paper, Coffee, Pencil

Design Principles

Here are a few design principles that I've thrown together:

# The principle of least astonishment
  Everything from spirit and semantics to syntax and naming should
  strive to minimize astonishment. For instance, if you got an
  ordered sequence of items, you should be able to use operations
  that makes sense in an "ordered sequence"-context, regardless if
  the ordered sequence in fact is a list, an array or a string.
  Reversing this ordered sequence should then be named something
  aptly like "reverse" in order to reflect what we intend to do.

# There's more than one way to do it
  Ah, the good old Perl mantra. Many appear to shy away from this
  principle, citing the write-only nature of many Perl scripts as
  the reason. I think it is a sober reminder that as the designer
  of a language, you can never anticipate the needs of a programmer
  and that you should never, ever be so arrogant to believe that.

# Premature optimization is the root of all evil
  The Knuth quote pretty much says it all: you shouldn't optimize
  before you know what is relevant and how.

# Premature safety is the death of expression
  My personal twist on the quote above. I feel that a premature
  focus on safety kills expression. Safety is good, but only when
  you know what need to be safe.

# Shit will happen
  A fact of life. There's no prevention to it, so building systems
  that try to postpone the inevitable is a silly enterprise.

# Fail fast, fail hard
  Addendum to the previous principle; fail and retry with a clean
  state. (See Erlang)

# No one's ever died from a little dirt
  Don't get blinded by the quest of providing elegant precision
  tools. Sometimes blunt force is the right answer.

# Human first, machine second
  A reminder that the language is a tool for humans, and that
  the matters of the machine should not distract the human.

# It's better to solve the right problem the wrong way,
# than the wrong problem the right way
  In other words, don't talk about right and wrong if you don't
  have a clear idea of how the playfield looks like.

# Keep It Simple Stupid
  A reminder to not overcomplicate things. Less is more.

# Composition is key; small parts doing specialized work are
# easier to reason about, test and reuse.
  Also known as bottom-up design and the 'unix philosophy'.

# Separate policy from mechanism; spearate interfaces from engines
  It's generally a good idea to keep the inner workings separate
  from the interface, as you don't want to leak abstractions out
  as much as you don't wan to leak inhibitions in from a poorly
  thought out API.

# Clarity is better than cleverness
  'nuff said.

This is of course bound to be changed, but I guess it's nice to get
a feeling for what I'm aiming for.