You Don’t Have to Know Everything

I have a lot to learn.

This is one of the thoughts that is in the forefront of my mind more often than I’d like to admit! I’m still a relatively young developer, particularly for someone in a position of technical leadership, and (in recent weeks especially) I often suffer from the worry that I should know more. I feel like I’m not developing fast enough, or able to contribute to every discussion with the perfect clarity befitting of a technical lead.

This is a ridiculous notion of course. No one knows everything all the time. Everyone is learning and while you can be honest with yourself about the fact that you do want to improve, you have to allow yourself to not feel like you have to have all the answers. Because there will always be a more talented developer than you, and a lot of times you might have them on your team!

A while ago I watched a talk by Clare Sudbery, where she discussed how she dealt with being in a position where she didn’t always have all the answers for her senior technical staff. The talk is linked below.

I really enjoyed this talk and it resonated with me a lot. I’m fortunate to work with some very knowledeable people and there are often times where I just don’t have the understanding I’d need to advise or make suggestions based off my technical expertise. As a Technical Lead, it’s easy to feel like you should have all those answers. And that can be pretty daunting. Especially when you think about just how much there is to know. The thing that Clare points out is that that’s okay!

It is not your job to know all the answers to every question that could come up. Your job as a technical lead is to bring together a group of people with varying technical ability and try to funnel that into a constructive form. You want to hire talented people who have technical knowledge! That’s a benefit to your team. And then you want to work to empower that team, with knowledge and strategies that help the team share in the expertise they have. Clare goes into various strategies for teaching and building the skills of these developers. But, sometimes, you’re going to be the one who is going to be confused, and it is important that you are open about that confusion. Because it gives other people in your team tacit permission to open up when they’re confused, which creates opportunities for your team to grow.

So what do you do when you’re faced with a situation where senior technical staff are presenting problems and solutions that you don’t feel confident evaluating?

Ask the people involved to slow down and take the time to break it into pieces. My favourite phrase for doing this is something like “Walk me through that” or “Bring me with you“. I often find myself saying these phrases in meetings, while pair programming, or just in catch ups with my team. I really like these expressions (or any similar sentiment) because they’re a way to ask your co-workers to take a step back and realize that there may need to be a deeper explanation given. It doesn’t put any blame on anyone, for not explaining things well enough, or for not making sense or anything like that. It’s just an honest admission that, for whatever reason, I’m not on the same page as someone else.

It’s a well known concept that, as you become more experienced with any skill, you internalize the basics and those actions that used to take deliberate practice and effort, just become a feeling which you act on. This is what allows athletes to make split second decisions between a huge number of techniques, and also allows creative experts to make up entirely new things on the spot that seem to fit the moment perfectly. But because of this, you often find that experienced practicitioners of a skill find it very hard to break down, in the moment, why they chose to do the thing they did. They just do it. I’ve found the same thing with talented developers I’ve worked with. They’ll often answer a question by tackling the bit that they’re wrestling with, without really considering that other people haven’t gotten to that point yet. A lot of the time, this isn’t done with any malice, or even an understanding that it’s happened. It’s just that the answer was clear to them so they skipped the step. It’s important to be mindful that this could be what’s going on, and to not get frustrated with people.

It’s usually a blessing in disguise! As soon as you recognize that, that means there’s an answer to a question in the room and you can help everyone around you get to it. Even if you, as the technical lead, understand the same thing as your experienced developer, this is a great opportunity to say something like “Walk me through that”. In my experience, even if you are on the same page (and I’m often not!), there will be at least one or two people who would appreciate being brought up to speed but feel like they’d just be getting in the way of they said anything. Getting those knowledgable people to take a step back and bring people along can be a great way to help the team move forward together. It can also be a great way to challenge people, without creating a hostile environment. Earnestly asking someone to bring you to where their head is at, even when there’s frustration in the room, can be a fantastic way to convey that you’re honestly trying to work towards a consensus, and push things forward in the best way possible.

