Math Nerds vs. Code Monkeys: Should Computer Science Classes Be More Practical?

RedditFacebookTwitterGoogle+Hacker NewsLinkedInEmailPinterestShare

They are the crème de la crème, the supernerds of computer science who spent four long years poring over theorems and studying algorithms and have finally achieved their degrees. Competition to hire them is fierce, with top technology firms offering ever higher salaries and outlandish perks.

But once they arrive, what can these just-hatched developers actually do? Some may have picked up a few programming languages on their own, but they were not taught these job-essential skills at school, and companies must offer them months of training before they become productive. In the meantime, creative minds in the mold of Gates and Zuckerberg are dropping out of school. Should computer science programs be less theoretical and more practical? We look at both sides of the argument.


code monkey math nerd

“I’m graduating with a computer science degree, but I don’t feel like I know how to program,” a student complained on an Internet forum, worried that his knowledge of C and Python wouldn’t suffice in the workplace. “I’ve worked hard but don’t have the confidence to go out on my own and write my own app.… If nothing turns up I will need to consider upgrading and learning more popular skills or try something marginally related like IT, but given all the effort I’ve put in that feels like copping out.”

Most of the answers on the forum amounted to Just Do It!:

  • “Throw yourself in the deep end.”
  • “Find a project, any project.”
  • “Many employers don’t care what courses are on your transcript or even what your GPA is. Instead they want to know what you can do, and especially what have you built.”

Good advice, says software engineer and author Gayle Laakmann McDowell, whose books offer tips for people looking for jobs in the tech industry. “There are library books out there; pick up some to learn the basics. Then build something on your own.” McDowell recommends sites like for students learning new programs.

Which begs the question: Why aren’t computer science students learning these skills in college? Should computer science programs teach more practical skills?

“The ideal program has theory but is backed in programming and practical applications. There are programs that are too theoretical and others that are too practical,” McDowell says. If a school is too oriented on the practical and emphasizes programming too much, students aren’t challenged on solving complex problems.

Another potential complication: “They’ll get tied too much to today’s hot language, and in 10 years, it’ll be a dead language.”

Large companies offer training to new hires, but usually newbies start writing code within two weeks, if not on Day 2.

“At Apple, I wrote code on the third day there, never having used that program before,” McDowell says. “You need to pick up coding languages easily. It’s fairly easy to learn a language if you know a couple of others.”

Computer science grads who throw themselves into the soup of real software engineering will most likely pick up the skills they need after a few weeks of nervousness.

“Coders Should Learn By Coding”

But not everyone is happy with this state of affairs. The demand for people who can code is urgent and growing every day. Is the four-year degree in computer science that most employers insist on really the best way to satisfy it?

No, says Jeffrey McManus, creator of an online course called McManus wrote a post for his personal blog entitled More Universities Should Shut Down Their Computer Science Programs.

“Computer science focuses on theory. It comes from math departments,” McManus said. Most students, on the other hand, want to learn applied software engineering, not computer science. Like McDowell, McManus says that the ideal program would offer a balance between the theoretical and the practical. But he says most computer science courses aren’t very good at teaching the up-to-date skills necessary to the field because the professors received their degrees years earlier, when tools and tactics were different. Software skills are best taught online, he argues.

“Coders should learn by coding, not by sitting in classrooms listening to lectures,” McManus says. And developers can’t expect to learn programming skills from their employers, who are increasingly less willing to invest in employee training.

Some computer science students agree. Sheldon Kreger, who studied computer science but dropped out before graduating, is now a successful web developer at He learned coding on his own and from other students, and continues to learn from colleagues.

“It’s widely understood that computer science doesn’t necessarily make you a good programmer,” Kreger says. “It gives you theoretical knowledge, but because there are so many topics, you skim through everything quickly, and a lot of people come out not being very good programmers.”

Some students he met did know programming, but they had learned it outside of school. Kreger says he learned a lot from working in groups with them.

The professors, on the other hand, were busy with administrative tasks and didn’t help with coding. And the classes? Here’s Kreger’s comment on McManus’ blog:

“Sure, I learned what a stack is and coded one up by hand, but I can learn what a stack is in about 5 minutes from a book. No client cares if I ever coded up a stack, and if I needed to for some reason, I would pull it out of a pre-existing library. But, learning about vectors, stacks, and linked lists took an entire semester, and hundreds of dollars of tuition money. Seriously?”

