Having moved around the IT and technology realm over the last few decades, one common challenge I've seen people face is how to get started with a particular technology and gain the experience that employers typically seek, especially those at the beginning of their careers or who wish to re-train.
What is 'experience'?
Every job role beyond entry-level asks for 'experience', but what that really means is perhaps hard to define. Having been involved in hiring processes for roles at many levels, I'd suggest that experience should be tangible (i.e. you can point to specific examples), demonstrable (i.e. you can show it to someone) and referenceable (i.e. you can talk about results or use cases).
But how do you gain experience if you're learning in your own? This is a huge challenge for those that are between jobs, returning from a career break or looking too expand skills outside of their day to day role.
Whether it be cloud services like Amazon Web Services, topics like Data Science, specific technologies like Docker or jobs like Penetration Tester I find the answer that works for me is always the same. The best approach I've come across and that kept me driving forward in my own personal development is to invent your own problem, then solve it.
It's important to be at least a little bit methodical about the process though. A lot can be learned from installing things and trying out different software and tools but that's what what I'd call 'play'. Don't get me wrong, playing with technology can also be a huge source of learning and achievement, it's how I taught myself to program in BASIC as a kid and then how to use MS-DOS, Windows, HTML (before CSS was a thing believe it or not) and Linux. The problem with play-learning is that it's ambling, overly flexible and not at all like real-life situations. Play can build deep understanding, but not necessarily hard experience.
Build Your Own Adventure
Hard experience comes from delivering a solution to a problem when there's no way back. The approach I tend to take to create my own experience has five key steps:
- Research and absorb information - this could be from internet based research, online courses or certifications if you want to take things really seriously. This part is very much like the 'play' concept and will help you find the area(s) you want to focus on based on what you enjoy, what you're good at and what your personal goals are.
- Identify (or invent!) a problem to solve - set out a clear problem statement, the situation that problem exists in, any related constraints, clear goals you'd like to reach and even a timescale you'd like to achieve it in. It's equally valuable to use real-life challenges as it is to invent your own problem to solve provided that you invent a sufficient background scenario from which your fictitious problem can be solved.
- Approach the task as if it had been handed to you by someone else - in real-life you're not usually in control of the problem, you can't usually tweak the parameters of the situation to make the solution easier. That's not to say you can't and shouldn't be flexible, that's also important but try to avoid falling into the trap of "that bit's too hard, I won't bother".
- Iterate - solving a problem in one big go is tough, and leaves less space for learning. Try to cut the problem down into smaller pieces, solve one aspect at a time and then pass back over it to improve areas that need it. One example might be to solve the fundamental problem in code or scripts, then pass back over to see how you might architect/deploy it, then look to automation, then look to monitoring and alerting.
- Publish - it's often a great driver to think about communicating your solution back out to people as you go along whether that be in the form of a blog or as simple as a social media post. This will encourage you to document your architectures, commit your code to GitHub, provide robust examples, etc. and will help people to use what you've created as part of their own learning journeys.
Putting it into practice...
To put this in context, I wanted to learn some of the fundamentals of a commercial data analytics tool. To do this I needed a high frequency, but unpredictable, data source. Generating fake data might do but analysing data that's truly random or based on a pattern never looks great, to do a good job you need data you can explore.
I did my research and found that with a Raspberry Pi and a $20 RTL-SDR TV dongle I could capture live aircraft GPS tests at rates of up to 1,000 messages per second. I first set about capturing the data, once that was achieved I figured out how to automate capture to local files then to a MySQL database.
With that in place I started looking into streaming the data up to the cloud and ended up streaming live to a Google Cloud instance and batching every minute into BigQuery. Finally, I presented everything I'd done along with a live end-to-end demo to my colleagues at work in a lunch and learn session.
The whole experience not only delivered what I wanted, but I learned a whole boatload along the way. I also found that presenting it back out forced me to really finish the job, to round the corners and polish the edges. It's definitely up there with my top personal projects, and the whole thing was carried out during the Christmas-New Year downtime so the deadline was also a great driver.
Other example past personal learning projects have included:
- A cross-platform mobile app for vegetarian travellers.
- A showreel video for fake software.
- Various different blogs, forums and websites (to learn SEO).
The opportunities are limitless. Your idea doesn't have to be new or unique, it just needs to be well thought out, have clear boundaries and motivate you to succeed.
The internet is an amazing thing, both for the people and the services it can connect you to. There are huge amounts out open source software out there, just take a look at GitHub and search for code relating to your project. This is especially helpful for solutions architects and sysadmins since you may not want to develop your own solution from scratch. I myself am not a developer but I'm reasonably good at taking other people's code and adapting it to my needs.
The challenge with Open Source however is that in the commercial world you often need experience of commercial tools. Luckily, most commercial vendors are coming round to realising that free versions boost adoption. Here's some key resources I think that will really help kick-start you for little or no cost:
- Amazon Web Services - with a new account you get a great Free Tier that lasts for 12 months and covers most services.
- IBM Cloud - there are amazing free training resources and the cloud platform has a generous perpetually free tier called the 'Lite' plan. If you register as a partner there's a ton of great content there too.
- Google Cloud - $300 of free credit and a selection of services also have a perpetually free tier.
- Azure - more of a mixed bag in this regard but there are free aspects.
- Microsoft provide some of their software like SQL Server for free versions or the Evaluation Center provides evaluation versions.
- Oracle - also provide tonnes of resource and evaluation version of their software through the Oracle Technology Network, giving you the ability to install and play with a wide range of enterprise software.
Virtualisation tools allow you to run software and operating systems in a virtual environment on your PC. This allows you to setup, teardown, snapshot and rollback changes without messing up your day to day usage of the PC.
- Virtual Box - free from Oracle this is probably the most useful platform independent solution.
- Hyper-V - comes with some versions of Windows and is a great tool.
- Windows Subsystem for Linux - recent versions of Windows come with an embedded Linux kernel and the ability to install and run Linux software within it.
Clearly Linux falls into the Open Source group but it's so fundamental and prevalent that I can't not mention it. There are dozens of distributions to try but if you're new I'd stick to Ubuntu. It's probably the most popular which means that there's a lot more Google-able help out there. Otherwise, try Centos as it's popular in enterprise.
Whatever you do though, if you want to learn Linux, forget about the GUI and just use the command line. The best way to get Linux experience is through the cloud platforms and virtualization tools listed above, I wouldn't recommend installing Linux directly on your machine if you're new to it.
Another option is the Raspberry Pi, a tiny computer with versions ranging in cost from $10 up to $60. It runs Linux and is ideal for personal projects because you can treat it like a tiny little server.
With a little bit of planning and clear goals, you can conceive of your very own personal project and use it to drive you towards implementing what you've learned. Making it referenceable or at least making sure you've got something to show means that you can present your results to potential employers as true experience. There's a lot to be said for a candidate that's shown the drive and the discipline to learn and implement solutions on their own.
Good luck to anyone embarking on such personal projects, if you ever need a sounding board for an idea or suggestions for resources I could add above, feel free to get in touch.