So the next time you find yourself in a situation, for whatever reason, where you are missing something, maybe give “walk me through that” a try.

I’d love to hear thoughts, phrases, and techniques on dealing with the moments where you don’t feel like the expert. How do you feel when it happens to you? Feel free to drop me a comment or message me, I’d love to hear from you!

Becoming a Technical Leader

In the middle of 2019, there was an opening at my job for a Development Manager position. Rather than take the role as described, I made a request to change my role to Technical Lead instead. I explained what I felt that meant (as my company had never had someone with that title before) and discussed it with our CTO. I felt that our organisation needed someone who had a responsibility to building a strong technical team, and to ensure that our day to day practice was as good as it could be. And I wanted to take more responsibility for that kind of thing. I felt that the Development Manager position was also important; someone responsible for the department and how it interacts with the rest of the company at a high level. I just didn’t want that to be my job!

Very luckily for me, there was someone else in the company who felt the same way but approached it from the departmental side. In the end, the role was split in two and I entered my current role as R&D Technical Lead. This was great! I had been allowed to take a position which let me make the changes I felt were important for the Development team. The company felt it was valuable and let me try.

There were two problems though. First of all, I was stuck on a big project which needed to be finished, but that was a legacy code nightmare. It took up almost my entire year to get through it, leaving very little time to think about other things. And secondly, I had no idea what I was doing. I’ve not been a Tech Lead before, and as a Developer, I’m still on the younger side. My experience is in developing for and maintaining a large legacy codebase in C++, and leading projects within that framework. This was a whole new ball game. I had a lot to learn.

Drawing of me with my back to the viewer looking up at two looming towers with the AWS logo on them
I drew this in 2018 when I was feeling out of my depth at a conference. I still feel out of my depth pretty often!

Fast forward to now, January 2020.

I have a lot to learn.

As I mentioned, that big project took up most of my year. No time to work on this role directly. But! That project has ended and I’m now in a position to think about what being a Tech Lead means to me and start my journey to be as good at it as I can be. So I thought I’d try to share as much of that as I can with you all, because learning together will be more fun than sprinting into the darkness alone!

What is a Tech Lead (to me)?

Early last year, I made the decision that I wanted to try to be considered a Technical Lead by the end of 2024. As part of that, I had to put a lot of thought and research into what people consider this role to be. There’s a lot of scope to move around in the Software Development industry and the structure and criteria of a job role are entirely defined within the context of the organisation that it’s a part of. This leads to an interesting issue where lots of positions with equivalent responsibilities have different names. This can make it tough to figure out what it is you’re trying to achieve, and also makes the conclusion you come to somewhat of a personal opinion.

For me, I think a Technical Lead can be described as the following:

“A Tech Lead is a Software Developer who is responsible for ensuring the quality of the technical output of their team is as high as it can be.”

There are a lot of things hidden inside that definition for me, and it’s still evolving as I learn more. So let’s break down that sentence.

“A Tech Lead is a Software Developer…”

This is very important to me! A Technical Lead to me is someone who is actively involved in developing solutions. Writing code and designing software. This is the day to day work of the team. If you aren’t aware of what that’s like, then you can’t be sure that it’s being done in a way that can create the best experience and best output, because you won’t know what the practicalities of creating that output are.

One of the reasons this role appeals to me over Development Management, or even CTO type roles currently, is that it stays close to what I enjoy; writing code. I don’t have to make excuses to justify that work. It’s core a part of the role.

“…responsible for ensuring the quality of the technical output…”

To me, this is where all the ambiguity lies. But it’s also where all the hidden gems are!

