I actually did that. I left a well-paying job for a slightly less well-paying job as a very junior developer.
There are definitely challenges. There's a ton of stuff to learn, from programming technique and style to version control to team planning strategies.
Probably the biggest thing I wish I'd been able to learn in school was about what it means to deliver. There's a world of difference between knowing that I can solve a problem and being able to realistically estimate the time it will take me to do so. Especially at the beginning, I lost a lot of face by saying I could do things that I couldn't.
There's a similar gap in expectations. There have been a lot of times when I've sent something into review that I thought was exactly what I was supposed to deliver, only to have to redo it later. I had to learn to ask for feedback early and often. It's also much harder than I thought to differentiate between implementation details and details that will be significant either to calling code or to my ability to build out features later.
Probably the hardest thing, though, has been the feeling that I might not be able to overcome the perception that I'm not good enough to be given important tasks. When I think about it rationally, I can satisfy myself that I am getting better and better assignments, and I'm showing I can get them done. But it's sort of demoralizing to feel like I have to prove myself all over again.
So those are the tough parts. Honestly, I still feel like it was one of the best decisions I've made. There is no way I would have been able to learn this fast or this much without the kinds of colleagues, mentors, and especially problems this experience has given me.
In general, my job search strategy has always been to look at opportunities orthogonal to my field. I didn't look for software jobs per se--if I had to compete against CS degrees I'd have been a goner. Instead, I looked for positions where I could use the knowledge I had as a multiplier for my productivity doing something else.
It also really helps that the market for good devs is pretty competitive. It means that once you're in and you've proved yourself a bit, it's easier (and often less financially risky) for your employer to take a chance on your ability to learn than it is to hire another dev when something needs to be done.
But as I said before, this approach sort of kicks at least one can down the road; if you start off at 'assistant' level, it's hard to move up in people's perception.
You may find that when you get out of school, you don't find a lot of resonance interviewing with 20-something year olds at startups, but contrary to what it seems like here, those people are the vast minority.
It's also entirely possible that after finishing up a degree in CS you find that you don't want to actually work as a professional programmer. That's also fine (it's hard to tell what you might still find interesting in 4 years, and hopefully a big part of your education will be in gaining exposure to things you might not have otherwise thought about).
I'd say if you find CS interesting, and have the ability to pursue a CS education (which not everyone does), than go for it.
12 years later, and 3 more companies and I'm a software architect with a major vendor on a team where I'm about in the middle "age" wise.
The only time I ever felt that age played a part was an interview I did for a company that was in start up mode with chief architects that were about half my age. I had no problem walking away from that one.
Opportunities were a major application that was written so badly (in java) that I learned a lot by fixing and refactoring. A poor social life that came from a divorce and moving states gave me an opportunity to spend an additional 40+ hours a week after work coding and experimenting and seeing what I could do.
In a more general sense. Giving myself a goal and working on figuring out how to achieve it in code was far better for me then merely reading a text.
Unless you want to be a bonafide computer scientist (i.e. working towards a career in academia or otherwise pushing the boundaries of current knowledge of the field), it seems like pursuing a second degree may do little else but exacerbate the age concerns you're already having.
In my opinion you'd be better off starting somewhere as a junior programmer now and honing your craft on the job (as you'd have to do after finishing your degree anyway).
A few things you might want to keep in mind: You can learn just as much online these days as you can in school, for a fraction of the cost. A CS degree can be found on Udemy for a reasonable price.
Your 10,000 hours starts now. Build things, be curious. Build things even if you think they're stupid. It's part of the learning process.
Having a website, or an app, and a GitHub repo will much farther to getting you hired than a degree. What will help you even more than those things are a good attitude, an open mind, a humble spirit, and an ability to learn.
Best of luck!
I'm one of the co-founders of Dev Bootcamp (http://devbootcamp.com) and the median age for our students is 28-32. We've graduated dozens of students over the age of 30 who learned to program at DBC and they went on to work at all sorts of awesome places.
Felix Tsai was one of our students last summer and was 42 when he entered DBC. He's now an engineer at TapJoy in San Francisco.
About Felix: http://devbootcamp.com/2013/02/05/felix-tsai-of-tapjoy-on-le...
If you know, could you please tell me if Mr. Tsai had any other qualifications before joining your program? Did he have a Science or IT degree, or have any relevant qualifications?
He was a former attorney.
/* Obligatory excuse about how I haven't had my morning cuppa yet */
You guys have a waitlist for July?
That said, software engineering is one of the fields you can get employment without a degree, provided you can 'show your work'. The hard part is building up your skills in a way that can easily be demonstrated. The common wisdom these days is to create a github profile, build some interesting things, commit to some open-source libraries, and use your profile as a resume of sorts.
Here's interesting article on being a well-rounded programmer: http://jasonrudolph.com/blog/2011/08/09/programming-achievem...
We're also in a 'golden age' of self-guided learning, with online tools to help learning galore, here are a few:
http://codecademy.com http://www.codeschool.com/ https://www.khanacademy.org/cs
Also, get a few decent books on "Programming 101". Common wisdom suggests you learn C, one of Ruby/Python, Java, and a functional language like Haskell. Here are some good books to learn from:
The C Programming Language (some people say you should start here, I'm one of them!): http://www.amazon.com/Programming-Language-2nd-Brian-Kernigh...
Learning Python: http://www.amazon.com/Learning-Python-Powerful-Object-Orient...
Learning Java: http://www.amazon.com/Learning-Java-Patrick-Niemeyer/dp/0596...
I hope you do choose programming as a career, its been very rewarding for me :)
Scala is a "better Java" and you can learn both the JVM and functional programming (take Odersky's course on Coursera). Clojure is a great Lisp but the Java stuff will be very confusing if you haven't seen it before (the JVM-interop functions like proxy, gen-class, and reify don't have the easiest APIs).
This (Structure and Interpretation of Computer Programs) is a great book to get started on the deeper aspects of CS: http://mitpress.mit.edu/sicp/full-text/book/book.html
Also, I like this one: http://www.amazon.com/Concepts-Techniques-Models-Computer-Pr...
How to solve the problem? Start developing tomorrow's programmers today.
As an aside, my very first introduction to Python was competing with a friend, building scripts that would automatically create accounts on a forum, login to those accounts, and then use them to give ourselves 'karma'. That weekend I learned more than I'd ever known about Python, HTTP and web scraping. Its a silly example, but mini projects like that can really help you learn.
In fact, I've done so much of it over the last 5 years that I'm trying to get out of it. But that's another story.
From being unable to write a single line of reasonable code to being a Data Scientist making a solid six figure salary took me four years, a bunch of work, and being a very good networker. That last part is pretty important.
Oh, and I don't have a degree.
As others have said, I think if you don't get a CS degree, you really need to focus on results. Anyone can give programming a shot these days, but only some will ever be able to ship decent software and get paid to do it. Software development is ideally a meritocratic endeavor, so if you can develop the skills, age shouldn't hold you back. What would hold you back is not having enough time, motivation, or aptitude to develop the skills needed to get a job. Even if you can't get a job though, programming is a useful life skill, so I personally think it's worth a shot if you can find the time.
Many masters programs are what one of my professors calls "mercinary-masters". Their job is to bring in money in exchange for a piece of paper. You're taught by adjuncts, you take courses that are watered down from the courses that undergraduates take, some of the professors might not even have degrees related to computer science, etc. Your purpose is to subsidise the undergrads and PhD students and the main criteria for admission is whether they think you can get passing remarks to get the degree.
The US News rankings are for doctoral programs, not masters. The rankings are formulated very simplistically via a survey asking people, "how good is the program at School X". So, they aren't such a good source. Plus, with your background, some schools aren't going to want you. That isn't a dig at you - you're re-training and some schools only do PhDs (with masters for those who drop out) and other schools don't do conversion-style masters.
If you have more specific questions, I might be able to help. Still, the best advice I can give is to make sure that you're not getting segregated off into a special class of cash-cow masters students who are being given a watered-down experience in exchange for money. It's easy to look through course catalogs and who teaches the courses you'll be taking and look at the professor web pages and see where you're getting someone brought on board to teach a course and where you're getting faculty.
Edit: not that the parent post was implying that such programs should be avoided, bit it is common advice.
I'm actually 30 (well 31) and feel like I'm starting over again very year or two given how fast things move, and have just got on to a MSc software engineering course, so.. why not? :)
I'm now 30 and work for a major SV website. I am a bit older than most of my colleagues, but I keep up just fine. Like you, I wish I had gotten that CS degree as well, but you only let your mistakes defeat you when you stop trying.
Now, before everyone starts freaking out, the trick this whole situation is that you must be willing to learn how to do everything the right way. No cutting corners, no copy pasta. Treat this like a magical classroom lab where they actually pay you.
You will feel stress. You will work harder than you've ever worked. I was putting in probably 100 hours a week between my day job and this work. But I also got to a point where I could really write code and archetect software in about 2 years time.
It really helps have a close friend who you can turn to when you need someone to help guide you a bit, but if you don't have one, try to get ingrained in some dev forums.
Good luck! :)
I kind of worked backwards though - I have 5 years software development experience, but wanted to get some qualifications so I could better dictate my working conditions (remote work, salary etc).
I say go for it. You're younger than I, and I'm not too worried about my age :)
- Salary: I have found it difficult to get out of the 50-60k bracket without qualifications, and I personally feel that for my ability, I am getting ripped off. Also, my full-time job was grating me quite a lot. I was working under my brother for one, and my fellow programmers were not very good. I didn't really enjoy going to work. It didn't challenge me.
- Family: No one in my immediate family has a degree, and I mean to change that. It might seem a silly reason, but my family is right behind me and with it comes a sense of pride.
- Skill: Although I am confident in my ability in certain areas, I desire to learn more of the lower level skills like compiler design, algorithms etc that I didn't have time to learn on my own. Focusing on it completely seemed the only way to succeed for me personally.
- Diversity: I felt as though I was in a hole with regards to the technology I was working with, and had no perceivable exit strategy. I want to explore more than just CRUD applications. It also gives me the chance to try out things I would never had even considered looking at, such as circuit design.
- Networking: Learn the craft alongside others who are passionate about the same things. I know there are other ways to achieve this, but it comes as an added benefit.
"a year from now you will wish you had started today."
"i never regret when i do it, i always regret when i don't."
"there are seven days in the week and someday isn't one of them."
"every accomplishment starts with the decision to try."
"if you don't build your dream, someone else will hire you to help them build theirs."
and last, but not least:
"quick slackin' & make shit happen!"
I graduated college with a degree in electrical engineering not really knowing anything about what I wanted to do for a living or where I wanted to be in five or ten years. So I sort of drifted into a master's program, again in the same field, hoping to figure out what I was doing before I was forced to confront the job market or academia proper.
I didn't realize until the second half of my first year at that graduate program that I enjoyed the CS courses I was taking as electives far more than the normal engineering courses. So I ended up taking my second year and throwing all my effort into taking as many CS classes (which were cross-listed departmentally) as I could: operating systems, databases, compilers, etc. I made some stupid mistakes choosing some classes that turned out to be neither interesting nor relevant, and skipping on classes that would have been extremely useful or informative.
When I graduated, I took a position at a startup in the area, doing work that fell between the interface of EE and CS. I realized that I wasn't too fond of the work or the company (for various reasons), and so I spent months teaching myself the practical and theoretical stuff I had missed out at school, whether out of inexperience, disinterest, or sheer decision-making ineptitude. Some of this stuff was useful for my position at the time, other topics were completely exploratory in nature. And when I was ready, I started sending out my resume and interviewing for positions. I did get a new job, and I'm a software engineer at a well-regarded mid-size tech company in Silicon Valley right now.
Some thoughts regarding your position:
- CS is one of the fields with the lowest barrier to self-teaching. You don't need expensive lab equipment or fieldwork - just software, much of which is freely available, an ordinary computer, and enough motivation to actually utilize both.
- You don't need a 4 year degree. In the US a lot of schools won't even allow you to enter their bachelors programs if you already have one. A BS would be a waste of your time.
- The MS degree isn't a prerequisite. Build something substantial, and people will take notice. If you don't have anything you can show them, the degree can sometimes be useful. I'm not proud of this and it's actually really shitty, but the name of the school on your resume may sometimes make the difference between people taking a look at it and throwing it out (at least from my experience).
- If you do go back for formal schooling know what classes you should take, in order to acquire knowledge you need to have. You mention data structures and algorithms in a comment earlier; there are classes which focus on those; there are also classes that focus on discrete math, statistics, and other foundational topics. You should build an OS and a compiler while you're there. I always thought this was a thought-provoking read: http://matt.might.net/articles/what-cs-majors-should-know/
- A lot of MS programs are coursework programs; they've been charitably described as financially lucrative to their host institutions. Mine almost certainly would have qualified (both the EE and CS programs). This is not necessarily poison, but it does mean that if you attend, you should make the most out of the classes you take.
- If you are interested in working at certain companies, see if you can get someone to give you an internal referral once you're ready to begin the job application and interview process. A lot of companies (again, this is a controversial topic) seem to give more weight to internal referrals than unsolicited submissions. Contact with most of the companies I was looking at started either when a recruiter reached out, or when I asked someone I knew to put in a word. If you feel that people are loath to consider you due to your late start/lack of formal credentials this may be a way to offset that.
Finally, the fact that you are considering this move because of passion, interest, and demonstrated competence bodes really well for you. Best of luck!
You might find that another 4-year second-undergrad is time-inefficient (and probably expensive). It might be better to study math and take a few undergrad courses at a university-- that'll take a year or two and you can work while you do that-- then go back for a Master's.
The good news: despite the ageism that our industry is known for (which is overrepresented on HN due to the high proportion of VC-istan programmers here) there's no evidence that people become worse programmers when they're older. In fact, it's clearly the opposite. In 2013, science has reached no consensus regarding the age of cognitive peak; it's somewhere between 20 and 65, but no one's sure where. It seems to be very individual, with some people peaking early and some late.
The bad news: if you want to work at the VC darling companies, you're probably screwed. Ageism is severe there. People will think you're a loser, in those companies, if you're not an executive by 35. But there are a lot of quite frankly better options where no one's going to think twice about your age, especially since you're a long way away from being old.
What are those options?
For one example, banking is considered ageist (most people retire by 50-55) by society-at-large standards but no one is going to look askance at you for being 40 and a non-managerial programmer. You should be at least VP by that age (and preferably ED/MD) but you don't have to have reports.
One nice thing Wall Street has done for its top (non-managerial) traders and programmers is use the title system to validate non-managerial high performers: you can be a "Managing Director" without having to manage other people. If you're going to have titles, you have to start giving them to engineers... even though a part of me would like to see titles just not exist.