Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: How does a self-taught programmer get as skilled as a CS graduate?
24 points by zuck9 on Nov 26, 2015 | hide | past | favorite | 27 comments
What should every self-taught programmer, without a college degree learn? What should I learn so that I'm as skilled as a CS graduate?

In practice most programmers are business application developers and don't need the education a CS degree demands. If you really want CS degree skills then I'd assume you want a job in bio/pharma/physics, etc. and if that's the case just go get the degree. CS focuses heavily on math and algorithms, if you want those skills then learn discrete math, calculus, etc.

If you want to compete against Joe average programmer with a degree then just learn Java or .Net plus the latest greatest technology fad offering (think Hadoop, Node/Angular/React, Rails back in the day, etc). From there you should have no trouble finding a startup company or a small contracting outfit with ties to bigger consultants serving enterprise clients. If you're good then accept a right-to-hire situation and an enterprise IT shop will pick you up.

Don't sell yourself short and don't take shitty odd consulting jobs from small businesses because you feel inadequate due to lack of degree. Create demand for your skill and reap the rewards. At the end of the day you will likely be the only one who cares about the degree.

While most jobs don't require much CS, most interviews to get them do!

Personally as a candidate and as a hiring manager I haven't found this to be the case.

I have a degree in business administration. My relevant work experience programming has always got me an interview using the tactics I outlined above.

If you have relevant work experience and a strong track record for delivering results then you will have no problem getting an interview regardless of your degree status.

Oh I wasn't referring to getting an interview. I meant that interviews for programming positions ar often CS-based, and it's passing them to get the job that require CS skills.

Well at least they list them. I've applied to the ones that say its required and can still get interviews sometimes. At the very least it's worth a try

I am an electrical engineering student, so i might have some good background in low level things like 68k Assembly and the rest, but since the market for electrical engineers is dead, i learnt programming alone, i picked a language first (C in my case), tried to learn it well, and made some toy programs with it (nothing serious), and then i started exploring other languages, hoping to fall in love with one of them (didn't happen :( ), and then started with Algorithms and Data structures (Skiena's Book and lectures)[1], as it teaches you things that are really essential in CS, beside that you need to learn about OSs, Databases ... etc, to have a good foundation in CS, I personally know a lot of people who did great job as programmers, and didn't do any of this, but that's my perspective on how things should go , best of luck


Is embedded systems stuff dead as well, or just the hardcore IC/analog stuff

None of it is dead. At my last job we were having trouble finding good entry level EE's. At my current job we just hired one after a long search.

Like finding software developers: just cuz they have a degree doesn't mean they learned anything.

I guarantee you, the reason you were having trouble isn't because the grads "don't know anything" it's because you weren't paying enough. From my experience the job market for most flavors of EE is "dead". I think 25% of my class last year actually went into engineering. The rest went to CS grad school, software dev, consulting, or finance.

When you are offering lackluster responsibility, and bottom feeder pay, don't be surprised when you can't find talent.

Thank you for that completely uninformed rant!

Electrical is never going to be "dead," especially analog, RF, and power. There are no substitutes for it.

There's a difference between "dead" as in non existent, and "dead" as in no job opportunities for grads. Advancements in software have eaten most of the entry level jobs in analogue and RF given simulation tech allows teams to consolidate in design. Anything cutting edge is regulated to the PHd level. As for power, politics and lack of funding assures power (in the US at anyrate) will remain trapped in the 70s and consequently won't be drawing any talent.

Skilled at what? That's the question. Algorithmic analysis? Study algorithms as algorithms. Compilers?...well, I'll leave that etc, as the trivial exercises they are.

What a CS degree will tend to provide (but not always) is a set of abstractions and a university perhaps may provide some different patterns of thought (but again not always).

That said, there's nothing every self-taught programmer (or CS grad) should learn. There's no standard individual. There's no standard set of circumstances. Sometimes the best answer is using something off the shelf. Sometimes the best answer is reinventing the wheel. Sometimes it's cut and paste. A CS degree (lack thereof) doesn't make someone wiser...or a good fit for a team or a lot of other things that matter.

That said, there are reasons to get a CS degree that have nothing to do with skill. There's social expectations. There's internal motivation. There's the simple pleasure offered by the opportunity/excuseto study something of interest for a few years.

Good luck.

You can only know what problems you're going to encounter to within a certain margin. This both implies that despite having little knowledge of individual/"standard" circumstances, in the long-run you may be able to ensure that certain problems are going to come up and that you should be prepared for them. To me, this is what constitutes the "standard". So 'skilled at what?' is a somewhat nebulous way of answering the question when there are in fact basic skills that allow one to manage one's career proactively.

Granted the OP could probably do better to clarify his goals for better targeted advice. Personally I would suggest to him/her that they should look at the MIT syllabus, or a trade-school syllabus, and go from there.