Ensuring the quality of technical output means so much to me. If you’re experiencing the development process on a day to day basis (as I believe you should be as a tech lead) then you’ll be able to experience things that slow you and the rest of the team down. Technical things in your solution is the most obvious thing to a developer. Framework improvements, refactoring, or architectural clarification. These are great and useful things to do that improve the technical output of the team by making the code that you should be writing clearer. And as a senior technical staff member, I’d be lying if I said the coolest bit wasn’t being a part of designing and implementing the code that the organisation needs. But these may not always be your pain points! This is about the quality of the team’s output, and the team doesn’t just throw out code into a void. It works as part of a larger organisation, or at least as part of a larger purpose, which means interacting with other functions to deliver what they need. You can write a bunch of fancy code, but if it doesn’t do what your stakeholders need because there was a breakdown in communication then it’s not very useful!

So to ensure the quality of the output of the team, you may need to look at your processes and find what’s slowing you down. Does it take too long to log and work on issues? That’s going to lead to less detailed issue reporting, which leads to more opportunities to get the work wrong. But as a Tech Lead you have the opportunity to deal with this.

Yet another way to ensure quality is about the people in the team. The best work comes from people who are comfortable and content. Not every member has to be a super passionate, high performing power house. That’s not realistic (and often not a healthy dynamic!). But to ensure the quality of your team’s output, you need to be ensuring that they’re growing, and in a position where they aren’t worrying about job security, or being made to feel unsupported or unwelcome. These things also come in the realm of your care as a Tech Lead, because they’re things that can drop the quality of your team’s output. Which is great! Because you should care about that kind of thing at every level, but as a Tech Lead you have the ability to try to do something about it.

Finally, a Tech Lead is responsible for all of that. If you’ve truly been given a responsibility, then that means you should also have the tools to be able to fulfil that responsibility. That’s great! It means that, hopefully, your organisation has given you permission (within reason!) to be able to make changes for the better. To spend your time on things that you believe will generally lead to a better working environment. That’s pretty cool!

“…of their team…”

This is the final part of that definition that I’d like to mention in more detail. A Tech Lead is the leader of a team. This means doing your best to exhibit leadership skills. Setting boundaries (to allow others to do the same), leading by example, and often times it can mean managing people. This is often the part that fills people who come from a purely technical background with the most trepidation. People are complicated. They’re unique, and messy, and interesting. And depending on what other roles exist in an organisation, it may be up to a Tech Lead to be responsible for creating an environment where those people can be their best selves. Even if there’s a dedicated manager or Team Lead to go alongside the Technical Lead role, there will always be a component of leading the individuals and building a team that’s conducive to the work you need to do. And in my opinion they should be one of the major considerations in driving your decisions.

Simple pencil sketch of a group of people high fiving

As you can see, a Tech Lead can be responsible for a lot of things. Which means learning a lot of skills in order to be able to do it well. I had intended to add the skills that I think I’d like to prioritise in my journey to be a strong technical leader, but I think this blog post is already a bit long! So I’ll leave that for another time. I’m sure you can see how amorphous it is as well. It depends on the needs of the organisation, your personal aspirations and temperament and the skills of your team. But it’s a great opportunity to build things that are interesting and a joy to work in; software and teams!

What resources have I started using?

As part of this journey, I started doing research on what people consider the role to be. Some of the following have been useful to me. Hopefully they’ll be useful to you too.

Pat Kua’s BlogDefinition of a Tech Lead – In the first developer conference I went to I saw a talk by Pat Kua which lead me onto his blog. He’s made it a focal point of his career to describe and empower the Tech Lead role. I highly recommend his blog and talks if it’s something you’re interested in!

The Lead Developer Conference – The Lead Developer Youtube – One of the conferences that I’d love to attend is The Lead Developer in London. This conference is specifically aimed at technical leaders, new, old, and aspiring to help them build high functional and content teams. All their talks are provided free on their youtube and I can recommend them!

Where do I go from here?

Finally, I thought I’d go through what my first steps on this journey are going to be. Personally, I’ve found an affinity for leading teams. It’s something I’ve had a lot of practice in, and building teams is something I enjoy doing. But as I said, a Technical Lead is a Software Developer first. And with only 6 years of professional experience, the technical aspects of the role or something I personally feel I want to be more confident in.