Don’t Fly My Plane

On the other hand, some former students think the theoretical and mathematical parts of their education are extremely valuable.

“If something starts to break and you don’t understand what’s happening, much less why it’s happening, you’re in trouble. The people who took computer science know what’s happening under the covers and can diagnose when something goes wrong,” says Jaime Torres, whose degree in electrical engineering included solving complex computing problems. He now works for data mining company ICF International doing content management and working with Sharepoint and

Torres concedes he might be able to do his job without the degree, “but I don’t think I’d be as effective,” he says. “Code monkeys” who dot the i’s and cross the t’s are necessary in today’s software-driven world, he asserts, “but to have them writing the software that’s flying my plane… I don’t want them doing that.”

The Billionaire Dropouts

Many students enter the computer science field as a route to career success. But it’s hard for them to close their eyes to the impressive roster of successful college dropouts, including billionaires Bill Gates, Paul Allen, Steve Jobs, Michael Dell, Larry Ellison, and Mark Zuckerberg.

And of course, PayPal founder and venture capitalist Peter Thiel, who told 60 Minutes that everyone thinks they need a college degree just like everyone thought they had to have a house or two during the housing bubble, but the reality is that higher education is overpriced and often unnecessary. His 20 Under 20 fellowship pays $100,000 to 20 students every year to drop out of college.

Ed Lazowska, who holds the Bill and Melinda Gates chair in computer science at the University of Washington, says that dropping out and learning on your own can work for some, but it’s not suitable for most students. One pragmatic reason is that few companies will hire software engineers without a degree.

But there’s something more fundamental, something he calls “thought skills,” acquired from working in teams and doing things, not from a programming book.

“The further out you are from a degree, the less important it is what you majored in. What’s more important is the stuff your mom told you about and you rolled your eyes: critical thinking, analysis, the ability to speak and write. Any top bachelor’s program will teach these. In the end, that’s what makes people successful.”

Few would disagree about the importance of these so-called soft skills. But while people skills and critical thinking require a group setting and life experience, colleges are turning more and more to the online world to teach skills like programming.

The Online Tsunami

More than a dozen colleges and universities, including Princeton, Stanford, the University of Pennsylvania, and Duke, are partnering this year with, a new company founded by two Stanford computer scientists that provides online courses, some of which now provide credit. Offerings are expanding, but most of the initial classes were in computer science, math, and engineering. The response has been what one professor called “a tsunami.” Last year, before the expansion, the company taught 43 courses and registered 680,000 students from 190 countries with its original partners (University of Michigan, Princeton, Stanford, and the University of Pennsylvania.)

Coursera is only a year old and is not yet self-sustaining economically, though it hopes to be at some point. Currently, its contracts state that if a revenue stream emerges, it will be shared between it and its university partners. Some colleges have questions about the program and are reluctant to climb onboard. McManus, whose company partners with the University of Victoria in Canada, says some institutions have built-in resistance to outside teachers and courses.

But given the massive interest in the program and the proliferation of sites like McManus’ CodeLesson, Codecademy, and , it seems likely that online education, whether it comes from massive-enrollment courses from Coursera or from smaller courses offered by other companies, will increasingly form part of students’ college experience, particularly when it comes to fields like computer science.

If so, practical courses offering hands-on coding experience and exposure to hot new languages could have a place on campus without interfering with basic and theoretical classroom instruction. It seems only appropriate that the debate between the theoretical and the practical in computer science education will eventually be resolved online.

