From Shakespeare to Java

Life Begins Where Your Comfort Zone Ends.

HTTPS With Jersey

I am so excited about this post! It’s a technical post! With code! I wanted to write this to help others who might find themselves in the same predicament.

This was the issue: I’m writing a DropWizard application. DropWizard uses Jersey. My application needed to take in a POST request and use the post body to make a POST request to a trusted server using HTTPS. But then this error showed up:

ERROR [2015-10-22 20:41:23,405] io.dropwizard.jersey.errors.LoggingExceptionMapper: Error handling a request: 8d10b79e51bbb14d
! java.lang.IllegalStateException: AlreadyConnected
! at sun.net.www.protocol.http.HttpsUrlConnection.setRequestProperty(Unknown Source)...

After doing a little Googling, I found out that the exception is mislabeled. Jersey shouldn’t be throwing an IllegalStateException. It should be a SSLHandshakeException. Ok, so the question is: What’s the workaround? We need to get Jersey (version 2) to accept a self-signed SSL certificate. This requires creating a class with a method we can call to help build a client with the needed configurations. I created this class exactly as Aleksandr Panzin demonstrated here.

Once I added the JerseyWithSSL class, I realized, “Hey, Aleksandr didn’t explain how to actually use it!” And so now, I provide to you the complete solution! Back in my resources class, I created a client using the JerseyWithSSL method initClient():

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import javax.ws.rs.POST;
import javax.ws.rs.client.Client;
import org.glassfish.jersey.client.ClientConfig;

@Path("/ticket")
public class Ticket

