107

I'm a self taught programmer pushing 40 years old, and a self admitted "plumber programmer" that relies pretty heavily on APIs. I slowly play catch up on my understanding of how to properly implement data structures and algorithms, Big(O), etc., but find that my lack of Math background ends up preventing me from understanding some of the standard reading material in these areas.

I'd like to eventually have more expertise in the aforementioned CS areas. At this point in my life, I'm not sure that it's possible or practical to go back and take 2+ years of classes just to cover prerequisite math for a real algorithms book. I am a college graduate with basic algebra and statistics with B grades (ages and ages ago). No linear algebra, Calculus, Trig, etc. I've always been able to find a job as a programmer but routinely cringe as I prepare for embarrassment on the hard core CS questions.

Questions:

  1. Is it a waste of time, at this stage, to attack these weak areas? I have a mentor programmer friend who has alluded to my insecurity as being plain self-deprecation, considering I do mainly business software, and that my strengths far outweigh my weaknesses. However, I'm not satisfied with this assessment.

  2. Is there a way to 'work smarter, not harder' in this area? An alternative to just going back to school? I've been successful with self-study having had a general business background and then teaching myself to program in Java, Objective C, PHP, Python, etc.

Sorry for the long question but I feel the background information factors into my question. Thanks in advance!

47

As a fellow plumber approaching 40, my opinion is this:

  1. It is never a waste of time to improve yourself. You are only limited by the limits you impose on yourself. I am currently working with a recent CS MSc graduate, and it is sometimes depressing to see what he knows (especially in SW architecture). But it is also challenging and inspiring me to read up on those subjects.

  2. I personally have no desire to go back to school. I have been spoiled by real life, sorry. I am not talking about salaries here, I find it much more rewarding to learn something new and apply it to a real life project, instead of some homework program that will not be used by anybody except the teacher when he decides on my grade. My approach to expand my knowledge is twofold: I talk to people like my colleague who know more about the subject than me, and I read a lot.

43 accepted

Try some podcasts. Berkeley has undergraduate comp sci courses online - as do other colleges.

http://webcast.berkeley.edu/courses.php

try "data structures", "operating systems" and "structure and interpretation of computer programs" to start

Note: I just checked that link. You might have to choose a different semester to get the fill listing. (upper right hand corner). Note also that some professors are better/easier to listen to than others.

30

There are basically two types of people in the world, those who when discovering a gap in their knowledge attack it until they understand it completely or those who ignore it and are defensive when any conversation starts to veer towards their gaps.

Just you asking this question places you more in first camp which is a good thing. However, you won't be able to get past your gap in mathematics and cs-theory without putting in the time, the work, and the effort.

You admit that you are a self-taught programmer but that you lack formal education in areas of mathematics and theoretical computer science. These are subjects that I believe are the strengths for formalized education.

You've done well with your self-taught approach but I think it would only serve to benefit you to take a couple night classes at your local university. Depending on your comfort level start out with Pre-Calculus as a refresher in Mathematics then take Calculus. You won't be out of place, especially at night classes when there are a lot of older adult students. Then look at the formal CS classes you want to take. Many universities will allow you to skip all pre-requisites for a class if you don't take it for "credit". Take the major upper level CS classes (Data Structures, Algorithm Design, Compilers, Operating Systems, etc).

In about 1 - 1.5 years you could take care of your major knowledge gaps and no longer have embarrassing interview problems because of some lack of fundamentals.

19

The MIT Open CourseWare site is fantastic. They've put up course notes and assignments from a whole whack of MIT classes, and the Computer Science and Electrical Engineering ones I've looked at have been quite good.

MIT Open CourseWare

8

The key phrase here is that you'd like to do it. It sounds like you've been pretty successful doing what you want to so far without this being a problem. I'd argue that you're in the majority, most software doesn't require a strong understanding advanced algorithms or big O notation; for most work it's more important to understand specific languages and specific APIs.

It might not be practical or possible to go back and learn the CS aspect but if you'd like to i say go for it.

