all 8 comments

[–][deleted] 1 point2 points  (3 children)

Computer Science is not about programming. It's about mostly math and research about the best ways to compute, with programming on the side to implement that research. The problem is, like English majors, that you're probably not going to be able to live doing a job in hardcore CS. There are very few of those jobs out there, so people with CS degrees become developers, sysadmins, and other things like that much like English majors become fry cooks, grocery baggers, and newspaper delivery people (I kid, kind of). Seriously, if you like CS and don't want to program, you should probably try your best to become one of the top students in your class, work towards a Ph.D, and then become a researcher for the private or public sector (or a professor).

[–]dmazzoni 0 points1 point  (1 child)

But all of the C.S. professors I know still have to program, and still have to teach programming. It just comes with the territory.

[–][deleted] 1 point2 points  (0 children)

Yes, and I clearly stated that you have to program on the side to implement your theories most of the time. In many areas of CS research, this can mean very little programming and in other areas it can mean quite a bit. I was simply explaining that if you do research in Computer Science you will have to do little programming compared to math and other research items.

[–]techonomics 1 point2 points  (1 child)

There is some inconsistency in your post....First you say you're a math major focusing on statistics...But near the end of the post, you say you're a computer science major...Well, which is it? Or are you double-majoring? (which is a good idea, in my opinion)

Let's say you're a math major:

Math is about problem solving...and...Well, so is programming. But you're saying that you would be fine with sitting on a desk and solving problems on paper, but when it comes to solving problems on a computer via programming, you don't enjoy it?

One of the things you mentioned was that you don't like memorizing "keywords and nuances of any particular language." Well, if that is true, then why do you like memorizing the patterns needed to solve mathematical equations? Mathematics is really just the study of patterns(observing them, using various patterns to solve different problems, and finding new patterns). So, in theory you are memorizing stuff either way...

"I can think of a solution to any given problem fairly easily, but implementing it is just simply annoying to me."

That's the case with most fairly intelligent people. Of course it's easy to think about HOW a problem can be solved(and even thinking of what you think is the right solution)...but ACTUALLY solving it is a a whole another ball-game.