@POST
public Response createTicket(...) {
    ClientConfig cc = new ClientConfig();
    Client client = null;
    try {
        client = new JerseyWithSSL().initClient(cc);
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) { 
        e.printStackTrace();
    }

// Use client as you need...

The trick was figuring out what exactly the Configuration parameter was supposed to be in the initClient() method. An instance of ClientConfig did the trick. I’m happy to say my application works due to this code! Hopefully, it will help you if you ever come across this error.

Happy Coding!

It’s My First Day

I’m writing this blog post for women who aspire to be software engineers. What is it like on your first day on the job as a software engineer? This is my experience:

EXCITING!

I worked hard to get here. I thought graduation day was great, but my first day on the job was truly the reward. Walking into that office this morning was a very proud moment! I love all the firsts of a first day: a new computer, a new workspace, a new project, meeting new people, getting that badge to get in and out of the building (with my face on it!). It was very exciting and made the day fly by!

CONFUSED!

I’m pretty sure that from large corporation to small startup, acronyms are consistently thrown around. On my first day, as we did our daily standup meeting and then a “here’s an overview of this project,” all I could think about was counting up all the acronyms. Every department has an acronym, our project title is an acronym, and let’s face it, everything in computer science is an acronym (XML, JSON, REST, API,…). I accepted that, in time, I’d learn who/what all these acronyms stood for.

SMART!

Yeah, I did feel pretty smart. I looked through source code, writing down the classes, how they connect, what they (seemingly) do…and I felt capable! I felt I was trained pretty well at reading code, understanding it, how to look up things I wasn’t sure about…it was great!

My first day on the job as a software engineer was all I hoped it would be. I’ll report on my first week in my next blog post!

I Graduated. Now What?

UPenn Diploma

It’s official. I’ve earned my Master’s in Computer and Information Technology. It’s a wonderful and strange feeling. I certainly went out of my comfort zone, learned a new skill set, and loved every minute of it. But of course, I’m not done learning yet.

While I’ve been job hunting, I’ve been trying to learn new programming languages while strengthening the ones I know. To be honest, there really isn’t one aspect of development that I love over another. I love coding the full stack. I honestly don’t care what programming language I’m using either (well…as long as it’s not C). I stumbled upon CodeEval, a website full of programming problems. I decided to do at least one problem each day. At first, I was only doing the problems in Java since that’s my strongest language. According to my CodeEval profile, I’m one of the top 15% Java developers sitewide (out of 6,000+)! Then I realized this would be a great way to get better at coding in other languages I’m interested in. So besides a not-so-little side project in Python/Flask, I decided to start solving CodeEval problems in Python. It’s taught me a lot of the ins-and-outs of Python. I really get a kick out of successfully solving some of these intricate coding problems!

As I said earlier, I’m not partial to front-end or back-end development. I truly enjoy doing both. While looking at job descriptions, it seemed to me that many companies might actually benefit from having someone like me - someone who can code Java one day, and JavaScript the next. JavaScript and I have a funny history. Sometimes I love it (you know, when it works) and sometimes I hate it (let’s face it - sometimes JS forces you to write ugly code). But with all the frameworks to choose from, JavaScript can be tolerable, even enjoyable. I enrolled in Free Code Camp. Supposedly, it takes a year to complete, but I’m already more than half way through and I just started 2 weeks ago. It was a good brush-up on HTML, CSS, Bootstrap, and jQuery. I completed all the JavaScript lessons (through Codecademy) and now I’m doing JavaScript “bonfires” (through Free Code Camp): programming problems to get you familiar with common built-in functions like Array.split(), filter, etc.

As I started completing the JavaScript bonfires, I thought to myself, “Hmm, wouldn’t it be fun to try to solve CodeEval problems in JavaScript?”. So I tried…and I was able to do it! I’m the only one in Philadelphia who has solved any CodeEval problem in JavaScript! I AM THE FIRST! Currently, I’m in 11th place on the Philadelphia All-Time Leaderboard. I plan on getting into the Top 10 this week.

So that’s what I’ve been doing since I graduated: Improving. Job hunting. I hope the job hunting will end soon, though. As much fun as I’m having learning on my own, it’s nothing compared to when you’re completing a real project with real requirements for a real client. Hopefully my next blog post will be about my first day as a software engineer! Until next time!

Graduation in T-Minus 12 Days

The Graduate It’s been a very long time since I’ve updated this blog, so let me fill you in:

CIS 555: I have nearly completed one of the hardest courses in computer science at The University of Pennsylvania. And I’ve done really well, even though I totally struggled with some of the assignments (we have to implement what now?). Struggling is good. Struggling means you’re learning something. In 4 days, my group and I will demo our search engine that we wrote from the ground up. If we ever get it working in full (fingers crossed!). I was assigned to do the Search Engine and web interface, which is great for me. I like doing a litte bit of everything. I designed the front-end and I do a great job of communicating with databases in AWS to get results, rank them, and display them. I’m proud of my code. It’s tested, commented, and it works!

Philly Women In Tech Conference: I went to it after I snagged a free ticket. I’m really glad I didn’t pay for that ticket, because the conference was terrible. There are a lot of women who want to be grouped into the “Women In Tech” label because, let’s face it, that’s a pretty sweet label to have. I do believe, however, that women who work for a tech company in a capacity other than engineering (say: an HR rep for a tech company) are NOT “Women In Tech.” The conference was more about entrepreneurship than technical skills or the climate in the tech industry in Philadelphia. And the women who attended didn’t seem like they knew anything about tech at all. One of the sponsors of the conference, TechGirlz, an organization that tries to encourage young girls to go into tech, is stating that tech is not all about knowing how to code. It really bothers me that an organization that should be promoting computer science is now undermining it as a way to attract a wider audience. Tech is definitely about coding and coding is fun!

Graduating in T-12 days: I have my cap and gown. On a daily basis, I get e-mails congratulating me on my achievement and telling me all the last-minute wrap-ups I need to do before Commencement. It seems surreal. I haven’t actually started my job search yet. People keep telling me about opportunities and I’m just not ready to apply yet. I’m still finishing up CIS 555 - that’s my main priority. Then I need a little rest because I’ve been on edge with due dates pounding me every week for the past 2 years. I’ll regain a little sanity and then begin applying to my future employer (whoever that may be).

I have nothing but wonderful things to say about the MCIT program and my professors who have helped me along the way. I am honored to have been chosen for the program and so happy to have successfully completed it. I’m excited to see where my degree will take me!

Reinventing the Wheel (or Web Server)

My current (and final) course before I graduate has given me a new appreciation for Java packages. As developers, we use them all the time. In some cases, the more packages you know about, the more efficient and readable your code may be and the more sanity you get to keep.

My appreciation for packages has grown because the assignments I’ve had to do for this course have basically asked me to build a number of things from scratch:

  • A web server
  • An HTTP client
  • A thread pool
  • A servlet container
  • An XPath parser
  • An matcher between an XPath and an XML document.

Of course, someone has already written the code to do all of these things in Java. It’s either already built into Java or you can download a jar file to use it. But try writing these things from scratch and you’ll find that you begin to write some of the nastiest code you’ve ever written. Classes become horribly coupled, but that’s the only way to make the application work. For writing your own servlet container, the API that describes the HttpRequest and HttpResponse interface methods is lacking. But it will make you appreciate Tomcat and all the work that went into making it.

It’s amusing that as a computer science student, I have been given a repetoire of principles to code by - DRY, KISS, YAGNI - and most of my assignments force me to violate them one way or another. Sure, writing certain functionality from scratch to really understand how things work under the covers is a great learning experience. But it’s hardly simple when I could just import a package and use the classes/methods within it. Reinventing the wheel (or the web server, or the XPath parser, etc.) is a lot trickier than you’d expect.

A Year and a Half Later

My favorite poster in Towne Building

I’ve started my last course before I graduate in May. Of course, in typical Lori-fashion, I decided to take one of the hardest courses the computer science department at UPenn has to offer: CIS 555 - Internet and Web Systems. Why did I want to take such a hard course? Why not just breeze my way through some easier class instead? Because this class is a true test of all I’ve learned in the past year and a half. It will turn all of the things I’ve studied and make me apply them in challenging, new ways.

The first assignment is to build a web server from scratch. I have to write EVERYTHING. I can’t even use Java’s concurrent library to implement a thread pool. I have to do everything myself. That’s why I’m writing this blog post. Procrastinating? No, not at all. The first step is always to think it through. Make a plan. Then execute. I’m in the thinking phase, slowly making a plan.

Which is why I decided to write this blog post. I couldn’t help but think about how crazy it is that I’m actually taking this class and doing this assignment. A year and a half ago, I didn’t know how to program. I didn’t know what a “data structure” was. I didn’t know what an “algorithm” was. I didn’t know what a web server was. The internet was MAGIC. Software was MAGIC. Sometimes, I like to think about all the people on their cell phones, tablets, and computers for leisure or business and how they know NOTHING about the work that went into every detail of that device, the OS, and the software they’re running. And I do. I do know (sort of) what it takes to make what most people take for granted as they use their gadgets. It’s unbelievably impressive! More impressive: I can do these things!

This is really a testament to how great Penn’s program is. The kid gloves were off before I stepped into my first class. I wanted to learn computer science and I was (as) ready (as I could be) for the challenge. I was worried, though. Could my professors really teach a photographer/English teacher how to write code? Yes, and they did. There were times when I felt like I was drowning, but I kept kicking. I went to sleep and found myself coding in my dreams (good code, too! Code I could use when I woke up!).

For anyone who thinks they don’t fit the mold (mould for you UKers) for a particulary area of study, who thinks they’re too old to learn something completely new – you can. It takes some getting used to when you’re out of your comfort zone. But that’s how you grow. That’s how I got to where I am now.

What a difference a year and a half can make.

We’re Not Serious About Software Security

Lulled Into A False Sense of Security

It seems to happen every day and the public is appalled for about one second before it’s back to business as usual. I’m talking about hacking, not in the “finding creative solutions” sense, but the finding and exploiting of software vulnerabilities. Sony got hacked. Private e-mails and documents were released in retaliation for an “unflattering” movie about North Korea (supposedly). In past years, the big box stores have been hacked again and again. Customer credit card numbers were stolen. Still, people continue to swipe their credit cards at Target and Home Depot without blinking an eye.

We’re not serious about software security. The public doesn’t care enough to change their habits and pressure companies to store their data safely and securely. And what can these companies do when they’re at the mercy of the software company that developed the software they use? Most software companies don’t seem to care about exploits, unless it comes to their legal team, in which case, they’ve already placed a disclaimer that using this software is at your own risk. So, these breaches seem to be par for the course. No one really takes responsibility. Another day, another hack.

Universities: Software Security is a Choice, Not a Requirement

This semester, I took a software engineering course which centered around the internal and external metrics of software quality as defined by ISO-9126. One of the external metrics was security. For software to be considered secure, it has to verify data is only accessible by authorized users and that code cannot be manipulated by outside sources. My professor showed us a few ways we could exploit programs in Java. Suddenly, everyone in the class realized how all the programs we’d written throughout our careers as students (and possibly during our internships) were horribly insecure (Thanks, Java. Why SecurityManager is disabled by default, I’ll never understand). And this was just in Java. What back doors exist in other programming languages?

Most university computer science programs have a computer and network security course. Unfortunately, it’s usually an elective rather than a required course. Just do a Google search for “required computer science courses”. You’ll see a list of university web sites, all of which list computer security as an elective course.

Digging further, what do students who take these computer security courses actually learn? Examining a wide variety of universities, the descriptions of these courses vary greatly. Some, like the University of Colorado Boulder give students hands-on experiences with finding and exploiting vulnerabilities. Right next door, Colorado State University’s computer security course states, “In this course, we will begin by investigating some of the security measures that can be employed to safeguard information. For the most part we will look into the theory that goes into designing these measures rather than studying security tools and techniques. This is primarily because there are too many of those tools out there and they are changing frequently.” Does a course that focuses more on theory than practice do a disservice to future software developers? Will Colorado State University’s students create programs be as secure as say, the ones created by UC Boulder students who took Security Laboratory?

Untraditional Routes: Learn To Code, Not Learn To Code Securely

More and more people are taking different, untraditional routes into computer science. While it seems that teaching students how to write secure software is optional at the university level, these other paths into computer science seem to offer no instruction about writing secure software. Take, for example, the well-respected Flatiron School in New York. Nowhere in their curriculum do they discuss security. The focus is on learning new technologies and writing code that works. Their graduates go off to work at well-known companies, just like university students, none-the-wiser about writing secure code.

Many other people are taking advantage of free online courses to teach themselves how to code. They could take this Coursera course on computer security, but the recommended background is for someone with a solid foundation in computer science, not someone trying to learn computer science on their own. I’ll bet most self-learners won’t be considering this course. The question is, will those already entrenched in computer science be motivated to take this course?

Software Security is an Afterthought

Without making software security a priority in our educational institutions and for hiring qualified software engineers, software will continue to be vulnerable to many preventable attacks. It’s impossible to have an inpenetrable program. But there is so much we could do to make software more secure. If only there was some initiative on behalf of universities and other computer science-based schools to produce software developers who are knowledgeable in writing programs with some basic security measures in mind. And there needs to be more initiative on the part of companies to not only hire developers that are qualified to write working, secure code, but to take responsibility when their software leaks out sensitive information. As more and more of our lives become digitized, security should become a top priority, not an afterthought.

Why I Type in Dvorak

Dvorak keyboard

If you do a considerable amount of typing on a daily basis and have experienced stiffness or pain in the joints of your fingers, this post is for you. I used to have these problems, but a rather simple switch made all the difference.

What is Dvorak?

Dvorak is a keyboard layout in which the most commonly typed letters are on the home row. The layout was meant to increase typing speed and decrease typing fatigue. Dr. August Dvorak, a psychologist, and his brother-in-law, William Dealey, did extensive research on how people typed using the standard QWERTY keyboard. Dvorak thought QWERTY was inefficient and burdensome for users. In QWERTY, typing the most used letters requires users to move up or down from the home row and puts more emphasis on typing with the left hand. So, Dvorak and Dealey came up with the Dvorak Simplified Keyboard to tackle these inefficiencies.

How Hard Was It To Learn?

I typed in QWERTY for most of my life. I’m sure many of you will remember being in elementary or middle school and taking a typing class where the teacher would call out letters and you’d press the corresponding keys. Or maybe you played some typing game where you had to type “garbage words” as fast as you could and see if you could beat your best words per minute score.

Dvorak is not any different. You need to learn where the letters are and you need to practice. I found it easiest to buy some Dvorak keyboard stickers so I could look down at the keys to see where all the letters were until I could touch-type in Dvorak. I found a nice website to practice learning where the keys were and gain some speed. And I went cold-turkey and typed in Dvorak for work and home computer activities. In 2 weeks, I was typing 40 wpm and Dvorak seemed rather normal. After a year and a half of typing in Dvorak, I type about 80 wpm and I have exceptional accuracy – almost 99% according to the typing test I just took – and that’s comparable or better to what I typed using QWERTY.

Why Bother Learning Dvorak?

The main benefit of learning Dvorak for me was to reduce finger joint pain. I once worked as a processing associate, a nice title for sitting in a cubicle all day and transcribing loads of documents into 3 different databases. I typed all day long, fingers glued to the keyboard. A year into that job, I had to go to an occupational therapist because I had extreme pain in my fingers to the point that I could not bend them at the joints. The therapist said my joints were swollen due to typing so much and that the best way to relieve the swelling was just not to type! Obviously, that wasn’t an option.

I tried all sorts of “ergonomic” things to help alleviate pain caused by constant typing. I wore wrist gloves and had gel pads for the keyboard and mouse. I received a special keyboard at work with soft-press keys. But none of those things had any effect.

So, I learned Dvorak. Now, I type for at least 10 hours per day, every day, and I have not experienced the pain and stiffness in my fingers that I had as a processing associate. Dvorak was right: putting the important keys on the home row and dispersing what keys are pressed evenly between the left and right hand reduces finger/wrist strain. I’ve never looked back on my decision to switch. It really helped me continue typing comfortably.

What are Dvorak’s Drawbacks?

Well, for one, you’ll selectively forget QWERTY. I can’t touch-type in QWERTY anymore. Sit me at a computer with its keyboard set to QWERTY (which is the default keyboard layout, of course) and I’m like a 5 year old pressing keys with my index finger when I find the key with the right letter on it. But I did say that forgetting QWERTY is selective. I can oddly type on a QWERTY keyboard no problem–wait for it–on my cell phone. Yes, that’s right - the keyboard that pops up on my phone is in standard QWERTY and I have no issues swiping words or pressing individual letters. I oddly know where the letters reside even though I can’t do this when sitting in front of an actual keyboard. I have no idea why this happens.

The second drawback is that there are other keyboard layouts out there that are specifically designed to alleviate repetitive strain injuries. They may be better than Dvorak. I’ve never used them. Learning a second layout was enough for me…and it’s one that is supported by most operating systems unlike some of these other layouts designed to help RSI.

The third drawback you might not even consider a drawback - other people can’t type on your computer. So, if you do a lot of collaboration on your computer, you’ll have to switch the keyboard back to QWERTY for those other users to type. But it is a lot of fun to hand someone your computer when the keyboard layout is set to Dvorak and see the havoc unfold as your colleague types in something and cannot understand why the computer spits out gibberish!

Why I Love Dvorak

The number one reason I love typing in Dvorak is, of course, that I am comfortable and pain-free. While there are some studies out there that dispute Dvorak’s ability to alleviate RSI, it sure has for me. I enjoy knowing that someone can watch me type in my password, but they’ll never know what it is just by watching what keys I press. I enjoy the fact that others cannot really use my computer because Dvorak keeps them from doing anything that cannot be accomplished without the keyboard. To sum it up, it’s good for my health and my digital security. And it might be good for yours, too!

From Shakespeare to Java

Penn Engineering

A little more than a ago, I was a high school English teacher. I walked around a classroom supervising activities to help my students grasp key concepts of reading, writing, and the “collective human experience.” And yes, I did teach Shakespeare (‘Romeo and Juliet’ and ‘Hamlet’ to be exact).

So how does a high school English teacher become a software engineer?

Three events happened simultaneously back in April 2013. The first was hitting my 5 year mark as a teacher and not having a permanent position. For 5 years, I had worked in 6 school districts, but the positions were always temporary. School districts were receiving less funding from the state, causing districts to remove teaching positions in favor of larger class sizes. Other districts were laying off teachers in the thousands, causing massive competition for any permanent position out there. I was frustrated. I was a great teacher, I loved my subject, and I loved the profession. But the opportunities were drying up more and more every day and my future was frighteningly uncertain.

The second event had been mulling around for a while, but became a beacon of hope in April. My best friend kept telling me I’d make a fantastic software developer. He tried to convince me that computer science is a creative endeavor. He pointed out that I love puzzles (it’s true - I do crosswords and logic puzzles on my smartphone all the time) and that writing code is like solving puzzles all day. The more he talked about it, the more interested I became. I considered teaching myself how to code using online resources or attending coding workshops, but then…

My best friend talked to one of his co-workers, who just happenend to have been an English major who went through the MCIT program at the University of Pennsylvania and received a Masters in computer science. It turned out the MCIT program was one of the few in the country that would take students from other disciplines and teach them all the fundamentals of computer science (and then some). After I heard about MCIT, I was pretty convinced that this was an opportunity of a lifetime. I didn’t really know if I was going to like programming. But sometimes other people see more in us than we can see in ourselves. So, I applied to the MCIT program…and got accepted!

Today, I know my best friend was right…perhaps too right. Programming is a creative process. It is a long string of puzzles (“How do I make the computer do this?”). It is challenging, rewarding, frustrating, and awesome all at the same time.

My experience transitioning from English teacher to software engineer (or as I like to say, from Shakespeare to Java) is why I am such an advocate for teaching others about the field of computer science. I think that despite our leaps forward in technology and that most of us use computers and smartphones daily, we are extremely disconnected from what makes all of our electronics’ functionality possible. The younger generation has to actively seek out what computer science is, because it is rarely taught in the public school system. I hope that in the future, more people are at least somewhat knowledgable about programming, even if it is at a very basic level.

So what does the future hold for an English teacher turned software engineer? I don’t know, but I can’t wait to find out.

The Trouble With Math in Computer Science Education

math cartoon

Mathematics made computer science possible. From the Turing-Church papers to Von Neumann architecture, many of the things we take for granted are the direct result of some mathematician’s discoveries.

University computer science programs require students to take math courses. To some extent, this is a reasonable requirement. Learning about DFAs and NFAs are the underpinning of creating compilers. Learning about relations is important in understanding database design. Clearly, mathematics has had a profound influence over computer science.

The irony is that only a small fraction of computer science graduates utilize the broad span of discrete mathematics and computational theory out in the workforce. So why are universities so set on requiring these courses to computer science students? Is it to discourage those “on the fence” about their area of study? Is it just that tradition is difficult to break? Or are these courses truly important (and if so, for who?)?

The Mathematics Experience

There are many reasons students struggle in the mathematics courses universities require for a degree in computer science. For one, American students generally come from schools that teach math in a rather ineffective way, as shown through numerous studies (the US Department of Education disputes this…imagine that). When students arrive in their Mathematical Foundations of Computer Science and Theory of Computation courses, they’re ill prepared to handle the concepts being covered. This is especially true if they were not able to take higher level mathematics courses in high school.

In addition, as with most college courses, the material is taught in a “one size fits all” manner. The expectation is that students be responsible for their own learning, utilize recitations and office hours to ask questions, and find supplemental material to help them learn as needed. Unfortunately, a large portion of the mathematical concepts in computer science are so abstract that no matter what book, website, or video a student finds, the material is presented in exactly the same way as it was taught in class. If that method isn’t helpful, there are no other recourses.

Finally, there’s the problem of motivation. Students know they will not be writing proofs, drawing DFAs, or calculating the closure of a set of functional dependencies out in the workforce. For some students, these things may be exciting and worthwhile, but for others, learning these concepts is a waste of time. They take the course because it is a requirement, not because they are truly interested in the material or think it will be beneficial to their future career. And what happens when the course is over? ALL IS FORGOTTEN.

The Push For Mathematical Theory in Computer Science

Required mathematics courses may be lacking in practicality, but many computer science courses can also become bogged down in mathematical theory. Take, for instance, the topic of databases. Relational databases surely have their roots in relational algebra and calculus. To create a well-designed database, one must understand functional dependencies, closure, and algorithms for such things as BCNF. Yet, these concepts are mathematically intensive and for the average computer science student, they are completely unnecessary for learning how to work with the databases they will encounter after they graduate. The time invested in teaching mathematical theory takes away time to teach other, more practical skills and concepts in computer science.

A Modest Proposal

I propose that there should be two tracks of computer science. During a student’s freshman year, they take courses that give a general overview of different areas of study within the field of computer science. This way, they are informed about the different careers available to them, from DBA to data scientist to front-end developer.

In the sophomore year, they begin to branch into one of two tracks. The first is more mathematically intensive and for good reason - their career paths require it. If a student wants to do machine learning, they need to have a good grasp of statistics, linear algebra, and calculus to write the code. It’s really just that simple. There are certain areas of computer science that require a high level of mathematical prowess. This track is for students who wish to pursue those areas.

The other track is less concerned about mathematics. It still contains math coursework and in some cases, integrates mathematics into its computer science courses. The difference is that it teaches very practical math that is actually used to do specific tasks in computer science. Theoretical mathematics is left to the first track, since those students will benefit more from learning it. The students in this track may learn some of the same concepts as their peers in the first track, but in a more concrete way. For example, a student in this track may learn about relational databases and how lossless join works, but it will be taught using plain language, not in mathematical notation.

What about graduate school, you may be wondering. I still propose that there should be two options for certain courses, like Databases and Machine Learning. The University of Pennsylvania offered two machine learning courses at the graduate level this semester: one which was math intensive, one that was less so. Machine learning is so in demand by industry right now that it just makes sense to provide multiple ways of teaching the material to maximize the amount of people who understand and practice it. Clearly stripping away some of the mathematics in computer science courses can be done with great success and provide access to concepts that used to be reserved for the mathematically-inclined.

You may think I’m advocating for dumbing down computer science by removing mathematics. I’m not. What I am advocating for is making computer science coursework more tailored to the needs of both students and industry. It’s time to reevaluate what is being taught in computer science courses and make room to teach what is truly important today and in the years to come.