
I'm a cargo cult programmer, help me - jrookie
Hello HN I come to you for help.<p>I went to college and got an Information systems degree, it was a crappy college so the most programming we had was dabbling with arrays and pointers in C, not much Algorithsms &#38; Data Structures, no unix, no Operating Systems and no compilers, and most importantly no problem solving. Half way through college my father died so I had to find a job to make ends meet,  somehow i got sucked  into the java "enterprise" world where I've been for the past 5 years, glueing API's and frameworks together, with some Javascript and SQL on the side, however on the verge of my 30's, I now have found that I lack the fundamentals of Computer Science,  the things every programmer should know: Algo's, Data Structures, Operating Systems an understanding of compilers and being profficient with linux. Eventually I plan on going back to a real University and getting a CS degree, but I'm unable to do so at the moment, this is why I have come to ask for help.<p>OTOH I have given thought about if programming is really for me, I have found that I'm really, really bad at problem solving and "thinking outside of the box" I have come to accept that I'm really not smart. I'm slow, forgetfull, concepts never seem to stick, I have to force myself to not take things for granted, it seems no matter how hard i try I can't look at problems from different perspectives and understand the  implications of a particular solution, I'm starting to think I may have a learning dissability, or that is because I lack the basic toolkit for problem solving, but I really think I'm just not very smart.<p>Of course the realization of my lack of skills, as you may have guessed, is because I want a better job, and there seems to be no place in the world for dumb programmers, and to be honest this is something I understand given my limitations and looking at my other peers, seeing how long it takes for me when programming something or understanding a problem, seeing how fast other people can grasp concepts that I struggle with, I understand that I'm just not valuable that all my experience
means nothing, So I'm back to 0.<p>I have started going through the basic Algo's and Data structures again with a basic Java book about algorithms (I tried cormen but no way I could wrap my head around that stuff, I forgot all the calculus/math from college and i just lack the mathematical maturity for that book).<p>I'm also trying to study discrete maths, Operating Systems and compilers, of course one step at a time. I imagine this will take me years just to get a basic understanding of all these concepts.<p>And finally trying to memorise all those linux commands I ALWAYS forget.<p>Lastly I'm trying to learn technologies and languages that will help me get a better job, I'm still not decided whether I should learn Ruby on rails or python or Lisp or just stick to Java and learn Android and do my own thing  and forget about joining a "cool" startup or working at the big guys like google(10 years from now after I become a real programmer of course...) Or quitting programming altogether.<p>Hackers, I understand this is a long and boring post, filled with grammar &#38; spelling errors (English is not my primary language), but I only ask of you to guide me whether I should continue this path in which I have invested all my adult life on or just start again from zero, I just don't want to be a cargo cult programmer anymore.<p>Thank you
======
blhack
I've gotten some flak for saying this other places, but the _most_ helpful
thing that I've ever done to learn linux was installing gentoo. Especially
doing it without the official install CD (by using something like knoppix).

Start here:
[http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=...](http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=1)

The thing that is different about installing gentoo vs centos or ubuntu is
that instead of something that looks like this:

    
    
         Would you like to format the disk (click yes or no)?
    

You get a walkthrough of what fdisk is, then how to use it, then you use it to
partition your disks. Instead of selecting a filesystem from a dropdown, you
make one with mke2fs.

I don't recall if Ubuntu even tells you what lilo or grub is.

The reason I like this is that it forces you to understand what is going on.
What is the /boot partition? Why is that important?

Installing gentoo is going to force you to use tar, and wget. It's going to
force you to get comfortable on the command line.

It's also going to force you to understand what a kernel module is. It's going
to force you to understand things like: what chipset does my wireless card
use?

It's hard. And it takes forever. And it probably won't work the first time.

To me, it's kindof a rite of passage, like telling a carpenter that he has to
build his workbench before he is allowed to start working on anything else.
The workbench he makes might suck...hopefully this causes him to want to keep
building new workbenches until he has one that is perfect.

~~~
jrookie
Thanks for this.

I'm currently using Ubuntu as my primary OS at home but I will give Gentoo a
shot.

~~~
portmanteaufu
You might also consider trying out Arch Linux. (www.archlinux.org)

I moved to Arch after a few years with Ubuntu and I love it. It's a little
higher-level than Gentoo in that you don't have to make your own file system
or compile your own kernel, but it _is_ an educational experience in that you
have to install anything you'd like to use. When the 15 minute install is
complete, all you have is a bash prompt. Getting a GUI, the ability to print,
wireless, etc is all up to you.

They give you a great package manager and they maintain an excellent Wiki that
can walk you through almost any task. Arch taught me loads about
configuration.

Then again, I did Gentoo back in the day too. It might take 4 days to complete
the installation, but you sure will learn some things! :D

~~~
Locke1689
The main difference between Arch and Gentoo is that Arch is binary (IA-32(e))
package based and Gentoo is source based.

They both can deliver you to about the same point on install (Gentoo stage3
install).

------
knowtheory
> I have come to accept that I'm really not smart. I'm slow, forgetfull,
> concepts never seem to stick, I have to force myself to not take things for
> granted.

Congratulations! You have just discovered that you have an asset!
Forgetfulness, an awareness of one's limitations and an understanding that
learning can be challenging are all things that actual newbs are not aware of.
You no longer suffer from hubris.

Your newfound recognition of your limitations is the foundation upon which you
must build and shore up a structure for acquiring new knowledge, outlining
plans which recognize your limitations and executing these plans in a
predictable manner.

These problems are the same problems that most programmers (hell, most people)
face. This is what the life-hacking movement is about. It is about
understanding that we are all human, and that improvement in our lives
requires recognition of our weaknesses.

If something is not working for you, what you should do is look for
alternative methods to achieve your goal. If you do not absorb knowledge
through reading books or theories, perhaps reading code would be better for
you, or perhaps you are a social learner and need to talk to other programmers
about what it is that they do.

Remember that every challenge is an opportunity. There are even people who
have turned their quests for self improvement into niches and businesses in
their own right. If you see something that doesn't make sense to you, it may
not make sense to other people. If you find a way to make a task easier,
others might find it useful too.

I hit the point you're at about 5 years ago. I'm beginning to feel competent
and trust my ability to build things. There's a lot more that i want to learn
and become better at. It's a long process, but many have tread the path before
you, and many will follow in your steps.

G'luck.

~~~
sonnekki
This is one of those pieces of advice that hits my face so hard with its
simplicity and non-obviousness, it makes me want to cry. This is made my
Friday, thank you.

~~~
knowtheory
Honestly, this is what people mean when they talk about passion or tenacity or
being "an animal" (cf <http://www.paulgraham.com/start.html> ).

What they mean is that you've got a drive to succeed in the face of adversity.
That when you encounter difficulty, you won't become disheartened and lose
focus on your goal and instead browse reddit for the next 12 hrs (There's some
irony in Y-Combinator being responsible for one of the biggest time wasters on
the internet). That when faced with a problem you'll take it head on, or if
it's more sensible find a way to go around it.

This is a concept that's both maddeningly simple and insanely challenging.

------
mrpopularity
I have a sneaking suspicion that this opinion will be unpopular... but it is
mine, it's humble, and I'm entitled to it :)

You are stuck being a cargo-cult architecture-astronaut because you are stuck
in a language that exemplifies and encourages it. ROR and python, while
perfectly good in themselves, will allow you to stay there. My advice would be
to take something 'horrible' but useful - PHP springs to mind - and play with
it. Do fun stuff just for the hell of it. Do things quickly, not correctly.
Correct things one by one and see which things actually make a difference, and
which things were a complete waste of your time.

Memorising linux commands? What? _Slap!_ Write yourself a cheat-sheet and
remove that excuse from your head immediately. It'll take you 5 minutes. If it
takes you longer, you're doing it again. Stop making the perfect cheat-sheet
that covers every example of everything you may ever need, and write the
5-minuter that covers 95% of it.

Set a line between the front of what you're doing and the back. In front of
the line, everything must be neat, useful and functional. Behind the line you
can do whatever you please. The line is the part of the 'achieving things'
model that cargo-cults miss - the difference between practice and theory. You
might even surprise yourself about your coding ability once you start
evaluating things that way.

~~~
htp

      You are stuck being a cargo-cult architecture-astronaut because you are stuck in a
      language that exemplifies and encourages it. ROR and python, while perfectly
      good in themselves, will allow you to stay there.
    

I'd abstract one step up, and suggest it's the environment that's to blame
instead of the tools.

At a previous company, I found that there was a not-insignificant number of my
coworkers were seemingly-incapable. I originally blamed the people for their
lack of skill; later, I moved on to faulting the tools (Java / Oracle / a
less-than-stellar in-house "framework"), but eventually realized the problem
was with the environment, and nothing else.

A couple of the biggest contributing factors:

* A near-constant state of panic ("is it done yet?")

* The implicit requirement that all decisions had to be routed through at least two stakeholders for confirmation

* Old guard programmers enforcing that things be done the One True Way, despite any evidence that alternate approaches would be better

Early-to-medium-ish into my time at that company, I stuck to my guns and did
what I felt was right. I wound up writing toy apps in Rails and Node that
changed how the company managed its production and release pipelines. Toward
the end, I would constantly question my skills and abilities--despite the
success of my toy apps--because I'd been conditioned to do so. I settled into
a rut-of-despair very similar to the OP's for a few months.

I quit when I realized what my environment was doing to me.

------
cjbprime
For what it's worth, the only way I've ever learnt anything significant
relating to programming was getting a job that demanded it. Want to learn
Linux? Install it on your primary laptop and get a job that uses it. Same for
Python or Ruby and Rails or whatever.

