A big part of programmer’s job is to automate processes. Some people find this activity very satisfying and enjoy programming because of it. The same feeling, but arguably stronger, can be achieved in games such as Factorio ↗ or Bitburner ↗.

The goal of automating something is to make a repetitive task easier or (ideally) entirely automatic. We shall consider only tasks that can be done on a computer. We categorize tasks into several levels of abstraction.

How many levels of abstraction can be solved with automation?

  • first level – The usual task one does; this can be really any simple think such as sending many personalized e-mails, downloading songs from youtube videos, scheduling a weekly meeting with 10 people, keeping your list of watched movies up-to-date, writing a meeting summarization, finding a good restaurant in your area, creating and updating your daily todo list, pulling up weather forecast, checking e-mail for an anticipated decision letter, searching for a specific programming construction, translating text from one language to another, or finding what grocery products are currently discounted.
  • second level – Here, instead of solving each task separately we consider what features they have in common. All of them can be performed repeatedly (by definition). Some are ideally performed in a quick succession and some happen quite rarely. All of them work with data that is either created by the user or freely accessible through the internet.
  • third level – Think of how a solution for the second level problem would look like. It would be something like a tool that allows its user to create and manage repetitive tasks. However, by creating one tool one always adds complexity to the system, as per the well known xkcd comic ↗ which applies to our situation as well.


With more or less effort a capable programmer should be able to automate any of the first level tasks.

Automation of second level tasks comes down to taking data, editing it, and presenting the result in a reasonable form. Constructing a system for solving a second level entirely is too general in practice, so we can currently find only domain-specific applications.

For the third level – the tool for modelling automation tools cannot be really specified entirely as we do not know what future automation tools will bring. So a meta approach is required, a tool that can basically model anything. It can model itself so no further levels are needed. On one hand, third level solution is too hard as we have no idea what will be modeled so it is impossible to encompass everything. On the other hand, creating such a meta tool does not need to be encumbered with modelling the specific situation as it only needs to tell its users how to create these models. Creating this should be easier, or am I missing something?