Before you go back to school though I'd try to understand by taking apart or reconstructing some of the things that you do know. Pick something that you use everyday but don't really understand and build it from scratch. Depending on your level, this might be a stack, linked list, hash functions, tree classes, or anything else - usually a pretty basic element though.

If it's the algorithmic side that interests you I've always found graph algorithms to be a good starting place because they are designed to be visualized. start with the difference between DFS and BFS and then head on to things like Dijkstra's algorithm.

Hope that helps, I wish you the best of luck!

7

Take one or two courses from a local school. Many offer night or weekend classes.

Remember old age and wisdom (along with treachery) beat youth and skill any day.

7

Lack of the math background gives you a ceiling on what you can do and understand.

It is possible for a self-disciplined person to go back to school at 40, 50 years of age and get a BSCS. It's hard, and it requires being financially frugal. If you support a family, it may move from practical to flat out very hard for you. The term in education for this is "non-traditional student". There is also financial help for said people.


For your specific questions:

No, it's not a waste of time. You yourself said you have to deal with these questions now. Better to know the material and not have to concern yourself with these things any more. I would also wager that it will open the doors to more interesting projects.

Yes, there are ways to evade going to full-time college here. If you have a 4-year school in your area, you should be able to take part-time classes. Alternatively, you could get a graduate student in computer science to tutor you. Alternatively, you could pick up some of the standard algorithm texts and do a DFS-style self-directed curriculum where you buy all the books with the material you need to understand the algorithms. That takes a ton of dedication and time, though.


Essentially, a formal education is a stylized method of packing up a ton of information and education into a short period of time and getting it into as many people as possible as fast as possible. Autodidacting is doable, but takes time and will waste energy, due to the lack of professional direction and instruction.


Generally, people who bash formal CS degrees don't really understand what the business of computer science is about: algorithms, abstractions, and rigorous understanding of computation and complexity. For example, it explains why multicore systems have diminishing returns on a single application.

In summation, I suggest that you talk to a local 4-year professor(2-year schools are not going to offer what you want) and explore the full or part-time student path with him. Should that not be realistically feasible, I suggest using the MIT opencourse lectures, paired with the textbooks, as a direction for your theoretical learning.

At no point do I suggest giving up. Hard work always comes before success....even in the dictionary. :-)

6

I think you would enjoy and benefit from studying Computer Science/Software Engineering and don't think it is necessary to go back to college to do it. If I were you, I would study the books and online resources available in these areas.

6

I graduated with a BS in Computer Science in 2002. I took Calc 1,2 and 3 and I think I've forgotten everything I learned in those classes. The most useful math classes were Discrete Math and maybe Linear Algebra. Taking at least Discrete Math might boost your confidence. I wouldn't recommend taking Calc unless you find it interesting.

5

You say that at this point it may not be possible to go back. You will have decide that for yourself. But, personally, I think you will get a lot out of taking Math classes, either online or attending class. Having a professor or classmates can not only help undestand better how to do certain things, but why they work and practical applications. It is never too late for school, I am also 40, and have been working towards freeing up my schedule so I can go for my masters in CS. Good Luck though, and no matter how you try to learn, you will be further ahead than you are now. So there is no losing in this scenario. Self-taught, online, or live is better than nothing.

5

Learning is a lifelong process, and I think everyone here admires your ambition to better yourself to fill in the gaps in your knowledge. There are many resources online to try and fill those gaps, and although this is not a replacement for a formal education, I think it is more than sufficient in your area of work.

Simply put, I agree with your mentor friend. I am over 40, with a CS degree, and I have never been asked a question in an interview related to big O notation. I have been asked a couple of questions about data structures, but not many, or in great detail. Programming business applications is less about extensive knowledge of how to create data structures and more about which one is the best fit for a given situation. Then using the appropriate libraries.

A strong math background would serve you well in research, graphics, scientific computing and several other areas, but business applications isn't one of them. Good knowledge of programming principles, systems integration, and a good sense of translating business requirements into design will serve you better.

4

