How I Finally Finished What I Started

Sun Jun 23 13:47:09 CEST 2019

I have come to realize that I am a "starter" kind of person. I get excited on new project ideas. I love the feeling of a clean slate, where everything ahead has the potential to turn out perfect.

This text is about a hobby project of mine, that I couldn't take over the finish line. I will go through my struggles as a starter kind-of-person, and what I did to finally see it through.

Background

In 2013 I was doing my first year towards my degree in computer engineering. I was at a tipping point where my interests and distribution of my time started to lean more towards programming and tinkering rather than gaming and other time-consuming entertainment.

During this period I spent my time trying different programming languages, as well as the every day gaming sessions. My friends and I used to hang out online, even when we weren't playing any games. We had a lot of fun, discussing odd topics and joked around. We used many messaging channels over the years; Ventrilo, TeamSpeak, Mumble, Skype, Xfire, Steam etc., the list goes on. But there were one thing that these channels lacked. The ability to easily share something that was on our screens. A lot of these conversations required the context of someone else's desktop. Sure, printscreen has always been there, but these conversations were fast and intense. By the time I had saved my printscreen to file, cropped it and sent it, the conversation had already moved on.

Stek Was Born

I built a desktop program for Windows and a back end server in PHP. The idea was to let the user make a selection of the screen, the program would then upload the image to the server, and place the image URL in the clipboard. The project got the name Stek. My friends installed it, and it worked well for the intended purpose. We shared screenshots all the time. It became a part of how we communicated.

More people started to use Stek, even random people outside our group of friends. It seemed to spread at a slow pace. I started to feel responsible for making the service better. The first version was just a hacked up PHP application, along with a client for just Windows.

Rewrites

I decided to improve the service by creating a new, more usable web GUI. The first version was just a <ul> of links to the images that a user had uploaded. I also decided that I wanted a desktop program for each major platform; Windows, OSX and Linux variants.

After some research, I figured I would use Laravel as web framework for the web rewrite. And so the first rewrite began. I instantly began to think about all improvements that I would make, and how sexy the implementation would be. I started with the boring account related stuff like sign up, sign in, password reset, settings page and so on. This killed the initial enthusiasm that I had. Once I got to the actual "improvements" of the service, my creativity and enthusiasm were long gone. It was left to rot.

Time passed, and another wave of creativity and enthusiasm hit me. Let's do it right this time I thought to myself. During the second rewrite the plan was to create an API in Node.js and use a front end framework to build a single page application.

I spent time researching which server framework I would use; Express, Koa, Hapi. More time went into the choice of front end framework; React, Angular etc. I decided to use Express and React. This time, I started with the actual improvements first. I started building the components that made up the new uploads view, the heart of the web service.

I got stuck tweaking the layout and looks of the web application, and kept adding features that was nice-to-have's before implementing the essentials. I was drained again, and lost motivation.

Death of Stek

Years passed, Stek was still being used daily by users. At that point, the service had not received any updates in 5 years. I was worried about security issues, and the fact that people I didn't know was using the service to upload any content. I did not have any terms of use or policies in place, and did not know what I was hosting on the internet. I made the decision to pull the plug.

New Mindset

Fast forward one year after the plug was pulled. During the year, I got interested in personal development, primarily minimalism. I discovered new things about myself and saw the world around me from a new perspective. It felt like I had a new super power. What if I channeled this super power towards some problem that I had? Why not try another rewrite?

The Plan

I made a list of things that needed to be done before I could release the service to the public, along with estimated dates when each thing should be finished. The list was ordered with the hard tasks first, and the fun/easy ones towards the bottom. I could therefore use my initial enthusiasm and energy to solve the hard problems first.

Cut Off Excess

During execution of each task in the list, I frequently asked myself; what is the core purpose of this task? This kept me on the right track, avoiding any traps that I previously fell into with nice-to-haves and other side tracks. If something wasn't aligning with the core purpose, it was cut off.

No Bikeshedding

When building something on your own, you have the freedom to choose all of your tools and practices by yourself. As a perfectionist without the external pressure to actually deliver something, this can be an easy trap to fall into. Just pick something and keep the momentum going, knowing that it probably won't matter in the end.

Use Defaults

I like tweaking stuff to my taste, with everything from my editor to the build scripts in projects. When I look back at my old projects, I've discovered that my taste is changing and evolving all the time. The coding style that I applied 1 year ago, is not my preferred way of doing it now. Keep to the defaults as much as possible, tweaking stuff is a waste of time.

Avoid Premature Optimization

Resource utilization and performance is something that I really love spending time on. Making something 10 times faster with a small code change can create an optimization addiction. Using the mindset of "cutting off excess" during the new rewrite, nearly eliminated the need for optimization because there were so few things left to optimize. Every part of the system was essential.

Nothing Is Perfect

This is the first text that I write and first text that I publish, ever. I could never have done this without letting go of the perfectionism in me. There may be a lot of spelling mistakes and other errors in this text, but at least it's finished, and I've learned something on the way. The same goes for projects.

What I Managed To Create

I stuck to the plan and the outcome was a finished, working service called Pixlys. There is a cross platform client for Windows, macOS and Linux. There is a web page where you can manage your uploaded screenshots.

Pixlys web is written using a Node.js back end with a basic templating engine called doT, along with a MariaDB database. The front end consists of basic HTML and CSS. I may add some JavaScript later on to improve some UX that I'm not satisfied with right now.

Pixlys desktop client is written in Python using PyQT5 as GUI toolkit and packaged with pyinstaller. The desktop client is open source and can be found here.

I am proud to say that this service was finished without the need for any auto scaling, CI, CD, REST API, JWT, SPA, ORM, LESS, SASS, Stylus, React, Vue, Angular or any other buzzword pitfall that I previously got trapped in.

I hope this story can help or inspire someone that are in the same situation that I was.