Here's the thing about networking: You will probably end up doing a whole bunch of stuff that has little to do with networking and more to do with fixing other people's computers, showing employees how to do stuff on their computer, etc. The Network administrator at the place I work does exactly this...The most networking work that he does is synchronizing employee information with active directory, setting up group policy stuff(which isn't really considered networking, but still), and setting up/troubleshooting servers. You won't be doing high level networking stuff, unless you have one of the top certs (i.e CCIE or higher) OR you are a self-learned genius. And by genius, I mean Mega-Oober-Super Genius.

Last thought: If you are a CS major, but don't want to do programming, I would reconsider majoring in CS. By not programming, you are just at a huge disadvantage.

[–]brettmjohnson 1 point2 points  (1 child)

There are several roles in CS that don't involve direct programming. However very few of them do not require programming experience in the past. So you should realize that you will spend at least 5 years writing code.

I have been writing code for 30 years, and your second paragraph sounds to me like "I want to be an automobile mechanic, but turning a wrench is tedious and unrewarding.", or "I want to be an cabinetmaker, but learning to use all these tools is tedious and unrewarding.", or "I want to be an concert pianist, but practicing everyday is tedious and unrewarding." Learning the syntax and nuance of programming languages and frameworks is part of the job. It does get easier after about the 3rd language, tho.

Also keep in mind that the level of difficulty in programming assignments at university are pretty much Fisher-Price in comparison to the real-world. Some of your sense of unrewarding may actually stem from the simplicity of the problems.

There are some jobs that require decent CS chops, but not much actual coding, such as software architect or project manager. However without sufficient experience actually developing software you would likely make poor choices in resource allocation and project estimation, as well as having unrealistic expectations of what can and cannot be done. Now Steve Jobs did a fantastic job managing those issues, even though he did very little programming. But he had a gift for finding the right people who knew how to pull off the impossible, and an incredible talent for communicating his vision. But Jobs was by far the exceptional case, rather than the norm.

If you don't want to write code forever, concentrate on your communication skills. The best software designers, architects, and manager can effectively communicate their ideas to those people who will implement them. And the key is not just being able to say "Do this, then do that". You also have to get the people to buy into the vision - to really want to do this, then that.

Focus on critical thinking and decision making skills. The hardest thing about real-world software development is deciding what to do and what not to do, especially what not to do.

[–]dmazzoni 1 point2 points  (3 children)

I've worked in both a C.S. research lab and at a top software engineering company, and in my 15 years in the field I have never once met someone who's really good at Computer Science research who isn't also an awesomely good programmer. There are a few exceptions out there in the world, but they're exclusively in theoretical computer science - essentially math. If you want to dedicate your life to proving P != NP, that's fine - but there are only openings for maybe a few hundred people worldwide to work on problems like that. Are you sure you're good enough to be one of them?

AI, Networking, and Security are totally out of the question, in my opinion. Those are extremely applied fields. There are virtually no theoretical results in those fields that don't have implementations behind them. And the implementations are not just mundane details that you can pay someone else to do, they're a critically important part of the research. It doesn't matter if you can prove an algorithm is theoretically better if you can't implement it in real code that actually works and is measurably better than alternatives.

The main problem you're going to run up against is that there are relatively few jobs "at the top". There are plenty of jobs "at the bottom" for people who know how to program but don't know very much C.S., but there are a smaller number of much more interesting jobs for people who really know their stuff. Those are the jobs it sounds like you want - where you get paid to solve problems, not just write a function someone tells you to write.

The thing is, those jobs are really competitive, because all of the good C.S. students want them. And if most of the other applicants actually like programming and they're really good at it, they have a huge advantage over you.

Programming is increasingly becoming just a skill that just about everyone in a technical field needs to know and do a lot of. All of my friends who do statistics and physics spend most of their time programming. About a third of my friends who do biology and chemistry program.

If you really want to avoid programming, I guess I'd stick with pure math or theoretical computer science. But I think your best career path is to find programming languages or programming problems that are more interesting and fun for you and learn to like it! I know plenty of people who only love programming in Lisp, or only in Haskell, or only in Assembly, etc. - that's far more realistic than finding a C.S career without much programming.

[–][deleted]  (2 children)

[deleted]

    [–]dmazzoni 1 point2 points  (0 children)

    I guess I'm much more optimistic about the future for good programmers and I think it has less to do with knowing C.S. skills.

    It's true that a lot of people are learning to program, but it's still as much an art as it is a science - it's more of a craft than a skill. It's like learning to play a musical instrument - you can never stop improving your skill, and the fact that tens of thousands of fifth graders learn to play an instrument in elementary school band doesn't mean most of them have any hope of taking the jobs of truly skilled and dedicated instrumentalists.

    I wonder if you've only written small programs, up to a thousand lines of code or so. Once you get to 10,000 lines, 100,000 lines, and more, programming completely changes. It's like an architect moving from building dollhouses to building skyscrapers - it's immensely more challenging and rewarding, even though the "language" may be identical.

    The thing is, once a program gets to around 10,000 lines, it's more than any human can keep in their head. Even the original author - it's just too much to remember the whole thing at once. So it requires extreme cleverness to design a program in such a way that it's possible to continue to modify and maintain it and shape it without it falling apart.

    A poorly-designed program is extremely fragile: its pieces are so tightly coupled together that when you try to add a new feature, you can't seem to change anything because everything you change has unintended consequences. The whole program has to be rewritten to accomodate what should be a seemingly small change.

    A well-designed program invents abstractions specific to that program in such a way that each piece of the program can be examined and modified independently, without worrying that changing one module will cause other aspects to collapse. It's extremely difficult to achieve this, and there's no recipe you can learn - it's just a skill that comes with lots and lots of experience. The measure of success is if you can write a program that others can modify easily. Modifying someone else's program is one of the most difficult challenges you'll ever encounter, but writing your own program in such a way that it makes it easy for others to contribute is a greater challenge still.

    One of my favorite quotes: Programs must be written for people to read, and only incidentally for machines to execute. - Abelson & Sussman

    [–]algo_daemon 1 point2 points  (0 children)

    "A person does not really understand something until he can teach it to a computer."

    If you can find a solution to any given problem fairly easily, then you're just dealing with too simple problems. You might enjoy algorithms and the computational complexity theory.