47nil

Designing Software

I’m designing a new application that I found I have always wanted, but I could never find anywhere. Since I can write code for several different platforms, I thought that maybe I could just write it myself and go through the process.

The idea is to have this program be multiplatform, so I have the ability to access my data, add to it, and execute different actions on my Macbook, my iPhone, my work laptop running Linux, and anywhere with a terminal where I could install a small command line client.

In the process of designing the main features and mapping how things should work, I found myself jotting down a few things that have become the main guiding points for this project. These design rules, as I’m unofficially calling them, have the intended and unintended effect of making the software simpler and more purposeful.

By the way, I’m not the only one thinking about this. Searching online for similar ideas to see if I was being hopelessly naive about my intended design, I ran into the 100 Rabbits Philosophy and how they they think about software. Pretty neat and well written.

So, here they are, the design rules I gave myself for my first big software project. I'll document how the project goes once I launch it.

Simple

The application user interface, communication, protocols, and data structures must be the simplest possible. Things should be thought out carefully, enabling the user to work on the data the easiest way possible, and not have to struggle with interfaces or complex configurations.

Lightweight

The application should be able to run reliably in the most current hardware as well as hardware that is a few years old. Footprint, memory usage, and the resources needed should be kept to the minimum.

Locally Stored Data

In this day and age, where everything is on the cloud, companies hold your data hostage, and if they go down, your data goes down. I decided that I didn’t want to rely on anyone for the data of my application, so it will live locally on each device. The idea is to have a simple way of syncing the information across all platforms, so everything is up to date and you always have access to your data.

Offline Capable

The program should be able to work 100% whether it’s online or offline. It should never need the internet to function properly. This means that even if you are in the middle of a forest without any service or internet connection, you will be able to use the software.

Plain Text Data

The easiest and lightest way to handle data is in the form of plain text. Plain text is simple, easily encrypted and compressed, and takes less space than any form of binary or complex data formats. Plain text can be formatted in any way, and displayed properly across all supported platforms. This will also enable a better local storage of information, and an offline first design.

Single Purpose

The best tools I have ever used have always been single purpose. Software should be able to do one thing and do it very well. If more needs to be added, there should be a way to separate the purposes so, if needed, there would still be single purpose parts, working together.