Think Like A Nerd

“Nerds, nerds, nerds!” – Ogre [Revenge of the Nerds (1984)]

A lot has changed since the 80s. The nerds that tinkered with electronics in their basements back then got really rich and enabled new generations of nerds to indulge in their nerdy-ness. And now they are everywhere! And you have to work with them!

But if you look closely, your nerds have a lot of good qualities. They are smart, productive, value quality and often love to solve the problems that you hate. So now is the time to learn from the nerds around you!

Why think like a nerd?

Nerd do a lot of things well. More specifically:

  • They have a systematic approach to work and problems
  • They don’t like complexity, and so often try to simplify it
  • They are lazy – in a good way. So they like to automate the boring things
  • They value quality, and so engage in a lot of best practices

Below are some examples.

A nerd thinks in Abstractions

Nerds don’t like complexity, and so they usually try to simplify something by encapsulating it. In computer science, abstraction is a technique for managing the complexity of computer systems. It works by establishing a new level of complexity on which a person interacts with the system, thus suppressing the more complex details below that level. As part of encapsulating the complexity, a nerd will then make a beautiful interface at the new level, making it easy to use and understand.

Huh? What does that mean?

Think Like A Nerd Post - Restaurant

Think of a restaurant. It’s fairly complex. If you walked in and were asked to describe it you would be confronted by front of house, the bar, the dining area and the kitchen. If asked to describe the kitchen, there are the chefs, the pots, the pans, the stove tops and the ovens. Not to mention the ingredients, the sauces, the recipies, the seasonings, the fridges and freezers, plating instructions… A big complex system right?

Well, a nerd will just look at the basic interactions that occur when you, the ‘user’, walk in.

Think like a nerd post - abstraction 1

So you go to a restaurant and you get a menu(), which shows you the food available. You then order your meal, say order_meal(hamburger). When you’ve finished, you signal meal_complete(), allowing the staff to clean your table. If anything goes wrong, you can send it back, correct your order or cancel your order.

This is an abstraction of the functioning of a restaurant. And you know the great things about abstractions? They are independent of the underlying system. In non-nerdy terms, this means you can apply they same instructions to any restaurant and get the same result.

Think like a nerd post - abstraction 2

What does this really mean to a nerd you ask? Well, if the abstraction is independent of the underlying system, you can change the underlying system and the client (the customer) will still know how to use it. The only difference is that with one underlying restaurant, when you ask for the menu() you get foie-gras and things with jus, and with the other you get chicken nuggets and things with BBQ sauce.

Interfaces

And lo, you have described an interface. And nerds love interfaces – they are a key part of software development. Mainly because they offer a known behaviour, because with complexity comes surprises, and nerds don’t like that.

An interface (often known as an API) describes how to use an underlying system, and means that anything which follows the interface can use it, and anything that obeys the interface can be connected to by similar things. APIs are gradually spreading through popular services. One such service is IFTTT (if-this-then-that), at ifttt.com. This is a service that allows you to link a trigger to an action, via interfaces provided by each respective thing.

Think like a nerd - interfaces

For example, you can trigger an email to be sent when your phone battery is low. Or record an entry in a spreadsheet when you get a PayPal payment. Or even fake an incoming phonecall by sending yourself a text. It’s true. All because your phone, paypal, Google Sheets and SMSs have an API. And the nerds of the world are rejoicing.

Nerds Don’t Repeat Themselves

And that’s not in a rude way. In Software Engineering the DRY (Don’t Repeat Yourself) Principle aims to reduce repetition of information, especially in muti-tier architectures. The DRY Principle is stated as:

“Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.” – Andy Hunt and Dave Thomas, The Pragmatic Programmer

When the DRY princple is applied successfully, a modification of any single element of a system does not require a change in other logically unrelated elements. It’s probably what programmers complain about the most – having fixed a reported issue only to find that they then have to apply the same change in multiple places across the codebase because of a violation of the DRY principle.

Think like a nerd post - dry wet

This principle can be applied elsewhere other than computer code. Documentation, for example. In a restaurant, the owners wouldn’t keep a menu document on their computer for all of their menus, would they? No, that would be madness! But if they had an à la carte menu and a set menu, and the Crème brûlée featured on both, would they keep those entries separate? They probably would. And what if you then decided to top your brûlée with a little berry coulis? Well, you would have to make sure you updated the information in both menus. A nerd would be jumping up and down at this point, blathering on about violating the DRY principle, mainly because it is creating what they consider excessive effort. And they are probably right. And yes, there are ways to fix this. Go talk to your nerd now to find out how.