I have been developing in a C++ application for most of that career, but more recently I’m designing a system that will mostly be written in C#. As such, I’d like to really get C# knowledge under my belt.

C# Certification – MCSD 70-483 Exam – I’ll be starting the year by getting the Microsoft C# Certification as a way to guide my learning, and as something that I can use to prove that skill exists.

Attend conferences – I have been lucky enough to go to a few conferences during my career and each one was a pretty amazing experience. I was too nervous to talk to anyone else, but I feel like they’re a huge opportunity to learn, and inspire learning. So I’d like to attend at least one more conference this year.

Write Blog Posts – There is so much to know in tech (and in the world at large) and I’m always terrified my sieve like brain is going to forget all those amazing pieces of information that the studying, reading, practice, and discussing can give you. So to do something about that, I want to try to do more technical writing and personal ruminating.

So that’s where I’m starting. And that’s what I’m shooting for. I hope you’ve enjoyed joining me as I gather my thoughts on this. I’d love to hear your thoughts, experiences, and aspirations!

Comment below, feel free to share the article, or get in contact with me.

Photo of me in my study

Using AutoHotkey

AutoHotkeySiteOver the past couple of months at work, I’ve been beginning to notice all the little things that I need to do to develop. Things like running multiple applications to test; navigating folders in cygwin to run build scripts; or even adding template code for things like debugging. They never seemed like much. Just a part of the job that takes the time it takes. But, as I’ve gotten more used to using my keyboard to navigate my machine, I’ve had to think about the things that I do in a new light to try to see if there’s some way to replicate that without using the mouse. So all the jobs that had just become muscle memory for me began to really show up.

Now, there’s nothing wrong with being comfortable with your methods; whatever works to get you producing the stuff you want to be making. But if you’re feeling like you want to find a way to do things a little faster, or you’re tired of doing some actions a bunch of times, or you just would like to try some scripting then I may have just the solution for you. It’s called AutoHotkey and I think it’s really cool!

What Is Auto Hotkey?

AutoHotkey is a program designed to make make scripting events on your computer simple and hugely flexible. By entering a triggering combination and a series of events to perform in a simple file, called a .ahk, and then loading that file into the autohotkey program, you’re able to invoke a series of potentially complex behaviours with a single combination. This can become a hugely powerful tool for saving time. It’s also super fun! It’s another one of those tools which starts to make you feel like a techno-sourcerer.

By writing short snippets, you suddenly have the power to automate all the tedious or error prone things that you had to do before. Got a file path you have to type in a lot? Make a hotkey for it! Need to copy files from one place to another every three hours? Make a hotkey for it! A piece of template code you write a lot? Hotkey. You get the idea.

Getting Auto Hotkey

Getting auto hotkey is really simple. Just get on to http://www.autohotkey.com/ and go to the download link that you’re presented with. Grab the latest version, because it’s more fun to live life on the edge! Run the installer and you’re good to go. What you’ll have access to is a desktop application for Autohotkey which will open up a  reference to the autohotkey scripting language.

AutoHotkeyHelp

It’s pretty unassuming, as far as references go, but it hides a wealth of information. The fine people at Autohotkey help you out with a nice opening page, which gives you some first steps to take in having a look at the scripting language. And the search box is super robust! I tend to just think of kind of what I want to do, tap it in there and see what comes up. Usually you’ll get a stream of hits and I’ve not yet had a problem I’ve not been able to find in there, with a bit of rooting around.

I’d advise actually going through the tutorial in there, which is thorough, covers what I will cover here and goes into more depth. But if you want it all on one page, feel free to keep on reading here and then go back to the AutoHotkey Help when you want to dive in deeper.

The application doesn’t actually do anything other than provide access to the reference. What you really need the installer for is for the ability to load the autohotkey scripts that we’ll cover next.

