> I knew nothing about data structures or algorithms but I could write a Ruby program.Now, three years later, I am taking online classes to learn about those issues. The more advanced I got, the more I needed those "basics."

Data structures are not basics. Self-balanced binary tree graphs are not basics. More basic than that would be to learn what a graph is - Euler's bridges, Dijkstra's shortest path. More basic is the initial introduction to the concept of the graph and the set in discrete mathematics (as well as other discrete subjects like logic, combinations, probablility etc.)

Algorithms are not basics. Bresenham's line algorithm is not basic. More basic is theory of computation - Turing machines, lambda calculus, mu-recursive functions. Automata theory, complexity theory, computability theory. Basic does not necessarily mean easier, sometimes the abstractions can be harder to grasp. What is the complexity of your algorithm, what's the worst case big O notated case? How is big O notation determined? Can you even know what an algorithm is, or compare algorithms without knowing these things? Then more basic than these things is the math such as calculus you may to determine some algorithms.

Frankly, if when "looking back at myself at 18, there is no way I would have made it through a CS course. I had no motivation for school" , and then you study Ruby for three months and get a job and are now taking online courses - I would be very skeptical of how deep your knowledge is.

You're honest enough about what you did. There's also nothing wrong with being in a situation where you don't have the opportunity to study CS intensively for four years under professors and grad students who have published papers in the field (although "no motivation" sounds worse than "no opportunity at the time"). There's nothing wrong with being lucky enough to bootstrap yourself to your current situation, there's everything wrong with fooling yourself that in five years, that kid in his third year of CS right now, who is dedicated to studying the things I mentioned, and who will study it next year, and who will then get a job and work for four years. In five years he will be ahead of you. He has a foundation that you don't. He will have a confidence you won't. As an interviewer I will be able to tell this.

My advice would be to look at local public colleges and see if any are good. See what their CS programs are, how they deal with night/weekend students for CS majors (some required classes may be on a weekday at 1 PM) etc. See what the pre-requisite graph is. Then take one class a semester, at night or on weekends. It will be one or two nights a week. Maybe take an easy non-CS class first like art appreciation or something. Note they often put one of the hardest courses for CS (like Calculus 101) as an initial pre-requisite for all CS classes to weed out "unmotivated" people from burdening the school CS program. Keeping on the topic of the weed-out class though - if you struggle over Calculus 101 like we CS majors did, to where you're even thinking of dropping out - wouldn't that be a sign that we were learning things in school you didn't know? It's not a laugh a minute to do Cook Turing reductions of NP problems in order to show similar properties of problems - but it does help in understanding fundamentals of CS.

It is better to think about this sooner than later. People do these things when they're in there teens or early 20s because it's easier to do then. You really don't want to have this revelation after you have a child or two, and are having trouble finding good work because of no diploma and lack of fundamentals. One bonus is the diploma is not the only payoff - even halfway through school you'll be a better programmer, more attractive to some employers, will have met interesting professors and students (if you put yourself out there) etc. You get out what you put in - professors like students who pay attention and do well, and can be helpful.