What is a software engineer?

This talk was given at Constructor Labs, Shoreditch, London. 22nd Feb, 2018

I was born in 1980. When I was a kid, there was no Internet. Real-time communication was restricted to landline phones, radio and TV — and two out of those three were unidirectional data flows. I used to remember dozens of people’s phone numbers in my head.

My dad was a mathematics teacher and back then, there was this educational computer called the BBC Micro. If you were really lucky and you had a special box for it, you could download games from Teletext at night using your TV aerial, once the regular programming had finished. You had to wait for the right program to be broadcast, then you could save it to disk, those big old 5 ¼” ones. Sometimes a bird would sit on your TV aerial and screw up the reception and you’d have to try again later. It was a glimpse of the future and very exciting.

In 1995, the commercial Internet came along and it was amazing. It was like being in War Games, or Lawnmower Man, or Ferris Bueller’s Day Off. You could download files from open servers at any time, if you could find them. People made lists of files and posted them on public bulletin boards. There was email. And, best of all, IRC. The possibilities felt endless (although, of course, your options were severely limited by bandwidth and your parent’s phone bill. In the UK, you couldn’t phreak like in the US due to our early adoption of digital exchanges). My family didn’t get the Internet straight away so I had to go over to a wealthier friend’s house to use it. One of my earliest memories of the Internet is staying up all night on Yahoo! Chat talking with people in America. I was hooked.

In 1997 I wrote a chat program using Visual Basic and installed it on my sixth form college’s network. I made it available to everyone on the network share and it went crazy. Relationships were formed. Fights happened. I met my first girlfriend, who had been too shy to talk to me up until then. No-one could get on a computer to do any actual studying. The college’s server crashed every single lunch time and I got in a lot of trouble because I had lost control of distribution. The teacher in charge of IT, Mr Simons, couldn’t do anything about it because every time he deleted the program, someone would turn up with a copy on floppy disk and put it back again. It was awesome and everyone had a great time (except for Mr Simons. I’m genuinely sorry about that).

Later that year, I discovered the web. HTML. JavaScript. As a kid who made fanzines by photocopying physical sheets of paper, this was a game changer. My fanzine was online within days. My obsession with the Internet has only grown since then and my career, which started with the web, has remained there.

So, what have I built during my career? Useful things, useless things, crazy things.

My first project was a CMS for law firms. My job was to architect the front end and it was my first professional role as a software engineer. Previously, I had washed dishes in a hotel. I was there for a couple of years and did a mostly terrible job, but it taught me a lot of stuff they don’t teach you at university, such as how to work effectively and how to work with others. Some of the work I did there is still in use.

After that, I spent three or four years contracting in order to expose myself to a wide range of working environments. I worked for travel companies, insurance companies, banks, telecoms companies, co-ops, the government, startups and tried starting my own business, building all sorts of things. My business sucked because, of course, I had no idea what I was doing. Some jobs were great, some were awful, and I gradually began to understand what worked and what did not.

In 2010, I moved to London and after a stint at an advertising agency, I ended up working for Microsoft for four and a half years. It was a massive eye opener. I thought I was a great developer when I joined, but putting me up alongside some of the best developers in the world showed me just how much I didn’t know and shone a really harsh light on the areas in which I was deficient. At the beginning especially it was really, really hard and sometimes I wanted to give up and go back to an easy life. But there were amazing times, too, and I made some really great stuff for them and solved some really hard problems, a lot of which is now part of the Office 365 suite. Microsoft also gave me the opportunity to get involved in community outreach work, such as diversity events and hack days, which are some of my fondest memories of the time. Without all the hard work, I would never have had those opportunities.

Now, I work as a Principal Consultant for YLD. I don’t write as much code as I used to, but I get to advise companies on technology strategy and mentor those beginning their careers as software developers. Being able to provide young people just starting out with the advice I wish I’d had at that stage of their career is deeply satisfying.

So, what does your career in software engineering look like? Whatever you want. I don’t think my career path is typical; I don’t think there is a typical career path for a software engineer. One of the most pragmatic engineers I ever met studied fine art and sculpture before moving into this industry and he taught me a lot.

Being a software engineer is a great opportunity to help build the world of the future. You use data and tools to analyse and improve existing products and processes. If you’re lucky, you get to create products that don’t already exist. If you’re switched on and in the right place at the right time, there is a lot of money to be made. Having said that, I don’t think most people become engineers for the money, because there are better ways to make money faster, if that’s what you’re into. I think most engineers work because they are passionate about identifying and solving problems. You should make this your focus.

Eventually, you may find that you have learned enough to be able to spot classes of problems. Things you have solved before, or similar, you may find crop up repeatedly. Once you reach this point, you will most likely have a pretty good idea of the broad picture and are able to make a pretty good guess as to what’s coming next. Now, you can start to guide projects, rather than implement them. You will know more than just how to solve problems technically, you will know what a successful team looks like, the kinds of processes that deliver efficiently and provide value for money to your clients. You will be able to recognise how people will behave and choose the best mix of people to build a team for any given project. You will be able to advise clients on the whole scope of a project, not just a specific part of it. It is less hands on, but the scope of the change you will be able to effect becomes much larger.

You may start to gain a reputation and people you’ve never met before will come to you for advice. Maybe you won’t do much actual hands on engineering at this point, but you will know lots of people that can. You may have the chance to write proposals and scope out broad architectures and explain them to people in ways they can understand, even if they are non-technical. You will have the opportunity to look after the people under your direction and help them to develop their careers. You are still solving problems, not with technology now, but with people.

You don’t have to go this way. At YLD, we have engineers on our staff that solve and advise on very high level technical issues, above the level of the individual client or project. They help us choose classes of technical solutions and inform our company’s technical direction. They perform research and produce white papers. They write and deliver training courses and speak at conferences. And they still do hands on coding, because that is what they love and why should they give it up? They’re great at it!

My advice for you?

Self promote! To get the jobs you want, you have to sell yourself. This may sound distasteful but it doesn’t mean selling out. It simply means writing a blog, having a github account, open sourcing your code, producing videos on YouTube, tweeting about things you love or talking at meetups. Be active in the community, and share your passion with the world.

Learn! Turing developed his theoretical machine only 100 years ago. It took 30 years to put that thinking into practice. The world of software is young; really only 60 years. The web is really only 25 years old, if we’re being generous (Netscape Navigator came out in 1994). There is so much we don’t yet know, and so many problems yet to be solved. As in any scientific discipline, the more we learn, the more questions we have. There is a lot of scope for you to do so, but if you don’t keep at it, it will move on without you! Adobe Flash engineers could command huge money only 5 years ago. Now, Flash is long forgotten, crushed by HTML5 and JS standards.

Persist! Coding can be hard and hard things can be frustrating. Don’t give up! You should view being an engineer as a challenge, an opportunity, and a commitment — to yourself! Not everybody can do it. I was rubbish when I started but I always tried to learn from my mistakes, of which there were many. If you make this commitment to yourself, you will only achieve.

Finally, have faith. Demand for software engineers has always outpaced supply and it looks set to remain that way for the foreseeable future. After all, there will always be problems to solve. If you decide that this is what you want to do with your life, you can’t really go wrong.