Ask HN: Is it necessary to be a CS major be successful in the tech sector?
Tell me HN, what are your thoughts on this? Do you believe it's absolutely necessary to be a CS major to be competitive in the technology world?
Can the same result happen for someone who isn't a CS major but goes through all the hoops to teach themselves? I am not saying that a CS degree is necessary or necessarily better, but I believe it is a categorical mistake to treat the experience gained obtaining a formal CS education with the experience gained teaching oneself...if only for no other reason than that a student, by definition is less able to distinguish among the hoops and accurately separate them into useless, useful, important and critical. The features of a formal education include guaranteed access to experts [for some definition of 'expert'] and a proven set of priorities [for some definition of 'proven']. The downside is less potential breadth since standardized systems are standardized. The real question is what does 'make it' mean? For some people the piece of paper matters. It's a goal with social and personal significance and there is nothing wrong with that. If 'make it' is tied to wealth...well it's easier if you were smart enough to pick rich parents. In the end it depends on what you want. And in any event, while a CS degree won't necessarily make anyone good [for some definition of 'good'] it may open opportunities and if they are good a CS degree will probably make them better, and almost certainly not make them worse. Good luck. Thanks for your input. Adding to what you've said, I've read and heard on some occasions (from professionals in my sector) that taking some CS classes as electives was beneficial and wasn't too overwhelming. You're welcome. Many years ago, I "just got the piece of paper to hang on the wall," Amost as many years ago, I got another piece of paper that hangs on the wall as a credential - not in CS and in a field where credentials have legal standing in the pursuit of other non-academic pieces of paper to hang on the wall. Which is a way of getting to the core decision that you face. What is the value to you personally of the piece of paper that you can hang on your wall? It doesn't really matter much how much I value a diploma, unless I a hiring manager and you are a candidate and that's the typical case. Diplomas are meaningful culturally. If you already have a piece of paper to hang on the wall your calculus may be different than if you don't. That's ok either way. If you have a diploma, then Coursera's MOOC's are a middle option. There is the formality, at least in some offerings, of a fixed course schedule and consequently a peer cohort and clear instructor student relationships. And it offers some excellent courses by excellent CS teachers. But it's not going to get you academic credit if you might really want a degree at some point. I've taken a bunch of them and gotten a lot out of it [I've also dropped a lot of courses when I haven't]. But my situation is my situation - that's why I described it - and not your situation. Or YMMV. I am a self taught programmer, and I am now director of engineering at a tech startup. I think CS has its place, but just like music, some of the best musicians and producers have not studied music theory formally. There is not a day that goes by that I am not learning something new about programming or technology (which should also be true of CS majors), so keep that in mind, learning doesn't end at graduation. The tech sector is a big place. There are countless people who haven't programmed anything in their life and are successful. Assuming you mean in a programming role... I wasn't a CS major and am successful. Continuing education is a necessity, and I'm always going back and learning things I may have missed not having been a CS major. That being said, "CS" aren't magical letters that open doors to the golden kingdom. I know plenty of dumb-as-rocks CS majors. Most success tends to boil down to the human element. > goes through all the hoops to teach themselves The average course is 50 hours a week in class, plus 150 hours a week studying, meaning 200 hours total. So to repeat what I did, you would have to spend 200 hours studying graph theory, then 200 hours studying data structures such as trees and graphs, then 200 hours studying algorithms that operate on data structures as well as big O notation, then 400 hours studying calculus, then 200 hours studying discrete math, then 200 hours studying theory of computation, then 200 hours studying logic gates, ALUs and assembly language, then 200 hours studying mutual exclusion and critical sections, then 200 hours studying floating point numbers and data representation, and so on. In my experience, it is quite rare to find a self-taught person who can explain what deterministic pushdown automata are, or what the elements of mu-recursive functions are, or how to find a function maxima with Lagrange multipliers, or how you can prove a problem is NP-complete through reductions. They might even have problems explaining exactly what the relation in a relational database is. Usually self-taught people go straight to trying to learn Ruby or PHP or something. Their knowledge of CS is not very deep. There are exceptions, John Carmack has a better knowledge of C++, programming techniques, computer graphics and other areas then the average BSCS graduate. But he is very honest and open about what he knows and does not know, and what topics he is getting around to now. One time I had lists of numbers (like "1 7 3 0 2 4 6" or "8 3 5 2 0 1") and had to make a hash of them. I suddenly thought, why not just turn the lists into Goedel numbers? I then did a Google search and saw other people had used Goedel numbers for hashes in similar situations. How many of those people were self-taught? Probably very few. Is there a point to this other than telling us how amazing you are because you know some facts? As a self taught programmer there's probably just as many things that I can do that you can't. And how would you rectify your lack of knowledge in those areas? That's right, go and find out for yourself. The amount of hours you list are meaningless also (there are only 168 hours in a week by the way); self taught programmers have spent more time on the areas they're interested in. Not everyone who's self taught started by bashing out web-apps in Ruby and you do us all a disservice by tarring. At the end of the day you learned some facts in a structured setting. It is entirely possible in a non-structured setting. The beauty of self-tuition is you take it as you need it, and you dig deeper when you find an interest. It is true that self-tuition as part of your job doesn't always allow one to delve as deep into a subject as one would like, however the best self-taught programmers are self-taught in their own time. To answer the original question: No, you don't need a CS credential to be successful in the tech sector. I'm a CTO of a successful medical software house, I've developed my own databases, distributed systems, languages, frameworks etc. I'm a polyglot, knowing high and low level languages (as well as many assembly languages). Before that I worked in the games industry where I developed high-performance 3D graphics engines, animation systems and physics engines. And yes, I can read The Art of Computer Programming[1] and understand it. All without a math or CS degree. I have never had a problem finding work, and often when I have looked for work in the past I've been inundated with offers. As a CTO when I receive CVs the education section is almost irrelevant to me. It's a useful guide, but it has very little bearing on whether I bring someone in for an interview. I have worked with many graduates over the years, and they're mostly useless when they join the world of work (unless they'd spent their childhood self-tutoring). There's clearly benefits to the academic knowledge, but mostly you won't even need it. It's only when you start to dig a bit more that missing knowledge pops up. Then you just go and learn it. However, if you've not learned how to learn then a formal education may be the best choice. When I had the opportunity to go to university I turned it down because I was sick of the stifling educational environment up until that point, but by that point I'd already been teaching myself to code and everything about computers from the age of 10. [1] http://en.wikipedia.org/wiki/The_Art_of_Computer_Programming You make some interesting points and I appreciate that you weigh out different aspects. The things that you mention are very inspiring to me. Everything that you've accomplished makes me want to work harder than ever. Is there a way I could reach out to you privately to ask you some questions if you don't mind? Yes, i'd be happy to help as I can. Although take my advice with as big a pinch of salt as any opinion on here. No-one really knows the right way to do this properly. We're all shaped by our experience in this, still young, industry. Feel free to drop me an email: plouth at gmail.com It depends on what you want to do. The "technology world" is a big place. If you're going into biotech, for example, you can do just as well with a BS in Biology or Genetics and taking a few programming courses to give you an edge when it comes to areas that are using computers heavily (like Bioinformatics). The same goes for Physical Sciences, or Mathematics/Econ or even Geography. Most CS Degrees cover: 1. Basic and Advanced Programming
2. Design of Computer Systems (both hardware and software)
3. Design of Operating Systems
4. Theory of Computing (so Algorithms and Data Structures)
5. Other special topics like Networking, AI, Expert Systems, Bioinformatics, etc. These topics are important for some jobs, and people who excel in some of the advanced areas (and often go on for an MS) can make mega bucks. However, a programmer designing a corporate website or other CRUD system probably won't need/use half of the stuff they learned in their degree, and would likely earn less than someone who excelled in another engineering/science degree that also picked up some programming knowledge. "Absolutely necessary"? No, of course not. I would say that, for most people, the best approach includes a degree. Probably a CS degree; mathematics or other engineering disciplines may work as well. That will change somewhat the kind of exploration you need to be doing outside of class. Any which way, you need to be doing quite a bit of exploration outside of class. I personally have and greatly appreciate my CS degree. I don't know if anyone else on my team has a CS degree and I largely don't care. It is not a requirement to do the job of software developer and lots of great software developers do not have CS degrees. That said, most of the really good software developers I know who do not have a CS degree, at some point in there career wished they did. Whether those wishes are worth the investment is hard to say. My biggest question is why not get a CS degree? If it is a question of resource allocation, then I completely understand. If it is a question of lack of interest, that would be a red flag to me, either of the institution you are studying at or of your own motivations. But that could just be my bias because I found CS fascinating. I agree with your "Why not?" point. If you are already in college and plan to do 4 years, you might as well get a cs degree. For me it was too late to switch majors when I found out how much I loved programming. And it really wasn't worth it to do a 5th year. But I did take as many courses as I could before I graduated. "why not" comes down to time. There are things I enjoy more than programming. Most of these things I know I wouldn't be successful enough at in a professional sense. I might as well spend that magical time in college where nothing actually matters to pursue some other passions. Nothing wrong with that reasoning at all. That said, studying both should be an option. And you might consider those other things as a profession anyway. The magical time after college lasts a lot longer and being stuck doing something you don't like sounds terrible. You don't need a CS degree to be successful but it'll be a lot easier to get in the door. Most top-tier tech companies (google, fb, twitter, etc.) won't even interview a non-cs candidate for an engineering or product role unless they have incredible (like, you built instagram) evidence of their talent. It's also a lot harder to skip the degree and still learn what you need. I did, and it's taken me 10+ years of constant curiosity (and tons of nights and weekends) to be on par with my peers who have degrees. That all said. You gain other skills with a liberal arts or science degree that CS majors don't get. I'm a much better communicator and manager than many of my engineering colleagues, and that has allowed me to outpace them in terms of career growth. I studied math & physics - never took a CS class. I have made my way to a lead frontend engineer position in under 2 1/2 years, and I am courted by many companies. For me, the ability to solve problems quickly without oversight has proven to be valuable. It took a lot of hard work to get to that point, but I am absolutely of the opinion that a CS degree is not necessary. In fact, I once roomed with one who apparently couldn't find a job coding for a living & was not particularly intelligent. Just another data point, but you've already gotten your answer i think. Some of the best guys I've seen have majors in fields similar to x's - physics, ee, maths. I've hired and worked with people from majors in law, sociology and psychology, to name but a few. Some of the best (and most interesting) guys I've worked with. The difficulty will be the "first job", but if you're skilled then you'll be fine. Teaching oneself is no meagre feat however! Honestly it comes down to motivation. Whether or not you get a cs degree you have to super motivated and hard working to achieve greatness. I agree. What you've said can be applied to anything. I self taught myself before college and then used a CS degree to force me to study things I never would have. It tended to round me out better in areas where a self taught might avoid. For example, optimization, refactoring, underlying OS implementation, architectures, etc. No way on earth would I have diligently taught myself those for months on end. I think this just shows how 'fluffy' the advice here is. As a self taught programmer starting with a computer that had a clock speed of 2MHz and 32k of RAM, I learned very early how to optimise, how to refactor and how OSs worked under the hood (as well as the underlying hardware). When I look at Big O notation, I always see the efficiency description of any algorithm as 'well, durr', because I just have a strong sense of whether something is going to run in fixed, linear, or exponential time. So I feel the exact opposite of you: I would only have learned "optimization, refactoring, underlying OS implementation, architectures, etc." if I had the 'infinite' personal self-tuition time. I couldn't imagine learning any of that stuff in a class-room. I'm not saying you're wrong, you're not. But clearly there's cognitive biases on both sides, which might not be very helpful to the OP. Eugene,
I'm going to pass along advice that was given to me years ago.
Do the hard thing. I've been hearing hints of this for some time now. Doing the hard things in life can open new doors as an individual, or steer you into the right direction for something else. The majority of people I know who have successful careers in technology couldn't write fizzbuzz. (That's why they pay people like me). When did "technology" stop meaning machines, electronics, chemicals etc. and start meaning websites? No; you can learn anything on your own online, but it's easier through the structure from school. If you're paying for school yourself, however, you'll be in a much better financial position learning cs on your own. It helps, but not necessary. Most of the awesome coders I know, didn't study CS - they learnt by themselves. no, but it makes starting easier. you have no track record to prove yourself (unless, of course, you do) so having a good education is sort of your entry ticket. If you don't get a CS degree you'll be at a disadvantage when you're lined up adjacent to other potential hires that do have CS degrees. Nope. Source: theatre major, masters in education Disclaimer: I am "self-taught". I have a degree in logic and rational reasoning (a philosophy at most universities) and I went to (and drop out of) law school. A bit of background for you. Is it necessary to be a CS major to be successful? Simply, no. Does it help? Yes. You see many people ask this question because they want to know if they can start working right now and make money and skip all of the hassle, time, and expense of going to a school and majoring in CS. In order to be competitive and get the positions you want and make the money you'd like, you are going to have to learn CS. One of the better ways to start (more on the start in a moment) is to go to a University with a good CS program and learn. You'll also get a number of other soft skills that will stick with you for the rest of your life. If you aren't going to get a CS degree you will still have to study all of those aspects to CS in order to be competitive at an advanced level. I have met other "self-taught engineers" who can handle CRUD operations pretty well and who can make a pretty front end with a little bit of framework help, but when it comes to things like traversing a simple binary tree structure or explaining memory management techniques or even just explaining a simple FILO stack, they can't handle it let alone make one work for a specific scenario. You're going to have to learn those eventually, a CS program will give you a lot of that knowledge and it is useful! Early I mentioned it's a good start. I have been working professionally since the mid-90's as an engineer. A lot has changed in 20 years. Now, a number of the concepts that I mention before have not (FILO stack's are FILO stack's, after all). But CS and engineering is a constant learning experience. New techniques and technologies come out every single day. I would argue that a CS degree teaches you how to learn as well. And you are going to be learning for a long time to keep up and keep your competitive advantage. Final thoughts: College is fun! Sure it is stressful at times and somewhat expensive. But it's a good time! You can keep those relationships for a lifetime and they will also give you a competitive advantage. A CS degree is not enough! Work on real projects while you are learning. Get internships or junior spots and work. Those are fun too! They will help you. Enjoy this time in life. If you like the idea of going to school but you aren't sure about CS, think about what you really want to do and do that! I thought I wanted to be a lawyer (in hind sight, this was an absolutely horrible thought, but I digress). I still had fun in school. I took a long, winding road to get to my successful development career, and I don't regret it at all. But don't believe CS is the only way. But you do have to pick a way. There are no short cuts to success. Thanks for sharing your great advice! I truly appreciate it. I'm currently in an intern position with a software company. Working here opened this whole topic for me. I was contemplating whether or not I was making the right choices for my education. Sure, everyone's different when it comes to learning and choosing their paths. I just want to make sure I won't regret my decisions. Again, that being said, there are pros and cons for these types of situations, but that's besides the point. I originally plan on majoring in the businesses field, while minoring in something to do with computers(CS, Eng, etc.)
Ultimately, I want to create tools for people to use, make them pleasant to look at, all while contributing to something I could be proud of. Luckily, I have a little bit of time ahead of me to really think about my options to send me into my future. It's the path of least resistance. No er