Hi everyone,

I am graduating as a philosophy student shortly, and want to pursue computer science / programming/ something-of-that-sort.

I am currently taking some basic math (calculus) and physics (mechanics) courses in order to obtain pre-requesits, and to develop a basic framework. My problem is that I can grasp concepts and ideas, but when it comes to solving specific problems with actual numbers, I seem to shut down. Specifically, it takes me much more time (read "hours") to solve problems that ought to take 10 minutes. This is a particularly bad thing on tests and exams.

I believe that the difficulty I am having stems from so little exposure to symbolic reasoning in the past 5-6 years. I am looking for resources, techniques and advice to "turbocharge" (to use CFAR terminology) my ability to absorb and deeply comprehend technical material, so that solving problems becomes second nature.

Thank you so much for your time,

Jeremy

New Comment
48 comments, sorted by Click to highlight new comments since: Today at 8:17 AM

There seems to be a mismatch between your description of the problem and your description of the solution. If you are already able to grasp concepts, but not to apply them rapidly, then the solution ought to be on the application side, not on the comprehension side as implied by "turbocharge [...] ability to absorb and deeply comprehend".

This being so, I suggest you practice doing problems. Lots of them. Go through your physics textbook (or calculus, or whatever) problem by problem, and do them all. Practice makes perfect.

In addition, it is my experience that people who say they grasp the concepts but can't apply them haven't actually grasped the concepts at all. I have yet to encounter anyone (including myself) who really fundamentally gets it (where 'it' may be physics, calculus, or even algebra) without doing a lot of dang problems.

Finally: It may be the case that your current learning effort is a bit misdirected. You say you want a career in a software-ish direction; you don't need to know a whole lot of either math or physics for that. You mention pre-requisites, so perhaps it is unavoidable, but any additional effort besides coursework may be better spent on programming. Which, again, you should learn by doing exercises, not reading books. Fire up emacs, write "Hello World", compile from the command line, run ditto. Iterate from there. For the sake of the absent gods do not start with an IDE or anything that hides the compilation step.

Based on JMiller's statements regarding 'prerequisites', it implies that he is seeking college-level courses in computer programming, and attempting to pass the classes to get access to the advanced Computer Programming classes in a C.S. degree. As a C.S. major, I can assure you that Calculus is considered a prerequisite to many programming courses. Computer Science is (still!) considered to be primarily a Math degree.

@JMiller: I regret to inform you that RolfAndreassen is correct in most other regards, however. If you want to learn computer programming, do programming. Academic Computer Science is purely about the theory of computers - I managed to achieve a degree in C.S. with less knowledge in how to program computers than when I started, because the entire degree is made up of math theorems stacked up on top of each other. I know how to design a computer from transistors and write a programming language and operating system for it - you might be surprised how seldom that actually comes up in the real world. ;)

If you do want to learn Theory, then by all means, focus on math. If you want to learn Programming, then you find symbolic logic more helpful - my Philosophy 101 courses on symbolic logic are far, far more helpful to me in my programming (even today!) than any of my C.S. courses ever were.

I've seen https://www.khanacademy.org/cs to be a highly valuable resource if you want to learn programming. They've got some very potent innovations there, such as an in-website programming environment. It's very nifty for beginning programmers. I'd recommend checking it out.

As I mentioned in another comment, I am not necessarily looking to become a programmer. I am more interested in big-picture design and management, but I figured that I ought to get as good fundamentals as possible first.

I'm not sure how comment notification works here, and whether you will auto-see what I say in other comments, but I am considering a career in software, but not as a programmer necessarily. I want to be more of an administrator/motivator, but I'm floundering in the dark as to how to go about gathering the necessary skills. Hence, I sort of defaulted to more school, since in Montreal university is really cheap. I'm still figuring things out :)

Thanks so much for the post.

I want to be more of an administrator/motivator, but I'm floundering in the dark as to how to go about gathering the necessary skills.

Well, then I reiterate my comment about what mathematics background you really need: All the more so. You don't need calculus to be a programmer; there's mathematical intuition and there's "coding intuition", and both are built up by practice but they are quite different skills. And a manager needs even less to know the mathematical details.

So, you may be stuck with calculus classes due to the course structure of your school, but if at your current level you can struggle through and get acceptable grades, I suggest that your marginal unit of effort is likely better spent coding. (If you're looking at a fail, or at insufficient preparation for a tougher course next year, that's a different question.) And I strongly suggest that you do not want to take courses labeled "computer science", except perhaps a very introductory one to cover data structures and big-O analysis; you want "software engineering". Possibly the courses you are taking as prereqs can be reconsidered in light of this.

