When I started my new job at Domain in 2017, I was eager to learn more about Node, and about how to create big applications. To do this, I thought about solving a problem I had at my old job at a fashion company.
One of their biggest revenue drivers was sending out EDMs about sales. These always caused revenues to spike, and everyone to feel great that we were making money. FYI, An EDM is a promotional email companies send out for marketing purposes.
Being the junior developer, I had to build these EDMs, and it was my least favourite part of the job.
For anyone who hasn’t had to build HTML emails, it’s a painful process. First, imagine a marketing email you’ve received lately. A lot of these are big poster-like images that get divided into pieces; buttons, photos, headers etc . This image gets sliced in Photoshop, exported as HTML and then fleshed out so it will work everywhere.
This is difficult because HTML support in email clients is very outdated. You have to use antiquated standards to make everything work, like wrapping everything in millions of
tags. On top of this, different email clients implement these standards in their own way. Painful, right?
Like any good engineer, I sought to automate this process. We built a Grunt tool that reduced the time it took to build a simple EDM from ~20 minutes, to 2 minutes. This also enabled us to build complicated emails much easier.
But, like any good lazy person, my real goal was to make a tool that would mean someone else could do this job that I hated. This would have involved making a technical task accessible to non-technical people.
At the beginning of my time at this job (and at the beginning of my career), I tried to make something like this, but didn’t get very far. Last year I gave it another shot. I got a bit further, but never completed it. Although I never completed it, there were a few cool things about this project. For example, custom login and user systems, and the ability to send out emails to reset passwords.
The reason I never got to finish was that I didn’t prioritise well. EDM creation relies on image slicing, which I couldn’t get to completely work. For an app that boils down to image slicing, this is a dealbreaker.
Because I found this hard, I kept on procrastinating fixing this. This lead to building other features, but got me away from the core of the application. This was pretty dumb, because all the stuff I built would never get used until I fixed the image slicing.
One of the most important lessons that I got out of this process was to build the core features first. If I had finished the image slicing, I would have gotten this app out, or realised sooner that I wouldn’t finish it.
When I was studying Product Design at uni, one of the things that I learnt was to make prototypes. Lots and lots of prototypes. By making prototypes you’re able to figure out what works and what doesn’t. You then get the privilege of using these lessons to inform your decisions going forward.
I should have narrowed my focus to make a prototype to “slice images and convert them into HTML”. Instead I created an unfocused prototype where users could do everything but that.
It’s important to prioritise the most important things for your user and do those things first. Nobody would care that I had all these other systems built out if the core purpose of my app sucked.
My users would have come back to create emails, and creating emails should have been the thing that I focused on making awesome.
When I was building this, I focused on getting this out the door. This means the code sucks, like so much of it does. There aren’t any tests either, which all leads to a lot of mess across the whole repo. I planned on coming back to develop this at some point, but the above meant I didn’t bother. I’m not sure where the line between code quality and a speedy release is, but I should have considered it some more.
This app isn’t pretty in a lot of places, but I’m still proud of it. It represents a lot of hard work and ambition that would have been great to finish. At least getting it out into the world is better than letting it languish as a private repo.
Check out the code below. It’s not great, but I definitely learned a lot from writing it. I promise my ability to pull together an application has improved since 😅.
I never would have learned all this without building something. I definitely encourage you to go and build something yourself; it’s the best way to learn anything.