I've skimmed the answers here and I am late to the game in posting an answer, but I think you can serve yourself well with filling in the gaps be it through formal education at a local community college (credit or credit free) or through informal means in a private setting. Either way, though, I think you need someone to help instruct you -- sitting down and hammering out a lessons in a Calc book by yourself will cure your insomnia or make you certifiable!

I find it interesting the mixed response here around the value of a math background. Some in the camp that it's not relevant, some that it is, some say one type of math over the other, etc. I wold say they're all right in some regard. There's more to CS than math, but you can go along way with a math background. I found the most recent SO podcast interesting in that Jeff/Joel discussed that trig or calculus was never used or something of that nature -- I'm paraphrasing, not quoting. I am a 38 year old programmer with formal education and I've used all of these types of mathematics: calc, trig, linear algebra, discrete math, statistics/probablitity. I've worked in factory automation and quality control, marketing and the financial sector. In those 3 industries, I touched them all -- to my surprise I might add!

I guess my overarching point is that, sure, you are able to get jobs without issue now and you're a good programmer, but by filling in the areas where you're weak, you're only going to expand the surface area of the jobs available to you! Plus, just the exercise in critical thinking aids in critical and creative thinking alike. Knowledge of the underpinnings of data structures and how computers work are of great value -- you know there IS still assembly code out there that someone will need to look at one of these days -- I've done my share already!

So, go for it! You are never too old to learn and will be better for it. Good luck in your decision.

3

just my opinion - if you have some discrete math, graph theory, and database theory, you can fake (or look up) the rest ;-)

2
  1. No, it wouldn't be a waste of time. Getting expertise here may prove useful down the road. A key point though is what level of proficiency are you seeking? Some of the basic big-O stuff isn't that complicated though it was covered in one of my first-year Calculus and Computer Science courses.

  2. I'm not sure how well this would go over, but you could likely find answers for some of the basic big-O stuff around the web and then try to deduce why it is what the answer is:

    For example, to find the largest element in an unsorted list of n elements you'd have to look at each one so it would take O(n) time to do so while in a sorted list you could get the answer immediately since it is one of the 2 ends and thus is O(1) time.

2

You're sort of assuming that a typical CS person can produce good code. I can find plenty of people who'll tell you no to that.

Calculus and trig are certainly not needed, those are just part of what a university considers "baseline" science. Linear algebra is helpful, but I think you can get all you need in a day or two of reading.

Could you point to a particular book? I'm not seeing how calculus would help you with an algorithms book. Or linear algebra really.

Now the discrete math, yes definitely a good thing to learn in this field.

How's your Design Patterns (GOF) knowledge? I'd say that that is far more important than many of the CS topics.

Maybe you should talk to some CS grads who've been out of school for 4-5 years and ask what topics they feel really helped them be a better developer. I bet discrete math will be the only topic (of the ones mentioned) here that they mention.

Edit: I'll admit that Calculus, Trig and Linear Algebra are sometimes useful. But I stand by my assertion that Design Patterns and Discrete Math apply to far more projects.

2

Lots of people "strike out" with math early -- in high school or even earlier. They decide that math just isn't for them, and never go back and try again.

I think that the last stage (never trying again) is often a mistake. Anecdotally, many of the people I've heard of who gave math another shot have been pretty successful at it, and a few found it a lot easier the second time around. If you can overcome the mental trauma of the last time you tried it, that is...

Apparently the parts of your brain you use for math are the last to mature; if so, your brain may actually be better for math than it was last time you seriously tried it. If nothing else, you've spent quite a while mulling it over; nobody knows better than you the places where you could benefit from learning the math you've been missing all these years.

If you have enough motivation for self-study, I strongly recommend you give it a shot. Decide what you want to learn, track down a couple of textbooks on the subject, and go for it. If that doesn't work, it's not actually that hard to take a few night classes; it's a very different thing from going back to school full time. Instructor quality tends to be hit-and-miss, but in my experience, the biggest advantage of a class is the structure it adds, which can leverage even modest motivation to the point where you can learn something you wouldn't otherwise get through.

