Bio

Manifesto

To raise the status of ideas within society to that of first class citizens

In general people are flippant towards new ideas. If an idea is lucky it will be called "futuristic" and forgotten. More likely though it will be berated for its superficial flaws while its merits are ignored.

There might be tens of thousands of people who conceive the possibility of the same invention at the same time. But less than one in ten of them imagines how it might be done. Of these who see how to do it, only one in ten will actually think through the practical details and specific solutions. Of these only one in ten will actually get the design to work for very long. And finally, usually only one of all those many thousands with the idea will get the invention to stick in the culture.Kevin Kelly

The world is a hostile place for ideas. There are many reasons why this is so but none can possibly be good enough to justify it. After all what are we without our ideas. What is a person if not a vessel for ideas? For the moment our culture is a leaky vessel but the best have not escaped. With them I think we can falsify statements like Kelly's and in turn create cultural change.

Resume

Goals

Short term

Develop the skills and experience necessary to build scalable software systems.

Mid term

Construct tools to help people manage information more effectively. People should think small and create bigger thoughts through composition. Big ideas should emerge from smaller ones rather than appearing all at once in large papers etc.. This style favors distributed workflows between people and over time. Therefore, a solid basis for inter-op is important. Unix/Windows are both far too weak to enable this.

Long term

See what happens

Software

Contracting

I have completed several small front end projects which have been integrated into commercial products.

  • Sales dashboard
  • Visually displayed usage data coming from trial users so sales staff can better understand their potential customers and focus attention where its most productive.

  • Interative components
  • I produced custom components for integration into a large existing product. They included a context menu and a tokenizing select box with integrated search.

Murker

Murker screenshot

A live web page editing tool designed integrate with hand coding work-flows. It was designed as the first point of call for anyone developing a website. To allow them to quickly and intuitively manipulate both the content and visual aspects of a a web page, and mix in content from around the web. This is the idea which drove me into software engineering. I rewrote this project more than a half a dozen times as I learned to structure software though ultimatly concluded I wouldn't be able to create the product I wanted after realizing the underlying layout engines of web browsers aren't compatable with a visual style of creating. However, I have seen another approach where they automatically generate a flowing document from a statically layed out one. I think this would make for a pretty complicated conceptual model for users but I'll be interested to try it.

Open Source

The web development community has developed a good system for structuring components such that they can be easily re-used between projects. Many people, including myself, also choose to share these components freely since its mutually beneficial to do so. As a result a lot of my work can be viewed online. Here is a few highlights:

  • Packin
  • Actually there are a couple systems people use to organise front end components. This bridges the gap and makes it easy to use packages from either.

  • Presenter
  • Makes it easy to create UI components.

  • Result
  • Makes it possible to synchronize asynchronous JavaScript and implement lazy evaluation strategies. It makes many tasks dramatically simpler and is generally a very robust primitive. For example streams can be made declarative.

Hardware

Video game harness

I designed, and engineered a mounting system for racing game paraphernalia for a local electrical store. This project involved several iterative design cycles with feedback from both users and my client. Eventually we achieved a good prototype, and I continued to reduce the design down to the bare minimum. In doing so the manufacturing cost was significantly reduced while improving the aesthetic.

Industrial manufacture

In a small Hamilton fabrication firm I produced and fitted accessories for trade vehicles, including bull-bars, tow-bars, and ute decks.

Education

Commerce

I completed 5 semesters at Waikato University Management School to earn a diploma in management studies. My grade point average was b+.

Software

I have completed 2 online courses with Udacity, CS101, and CS253. I earned the highest distinction in both.

Philosophy

On building software

Science essentially means to build a mental model of a system by observing its behavior. While engineering is sort of the opposite. With the scientists mental models in mind you compose new systems. I doubt the two sides are ever pure though. Scientists almost always start by engineering a new tool for observation while engineering requires new mental models to keep producing new things. The two fields are intertwined by a mutual dependency.

Computers, despite having humble foundations can be used to do really powerful forms of information manipulation. In computing we aren't as limited by the rules nature imposes on us to create systems so much as by our ability to conceive them. Ironically then, Computer Science is more about brains than computers. By better understanding how people think and learn we can improve our methods of constructing software. And the best people to help understand software engineers is the software engineers themselves. In computing the relationship between science and engineering is expecially close. Software engineering is introspective.

Software systems are described in terms of their attributes. Each attribute is itself a system, in the same way all words are defined in terms of smaller words. The engineer will look for sub systems which already exist. Though if they do not they must recur and create that one. Once they have all components they compose them to create the original system.

ON/OFF tapyou have to look at a tap very crudely to consider it simply on or off

The systems components should be simple; that is they exhibit only the desired behavior and no more. Extra attributes can only be a liability. However, simplicity is not objective. If you look close enough at any system you will notice it can do more than it says on the tin. For example computers treat electronic signals as simples, either on or off, 1 or 0, but really their value is continuous. Like a tap. It is only due to a certain crudeness in the way signals are observed that they can be treated as simples. These sorts of hacks are very common through the computing stack. Sometimes they allow better performance other times they just weren't noticed till too late. Furthermore, a given system can be simple from one perspective while being complicated from another. Software engineering requires good judgment.

I said software engineers describe systems in terms of other systems. But actually they describe them in terms of other systems that they know. To a certain extent they should spot gaps in their knowledge when working on systems a long way from their experience but they will always tend to use systems they already know. And because everyones experiences differs their description of new systems are also bound to differ. The same is true in most feilds of engineering however an important difference in software engineering is a lack of physical bounds. Computing is cheap so we can afford to waste some. As apposed to fields like aerospace where inefficient where with current designs they are within 5% of not making it to orbit. In software the main driver behind natural selection is how easily a system can be understood by people. Which can only be measured subjectively. Software engineering is creative

Reading list

All these items have had an impact on my thinking in at least a small way. Though the ones marked with a golden background though have been more profound.

The Structure and Interpretation of Computer Programs

The fundamentals of software engineering

Concepts, Techniques, and Models of Computer Programming

A pragmatic survey of programming paradigms

Flow Based Programming

An interesting style of composing software components

Seductive Interaction Design

A fun way to think when designing interfaces

Thinking Fast and Slow

A user manual for your brain

The Little Schemer

How to read computer programs

Mindstorms: Children, Computers and Powerful Ideas

Schools should of implemented this stuff a long time ago

Are we there yet

Clear thinking on software engineering

Magic Ink

What IT is about

Learnable Programming

A lot of great ideas about learning applied to a development environment