Writing Your First Hotkey

This is all very well and good, you’re saying to yourself, but I’m no cyber-mage just because I’ve got some book filled with words. Well let’s get into the fun stuff then, shall we?

Writing your first autohotkey script is easy as ready made pie; all you’ll need is your favourite editor. Below is the simplest of simple autohotkey scripts:

AutoHotkeyTutCode1

The script is made of three parts: the initiating key combination; the instructions to carry out; and the return statement.

The initiating key combination is exactly that. It comes in the structure of keyboard keys that need to be pressed all at once, followed by two colons and it tells Autohotkey what combination of keys need to be pressed in order to perform the instructions on the subsequent lines. The letter keys are as is but, because you’re probably not going to want your hotkey tp trigger every time you press the ‘d’ key, I’ve added an augmentor to it. The ‘^’ represents the control key (on windows). The colons are just there to signify the end of the key sequence. So that first line means “Autohotkey, please do what comes next every time I press ‘ctrl’ and ‘d'”. We want to be polite to our chip based partners in crime.

The second line is where we tell autohotkey what we want to do. In this case, I decided that I hate having to type all those pesky letters every time I want to log a debug message in my C# scripts for Unity 3D. So I want a hotkey that just writes it out for me. To do this I’m using autohotkey’s ‘Send’ command, followed by a comma. The comma is optional but I find it makes the distinction between command and input super obvious. Then, after that, is the string I want autohotkey to type. This is an important distinction! Autohotkey isn’t taking you’re string and pasting it into the editor. The ‘Send’ command explicitly sends key events for each key you specify, one after the other. That means that if you click somewhere else, autohotkey will start throwing key presses into that new program or new space! It also means you can replicate key presses to any program, this means you could potentially traverse your machine with a hotkey! There are ways in Autohotkey to automate things in the background, with conditions, with loops, with user input; the list goes on. It is a playground of wonderful things to try. You can have as many instructions as your require beneath your intiating key combination, as long as its before a return statenent, so keep going til you find what you need.

Finally, the return statement is the last line needed to finish off your script. All the return statement does is inform autohotkey that there are no more statements to execute for this shortcut. And there you have it! Once you’re happy with your script, all you need to do is double click the file to load it as the active hotkey script and you’re good to go! If you’re loading it for the first time since startup, you won’t see any change. If you want to confirm that auto hotkey has your script loaded, just double click the file again. You should be gifted with a pop up which will inform you that you’re about to replace the active script. This is because you can only have one autohotkey script running at a time. But don’t worry. You can add as many hotkeys to same script as you can remember key combinations for, provided that you have a return between each key combination line.

Combining It With Batch Scripts

I’m sure you’re brain is aflame with the fires of imagination! Your hands busy forging the combinations of which your personalised spell book will comprise. But there’s more! One way to increase the power of your hotkeys is to use them to run and initialize batch scripts.

For those who might not know, batch scripts are another and probably more powerful way to automate parts of your workflows and life in the computing realms. Honestly, I’ve barely scratched the surface on batch scripts so mine are all a bit small and manual still. But by using the ‘Run’ command in your autohotkey script, as shown below, you can call up a batch script or other program. This is one way to keep your hotkey scripts neat whilst also being able to automate complex tasks.

Also shown is the ‘SetWorkingDir’ command, which sets the context for all the following commands until the next ‘Return’ statement. Because this command is a little more serious, I’ve added the ‘!’ key, which represents alt on the keyboard, to the initiating combination too.

AutoHotkeyTutCode2

 

Well! That’s it! I’ve found this to be a really fun and powerful way to increase my productivity without having to spend a huge amount of time learning things. Autohotkey is massive and there are plenty of things to try out. So if you find something that you have to do often, or that you’d rather not do manually, consider an autohotkey script. If you found this useful, or thought something could’ve been done a bit better, then please let me know.

Have a great day everyone!