Nerds think about Testing.

A lot.

Nerds know that software and software development is complex. And they don’t like it when things go wrong. So they like to test things, at all levels. But when you think about it, all engineering companies do this. When you buy a car, every part has been tested, at all levels. The shock absorbers have been verified within a particular limit. The pistons in the engine have been checked against tolerances. The fuel pump would have been given a test. And once everything is put together the car as a whole is tested. Nerds do this in software because they know about complexity.

Think like a nerd post - cake tests

Want an abstraction? Imagine your nerd is baking a cake. He will:

  • Test early, to find things when they are easy to find & fix (the finger-in-the-batter method. Oops, best put in more chocolate!)
  • Test often, using a test harness and automation (put a remote thermometer in the cake while it’s cooking)
  • Test at multiple levels (Is the cake cooked? Is it moist? Is the frosting covering it all? Are there enough chocolate shavings on top?)
  • Test to verify agreed functionality (mmm… the cake is rich and chocolatey)
  • Test with real users (that’s you)

The best nerds out there also test against undefined inputs. This is incredibly valuable, because they know that someone out there, at some time, will do something crazy and unusual and still expect the system to keep working (and just tell them politely that there is no need to load a tape into bay 7 and 17 of a a 12-bay tape drive at the same time).

And how does testing relate to you? Well, when you’re writing that document for your boss due by the end of the week, do you show them a draft half way through to make sure you’re on the right track? Or just keep on plugging away, knowing that your report on hunting dogs will have all the right facts regarding legislated culling of dingos in Queensland. Right?

Nerds love to Automate

All of the things. Automation is the true path to laziness. A Nerd just wants to solve the problem and know that it works. They want to focus on the Engineering part of Software Engineering. Tasks such as manually checking filenames so they are recognisable by the invoicing system isn’t a good job for a nerd. It is a good job for an intern. Or your nerd can automate it so that a computer does it all the time, day and night. This is why a nerd loves learning keyboard shortcuts – “OMG, if I use the mouse to copy this text from the Edit menu and then select the new file and then paste it from the Edit menu and then have to turn it into bullet points and then print from the file menu it will take like 20 seconds and doing it for all these files will like steal an hour from my day!!!”

And so Ctrl-C, Ctrl-TAB, Ctrl-V, Ctrl-Shift-L, Ctrl-P, Enter is the nerd’s panacea. Unless they haven’t already written a script which will do it all automatically for them when they go home.

The other thing about automation is that a nerd can rest in piece knowing that the same thing will happen every time. Whereas with a human doing the actions, especially as they get more complex, something is bound to go wrong.

As mentioned above, IFTTT (ifttt.com) is introducing automation to millions of people world-wide. Try it. You may never need to laboriously fill in a spreadsheet with your timesheet again.

And go talk to your nerd now, so you can embrace laziness together.

 

Progress

Progress-Footprints

Are you progressing on what you are working on? You are? Great!!

How do you know? How far are you towards your goal? How much progress have you made? How much is left?

If you can’t answer these questions you may not be progressing at all! You may have done some great stuff but how much has it counted to your overall plans?

What Is Progress?

Your average dictionary described progress as:

Forward or onward movement towards a destination.

Let’s break that down. There is a destination – otherwise known as a goal. There is movement – i.e. work has been done. And it is towards the destination, in other words it is measurable as being the right work. So how can you apply that to what you are doing right now?

Goals

Progress is nothing without a goal. You need something to progress towards. Imagine you are an explorer and you have covered 13km today. Great! What direction were you heading? Was it the right one? Did you just unknowingly go around in a big circle? Did you really make progress?

In engineering, a goal is usually well-defined at the start of a project. But if you are your own boss, do you know what your goal is? Do you want to make a certain amount of income in this quarter? Do you want 100 people to sign up for your newsletter this month? Do you want to connect with 10 new leads this week? Great, these are good goals, and they are the yardstick against which to measure progress. If you can’t write down what you want to achieve then that needs to be your new priority.

How Do You Measure?

