Vision

We still need way too much code.

This site is motivated by the observation that we still need way to much code when writing program for every-day problems with today's typical toolset. In many cases, there is a better solution, but it is confined to some research community or has not reached mainstream acceptance.

As an example consider the state of web design. The typical HTML code with nested tables, spacer images, and embedded layout attributes is far too complex for what it tries to achieve. Yes, there are tools to generate the HTML code, but complex tools for simple tasks often indicate that the original approach was misleading. In case of HTML, the solution is simple: use web standards such as XHTML/CSS and you will obtain clean HTML code with well separated layout in stylesheets, both easy to read and maintain (even manually).

This is example suggests that we have to identify the different dimensions or concerns of a problem (e.g., content and layout), clearly separate them, and then use the most appropriate tool to handle each concern (XML for content, CSS for layout). Therefore, minimal programming means

  • minimal code: no code duplication
  • maximal expressiveness: readable code that directly reflects the underlying task
  • minimal overlap: every piece of information can be found in exactly one place
  • maximal orthogonality: clear separation of concerns (dimensions)
  • adequate complexity: complexity of the program proportional to the complexity of the task

Ideally, the code size should be a logarithmic function of the functional capabilities of a program. If we achieve true separation of concerns, an improvement of one dimension adds functionality to all other dimensions, and adding a new dimension makes this new functionality available to all other parts of the program.

The long term goal for this site is to find the most expressive way to describe the solution of common programming tasks. How do we get a better understanding of the means that are necessary to achieve this goal?

  • understand the tools: programming languages
  • understand the common programming tasks: problem models
  • understand the characteristics of typical solutions: patterns

Similar to natural language, programming languages are more than just tools. A language helps us to express thoughts that we may not be able to think without this medium. That's why we start with the languages and not the programming tasks, since the different languages will help us to better understand and formulate the problems to solve.

As a starting point, we analyze a wide range of programming languages (Ada, C, Cobol, C++, C#, Eiffel, Fortran, Haskell, Java, JavaScript, Lisp, ML, Objective-C, Ocaml, Perl, Prolog, Python, Ruby, Scheme, Smalltalk, SQL, XSLT) in a series of short tutorials (html, pdf). The languages cover the most prevalent programming paradigms (procedural, functional, object-oriented, logical, data-driven) and use different syntactical and semantic means within these paradigms.