
Ask HN: How does a self-taught programmer get as skilled as a CS graduate? - zuck9
What should every self-taught programmer, without a college degree learn? What should I learn so that I&#x27;m as skilled as a CS graduate?
======
rubyfan
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.

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

~~~
rubyfan
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.

~~~
ratsimihah
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.

------
kiloreux
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

[1]([https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-...](https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-
DV69F32zdK7YJcNXpTunF2b))

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

~~~
HeyLaughingBoy
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.

~~~
lordCarbonFiber
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.

~~~
HeyLaughingBoy
Thank you for that completely uninformed rant!

------
brudgers
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.

~~~
bordercases
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.

------
bahruzg
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?

------
lumberjack
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.

~~~
drakonka
> 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.

~~~
origamize
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?

~~~
drakonka
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.

------
alexandrerond
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!

------
lastofus
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.

------
a3n
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.

------
espeed
Linear Algebra, Data Structures, Algorithms, Computational Topology

~~~
klunger
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.

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

------
censhin
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?

