“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 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.
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.
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.
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.
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.
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.
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.
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.