2

I'll add my voice to the chorus saying that a little formal education is not so bad. Self-taught can be great, but if a class is well designed it means that somebody else has done the hard intellectual work of figuring out what is needful to know. And I'll let you in on a little secret that professors know: some students go to school for an education; others just go for a credential. It sounds like you have no interest in or need for a credential but you'd like to improve your education. Talk to people at your local university or community college. There is usually something called a non-degree student, which means you just get to learn stuff without having to worry about degree requirements. The good professors will love you. Some of the less secure professors may be uncomfortable with a student who is older than they are and has more practical experience than they have. Ignore them and don't take their classes.

The hardest part for you will be to identify a department that is imaginative enough to take an interest in you, and once there, to identify the good professors. You will not be plugged into the undergraduate rumor network, but sometimes there is a student course guide in which students give their own evaluations of the professors.

Try a course or two; with luck you'll have a great time and learn a lot. After two you can decide if you want more or if this sort of thing is not for you. But be sure to cherry-pick: take only the best courses from the best instructors. Anything else is a waste of your time.

2

Is it a waste of time, at this stage, to attack these weak areas?

Quite the opposite. The more practical experience you have the easier it is for you to see why and how the tought theory could be useful to your job as a programmer. It should turn out to be easier for you to identify and memorize the important stuff, than it is for all the other students that don't have your years of practical experience.

2

If you want to get up to speed on this stuff, self study is probably the best choice.

My two favourite math/cs books are Calculus and Concrete Mathematics. Calculus is a very difficult book to work through (one of the first questions it asks is for you to give a set of axioms/rules which define the integers), but it builds ones understanding of mathematics profoundly and doesn't require that you know anything before it. Concrete Mathematics is more rooted in computer science, focusing on things like summations, generating functions, recurrence equations and such. It does require a bit more of a background in mathematics, so I recommend reading it later. It has full solutions to all of the problems, which makes studying with it very fun. If you have the dedication, these books will do wonderful things to your mind.

2

Fake it 'til you make it!

Seriously, if you are already doing well in your field, don't sweat the details of the lack of your education. Nobody, and I mean nobody, is going to ask you the Big O questions unless you are interviewing. And even then it will be unlikely, since not many people in the field understand it as well as they claim to.

I had a good teacher who told us the story about the con man who had like 27 professions before he got caught. I mean professions like "surgeon" and "air traffic controller". Serious stuff that has serious consequences. Not that your code doesn't. It's super-important. : )

Unless, of course, you want to go back to school. I would advise going back for something you deeply love vs something you think you ought to know though.

2

waste of time. my enginnering knowledge has now rotted away, including all the fancy maths. every contract i've ever done, has not asked me regarding this area. it is just your own insecurities. market yourself where your experience is, and just forget the rest. don't even need to defend it.... don't need to know everything to kill the pig

1

I am the same age with you but in my case I was lucky that I didn't have any interruption to my education from kindergarden all the way through college. Like yourself, I pretty much learn every new technologies and languages nowadays by myself, and it's not a problem. And that's the way I want to continue for the next 25 years if I can live that long. Because for example, 2 or 3 years ago, when Ajax became a buzz word, there weren't any class you could take in any college and forget about the community college option. Microsoft might come out with a new language tomorrow, and everybody will be equal on the same playing field. The community college instructors will have to learn just like you.

Having said that, I didn't learn every subject in Computer Science while I was in school. Recently I attempted to self-teach Genetic programming and algorithm and I had a real hard time. I think I would need to learn this in a classroom of a college and not through any video streaming. Computer Vision is another subject that I don't think I could self-teach myself.

