Caution to reader: this blog post is 3 months or older. Blog posts older than three months may contain details about the Hack Reactor program that are no longer accurate. Please refer to other pages on our website to confirm current information and email us with questions.
Brian Jordan is a software engineer and game developer in San Francisco who curates Coding for Interviews, a free weekly programming practice newsletter.
No CS Degree? Here's How To Nail Your Code Interview
Think you can’t get a job in programming because you don’t have a CS degree? Think again.
With CS courses from top schools freely available online, supportive programming meetups and communities, software career accelerators, accessible open source code everywhere—it’s never been a better time to start your programming journey.
More personally, I have heard stories speaking with non-CS major members of Coding for Interviews of programming journeys—something that inspired them to make a change in their life and learn to program—and they came out of these experiences with great engineering jobs.
Li Ouyang contacted me in the early days of Coding for Interviews with her success story. Li went from being an Economics major at my alma mater to a wonderful software engineering position. What was her formula?
Software Career Accelerators: Expand your understanding
If you can make it happen, software career accelerators like Hack Reactor provide an excellent opportunity for immersion in the programming field.
In 9-12 weeks, these schools will have you ready for a career as a software engineer. Most schools are between 8-11 hours a day, with curriculum geared toward building your code portfolio.
Legitimate programs will be there every step of the way during the hiring process, providing meet and greets with recruiters and top notch technical interview coaching.
Talk code: Program next to someone
Sure, you can get top computer science college courses on Coursera. But pair programming on a tough problem set with a partner can provide a huge benefit.
Perhaps the most important thing you can do to improve your understanding of software engineering is program next to someone. As Peter Norvig, author of Artificial Intelligence: A Modern Approach says in his essay Teach Yourself Computer Science in 10 Years:
"Talk with other programmers; read other programs. This is more important than any book or training course." - Peter Norvig
How do you find someone to program with?
If you’re near a city, look around for hands-on meetups full of like-minded programmers. Software career accelerators in the area can be very helpful in this regard—Hack Reactor hosts some wonderful free events in San Francisco such as their Coursera Programming Languages course study group.
If you’re in school, even if you’re not studying CS, find a friend who programs (or wants to learn to program) and invite them over to pair program on a personal project. Looking for a convenient excuse to make it happen? Find a hackathon, startup weekend or event to jump in on. Start an app development / hacker's club at your school, or join forces with someone from your school’s entrepreneurship club. See if there’s a programmer that works on your school newspaper’s site and ask if they’re looking for help.
If you have a job in programming already (or work somewhere with programmers), ask a coworker if they would like to pair program on their next project. There are some concrete benefits to pair programming, and I suspect the intangibles of bug avoidance and your improvement as developers will more than make up for the difference in production time.
On an island with just an internet connection? Programming with a person physically next to you is better (I learn better when my partner makes faces when I name my variables poorly), but programming with someone else online is still great. Find a decently active open source project in your favorite language and ask if someone will take you under their wing as you work on a feature. Look online for someone interested in remote pair programming with you.
“One of the most helpful things I did when preparing for interviews was reading the Java core libraries.” - Interview with a Coding for Interviews group member
What language are you most proficient in? Perform a deep dive. Find the language’s source and read some of the libraries for understanding. When your interviewer asks you, “how would you implement a queue in Java?” and you respond with “well in Java the queue is implemented like…”—that’s a very positive signal.
To find interesting new things to read in your language of choice, subscribe to weekly newsletters. See this excellent list of weekly newsletters from Kale Davis.
Blog: Refine your thinking
Writing—and actually sharing your writing—can be a great way to refine your thinking and structure your preparation. After a day of practicing code problems, write up a quick post of what you did and how it went.
Aside from the potential exposure your posts can generate for your personal brand, committing to actually posting your writing can kick your butt into thinking about your thinking when you’re writing.
To start, though, try free writing. Sit down in front of a text editor (or something neat-o like Draft) and just barf a bunch of letters onto the page.
Bonus points: use Octopress or your blog and host it on Github or Heroku—or build your own blogging platform using your favorite web framework (or pull a Paul Graham and build your own freaking language for it).
Project: Your smoking gun
Employers can’t deny your skills when they see the direct fruits of them.
Want to get in the door? Have projects on your GitHub account online. Build a fun app or tool and throw it on Heroku.
When they ask about what sorts of projects you’ve done in the past, you have the opportunity to break out your phone and set the low water mark of your capabilities in your interviewer’s brain. Any other capabilities you show evidence of in your interview are just icing on the cake.
What are some attributes of a great project?
1. You built it yourself. Pair programming is great, but for your showcase project, make sure you can honestly say you did the lion’s share of the work. While a group project is better than no project, it’s difficult to describe how much of a project you did.
2. The project is web-accessible. Make it easy to see evidence of the core logic of your project. If it’s something that requires a login, provide a demo login or just take a screen capture video of your project in action and put it on YouTube.
3. The code isavailable, readable, and it’s good. Pick a part of your project’s code and do a deep dive—make one specific part beautiful. Use the appropriate design patterns and name your variables, classes and methods excruciatingly accurately. When you are asked for a code sample, link to that file in GitHub directly (or mention in your README that `awesome.js` is where most of the action is).
Tech interview prep
Working on your own projects, programming with others and doing this all in a thoughtful way will get you far. Unfortunately, programming interviews at many companies also check for a certain set of specific knowledge you might not yet have picked up otherwise.
Review the common data structures, algorithms (and runtimes), design patterns and practice your problem solving. And by common, I really mean the ones that get asked about in interviews.
Here’s a short list of jumping off points (so in the worst case you can say “I know some of these words”):
Data structures: arrays, linked lists, associative arrays (hash table-backed), trees, tries, graphs, stacks, queues
Algorithms: tree traversals (BFS, DFS), quicksort, merge sort, recursion, dynamic programming, binary search
For each data structure and algorithm, know their time and space complexities. Study and memorize their entries in the Big O cheat sheet (and if it’s not clear why something has a certain complexity, look further into it!).
Problem solving: analyzing the runtime of an algorithm, solving for a base case and recursive case
For more experienced folks: Object-oriented programming principles and design patterns: singleton, static factory, composition, decorator, polymorphism, multiple inheritance
For some more jumping off points, see the Coding for Interviews reading list.
Is it possible to get a programming job without a CS degree?
It sure is. According to various estimates, somewhere between 25%-50% of career programmers do not have CS degrees.
Constantly improve as a programmer, show off your chops in an accessible way, and prepare for your interviews, and I have no doubt that you can kick off a new career in computer science with a great first position.
Get the job? Learn something while interviewing? Let me know your story!
Good luck, keep improving, and have fun with it!