When Twitter Fails: Math and Programming Edition

date2014-07-15

Myself and some others had a bunch of tweets today that led to some frustration. I think the combination of many tweets, the limitations of 140 characters, and RTing without context led to a lot of confusion and talking past each other. Twitter character limits can make it really difficult to be clear about what you're saying in some cases. This seems to be one of them.

A lot of these thoughts are things I have commented on before, but this particular tweetstorm was prompted by an interesting piece by Sarah Mei entitled Programming Is Not Math. Sarah covered some of this in her post, so I know I'm retreading that ground. However, I want to try to convey what I was attempting to get across on twitter in my own words.

Disclaimer: I have a BS in computer engineering from the University of Pittsburgh (I can do math and the student loans necessary to attend CMU were unappealing). I work as a software engineer at a large software company known for their difficult, computer science intensive interview process. I am not speaking on behalf of or as a representative of said employer in this post. I don't hate math.

The Pipeline Problem

People love to talk about the pipeline problem. The pipeline is important after all. There continues to be growth in the tech sector, and we need more programmers to fill those jobs. I think the way programming is presented to young people is part of the pipeline problem.

Programming requires some math skills, but young people often don't understand the context when you say "make sure you study lots of math if you want to be a programmer." To the uninitiated (i.e. those we're trying to reach because they're not already interested in coding), this may sound like programmers sit around doing grade school style math all day. I don't know about you, but that sounds exceedingly boring. I suspect many young people think so too. That type of math is frequently taught in boring and tedious ways. Math can be fun and interesting, but this probably has not clicked yet for a good chunk of that audience. When you make a strong connection between math and programming, you may be sending the message that coding is boring and tedious. Not exactly a strong selling point.

There is also the issue of marginalized people. In many places, certain demographics are culturally conditioned to believe they are bad at math. If I had a dollar for every time I heard "women are bad at math/programming because biology," I would be a rich woman. When people tell you over and over again that people like you are bad at math, eventually you might believe it (see stereotype threat). Not only are they told they're bad at math, but they are often actively discouraged in it. They are often not given the same assistance as other students because they are seen as unworthy of the effort. I don't think it's a mystery that the demographics culturally associated with being bad at math are also underrepresented in technology. When we prime these groups with "programming == good at math", and they've been repeatedly told they're bad at math (even when they aren't), they can translate this as "I shouldn't be a programmer."

It's also notable that there are some cultural beliefs around the idea of "good at math." Many people think "good at math" means math comes naturally and easily. People who enjoy math, but have to work hard at it may be discouraged from programming by these narratives. They hear "you have to be good at math to be a programmer" and think "math is difficult for me, so I must not be good enough to be a programmer."

Does this mean we should lie to kids and pretend no math is involved? Probably not, but I think we can change how we present this information. There has to be a better narrative than "programming == good at math."

Many people lump the "logic" part of programming into "math," but that isn't going to be clear to many audiences. Explicitly calling out logic as being part of the math we do as programmers might help because it is different from a lot of grade school math.

Discussing applications for math can help people see it as interesting. Mention how math and physics can be used in programming animations and video games, and suddenly it is exciting instead of the boring stuff they're learning in school.

Talking about how we work through difficult problems a little at a time might help the kids who work at math, but don't think they're "good" at it.

Mentioning other important skills like good communication and creativity can excite kids who can bear math, but don't want it to be their primary focus. I have heard some good analogies around understanding how to put building blocks together to create something new (read: omg legos, everyone loves legos, they even have robotics kits).

There are plenty of ways to present programming to kids that don't lie to them about needing to learn math, but also don't discourage them through the "programming == good at math" narrative.

The Undergrad Computer Science Problem

Next, we get to undergraduate computer science programs. This is a tricky one, and I think the major point of confusion and frustration on twitter today.

Many computer science programs require more math than is necessary for many programming jobs in industry. I saw friends in computer science with perfectly good programming skills run into a brick wall with calculus 1 and 2 (I also saw at least one throw his calculus textbook at a brick wall in frustration). This makes me wonder how many programmers we lose because they switch majors early on after they realize they hate calculus or never go into CS thinking they can't pass a calc class.

Calculus is not required for many programming jobs in industry. I know plenty of good software engineers who rarely or never touch college-level calculus in their careers because it's not necessary for the type of problems they are solving. Most of them are still using a decent amount of math and logic, but most of it is discrete math (usually taught in a computer science curriculum) and high-school level math.

In a perfect world, maybe all programmers would be awesome at calculus. However, we don't live in a perfect world. We keep hearing over and over again how there are not enough programmers to fill jobs. A large number of software engineering jobs in industry still require a computer science (or related) degree to get hired. Some people who might otherwise be reasonable programmers don't end up with the computer science degrees necessary to fill said jobs because they have difficulty with college calculus (which is often taught horribly). Do you start to see the same problems I'm seeing?

Calculus and other advanced math skills are critical for some programming applications. I did my college co-op rotations at a company that develops engineering analysis software. If the math in their software was wrong, someone might build a product that failed and killed people. I am well aware of how important the combination of advanced math and computer programming can be. I am not suggesting we strip math entirely from computer science. That's a pretty terrible idea.

We should not remove critical skills from computer science because there are a lot of roles and applications that need those critical skills. On the flip side, there are plenty of roles and applications that DO NOT need those skills. It seems unwise to require unneeded skills for a job when organizations are having difficulty filling those roles.

I would love to see a related major or a two-track computer science program. A lot of classes could be shared between these programs (e.g. discrete math, data structures, algorithms), but they could start to diverge in areas relevant to what they want to do when they graduate. The academic/theory/whatever track could include more math and more electives that depend on that math. The industry/applications/whatever track could include more training in practical applications related to software engineering in industry. Some schools already do this with a software engineering major or something similar, but it doesn't seem to be a widespread phenomenon.

Maybe we don't even need a four-year degree for more applications-focused work. I could see something like a 1-2 year program combined with an apprenticeship working well, but that seems like an even harder sell for the industry.

Basically, I don't really know what the answer is here. What I do know is that the status quo isn't working. The status quo is not producing software engineers at the rates that organizations claim they need them to fill roles. We see this problem in the tech companies fighting over a small number of engineers who jump ship every year to get an even more ridiculous salary. We see people trying to address this (or the cynic in me says taking advantage of this) with the developer schools popping up all over the place. I wasn't trying to provide a clear solution here, just point out that all these broken pieces don't quite fit together.

Conclusion

I hope this helps clarify much more verbosely what I was (poorly) trying to get across on twitter. Maybe that helps or maybe it makes you more angry? Not sure. I guess we'll see.

P.S. Don't continue tweeting at me about how math is important in computing. I have a computer engineering degree. I took a crapload of math and applied plenty of it in my classes. I understand many of the engineering applications for math and programming. See all of the writing above for why I was talking about math and programming on twitter.