So, I think your feeling of incompetence may be just a feeling of being
totally bored by doing the same thing for five years. If you got a job that,
say, demanded you immediately learn how to make feature changes on a PHP site,
I expect you could do it fine.

This doesn't cover everything in your post, though -- you're right, it does
take years to become a kernel or compiler hacker. There's plenty of work to be
done with fewer prerequisites than those two.

~~~
jrookie
Thank you for your answer.

I have already installed linux as my primary OS at home, I still have to stick
to windows in my job though.

~~~
falcolas
If you have the ability and the desire, install Cygwin on your work computer,
and do as much work through that as you can. It may help.

~~~
jrookie
Thanks, I will give it a shot.

------
rbranson
If you want to learn fundamentals, you need to master C. The language itself
is very simple and readable, but what it will teach you is how memory works.

Every algorithm & data structure worth implementing has been implemented in C
and is probably available in an open source project. You can download Redis,
which is fantastic code and covers all the basics. Take one of these projects
and start trying to mold it to your will.

Write specialized string parsers in C for doing simple things you'd normally
do with a script. If you do it right, it'll be several orders of magnitude
faster.

Learn to use the GNU debugger.

Take blocks of algorithmic code you've written, learn pthreads, make them
concurrent, and actually able to achieve linear increases in speed as you add
cores.

Your greatest ally will be well-written open source code.

~~~
bartonfink
"Write specialized string parsers in C for doing simple things you'd normally
do with a script. If you do it right, it'll be several orders of magnitude
faster."

Note that this ONLY makes sense in the context of a learning exercise. If it's
simple and you'd normally do it with a script, the performance you'd gain from
a C rewrite isn't worthwhile. The knowledge you'll gain from making C do
something it doesn't make easy, though, is.

~~~
rbranson
In most situations, I definitely concur. There are a few cases where I've had
to process >10g flat files and I whipped up a specialized tool in C that could
run through it nearly as fast as the disk could feed it.

~~~
bartonfink
Sure, but I doubt you'd seriously try to handle that with pipes and Unix
anyway. 10g warrants someone who knows what they're doing and knows, like you,
when the overhead of writing in C pays for itself in faster processing.

~~~
ansgri
Unless you're in scientific community, where it's common to have to convert
GBs of data from one weird format to another, or possibly analyzing them,
nevertheless knowing only e.g. R and Matlab.

------
scott_s
_OTOH I have given thought about if programming is really for me, I have found
that I'm really, really bad at problem solving and "thinking outside of the
box" I have come to accept that I'm really not smart. I'm slow, forgetfull,
concepts never seem to stick, I have to force myself to not take things for
granted, it seems no matter how hard i try I can't look at problems from
different perspectives and understand the implications of a particular
solution, I'm starting to think I may have a learning dissability, or that is
because I lack the basic toolkit for problem solving, but I really think I'm
just not very smart._

I doubt this is true. Rather, I think your currently ad-hoc way of trying to
learn things is not effective. In other words, it has been your method, not
you. One of the benefits of a formal education is knowing what is out there,
even if you don't know it yet. (Knowing what you don't know.) That means you
can go and learn it as you need to.

I suspect your difficulty with "thinking out of the box" is that you just
haven't been exposed to alternate ways of doing things.

My point: you're not stupid. Learning all of this stuff even when someone says
"this is what you should learn" is hard. Learning it when you have to figure
out _what_ to learn is even harder. Many people here will disagree with me,
but I think a formal education is valuable for the reasons I stated. But, you
said that's not an option for you now. So I recommend doing basically what
you're doing: use existing textbooks to find out what you should learn, and
learn it. Treat going through those books like a course. Many university
courses also have the course syllabus online - looking through those for
topics you should research yourself is also valuable. And, of course, MIT's
Open Course Ware (<http://ocw.mit.edu/index.htm>) was designed with students
like you in mind.

~~~
zandor
In addition to MIT's excellent OCW, check out Richard Bucklands courses over
at UNSW. I personally really like his teaching style, although it may be
somewhat too informal for others.

<http://www.youtube.com/user/UNSWelearning#p/p>

------
edw519
_I lack the fundamentals of Computer Science, the things every programmer
should know: Algo's, Data Structures, Operating Systems an understanding of
compilers and being profficient with linux._

Relax. That's true for 99% of all programmers.

 _Eventually I plan on going back to a real University and getting a CS
degree_

Absolutely not necessary. You will probably learn more building _anything_
than learning it in school.

 _I'm starting to think I may have a learning dissability_

Maybe you do, maybe you don't. Just because the rest of the world is quick to
diagnose everything doesn't mean you have to.

 _I have come to accept that I'm really not smart. I'm slow, forgetfull,
concepts never seem to stick_

Your performance shortcomings could be for many reasons. Being "really not
smart" is the _least likely_ of any of them. They are much more likely caused
by other things like uninteresting work, poor environment, personal issues,
nasty people, or even health issues. Whether you're "smart" or not, thinking
that your aren't is pretty much a guarantee for failure. Please don't do that.

 _I have started going through the basic Algo's and Data structures again with
a basic Java book about algorithms_

Sorry to say, but you're just doing it the hardest way you can. You don't need
a book; you need a _project_. I (like many others here, I'm sure) have
achieved much, but have always had difficulty learning from books and theory.
It's hard! You need to find work where the things you need to learn will be
required. Funny how quickly and easily you'll find a way to learn them when
you actually need them. I'm not sure _how_ you should go about finding such
work, but I imagine many responses in this thread do.

 _I just don't want to be a cargo cult programmer anymore._

Good. That makes your normal.

 _And finally trying to memorise all those linux commands I ALWAYS forget._

Then use less commands. I have never used more that 10% of what was available
in _any_ technology and I always got the job done.

 _I have to force myself_

This is the most important thing you have said.

Have you ever actually enjoyed building stuff? Have you ever gotten really
"jazzed" about the project you were working on? Have you ever leapt up out of
your seat and danced when you got something working?

If you answered "yes" to any of these questions, then you really do have the
passion to be a programmer. Stop selling yourself short and listen to the
great advice you're sure to get here from fellow Hacker News'ers.

If you answered "yes" to none of these questions, then there's no sense for
you to continue wasting your time searching for the passion. If you haven't
experienced any by now, then you probably never will. No one should have to
"force themself" to love what they're doing. Find something else.

P.S. Sorry about your father. Loss affects each of us differently. And don't
worry about your English. It's fine. Please give yourself your best chance to
succeed and keep us posted. Best wishes.

~~~
kenjackson
While I agree with virtually of what you said, the following statement I do
disagree with: _You don't need a book; you need a project._ (in reference to
laerning algo and data structures).

There are too many non-trivial algorithms that you are just likely to not
rediscover. Many are the result of some of the best minds in various fields
over decades. Dynamic programming isn't something that will likely just show
up in your code w/o knowing about it (it may, but probably among the more
skilled). Balanced trees almost certainly won't. Heck, even standard binary
trees probably aren't obvious to someone who hasn't thought about the problem.

And definitely not things like the Fast Fourier Transform or stability of
Gaussian elimination, etc...

I'd at least recommend spending a weekend reading a pragmatic algorithms book
like Sedgewick, <http://algs4.cs.princeton.edu/home/Algs4Flyer.pdf>.

Have a project that you're working on too, but don't do it without also
learning algorithms and data structures more formally. Otherwise you'll end up
finding a lot of poor solutions for problems that have known good solutions.

~~~
edw519
_There are too many non-trivial algorithms that you are just likely to not
rediscover._

I agree, but would also (respectfully) ask, "So what?"

OP needs to learn to crawl, then walk, then run. And he seems like a great
candidate to do all 3.

Even so, even if he works 30 years having a ball delivering great product to
satisfied customers, he may never encounter "Fast Fourier Transform" or
"stability of Gaussian elimination".

I think of "advanced" subjects like dynamic programming, functional
programming, and even algorithms and low-level code like mountaineers think
about Mount Fuji: A coward never climbs it. A fool climbs it more than once.

I haven't written a b-tree traversal in 10 years and hope I never do again.
I'd rather stand on the shoulders of new giants and get other cool stuff done.

OP's not there yet. Give him time.

Also, he needs a _reason_ to learn this stuff. "Because I need it for this
project" is a better reason then "Because everybody else is doing it and I
think I need to, too".

~~~
cabalamat
>> There are too many non-trivial algorithms that you are just likely to not
rediscover.

> I agree, but would also (respectfully) ask, "So what?"

Well, if you're trying to sort big arrays with bubblesort, you may have to
wait a long time...

~~~
Jach
<http://warp.povusers.org/grrr/bubblesort_eng.html>

>Teaching bubble sort as some kind of "basic sorting algorithm" has real-life
negative consequences. This is a real-life example: this is a piece of code in
the gnu flex program:

    
    
        /* We sort the states in sns so we
         * can compare it to oldsns quickly.
         * We use bubble because there probably
         * aren't very many states.
         */
        bubble (sns, numstates);
    

>There's absolutely no rational reason why bubble sort was used here instead
of insertion sort. Bubble sort can only be slower, and it's not in any way
easier to implement.

~~~
cgoddard
Actually for small values of n, an n^2 sort can be quicker than an nlogn sort,
depending on how it is implemented.

~~~
Jach
Yeah, hence insertion sort (the best n^2 sorter) is used to speed up quick-
sort. It's insane to think of using bubble sort for the same task. (And for
n=2, you don't need a sorting algorithm.)

------
jfm3
"Teach Yourself Programming in Ten Years"

<http://norvig.com/21-days.html>

"Structure and Interpretation of Computer Programs"

<http://mitpress.mit.edu/sicp/full-text/book/book.html>

~~~
cynicalkane
1) Ctrl-F Structure and Interpretation of Computer Programs