See also:




  1. John Vilk says:

    Honestly, the right approach involves both theory and practice. While you really need to know how to program, you also need to know complexity theory so you can understand how your program is going to scale (both memory-wise and runtime-wise). You need to know common groups of problems so you can use well-vetted algorithms to solve them (e.g. graph coloring). You also need to be imbued with the sense that things are going to change by going over some of the history of computer science. 
    Should students be worried if they haven’t learned “language x”? No! If they have already thoroughly learned at least one other language, they should already have the tools in their mental toolkit to pick up another — it just takes some individual initiative. Many people have one specific application that they port to a new language in order to get started with it. I’ve heard things as simple as Sudoku solvers to memcached to a web server. The best part about computer science is that you only need a computer and an internet connection to expand your practical skillset. 
    But it will be much harder to independently learn all of the theoretical topics that are covered in college, where you have (assumedly) an expert to lead you by the hand through the fundamentals of the topic they are teaching. And if you find the course easy and boring, you can always approach the instructor for tips on what to study next (or to talk about what’s currently going on in that branch of CS). 
    Will you come out of college knowing everything? Heck no! You never stop learning. Ever. You will constantly be confronted with hard problems that will make you think, “I have no idea what I am doing.” But with the toolkit you’ve fostered, you should be able to chip away at it until you’ve uncovered a satisfactory solution (or have determined that the problem as-stated is impossible to solve efficiently :-). 
    So, yes, you need both. A ton of personal initiative doesn’t hurt, either — that’s the primary determinant of how much you learn.

  2. Ben Austin says:

    Great points all around John! It’s awesome to get some detailed insight from someone who is experiencing this first-hand.

  3. Hence the existence of ‘software engineering’ majors.

  4. One thing to notice is that the interviews at most top tech firms such as Google, Facebook, and the like are very theoretical. They will beat the interviewee to death with questions on algorithms, linked lists, and Big O. Even Google’s own culture statement says it all: “We hire people who are smart and determined, and we favor ability over experience.” This means intelligence in the form of IQ matters more than practical experience. Is that the best strategy. I think it seems to work for Google, but I am not sure it works for all types of companies.

  5. If you can’t think logically and frame your task in terms of data structures, and functional transformations, you’re going to have a bad time. 
    Yes, schools mistakenly believe that advanced Calculus is relevant for computer scientists. Limits are helpful, integrals not so much. Really, propositional logic, boolean algebra, set theory, and for-loops–Jesus Christ, people can’t code them worth shit, nevermind recursion, those are the main mental tools you need to program.

  6. Ben Austin says:

    Do any of you think that the fact that colleges are stretched too thin (as Teresa mentioned in her last post) plays a role in them relying more on a broad, theoretical- and math-based teaching style, rather than more specific, practical style? Or does it really just make more sense to let the schools keep their focus on theory and leave it to the employers train their new employees?

  7. StackExchange is not a “forum”, it’s a Q&A site (there are supposed to be not discussions). 
    The theory of computation is very different from programming practice. The only real problem I see is that many people think computer science is about programming, while that’s rather a side effect – and one that is valuable for jobs.  
    Imagine there would be a lucrative side effect from standing in front of a piano. Would you write an article discussing the idea of dropping the teaching-to-play-the-piano part from piano courses ‘because hey, what economy really wants is people who are good at standing in front of a piano’. 
    Lastly I have to point out that this article is written under the premise that you primarily go to university because you want money/a job. I’m not an american btw. 
    (might be posted twice now)

  8. No they should not – otherwise we’ll end up with no real programmers. 
    If you look around, you will see that real programmers who actually created something that we’re all using are programmers who were taught programming at universities – theoretical programming. 
    What we all learned at universities was how to think – we didn’t learn programming languages, we learned how to thinks as programmers, and that’s what really matters. Languages come and go, and good programming languages are also relatively easy (PS: I don’t think that C/C++ is hard), it is the logic that’s hard.

  9. i agree with itoctopus, university is important because they teach how to learn, and form where to get the information, and how to sue it. 
    of course, it’s important to be passionate about programming, but you need some guidance. if jobs, and gates dropped out, it doesn’t mean that this is ok.

  10. I disagree with many of the commenters. I dropped out of RIT’s computer science program after squeaking by Calculus I, and then being unable to pass Calculus II… and still facing Calc III and, yes, Calc IV. On top of it, the school used quarters rather than semesters. After three calculus classes, I still had no idea what calculus WAS. :-( Essentially teachers would start the class putting a bunch of symbols on the board and then manipulating them into other symbols without explaining why or how it related to the real world. That’s more a problem with math teachers, which I guess is another subject. 
    At the age of 40, I have somehow survived to this day without needing to differentiate anything. Algebra – useful. Calculus – not at all. 
    In regards to other comments: people don’t use complexity theory and advanced math to deal with scaling. They profile their programs, find the bottlenecks, and improve them, not perform calculus. Computer science theory isn’t used much in the real world. 
    With regard to existing software being written by those with traditional computer science degrees – of course. As stated, companies have only been hiring people with computer science degrees! If software companies were all owned by the KKK, you couldn’t point to their output and make the case that only white people could write software, would you? 
    And no, no one learned how to think at the university level. No one learned problem-solving skills at the university level. Such skills come way before and often determine whether one decides to go/can get in to college in the first place. Studies have been done and shown that after two years of college most students can’t write a paragraph any better, critically analyze text any better, solve logic problems any better than they could when they first entered. I’ve asked some recruiters why they require “any degree” for their position, and they trot out a similar canard about “completing a degree shows problem-solving skills, time management and determination”. This is simply an ad hoc explanation to justify the status quo, just like a lot of people here with CS degrees don’t like the idea of being told they served no purpose… people don’t like believing they made a bad choice and will often convince themselves ever more firmly they made the right one the more evidence is presented that they did not. This is shown in product surveys in which consumers who own fading/dying/failing brands (for instance, Blackberry phones) give the most fanatical favorability ratings.  
    Dan, if Gates and Jobs dropped out, it DOES mean it’s ok. People are entering college with all the learning skills they already need to teach themselves anything else they need to know. If you’ve got the brains to get into a good school like they did, you’ve got the brains to do anything else. They don’t need Jiminy Cricket’s magic feather (a degree) to make themselves believe they can perform. 
    Degrees aren’t equipping people for the workforce, workforces aren’t training and have no idea how to adequately gauge abilities (hence their reliance on degrees), and students are demonstrably no better off on critical thinking, writing and logic skills on leaving college than they were when they entered. Books and online courses show that people can learn themselves – much faster and cheaper – if they have those skills. They don’t need to become “well rounded” and waste years taking philosophy, music, and basket-weaving courses mixed in with what they really want to learn.  
    Elementary and high schools need to refocus their efforts on teaching people how to learn (as outlined in “Teaching As a Subversive Activity”). Employers need to abandon the old boys’ club of college degrees as a barrier to entry and focus on standardized skills tests for occupations. Combined with online learning, this will enable people to choose their own path to learning and not be artificially hampered by an antiquated jobs market (speaking of which, recruiters and managers need to be taught how to interview and use critical thinking themselves, as many tests show they make up their minds in seconds, are subconsciously biased by appearance, race and even ethnic-sounding names, etc.). Those who feel spending four entire years to learn stacks and basket-weaving and being saddled with $50K+ of debt will have that option, and those who immerse themselves in hands-on experience, books and/or online learning will have their choice as well.

    • Lots of anger because you did not make the cut, or that seems to be the case. Only got a Bachelor of Science myself, work as an industrial automation engineer and have learned most programming in practice, but I do think university level hard computer science is valuable. I am taking a course on Coursera and think it is a pity I never got to study computer science so theoretically and exact before.

      After dropping out you decided that if you could not beat or join them you would despise them and that people with a degree are not as smart as dropouts… Right…, and people who want to fly an F-16 but do not make it are far more suited to go into combat, of course. And you only have a hammer so now every problem is a nail, no matter what.

      I have had uses for differentiation and integration, not a lot, but I do use it once every year or two. And when I do use it, I find that it is because of a problem that somebody who did not understand higher math tried to solve by guessing a solution. Guessing a solution that has an exact mathematical solution is not really smart. I can give you really simple examples like:

      a hard control problem and a commercial PID block that is extremely hard to use and understand and has a 200 page pdf, while to write a PID algorithm can be done in something like 20 lines of code in at most 20 minutes (if you are rusty, quicker when doing it more often). So you might study the 200 page pdf that you will not understand because you do not understand anything about proportional integral differential control and totally mess up anyway. Or if you understand the very simple idea of the PID, you program it, you choose a sample time, and then approximate the right PID settings based on practical control theory. Easy.

      What will someone do who does not understand math or control theory? As found in practice: (pseudo code)

      If actual position>set position then
      speed to get to actual pos = speed to get to actual pos + 1
      end if

      this looks simple, right? and it is! too simple

      What is created this way is a sort of proportional oscillator! Which is total nonsense, because the idea of control is to get to the desired position, not oscillate. And then you get to talk to these so called “programmers” and they start attacking right away:
      all that fancy math stuff, nobody needs it, all this theoretical stuff.

      And even if you show them a PID controlled process that stays at set position or speed or temperature precisely they will not acknowledge it.

      Another really simple example of ignorance I once found was due to the fact that the “programmer” had not even mastered high school math, And I mean Pythagoras.
      It had to do with a drum that rotated around a pivot, and a cylinder with another rotating drum that moved up and down. Together they formed a triangle, and the space between the rolls had to be calculated by using a^2+b^=c^2, because steel plate would be rolled in between the rolls. The original programmer understood this, he programmed the Pythagoras’ formula application. Then another “programmer” came by, found the rollers did not position correctly, saw weird “higher math” code he did not understand, and changed it. The machine never really worked well after that. Why? Well not just because of the theoretical deficit alone, also because of a practical deficit. Code does not “wear out”, but rolls do, they had worn out, as simple as that, but he missed that because the “incredibly hard theoretical” code gave him tunnel vision before he checked the process.

      Sorry to say it but someone who cannot recognize even the simplest math in code will run into trouble someday, 100% certain (100% means it will happen). The trouble caused will have to be solved by someone! That someone will have to be a proficient programmer who understands practice and theory. One without the other is never a good idea.

      Do go back to school, do learn if you are serious about programming and problem solving. You cannot solve every problem just by using common sense, because common sense was developed to conquer everyday common problems! Really hard technical problems often have counterintuitive solutions, or they need knowledge that the smartest people in the world spent their lives on to get it.

      You could not solve control problems without what Leibniz and Newton found out. You could not build a nuclear powerplant without the knowledge Einstein, Heisenberg, Bohr and others before them discovered. You could not just build something really complicated like a car, a plane, a nuclear powerplant, a computer, a fast and efficient algorithm or a spacecraft just by using common sense.

      By not having a good education and just using common sense you can get by, sure. You can be a code monkey datatyping the thoughts and designs of others, copy pasting solutions you do not understand. But you will never come up with something new, you will never solve a really hard problem, because it takes: hard work, creativity, analysis, and domain specific knowledge that people with really high iq’s spent 10, 20 or more years on to develop.

      But then you have a hammer, good luck building planes, computer programs and fast algorithms with that.

      • It’s important to remember that there are many different types of software, and they all exist at their own levels of abstraction and require their own sets of skills.

        It just so happens that in this day and age, the most common types of software (web applications and business software) exist at a fairly high level of abstraction and do not typically include math or algorithms in their required skillsets. It is for this reason that, although your argument is both compelling and actually somewhat inspirational, the truth remains that most programmers don’t and never will need advanced math or most of the things you mentioned.

        I also disagree with the implication that people who use their own logic and intuition to solve problems (rather than learning and applying mathematical formulas developed by other people) are somehow inferior or are only capable of building trivial software.

        One of the wonderful things about these mathematical geniuses who so much of our work is built on top of is that their work enables us to focus 100% of our mental energy on using the amazing tools that they’ve developed to create even more amazing things. Like I mentioned earlier, it’s a higher level of abstraction. How productive would programmers be if we spent buckets of our time studying circuits, compilers, operating systems, etc. instead of focusing our energies on learning things that are directly applicable to what we are trying to build? Why waste energy focusing on learning how to build the tools that have already been built for you or painstakingly trying to wrap your head around all of the low level algorithms/math that has already been invented for you instead of focusing your efforts on mastering the tools at your current level of abstraction (which even for one of these “code monkeys” is no easy feat and involves things like learning algorithms, design patterns, frameworks, complex systems, servers, etc.)?

        There are already more things than you could possibly learn in an entire lifetime that are directly applicable to what you are trying to do. Learning the low level stuff/college math/reinventing the wheel might make for a good intellectual exercise or history lesson, but for most engineers will simply not be time well spent (unless, of course, your day to day work involves such things, as seems to be the case for you). Ask 90% of web developers and they will tell you the same. They’re not sitting around reading about how to implement browsers, or learning about the structure of IP datagrams or how network congestion avoidance works, or what amazing mathematics/algorithms are powering the V8 engine that runs their javascript. That stuff is interesting and kudos to those who are curious. But there’s stuff to get done, and plenty of relevant things to learn that will actually help them get that stuff done better and faster.

  11. I think learning theory is important. The abstract thinking will train the student to be good at logic.

  12. The problem is that the degree is in Computer Science. If we want graduates to know how to build software, the degree should be an engineering degree with a title like Software Engineering. You know, kind of like Mechanical Engineering which has a backing sciences of kinematics, materials science, etc. 
    If you want people to be engineers (which is what those “code monkeys” are,) they need to be trained as such. Comp Sci does not train as such.

  13. “Computer science theory isn’t used much in the real world”

    which world do you live in?

  14. A programmer knows how to use the tools. A Computer Science grad knows how to make the tools.

    • Your quote is amazing, very insightful to the dedication of a theoretical education. Thanks!

    • Yeah, but not all programmers want to build tools. A lot of us would rather use those tools to make things. You can spend time coming up with new formulas and algorithms and making tools that enable other programmers do things that previously they could only dream of. Or you could actually be one of those programmers doing those things. It all depends on what your interest is, and nobody should study something that isn’t relevant just because someone who isn’t in their industry doing the things they’re doing thinks it’s important.

      I’d rather make a game than a rendering engine. I’d rather make a web application than a network protocol. I’d rather make art than learn how to make a pencil. I’d rather be a chef than learn how to grow tomatoes.

  15. Knowledge = Power

    In business it is competitive edge.
    In employment, it means demand and little alternatives for your knowledge.

    Google is hiring top notch engineers because they can build amazing products no one else can.

    A code monkey does not have mathematical tools to cope with projects such as Google maps and other futuristic stuff.

    Code monkeys will be first to replaced by cheap outsource labor.
    Real software engineers will be the last people on earth to be replaced by something.

    • What percentage of programmers do you think are actually using advanced math/inventing complex algorithms on a regular basis in their jobs? I’m curious about what background you have that makes you so disdainful of such a huge portion of the programming population (web developers, app developers, etc.) as to not consider them “real software engineers” and instead view them as “code monkeys” who can easily be replaced by cheap labor.

      That’s completely absurd. There’s a difference between the theoretical and the practical. Ask your average math PhD to build a mobile app and it’ll probably be a piece of crap, even though he probably understands things that are way over 99% of software engineer’s heads. Learning something that’s difficult doesn’t automatically make you better at everything that’s easier. Smart developers spend time learning their craft, rather than learning things just because someone told them they should.

      Here’s a quick way to find out if you’re wasting your time learning something. Is the thing that you’re learning going to help you more than a handful of times in the next year in your job (or in any of your software projects)? No? Then you’re wasting your time. Software engineers don’t need to know how to build operating systems. People who build operating systems don’t need to know how to build circuits. People who build circuits don’t need to learn how to make new discoveries about physics/eletricity/etc. in the lab. Master your craft and learn your level of abstraction. Fuck the rest, and anybody who tells you to do something that doesn’t matter for you.

  16. Thou`the theory learned by computer scientists is not applied in the real world situation,it brightens the minds of the students and help them to approach every problem/challenge logically and they are able to derive the algorithm which will yield to the recommendable solution

  17. It isn’t only computer science but engineering as well. I remember with disgust my education for a BSEE. Virtually all math and being obscured by it’s abstractions from real world application. You won’t remember most of it! So at best it is an expensive test (to you) that sees (to them) whether you’re “save to release on the public.” Of course there are better tests where you actually learn something useful but that isn’t the way it’s done. It’s done to produce PhD’s or those that will invent/discover something new! It’s done so they really are robbing you of time and money. It’s done because they (universities) make work for themselves at your expense.

    How should it be done. Better timing on breadth versus depth. They teach things to broadly in mathematical abstractions with little depth in terms of what it means practically. When you learn to drive a car you don’t do it by becoming and automobile engineer nor a mechanic. You learn by doing. As you progress with doing you may want to go into deeper and deeper theory as needed. This enhances your basic driving skills. You may even learn as much as an engineer or mechanic because you are a do-it-yourself type and want to soup up your car and driving skills. With the education process it is the opposite, it is ass-backwards. Teaching by real-world case studies is sorely lacking.

Speak Your Mind