Tuesday, April 30, 2013

I Didn't Want Computer Science

Three weeks from now I will be shaking the hand of Dr. Freeman Hrabowski, the president of my university. I will thank him for his efforts and I will receive a fake diploma to hold on to until my real one comes in the mail. Three weeks from now, I am graduating with a degree in Computer Science, and the most important thing I learned in college is that I didn't want a Computer Science degree.

What I wanted was to develop applications, write games and apply my knowledge of programming to create things which would have astounded my younger self, and sometime still astound me today. Turns out, there is a very big difference between this and Computer Science.

Computer Science is Theory

I didn't know going in that Computer Science is entirely theoretical. My early classes did not reflect this; in fact, looking back on it now I think there is a bit of an identity crisis going on within the world of CS. The first class I took taught basic programming skills with Python. The second and third classes I took were Object Oriented Programming and Computer Logic. The OOP course was taught entirely in Java, explained how to use Java, but then told us they weren't teaching us Java. What they wanted was to teach OOP, what they had to do was give us Java as an example.

Computer Logic was entirely theory, and was the first class that got me thinking about this topic. Every time I ever said I liked to program, I was told Computer Science is the degree to get. Computer Science is the programming degree. I can understand now why everyone has that misconception.

I went on to take a few more classes with a lot of programming, but after the 300 level of courses, that just phased out. No longer was I doing what I loved. The entire second half of my time in college was spent studying the theory within Computer Science. Now, I can't speak for all universities, and I know there are a great deal out there who offer applied CS and theoretical CS as separate tracks, but the issue still runs through the majority of schools.

Computer Science is Important

Blindly programming without knowledge of how things work is terrible. To be able to produce quality code, you have to know how things work and how to work things beyond the basics. You need to really understand recursion and you have to know how trees work and how to make use of algorithms. Without the theoretical side of things, a developer is only half as great as they could be. I am not denying this fact. However, everyone is different. Some people thrive more on the theory, some thrive more on the application. Teaching to the theoretical can snuff out the application just as much as teaching the application can overlook the theoretical.

In fact, finding the balance between the two based on the intended work of the individual can prove to be the best way to go about things. For me, I went outside the curriculum and practiced application on my own. I would take what we were taught and apply it to whatever I could in order to learn the side of things I felt we were missing out on. That would be fine and dandy if I wasn't simultaneously being told to give up on that.

Computer Science is Not Selective

The biggest outlet I found for my desire to program was in web development. I fell in love. I started with what most people start with, basic HTML. That was a long, long time ago. From there I stumbled into a giant PHP codebase and taught myself from that. Eventually, I was driven to learn new technologies and systems, all the way up until now. My latest love has been NodeJS, which I feel does exactly what I need it to do to scratch my development itch.

I can't tell you how many times I've been told things like "web development is a useless field" or "if you are planning to do web development, you should just give up now". These are direct quotes from professors whose classes were required to be taken in order to get my degree. Every time these kinds of statements would be made, my friends around me would turn and smile because of how vocal I am about my passion for web development. Once, I was even told sternly that I won't be the next big developer. An industry mentor who I was paired with told me, word for word to give up those dreams. I wouldn't have it.

Sure, the chances of striking gold with something I make are low, but that won't stop me. That isn't why we do this. We do this because we love to do it. Making money is great, sure, but this is more than a job to me, it is who I am. This is what I spend my time doing, and telling me not to is just damn wrong. Computer Science doesn't belong to one field or another. Don't lie to yourself and say that one field is better or worse than another. We all need everyone else in the field in order to continue driving ourselves further into the technology.

Computer Science is Misunderstood

The general public would hear "Computer Science" and have no idea what it means. The informed public would hear "Computer Science" and say programming. The CS crowd would hear "Computer Science" and have no idea what it means.

As a student who is finishing up his final work in the degree, I don't think I could give a direct answer to "What is Computer Science?" I would probably fumble around with my words and mention programming and theory at some point, but nowhere did I get a clear definition of the degree. I can't say for sure, but I don't even think the faculty knows what they want it to be, either. Some wanted us to program, most wanted us to research, and nowhere were we told how any of this works out beyond the realm of academia. I relied on internships to teach me how it all works in the field, and that is what this is really all about, isn't it?

