8 Skills Computer Science Majors Need
I graduated from Southern Methodist University in 2012 with a BS in computer science. While I definitely learned a lot there and was able to find a job without too much trouble, I do feel like there are several things my professors could have easily incorporated into my courses that would have better prepared me for a career in software development. Additionally, there are some things I wish I had realized or taken the time to understand as a student. With that in mind, I have compiled a list of 8 skills that computer science majors need (or at least should try) to have before graduation.
1. Using a debugger
Does the following piece of code look familiar to you?
System.out.println(“AddItem called. added item is: “ + item.getValue());
Up until somewhere near the end of my first internship my code was littered with such statements. I had no idea what a debugger was or how to use one. So I would add, move, and alter print statements all over my code. Sometimes, I would even assume I had bugs because I was printing the wrong thing! Debuggers are very simple to use and provide a more complete picture of what is happening with your code. Using one properly would have spared me at least one all-night coding session.
2. Working with non-engineers on projects
My engineering program was all about interdisciplinary engineering projects. We had one almost every semester. And while it was great to work with electrical engineers or mechanical engineers, the truth is they work in a pretty similar fashion to computer science majors. Furthermore, I would argue the majority of professional developers work with other engineering disciplines pretty infrequently. But, most, if not all, developers will work regularly with business people or designers.
Most universities will also have business and art majors, so I think it makes a ton of sense to have projects where these groups collaborate. Students would learn how to understand, guide, and meet business user expectations, while implementing more complex and intricate designs. This would pose a much more serious challenge to CS students than simply having to fulfill professor requests. For a project like this, there is iteration, change, and collaboration from all parties. That sounds much more like a real-world project to me. Perhaps if this group begins working together while in school, the concept expressed in the above image will be a distant memory...or at least a less frequent one.
3. Rewrite, don’t copy
This is one that I learned the hard way. As a student and as an early professional, I would often run into a problem where I had to do something that I knew others had done before. I would Google, find a code snippet that would perform my desired task, and simply copy it into my text editor. I would complete the task and move on. But, I did not learn anything in the process. Now, I always make myself read the code and then retype it. Even if I rewrite it character for character, I am processing what the code is doing and bettering my skills in the process. Finding answers online is a great skill for a developer to have, learning from those answers is an even better one.
4. Read before you write
My first manager once told me that programming languages are the only ones where we are taught to write before we know how to read. At that job, I was responsible for writing small changes to an enormous code base. A significant amount of my time was spent digging through and attempting to understand existing code. Some of which was written almost a decade ago by someone who likely would not remember it even if he still worked there. This is something students rarely have to do. But for professionals this is a frequent activity. Reading code is not only valuable in helping you understand the greater context of your solution, but it can also improve your code as you are inspired or infuriated by the code written by your coworkers.
I think a really neat exercise a professor could implement is to give students a large code base that is mostly functional, but contains a few bugs. Have them find, report, and correct those issues in the application. In my current position, I am occasionally given a stack trace or screen shot of a system I have not worked on before or have not touched in over a year. It is a really handy skill to know where to begin looking for the problem and how to navigate the code to find the exact source of the issue.
5. Project estimation
Estimating projects is something developers do at many different levels. I have been asked, ”how long will this project take”, “How many hours will this feature take”, and “When will that bug be fixed”. Estimating development time is extremely difficult and often requires using previous experiences as a reference. I highly doubt a lecture could instill this ability in students, but I do think getting students to begin forming time-to-complete references sooner than later is a big plus. Even if they just learn to keep track of how long certain things take them, it would be a great start.
6. Finding, evaluating, and using libraries and frameworks
For good reason, most student projects rely entirely on self-written code. But, in the professional setting, using frameworks and libraries is a huge boon to efficiency and code performance. Even if you are a great programmer, you would be hard pressed to do better than a large team of experts who write and review open source projects. The “I am not using code I did not write” mentality is dangerous, egotistical, and ultimately wasteful. Breaking developers of this mentality will make them better professionals.
We strongly believe that being able to understand why you are using something is pivotal in being a successful developer. A question we ask in every interview is “what programming languages do you like, dislike, and why?”. We don’t care what their answer is as long as it is clear they can evaluate languages, understand the differences, and suggest example use cases. We would not expect a new grad to know why they would use Foundation over Bootstrap on a particular project, but we do expect them to be able to research both, gain some understanding of their differences, and possibly recommend one over the other.
7. Whiteboarding code
Although I do not whiteboard code as part of my day-to-day job, it was a task I was asked to do in almost all of my interviews. It is something we ask each of our interviewees to do as well. If you are not familiar with the practice it can be very disconcerting and difficult. You are without Google, auto-complete, and auto-formatting. You are often asked to talk before you start, as you go, and after you are done. This is a distinct skill that requires practice. Whether or not you agree it is a good way to evaluate candidates, the fact remains that almost all employers use this technique. I think universities would be wise to offer a workshop on whiteboarding. Great coders will often pick it up quickly, so why not give them the extra boost?
8. Source control
From interviewing several recent grads, it seems some universities have gotten much better about this. But before I began working in industry, I had no exposure to source control. Understating basic concepts would not only have been helpful in interviews and reduced ramp-up time, but would have been a major boon to my sanity. Hopefully, I was not the only person who had project directories that looked something like this for every CS assignment:
Even worse were group projects, where we would email or share code in dropbox. Or worse yet, the dreaded, last-minute code deletion. With tools like GitHub, Bitbucket, and SourceTree, source control is easy and will greatly benefit a student’s current and future self.
Conclusion
CS programs are not vocational. They seek to teach more than just what is needed to be a professional developer. And that is just fine. However, most programs will also try to ensure their students will be great professionals. So, I think they would be wise to begin incorporating these topics into their courses. Even if they do not, I would strongly encourage students and new grads to fill in any gaps they might have on this list.
Did your CS program better incorporate these items? Are there other skills you wish you had learned at your university? I would be very interested to hear what others think about this topic!
Do you need an expert in web development? With a team of web development specialists covering a wide range of skill sets and backgrounds, The BHW Group is prepared to help your company make the transformations needed to remain competitive in today’s high-tech marketplace.