14 ms·
I'm a cargo cult programmer, help me
Hello HN I come to you for help.
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 & 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.
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.
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.
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).
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.
And finally trying to memorise all those linux commands I ALWAYS forget.
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.
Hackers, I understand this is a long and boring post, filled with grammar & 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.
Thank you
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.
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".
"Programmer" I think is a little like "scientist". It used to be possible to be an expert in all things, but it's not really any more. So don't be so hard on yourself. You're like a biologist retraining as a chemist.
But since you've found something that fascinates you, go for it!
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.
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
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 http://ocw.mit.edu/index.htm) was designed with students like you in mind.
Thanks for your words.
I agree with you that formal education is valuable when you lack direction on "how" and "what" to learn as you stated.
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 http://www.youtube.com/user/UNSWelearning#p/p
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.
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 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.
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.
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.
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 http://news.ycombinator.com/item?id=2263127
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.
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.
> 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.
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.
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 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.
That particular book is listed as being released on March 21 2011. Is there something I'm missing or are you recommending his earlier books on Algorithms in C?
Any of his algorithms books. I believe he has C, Java, and Pascal. But unless you need the book right now, I'd be inclined to wait a few weeks to get this latest edition.
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".
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.
> 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.
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 http://pragprog.com/titles/ltp2/learn-to-program.
Take care.
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.)
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 http://hackerspaces.org/wiki/List_of_Hacker_Spaces
Good luck.
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 :-)
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 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.
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"...
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_index.html http://www.andrew.cmu.edu/course/15-200/s06/index/lecture_in...
assignments: http://www.andrew.cmu.edu/course/15-211/hw.html http://www.andrew.cmu.edu/course/15-211/hw.html
Data/Algo 2:
lectures: http://www.cs.cmu.edu/~me/212/schedule.html http://www.cs.cmu.edu/~me/212/schedule.html
assignments: http://www.cs.cmu.edu/~me/212/assignments.html 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/ 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.
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.
#2 is your key problem. You do not know how to learn.
As a developer, "I am but an egg". Much of the advice offered seems good, but I fear it may reinforce a key problem. It seems to me that you are trying to model the external attributes of great programmers. For example, you judge yourself based on your inability to remember command line commands. But while remembering this stuff is surely a trait of many great programmers, it is by no means essential. And those that have it, got it by accident, through their hours at the command line, not by trying to memorize all the commands.
Dude, you could learn C or Python or assembler or whatever, and I'm sure it will help, but it won't get at the core problem. The key internal attribute of a great programmer is the ability to think, and to learn. These are what you must seek. Learn algorithms or data structures or whatever, but always be learning how to learn and think.
You have had a lousy education and probably never had great teachers. This is not necessarily your fault. You must learn how to think. And this is a very hard thing, many people never do. I'm not sure of the best way to go about it.
One important thing is to trust yourself, even knowing that in your limitations, you will screw up. This is okay, if your choices are based on some clear thinking, and you can later assess that thinking for its mistakes. Because that is how you will learn.
Another is that you can learn to learn in all sorts of places. You needn't do it only at programming. Do you have hobbies doing things that come more naturally to you, or that seem simpler? Spend some time working to become great at those. You will learn problem-solving and gain confidence, and relief from the stress and exhaustion of work. Be curious about everything.
Another is to focus on principles. I suspect that Java and Windows aren't so good for this, but as an egg, I can't say for sure. I suspect open source tools are better places to learn principles. But don't try to sound like a great programmer, learn to think clearly and elegantly about programming.
Another is to start simply. Don't try to be a great programmer, don't try to do things beyond b/c that's what the great programmers do. Become able to do simple things, elegantly and properly, and then become able to do more things.
Be willing to take a step back. Maybe these Java jobs pay more? But if you aren't learning, they aren't paying anything near enough. Find a job where you can grow, and never mind the wage, that will come in time.
Understand that confusion and frustration are natural and necessary to learning. Learn to distinguish good confusion, which can lead to progress, from bad confusion, which leads nowhere. But confusion does not mean that you are stupid. If you'd had a proper education, you would understand that smart people are confused all the time. They just aren't panicked by it, because they know it signifies little about themselves, and that they will, in time, pass through it.
Take heart. Humility is a door to learning; despair is a door to nowhere. You can get there. We are all learning, many of us are still trying to recover the time we lost to mistakes and accidents. My God, if you knew what I'd give to get back the time I have wasted . . . . Find ways to enjoy today, even as you aspire to be more tomorrow. Put little bits of beauty and color in your life, always find ways and times to laugh, eat well occasionally, watch some good movies, read some good books. Frodo saw the flowers growing in the vandalized statue, Sam saw the stars above the murk of Mordor, and they knew that there was some lovely and grand above their misery, against which the misery could not forever prevail. Now maybe that's a little melodramatic, but you have to see the glimmers of hope, and know that you're hoping for something so much better that it must be possible.
This is crucial. Even if you start to learn, you are going to be in confusion and frustration for a long time. If you don't find a way to find joy in your days, it will be a long, hard slog, and you risking exhausting your spirit before you get there. "As they go through the bitter valley, they make it a place of springs". You have the courage to admit your shortcomings and the initiative to address them, this is more than a great many people. If you keep at it long enough, you will become something really special. But it's going to be a lot of work. Find moments to refresh yourself, and never, never, never give up.
Godspeed.