I don't think we all collectively know what we are doing with the idea of Computer Science. Do we just not have a better word for either side of the debate? Is it even a science? Is it an engineering degree? You could say it is akin to a Physics degree or you could relate it to an Electrical Engineering degree. Which is it? Are we implementing or researching? Researching via implementation? Can we make that decision for ourselves?

Computer Science is My Life

At the end of the day, I have learned a lot. I began college with what I thought was a good understanding of programming. I ended college with a better understanding of programming, but there is an endless realm of knowledge and experience for us to explore. You can be an expert in one thing and know nothing about something else. The problem is, we have a hard time understanding that and a harder time teaching to that philosophy.

I didn't want a Computer Science degree, but how can you want something that doesn't have a definition?

I wanted a Computer Science degree that doesn't currently exist.

~Michael

28 comments:

  1. I got a computer systems engineering degree and electrical engineering master's.

    ReplyDelete
  2. I graduate in 3 weeks as well and I completely agree with you. By the time I realized Computer Science was not the degree for me I already had some much time and money invested it was too late to turn back.

    I was hoping to learn about advanced programming patterns and things of that nature but rather ended up learning theory that hardly ever applies to these types of things.

    Luckily during my time at University I had enough interest to teach myself the types of skills I really needed to get a job but yes what I needed was a trade school.

    ReplyDelete
  3. I think you hit the nail on the head with this post. I'll be graduating with a CS degree in 4 days and I'm in the exact same boat as you.

    I tend to get frustrated sometimes, but at the same time it's exciting that we can kind of make what we want of the field. There's still lots of room for pioneering, expanding, and creating something more of CS.

    In the end, I don't see much worth in my degree. I do find, however, that the life experience I have gained in the process of getting the degree is priceless. And now it's all about what we choose to do with it next.

    ReplyDelete
  4. "What is Computer Science? ..."
    Computer Science is problem solving.

    Though you didn't exactly say this, I would like to point out that to say CS is about computers or programming is like saying Physics is about lasers and test equipment. We use theory and language to express the ideas we've been taught in beautiful and clever ways, to make comprehensible those problems which seem to have no solution (or even admit a solid description).

    I think you're right that most CS programs are more about concepts than applications, but that is a benefit. Learning _just_ a particular technology or set of languages makes you weak and inflexible to change. The higher level approach of CS is helpful because it allows us to lift ideas from one language to another, solutions from one problem to another, and to see deeper connections between problems that most people think are unrelated.

    "What I wanted was to develop applications, write games and apply my knowledge of programming to create things which would have astounded my younger self, and sometime still astound me today."

    I have this feeling every single day when I work on my projects. What's stopping you from doing these things now? I'll wager everything the things you have learned in CS will make easier, more productive, and more enjoyable creating those things you listed.

    Just my $.02.

    ReplyDelete
    Replies
    1. Thank you for your reply. I have done those things, actually. I was doing them before and during my degree. My real issue is that these things were completely separate from my course work, and in some cases my work was deemed useless due to the fact that I was into web development in an environment where my professors were mostly into research and "older" development models.

      Delete
  5. Amusingly, I've had the opposite problem: my university is far too biased towards practical stuff (especially in research but also in courses). Nobody is working on the PL theory things that I have started to *really* love.

    They have a very project-oriented style of research: they come up with an application and then try to create something for it. I would like to explore the fundamentals of computation and find elegant abstractions that underlie many different fields or perhaps take a look at how that sort of abstraction can be applied in novel ways.

    It's interesting how different people have such different interests and preferences.

    ReplyDelete
    Replies
    1. I came into college with the same expectations as the author, but I've slowly gravitated towards applied math (that's another crazy story) and PLT as well. I feel like everyone has their niche. I stumbled across PL one day in our intro functional programming course as an obscure reference at the end of a slide on natural deduction that I'm pretty sure everyone else missed, and immediately fell in love. 2 years later, I'm pushing around taus and lambdas as a ra for my undergrad advisor, who also happens to be a PL researcher, and I couldn't be happier; I just got really lucky I guess.

      Don't despair OP, there's a really nice intermingling between theory and practice, and while most colleges are culpable of either falsely advertising computer science or at the very least misleading by omission, the degree as a whole at least gives you the opportunity to explore your interests :)

      Delete
  6. I think this is one of the major reasons a lot of students drop out of our CS programs. They start, thinking they are going to learn everything about programming, but slowly realises that most of our professors are old mathematicians who don't really write a lot of code.

    For me, this was surprisingly great. I started out wanting to learn more about programming, but in the end I ended up in love with cryptography and related subjects.

    At my school they removed the old degree, "Informatics" and created two new degrees "Computer Science" and "Computer Engineering", with the former being math-heavy, and the second one more focused on programming. This year, there were 116 applicants for the engineering degree, and 37 for the CS degree (This is the third largest university in Norway). Big surprise?

    ReplyDelete
    Replies
    1. You might want to be careful when translating that as "Computer Engineering". There is a degree called Computer Engineering, that is basically in between Computer Science and Electrical Engineering. It's about designing computer hardware, and doesn't involve as much programming.
      I'm not sure of a better name for your school's degree, but maybe "Computer Software Engineering" would be clearer.

      Delete
  7. We (http://simpson.edu/computer-science/) offer a "Computer Information Systems" degree that is an application-development track rather, as opposed to our "Computer Science" degree that has the theory. Some people major in both. Too bad your college didn't have something similar.

    ReplyDelete
  8. I commend Fred Brooks's eloquent "The Computer Scientist as Toolsmith II" lecture to you.

    http://www.cs.unc.edu/~brooks/Toolsmith-CACM.pdf

    Give it a read. You won't be disappointed.

    ReplyDelete
  9. Dude, I swear you wrote my exact thoughts on graduation day two years ago. When did you graduate and how long did it take you to become a proficient web developer? I practice as much as I can on the side, but don't really have enough experience yet to do it full time just yet.

    ReplyDelete
    Replies
    1. I have been doing web development as a hobby for a while now, almost 10 years I'd say. I started out pretty young (11 or 12ish) doing basic HTML and web page stuff, and over the years I learned new stuff like PHP, mySQL, CSS, JS and whatnot. It really just takes doing a few big projects to learn how to get in the swing of things, but you'll never know every facet of everything.

      Glad to hear you understand what I was getting at. Good luck with everything!

      Delete
  10. I think really, the degree you wanted was software engineering. But co-workers of mine have told me Software Engineering is usually a masters degree, and not usually done in the undergrad.

    ReplyDelete
  11. You should have done basic research before choosing your degree.

    https://uwaterloo.ca/software-engineering/future-undergraduate-students/frequently-asked-questions#Difference

    Software Engineering
    "Software Engineering (SE) deals with building and maintaining software systems. It is more software-oriented and has a greater emphasis on large software applications than Computer Engineering. It is more applied than Computer Science, placing greater emphasis on the entire software development process, from idea to final product."

    Computer Science
    "Computer Science (CS) focuses on understanding, designing, and developing programs and computers. At its core, Computer Science concentrates on data, data transformation, and algorithms. Advanced courses present specialized programming techniques and specific application domains. The CS program is less structured than the CE and SE programs, giving students more flexibility to build depth or breadth in a variety of application domains or in the fundamentals of Computer Science."

    Why didn't you go into software engineering instead?

    ReplyDelete
    Replies
    1. Not every school offer SE degrees

      Delete
    2. This comment has been removed by the author.

      Delete
    3. Sorry, had to rewrite something so I deleted my comment.

      Of the schools I was looking at, SE was not an option. I was doing programming and development long before I started college, and Computer Science was always where I was guided to go to.

      I don't regret my degree one bit, it just was not what I thought it would be.

      Delete
    4. Unfortunately the "software systems" that SE focuses on building are incredibly boring. Think business, military, government - big monoliths that no one will ever use by choice, only because they have to.

      Delete
  12. Well, despite scott being a bit of a jerk about it, yes, the degree you wanted is called Software Engineering, which I graduated from at the University of Waterloo in Canada. The program is rather new (first graduating class was 06' maybe?) and it's not a common degree from what I know.

    If you know any younger high school students contemplating the same problem you have, recommend them to look at https://uwaterloo.ca/software-engineering/. It's a great university with excellent employability; just ask anybody who works at Microsoft/Google/Amazon. They probably know like 10 Waterloo alumnis. Also, I hear schools in the US are more expensive than attending Canadian schools as an international student.

    P.S. Hilariously enough, I'm now a PhD student in Computer Science. Never regretted being in Soft Eng, though. I graduated with surplus of money and I can code circles around most of the students in my program.

    P.P.S. Sorry for bragging so much, but Waterloo's actually pretty awesome.

    ReplyDelete
  13. Choosing Software Engineering was the best decision, I ever made because I wanted to do exactly what you wanted. So, yeah, the CS you wanted exists and its called SE.

    ReplyDelete
    Replies
    1. I guess so, but I said the CS I wanted doesn't exist mainly because I feel that the combination I want doesn't exist.

      Perhaps SE would have been the way to go, but that was not offered at my university, and although I know it may have been elsewhere, I don't know if full SE is really what I wanted either.

      I probably would have enjoyed it more, though, because I love writing code more than anything, but I think what I learned was important...well for the most part.

      Delete
    2. I don't think many Universities offer a SE degree. Here in California we apparently have 11 universities/colleges total that do, and of those I believe 2 are mid-tier CSU's and probably the best in the state is Cal Poly SLO. I don't think people who get accepted to Berkeley or Stanford for CS would dare to even consider going to one of the aforementioned schools just because they offer a SE program..

      Delete
  14. Computer Science is no more about computers than astronomy is about telescopes.

    - E. W. Dijkstra

    ReplyDelete
  15. Just as bad is the confusion over what "software engineering" is. The course I did, software engineering at the university of Melbourne, is essentially 3 years of CS with 1 year of what could be best described as project management lite, and a year long practical subject in "why waterfall sucks".

    True "computer science" is about the theory of algorithms, data structures, and efficiently computing things. The world doesn't need a lot of computer scientists. They're the boffins that make the magic deep down inside Google work - but not the apps that we love to play with.

    True "software engineering" is about the boring tedium of assembling enormous, boring, tedious applications used by banks, airlines and mining companies. It's about breaking down enormous projects into little pieces that can be later integrated into a disaster. The world probably needs lots of them, but they're all in India.

    Which leaves the question - what do you call a degree for aspiring professional software developers? That teaches the skills and practises needed to produce high quality, sustainable software that makes customers happy and your successor pleased to maintain your code.

    ReplyDelete
  16. All good thoughts. Some things come to mind from my college days, now four or five years ago.

    1) The background you gained with your degree will prove invaluable even if you're working in the web field. The one thing that I got out of it was the ability to think in multiple layers of abstraction simultaneously. Some people have a talent for it and can just do that out of the womb I guess, but you have to learn it to succeed in comp sci at UMBC. This will put you ahead of your peers who are either self taught or maybe took an alternate software engineering type track.

    2) I felt the same way as you, but I picked up on it going into my last year. I actively sought out classes that had projects and coding assignments. "Practicum" style classes I guess you could say. I also feel this was invaluable to me once I started working.

    3) I can't help but think two really awful things about UMBC professors and advising there. First, to scoff at web work is mind bending. That's where a lot of the software is these days, consequently it's where a lot of the jobs are and where a lot of the money to be made is. Keep doing what you love, because there's a dearth of GOOD web developers especially in the area where we live. Second to that is how UMBC fails in the advising area. There are two types of CS majors, those that intend to head directly to grad school and do research and those that intend to go into world and write software for money. UMBC does a tragic job of making differentiation and advising the correct courses to prepare you, especially if you're in that second pool. I faced the same thing my last year, but as I said actively sought the practicum courses.

    At any rate, congrats on your graduation. Stop by the Frederick Rd office sometime!

    ReplyDelete
  17. This is great thank you for taking the time to make these availible for the fine folks at HWC. They are beautiful and I intend to place an order for 2 120 Silver later this week, waiting on tax return,lol. This community bar none has the best people in the industry sculling about the Hardware

    ReplyDelete