Learning to Code
Edit: Previously coding bootcamps claimed that 90 something percent of graduates get jobs within 3 months of graduating. These claims seem to have been dishonest, or intentionally misleading. In reality, only about 30–40% of graduates get full time jobs within 3 months of graduating, and about 70% get jobs within 6 months of graduating. https://cirr.org/ is an organization that has been founded to provide honest data about bootcamp graduate job placement stuff. Given that all of the bootcamps either lied or mislead people in the past, for years, I have to assume that their credibility is low. Also see:
I started teaching myself to code a little over a year ago and am now working as a web developer. I’ve been asked for advice a few times. I’m writing this:
- For self-reflection. I like to reflect and I want to write down my thoughts before I forget them (the time separating me from the start of this journey is quickly expanding).
- So I don’t have to repeat myself/can refer people to a curated version of the best advice I have to offer.
I’m 22 years old right now and about a year removed from college. My journey started midway through sophomore year of college.
But really, it started senior year of high school when I started my larger journey of figuring out what I want to do.
Actually, it started in middle school when I became ambitious. Eh, we’ll start with high school.
Long Term Thinking
As a senior in high school, I realized that I had some big decisions to make. What college do I want to go to? What career do I want to pursue? (I saw these as questions that are related.) Given that college was a 4-year time commitment and that it was bound to involve a lot of formative experiences, I saw it as an important decision. And given that I would probably spend about 80,000 hours throughout my life working in whatever career I end up in, I also saw that as an important decision as well. Given the importance of these decisions, I did what seemed to me like an incredibly obvious thing: spend all my time researching and optimizing them. The time you spend optimizing a decision should be proportionate to how important the decision is. I saw these decisions as incredibly important, and so I spent a ton of time trying to optimize them.
I spent senior year of high school doing a lot of reading about stuff with the intent of figuring out what I was interested in. I started off with a breadth-first search and progressively started spending more time on depth and less on breadth. But it was still mostly breadth-based until some point during freshman year of college.
At some point during freshman year of college, the top tier of career choices settled in at:
- Academic research.
Figuring It Out
At that point the second tier was pretty far away. And within the first tier, academic research was starting to pull away from entrepreneurship. Towards the end of freshman year, the summer after, and the beginning of sophomore year, I was pretty focused on academic research, and was pretty sure I wanted to do something in the sciences, but possibly philosophy also. I liked economics, physics and neuroscience. I eventually declared as a neuroscience major, but was still open to the possibility that I might want to head in a different direction.
The thinking with academic research was that it was interesting and that I could have a big impact by solving the world’s unsolved puzzles. I didn’t want to be some guy writing grant proposals and doing incremental research, I wanted to be making breakthroughs and thinking about big questions.
Unfortunately, I started to realize that that wasn’t going to happen. Or at least that it’d involve a lot of jumping through hoops. I volunteered in a neuroscience lab throughout sophomore year. We studied vision by recording from the brains of monkeys while having them perform some sort of visual task. It was really cool to see what real research was like, but I soon learned how slow and incremental it is. In our lab, an experiment often would take as long as a year. You have to:
- Train the monkey to behave somewhat reasonably.
- Give it chamber surgery (aka drill a hole in its head) and wait however many weeks/months for it to recover.
- Train the monkey to perform really simple visual tasks (focus on this dot, and we’ll give you a treat).
- Train the monkey to do slightly more difficult visual tasks (focus on this dot, and when the dot disappears, look up and to the right).
- Train the monkey to do slightly more difficult visual tasks (this process could take a while, depending on the difficulty).
- Start trying to find neurons to record from. Map them out and stuff.
- Record from neurons while having the monkey performing the visual task.
- Write up a paper, go through a bunch of back and forth with revisions and other bureaucratic stuff.
- Finally at the end of all of this… you publish a paper! Humanity’s cumulative understanding of how the world works has now been moved one step forward :)
But seriously, my concern wasn’t impulsive. I did my due diligence into what academic research was really like, and I didn’t like what I saw. If I wanted to answer big questions, I could do it, but it’d take a lot of time going through graduate school and gaining recognition as a researcher before I’d be given the autonomy and resources I’d need to make real progress.
This realization had been pushing me away from academic research, but I had another realization that would end up pulling me — no, YANKING me away from academic research.
There’s this thing called a startup.
Previously, I had a concept of what entrepreneurship was, but my understanding of it was outdated by maybe 10–20 years. I wasn’t aware of what startups were like in today’s world. After reading How to Start a Startup by Paul Graham, I was enlightened. He explained how it works in such a way that the abstract became concrete. It was no longer mysterious and I felt a strong feeling of “I could do this”.
One big reason why startups interested me was because I could make a lot of money in a relatively short amount of time doing them. No, I’m not greedy or materialistic. I saw the money as a means to an end, with the end being “make a dent in the world”.
- Making enough money would solve The Money Problem for me. The Money Problem is that normally you have to spend over half of your waking life working for someone else and that this doesn’t provide you with enough time to pursue a lot of things that you’re passionate about. By making enough money, I could free up over half of my waking hours to work towards my goal. That’s huge.
- More importantly, it’d provide me with power. I was realizing that in order to really make a dent in the world, I’d have to acquire power first. Ie. I could work hard and take 15 years to become a professor who takes a year to move an inch forward… or I could start a startup, make millions of dollars, and have orders of magnitude times larger an impact.
And so it was decided — startups were now my thing. The top tier of potential careers would now be:
- Startups -> do something big.
- Academic research.
And it didn’t take long for startups to move up into a tier of its own. After a little bit more time, I decided that this was what I wanted to do. I wasn’t sure what I’d do afterwards, but I knew I’d need “fuel” to do it, and so step 1 in my life plan became “acquire fuel”.
The summer after sophomore year, I knew I wanted to learn to code, but I didn’t really know how to do it. I pretty much just googled around for answers to that question, and I didn’t get good results. I ended up on http://html.net/ and spent a good deal of time there. Bad mistake. It was a terrible resource. And because I had no guidance, I spent a lot of time with similarly terrible resources.
I would also get stuck a lot. I had taken an Intro to Programming with Java class during my freshman year of college, but programming really hadn’t “clicked” for me. This is a sad fact, but after the class was over, I still had no understanding of how code could translate into something like a website or an app that people use. All I had done were really simple command line programs. I figured that to make a website, you’d have to manipulate things pixel-by-pixel or something. I assumed that there were some functions to make this a bit easier, but ultimately doing things pixel-by-pixel seemed like it’d be way too slow to be interesting to me. I hadn’t been taught the true power of abstraction.
Other than this class, I had no programming experience. So I would run into problems, and I would try to solve them, but I’d fail. I’d be stuck for hours/weeks/days/forever. I’d try to figure it out myself, but I’d fail to do so. It reminds me of those single player video games that you get stuck on and just can’t progress.
Overall, that summer didn’t go so well. I was taking some summer classes, but other than that I was completely focused on learning to code. And I did work very hard. My days would involve going to class, eating, exercising, and learning to code. Sometimes I’d watch a basketball game, play pickup basketball, or watch an episode of Curb Your Enthusiasm, but my breaks were limited, and they were never longer than 3 hours or so. Actually, I decided to take 2–3 days off at one point because I was getting overwhelmed, but that was the only extended break I had taken.
I also had this idea for a startup that I wanted to do. The idea was that student reviews of colleges are really broad right now. They address questions like, “What are the academics like?”. I thought it’d be cool if there was a site that addressed a bunch of really specific questions like, “What are the professors in the neuroscience department like?” and “Are there good pick up soccer games?”. I went into the summer with the goal of learning to code, but I was hoping that I’d learn enough to maybe get this website off the ground.
Funny story — I had no clue what I was doing. I knew that I needed a page for each college… so I decided to create 300 HTML files — one for each college. And I knew that I wanted each college page to have data (tuition, size, average SAT scores…), but I didn’t know how to do this other than by manually entering the data as markup in each HTML file. So that’s what I did. If you’re a semi-competent web developer, you’re cringing right now.
Anyway, that summer didn’t work out so well. The following year I was in a good social situation, and I decided to spend the year taking advantage of that. I reasoned that college was an extremely unique opportunity to be social, and that it wouldn’t be the worst thing in the world if my ambitions were delayed by a year. So my priority that year was socializing.
Two things to note about that year:
- I couldn’t quite separate myself from startups and coding. I felt guilty for now working towards my ambitions, and so I tried to spend time manually entering data into my 300 HTML files. I spent a lot of time sitting in the lounge with my friends entering data while hanging out or watching a movie.
- I did a little experiment that I really wish I had done earlier — I stopped looking at my grades. I had been doing nicely in school throughout my first three semesters, but after semester three when I decided that startups were my thing, I completely stopped caring about school. I ended up graduating with a 3.03 GPA, so I did alright overall, but I did as little work as possible. Anyway, the not looking at my grades thing was fun. I reasoned that it didn’t really matter as long as I passed, that I wasn’t in danger of failing, and that it had the benefit of helping me to not care. I think I ended up with a GPA in the high 2's throughout that time.
Once my junior year of fun ended, things got real. It was time for me to really learn to code, and to start that website. The previous year I had gotten some more programming experience in school. I took Intermediate Programming with Java, Data Structures, and Web Languages.
I didn’t really gain much from the two Java classes. I hadn’t internalized the lessons that were taught, although I did do decently on the tests (I think I got B’s in these classes).
Brief tangent: I took this Digital Media class my senior year, during which we did some HTML and CSS (we also learned some photoshop, basics of photography, video, and some other less practical and more pretentious stuff). The instructor was an english grad student. When we were learning CSS, she instructed us to give all of our HTML elements classes:
and to use CSS selectors like this:
I mentioned that element selectors were a thing, but she assured me that she knew what she was doing and that this had been working for her for years.
Anyway… the summer after sophomore year, I started to learn Ruby on Rails with the intention of finishing my website by the end of the summer. It didn’t go so well, but it went better than the last summer. I ended up learning enough to get the website up. I spent a lot of time going through Michael Hartl’s tutorial. A lot of time. I think I went through it like 4 or 5 times. I also spent a lot of time just stuck for inordinate amounts of time on random little things. The outcome was that a) I worked very hard, b) I didn’t make a lot of progress as far as learning goes, and c) I ended up making enough progress to get the website up.
I’d absolutely consider myself to be incompetent at that point.
- Remember last year when I manually entered data into my HTML files? I was so naive. This summer I knew enough to spend 8 weeks entering the data into a seed.rb file -> run some code that someone on Stack Overflow gave me that seeded my database with this data -> use Rails to query the database and create views with the corresponding data I wanted. How efficient! (sarcasm)
- I spent a ton of time begging for help on Stack Overflow and calling Rails Hotline hoping they’d pick up.
- I didn’t know nearly enough to implement my own commenting system, so my whole website used Disqus.
- I also understood the gist of what events were. I definitely didn’t understand the event loop though. I knew that I could listen for random events like keypresses and mouse movements, but I didn’t really see why I’d ever want to listen for anything other than a click, or why I’d ever need to utilize event bubbling. So I never bothered to learn how this stuff worked.
One thing I should mention is that I was in a big rush. I was so excited about this startup I was going to do that I figured that there was a good chance I’d start getting traction in 2–3 months, and that all I had to do was get a sufficient version of the site up an running before handing off the code to someone else. So my objective wasn’t really to be the best coder I could be, but to move towards my long term goals as fast as possible, and I envisioned:
- Getting the site up.
- Getting traction.
- Raising money.
- Hiring people to do the coding.
- Making millions, and never having to code things myself again.
That didn’t happen.
I ended up spending the year screwing around with code, not really knowing what I was doing, and failing with the startup.
My startup failed the summer after my senior year of college. Once I accepted that it was over, my goal became:
Get good at programming. Teach yourself, get a job, save up money, and learn more by working for 2 years or so. Once you’re sufficiently good, you can afford to take another stab at a startup because if you fail, you’ll be able to get a high paying programming job to pay the bills. And obviously, the programming skills will help when doing a startup.
I had the impression that there were a lot of self-taught programmers, and that since I was smart, I’d be able to do what they did — become a good programmer by self-education. I failed at this.
I was still getting hung up on these tricky bugs that I couldn’t figure out. If I had someone to help me, they could have cut the time it takes to figure this stuff out from hours/days/weeks to minutes. But I didn’t and I still struggled a lot. I did make notably more progress than I had been previously though (the way I see it, the larger your “knowledge foundation” is, the more “knowledge nodes” you have to work with, and the faster you can learn; I think that this has a lot to do with my increased efficiency of learning). I went through basically every resource I could find, and I studied hard.
These are the resources I (at some point) used (that may or may not be good; advice on which ones you should use comes later on):
- Code Academy
- Rails Casts
- Agile Web Development with Rails 4
- The Well Grounded Rubyist
- But How Do It Know?
- Try Git
- Git Immersion
- Ruby Monk
- Intro to Databases
- SQL Zoo
- Rails Apps
- The Odin Project
- A bunch of random blogs and tutorials and less formal resources.
- A bunch of stuff that I can’t remember or find.
I also spent a good deal of time trying to learn design as well. Here are some of the resources I used (I’d recommend all of them):
- Butterick’s Practical Typography
- Signal v. Noise
- Hack Design
- The Visual Display of Quantitative Information
- Don’t Make Me Think
- The Design of Everyday Things
- You Can Draw in 30 Days
Failing To Be Truly Self Taught
Being self-taught was sort of a sense of pride for me. Or really, not being capable of being self taught would be a sense of anti-pride. I had the impression that tons of others were self taught, and that if I can’t do what they did, I’m not that smart.
But ultimately, there was a point that summer where I knew I wasn’t making enough progress. I recognized that at the pace I was going, I wouldn’t get a job any time soon. And I certainly wouldn’t be moving towards my long term goal as fast as I’d like to be.
This wasn’t a particularly great time for me. I was planning on being in Silicon Valley tearing it up with my startup by this point. Instead, I was living at home after college with no real career prospects at all. I didn’t have any marketable skills (I had a neuroscience degree, but that’s only useful if I wanted to go to grad school; the only actual job it’d get me would be a lab technician, which is essentially minimum wage manual labor). And my mom wasn’t buying this “sit at home and learn to code” thing. She told me I had till the end of the summer, but after that I’d need to get a job, or at least make some real progress towards getting one.
Realizing that I was failing, I recalled this post on Hacker News I saw one time about something called Hacker School (now Recurse Center). It seemed like it’d be good for me. Actually, it seemed like it’d be great for me. They wanted people who were genuinely curious about how things works and eager to learn. That’s TOTALLY me! So I applied. But I got rejected. Back to square one. What am I going to do? I tried learning to code on my own and it’s not working. I applied to Hacker School, but didn’t get in. I’m not going back to school-school. I hate school-school.
Fortunately, I started googling around for things similar to Hacker School and came across this wonderful little thing called a coding bootcamp. Basically, it’s a fast-paced crash course in web development where almost all grads get solid jobs that is ~12 weeks and ~$12k. It turns out that there are tons of these things across the country. Especially in NYC, and I lived on Long Island. So I started doing research into them, and I concluded that they’d be good for me. I was impressed with the job placement rates, and as for learning to code, I didn’t really have any other options. My mom was on board (reluctantly), so I started applying.
I wrote about my impressions and why I ultimately chose Fullstack here.
Did I Fail?
Since accepting that I failed, I’ve been doing a bit of informal research as to how “self-taught” programmers did what they did. In talking to the people I’ve talked to, I haven’t met anyone who I’d consider to be truly self-taught. I don’t know anyone who didn’t receive any guidance.
Some people I talked to had friends who programmed. Or an older brother. Or a parent. Or had some sort of academic guidance. Whatever it is, they had someone to guide them and someone to turn to when they were stuck.
Also, most of these self-taught programmers have been doing it since they were kids. I haven’t met anyone who just buckled down and became a great programmer in under a year with no guidance at all.
So it turns out that I wasn’t as big a failure as I had thought, but I’m still disappointed in myself. I have high expectations.
In September of 2014, four months removed from college, I started Fullstack Academy, a coding bootcamp in NYC. I went in with a very solid background, given how much self-education I had done at that point.
My experience at Fullstack was sort of a mix between “a continuation of the struggle” and “getting a significant boost from some much needed guidance”. Some thoughts:
- Ultimately, Fullstack worked out well for me. I made a lot of progress, and I got a job soon afterwards.
- Having people to turn to when you’re stuck sometimes cuts the time it takes to get unstuck from hours/days/whatever to minutes.
- But this wasn’t always the case. In theory I think it should be, but in practice it just didn’t always happen. Sometimes I didn’t get the attention I needed to get my questions answered. Sometimes they didn’t know the answer to my questions. I don’t know why else, but it just wasn’t always the case.
- It was really cool to talk to people in real life about coding. Before doing Fullstack, I had never actually had a conversation about coding in real life because I never met anyone who coded (I guess I did in the couple college classes I took, but that was different). Now I was surrounded by cool people who went through the same struggles I did in trying to learn to code. That was really cool. Much cooler than I expected it to be.
I guess this is the point where I review Fullstack. I’ve been asked what my thoughts are many times by people interested in doing a coding bootcamp, so here they are.
First, here’s how the program works:
- As for what technologies they teach, it’s focused around the MEAN stack, but they also provide a survey of fundamental things like jQuery, CSS, RegEx, SQL, algorithms etc. See their website for more.
- Once you’re admitted, you go through something called Foundations. Foundations is a four weeks long. Each week you’re given links to tutorials to go through, and you’re given a project to complete. There’s also an instructor who has weekly office hours that you can sign up for. That’s pretty much it. The idea is to prepare you for Fullstack.
- EDIT: My friend was recently admitted and he informed me that they now require a $2,000 downpayment to start Foundations. If they don’t think you’re ready by the end of Foundations, you don’t get to do Fullstack, and you don’t get your $2,000 back. If I didn’t know the people at Fullstack, I’d find this to be extremely sketchy. But because I know them and think they’re good people, I only find this to be mildly sketchy.
- The first 6 weeks, you have lectures and workshops. Lectures are maybe 2–3 hours a day, and the remainder is a workshop. During workshops, you get paired with another student who you pair program with. You’re mostly left alone, but if you have a question, you could submit a help ticket and someone will come help you.
- Then there’s a week where you get to review everything you learned. This week you don’t have access to instructors, but you can come in to the building. About half the students stayed home, and half came in.
- The last six weeks are for personal and group projects. The first two are a personal project, last four are a group project. During this time you’re mostly left on your own, but again, you could submit help tickets and someone will come help you. There’s also a few little interview prep things. The “CTO Program” consisted of maybe a sum total of 4 hours (2–3 lectures + mini-exercises), and is thus not noteworthy.
- At the end, there’s a hiring day where a bunch of companies come, you present your group projects to them, and then you do a little speed dating thing where you talk to each company for 5 minutes or so. The last week there’s this nice lady named Shanna who tells you how to follow the conventions and do the right things when it comes to resumes and job applications. She’s there for you as a resource basically indefinitely after you graduate. Most of what she has to say seems like common sense to me though.
- In Q7 of the FAQs, they say that the program is 21 weeks long. I definitely would not think about it that way. The amount of guidance you get during Foundations and “Flight” (not really a thing) is essentially negligible. Plus, you don’t have access to staff during review week, so it’s more like 12 weeks in total.
The people there are awesome. Fullstack really seems to select for interesting/cool people, and I guess they have the luxury of doing that given how selective it is.
Possibly my favorite part of Fullstack was something called Hot Seats. Every Friday after the day is over, a group of students in the junior class (they have two classes running simultaneously, offset by 6 weeks) will go up in front of everyone and basically do a real life AMA. I really enjoyed getting to know everyone and hearing their stories. I think these Hot Seats made for a much more connected atmosphere. I liked them so much that I even was a creep and sat in on the junior classes Hot Seats when I was a senior haha.
People are pretty social and friendly. It isn’t like college where there were many deep and lasting friendships being made, but people are definitely pretty friendly with each other throughout the time there. People would always get lunch together, and coffee, and sometimes drinks afterwards/on weekends.
People work relatively hard, but it isn’t crazy. They put in their 9–6:30 hours. Some stay late sometimes, but it isn’t too prevalent. And most people don’t come in on weekends. I wouldn’t describe the atmosphere throughout the day as intense. People do their work, but they also do their fair share of “water cooler chat”.
When I was there, there were the two cofounders, 2/3 instructors, and 5–6 fellows for two classes of ~15 students. The cofounders are both fantastic programmers who seem to know everything about everything. The instructors are guys in their early twenties who are good programmers, but they aren’t senior engineers who know all the ins and outs of the technologies that are taught. The fellows are recent graduates of Fullstack who stay on as fellows.
It’s really very analogous to college. The cofounders are like professors, the instructors are like grad students, and the fellows are like undergraduate teaching assistants (who recently did well in the class and are hanging around the following semester to help out).
My opinion of the staff is basically that they’re great for what they are. As far as “professors” go, David and Nimit are great. As far as “grad students” go, Zeke and Omri are fantastic. And as far as “teaching assistants” go, the fellows are great.
But as students, you hardly get to spend any time with the “professors” — they’re busy doing important stuff. When I was there, they taught some lectures, but weren’t around for questions too much. And since I’ve been there, Fullstack has grown a lot and they’ve been doing a lot more delegating. The “grad students” are great for what they are — really smart people, great guys, and empathetic educators. But they aren’t “professors”. They aren’t senior engineers with the corresponding wisdom to impart, and they aren’t trained educators. They’re winging it. And again, the “teaching assistants” are nice, smart, and helpful… but they’re teaching assistants.
If you couldn’t tell by now, I personally see room for improvement. You spend about 70% of your time with the “teaching assistants”, 29% with the “graduate students”, and 1% with the “professors”. I’d like to see a bootcamp that has much better ratios. And I’d like to see staff who are all a) trained educators and b) experts in the material that is being taught. My understanding is that this doesn’t yet exist and that all the other bootcamps have a similar structure to Fullstack.
The lectures and workshops are similar to the quality of the instructors. Actually, I’d say that they’re moderately worse. Most are solid, but some of them had just been thrown together at the last minute and were bad. Again, there are a lot of parallels to college. The lectures in college aren’t given hours and hours of thought and iteration, put together by a team of experts, utilizing the state-of-the-art knowledge that educational psychology has to offer. They’re put together by professors and graduate students who are largely winging it, and Fullstack is no different. Again, I see room for improvement (at Fullstack, and throughout the whole educational system!). But as far as bootcamps go, they all are of similar quality, and my impression is that Fullstack is nothing out of the ordinary as far as the “lectures and workshops” part goes.
Like I mentioned, the workshops involved pairing, which I found to be a bad idea.
- Pairing is something that takes a lot of skill and empathy, and new programmers are bound to be bad at it. I thought a lot of my partners were bad at pairing. Particularly when they’d proceed without first checking if their partner understood the last thing they did and is up to speed. When this happens, it’s easy for a negative feedback loop to occur and cause the person to get completely lost.
- When you’re learning something for the first time, I think it’s important to get the experience of writing the code yourself. Being a navigator, you’re going to miss out on a lot of details, but focus on the big picture. This works when you’re an experienced developer on a real project, but when you’re learning something literally for the first time, those details are really really important, and it’s harmful to you when you miss out on them.
I’m a big fan of the flipped class, where time is the variable and mastery is held constant:
You study until you’ve mastered something, and then you move on. The alternative is to study for a certain amount of time, and when the time is up, regardless of how much you’ve learned, you have to move on. Ex. “this week we’re learning about Express, and then we’ll be moving on to Mongo”. This is the way that Fullstack is structured, and I think it should be the opposite. I think mastery should be held constant. Ex. “you learn about Express until you’re comfortable with it, and then you’ll move on to Mongo”.
More generally, I think that Fullstack and all the other bootcamps try to cram way too much material into such a short period of time. Similar to my point above, since mastery is variable and the time constant is so small, students end up with a lot of gaps in their understanding. I would structure the program to be longer and more expensive, but I think the marginal value (of more learning) would be well worth the marginal costs (of increased tuition).
During the second half project phase… you sort of end up not getting that much value from actually being there. In fact, a lot of people stopped coming in during the project phase in the class before me, and Fullstack explicitly asked our class to come in and work from the building. I’d have expected Y Combinator trained entrepreneurs to do a better job of “talking and listening to the customer” (the fact that the previous class stopped coming in should have been a sign that the value-add was low, and that things should change). During the second half, the instructors/fellows are often busy with the junior class’s lectures and workshops, and don’t spend as much time with the senior class. In practice, seniors often spend at least 90% of their day coding amongst each other and not really getting any value from the Fullstack staff. I thought that this whole second half had really reduced the value-add of Fullstack as a whole. But again, my understanding is that all the other Bootcamps work the same way (second half project phase where you’re largely on your own).
This all may have sounded a bit harsh. I’m an opinionated person, especially when it comes to education. But I want to end by reiterating that I found there to be a lot of value in the one-on-one attention I did receive. And oh yeah — there’s also a lot of value in having your classmates around to talk to! A lot of value; they’re also resources who could answer your questions.
But at the end of the day, if you’re someone who’s learning to code, my recommendation to you is to receive guidance from someone. It’s important that you have a resource who could cut those hour/day/week long problems to minute-long problems. The only real resource I know of that does that are coding bootcamps, so in practice, I recommend doing a coding bootcamp. And as far as coding bootcamps go, my understanding is that they all work pretty much the same way as Fullstack, and I definitely think that Fullstack is very solid for what it is. So at the end of the day, if you’re learning to code, I’d recommend applying to Fullstack.
I’ve been asked about jobs a lot. I don’t really have much to say. The statistic that they publish is self-explanatory. I think it’s that 97% of graduates get jobs within 3 months of graduation. If you have any more data-related questions, you could just ask them and I’m sure that they’ll tell you.
Personally, I got a job about a month after graduating as a junior web developer at Mobiquity in Gainesville, Florida making $60k/year (wages are lower in places like Gainesville; I’m very happy with my standard of living). My understanding is that bootcamp graduates in cities like NY make $70–80k, and a bit more in SF.
But this paints a misleading picture. I got lucky; my current company actually found me on LinkedIn and recruited me. I was at the later stages with a few companies at the time, but had no actual offers at that point. I had applied to tons and tons of places, but the majority ignored me, and the remainder mostly rejected me. I heard similar stories from the other graduates.
The thing to understand is that you won’t have much leverage in the job market as a graduate. Let me say that again — you won’t have much leverage in the job market as a graduate. I feel like the bootcamps push this narrative that you’ll be this “professional web developer in X weeks” and that the market is hot and that you’ll be in demand and making a lot of money. That’s not how it works. From what I understand, from what I gather from talking to people, and from what my personal experiences tell me, junior developers don’t have much leverage, and at that level, jobs are a numbers game. You apply to a lot, expect to get rejected most of the time, but also expect that you’ll get lucky with a handful of places. It works similarly on the other end too actually — employers get tons of applications and don’t spend much time on any given application. Anyway, the numbers don’t lie — 97% get jobs within 3 months. But companies won’t come drooling over you. You’ll have to apply to a lot of places, you’ll have to spend time polishing and growing your skills, and you’ll have to build your portfolio up some more. At the end of the day, you should expect it to eventually work out, but don’t expect it to be easy.
I should note that I thought our Hiring Day was pretty bad. A lot of the companies there were looking for senior engineers. Some of the companies didn’t even have any developers and were looking for someone to lead development for their project. To me, it’s pretty clear that bootcamp graduates aren’t qualified for that (wayyyyy too inexperienced). I think some people might disagree with me, but I don’t really understand how. Ultimately, there weren’t any/many companies at the hiring day who meet the criteria for me to consider them as good fits for graduates:
- Provide good mentorship.
- Challenge you enough, but don’t throw you completely into the deep end.
- Provide interesting projects with modern technologies.
- Have a culture that cares about quality and best practices, and doesn’t get caught up in short term thinking.
Unfortunately, 1+2+3+4 is really hard to find (trust me — I looked!). I recall there being 15–20 companies at our Hiring Day, so perhaps this was just a bad batch. I could see the quality of Hiring Day being pretty variable. I don’t see the companies at past Hiring Days listed on the website. This would be something I’d ask of any bootcamps you’re interested in.
If you’re looking for advice on other bootcamps, I don’t really have it. When I was applying, I put a lot of research into it and they all seemed to be pretty much the same. Given what I saw, I suspect that Fullstack is one of the best ones. But if I were applying again, here’s what I’d do differently:
- Look into the experience levels of all the instructors, and look at the staff-student ratios to estimate how much personal attention you’ll get. Note that you’ll have to look into what the responsibilities of the staff are; a staff member who doesn’t spend their time helping students shouldn’t count towards this staff-student ratio.
- Get all the data I could on the companies that hired (recent) graduates, and which ones attended hiring day.
- Some of the bootcamps are 9 weeks long, some 12. Note that 12 is 33% larger than 9. That’s a lot.
- I know I said that they cram too much information into too short a period of time, but I like that I learned the MEAN stack. Or really, I like that I learned a front end framework (Angular). A lot of the bootcamps just teach jQuery on the front end (and Rails on the back).
- I’d ask for detailed information on the curriculums. Trust me, there aren’t any secret sauces. My understanding is that bootcamps are afraid that their secrets will get out if they publish them, but I don’t buy that that’s a legitimate fear.
- A note on money: a lot of people talk about how bootcamps are so expensive. The way I see it, that isn’t the right question (how expensive it is). The right question is what the value is. If it cost $100k, but somehow got you a job afterwards making $2M/year, it’d be worth it for you to get a loan and attend. To me, it seems like a fantastic investment (especially compared to college!). Your opportunity cost is low, because learning to program by yourself is incredibly hard and you probably won’t find another way to get good guidance. And the job placement rates and average salaries are fantastic. That said, I can imagine that some people are in tricky financial situations and that things are different for them.
- Another note on the difference in price between coding bootcamps. Firstly, from what I understand, most bootcamps charge roughly the same amount. But there are also bootcamps like Dev Mountain that are only ~$9,000 and include housing! I’m not sure what to think here. On one hand I feel very confident that the quality of the education is worth way more than the couple thousand dollars you’ll save. But on the other hand, this reminds me of college where you pretty much get the same thing wherever you go, and so maybe it is worth it to go with the cheaper option. Honestly, I really don’t know what to think here. Given how difficult it is to know what kind of quality you’re getting, my advice would be: if money’s tough, go with the cheaper option; otherwise, go with the option you think is better academically (note that more expensive definitely doesn’t mean better academically!).
- There are also online bootcamps like Viking Code School. It’s hard to say, but my guess is that the main things that matter are a) how much personal attention you’ll get, and b) the quality of the instruction you get (not online vs. in person). I’ve been programming for a while now and can recall many times I’ve gotten fantastic help on Stack Overflow and Slack (online), so I definitely think that it’s possible for online to work. That said, I also think it’s a downside. I’d guess that being online should take ~10 percentage points off a bootcamp’s “academic score”. So if Bootcamp A has an “academic score” of 120, but Bootcamp B has an “academic score” of 200 but is online, B’s score would be translated to 180 and would end up being higher than A’s score.
- An interesting alternative to a bootcamp would be to pay a tutor. Rough calculation on how much I was paying per hour at Fullstack:
$12000 / 12 weeks / 5 days-per-week / 10 hours-per-day = $20/hour
- I’m not sure what I think of the approach. It definitely seems like a higher risk — you know you’re getting something solid with a bootcamp. If you want to seriously think through the tutor thing talk to me and I’ll brainstorm with you. Or maybe I’ll edit the article with more thoughts.
One final option to address: school-school. You could get a bachelors or masters degree in CS. The usefulness of the things you’ll learn is debatable, but I’d like to first talk about something that I see as less debatable. In going to school-school, you’ll take… 2–6 years and pay tens or hundreds of thousands of dollars. Alternatively, you could:
- Spend a few weeks/months teaching yourself (for free) in preparation for a coding bootcamp.
- Spend $10–20k on a coding bootcamp and leave with marketable skills.
- Get a job soon afterwards.
- Once you’re employed, making money, and in possession of marketable skills, you could use the abundance of free material online to learn some of the things you would have learnt in college.
To me, the latter approach seems way better.
- I’ll talk more about this later, but I see the 80/20 principle as one of the most important career and life ideas to understand. Low hanging fruit exists. Often times, you get a lot of reward for a little effort at first, and then diminishing returns set in. Regarding the things you’d learn in college, I see the usefulness as having large diminishing returns. Especially if you’re focusing on the web.
- It’s so much cheaper! And you get to enjoy quicker wins (learning useful and marketable skills, getting a job, making money…)! I’m not saying that you shouldn’t learn fundamental CS stuff. Just that if you want to learn it, why pay so much money to a university? There are so many MOOCs and free/cheap resources available right now that the value of a degree just seems extremely low. Especially in this industry where talk is cheap and you have to demonstrate your skills via your portfolio and experience.
I’d like to note that at my job, I was hired with seven other people. Two of them have masters degrees in CS. One has a bachelors in CS. Two of them don’t even have high school degrees. And I think another one doesn’t have a college degree. But at the end of the day, we all are rather similar in our abilities as web developers.
As for the usefulness of the things you’d learn in college… unfortunately, I don’t really feel qualified to talk about this because I didn’t do it. I will say that there is a decent amount of disagreement amongst qualified people, so it isn’t like there’s a clear cut answer.
Personally, my impression is that as a web developer, knowledge of things like computer architecture, assembly, C, compilers, OS’s etc. isn’t too useful. I find that being clueless about what goes on down there will bite you in the butt every so often. So I think that it’s worth it to learn the basics. I also get the impression that understanding more than the basics does help one’s ability to think about software… but at the same time, it certainly isn’t necessary. There are tons of examples of phenomenal web developers who don’t know more than the basics of what goes on down there. I should also note that I personally have a strong bias towards wanting to understand everything from first principles, so my deviation from this should carry that much extra weight.
And now it’s time for me to give advice to someone learning to code.
- You’ll have to be self-motivated. Formal academics are way behind modern web technologies, so you’ll have to do a lot of self-learning. You can’t really go to school for this. And you won’t have any tests or deadlines to put pressure on you — you’ll have to have the internal drive to keep learning and getting better. Even if you do a bootcamp, you’ll still have to have done a good amount of self-education before hand, and you’ll certainly have to do a ton of self-education afterwards (if you want to be more than mediocre).
- Embrace the state of “I don’t know what I’m doing”. You’ll be spending a lot of time learning new things and doing new things, and during that time you’ll feel like you don’t know what you’re doing. The tech industry is famous for producing imposter syndrome. Even I feel some sort of variation of it (and I think very highly of myself). All I can say is that it’s better than being stagnant. When you feel “I don’t know what I’m doing”, at least it means you’re being pushed to learn something new (as opposed to doing the same thing every day that you’re already good at, but that isn’t teaching you anything). With that said, it also isn’t good to be pushed too far. Good pedagogy is about pushing students the right amount. And pedagogy certainly isn’t optimal in the world of coding — you’ll have to deal with a lot of imperfect documentation and tutorials. The world of code moves too fast for the educational materials to keep up (which is something that I might want to change…).
- Aspire to do things the right way. To write code that is clean, understandable, efficient, follows conventions, and follow best practices. For example, if you’re wanting to add login functionality, ask yourself, “Is this the kind of thing that people have done before? Is it likely that there is some established best practice?”. If so, then don’t be content to just hack it together yourself — go learn about the best practices. It’ll be worth it in the long run. Hacking it together might be the path of least resistance, but it’s important to have the discipline to decide to do it the right way.
- Please understand that computers are deterministic machines. When your code doesn’t work, it isn’t because the computer doesn’t like you, and it isn’t because one of the transistors is broken. It’s because some code, somewhere, is broken. You’ll be spending a lot of time debugging as a programmer, and you need to develop the ability to approach debugging with the right mindset. Don’t let frustration get the best of you. And don’t let laziness prevent you from questioning your assumptions. Keep your cool, and calmly go through the logic. It’s often a good idea to do some good ol’ rubber ducking! Sometimes what I do is I start to write out a Stack Overflow question (without posting it) as a means of rubber ducking. But if you’re really stuck after timeboxing appropriately, don’t be stubborn — ask for help. Not doing so is a weakness that you will be penalized for. I see a lot of people who are too stubborn or shy to ask for help, and it hurts them. Developing the ability to ask for help when you’re stuck takes a small investment and has a huge payoff; it’s a low hanging fruit — grab it.
What Should I Do?
So, you’re wondering what you should do. I’ll try to help you make a decision. First I’ll address the question of what I would do if I could go back to the beginning of my journey (starting the summer after my sophomore year). Partly because I feel like thinking about that question, but ultimately because I suspect that the answer to what I would do is likely to be similar to what you should do. It isn’t true for everyone, but I suspect that it’ll be true for a majority. And after addressing it, I’ll add some qualifiers as to what sorts of things are likely to change the answer.
Personally, I would have dropped out of college and started committing fully to code, but that’s a separate question. Here are the steps I would have taken.
Actually, before I dive into it, a few pedagogical notes:
- Read about the 80/20 rule. For a lot of things, you could get 80% of the gains for only 20% of the effort. Keep this in mind. A lot of times it’s efficient to go for an 80/20 understanding, and to fill in the details later.
- I highly recommend utilizing The Feynman Technique throughout. Basically, just try to explain the things you’ve learned. It works really well. I did it for a bunch of things by writing Medium articles. I want to start making YouTube videos too. You don’t have to do anything formal though, you could just do it the way he does it in the video.
- I view concepts as having dependencies. To know X you have to already know A, B and C. Look at Khan Academy’s dependency tree:
- So, in determining what order to learn things, it’s difficult. Everything has dependencies, and you start off with no foundational knowledge. So you could respond to what I’m going to propose and say, “You shouldn’t be telling people to learn X without having learnt B first.” But you could make that point about any proposal. In my proposal, I tried to navigate the tree as efficiently as possible, but at times it will still feel awkward and like you can’t learn what I’m telling you to learn without having first learnt other things. I tried my best (and think I did a pretty good job), but you should also use your own judgement in determining what order to learn things.
- Also, keep in mind that it gets better! As you learn more, you’ll have more nodes in your “knowledge tree” that you can use to branch off of, and learning will become faster and less awkward for you.
- With the knowledge tree in mind, here’s where I make the recommendation to gain some foundational knowledge before applying to a bootcamp. I think it’s worth investing the time to build the foundation, so you could get more out of the bootcamp.
- Oh, I almost forgot — what bootcamps look for. They tell you that they’re open to complete beginners, but I don’t really buy it. I think that they look for candidates that they think will be good developers after they graduate. Part of that is aptitude, and part of that is how much they know coming in. Think about it: this is what determines the bootcamp’s reputation and job placement rates. Pretty much everyone I saw at Fullstack had at least a few months worth of prior self-teaching. It wasn’t uncommon to have over a years worth. The only person I could remember who came in as a complete beginner was a girl who graduated from Stanford as a Physics major and who’s parents were MIT professors in quantitative fields. So yeah — they’re open to it, but if you’re a complete beginner, you’ll have to have some other credentials that are pretty strong. I also think that Fullstack at least looks for people who are… interesting. And nice. People there were very noticeably cooler and more interesting than what is typical, and this made for a great atmosphere.
Ok — here are the steps I would have taken:
- Google around to get an idea of what websites are and what HTML is. Watch this to get a very basic idea of how the internet works. Simultaneously, start going through this Command Line Crash Course and getting familiar with the command line (if you know nothing, this course probably wont’ be sufficient and you’ll have to google around).
- Use http://learn.shayhowe.com/ and W3Schools to understand the gist of HTML and CSS.
- Spend some time making a bunch of static websites with HTML and CSS. Simultaneously go through more HTML/CSS resources like Codecademy, Treehouse, and/or Code School.
- Learn to use Bootstrap. Make some websites with Bootstrap. Look into the code behind Bootstrap a bit. Go through CSS Diner to get familiar with some of the more advanced CSS features and start trying to use them a bit.
- Take Intro to Java Programming. Simultaneously, read But How Do It Know? and watch this talk by Richard Feynman on how computers work. This video is also a good watch.
- If you’re feeling up to it, take From Nand to Tetris. Or really, just skim it — the idea is to get a very broad overview of what life is like down there.
- Go through http://try.jquery.com/ and http://learn.jquery.com/. Make sure you understand the DOM. Watch this to understand the event loop. These are fundamental pieces of knowledge for web programming. It probably won’t sink in right away, but you should understand the gist of it.
- Start building up a bit of a portfolio with your HTML, CSS and JS/jQuery knowledge. Use this for inspiration. Once you’ve built a few things that you’re comfortable adding to your portfolio, start applying to bootcamps. Do something like this for your bootcamp applications.
- Before you start your bootcamp, start learning about what the deal with server-side code is. HTTP, request/response, APIs, REST etc. Also learn some Git. Use this, then this. If you’re up to it, also skim through this, this, this and this (look for 80/20 understanding).
- Do your bootcamp.
- Apply for jobs. It’s really important to find a job that’ll allow you to grow. Really important. I don’t know what else to say other than that it’s important. I wish I was able to offer good advice on how to find that job. I guess just keep in mind that it’s a numbers game.
- While at your first job, you still have a lot to learn (algorithms, data structures, design patterns, a better understanding of C, build processes, databases, unit testing, integration testing, deployment, shell scripts etc.). This is the point where I’m at now, and the branches you could take have gotten to be really plentiful now (you could focus on server side, front end, you might like Ruby and Rails, maybe Python, maybe Node, maybe Angular, maybe React, maybe you’re into database design, maybe you want to build cool visualizations with D3). At this point, you’re on your own — good luck!
At this point, you’ll have a job and you’ll be well on your way towards being a legitimately good developer. So Good They Can’t Ignore You (which I’d recommend). Congratulations! Maybe another 2–3 years before you have serious desirability in the market? I don’t know. But if you work hard, you’ll get there. Hopefully you’ll be at a job where you’ll have people to ask questions to and who can guide you. Hopefully you’ll be learning new things at your job.
This approach might not be right for everyone. Depending on your background, you’ll obviously want to skip/skim certain steps.
Some people might also argue that such a low level foundation isn’t necessary. The real question is whether or not it’s useful and whether it’s worth it. I think it is. This isn’t the place for that conversation though.
Some people might recommend spending more time on algorithms and data structures to impress people in interviews. Yes, you may be able to impress some people in some interviews if you’re good with them. But as a web developer, they aren’t particularly useful. At least for the stage that the target audience for this is at. I definitely think they’re something to learn one day, but given how many core things you still don’t know about web development, I don’t think algorithms are a pressing thing for you. And about people quizzing you on them in interviews, some do and some don’t. And the ones that do probably aren’t the right place for you. To emphasize: probably a majority of the places hiring for an entry level web developer aren’t going to care too much about your algorithms knowledge, especially if you have a portfolio that shows that you could make solid websites.
What is life as a developer like?
I’ve only been doing this for 6 months so this is definitely beyond my “area of expertise”, but I’ll throw in some thoughts.
You may have heard that the culture is all cool and hip. This is sorta true. Dress is almost always causal. Offices often have free food/snacks and games like ping-pong. Developers tend to be younger — you’ll see many more people in their 20s/30s than 40s/50s. There probably won’t be nearly as much bureaucracy, but there’ll definitely be some.
You may worried that you’ll have to work really long hours. If you want to avoid this, you certainly can. Some places definitely do want employees who’ll work long hours. Especially early stage startups. But a lot of places really understand and value work-life balance, and if this is something you want, it’s something you’ll be able to find.
Sometimes you’ll get to work on interesting stuff. Sometimes not. Sometimes you’ll get to write code that is clean and that follows best practices. Often times you’ll be time-pressured by short-sighted people to hack things together so they could meet deadlines, which is really unfortunate.
Err, I’m not sure what else to say, but I’ll end with this:
If anyone wants more specific advice, or just wants to talk, shoot me an email at firstname.lastname@example.org.