modules information hiding in modules - hide uncertain things that may change behind interfaces that need not - see On The Criteria to be Used in Decomposing Systems into Modules structured programming higher-order functions lazy evaluation multi-mode relations graphs generics types hooks object-orientation / polymorphism graphs namespaces macros rewrite relations functions procedures lambda concatenative code as data quote monad arrow transparent monad transparent reference call / apply lisp / scheme / racket forth / joy prolog / mercury dataflow / FBP explicit dispose processes python algebraic types lazy / futures / promise / on demand blocking call = non-blocking call + register for signal + wait for signal Use hashs / dictionaries, and other data structures. Make them easy to use. define a dictionary from existing variables using their names as keys, e.g. a = 1 ; b = 2 ; { a, b } gives { 'a': 1, 'b': 2 } foo.bar is better than foo['bar'] efficient introspection by macros, lift the level so can wrap basic operations, e.g. wrap 'set' to trace changes to variables, wrap 'get' to trace variable usage, wrap 'call' to trace all function calls, wrap 'return' to trace return values interning values (symbols, strings, structs...) continuations ?