Bio

Manifesto

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

Like life I feel ideas are sacred; throwing one away because it is too difficult to care for is wrong.

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

We now have the tools to grapple with problems in ways we have never been able to before. I think that if properly leveraged, these tools can falsify statements like Kelly's.

About

The grass is always greener on the other side of the fence

This phrase has never seemed so true. My mother told me that when I was a baby I never seemed totally happy, as soon as I could crawl I wanted to walk, as soon as I could walk I wanted to run. I was always determined to learn the next thing but never happy once I learnt it. This is a habit which seems to have pervaded my life. When I first recognized this pattern, it seemed wrong. What's the point if it doesn't make you happy? Though I have since noticed that I am not the only person who has this habit. In fact everyone does, just the intensity varies. Its how all new things get discovered. Its the driver of change. Its to culture what natural selection is to the gene pool. The grass really is greener only sometimes, however, always I am glad to of tasted it.

Resume

Goals

Short term

To develop the skills and experience necessary to build scalable software systems

Mid term

Engineer the tools and interface, which enable people to leverage their intuition when creating digital systems.

Software

  • 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.

    Over the last year I have repeatedly prototyped this project as I learnt the craft of software engineering, though failed to overcome the complex layout rules governing web browsers. It has however served as a good map to uncover many software system design challenges.

  • Libraries
  • look inside
    • Observer
    • By far the most widely used structural pattern in javascript applications is the event pattern. Most implementations are extremely simple though, and either lack features, perform badly, or most commonly were unreliable. So I implemented my own which proved worthwhile with 3x speed improvement, while solving common bugs and increasing flexibility.

    • Mouse
    • Browser API's for mouse events are very poorly designed. I build a library which effectively re-implements the mouse event API. It tracks all stateful aspects of the mouse and uses these to generate all commonly listened for events such as drag, drop, and grab. In this library I leverage the Observer library mentioned earlier. I have found this library prevents a lot of confusing code in my projects.

    • Chatterboard
    • Similar to my Mouse library but for the keyboard.

Hardware

  • Video game harness
  • I designed, managed, and engineered a mounting system for racing car game paraphernalia for a local electrical store. This project involved extensive iterative design attempts with feedback from both users and my client. Eventually we achieved a good functional prototype, and I continued to reduce the design down to the bare minimum of components. By 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

My thoughts on Software Engineering

I spent the last year thinking about and prototyping a program for manipulating HTML documents visually within a web browser. This project both served as the inspiration to get involved in the software industry and as a muse guiding me to experiment with various approaches. My experiences have lead me to liken software engineering to many complicated things, though always I have felt a voice in the back of my head telling me, this is wrong. Most of the machines we build inside computers are simple at heart, though their simplicity is lost in translation. Many solutions are in fact designed to defensively handle leaky hardware abstractions rather than the actual problem. Being forced to design a system around the computers implementation is a sure way to take the fun out of programming. The problems I most often find myself having to work around include:

  • Equality
  • Most languages base their equality tests on memory addresses; if it is stored in the same location then it is the same. This is not equality at all, that is identity. Using '==' to check identity is misleading syntax. This is made even more complicated when languages start storing all numbers and strings in global sets to enable == to effectively check by value, since all strings and numbers can only have one identity in such a system. Now the language is using '==' correctly and incorrectly at the same time.

  • Identity
  • Because most languages are built around storing data in memory addresses it is difficult to change a value once it is set. Because when I want to update the value of an entity I must update it in place. This makes working with data difficult because what I am looking at isn't really a value, its a location referring to a value. This is fine as long as the value can't change between the time I collect it and the time I actually do some work with it. However, in all modern systems it can. In the case of multi-thread machines it is obvious how this could happen, though, more subtle in environments with a single thread of control, such as a web browser. In such an environment you can only be sure a value hasn't changed under your nose if you know what processes have run between the time you collected the value and now. This is not always practical; most developers like to decouple the functionality of their app through the use of message passing systems, thereby, electing not to keep track of when processes are run. As a counter measures we must ensure all identities are private to the unit of functionality they will eventually be used.

  • Composition
  • Functions are designed to be black boxes. You give them data and they give you a response. They are a contract to which agreement is implied through use. They are non-negotiable, simply take it or leave it offers. Their authors may make provisions for some options though, if they are forward thinking enough. Functions do exactly what they say they will do no more no less. This might sound like a good thing, but negotiating a contract before signing it does not makes it any less of a contract. By allowing a function to be extended or shortened at run time will dramatically increase the odds of it being reusable. Just like with contracts, a little bit of cooperation goes a long way.

    One way I increase the flexibility of a function is by making it emit an event on completion rather than return a value. This event can then be subscribed to by an arbitrary number of functions at run time. Effectively extending the functionality of the function. Though monkey patching 3rd party functions to use this pattern is not a great reuse story. It seems fundamentally limiting to work in a language with the weak data flow model of dump in place as its only built in option, even if only for the design upfront sentiment it creates. One possible solution could be a function subtype with multiple output options. Like the pin arrangements of electrical system components. I have experimented with this idea in the syntactically limited way I was able to.

The quality of a software system should not be judged solely on the correctness of its operations. Correctness is of-course important but if the code only achieves it by voiding all hardware abstraction leaks, then I would not consider it a good solution. A good software solution should teach their readers about the problem domain. They should be concise not through clever syntax but because every part directly addresses an aspect of the problem. Software is a model of a machine. If the language the software is made from correctly models the machines natural environment, then we are free to express the machine as clearly as we understand it.

Reading list

All these items have had an impact on my thinking in at least a small way. The ones marked with a golden background though have been more profound. These are the shoulders I have found to offer interesting views, so far.

The Structure and Interpretation of Computer Programs
By Harold Abelson et.al

How to think about and use the universal machine

Flow Based Programming
By J Morrison

If the voice in the back of your head still keeps telling you BS

Seductive Interaction Design
By S P Anderson

A fun way to think when designing an interface between a human and a machine

Different
By Youngme Moon

Explains why most people, and companies, make products which aren't as interesting as they think they are

Thinking Fast and Slow
By D Kahneman

A user manual for your brain

The Little Schemer
By D Friedman and M Felleisen

Words aren't always the best way to explain something

Mindstorms: Children, Computers and Powerful Ideas
By Seymour Papert

The work of a talented researcher, this is what schools should be striving towards

Magic Ink
By Bret Victor

The essence of IT

Are we there yet
By Rich Hickey

Clear thinking on software engineering