Disclaimer: I ripped this from an old blog post of mine and updated (I hope) the relevant bits.
Yes, another one of these posts. I’ve read several, and each one has its merits. So, I decided to write my own. If you’re interested in software development in some capacity, this is probably worth a read. The story isn’t likely unique, but I doubt it’s conventional. Maybe I got to my 10,000 hours earlier than most because of it—who knows. Honestly, I’ve wanted to write code of some kind since I was 7. I thought it was an appropriate enough anecdote to slap on my LinkedIn profile:
I have been hooked on development since my uncle showed me how to write a batch file using edlin on an IBM PS/2–at age 7.
Yeah, edlin. I’m not dating myself back to punch cards and teletypes, but I’ve been at it a bit longer than most developers my age. The next year, that same uncle taught me to write a little HTML on a Thinkpad at the Thanksgiving dinner table. Hello, scrolling marquees! Unfortunately, I mostly strayed from web development until college, but we’ll get to that. I coded anything I could: games, math tutorials for friends in school, anything I could imagine. The machine had become the perfect teacher. Anyway, this post will be a bit about my background, a bit about what I wish I knew earlier and what I think you can do to get ahead of the curve.
A Little More About The Timeline
Most of primary and secondary school was spent in accelerated classes, finishing homework in class that raised questions with my parents about how I still didn’t have any homework. I excelled, and it was apparent. To be honest, I think public school is a joke today. Of course, other people excelled more and others less.
Toward the end of high school, I got sidetracked (shocking, right?) with recreational drug use, girls and rebelling against authority. I dropped out during 11th grade, half of 12th, re-enrolled and still managed to graduate. I took a couple night school classes along the way, because let’s face it, my parents would have been furious if all I was doing was partying and working as a cashier at Blockbuster. I didn’t do a lot of coding in this era.
I was so re-enrolled and ready to move on that I had to leave my first [community] college class early to go to my high school graduation. I spent a year on the computer science track, then I decided to try my hand at engineering (in hindsight, that was dumb.) The suggested courses at the sophomore level don’t matter as much as at the 300/400-level, but I had heard good things about engineering. So, I had, albeit temporarily, abandoned a specific career in development for the first time since I was 7.
I transferred to Virginia Tech, and this was both the best and worst decision of my college career. I think I needed a taste of “college” life, since I wasn’t exactly hitting frat parties and stumbling back to my dorm room at community college. On the flip side, transferring into an engineering program, at an engineering school, at the beginning of my sort-of-junior year of college…was the dumb part. Honestly, I just did a horrible job of evaluating things with my advisor and figuring out the path of courses to graduation. I probably could’ve stuck it out, but I’m an opportunist. So, I made another opportunity.
Back to computer science. Eventually, I transferred to University of Maryland College Park—computer science and economics (don’t ask.) I was there for three or four semesters, maybe a summer or January-term class here and there. I didn’t bother graduating, because I had already been in college for 5 years. I had an opportunity to help start a small IT shop in my hometown, so I grabbed at it. Fifteen bucks an hour—sounds awesome. What I didn’t appreciate until maybe a year into this job was how much I would learn. I already had the drive to write software, but doing a little network engineering gave me new ideas. Doing the customer-facing, consulting thing gave me new ideas. Believe it or not, fixing printers on occasion…gave me new ideas! I was always angling for a software solution (not saying this was always right,) and it turned into a position where I’d sometimes work 30-40 hours per week doing helpdesk and another 30-40 hours doing software.
I’m not going to bore you with the rest of the jobs I had between then and now, in part because I bounced around a lot looking for a niche in the software field (still haven’t found it.) Most importantly, it’s because this job was the most important (Thanks, Chris!) Your family was right, your friends were right: the first job is important. College is not work, particularly computer science. When your TA’s can’t understand your assignments at the 300-level without consulting the instructor, punch yourself in the face, leave computer science immediately, and save yourself the debt.
Frankly, computer science at UMD is a lot of theoretical bullshit you’re not going to use, some good exposure to different languages, and one or two courses that hold actual merit.
What I Wish I Knew Earlier
One area I wish I knew/learned earlier/whatever pertains to tooling e.g. version control, IDE’s, etc. I agree it’s valuable to try and understand how something works before you use a tool that can automate it for you, but my college experience (your mileage will obviously vary) fell short of that. Yes, many computer science programs start in a shell. I felt an edge, because I had already been a Linux aficionado for years. Even circa 2003, there were better tools (read: IDE’s) we could’ve used and not be completely shocked when we enter the work force. Teaching CVS as version control is not acceptable education when Subversion was already around.
Moving on, execution is everything. Whether you buy Gladwell’s 10,000 hours idea or not, you can’t become a good developer without “reading a shit ton of source and writing a shit ton of source ” (source: DHH 2014 railsconf keynote) I can’t count the number of Silicon Valley types I’ve talked to in the past year alone that have said this to me. No one had ever said anything like this to me before, and I’m 10+ years into my career. If you have an idea, don’t look for a developer who knows a language you think you need—code it. Stop making excuses about not having a complete idea. Beat someone else to market. Your idea probably isn’t game-changing anyway (no offense,) but it still deserves a shot if you think you have a way to solve a problem in a different way. I wish one, I’d have been happy with one, college professor/instructor/whatever had told me my software will be refactored a hundred times after it launches before it reaches something that doesn’t resemble a piece of shit.
Who cares if your product is shit—your users? You can’t get any users until you have a functional piece of shit anyway.
Next, office communication. This will be variable depending on your office culture, but the point is the same: No one cares how grammatically correct your office communications are. Ask your question, get your answer, fix your problem. Wrap your mind around this too—eventually, you’re going to send an e-mail to a distribution list you didn’t mean to e.g. company-wide. Oops. If you’re in an office that negatively response to something so trivial (assuming it didn’t have any sensitive information in it,) get a new job. That culture sucks, trust me.
Speaking of culture, this will be my last “things I wish I knew earlier” point. I know economic situations change, and sometimes you have to take a job that is less than what you wanted. With that said, it is an incredibly lucrative time to be a developer (gifted or not.) There are jobs out there, particularly if you’re willing to relocate. Update your LinkedIn profile, tweet about development topics using hashtags like #developer and #webdev (if you’re into web development) and people will pick up on it. Get on IRC. Freenode has thousands of channels for most languages, platforms and applications I’ve heard of. I digress—the point is: treat your job interview as a two-way street. You have just as much right to ask questions about culture, scope of work, why you might be hired, etc as the interviewer has to ask about your background. In my experience, the face-to-face interview is a later step in the hiring process, basically right before you’re given an offer. The first steps might be conducted via phone. These are calls to determine whether or not the job overall is even a good fit, and maybe another technical call to quiz you on some buzz words, code strategies, etc. If a company (particular smaller ones) has made the decision to being you in for an interview, they’ve made a big part of their decision. They’ve decided you’re almost as technically sound as they like, and they want to find out what kind of person you are (read: whether or not you’re a jerk.) There may be technical exercises a la whiteboard, but you’re more than half way in the door.
Don’t make getting a job as a developer harder than it has to be. To be an above average success, you’re going to spend time outside of work on side projects. You might read technical blogs, or you might join a local user group related to a language you’re into. You should have side projects. I don’t know many (if any) successful developers that don’t either consult on the side or involve themselves in side projects. This is a living industry. If you have an idea, find some communities online that connect either a) developers with developers or b) business-savvy people with developers. Someone has to figure out how to make the phone ring! Contribute to posts online. I don’t have a stellar, Jon-Skeet-level reputation on StackOverflow,
but I’ve acquired a few thousand points of reputation over the years by asking good questions and sharing what I’ve learned in the form of answers. It has been a tremendous help, and that’s just one community in which I involve myself. When you can explain something to someone else correctly, you have an intrinsic understanding of the topic yourself. I can’t explain every minute detail about the C# programming language, but I can tell you a lot about it.