For the sake of the absent gods do not start with an IDE or anything that hides the compilation step.

Could you say more about why this is important for beginning programmers?

Because, in my experience, you cannot debug anything more than one step removed from the command line; and if you cannot debug then you cannot program. If you are unable to compile, link, and run your code from the command line then you will not be able to fix it when something goes wrong on a system with a slight difference from your dev setup; and they all have slight differences from your dev setup.

Perhaps you are right wrt my belief that I understand concepts. An example of what I meant is; while explaining what a derivative is in class today, I understood rather easily what it is used for and how it works. However, as soon as numbers were put on the board, it was harder for me to interpret what was going on.

The idea of a derivative is definitely worth understanding and you can understand it without being able to do a lot of actual derivatives. Most "practice" of doing derivatives is applying a set of rules you learn for exponents, chain rule, and so on. BUT if you understand the concept, you should be able to derive some or all of these rules, which is a form of doing problems. Make sure you can derive the rule for differentiating x^n from infinitesimals, for example. That always made me happier to apply the rules without thinking I was doing something arbitrary.

This is a good suggestion for improving math skills. As you get to moderately advanced math, "Prove X" rather than "Calculate X" is often a very helpful kind of exercise to do, and is especially good for developing your mathematical intuition, that sense of where to go next that's also very useful in calculation problems.

As a philosophy major who picked up CS after graduating, I have a recommendation:

If you want to start programming, start programming. The gaps in your knowledge will become apparent when you get to a problem you can't solve BECAUSE you don't understand the math behind it, and then you can backfill. Chances are you can develop a pretty solid grasp on the basics of programming before you get to that point.

This is not to say that taking math and science beforehand is a bad thing, but often people get hung up on prerequisites to the things they want to do and never get started.

My first course on programming was an earlier version of this course on edX: https://www.edx.org/course/mit/6-00-1x/introduction-computer-science/1122

It was far and away the best online class I've ever taken. Extremely high quality, designed specifically for the MOOC format, difficult enough that I had to really work hard, but doable with enough effort.

They're actually making it a part of a CS core series that looks like it will be very comprehensive.

Good luck!

I said software, but I don't think I meant programming. I intend to be in some sort of quarterbacking/ management capacity. I think my comparative advantage lies in the intersection between technical work and leadership/social skills. I figured it would be best to learn as much as I can first.

You'll need to do some programming to get any kind of respectable job managing or leadership. Otherwise you are in marketing, and even there if you were any good you would have some technical experience informing your bullshit.

This is true.

I'm sure there's exceptions, but I doubt the market for software developer managers who haven't spent a decent amount of time programming is very large.

Seconding RolfAndreassen's comment. Quit learning concepts for a while, instead take a big pile of problems that should be solvable way below your current level of knowledge, and solve them. For example, you could Google for some 8th grade math olympiad problems, and start going through them without skipping any. If the first ten yield too easily, go up a grade; if they're too hard, go down a grade. Don't be afraid to go down as far as you need to be comfortable. After you go through a couple hundred problems, some habits should start to form.

That's a good idea. Thanks a lot.

My problem is that I can grasp concepts and ideas, but when it comes to solving specific problems with actual numbers, I seem to shut down. Specifically, it takes me much more time (read "hours") to solve problems that ought to take 10 minutes. This is a particularly bad thing on tests and exams.

I believe that the difficulty I am having stems from so little exposure to symbolic reasoning in the past 5-6 years. I am looking for resources, techniques and advice to "turbocharge" (to use CFAR terminology) my ability to absorb and deeply comprehend technical material, so that solving problems becomes second nature.

So, typically when you look at a math problem there's a process you can go through that reliably gets from the problem to the solution. Do you have a good idea what all of the steps in this algorithm are? Can you identify where you're getting stuck?

My guess is that learning how to do that will be the largest speed boost.

I suspect that watching people solve problems, interleaved with solving them yourself, is the best way to practice. It might be possible to identify the step you're bad at, and set up problems which only go through that step- but this may require cooperation from someone else to be effective.

I think the step I am worst at is not the "what am I being asked" step, but the "now that I know what I'm being asked, which formulas/ rules/ concepts am I allowed to use here" step.