When I ask a member of my team how there work is going, there is a pretty good chance the answer I will get is “I’m going good and I’m nearly done”. Great! So that means you’ll be done today? “Err.. no not today”. So when do you reckon? “Soon”.

I’ve had this conversation plenty of times. The best way to fix it is to implement a way of measuring. As a Software Engineering Manager, my usual go-to is the functional unit test, which is a nerdy way of checking that one measurable part of your overall goal is complete. Which brings me to incremental progress tracking.

Break it down

Anyone can do this – break your goal down into tasks (increments) which in turn you know that when they are done your goal will be complete. Then mark them as done as you do them. If you have 10 tasks and you knock of 3 of them, then you’re 30% done. It’s not always that simple but it is a good start.

Tasks are usually driven by the goal in question. Planning a party? Your tasks are probably send invitations, hire a room and order food and drinks. Easy to complete and check off. Need 100 signups for your newsletter? Maybe your tasks are launch an ad campaign or personal word-of-mouth. If an ad campaign gets you 20, you will need to think of 4 more. But at least there is a direct measure which you know is related to achieving the goal. Remember, if you can’t measure it how do you know you are making progress?

Estimating the Future

The great thing about defining goals, breaking them down and measuring progress is you will become better at estimating work for the future. Nothing pleased me more than going back to the same engineer a few weeks later and getting an answer of “I’m 40% done and I’ll be done in 3 days”. Even better is being able to estimate a new task or goal well. Sometimes this can be hard, but with some time spent tracking goals, tasks and progress, you will be able to do the same. And a great burden is lifted when you can tell your boss or your client reliably when they will get what they want.

 

4 Tips for Working with Distributed Teams

Working-From-Home-e1436879956268

Click Engineering recently worked with a small startup who had most of their team in Perth but also had their developers in Melbourne. Faced with this, the problem had to be solved of how to get the best out of the team.

Working with a distributed team can be a definite problem, as working together in an office provides many opportunities to catch up on the day, identify problems people are having, offer advice, answer questions and generally build a good relationship with the team. And as team leaders and managers know, a good relationship with your team is a vital part of getting the best out of everyone.

When the team is located in the same office, it is easy to see if people are frustrated just by their body language. You probably take it for granted that you can spot this and go over and offer a ‘how are things going’? And you may not realise how much of a gift it is to cross paths with a team member in the kitchen or hallway and be able to find out how they are going any ask any questions they have. These are all golden opportunities for the team to ask for clarification on something, double-check a priority or just catch up over the weekend’s events.

So what if these opportunities are taken away from you? You will learn very quickly how valuable they are! When team members are working remotely, what should you do to get the best out of them?

Schedule Catch-Ups

If you don’t have any opportunities to have an impromptu catch-up with a team member, you will have to make one. Remember that if they are working away from you and other team members they are getting nearly none of the interactions that you generally take for granted. So schedule a simple phone catchup with them 2 or 3 times a week. You will be surprised how much difference a 30 minutes of conversation a week makes and the amount of valuable information that can be transferred. Also make an effort to schedule a less frequent team-get-together, say a monthly Friday afternoon tools-down session over a videoconference so that everyone gets to catch up.

Involve Them

While you and the rest of the team are discussing problems and making decisions, your remote staff are not getting any of that benefit. Some people may think it is acceptable to just send an update on the decisions made to remote staff, but that probably constitutes 10% of the useful information that was discussed. Make an effort to involve your remote workers in the discussion so that they do not feel excluded and the whole team benefits from everyone’s input.

Set Well Defined Tasks

While this post may imply that remote team members are a bad thing, there are also benefits. For a software engineer, it is a great opportunity to get in ‘the zone’ where everything just flows through the keyboard. It’s a great place to be, but you first need to achieve it and then need to sustain it. You can help achieve it by working together to identify what aspect of your product your team member is most passionate about. And you can sustain it by fully agreeing the specs of the task. If a task is not fully specified then questions and queries will be raised and this takes you out of ‘the zone’.

Share The Plan

All team members need to know where their work fits in amongst the overall plan. This is easy when you are working side-by-side, but when working remotely this is no longer trivial. So use on-line planning tools to make it easy for people to understand the whole plan and see how all the tasks fit in to it. With a little extra encouragement the team should also be updating their progress and so the question of ‘how is everything going’ can be answered easily whether you are in the office or working remotely.