….so you want to write Software for a living

I’ve been asked numerous times over the years, usually by parents whose children want to learn, what is the best way to get into a job as a Software Engineer.

Everyone in this job has an opinion on how best to get started, blogs and forums are full of threads discussing it; the merits of this language over that one, teaching yourself versus formal training. This is my view on the subject.

Unlike other ‘professional’ disciplines like law or accountancy that have a well defined career path, the road to becoming a software engineer isn’t a road at all, it’s like navigating a maze of narrow streets in an old town. There are multiple entry and exit points to that old town and none of them are any better than any other.

To start with, you have to choose which road you want to take into town. How do you choose? I think to answer that, you first need to answer the question ‘What interests me about writing software?’ Is it creating Mobile Apps or Websites? Is it writing the software that watches and monitors the security of the internet? Is it writing the engine control software in a Formula 1 racing car? If it’s just to make lots of money then you probably need to focus on the in-demand areas like mobile apps and web services.

Lots of people who start on a road into the old town end up going in a completely different direction through the town to the one they originally wanted, there are lots and lots of decision points and crossroads, where you can change your mind or discover something new.

To help people understand how to choose, I tell them that there are 3 core areas of knowledge to being a software engineer.

  1. Language. This is the language in which you write your software; C#, Swift, Python, Java and so on. This area of knowledge is all about syntax and how you use the language to solve problems.
  2. Platform. This is where your software runs. Most of the time, your software will need to interact to some extent with it’s environment; the operating system and/or the hardware it is running on and maybe a database. This area of knowledge is about how you make your software perform these interactions. It maybe a Windows laptop, an iPhone or maybe a Linux VM running in the cloud. Writing software for each of these platforms usually (but not always) requires specific knowledge of that platform.
  3. Domain. This is what your software does. To write software that controls a nuclear power station requires knowledge of how the power station works. The same is true for banking software, games, aircraft autopilots and so on. To write software that performs a task, you need to know about the task.

There is a fourth area and that is Tools but it is not as important as the three above. This area of knowledge is about how to use the tools you need to write, test and deploy/publish your software.

Learning to be a software engineer is all about increasing your knowledge in the above areas.

There is no particular advantage to becoming a good Software Engineer between being self taught or having done some formal qualification although most employers do like to see the latter. Being self taught allows you to explore and concentrate on areas that interest you whereas a formal qualification usually gives a good grounding of what needs to happen to create reliable software. There is no substitute for hard won experience though and there are no shortcuts to success.

The interactions between knowledge in the three core areas are extremely complex. Choosing a particular language may lead to a specific domain, javascript would tend to lean to websites and web services. A specific platform may lead to a particular language; iOS would naturally lead to Swift. Other languages like Java are mainly platform agnostic and can run almost anywhere. Writing software for an automotive computer will probably be C or C++, whereas software controlling a nuclear power station will probably be written in SPARK. Several domains need multiple languages. The permutations are endless.

So the key to starting on the road to being a Software Engineer is choosing something from one of those three core areas of knowledge above. That will lead to choosing one of the roads into the old town. Once you are in the town more choices will present themselves as you move forward.

There will be failures and setbacks. Treat these as opportunities to learn. Failure is expected and necessary though obviously not all the time, learn from it and move on.

Continuing with the old town analogy, you may never emerge from the maze of streets, instead you find a corner of the town you like and end up growing your knowledge of your environment. You learn where the bumps and potholes are and which streets to avoid.

Finally, whichever way you end up going, persevere and good luck.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store