Ever since Cal Newport wrote about how I learned how to code in Deep Work by reading books and going to a bootcamp (which thousands of people do every year - I'm not special), I've been getting a few emails a week asking for more details. Most often, people ask for the specific books I read as I was preparing, or general advice on breaking into the field. Below is a representative sample. If I sent you this link to you, I hope it's helpful! If you have any further questions, please email me, and I'll use them to improve this guide.
"We greatly overestimate what we can do in one year. But we greatly underestimate what is possible for us in five years." -Peter Drucker. This guide probably would've scared the shit out of me back in 2013 when I was starting. But it's worth it! Software engineering is creative, intellectually stimulating, high-impact, flexible (you can work on almost any problem you want), more social than people realize (pair programming is great!), you can work outside or abroad, it's well compensated, and it has an unlimited skill ceiling. The last part is the best, because if you're more systematic about studying than your peers, then it's just a matter of time before you'll be so in-demand that you'll be able to dictate the terms of your employment such that your lifestyle is however you want it to be. I recommend it to most everyone that thinks they might learn to like it.
tl;dr: two steps to software mastery
Hi Jason! I've read from Cal Newport's book 'DeepWork' that you already finished reading as many as 18 books in a few weeks/months by the time you attended the notorious Dev boot camp to become a full stack programmer. Could you tell me which are those software books you were reading. I'm looking for a career change into programming, so any inputs you give would give me would surely help me here.
>>>
Hi Yasir! You can do much better than the path I took. I recommend:
- Do Hack Reactor or Lambda School
- teachyourselfcs.com
And get yourself a job at any point after 1.
Good luck 🙂
Step 1, in depth: how to become an employable web developer
I am Nirmala from Hyderabad, India and I teach programming to children, teenagers and adults who wish to make a career change to programming. I am curious about the methods that you adopted for getting into the deep focus mode, the methods that were briefly described in Cal Newport's book "DeepWork". Would it be possible for you to share the strategy that worked for you? Which language were you trying to learn? What were the books you referred and your learning methodology? Would you be able to share any link that refers to your learning methodology? The reason I am asking you is that the students , particularly the older ones are barely able to remember what was taught which makes them frustrated and slowly, the confidence and self belief ebbs away. Some students have been very successful but I would attribute their success more to their own self-motivation.
>>>
Hi Nirmala! That's incredibly cool, I love what you're doing.
The things that I thought would work for me, that I actually implemented, were to cut myself off from the Internet and try to memorize the syntax and the APIs of the languages (I figured that not having to look things up as often would make programming much faster). Memorizing languages turns out to be a nice benefit but it's not nearly as important as I thought.
The things that I didn't realize would help me at first but that turned out to help a great deal being excited and motivated by fun side projects and reading the code of other people working on similar problems.
As for barely being able to remember what you've learned -- hard for me to prescribe a solution when I'm not sure why they're having a hard time remembering. Are they moving too fast from subject to subject without exercising their fragile new knowledge? Are they not asking "why" often enough? Are they trying to memorize things they don't understand?
And my learning methodology is pretty much all from Cal Newport. So Good They Can't Ignore You changed my whole life, and I liked his earlier work about being a pro college student too. And Deep Work, obviously :)
As for the curriculum I followed, it was kind of a hodgepodge of books - I ended up memorizing Ruby with flashcards and not realizing until much later that I needed to learn JavaScript, for example 🤦♂️. Here's the approximate sequence I wish I had done instead, with the % of the time I would recommend spending on each step:
20% PYTHON
- Learn Python the Hard Way
- Bonus: Effective Python
- Project idea: Battleship in the terminal (here's mine, written April 2013! One of my first ever programs!!)
5% RELATIONAL DATABASES
- Intro to Relational Databases
- Project: install MySQL, design a relational schema, implement/seed it with raw SQL
5% STATIC SITES
- Learn to Code HTML & CSS
- Bonus: Learn to Code Advanced HTML & CSS
- Project idea: implement one or two of your favorite effects from Codrops
25% SERVER-SIDE RENDERING WEBAPPS
- the Django equivalent of the Rails Tutorial, although ideally it would be for something simpler than Django, like Flask. Don't know of a good resource.
- Project idea: build simple Reddit
20% JAVASCRIPT
- Eloquent JavaScript
- Project idea: Snake in the browser in an HTML canvas
25% CLIENT-SIDE RENDERING WEBAPPS
- Learn React, but... ugh, every tutorial also includes Webpack, ES2017, Redux, etc, etc, etc. By the time you get to this point, anything I recommend would be out of date, so just email me for recommendations.
- Project idea: any website you want!
Now you know enough to be a web developer! Your last step is to land a job, and for that you need to learn how to crush your technical interviews, and for that, there's nothing better than Bradfield's one-month course on data structures and algorithms.
Then, after a 6-12 months of work experience as a web developer:
2 YEARS COMPUTER SCIENCE
At this point you'll be good enough for an intermediate role at any job you want.
Cheers,
- Jason
Step 2, in depth: how to master software engineering
"My name is Jonathan and I am a junior developer. I am currently reading Cal Newports book and found your part to be really relatable and great. I'd like to ask some questions if you wouldnt mind answering them. As a junior developer what do you think is a priority in becoming employable asap? If you could go back in time and give advice to yourself when you were still learning programming what would it be? Lastly, what resources (books, online courses, etc.) Old or new would you deem as fundamental for any developer. I believe I pickup on things well but I still feel like I'm lacking the knowledge and understanding that CS graduates would have as I'm not doing a comp sci degree. If you cant answer them all thats fine. Any advice would be tremendous, I'm just really keen to absorb any useful information! Kind regards, Jonathan.
>>>
Hi Jonathan!
Glad you enjoyed the book. Kinda couldn't believe it when he featured me like that, I just responded to a mailing list blast and he interviewed me over Skype for an hour.
The long slow path to employability is through computer science. There are lots of junior developers with basic web development skills but very little of the foundational skills that you'll need for a long, satisfying, and stable career. Fortunately, you now have the perfect resource for getting there! Rejoice, it's teachyourselfcs.com. Give yourself 2-3 years to work though that list and you'll be golden. If you're interviewing now, then just focus on algorithms and data structures, as those will most help you during interview time. I personally found this list really fun and interesting - I finally understood all the terms and concepts that people at the office were talking about! Learning computer science after being a working programmer is like being prescribed glasses for the first time and going outside and noticing all the leaves on the trees. You just see and understand so much more.
Related: if I could go back and give myself advice, it would be to stop learning the wrong things (mostly the APIs of JavaScript frameworks, new languages, or the newest hottest trends). This was just a misunderstanding of what it means to be a good software engineer.
Oh look, I already answered #3! You're welcome. I'm always super happy to share that resource because it's just so good. If you're in SF, you should consider taking the Bradfield CS courses too, it's the same content but with other students. I've now taken 6 and they've all leveled me up as a developer. Try to get a job and persuade your employer to pay for them. Once you're done with interviewing, here's the best order to take them in:
Compilers and Mathematics for Computing are both nice-to-haves, but not nearly as critical as the above 5.
Cheers, good luck, and keep at it, this is worth it--
- Jason
Bonus! Step 3: learn machine learning!
Things I did, marked with ✨ if I recommend them or 💩 if I don't:
- ✨✨ fast.ai part 1
- ✨ fast.ai part 2
- ✨ The Deep Learning book
- Stanford's CS231n, CS224n, or CS229, whichever is relevant to you
- ✨ The homeworks for CS231n, CS224n, or CS229
- Read a bunch of academic papers
- ✨✨ Start a reading club to read a bunch of academic papers (here's a repo with my notes for 100+)
- ✨ Learn linear algebra from 3Blue1Brown
- Brush up on calculus, helpful for:
- Implement softmax, the sigmoid function, backprop, and other neural net components (critical if you want to do research)
- ✨ Implement a basic neural net, a CNN, an RNN, and a GAN
- ✨ Go to NIPS
- 💩 Andrew Ng's Coursera course
- Reimplemented a few landmark papers (also critical if you're going into research)
- ✨ Even better: Depth First Learning tutorials that align with your interests
- For ML: An Introduction to Statistical Learning
- ✨✨ Way better version of the above: Hands-On Machine Learning with Scikit-Learn and Tensorflow.
This path was a bit muddled because I didn't realize until halfway through that there are two paths in "machine learning": there's deep learning, which involves neural nets and is likely the new hotness you've been hearing all about; and then there's machine learning, AKA data science, which is decidedly less sexy but more universally useful. I learned both, and guess which one I spend all my time on at Sourceress? Data science. Don't worry, you still get to use neural nets.
tl;dr:
If your goal is computer vision, then do fast.ai 1 and 2, half of the deep learning book, and CS231n.
If your goal is AI research but you don't want to get a PhD, then do all of the above. Once you've implemented 3 important papers and can pass the Google software engineering interview then you can get a job at Google Brain as a Research Software Engineer.
If your goal is machine learning, then just do Machine Learning Engineering in 10 Weeks.