Case series – why and how to learn programming
Summary:
Software engineering is a lucrative career with an unusually low barrier to entry. Due to its appeal, some people in our community have switched into programming via many different routes. To help guide other individuals who are considering making this transition, we’ve gathered the five people in our community’s experiences learning to code and getting employed as a programmer.
- Some programmers say that they enjoy their work because of the puzzles and problems involved in programming. They also say that they enjoy being drawn into a flow state.
One undesirable characteristic of software engineering is its white male monoculture.
Other common peeves are the need to understand large existing codebases and engaging in the boring aspects of fixing broken software.
People learn to program in a variety of ways including App Academy, computer science degrees, and teaching themselves while doing another job.
It’s easier to get hired if you’ve done an internship. Applying widely also helps. One App Academy graduate applied to 30-40 companies, out of which he got 5 phone screenings / code challenges, 2 in person interviews, and one offer.
Ethan
Ethan left graduate school in linguistics and trained at App Academy as a way to earn to give.
Why did you decide to learn to program?
I decided to learn to program so I could get a high-paying job and donate my earnings to MIRI. I was in graduate school for Linguistics before I learned to program, and I wanted to have a larger impact on the world: reducing existential risk through earning-to-give seemed like the right way to go.
How did you learn to program?
I learned to program by going to App Academy, a programming bootcamp where you only have to pay tuition if you get a programming job afterward. I did some preparation work on my own, but the main learning came through 12 weeks of working with the rest of my classmates for 8 or 9 hours a day. We did pair-programming and worked through daily exercises and projects, had weekly assessments, eventually made our own capstone projects, and practiced interview-style algorithm questions.
What do you / don’t you enjoy about programming?
I really love the puzzle-solving aspects of finding the cause of bugs and trying out solutions, as well as the tinkering of getting some unfamiliar technology or method to work with the other parts of a system. I also really love the fast feedback cycle of web front-end development, where a style or page layout can be changed and its effects seen immediately, and javascript can be run and debugged iteratively. I guess what I don’t enjoy would be the boilerplate that’s involved in a well-structured, large coding project. To get a simple new web page written on an existing, complex site can involve creating five to ten files that move data around before getting something from the database to the page. I get why it’s necessary, but it bores me. Also null checks. I hate having to do null checks! [ed: a null check is a piece of code that picks up a common error].
How did you get your first programming job?
I got my first programming job after about two months of job-hunting once I finished App Academy. I spent a few weeks in New York applying to a couple hundred startups and consultancies, out of which I got about 10 phone screenings / code challenges, about 3 in person interviews, and one offer. I moved to San Francisco, and applied to another 30-40 companies, out of which I got about 5 phone screenings / code challenges, 2 in person interviews, and one offer. Throughout the entire process, I practiced coding interview questions, did a full practice interview with a friend, polished and worked on one of my capstone coding projects, and read Cracking the Coding Interview.
What do you do in a normal day of work?
In a normal day of work, I do bug fixes, build new features, and stay up to date with everyone on current priorities and requirements. Doing a bug fix means seeing a report from QA, figuring out what factors are relevant in reproducing the bug, doing online research, trying to find the minimal change that fixes the bug, and testing my changes. Building a new feature means working with specifications and mock-ups to know what I should be building and what it should look like and do, writing code in a way that reuses and integrates with the existing code base, eventually putting my code up for code review, and then making changes in response to feedback from teammates. Everything else is communication, mostly informal hallway meetings and emailed questions, with a daily stand-up meeting in the morning, and occasional formal meetings or one-on-ones to discuss specific features or initiatives.
Alistair
Alistair taught himself Python in high school and has now programmed at various software startups.
How did you learn to program?
TI-83 BASIC in year 9 was when I really got it (using the instruction manual, making games, then onto Python, self-taught. Oh, and I started doing HTML and making websites in grade 5, self-taught via the internet. The adults around me totally sucked at finding ways to help me!
How did you get your first programming job?
I saw that there was a Y Combinator startup in Melbourne, emailed them, hung out with them for a month, then bought a one-way ticket to London and emailed the startups that looked interesting with my life story.
What do you / don’t you enjoy about programming?
I like: how often I learn new things, the collaboration, the creativity in designing new things, the slightly-more-rational culture, the cross-over with other fields like linguistics and maths, the feeling of power / leverage I get, the way it sucks me into flow
I don’t like: the young rich white male monoculture, dealing with other people’s (or my younger self’s) bad code, coworkers with poor social skills, non-programmers not really “getting” what I do and why I’m actually super cool (it’s still pretty low prestige), the stuff you get paid most for is the stuff no one wants to do because it’s usually painful
What makes a good programmer?
The Twelve Virtues of Rationality, basically. I’d probably weight conscientiousness above IQ (past a certain threshold), but it’s not like I’ve been scientific in my study. Their ability to communicate. If they can’t explain concepts to you or just kind of hand wave and say “it’s complicated”, that’s not at a good sign. Being an active open source contributor is a good indicator that they’re a winner, but it’s surprisingly rare.
How do you recommend starting to learn programming?
Read Clojure for the Brave and True or Learn You A Haskell For Great Good. Stay away from imperative languages like C, Ruby and Python for as long as you can so they don’t pollute your mind with awful habits. Find a friend (or a friendly person at a meetup) who likes functional, declarative languages and get them to teach you. Try to build something real and tangible as quickly as possible (like a little website) so that you get the rush of power and potential quickly (which doesn’t come much from sorting lists of numbers or whatever).
How can you get a job as a programmer?
Demonstrating that you can build good things in a reasonable time frame and aren’t a disagreeable person.
Alex
When Alex became disillusioned with researching logic, she applied her analytical skills to programming.
Why did you start learning programming?
My PhD was in mathematical logic and I always suspected I’d be good at/enjoy programming, so when I was fed up of academia it was the first alternative that came to mind.
How did you learn programming?
Just by playing around with various languages, building websites with php and javascript, then when I got a job supplemented by online courses through PluralSight.
How did you get your first programming job?
Through a friend who was a programmer and suggested me to his company.
What’s good and bad about programming?
The good: It’s really fun with a lot of ‘flow’ – I get totally immersed in it and time flies by. It’s often challenging enough to remain interesting but easy enough to give lots of positive feedback, i.e. you constantly solve problems and that feels good. The bad: gets a bit same-y, depending on the product you’re working on. Web development feels a bit trivial, would be nice to be building something more meaningful than a company’s website. It’s incredibly male and white dominated. My employers/colleagues are lovely, but there are horror stories about sexism in tech – see AboutFeminism for an example.
What do you do in a normal day of work?
I either come in to the office at a flexible time or work from home, have a quick meeting with my colleagues (we’re a team of 3) where we run through what we’re each working on, then coding all day on bits of work of varying complexity. Sometimes it’ll be ticking off lots of little bits, sometimes working on a bigger piece that might take several days.
What are your thoughts on programming overall?
I’d say it’s fun, it’s easy to get a job, if you’re good at it you’re in a strong position to negotiate over salary and hours with your employer, and it’s easy to self-learn with loads of online resources and open source languages. And tech as an industry badly needs more diversity so if you’re a woman or a person of colour, you could potentially do a lot of good within the field by being a voice for change, breaking down stereotypes, supporting organisations working on diversity in tech, mentoring others etc.
Chris
When Chris graduated from his philosophy degree, he switched into programming for its superior earning potential.
Why did you decide to learn to program?
My first couple times trying to learn to program, pre-college, were because it seemed cool; the revived effort was for earning-to-give purposes.
How did you learn to program?
I think—and this is a very fuzzy memory—that my first exposure to programming was in grade school, with a BASIC interpreter/compiler running on a DOS machine, and under heavy maternal supervision. Didn’t make it very far. In high school, I progressed to teaching myself a bit of TI BASIC for my graphic calculator, then Visual BASIC for the family desktop. Once I got tired of making the family desktop draw various fractals, I forgot about programming for until about a year ago, which is when I really started to learn. Taught myself some Python, applied to App Academy, and the rest is history.
What do you / don’t you enjoy about programming?
Programming appeals to the part of my brain that enjoys optimizing characters for tabletop RPGs. The un-fun part comes any time you’re dealing with anything that’s poorly documented, and you’re banging your head against the problem of how to get the damn thing to work for hours without making any progress.
How did you get your first programming job?
Through a recruiting agency.
What do you do in a normal day of work?
I’ve only been working for two weeks, so there isn’t quite a “normal” yet. Basically, what’s been happening someone tells me a feature they want added to a project, and I go about trying to figure out how to add it. This generally involves some amount of time, possibly a lot of time, trying to figure out how the existing code, or the third-party libraries we’re using, work, which can take more time than actually writing the feature.
Jeff
Jeff has programmed all of his life and now works at Google.
How did you learn to program?
In many situations over a long period. Growing up my family had an Apple IIE. My dad taught me BASIC on it. I could write some things, but not that much. I remember writing a program to factor numbers that I was pretty excited about. We later got a computer that ran Windows. My dad tried to get me to learn Visual Basic, and I was interested but it was too complicated for me and I didn’t get anywhere with it. In high school I took programming as a half credit (2x/week instead of 4x like full classes) each of the four years. This is where I went from being mostly unable to program to mostly able. I spent way more time on the homework assignments than was required because I was having fun and kept wanting to make my programs more capable. Around this time I also installed Linux on my computer and got comfortable in the terminal, which is a (very weird) programming language and kind of like an IDE when you combine a bunch of programs. And I learned (some of) emacs. In college I skipped two of the intro computer science classes, and took all the classes I could. I learned more languages and became more comfortable in the unix environment. Again I spent lots of extra time on CS homework assignments, though by less of a margin than in high school.
How did you get your first job as a programmer?
I looked haphazardly for programming jobs in the Boston area, both online and through friends. I applied to three, got accepted at all three, and chose one that I think in retrospect wasn’t a good pick. I didn’t do any internships in college, and probably should have. If I had applied for one, I think I could have gotten an internship at Google, and ended up here years earlier. It’s way easier to get hired if you’ve done an internship. It is nice to have the perspective of having worked other places earlier, but I don’t think that was worth the ~$100k/year salary difference of not being employed by Google.
Do you think you can get some impression of the traits that make people a successful programmer before they start?
I don’t know how to.
How do you recommend learning to program?
Lately I’ve been recommending “learn python the hard way”.
What do you / don’t you enjoy about programming?
I really like the building things aspect. Going from an unmet need to a program that will just do the thing is awesome. Most of my side projects have been almost entirely this. Tracking down why a program is working or not is sometimes entertaining and sometimes really boring. Once I stop making fast progress I get frustrated, slow down, and am unhappy. Understanding existing large codebases isn’t much fun. Code reviews are fun if I’m really interested in the problem the other person is trying to solve, and dull otherwise. Once something I’m working on gets less fun I tend to have trouble staying focused, get distracted and work on other things instead, and make less progress. Which means my time ends up spent mostly on the things I like least.