Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.Sign up
"I want to get into this computer thing I keep hearing about and stack hella paper."
Recently a lot of folks have been coming to me for advice and information about getting into the tech industry, so I thought I should share some of my experience.
At the moment, it is pretty good to be a software engineer. Many people (understandably) want to work in a skilled profession, get paid well, and have some sort of useful trade and job security. These are good reasons to motivate you, but they should not be the only reasons, and here's why: to be a good developer, you must be interested in what you are doing.
Computer systems are actually quite fascinating and powerful; there has been a tremendous amount of work done by brilliant people all over the world, and we're now at a point where things have matured a bit and there is a plethora of standards to choose from (that's a joke, ha ha). These standards are often compared to cars, which is not such a bad analogy – a car is made up of small, discrete components that all interact to form a useful, higher-level system with abstractions like steering wheels, gas gauges, and plenty of useful peripherals like windshield wipers and horns. If you just want to get from one place to another, you don't need to worry about how the drive shaft is connected or what sort of engine you have, but if you plan to build, fix, improve, or otherwise interact with a vehicle beyond being a basic user, you must have some fundamental understanding of what's in your car, the interactions between the various components, and how it's constructed.
Having curiosity and interest in the workings of computers is a prerequisite for doing anything, because higher-level concepts are not fully insulated from what's going on under the hood. There is a fairly daunting amount of conceptual information you can absorb, but it's not as bad as it sounds. One nice thing about technical information is that there are piles and piles of excellent guides, references, tutorials, forums, and free courses available on the web. It can be difficult to find them if you don't know what to look for, and some of them may seem to be written in moon-speak, but that is why this wiki exists; I am in the process of collecting solid beginner resources for curious hackers.
Hackers? I'm not trying to be a shady evil computer hacker.
Among engineering types, the word "hacker" means someone who is interested in how things work: the kind of person who enjoys taking shit apart and studying how systems function just for the hell of it. There are open communities of these people called "hackerspaces" springing up all over, and you would do well to join your local hackerspace. They have free classes, super smart people who are willing to share their expertise, and lots of useful tools.
The media uses the term "hacker" to mean someone who breaks into computer systems, because most journalists are clueless hackjobs who don't know anything.
What should I know about the industry?
One thing I tell everyone is that it's not as hard as you think to get tech work. My mind is often blown by how many incompetent and useless people manage to get paid to do serious development work. I suspect it has something to do with the fact that people are often hired (usually involving a complex and rigorous system involving counting buzzwords) by non-technical people who are not in a good position to judge someone's knowledge and competency. Despite what many people outside of the industry think, you do not need years of education, relevant experience, or even basic critical thinking skills to land a gig. You'd seriously be surprised.
Education is not a big deal either. A computer science background is a useful thing to have because you will learn theoretical knowledge about systems, algorithms, and well-researched principles, but it is by no means a requirement. Most employers care only about what useful skills you have and what you can do, not where you went to school. I don't have any hard numbers, but I'd bet many (if not most) professional developers don't have an engineering degree. Interestingly enough, I've observed that in general the more time a software engineer has spent in academia, the more useless and sad they are.
HOWEVER, perhaps the most important point to understand is that you are responsible for teaching yourself. There are simply too many disperate areas of specialization in computer technology, so you must be responsible for exploring whatever you find interesting.
Also, this field is rapidly changing and evolving, more so than most. Simply learning a single programming language and the basics of a development framework is inadequate; you must be constantly absorbing new information, reading related articles, going to tech talks, and playing with bleeding-edge tools. This is one of the most challenging aspects of being a developer, because everyone wants to just be comfortable and complacent and stick with what they know.
Long ago, COBOL was the new hotness and you were guaranteed a job if you could hack it (this is actually still true, COBOL may be one of the most lucrative gigs right now). Then it was pascal, then C, then C++, then Java, then PHP, now Ruby and Python are hip. The language isn't a big deal, but staying abreast of trends and having the energy and will to keep up makes all the difference.
As in many other professions, not just what you know, but who you know can play a big part in landing a job. Lucky for you, engineers are surprisingly community-oriented and friendly, even if their social skills on average may not be the sharpest. There are always tons of meetups, talks, conventions, and interest groups that meet on a regular basis, and they're generally free and open to anyone from the public who has an interest. Go to meetup.com, find a few groups that look interesting or fun to you, and just fucking show up. Often times, these events are sponsored by companies looking to hire people that are passionate enough about a subject to leave their house and chat about it with random strangers, and there are always people (the people who make hiring decisions) from other companies as well. In the worst case you might blow a couple hours and get some business cards and free pizza.
What should I specialize in?
There are lots of options! At the moment many people are doing web application programming, but that's definitely not the only sub-field you can get into.
- System Administration - Administration of UNIX systems and services may sound daunting, but it's usually not. These jobs are often available to people without much experience, can be super slack, pay well, and have plenty of opportunities to script or create software to automate tasks. Plus, getting started is super easy.
- Front-End Engineering/Design - Do you have any aesthetic sensibilities at all? Ever used Photoshop? You could be useful! There are many specializations such as graphic design, web front-end implementation (CSS/HTML/JS), user interaction and usability, information architecture, and more. There's lots of work available, and it can be easy to get into without much technical background.
- QA - Stands for quality assurance. All programmers are lazy and sloppy, and anticipating the stupidity of your users is impossible. QA people are responsible for testing software to make sure it actually works right. It often involves some technical skills and can be thankless and not the best paying gig, but it's also not a bad way to get your foot in the door and see how the development process works first-hand.
- Product Management - Managing a software project is a pretty interesting and difficult job. It involves making designers, QA folks, developers, operations, and executives all play nice together and produce a usable product on a schedule. I'm not really sure how one becomes a product manager, but I don't think you need any specific skills.
- Software Engineer - A little of everything mentioned above, plus software design and implementation. This is a challenging discipline, but also immensely fun and useful. Once you gain a bit of skill at telling computers what to do, you are limited only by your imagination. Common topics/applications are databases, web applications, games, embedded systems (hardware), systems programming, security, networking, and business applications. A lot of this is much more fun than it sounds.
- Maker - There is a long and wonderful history of creative applications of programming. Make algorithmic art, compose computer music live, make some robots, program your clothing, or write generative poetry.
More good advice: https://medium.com/learning-to-code/565fc9dcb329
How to design software: http://www.ccs.neu.edu/home/matthias/HtDP2e/part_prologue.html
I've started assembling useful resources from across the interwebs and a small bit of my own material as well, somewhat organized and annotated. If you're looking for a starting point to learn more, hit up the ☞ wiki home page ☜.
This wiki will be updated as I discover or write up new stuff, so be sure to bookmark it and check back from time to time.