cm  
 

Software Manifesto

 

I'm trying to capture my design and implementation philosophy so I can be clearer about it and so that I can discuss it more coherently and seek & incorporate feedback.

The following list is in rough priority order. Ideally, items higher on the list would trump lower ones. In the real world, a single, static prioritization doesn't always work, so don't expect it to be a strictly ordered, unchanging list. I also expect to refine it over time.

  • Get the* job done.
    * the job does not mean all jobs for all people for all time. It means our core job.
  • Be sure the job is done.
    • Tests help me find bugs earlier and more often. This is much less expensive and less stressful than trying to find them later.
    • If a test isn't automated and run regularly it doesn't count. (Obviously, if it fails, I need to know.)
  • Keep it simple.
  • Make our architecture, design, implementation, tests, and running system simple in the following ways:
    • Simple to understand.
    • Simple to explain.
    • Simple to test.
    • Simple to implement.
    • Simple to debug.
    • Simple to maintain.
    • Simple to change (at least in important ways).
  • Be clear about requirements and goals and nice to haves -- which are which and what are you willing to pay for them.
  • Do not optimize early.
  • Do not generalize without a few examples.
  • By default, I will make trade-offs to prefer simplicity over functionality and speed. It is far easier to make something that works well do more and run faster than it is to make something that does a lot quickly do it well.
  • Remember, there will always be another release in which we can add features. My goal is to do a good job now, writing clean, reliable software which I can improve over time.