SOFTWARE ENGINEER (FULL STACK WEB DEVELOPMENT)
Follow these steps
- I recommend picking Python as your first language; it's powerful, yet simple to read and write. Go read Zed Shaw's 'Learn Python the Hard Way' and do the exercises (you won't learn just by reading, you need to type out code and run it). You will run into errors and debugging them is the best way to learn (so don't just copy and paste code). You want to be consistent in your programming schedule; try your best to program every single day. Programming for an hour a day is better than 7 hours on a weekend. When learning new concepts, it will be difficult (because humans don't naturally think like computers) and I find that there's diminishing returns on learning. If you hit a wall, go for a walk outside and get some fresh air.
- Do the Django REST Framework Tutorial. Of all the libraries you'll use for Django, DRF is very helpful for building backend APIs. You will start to understand how Application Programming Interfaces (APIs) work in getting, updating, deleting, and creating resources. Throughout your career in programming, you will run into countless APIs. Even if you decide to later go into front end dev only, knowing how APIs work will be immensely helpful.
- Your goal is to start building real projects that you care about. This is how Jobwaffle got started. If you want inspiration, check out 'Coding for Entrepreneurs' where they walk through building real projects. Okay, at this point you can build a relatively straight forward web application. Great job, you're almost there to your first job!
- This sounds backwards, but for the next few steps I recommend taking a step back to learn some computer science fundamentals. They will pay off in your career growth as a programmer. You will learn about things like 'Big O Notation', which can be explained in a few pages from Gayle Laakmann McDowell's book 'Cracking the Coding Interview'. This is also the book to go to before you start interviewing for software engineering jobs. You will learn about basic data structures (arrays, queues, stacks, linked lists, hash tables) and sorts (mergesort, quicksort, why bubble sort sucks). If you have time, glance at Trees (e.g. breadth-first search, depth-first search). Ideally you will have at least a month to look over this book before applying to your first job. Practice white boarding (writing down answers on paper and pencil while explaining your thought process on how you are tackling a problem); if this sounds painful, I assure you it is. I got wrecked on my first software engineer interview because I did not know about whiteboarding, don't let it happen to you. Go apply to jobs now. If you fail, learn whatever you failed on, then come back again.
- Now that you have a decent understanding of Linux and the ability to do bash scripts, you might want to look into ways of transforming these often used commands into fabric scripts, Ansible playbooks, Puppet files, or Chef cookbooks. The goal is to be minimize surprises in code deployment. If you get this right, you won't need to reply back "It works fine on my machine". You will catch a lot more bugs before they reach production. The less surprises on production servers, the more you can really enjoy your time away from programming.
- If/when you work on very large projects (I'm talking Uber level), the traditional web stack that I mentioned above isn't ideal. You can make it work, but it's not designed for it (relational databases now require sharding, etc). At this point, you'll need to learn about completely different tools made for stream processing. Wait what? Yep, throw out a lot of the stuff you learned. We now use new tools like built specifically for scalability and speed like Kafka, Spark, and NoSQL databases. Why might you need this and what is this solving exactly? Read Confluent's article 'Making Sense of Stream Processing' here to get an introduction.
- So after working on a large distributed system, watch this video on lessons learned from scaling Uber. You'll learn more about microservices and run into issues from fanout to too much logging.