Best way would be taking online classes through Coursera, edX or Udacity. All 3 offer best quality material to take you to CS graduate level. What you need to know is what the curriculum of CS degrees at good universities contain. In terms of specific knowledge and skills, you will need to take calculus and discrete math classes. The few classes in algorithm design and analysis, data structures. You may want to take few classes in compilers, networking and operating systems in order to better understand how the whole system works. Then few classes in programming languages (not a specific language but the theory of programming language). For further advancement you may want to take some more classes in machine learning, artificial intelligence, linear algebra, human computer interaction, computer vision, database systems, cryptography etc. It requires proper amount of time to accomplish all. And not all CS graduates are as skilled as you think. May be you are more skilled than some of them. So before starting it would be good to understand what you are trying to accomplish by getting CS skills. May be you are good to continue with your current skills?

The best approach to be competitive, is to find a popular, platform, stick to it, and learn it really well.

You won't be coding any fancy algorithms so you're worrying about the wrong thing. You just need to learn the best practices and stick to them. And then you learn most of the skills you will need through experience.

Also note that without a degree your employment possibilities are more limited. You will probably have the most luck in web or mobile app development.

> Also note that without a degree your employment possibilities are more limited. You will probably have the most luck in web or mobile app development.

I don't think this is really the case anymore. I work at a largeish game dev company and know quite a few people (coworkers and just other developers working for other companies) who have no degree and no trouble finding jobs. Admittedly this is purely from personal observation specifically in game dev, but it doesn't seem like my degree-less friends get any fewer recruitment offers or advancement opportunities than friends who went to college.

Your sample is subject to some pretty heavy selection bias though. How would someone who does not have a degree and is having trouble finding a position know you through working at a game dev company?

By nature of the fact that I don't only associate with people who work in game dev companies but also aspiring game developers, hobbyists, and all kinds of other people interested in the industry.

Don't get me wrong, I see plenty of people having trouble finding a position in games. It's just that this isn't limited to people with or without degrees (and isn't even limited to engineering positions specifically, where finding work seems to be easier). A lot of the time the people I see asking about their troubles finding a position simply don't have a portfolio of work to show potential employers.

And then there are people who haven't started applying yet but want to prepare. They ask in online development communities what they need to do to be ready - a lot of the time the answer from other people who do or have worked in games is to make games and build a portfolio, not necessarily ship off to college by default. Having said that nobody is disputing that college can be a great way to build that portfolio and learn things at the same time! The paper itself just doesn't seem to be as important as it used to be anymore.

I did a 5 year degree in CS. What remains is not so much the course content but the faint knowledge of how things kind of work. This gives me a very wide scope when working on any problem and to provides a better grip when facing new domains.

You can't replace the full scope of CS studies with online courses or books simply. What you can do is to start widening your current domain of knowledge. You are a programmer: How does your language of choice work internally? How do compilers/interpreters do it for other languages? How does a single core handle your program? What happens with multiple cores? And so on...

You'll find yourself knowing more and more about SO, architecture, etc and you'll be able to take advantage of the knowledge right away (because it's related to what you do) and in the future (because many CS domains share common parts).

Last, if books work for you, use them. If hacking some electronics does it, then pursue that. Just find a way to learn things that doesn't get you tired. And whenever you're in the office and someone just talks about something you have no clue, ask for tips, always!

It might be worth picking up some CS textbooks if you are someone who can learn from books well.

Things that have helped me the most from my CS degree:

* Learning the internals of operating systems and the UNIX API (Modern Operating Systems (3rd Edition), Advanced Programming in the UNIX Environment, 3rd Edition)

* Network programming (Unix Network Programming, Volume 1 and everything else really by W. Richard Stevens)

* Compilers (Compilers: Principles, Techniques, and Tools is the goto book, but I found it hard to read stand-alone. Might be worth finding a different textbook here)

* Algorithms and data structures (Introduction to Algorithms, 3rd Edition)

* Learning the basics of how CPUs work form a computer engineering book is useful as well, along with assembly language, and how higher level languages like C get translated to ASM and eventually machine code. I can't quite remember what text books I used for this.

Compilers was useful, even though I've never written one professionally, as knowing how to parse anything well save you headaches when someone tells you to parse some HTML for instance. You will also pick up regular expressions and some fun useful data structures.

1. Look at the curriculum for an undergrad degree, and start studying what you find most interesting.

2. And/or, do a deep dive study into every aspect of what you're currently working on. But 1 will help with 2.

Linear Algebra, Data Structures, Algorithms, Computational Topology

Hmm, I would disagree. Data Structures and Algorithms, definitely. Linear Algebra, maybe, for certain jobs. Computational Topology? No way. Totally unnecessary unless you are going into academia or a very specific subfield. It is not even standard for most undergraduate CS curriculums.

That will be increasingly important in the years to come, plus it puts you into everything.

Catch the long-tail man.

I'm not sure CS and programming go hand in hand anymore. I'm a college dropout that landed a job as a software developer at a good company, and everything that I use daily is self-taught knowledge. I can't remember a time when I used something I learned in CS for the past three years, and I made it to my senior year.

What I can recommend is to learn Github and git. Beyond that, it really depends on what you want to focus on.

What interests you?

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact