Perhaps one of the most important lessons to a budding programmer is the idea of abstraction. I still remember the words used to describe it to me, “If you find yourself copying code, don’t do it.” The idea is so dead simple; any time you find yourself replicating a piece of code you generate a function or sub routine to handle it.
Fast forward about 20 years and this basic principle has become a critical part of almost everything I do. The notion of abstracting code to ensure it is as easy to manage as possible is a great fundamental business skill to have. Want to make yourself a valuable commodity on your team, your clients happier, and your freelance business more successful? The formula is simple, any time you find yourself doing something repetitive; find a way to do it faster. Here is my simple formula to identify what to do:
- Document the process for the system in question.
- Identify the most time consuming step of the process.
- Figure out how to automate or minimize the time required for this step.
A Sample Situation
A simple example will clearly illustrate the power of such an approach. A project I was recently a part of included publishing a weekly email filled with the latest resources on a video training site. As it turns out, building a weekly HTML email to update the community is very time consuming. The largest complication was that the service was built on a hosted CMS that happened to have built in email marketing features. These features happen to be only accessible via the web interface. This meant there was no option to code this to happen with some easy server side programming.
The end result was that I could build and schedule a weekly email update, complete with custom content, in less than 10 minutes.
So, we had no choice but to build the email outside of the system. With this in mind I built a mini application that would scrape the site to collect the content for each part of the email. This would then be stuffed into the HTML email template. The end result was a fully built HTML email ready to go…well almost.
After building this, the next problem presented itself without need for any sort of review process. We wanted to track these links using special Google Analytics URLs. So, I mashed the code to generate these special links into the system. This meant that the final HTML code also included the specialized links ready to go.
The end result was that I could build and schedule a weekly email update, complete with custom content, in less than 10 minutes. Do this sort of thing a few times and you will not only find you are getting more done, but you will also find your clients loving you.
Not a Programmer?
So perhaps your biggest problem with this model is that you are not a developer. Certainly for many, this is not an option. Let’s consider a lower tech example to prove the point. In a former job a huge part of my day to day work involved helping an array of account reps generate bids for work. The ongoing joke was that we could do most any task for $10,000. It turned out that when in doubt I would say, “Sure we can do that for $10k.” But of course in reality this meant I way overbid a lot of projects (and lost a lot of potential contracts).
When I took a step back to assess the process for generating these bids it turned out we did a lot of the same things over and over. It also became clear that generating the raw numbers was generally the hold up. The answer was simple; create a price sheet to empower the account reps.
This is exactly what we did. We built a menu of the most frequently requested elements to enable them to confidently bid work without the need for constant help to ensure a reasonable budget. In the end I found that I only had to touch 1 in 3 bids. And on those, I only had to address a small portion of the work. This meant I was no longer the hold up and we saved the organization a ton of wasted time.
This sort of streamlining is so obvious it feels silly to even talk about it. But, at the same time there are an amazing amount of people that don’t think this way. Also, it takes real time to do this sort of thing. And for many it is hard to allocate time to such things.
Let’s Make it Even More Obvious
Still think I am crazy? I really think almost any typical job can be abstracted into success. The web development and programming community are full of them. But even more so, the world is full of them.
Consider the everyday return label. Don’t want to waste time writing your return address on envelops? Order a huge stack of stickers for $10 and never do it again. This simple task has been abstracted by a sticker.
In another example, scribes used to copy books by hand. Clearly this got old fast and these guys had to be thinking there is a better way. Interestingly these guys were also a major hindrance to the spreading of knowledge. So there was a major need to automate and streamline their work.
Focusing Your Streamlining
At times it can be very difficult to identify where to start. Sometimes the process is extremely complicated due to numerous people being involved, specified knowledge and interconnected systems. Most often in such cases you are either so close to the problem that you can hardly see there is even a problem. Or, you see a dysfunctional system, but you are locked out due to the complexities involved.
Forget about fixing everything, just look for the biggest problem to fix.
My solution in such cases is to stop thinking about the problem. Stop trying to think for those involved. Step back and listen. Talk to the people involved. In almost every such case you will find that people will tell you the hardest or longest part of the process. When you have identified a smaller part of the process that holds things up, go dig into that chunk of work. Almost always, there is some poor soul desperate for someone to help them. They often know they are the hold up, but are too overworked trying to keep up to actually do anything about it.
Once you find this person, start the whole process over. Don’t even worry about mapping out their routine. Ask them what the most time consuming, annoying or difficult chunk of work is and you will easily identify what you need to streamline or abstract. I have heard everything from, “I have to buy a new file cabinet every year to hold all the paperwork for this annual process,” to, “I copy this data from here to here 500 times every week.” In most of these cases the problem will quickly present itself. You just have to start asking questions and listen.
Oftentimes you will find (especially in large systems with lots of people), that the whole system is so complex that you feel totally overwhelmed at where to even start. In such cases you dig and dig until you find a simple thing to start abstracting. Once you do this, other pieces will fall into place. At yet another job I built intranet based applications for internal processes. I coded for 3 years and only scratched the surface of things to automate. Forget about fixing everything, just look for the biggest problem too fix. You will be a hero and quickly find the next piece to work on.
The Power of Abstraction
This simple process and point of view has changed my life, my career and the overall impact I am able to have. A fabulous example of this is my blog Design Meltdown. I ran this site intensively for about 3 years (and casually since). This involved collecting enough design samples to publish a collection of 20-30 web sites each day in a specific category. Imagine the amount of work required to collect something as simple as a set of 20 pink web sites or 20 designs that imitate print.
In many ways I can’t believe I ever bothered to even start the site, given the ongoing time investment that would be required. As with many things though, I forged ahead with enthusiasm and no fear of the hurdles.
To say the least, the obstacles presented themselves rather quickly. First and foremost were two key issues:
- I had to identify tons and tons of fresh sites to catalog
- I had to generate a lot of images and thumbnails
In the first problem I found that I was monitoring tons of online showcases for sites, as well as soliciting sites to review from my readers. Oye, what a mess, checking for duplicates was the most obvious problem. And this is not to mention the sheer amount of time required to do this every day.
So I did what I had to, I wrote a program to automate it. A simple script would monitor key sites for new samples to use. These would be added to a list for me to review and tag for future articles. This meant I was building as many as 40 collections or more at one time. When I was ready to generate a new post I would simply use the one with the most samples.
The second problem was managing all of the images. I started by automating the screenshots of the sites and storing them on my web server. Then I automated generating the thumbnails. Then I automated generating the code I needed to place into the page to create the post. Each solution pointed out the next problem.
All I had to do was surf the newest material and tag it. Generating a post was the easiest and fastest part! In the end I had countless people comment on the “team” behind the site. Thanks to the automation the site could operate, and generate the amount of content required.
As a result the site changed my life. My entire career has been shaped by this site. And without abstracting the process to make it as painless as possible, I would never have had the time to make it happen.
If I have heard it once, I have heard it a hundred times, “We need you to replicate yourself.” Why do I hear this in almost every job I get? Well, I think it is because I have a knack for getting things done, and I mean a lot of things done. People want to replicate me, but they seldom realize why.
It is inevitable that those who get more done will get more work and be more profitable.
This has lead me to an interesting need. At times I truly need to abstract myself. Fortunately there is a very easy answer to this. Many tasks (such as design work), might not be suitable for such an approach, but many are. Do you generate a ton of copy, but find the editing and refining process time consuming? Hire an editor. Need to write tons of CSS to create templates for your favorite CMS? Hire a slicing firm.
The notion of abstracting tasks is not new. We hire accountants, plumbers, web developers and lawn care services for things we could all do (to varying degrees of success) if required. Most employers will look at you sideways for asking to outsource parts of your job, but in the few cases I have convinced them it always works out. And as freelancers we have quite a bit more flexibility in how we handle client projects than someone in an employment situation.
Many people refuse to even think along these lines, as fear of becoming obsolete. Ironically this is the exact opposite of what happens. When you do this, two things happen: First, you manage the person helping you out and are essentially the connector between the two. If you go away, the relationship does as well. This makes you a critical component in keeping the productivity going. Secondly, your client will find ways to fill your time, or you'll have additional time to take on higher value clients. It is inevitable that those who get more done will get more work and be more profitable.
At one job I had as many as 10 outsourced people working for me. Much of my job was managing those people and keeping them busy. The end result was huge profits for the agency and lots of happy faces, as a freelancer this would have brought me higher profits. There were times we actually had to sit down and worry our margins were somehow too high.
Efficient and Faster
If it seems I am beating the point to death, it is only due to my enthusiasm for the topic. I had to hold myself back from stuffing this article full of many more situations where I see people in a wide range of jobs, getting ahead by looking for ways to do things better and faster. It would seem that a large number of people are content to churn away mindlessly. In a way this is great. It gives everyone interested in being efficient a huge opportunity.