2) Upvote

3) Post reply. SICP is not only the best textbook on computer programming, but
one of the best textbooks I've read on any subject. The first three chapters
will teach you more than most programmers ever learn, in such a way that you
can apply it to any language.

~~~
igneous4
> in such a way that you can apply it to any language

After working through some of SICP, would you recommend then using Scheme for
practical projects?

------
huxley
Take a crack at Python and Ruby (or another language if you prefer) just to
widen your experience, even if you stick to Java it will be good for you as a
developer. I did the migration from Java to Python a few years back and I'm
still learning and unlearning, so don't get discouraged.

One bit of advice: Try to learn a bit about proper testing as you are learning
your new language, it will be easier than trying to do it after you've learned
and testing will help you build confidence in your abilities in the new
language.

Two good books:

"Learn Python the Hard Way" by Zed Shaw
[http://learnpythonthehardway.org/static/LearnPythonTheHardWa...](http://learnpythonthehardway.org/static/LearnPythonTheHardWay.pdf)

and/or

"Why’s (Poignant) Guide to Ruby" by _why <http://mislav.uniqpath.com/poignant-
guide/>

Most non-rockstars forget Unix commands, it's not a big deal and you can help
yourself by writing up a cheatsheet or googling for one. Practice and muscle
memory helps.

I haven't had a chance to check it out but there is a PacktPub book on Python
algorithms which looks interesting: "Python Algorithms: Mastering Basic
Algorithms in the Python Language" by Magnus Lie Hetland

Good luck!

~~~
bps4484
I'd just like to second what huxley said about not getting down on yourself
for forgetting unix commands. If unix hacking isn't mission critical to your
job you tend to not get the reps in these commands to make them automatic.
Make google your best friend and if you have to look through a chmod or
crontab tutorial every few months, it's not the worst thing in the world.

------
jawn
People are not born with the ability of a Djikstra or whomever you idolize. It
takes decades of diligent practice to get to that point.

Do not feel down about feeling stupid or inadequate, just keep working in a
reasoned manner towards your goal.

You will get there.

~~~
trafficlight
Also, don't get discouraged by all the amazing projects you see on the
internet. I used to feel that I would never be any good because I would spend
all day looking at the latest thing on Hacker News and know that I couldn't
build those things. But remember that those same people spent years developing
their specific set of skills. It didn't just happen overnight.

------
Goosey
I feel similar to you. I wonder if being on HN is healthy for me. It exposes
me to lots of new concepts and technologies, but only on a very superficial
level since I am not diving into it... And it has a cost of feeding into an
inferiority complex.

I have almost entirely started to avoid facebook for this reason. You always
just see the bright side of everyone's lives, which can make you feel
depressed if you are unsatisfied with your own. Likewise HN shows you the
cutting edge tech, the cool startup scene, and a lot of writing from some very
VERY smart people. If you don't feel like you measure up it can be an
addictive way to reinforce that feeling.

Clearly I am competing with a deeper psychological issue and the ultimate
solution is to accept myself, accept my limitations, and find peace. I am
working toward this and making some progress. But I wonder if my progress is
being hindered by such a flood of exposure of awesome like HN.

Many (most) thoughts I have had reading HN are clearly irrational. "I can't be
happy unless I am founding a startup." "I can't be happy unless I am
programming in language X." "I can't be happy unless I move to SV."

I recently severed a very close relationship because I finally accepted how
toxic it was, even if that toxicity was largely due to my own loose
boundaries. I wonder if my relationship with HN is the same thing.

tldr: HN exposes you to so much awesome that sometimes you feel like shit in
comparison. You're not.

------
stcredzero
Hello. I've started working on a project aimed specifically at people like
you. I find myself encountering folks on HN who program, who are even
_excellent_ people at what they do, but still lack enough background that they
sometimes say or upvote patently false things. (In your case, I give you much
credit for being self-aware!)

To this end, I'm planning to start "Breadth First Learning." (This is a
reference to a page on Ward Cunningham's original Wiki.)

My intention is to cover the same broad CS material as "NAND to Tetris" with
the same hands-on approach, where all the systems described are actually built
hands-on, but with a focus on the "100 Things" that a programmer actually
still uses 5 years out of school. The current goal is to produce a series of
easy, fun lessons that can be worked through by any competent programmer in a
few hours a week, over the course of 8 or 9 months. The first few lessons will
be free, and the rest of the lessons will cost a dollar or two each. The
value-add for this site, will be convenience and thoughtful presentation.
Everything will be based on Javascript, so learners can casually open a
browser page to fill in their CS knowledge gaps in their spare time.

Someone can easily gather all of the same material online, in greater depth
for free, but our goal is to provide a convenient and relaxed environment, so
filling in your background knowledge is easy, fun, and relaxing.

(I guess I should get a "coming soon" page up and gather emails. I just
thought of this yesterday, so I'm not quite there yet.)

~~~
SkyMarshal
Do post it to HN when you get an MVP, sounds interesting.

edit: and reddit.com/r/learnprogramming

------
jdefr89
You probably don't have a learning disability. You have simply come to grips
with the fact computing is inherently difficult in a lot of aspects. When you
go out and teach yourself, don't be discouraged by failure. You shouldn't read
technical books like a novel, no one does, and those who claim they do are
just lying. For more on that you can read this:
<http://web.stonehill.edu/compsci/History_Math/math-read.htm>

Which describes how math books (and other technical books by nature) should be
read and studied. Don't think after reading a paragraph, you should understand
everything. Take it slow, and take the time to work out things on your own,
the more this happens the easier it gets.

Also, whether you are good or not at problem solving, just remember that you
should be enjoying the process of solving problems, not necessarily just the
answer. It took Steven Hawking 29 years to make a big step of progress with
Black Holes. Experimenting is just as important as the thought process is.
Read something, test it, break it, try to fix it.

You also stated you had difficulty looking from new perspectives. This is
tricky, but first get your creativity flowing, then ask all of these question.
Why? How? Why Not (INSERT SOMETHING ELSE)? Will it work with this? What is the
fundamental idea? Is there a way to change the implementation of how this is
done, while still maintaining the proper outcome? Scribble down your ideas,
and play with them.

For example, I remember when I was trying to fix my indoor toy flying
helicopter after the plastic broke on one of the propellers. Instead of taping
it I asked myself, what it was exactly I was trying to do, which was reconnect
a broken plastic propeller. Then I asked myself what ways this could be done.
After fooling a bit, I decided that since it was plastic I could simply melt
it back together. You just have to learn to break things down, and chunk them
together, and play with the elements of a problem.

Keep reading, learning, most importantly have some fun.

~~~
jrookie
Thanks for your answer,

The difficult part for me is that I have to force myself to ask the questions
that you talk about, it's definitely not intuitive for me and my first
reaction is not to think about the different solutions a problem could have,
like you said I can't break a problem into chunks, and this I think is
essential to be a programmer.

~~~
htp
These are things you can't do _yet_. The _yet_ is the important part- never
forget that.

I read somewhere above that you spend a lot of time fixing bugs.
Congratulations! You're already a programmer!

To move onward and upward, the biggest thing you can do is change your mindset
from "how do I make this problem go away?" to "what is causing this problem to
happen?" At the end of the day, you'll still get those bugs fixed, but you'll
have a deeper understanding of the things that led to them in the first place.

Once you know that, breaking things down and shuffling ideas becomes second
nature.

------
stray
I know what I'm about to say will probably not go over well, but somebody
needs to say it: try a programming language that is FUN.

Java is not fun.

I'd rather walk a mile barefoot on broken, salty glass in a hailstorm than to
ever write another line of Java. At least my memory has mellowed -- I used to
really hate it.

Some suggestions:

\- Common Lisp: my current love affair. Something about the way the
parentheses sort of round off all the sharp edges, and the beautiful symmetry
of it all. After a while you can get a feel for how smoothly a form works just
by glancing at its overall shape. It feels good to build things that are
beautiful in every sense of the word.

\- Python: So easy a manager can do it. Loads of awesome libraries.

\- Racket: This probably would have been first on the list had I not
accidentally organized them alphabetically :-) In fact, I'd even go so far as
to suggest working through the book "How to Design Programs". Actually, you
know what? If you'll _promise_ to work through all the exercises in the book
and pass it along to someone else who is struggling when you're done -- I'll
give you a copy (years ago I mistakenly ordered two copies). PM me if you want
it.

~~~
SkyMarshal
Fwiw, _How To Design Programs_ is also available free online:

<http://htdp.org>

------
nudge
Kudos for discovering something important about yourself.

Your path forward probably should be determined by the kind of work you want
to do, but I think you know this.

Certainly don't be sucked into the new technologies because they're cool. Nor
should you necessarily get a CS degree, depending on the work you want to do.
You sound like you want to learn everything ever about computing, but that's a
recipe for frustration and won't necessarily help you.

But anyway, good luck.

~~~
jrookie
Thanks for your answer.

I would really like to learn more about machine learning and NLP, after
reading a bit about them I found them to be incredibly interesting subjects,
however my Math/Algorithms skills are a barrier into understanding most of the
concepts, that is why I plan on eventually getting a CS degree.

And yes I agree, it might seem like I'm trying to learn too much at the same
time, I'm just incredibly overwhelmed about all of the stuff I've been
blatantly ignorant about whilst calling myself a "programmer".

~~~
rors
I worked as a programmer for many years. I hit 30, felt bored, and am now in
graduate school studying NLP.

A lot of people in NLP are awful programmers. We have a group of ML
researchers down the corridor and they build all their models in Matlab. You
do not need to write great code to do research. It is more important to come
up with a well thought out model and then throw together a horrible
implementation to show it works.

Math is a very wide and varied subject. A lot of things you'll learn in a CS
degree are useless for ML/NLP. Many people argue that ML is just applied
statistics, with a sexy name to get more funding.

Finally I think the reason you're feeling stupid is that you're starting to
challenge yourself. I spend most of time feeling really dumb in graduate
school. Your brain is a muscle and needs constant training. You'll hit
plateaus where everything seems like gibberish. Keep it at and you'll be
surprised what you can learn.

Good luck.

------
lucisferre
It sounds like you may not be "dumb", but maybe just a beginner who is
struggling to get to the next level. Here are a few questions I'd ask first
before you decide programming is not for you.

1\. Do you work with other experienced and passionate programmers who can
mentor you?([http://chadfowler.com/2011/02/24/be-careful-of-who-you-
work-...](http://chadfowler.com/2011/02/24/be-careful-of-who-you-work-with))

2\. Do you know _how_ to learn? A lot of people assume it just comes down to
reading the material, I found this book explains the process quite well and it
is put in the context of a software developer looking to attain mastery
[http://www.pragprog.com/titles/ahptl/pragmatic-thinking-
and-...](http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning)

3\. Have you "cultivated your gurus" so to speak? Putting up a post on HN is a
great start, but continually involving yourself in discussions in the greater
community will help you to tap into a source of experienced mentors even if
you don't work with them. Find groups for topics you are interested in and
then involve yourself, ask questions, learn, then contribute to the discussion
yourself.

4\. Have you considered getting involved in some open source projects? These
are a great place to learn from others as well.

In the end learning isn't generally as simple as just reading a few books for
most people. I would consider starting with a few books on how to get your
career development and your learning process on the right track and then go
from there. Even if you do decide you're not cut out for programming, what you
learn from those books will be valuable no matter what path you choose.

The books I'd recommend:

[http://www.pragprog.com/titles/ahptl/pragmatic-thinking-
and-...](http://www.pragprog.com/titles/ahptl/pragmatic-thinking-and-learning)

<http://www.pragprog.com/titles/tpp/the-pragmatic-programmer>

[http://www.pragprog.com/titles/cfcar2/the-passionate-
program...](http://www.pragprog.com/titles/cfcar2/the-passionate-programmer)
(will admit to not reading this one but I hear very good things)

Yes I realize these are all PragPro books, what can I say, they are that good.

~~~
jrookie
Thanks for you answer, you tackle some of the other things I've been
struggling with for the last few years.

1\. I work with other experience programmers but they are not really into
"mentoring", I have been looking for someone online who can lead me on the
path of the hacker.

2.Good point, sometimes I do feel like I don't know how to learn. Thanks for
the link I will check it out.

3.This is one of my flaws...I'm not very confident in my abilities, and
frankly I never feel like I have something good enough to contribute, this is
also why I've never felt comfortable starting a blog or participating in open
source projects.

~~~
JonnieCache
_> This is one of my flaws...I'm not very confident in my abilities_

Realise that lack of confidence is just another way of saying "knows his
limitations." This is an asset that most people at your level don't have.

If you want to learn some CS, here's a concept for you: Fail Fast

<https://secure.wikimedia.org/wikipedia/en/wiki/Fail_Fast>

This concept, like many CS concepts is often generalised by hackers to life in
general. Practice makes perfect. What does practice mean? Doing things badly
over and over again until you get better. Viewed in this light, failure is an
asset. As long as you learn from it, you can see each failure as another step
on the road to success.

As I say, hackers generally take this attitude that failure is good. Strolling
into an IRC channel or message board for a particular technology and
professing your utter ignorance and incompetence concerning the matter will
likely not be met with the derision you might fear. Most people are more eager
to help the humble than the bullish.

EDIT: Also read this book before you read any actual programming books. Don't
worry when you don't understand parts of it.

<http://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach>

~~~
jrookie
Thanks,

I tried reading that Godel book and I couldn't wrap my head around it, I will
give it a second shot though.

~~~
JonnieCache
I think the best thing to do when you get to the really dense sections is just
to plough through. It reaches a critical mass of crazy notation and
mindbending logic in the middle, but once you get past that it drops back to
being relatively graspable again as he addresses different areas. At least for
a while :)

As I said, don't expect yourself to _really_ understand all of it the first
time you read it. Read it for the bits you _do_ understand, not the bits you
don't. Even if that turns out to only include the Carrol-esque dialogue, it's
worth it.

------
shawnmorel
I second SICP. I would definitely look at eh SICP video series filmed at HP a
while back: [http://groups.csail.mit.edu/mac/classes/6.001/abelson-
sussma...](http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-
lectures/)

I went through these after a rigorous college CS experience and several years
of work experience and still found "ah ha!" moments.

It's a good solid foundation in 30 or so hours. The text is also available
online for free.

------
DanielBMarkham
I think maybe your model of how a person becomes a good programmer and reality
might be far apart.

When I wanted to learn C, I bought six or seven books, some of which came with
a compiler. I read each book.

Now that probably sounds like I am a genius, sucking down information directly
from the text. But what really happened wasn't so flattering at all: I
flailed. It wasn't until the third book or so that I finally got anything to
compile, and I think it was book 4 where I figured out how the hell to read
pointers.

I really sucked at learning programming.

When I picked up C++, we were on a family vacation. The kids all played in the
pool and did fun stuff. I sat by the pool and read C++ books. If I thought C
was tough, C++ was a killer.

I finally got it, though.

Last year, when I wanted to finally learn Functional Programming (I'm 45) I
did the same thing. And this time, guess what? Even after the books I sucked.

So I started writing little projects, which also sucked. I went back and read
the books again. I wrote some more code. I still suck at it, but I suck a
little less. Perhaps in another year or two I'll consider myself proficient.

Yes, it is terribly awesome to sit down in front of a client with a tough
problem and do some wizardry on the screen and feel like the hero. I spent my
20s and part of my 30s being the super-hero star guy. I had a blast.

But that's just hot-dogging: showboating. (People do it for fun and to make
their job more like a theater performance) In reality for every one of those
times I was showboating there were hundreds of hours spent trying to figure
out what the hell was going on with something.

I think it might be easy to look at other coders who are like I was and get
the wrong impression. Yes, some folks are smarter or have a better recall than
others, but guys with huge recall ability many times get wrapped up in some
kind of minutia that's not important to the team. Everybody has flaws. This
will sound very strange to hear, but it's true: you can be the worst
programmer on a programming team and be the most valuable and critical person
there. I've seen it happen dozens of times.

The question is: are you working at making yourself better? Not how smart you
are, how you feel about programming, or any of that. Just a simple question
about what kinds of habits you have in place to continue to improve. If you
have those habits, you'll either become a better coder or eventually work out
what you're meant to do. But you have to have those habits first.

So my advice is a little less angst and a little more work. Both to you and me
:)

EDIT: By some kind of weird twist of fate I have been thinking about this a
lot recently, because I was writing a review of the best book I've ever read
that improved my coding, Code Complete.
<http://news.ycombinator.com/item?id=2263127>

~~~
aurelius
What you said about guys with huge recall ability getting wrapped up in some
kind of minutia really rang true with me.

When I first started at the place where I work now, I encountered a couple of
guys who are excruciatingly smart, and seemed to know every little detail
about a thousand random topics. They wrote excellent code, and I was really
glad they were on the team since they were part of a very small group of guys
who seemed to be the only ones who knew what was going on in terms of our code
and the direction it was going in.

But they were extremely intimidating to be around. Don't get me wrong, they
were very nice guys, but their seemingly immense intellect was scary and
humiliating. I regularly felt like a dumbass -- and I was the only one there
with a PhD (in astrophysics, no less).

Over time, I saw that these two guys regularly got caught up in the minutia of
some abstract aspect of a problem, so much so that they became annoying to
have around, and were somewhat of a hindrance in the decision-making process.
I was surprised to discover that I wasn't the only one to have noticed this. I
also noticed that neither of these guys never really seemed to produce
anything huge out of their massive intellects, and most of the big jobs were
tackled over a long period of time, with a lot of comparatively "dumb" guys
doing most of the work.

Everybody does have their flaws.

I suppose what could be taken away from this observation is that you shouldn't
waste time comparing yourself to the "genius" types. Don't put yourself down
because you're not as quick or as all-knowing as someone else. What matters
more is that you get stuff done, and that you always desire to improve
yourself AND work towards that end. You may not become "all-knowing" or
develop a huge recall ability, but the other skills that you do possess will
get better and better, and you'll be worth more than the motor mouth
"geniuses" whose ability to talk outshadows their ability to get stuff done.

~~~
DanielBMarkham
Yep. I think we easily confuse "programming" as being the technical details of
mastering and remembering thousands of little details. We find comfort in
that. When in fact "programming" is making computers solve problems for
people. The computer part and the people part of that equation are equally
important. And if you talk about "being part of a programming team" then
you're adding in all the social issues of working with other people to solve
technical problems.

We love looking at the minutia, but that's simply because we've been
indoctrinated to think of the technical part as being the "important" part.
These are all equally important. If anything, the technical part is _less_
important than the other parts (ducks). Been a lot of teams full of below-
average coders that have done some incredible things. Intellect does not equal
impact. Not even close.

------
FrankenTan
I apologize for not addressing the main question, but I'd just like to express
that I disagree that you're not very smart.

It might be a knee-jerk reaction on my end when it comes to to the whole
"maybe I'm not smart enough", but you're showing awareness of your own
(current) limits, which isn't something to speak lightly of.

What are your experiences with problem solving? It's something you learn, like
most things. You might not be able to 'think' in that fashion now, but I know
quite a few people who swear their brains and perspectives have been
reprogrammed through forcing themselves to study math despite lack of talent,
and in my own experience you can learn to flex and twist your mind much like
you can your body, even if just like with your body it might be easier or
harder in some directions.

You might however lack the aptitude which make it more fun to engage in or
otherwise lead many more savvy to programming and CS, and only you can decide
wheter this is something that slows you down or stops you dead.

When I did martial arts, I had some students who were dismissive towards their
less sports-savvy comrade since they took longer or had a harder time to learn
the basics; but what they forgot were that they'd already learned all the
periphery skills of using their body from other sports, for them it was a
simple matter of learning one more skill atop their experience and skill at
already using their bodies, the ones who were having troubles were learning
several more skillsets at once since they hadn't up to that point.

The same could apply to you, people have the opportunity to learn or
understand different things at different points in their lives; some lessons
some of my friends learned when they were 12 which other friends learned when
they were 60, partially since they hadn't had the opportunity to truly learn
or understand them until then.

I guess what I'm trying to say is, try not to be discouraged because it's
hard; it can sometimes mean you're not aware of all the things on your plate
at the moment, and even if it feels you're failing you're probably learning
something else that's also beneficial while you do.

Sorry for semi-rant, but that's the part I felt remotely competent to comment
on.

I do however agree that projects are the way to go if you wish to learn or
remember. I and my friends learn more from our personal pet projects than
we've ever done at our University.

~~~
jrookie
Thanks for your words, no need to apologize :).

------
lkozma
Others have put it more eloquently already but I can just suggest the same:
start working on a project and pick up what you need as you go. If you want to
learn Linux, do something that involves some server side work: get some cheap
web hosting account (or one almost for free on nearlyfreespeech as long as you
don't have traffic) and start compiling programs from source, set up
mod_rewrite, etc. etc. etc. Otherwise get a cheap computer, install Linux and
configure everything as you want, hunting for answers on forums. By the time
you are done, you will know more about Linux than most self-proclaimed
experts.

Don't think about algorithms, data structures and all other topics as some
huge roadblock, they really contain a lot of loosely connected topics which
are not all that difficult if you look at them one at a time with enough
patience. "What One Fool Can Do, Another Can Too". You get more out of reading
a textbook when you already know disconnected bits and pieces and you want a
more unified view.

Your writing reminds a bit of my friend who is the best guitarist I know, but
has a constant inferiority complex, because he says he "doesn't know music
theory". I don't know much about music, but if I try to get down to the
specifics of what he doesn't know, it turns out that he actually knows a huge
amount, but he still keeps repeating "if only I knew some music theory"...

------
__david__
The best thing you can do is accept an assignment for work that is over your
head. The kind of thing where you think, "I really don't think I have the
skills to do this". Get the the requirements, any documentation you need and
then just start writing. It doesn't matter if you do it wrong. Just do it.
Make a little start. Then add a little bit at a time. It'll take forever.
You'll have to backtrack constantly. But it'll be the 2 steps forward 1 step
back kind of thing. You'll inch toward your goal. And suddenly it's a few
weeks later and you're done.

I can't express to you the kind of satisfaction I've achieved when I've done
stuff I thought I had no skill for. But those first 2 weeks are _scary_! I
keep thinking, "Crap, I can't do this--I'm a fraud! Everyone is going to find
out soon. Oh, what have I gotten myself into!" And then suddenly I realize in
my brave attempt to just fake it I've actually accomplished something. My
thoughts become "I think I can actually pull this off!" It's a very cool
moment.

Diving into the deep end of the pool is the only way I've ever significantly
advanced my skill set. Reading books/papers and writing little test things can
advance your skill set incrementally, but biting off more than you can chew is
the only way I've found to level up in life.

------
penquinone
A couple of thoughts. One, there's a ton of work that doesn't need databases,
or operating system knowledge. It helps, but its not essential. Android
developers are _hot hot hot_ right now, and its not a huge system to learn
(I'm a mobile dev manager).

As mentioned before me, you can learn a lot on the job. One of the best dev's
I know never finished college either.

I am always looking up the proper syntax of commands (find -exec anyone?) It
just takes repetition and the constant thought that "maybe there's a command
that does this better".

Finally, put down the math books. Put down the compiler books. Data structures
and algorithms, sure, but those others. Bah! Now, if you want a supplementary
book that helps a ton, pick up a patterns book, preferably the "Gang of Four"
book (<http://en.wikipedia.org/wiki/Design_Patterns>). It helped me to look at
problems in a bit more of a formal sense, and it allows me to say "Oh this is
such and such a pattern" and other devs get it immediately.

Don't get discouraged. You may just need a new job where you are mentored if
you feel like your skills and experience is meaningless. Your desire to learn
and your passion for your chosen career make you a fertile ground for
training.

Good Luck!

~~~
plinkplonk
"Finally, put down the math books. Put down the compiler books. Data
structures and algorithms, sure, but those others. Bah!"

This is seriously bad advice. The converse is not necessarily good advice but
when the OP explicitly wants to be good at CS, "put down the compiler books
and read the GOF Design Patterns book" is terrible advice. The GOF DP book is
barely one step above Cargo Cult sw,something the OP is trying to flee. There
is a wide range of advice on this thread but this must be the worst(imo, ymmv
etc).

~~~
sunkan
plinkplonk - I respect your opinion, so asking this question in earnest. Mind
pointing to the best advice in the thread? I could look at the most up-voted
answer, but group think is not always right.

------
kragen
You can't possibly be taking as long as I did; see "my evolution as a
programmer": [http://lists.canonical.org/pipermail/kragen-
tol/2007-March/0...](http://lists.canonical.org/pipermail/kragen-
tol/2007-March/000849.html)

I'm obviously not in a position to evaluate your IQ, but to me you sound
pretty average. If you stick with your determination to get better, you'll be
better than average in a few years, because most people don't.

~~~
eru
Forget about IQ. To quote someone I agree with:

"Although high general intelligence is common among hackers, it is not the
sine qua non one might expect. Another trait is probably even more important:
the ability to mentally absorb, retain, and reference large amounts of
‘meaningless’ detail, trusting to later experience to give it context and
meaning. A person of merely average analytical intelligence who has this trait
can become an effective hacker, but a creative genius who lacks it will
swiftly find himself outdistanced by people who routinely upload the contents
of thick reference manuals into their brains."
(<http://www.catb.org/jargon/html/personality.html>)

------
Tycho
Some things that have greatly helped me from my time of pasting together
snippets of VBA to where I am now (nearly finished building a Ajax enabled
Python web-app that parses English into SQL):

\- go onto iTunesU or MIT OpenCourseWare (or just find them on YouTube) and
watch the video lectures. The three Stanford CS ones are excellent, and
probably give you all the theoretical knowledge you need to proceed. There's a
good one on Comoutational Linguistics which helped me get to grips with
natural language processing and grammars, but is even more relevant for
compilers (though to be honest I don't see why you need to know this unless
you plan to actually write a compiler)

\- read Code Complete. That's probably all you need to not be a 'douche bag
coder' who causes more problems than they solve

\- get into web programming. Grok HTML, it's quite simple. Next read
Transcending CSS, it might take a month but eventually you'll 'get it'. Then
work out how to do events and DOM manipulation with JavaScript (make things
happen as the user interacts with the page). You can glue on some cargo cult
jQuery here :-). THEN study Ajax - follow some of the tutorials on YouTube or
iTunesU. It's not really complex it's just bitty and confusing at first
(basically you create an XHR object on the page which acts as a halfway house
for data going to and from the server without refreshing the whole browser
page). Then finally choose a backend system like Ruby/Rails or Python/Django
or ASP.NET or PHP and practice doing stuff with it. You don't need to be a big
shot computer scientist for this web app stuff - just leverage the libraries
and frameworks and platforms that people talk about on HN, and you can create
great stuff. You just need to learn the details, which is ultimately trivial

------
lelele
> I now have found that I lack the fundamentals of Computer Science, the
> things every programmer should know: Algo's, Data Structures, Operating
> Systems an understanding of compilers and being profficient with linux.

Sorry, but I'm not proficient at everything of this (especially Linux, maths
and algorithms), and still I consider myself a talented coder. I'm very
skilled at gluing code together (gluing with skill, not throwing things
together). At the end of the day, what matters is whether you can make things
work, and nothing else.

> OTOH I have given thought about if programming is really for me, I have
> found that I'm really, really bad at problem solving and "thinking outside
> of the box" I have come to accept that I'm really not smart. I'm slow,
> forgetfull, concepts never seem to stick, I have to force myself to not take
> things for granted, it seems no matter how hard i try I can't look at
> problems from different perspectives and understand the implications of a
> particular solution, I'm starting to think I may have a learning
> dissability, or that is because I lack the basic toolkit for problem
> solving, but I really think I'm just not very smart.

I think that before learning to think out of the box, you should start to
_live_ out of the box. Join an acting class, especially one where
_improvisation_ is stressed (I recommend you find an acting school which
teaches Lecoq's method). Challenge yourself to do things you are bad at (in
the beginning, I was very very bad at acting).

Try finding similarities between things in different subjects. Read "Neruda's
Postman" by Skarmeta to learn what a metaphors are and how to find them. The
more different the areas of human activity you'll know, the better you will be
at spotting similarities and challenging your ways of doing things.

------
jedcn
Consider giving yourself a break.

You talk about going back to school, finding a new job, overcoming a learning
disability, learning computer science fundamentals: data structures,
algorithms, operating systems, software design, discrete mathematics,
compilers, and command line essentials.

I think you will feel better if you step back and focus on one thing at a
time.

...

Perhaps you should pick a new language, pick a well known introductory book
for that language, and then commit to spending a few hours after work every
day going through the book. You can do this on your Windows work computer-
don't bother to learn the ins-and-outs of a new operating system.

Read each page, type out each exercise, consider how what you're going through
relates to what you already know.

If, after a month, you're making progress and still looking forward to
spending time with the book after work, I'd bet programming is for you.

...

As a next step, find a local user group for whatever language you pick and
drop in. If they seem like nice people, if they are talking about interesting
stuff, if it is something you enjoy, keep going back.

After three months, I'd guess that you will have finished the book, you will
know a bit more about a new language, and you will have met some other people
in your area that area up to something interesting.

...

While any language and book will do, try to find something basic that you can
finish in a few months. If you're looking for a specific suggestion, you might
try ruby and <http://pragprog.com/titles/ltp2/learn-to-program>.

Take care.

------
xenophanes
Hi. It's time for you to read SICP. The book and lectures are free online:

[http://groups.csail.mit.edu/mac/classes/6.001/abelson-
sussma...](http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-
lectures/)

If you can learn SICP then you'll be in the top 5% of programmers in terms of
understanding theory, and you'll be in a position to understand if you like CS
or not. If you don't like it, then consider changing careers or setting more
limited goals (like you could program not-that-well while caring more about
the rest of your life, that's what most people do).

Do not go back to school, at least until _after_ you read SICP. SICP is the
single best thing that schools have to offer anyway.

I love Ruby and use it a lot, but if you want to understand programming then
Ruby isn't what you're looking for right now, and definitely not rails
(building a website isn't all that hard, kinda like java enterprise work).
Ruby will annoy you less than java, but it won't make you feel like you really
understand the concepts behind what you're doing.

------
sky87
The problem is, if you "try to think outside of the box", of if you "try to
remember things", you will not be able to... And if you stop and think about
when you tried to do those things, well you will probably notice that you
passed almost all the time worrying, or doing something else as useless as
that.

The point is that you shouldn't try to do something, you should do it, i.e.,
you "span" a desire in your soul and you go along the feeling, the "thinking"
is just for control, not substance... at first you will litteraly be bugged by
thoughts like "i'm not good enogh for this" etc... aknowledge the existence of
those thoughts, and then throw them away.

Yours is a post about bad self-fulfilling prophecies.

It's not really a matter of intelligence for the most part, it's only a matter
of experience.

PS.: oh, and AFTER you got rid of the bad self-fulfilling prophecies, you
could try to create some good ones :)

Good luck, you are going to need it

~~~
jrookie
Thanks for your answer.

The last thing I want is to give up again, sadly the more I try the more these
thoughts come in to my head and the harder it is to throw them away.

------
davidhollander
> _Eventually I plan on going back to a real University and getting a CS
> degree, but I'm unable to do so at the moment_

Come up with your own curriculum then. Invent homework assignments like the
following:

1\. Install a linux distribution: <http://www.ubuntu.com/desktop/get-
ubuntu/download>

2\. Install the languages you mentioned: sudo apt-get install sbcl ruby

3\. Type 'irb', 'python','sbcl' to open interpreters for Ruby, Python, or Lisp

4\. List the names of all the data structures and algorithms you've heard of
and their operations. Be sure to include hashtables and b+ trees.

5\. List the worst\best\average case runtimes for each operation.

6\. Describe a practical use case for each.

7\. Implement each by typing directly into one of the above interpreters.

You'll learn much faster, always get A's, and not have to spend any money.

~~~
htp
OP, if you make it down here: the overwhelming majority of my programming
ability comes from doing variations of what the above post says.

I didn't get much education from university, except for the occasional nagging
feeling of "I think I covered this in a class once". That usually turns into a
Google spree, where I re-teach myself whatever concept I almost-remembered.

------
neilk
Okay, you do not actually have a learning or technology problem here. You have
a psychological problem.

You have built up this idea in your head that other people are smarter than
you, and you aren't worth anything if you aren't like them. Never mind that
you're a working programmer and that you're proficient in a second language.
Apparently for you that stuff doesn't count.

To "fix" this problem you are forcing yourself to do stuff that you don't seem
to like. When you fail you blame yourself even more.

Let's take a step back here. How are you ever going to get any good at this if
you are making it so unpleasant for yourself? You've put yourself on a
treadmill that you can't get off.

Stop reading all these CS books. In fact, you should stop reading Hacker News.
Stop caring about being in a cool startup. Start caring about whether you are
enjoying your life or not.

I guarantee you that everyone you know who you think is so much smarter than
you got that way not through inherent ability, but through work. You might
have heard stories about how incompetent they were in the beginning, but I bet
you discount them and say "well, of course they're not serious about that,
this is just false modesty." No, it is _really true_.

Everyone I know who is really good started out that way. In fact I'm starting
to think that one of the prime qualities needed to become a good hacker is a
kind of willful disregard of one's own incompetence, coupled with a strong
desire to do something that's personally meaningful. In other words, you need
_hubris_.

As long as you keep measuring yourself by stuff that's personally meaningful,
you'll advance in your hacking skills -- don't worry about that. If you think
you need skills before you start something personally meaningful, you will
never, ever get anywhere.

Finally, it is perfectly okay not to be a uber-hacker. There are other things
in life worth doing. Don't adopt someone else's value system if it makes your
life worthless.

So, ask yourself what, if anything, have you ever enjoyed? What makes you lose
track of time when you're doing it? If problem-solving, math, or programming
has never been one of those things, then you'll have to look elsewhere. If you
still think you want to stick with programming, remember what I've said and
try to start over with beginner's mind. Try PHP, or Python, or Processing...
something very forgiving, and fun, and do something that YOU want to do.

If you are lucky, you might live in a city with a "hacker space". Hanging out
there might invest you with a sense of what it's like to be personally
involved with a project.

<http://hackerspaces.org/wiki/List_of_Hacker_Spaces>

Good luck.

~~~
webmat
I agree with the mindset argument.

One of the things that improves my confidence and energy tremendously is
simply to go to regular meetups. Either about technology (Ruby, Python, JS) or
more business-oriented meetups like startup-centered ones.

It's suprising what talking to passionate people can do to your spirits :-)

------
jaymc
Fear not, man. When I read this post I was like "yea, that's me" at least ten
times. Except when I went back to school I got an MBA instead of CS degree.
Anyway, tons of good advice here that I won't bother regurgitating. I just
want to chime in and say that I've been where you are. I'm still holding down
my corporate job but I am the product VP at a startup and currently working on
another project on the side. I still have MUCH to learn in the way of
hacking/coding but that's never gonna stop. Just follow the good advice you've
gotten here and keep your head up.

------
mynegation
First of all, do not ever call yourself "slow" or "not very smart". This is
just not true. I haven't realized that English is your primary language until
you mentioned it Granted, English is not my native language either, but the
point is: if you could get this far with the natural language you're
definitely have anything but the learning disability. And having a stable job
after dropping out of college is no small feat either.

Algorithms and Data structures. I have CS and Applied Math degrees, but
honestly - very rarely I have to recall the inner workings of specific
algorithms and data structures. It is useful to know how it all works, but not
as important as you may think. You can certainly follow "fake it till you make
it" approach: you need to remember memory and time complexities of the data
structures and some implications, e.g. "hash tables have asymptotically O(1)
search time but may consume more memory than red-black trees that provide
O(log(n)) search time but have guaranteed memory and search time constraints".
And so on and so forth. So go ahead and read Cormen with that in mind.

Also, my guess is that you need only as much CS as you need to become a better
software developer. I don't think you want to be a theoretical computer
scientist, do you?

In your situation I would also recommend reading following books:

"Structure and Interpretation of Computer Programs". Honestly, to CS graduate
it reads like a book for preschoolers but it is very beautifully written and
is almost zen-like. And it will definitely help you understand what
programming is about if you did not get proper formal training.

"Design Patterns". It is not a CS, but Software Engineering book. It provides
a framework for your software design skills. You can be a great programmer
without reading that book, but then you have to be exposed to a lot of
beautifully designed code, and that book will save you a lot of time.

Find a popular and stable open source project that is closest to what you are
doing now or what you want to do and read the code, look at the build
infrastructure, documentation, try to get involved and maybe even fix some
bugs, starting from simplest ones and moving up to features. You'll get a lot
of brutally honest peer reviews, just don't abuse it.

Hope that helps.

------
teichman
For remembering things: check out Anki, or any other spaced repetition system.
Rote memorization isn't the complete solution, of course, but problem solving
becomes vastly easier when the components of the solution are readily
available in your mind.

For some reason our schooling systems haven't picked up on how incredibly
useful the spacing effect is. Use it to your advantage! It has made a real
difference for me.

<http://en.wikipedia.org/wiki/Spacing_effect>

------
T-R
It's been brought up a few times on HN recently, but I think it's worth
bringing up again - Imposter Syndrome is rampant in our field. It's the reason
a lot of people drop out or don't even get into it. You're far from the only
person who feels this way.

Interviews and conversations online may lead you to feel like you need to beat
yourself into reading books on operating systems or some other specific sub-
field, but a sincere interest in things like garbage collection isn't the only
path to success. Algorithms comes up a lot because it's easier to filter for
people who know the topic well, but those people have gaps in their abilities,
too. Those topics aren't more important than things like domain knowledge or
writing maintainable code, they just aren't always as easy to recognize, test
for, or brag about.

Sure it's good to learn them, but learn them when you have some motivation to
- start writing a game and _then_ read about path-finding. Learn RegEx out of
an interest in shortening some code at work. Turning learning into hard work
by forcing yourself to learn about things that don't interest you is just
going to make learning more difficult. What's important is just that you learn
_something_ \- so relax and do something fun.

------
chirp
I can't say don't go back to get a degree, but I can speak from my own
experience that I learned more in my first 1-2 years working than I did taking
classes. CS is very centered around academia and the science of computing, not
how to program and get things done.

You forget stuff too eh? Here's a simple solution that I think everybody
should do, not just you. Take notes on what you do. Keep a little recipe book
of things you've had to look up and figure out. At least you might recognize
that you've seen the problem before and have solved it, then you can just go
to your own reference to refresh your memory. If you're diligent you'll get a
great resource in the end. Make sure if you do this to back it up.

Honestly, it sounds to me you read HN too much. There's a lot of shit on here
about what everybody thinks makes a decent programmer and it can make anybody
feel that they don't have skillz. Take it with a grain of salt. If you like
what you do, you're always interested in learning more and you realize you
don't know it all(this obviously is the exact opposite of your problem) then
that's enough.

So learn about compilers and discrete math, and FFT, etc, if only to give
yourself some familiarity with them for future reference. But please don't
force yourself to learn about all of that unless you've got a keen interest,
and learning about each subject is the goal rather than a chore that's in your
way of being a "good" programmer. Learn what you need when you need it or
you're liable to burn yourself out.

I too am sorry to hear about your dad.

Whatever you might think about you being a "cargo cult" programmer you sound
like a good guy. Good luck!

------
Behi
There are some EXCELLENT and FREE lecture videos from Stanford, MIT, Berkley,
and other universities available on iTunes U about Operating Systems,
Algorithms, and Data Structures. Each sessions is about 1 to 2 hours. So if
you do things step by step, it should be possible to watch 2 lectures per
week, 1 course per 2 or 3 months.

Here are the links:

Operating Systems and System Programming:
[http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcas...](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=354818821)

Introduction to Algorithms:
[http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcas...](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=341597754)

Data Structures:
[http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcas...](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=354818648)

There are other series available on iTunes U as well, but don't worry, relax,
do it step by step and then you might want to have a look at the rest of the
series too.

~~~
learnguy
you can also find lots of free lecture videos with free access.
<http://www.freelecturevideos.com> is one of those sites I have run into that
features lectures of all kinds.

------
poink
If you want to be a hacker, learn like a hacker. Build something you have no
idea how to build, then when it sucks figure out why and either rebuild it or
go find a new project that's more interesting/challenging.

At some point you'll be able to get a job helping people who haven't been
building stuff as long as you to avoid mistakes you've already made.

------
jonpaul
I forget shit all of the time related to programming. I then started a blog
that just documented snippets to accomplish various tasks in various languages
that I use. This way if I forget, and I do all of the time, I can refer to my
blog. Double bonus: Google indexes the content and people come by to give
alternative suggestions. Win-win.

Good luck.

------
satori99
Have you ever stuggled with any programming task you have been assigned by
your employers?

My history sounds a bit like yours (minus the family tradgedies). I am a self-
taught programmer in my mid 30s, who for years, had only the sketchiest
knowledge of advanced algorithims and data structures, but I could make-shit-
happen(tm) for my employers regardless. Hell, some of them even thought I was
genius, when I _knew_ I was a fraud.

A friend of mine, who I consider to be a 'real' software genius , once told me
"Relax, eveyone is a fraud".

She was right.

Being successful doesn't seem to have much to do with how many linux commands
you can remember, or if you can write code for a threadsafe linked list on
paper. Past projects and a github account that can be checked out by employers
are more important.

I used to get really anxious about not having not any teriary qualifications
or certificates at all, but it turns out most people who _do_ have them are
crap anyway.

------
Metapony
What does Cargo Cult programmer mean, anyway? Do you leave comments in your
code pleading "John Fromm fix this!"?

~~~
jrookie
lol not really, but I do find myself using a Java hashmaps and not knowing how
hashing works, using a regex that was copied and pasted from google without
understanding what it does, programming in java and not knowing how the GC
algorithms work, or working with threads and not knowing the basics of OS
schedulers, programming and not being proficient with bitwsie opperations...
and the list goes on, at least that is my interpretation of a cargo cult
"java" programmer.

------
fforw
Cargo cult programming means copy and pasting code from examples and
tutorials, often with a false or without deeper understanding of the code
copied.

The first remedy against that is to understand the stuff you have been
copying. That alone elevates you from cargo cult programmer to a copy and
paste programmer. Now you need to understand why copy and pasting is a bad way
to program and how to structure your code so it is better.

This is a totally different thing from learning nifty algorithms of people
being far cleverer than you are. As someone else already said, you can go a
complete programming career with happy coworkers and customers and never
really go deep into algorithms. Learning and practicing good software
engineering practice will help you more than abstract CS concepts.

------
georgecmu
_Eventually I plan on going back to a real University and getting a CS degree_

Here's a shortcut to going to a real university. Go to the courses' websites,
read the lectures and do the homeworks. If you can find a course where
lectures have been recorded (video, or even audio), so much the better.
Chances are you'll find this approach easier to follow and stick with than
working through a book. These lectures have been specifically designed to feed
students knowledge in 45-90 minute chunks, and assignments have been designed
to reinforce the lectures contents without overwhelming the students. I'm
partial to CMU CS course structure, which basically is:

1\. Intro to programming (basic Java/C++ course: principles and syntax)

2\. Intro to Data Structures and Algorithms (some theory, mostly programming
in imperative languages -- C++ or Java)

3\. Advanced Data Structures and Algorithms (more theory, but mostly
programming in functional languages -- ML)

4\. Systems level programming (systems concepts -- memory, cache, page tables,
etc; programming -- C and assembly)

5\. Algorithms (CS theory, almost no coding)

I think you can safely skip 1 and 4, and even 3, to get CS fundamentals that
would carry you far in enterprise-level programming world.

Here are materials you could start using immediately:

Data/Algo 1:

lectures:
[http://www.andrew.cmu.edu/course/15-200/s06/index/lecture_in...](http://www.andrew.cmu.edu/course/15-200/s06/index/lecture_index.html)

assignments: <http://www.andrew.cmu.edu/course/15-211/hw.html>

Data/Algo 2:

lectures: <http://www.cs.cmu.edu/~me/212/schedule.html>

assignments: <http://www.cs.cmu.edu/~me/212/assignments.html>

Algorithms

assignments, tests and lectures:
<http://www.cs.cmu.edu/afs/cs/academic/class/15451-s10/www/>

_And finally trying to memorise all those linux commands I ALWAYS forget._

Make a Linux box your primary computer at home (if you aren't allowed to do it
at work). You'll be surprised how quickly you'll memorize them.

------
mshron
It may be too late for this to be seen, but there's another point I expected
to see somewhere on here that should be said.

Read other people's code. Find small pieces of software that do the kind of
thing you would want to do that are written by people you know are talented
and see how all the parts fit together. Maybe there's one at your job, or a
well-polished but small open source project.

Run it through a call graph generator. See what they encapsulated and what
they didn't. Look at any unit tests, if they're there. Most of the real
software that I've looked at is much more about knowing how to lay out logic
than it is about particularly advanced algorithms.

Algorithms are certainly good to know, but there's a reason why computer
science and software engineering have two different names.

------
WalterSear
I think you are going about it wrong. Find things to solve that you are
excited to solve, rather than 'improving yourself'. I mean make games,
puzzles, stupid shit - whatever seems fun to program. Do it enough, and you
will start having to stretch your skills.

------
stonemetal
You might find "The Elements of Computing Systems: Building a Modern Computer
from First Principles" interesting. It is broad, it covers pretty much
everything you mention wishing to know, but somewhat shallow (It is only 350
pages after all.) So far it has hit on the somewhat less rigorous side, so it
would probably be a good fit for someone who thinks they lack mathematical
maturity.

 _I just don't want to be a cargo cult programmer anymore_ Then don't be. The
main thing to do is Practice (note: work isn't practice.) Basically build
something, but at every step of the way try different approaches and measure
the results of what happened. Every step of the way look for ways to improve
what you do.

~~~
jrookie
Yes! thanks for mentioning that book I forgot about it but I plan on getting
to it eventually, there's just so many things to learn, so many
books...sometimes I feel overwhelmed.

Thanks.

------
r250r
"... bad at problem solving ... really not smart ... slow, forgetful, concepts
never seem to stick, ..."

So you don't know everything, and you realize it. The people who are the most
stupid are those who are certain that they know everything that matters. So
you're not stupid.

You want to better yourself. Again, that's good. You're motivated.

You mention some subjects you wish to learn more about. I'd ask for advice on
which books are best. Buy those books and skim through them. Keep the book(s)
nearby; when you get into something that you need to know more about, crack
the book open and read the section. That way you can implement it as you read
about it, and you'll understand it far better.

------
navs
Mentioning Discrete Math brought back some memories. I always felt it was
unnecessary until a project required me to use math. It was trivial, high
school level math but regardless, sometimes that's all it takes for the
arrogant student to realize Discrete Math has its merits.

I can't offer any valuable expert advice since most of my programming skills
involve stitching existing tools together with very little in the way of
actual programming. Sometimes though I fall into a project that makes me
genuinely passionate about programming and all my self doubts are erased.

From one cargo cult programmer to another, good luck.

------
joh6nn
so far in this thread, there isn't a single post belittling the OP; almost
everyone has immediately stated "you're not stupid". i think that's probably
the most encouraging thing i've seen all week.

------
mcarlin
Briefly:

You have the most important problem solving skill of all (and one of the
rarer): recognition of your own limitations.

<http://norvig.com/21-days.html>

(Hopefully more later if I think of more)

Addendum: I don't feel like it's as important to take classes in computer
science. More important is to take classes in math, because math is a lot
harder to teach yourself.

Once you learn a little math (say discrete, number theory, and linear
algebra), I think you will probably have the mental toolset to think
scientifically and learn a lot of the computer science on your own.

A basic class in data structures and algorithms might be nice because it will
give you homework and fill in some gaps you might have from teaching yourself,
but after that, computer science learning _can_ be largely self directed.
Automata is a really nice class to have if you can find it, because it ties in
with the math, but it's not necessary for most industry programming.

I never took classes in optimal search algorithms, computer vision, or
statistical programming, but I've done work in each of these three things. I
taught myself as much game programming, graphics and user interface stuff as I
learned in classes. I had classes in compilers, languages, automata, AI,
robotics... these were all great, and not things I could easily have taught
myself, but they were also specialized, and haven't been so directly relevant
afterwards.

Linux is all experience; I haven't been on the job long, and I'm still
learning it. Earlier this week I found out that I was running some of our
servers to max CPU usage because I left greps running on them (didn't know the
difference between suspending a process and putting it in the background)!

Quitting is also totally cool if you can manage it. I used to be a graduate
mathematician. It was very hard to figure out that this wasn't what I was
supposed to be doing with my life... but figuring it out and leaving was the
best thing I ever did. I would have been very unhappy. Now I'm happy! I was
also extremely fortunate to have a father who was happy to support me
switching fields. Your post reminds me how important that was, and makes me
grateful enough that I think I should go call him.

Good luck, and... uh... <small voice> a hug.

~~~
mcarlin
PS If you don't live in an area with good schools that let you take classes on
the side, the best thing you can do is move to such an area.

------
Consultuing
You are not doing that bad. It took me a lot of time to discover that about
everything I've written so far is not something I'd write today.

[http://consultuning.blogspot.com/2010/10/this-code-is-
crap.h...](http://consultuning.blogspot.com/2010/10/this-code-is-crap.html)

Then I realized that realizing that you're not that good is the first step
towards becoming really good.

------
dkarl
For algorithms, have fun on TopCoder. Work problems from past competitions,
read the writeups, figure out how to solve new problems, and have fun
competing. Competing at a high level requires a lot of extraneous skills you
aren't interested in, but if you just concentrate on solving the problems,
you'll learn all you need to know about algorithms.

------
mquander
Try TopCoder. Three problems in an hour. The easy problems are sufficiently
easy that I guarantee you'll be able to do at least one or two of them, so you
won't feel like an idiot, and spending time thinking about the harder problems
will ignite your curiosity about how you could have done them, giving you a
perfect push to learn new algorithms.

------
xpaulbettsx
Keep at it - if you keep reading books and learning, you _will_ get better,
even if at the time it feels as if you're not making any progress.

You'll work and work, and it seems as if you're getting nowhere, then suddenly
one day you'll wake up and you'll look back and realize, "Wow, I really have
come a long way from where I started"

------
seddona
Firstly I'd say don't get down about it, my guess is that over a certain level
(which you are no doubt at) IQ correlates poorly with success.

What are your soft skills (social, sales etc) like? There is a real sweet spot
for people that can span both worlds. That role is a lot of fun too.

~~~
jrookie
Thanks for your words.

Sadly I have really bad social skills.

------
cabalamat
> I'm still not decided whether I should learn Ruby on rails or python or Lisp

If you're interested in learning new stuff and building web apps, you might
want to look at Groovy and Grails, because Groovy would be easier to learn for
someone with a Java background.

------
forkandwait
Don't go back to school for CS, go back to school for mathematics and take a
CS minor, concentrating in the algorithms and data structures that you are
interested in. You might learn more Unix hanging around physicists anyway..

------
bitanarch
To be good at programming, you first have to enjoy it.

Try contributing to an open source project, and make a few friends in the FOSS
community. Treat it as an art. You'll be good at it and happy eventually.

------
gsharm
Figure out what you're trying to do, convince yourself of why you're doing it
and then figure out a way to do it. Consider everything else a distraction.

------
mapster
you could be a great programmer, just need a better teacher. The fact that you
are here and asking this is reflective of some intelligence. You don't need to
be an A++ programmer - I am not - not every employee at Google is a hacker.

------
dorkonian
Thats what "enterprise" programming does to a man, you either hit the bottle
or GTFO.

------
wh-uws
Read this [http://www.andrewmunn.com/2011/01/how-to-land-an-
internship-...](http://www.andrewmunn.com/2011/01/how-to-land-an-internship-
at-a-top-tier-software-company/)

about halfway through there is a list of common things even the toughest
interviewers in the industry ask about. Read about all of those just to get a
good overview. He just talks about interships but those skills will get you
fulltime also. Trust me a bunch of people would love to have that guy full
time.

Second you have to read yegge. [http://steve-yegge.blogspot.com/2008/03/get-
that-job-at-goog...](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-
google.html)

He'll help you fill out most of the rest of what you need to know but most
importantly teach you about a subject that will make you feel alot better
about what you feel like you don't know. The interview Anti-Loop. Basically
two interviewers at a large enough company could interview each other and no-
hire each other because of the questions they would ask in an interview but
are only there because a third that has different interests interviewed both
of them.

Now you've got the basics of what you need to learn more about which is
largely data structures and algorithms.

Now you're ready to do some functional programming. learn some lisp. I happen
to be reading the excellent Land of Lisp book myself now and recommend that
also their is <http://learnyouahaskell.com/starting-out>. I'm sure there are
other free online resources other guys here will point out also

Now you can get into Norvig and SICP and go even deeper.

"Teach Yourself Programming in Ten Years" <http://norvig.com/21-days.html>

"Structure and Interpretation of Computer Programs"
<http://mitpress.mit.edu/sicp/full-text/book/book.html>

I didn't start with them because Norvig starts out discouraging you ,not that
he isn't right about how it will take time to improve just that you will be
amazed at how fast you can move when you really want it, and SICP can be
really daunting if you start with it.

Also there is a great well of books and tutorials online about all the things
you want to learn. Compliers to the cormen book you mentioned. The fact that
you tried with that book means you are on the right track and you will get it.

Also I can't forget <http://www.topcoder.com/> <http://projecteuler.net/>

and newcomer <http://www.coderloop.com/>

Those sites are places to hone your skills by working on coding problems. The
biggest thing you have to do is pick some topics/ problems _you_ are
interested in and CODE.

You'll be surprise how far you get and how fast you can get there.

~~~
eru
Good suggestions. One addition: You should learn Lisp eventually for the
macros. But for your first introduction to functional programming (or
computing in general, if you have a mathematical bent) choose something pure
like Haskell or Clean. They won't muddy the waters with side-effects, or let
you escape into assignments.

------
dstorrs
jrookie, I hear you. Except for the pain of losing your father -- which I have
been lucky enough to avoid, and I am so sorry for your loss -- I have felt all
of what you're feeling.

Mostly, I've felt it because I've (been lucky enough to and / or made it a
point to) work with really talented programmers, people who were better than
me. That is great for learning and very hard on the ego. Look at the people
you're working with and ask yourself if they are ALL super geniuses, or if
maybe some of them are simply more experienced and / or had the luxury of
being able to focus more on their studies while at school instead of having to
work and deal with the grief of losing a parent.

As to feeling like you're slow to debug and problem solve and
whatever...don't. If you have the brains and the persistence to have made it
this far as a programmer, it's very unlikely that you're actually dumb. What
you ARE, self-admittedly, is inexperienced and under-educated. It is
experience, not brilliance, that makes people fast at debugging: when you've
seen similar problems before, when you have an array of exploratory / testing
techniques that have worked for you in the past, then you too will be fast and
all the younger programmers will look up at you and go "damn, I wish I could
be as inventive as that guy."

Here's my best advice for you right now: stop focusing on learning for a while
and focus on having fun. If you find that you enjoy programming, everything
else will start to come easily. Here are some specifics on how to implement
that:

1) Start a notes file where you jot down anything that seems interesting.

2) Follow your instincts; whatever you stumble on that seems interesting, do a
bit of googling and read up on it.

3) Reading is good, but coding is God. If you don't write actual working code
for something, don't imagine that you have learned it.

4) Don't push. Whenever you get bored or frustrated with something, put it
down for a while. Go read about something else in your notes file. Or watch
TV. Or take a walk. Or whatever you feel like doing at that moment. Give
yourself permission to not be perfect; you'll find it amazingly liberating.

5) Take care of your body. This one sounds silly, but it makes a huge
difference. Sleep enough and eat right. Tired programmers are stupid
programmers and anyone who tells you otherwise is lying. The myths of super-
productive 40-hour coding runs powered by Jolt and Cheetos are just that --
myths.

6) Definitely find a project, and do it in a new language. Choose a dynamic
language for now; you can go back and learn the C/C++ memory management stuff
later. Ruby or Python would be good choices, as they are highly employable
languages that are used in both enterprise and startups. node.js would be
another good choice, but is not yet as employable. If you want a suggestion
for a project: pick a website that you like (ideally one with a public API)
and write something that pulls down data from that site and stores it to a
database.