I think the step I am worst at is not the "what am I being asked" step, but the "now that I know what I'm being asked, which formulas/ rules/ concepts am I allowed to use here" step.

Typically, most mathematical operations can be seen as functions that take something of type X and return something of type Y. (For example, addition might take "real plus real" and turn it into "real".) For many problems, you start out with something of type A and need to turn it into something of type D. (For example, you might have "4-1" that you need to turn into a single number.)

You can visualize this as a search problem over a network, with the benefit that you can go from both ends. You want a D, so find things that take some other argument and turn it into a D. Suppose there's only one operation you know that gives you a D, which takes a C. Now you look at operations that take an A, and see if there are any that get you closer, and find that one gives you a C. So now you can go A->C->D and be done. (The example you gave of turning "4-1=x" to "x+1=4" to "x=3" has an obvious interpretation here, and also highlights that there can be many paths through the network.)

It may help to explicitly map out the things you know how to do in a given context. This isn't exactly an example of what I mean, but here's a map which shows relationships between probability distributions.

For Newtonian mechanics, you might have a map which identifies every kind of useful unit, and the relationships between them (a distance and a velocity are related by a time; a velocity and an acceleration are related by a time; an acceleration and a force are related by a mass; a force and kinetic energy are related by a distance) and within them (momenta are related to each other by conservation of momentum). (The within relationships are often less interesting, but it can help to know that momentum and energy are conserved but distance isn't, say.)

This sort of preparation seems useful at daisychaining- you see a momentum, and you immediately have in your mind "I know how to turn this into a force, a velocity, a mass, or a kinetic energy."

As mentioned elsewhere, practice. In particular, it may be useful to look at, say, twenty problems, sketch out the necessary steps for each problem (without doing the calculations involved), and then once you've outlined all twenty go back and do the calculations and ensure you got the right answer. By focusing on doing the part you're weakest at repeatedly, you should be able to notice what your specific problems are, and it should be easier to see clumps of problems that are solved the same way.

If you get the concepts and can slowly do the problems, it likely means you need to work on "internalizing" what you know, or teaching your type 1 systems (instincts) to direct your type 2 systems (thoughtful logic) to look in more fruitful directions earlier. The only way I know to really get good at this is practice, preferably with the involvement of other people who you can race with and against (and who can show you where you're going wrong when you spend time on a bad path).

Finding people doing topcoder or other programming/puzzle contests would likely make short work of this.

Yeah, that sounds like it makes sense. Thank you.

Specifically, it takes me much more time (read "hours") to solve problems that ought to take 10 minutes.

How long can you concentrate on a single problem? Can you stay with a problem for an hour or does your mind drift?

I can concentrate for long amounts of time. A bigger problem is physical restlessness. I use a whiteboard to keep myself standing and moving, which seems to make it easier. My handwriting sucks, so it also lets me be a bit more neat.

I use a whiteboard to keep myself standing and moving, which seems to make it easier.

As far as I understand most people use paper for solving the kind of problems that you face in basic calculus. Maybe the whiteboard is making you slower.

It is always going to seem like it is too slow. You ARE learning. I got a PhD in Applied Physics from Caltech. Working together, first year graduate students would spend about 15-20 hours a week doing the homework assignments in "mathematical methods of physics" course. I worked mostly alone and drew the line at 12 hours. Whatever I had done in 12 hours I turned in. I got a C+ 1st term and I think low B's the next 2 terms.

EVERYBODY in a Caltech Physics PhD program are the kind of undergrads who ripped through Calculus including multidimensional and dfferential equations and complex analysis, in GOOD undergrad schools, at a trot. WE were now banging our heads against problems.

It was just a scale change. And we learned how to do harder problems. We learned by doing them.

I am currently coding Android Apps, sort of for work, sort of for fun. I work as an R&D engineer on the "systems" and "rf" sides, and am definitely NOT one of the Software Engineers who make up the majority of my employer's engineers. But it is hard to get a software guy to do coding for you, and coding Android is almost as compelling as websudoku. So I am hacking away at it. And I would estimate I am about 1/7 as productive as a software guy, I think what they can do in a day takes me a week. And I've been at it for pushing a year (not full time though). I have little doubt that I am as smart as these software guys. They just have YEARS of built up experience at solving software problems. It took me months to realize the code in an object, some of it could be running in one thread and some in another: the object was not what was in the thread. But now 100 things are easier with my enhanced understanding. But there are thousands of things for me still to learn. And don't get me started on UI's!

My point being, just keep doing it. The one piece of advice, spend one or two hours on a problem, and then seek help. I don't think sitting their clueless and then finally getting it after 10 hours is the most efficient way to learn, and I think this is why people at caltech did problem sets in groups. Spending SOME time searching is needed, but you learn something when you see somebody else's solution AFTER that searching hour. never just copy solutions, though, understand them as you write them down. Ideally, you would be able to do the problem a 2nd time without referring to the other person solution.

So yes, that is why we make the big bucks. A hell of a barrier to entry. A hell of a lot of intellectual capital constructed in our crania.

Enjoy!

Unless you lack aptitude for math (did you do well in high school?), it looks like you just need to fill the gaps in your basic math education and practice what you learn enough to achieve fluency. Consider walking into your nearest Kumon center and getting an evaluation, then taking your time working through their worksheets, starting from the assessed level. Their program is very instrumental, it is designed to fill the gaps and to build fluency.

As for physics, in my experience most of the trouble people have with freshman physics is due to insufficient math training, though there is an occasional person who just "doesn't get" physics.

Ok, thank you.

Is it possible you have a mental disorder or anything of that nature getting in your way? I ask because this sounds a lot like my own experiences with math classes. (I have a visual/spatial problem rather than a math problem, but having a brain that's bad at figuring out how the positions of things relate to other things makes it harder to read math problems without getting confused.)

Depending on what you want to program, it's also possible to get pretty far without a lot of math training. (Although a traditional computer science program probably would require math and physics classes.) This... might be a less thorough route, but it looks like someone can go pretty far as a developer without learning math other than what they pick up in the course of programming. (This coming from a junior undergrad programmer with two internships. So I'm not a very reliable source here. But from what I've done so far, the only things from math classes that I've found myself using for work and class projects are really basic discrete math, mostly formal logic and base 2 numbers.)

My math teacher in Hs thought I may be dyslexic, I tend to think of problems backwards and to solve 4-1 by computing 3+1, for example. I do have some trouble with directions, but nothing too debilitating.

In addition to just practicing a lot, I strongly recommend learning discrete stuff: combinatorics, basic number theory, basic discrete math, graph theory, linear algebra, algorithms, theory of computation, probability (not the theory, I mean get a book of problems), even group theory. If you really are philosophically minded, set theory and logic are good ideas too.

Some of these might sound scary, but learning the basics is not harder than calculus - get a few introductory books, and choose one you like. And pretty much everything I listed will be more useful to you in computer science / programming. I'm not saying you don't need to know calculus, it's just that studying the above will more directly teach you mathematical reasoning, as well as being of direct use in CS.

For a philosopher, I'd expect group theory to be significantly easier than intermediate calculus.

For another point of view, I disagree. But group theory is super different from calculus, so don't be surprised if one is easier for you than the other.

Ok, I'll keep that in mind. I definitely intend to expand my horizons.

Try chalkboard challenge on the brain fitness website lumosity. You have to quickly decide which of two expressions is bigger.

You could also try increasing your short-term memory (so you can keep track of what all the variable stand for) with memory exercises on http://cognitivefun.net/

Thanks for the advice!

It sounds like you have a grasp of the abstract formal math, but have an aversion to raw remedial arithmetic. In that case I would recommend diagnosing why you have that aversion. Did you take longer on your multiplication tables than you thought was acceptable? Do you feel a similar aversion to grade-school knowledge and practices? Perhaps the teacher was bad/demotivated you? Once you know what the cause is, a solution should be obvious.

I could be wrong, though. Not 100% sure what you meant by, "specific problems with actual numbers."

No, no aversion, although I sometimes feel initially overwhelmed when I see many symbols. I was one of the quickest in the class in elementary school. Didn't like or appreciate math or science in hs even though I was in the advanced group, so part of my problem stems from poor fundamentals.

Check out Tricki.

It's a repository of useful mathematical techniques. From my experience, many skills can be developed through practice.

For calculus I strongly recommend Rudin. Reading the book (~ half of it) line by line and doing the great exercises was very difficult but gave me a real insight into calculus and mathematical thinking in general.

Suggesting Rudin to an engineering or a programming student not already mathematically inclined is like offering a text in metallurgy or forest management to an apprentice lumberjack. They will learn nothing and give up in frustration almost immediately. Stewart calculus is plenty, and in some ways overkill.

I tend to jump straight into advanced when I really want to learn.

Maybe it works for you, but it is certainly not a common approach.

Thanks, I'll check em out.