Back to your situation, If I was you, I would do the following:

  1. Take Calculus, Physics, Differential Equations, Linear Algebra in a college. Linear Algebra will help you with Graphics when you later have a chance to program with it. Learning from videos might work for you, but not for me, because learning those Math subjects require doing homework and exercises, or you won't learn as much. Calculus, Differential Equations might or might never help you with any future programming projects. They will help you understand algorithm, data structures or big O better but not directly. You will understand better because you will be a lot more analtycal. But if you have children, I think you can easily find out there are good use for having those knowledges.

  2. Algorithm, Data Structures, and those core Computer Science topics can be learned through books, online, video streaming etc. Those subjects have not changed much for the last 50 years since the beginning of the Computer Science history, but they are real important. It's the difference between you write a sortable Tree/List Control versus you throw a third party control in your app and write the event handler for the column header to sort the data in the control or use binding.

Wish I have more time and put more thought in my answer and verify every facts I stated, and review the grammar and spelling, but those are my key points. Hope that helps.

1

Understanding what's really going on will inform your decisions. You really only need the gist of it but there's such a lot to know. Donald Knuth wrote it all down for you, but his books are nigh impenetrable without that math/compsci background.

Your intuition serves you well: you must learn this stuff if you ever want to progress from tool-user to tool-maker.

1

Skimming the comments, I ran across at least one mention that calculus is unnecessary. Perhaps. However, I believe it would help you enormously to understand the concept of a limit, if you're determined to understand big-O notation and algorithm complexity, and limits are the basis of calculus. I suppose this would imply that you'll need, oh, the first month of calculus class in order to grok the things you want about computer science.

1

I'll offer a couple of points that haven't yet been mentioned:

If you're 40, in the US you can expect to be working (in most cases) until you're 67. That's 27 more years -- 2 years of education now, if it enhances your opportunity or gets you more satisfaction over those 27 years, is well worth the effort.

Having said that, the particular areas that you've mentioned, the "hard core" CS topics aren't generally used in professional, day-to-day software development. I have a CIS bachelor's degree, circa 1985, and I took two "analysis of algorithms" (undergrad and graduate level). I understood Big O notation, proof by induction, and the other concepts pretty well (A's in both courses). I haven't used any of it until recently here on SO. I've worked in businesses from manufacturing (steel, chemical), software product development, financial services/insurance to retail web sites -- I've never worked with anyone who put any business value at all on being able to formally analyze an algorithm.

If you can evaluate two methods/functions/blocks of code and determine that one is more efficient in terms of time/memory/resource usage than the other, you have the practical experience to do the job. Knowing Big O and being able to prove one is "better" than the other may get you rep on SO, but won't make a dimes difference in your salary or real ability to be a professional software developer.

Bottom line: Do what you want to do, that will make the rest of your career more enjoyable or open more opportunities.

1

It's never to late to learning something new.

I'd buy some book, listen to the podcasts and immerse yourself in the stuff. A part time degree might be a good idea.

I know people that have done part-time degrees in their late 40's.

Here we have the Open University which is great for people with careers.

Good luck

1

You just need a good book to get started. Try Programming Pearls, it has a lot of cute algorithms tricks and it's very good for beginners.

You don't need calculus to get the basics of CS. What you need is some discrete math, number theory, combinatorics and probability. You can get all the math you need from the book Concrete Mathematics, by Ronald L. Graham, Donald E. Knuth, and Oren Patashnik.

To get some practical experience with algorithms and data structures you could try websites like projecteuler.net or topcoder.com/tc . The second one has programming competitions and educational content that you could try. You can check out if competition motivates you to improve and also when you participate you get a rating so you can track your progress.

Good luck, Cosmin

1

You may buy some books about Discrete math and claculs and such things. You don't have to go back to college in my opinion.

0

I am a 26 yo CS graduate.. started programming at 10. Here are something I did and might be helpful: Write small programs on paper, stay away from computer. Write it in pseudocode or some really barebones language like C (avoid using libraries). Implement some common but simple algorithmic problems like tree traversal etc. Once done, check your loops and recursions, try making them small, learn about cyclometric complexity and big-O notation as it relates to your code. Code it up, run on a large corpus and compare your throughput with existing libraries.

0

I was told that these lectures are really good if you want to get some good theoretical understanding on programming.

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

0

Feel free to down vote but I must say some of the answers of this post are very inspiring.