Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I have less than 2 years of college left and I still don't know what to focus on. But this is not about me, this is about being a future developer. I realize that questions like "Which language should I learn next?" are not really popular, but I think my question is broader than that. I often see people write things like "You have to learn many different things. Being a developer is not about learning one programming language / technology and then doing that for the rest of your life". Well, sure, but it's impossible to really learn everything thoroughly. Does that mean that one should just learn the basics of everything and then learn some things more thoroughly AFTER getting a particular job? I mean, the best way to learn programming is by actually programming stuff... But projects take time. Does an average developer really switch between (for example) being a web developer, doing artificial intelligence and machine learning related stuff and programming close to the hardware? I mean, I know a lot of different things, but I don't feel proficient in any of those things. If I want to find a job as a web developer (that's just an example) after I finish college, shouldn't I do some web related project (maybe using something I still don't know) rather than try to learn functional programming?

So, the question is: How broad should a computer science student's field of focus be? One programming language is surely far too narrow, but what is too broad?

share|improve this question

put on hold as off-topic by MichaelT, GlenH7, Kilian Foth, Bart van Ingen Schenau, ratchet freak Sep 11 at 11:06

This question appears to be off-topic. The users who voted to close gave this specific reason:

  • "Questions seeking career or education advice are off topic on Programmers. They are only meaningful to the asker and do not generate lasting value for the broader programming community. Furthermore, in most cases, any answer is going to be a subjective opinion that may not take into account all the nuances of a (your) particular circumstance." – MichaelT, GlenH7, Kilian Foth, Bart van Ingen Schenau, ratchet freak
If this question can be reworded to fit the rules in the help center, please edit the question.

    
Listen to me! To be a happy man in life, you have to do what makes you pleasure. Learn what you like the most. In this domain the job offer is quite big, so this is not a problem. Start working in many languages until you find what you like the most and than focus on that. Greetings from Romania! –  user55493 May 31 '12 at 11:16
3  
as broad as needed, but not broader –  gnat May 31 '12 at 11:31
1  
Be water... youtube.com/watch?v=QAVjh45i_pU –  jfrankcarr May 31 '12 at 11:55

9 Answers 9

up vote 5 down vote accepted

Does an average developer really switch between (for example) being a web developer, doing artificial intelligence and machine learning related stuff and programming close to the hardware?

This depends, but for the good ones, yes they do. Here is why, you aren't going to have different projects like in class where someone will say, "We are going to build a machine learning program." Most of the time what happens is you'll be presented with a problem, and you'll use what you know from different fields from computer science. What I tell our interns year after year is "Learn something about parsers and compilers." Will you be writing one at your job, probably not, but what will most likely see is a problem which can be solved using some information from it.

Does that mean that one should just learn the basics of everything and then learn some things more thoroughly AFTER getting a particular job?

You don't need to learn the basics of everything, and you shouldn't try and be an expert at anything at your stage. You don't have the experience be it, so don't fret about it. What you really want to learn in college is how to think and how to solve problems. Don't worry about what technology you know coming out, it'll change anyway. Now not knowing X might been you won't get a particular job, but that's OK, and I am sure you'll find another one just as good.

Also learn how to communicate. This is big. Writing code is easy, conveying your ideas is entirely another matter. You never get to do the cool stuff unless you can convince others that it's worth doing.

How broad should a computer science student's field of focus be? One programming language is surely far too narrow, but what is too broad?

Most likely, you don't "know" any language. You can write some code, but you aren't an expert. Don't fret, it means you can learn from what other people do. If you want to learn more outside of class, learn how to build software. Learn the basics of source control, a little bit about software development methodology like Agile, and why bug tracking is important. Most people right out of school don't know anything about this. Also learn something about business. A basic accounting course can go a long way. (Building software is a business and it will help you understand how the organization works).

It'd probably be good to play around with other languages too, just get a feel for them. I would learn a little bit about servers too. You don't have to be an expert, but having at least seen Linux/Windows/Mac OSX will help you not look bad when someone refers to them in conversation.

share|improve this answer
2  
+1 What you really want to learn in college is how to think and how to solve problems. –  Jeremy Heiler May 31 '12 at 14:57

One programming language is surely far too narrow, but what is too broad?

There's no such thing as having knowledge that's too broad. Too shallow, yes. Too broad? Never. Learn as much as you can.

Does an average developer really switch between (for example) being a web developer, doing artificial intelligence and machine learning related stuff and programming close to the hardware?

No, but who cares? Do you want to be an average developer?

I know a lot of different things, but I don't feel proficient in any of those things.

Then slow down. It's great to learn a lot of different things, both withing computer science and in completely different fields, but you can't learn about all of them at once. There's a reason that most students take five or six classes at a time instead of ten or twelve: you need to focus on the things that you're learning.

If I want to find a job as a web developer (that's just an example) after I finish college, shouldn't I do some web related project (maybe using something I still don't know) rather than try to learn functional programming?

If you're in a computer science program, you're probably not going to take classes in subjects like Drupal, Wordpress, or HTML. You probably won't even have classes about Java, C, C++, or Lisp -- instead, your classes will be about algorithms, data structures, file systems, etc., and you'll use Java, C++, Lisp, etc. You're there to learn the Big Ideas behind the technology, and the assumption is that you'll figure out the technology du jour as you need it. So yes, by all means, do a project using web technology, but don't skip a chance to learn something about functional programming too.

There's a difference between being proficient and being expert. By the time you graduate, you should be proficient in a number of things. You probably won't be expert in more than a few areas, if any.

share|improve this answer
    
"Too shallow, yes. Too broad? Never." -- given limited time, depth vs breadth is a tradeoff you have to make. So asking what is too broad in the sense of when can I no longer go as deeply as necessary is a very valid question. –  Raphael May 31 '12 at 12:54
    
And how could anyone here other than you possibly answer that? It's a decision that you have to make for yourself. You can specialize or be a generalist -- either way is "valid," but if someone here could somehow tell you what to do, that same advice wouldn't necessarily be right for others. That's why, after some reflection, I added my vote to close this question as 'not constructive.' –  Caleb May 31 '12 at 13:46
    
@Raphael: Yes, that's what I meant. –  AskQuestions May 31 '12 at 13:46
    
@Caleb: My question was "IS either way valid?" or "Is either way valid AT THIS POINT of my education?" rather than "Either way is valid, but what should I do?". In other words, I wanted to know what my possibilities are. –  AskQuestions May 31 '12 at 14:02
    
@AskQuestions I thought your question was: How broad should a computer science student's field of focus be? I've done my best to provide an answer above that might prove useful to more than one person, but I have a feeling that your real question is: How broad should my field of focus be? Now, that's a perfectly reasonable question, and I'm sure it's one that's very important to you. It's just not a good question for this site. I'd strongly encourage you to pay your advisor or your favorite professor a visit and talk about your concerns. They can and will help you. –  Caleb May 31 '12 at 14:33

Be proficient in one "classic" language of your target job.
For web that would be ASP.NET/PHP/HTML5 + Javascript.
Proficient means you'll also have to know your way around AJAX/JSON/JQuery

Then maybe at some point you'll have to make a few automation scripts, maybe do some SQL through an ORM or not, but you'll primarly be a web developper: nobody will expect you to be remarquable at those things.

In a nutshell: have a good knowledge of the core languages, the rest will be learnt when needed.

EDIT: Fields I can think of:

  • Desktop Apps (Java/C#+WPF)
  • Web
  • Games (C++/C#+XNA)
  • Other: that's where any language can be used. Fresh out of school you won't usually look into this field.
share|improve this answer
    
Thanks... And how would you divide everything into fields? I mean, there's web development, but what other big fields are there? –  AskQuestions May 31 '12 at 11:23
    
@AskQuestions Added the fields I could think of. –  Baboon May 31 '12 at 11:37
    
Thanks. That's basically the information I needed. :) –  AskQuestions May 31 '12 at 11:40

Mathematics, preferably precal or better, are unsurprisingly a plus in the software development field, though if you're going to college for another two years, I'm sure you're pretty proficient already. For any field, know your sin/cos/tan, and with that some good distance formulas.

Grammatical proficiency seems to be devoid in the CS realm as well, but... no one seems to care ;)

As far as good foundation languages go, I can only give you my personal testimony: I started with the compiled languages, and thus far it has given me a rigorous foundation. I can't imagine going from loosely typed interpreted to compiled. Also, stick with the popular languages at first, as they make for good buzzwords on your resume.

Lastly, it gets easier and easier to learn new languages as you start understanding the basics.

share|improve this answer

As a computer scientist, you should be able to cover the basic paradigms:

  • functional (e.g. Haskell or an ML dialect),
  • procedural (e.g. Pascal or C, or subsets of OO languages)
  • object-oriented (e.g. C# or Java) and maybe even
  • logical programming (Prolog).

The language you choose is of less import than that you understand the concepts; that will help you learn other languages faster. Knowing all paradigms to some extend will definitely make you a better developer. For example, learning Scala is a piece of cake if you know OOP and FP, but is rather painful if you know only one.

From a practical, that is task-based, point of view, you should be able to cover

  • desktop applications (e.g. C++ or Java),
  • scripting (e.g. bash or Ruby) and
  • web development (e.g. PHP or any other language with their web frameworks).

There are plenty specialised languages you do not need to care about in most cases. However, if you already see where your focus will be that might be useful. For example, R is popular in data analysis, Erlang seems to be very good for distributed real-time systems, Matlab is big in simluations and vanilla C is still important for embedded systems. Ask your favorite area's experts for their recommendations.

share|improve this answer

Learning about a lot of different areas and techniques is good, but... when you are in a CS program, you will only have limited time to spend at each subject. There is a notable risk that you will only get a shallow knowledge in every area, most CS students end up like that.

My advise is to find the branch that appeals most to you, then try to study a broad area of subjects in that specific branch. Because in the real world, programmers don't swap branches often nor easily. If you for example study a lot of web design, PHP, SQL etc and up doing real-time embedded systems, you have spent a lot of time on studying pointless subjects with no relevance to the profession. You might as well study philosophy.

What branch you end up in also determines how useful non-computer related subjects will be. If you end up in embedded systems, boolean algebra and discreet mathematics will be nice to know. But perhaps not if you end up as a 3D graphics programmer, then you would need to study a lot of geometry, physics etc instead. Or maybe you end up with data communication/network programming, then you probably won't have that much use of advanced math at all.

That being said, a broad knowledge can help in unexpected ways. I personally work with embedded systems, but since I have also studied a lot of Windows programming, I can design PC interfaces that interact fluently with the embedded system.

share|improve this answer

You should focus on just learning programming. The way I was thought it college was we learned java, but not in a way that we only understood java at the end, it was more like "lets understand what a variable is" - now for example heres how you would do that in java. This type of approach where your not just learning syntax and API's will serve you much better as I have found. It makes it quite easy to move to other platforms / languages quite quickly as you can get a good understanding with a simple developer doc on the language.

Focus on understanding the fundamentals is the best.

Would be helpful to decide on an area you like such as mobile, desktop, web front ends, backends etc. Even to just have a rough idea.

Developers generally stay in a similar area, with the exception of your first job. Some people will take the first thing they are offered out of concern of not getting out there. After that you would generally stay in the same section, maybe different platforms, different languages etc

share|improve this answer
    
Thanks... Well, my college IS like that. I mean, I'm not just a computer science student, but a computer science + math student, and we do kind of focus on fundamentals and concepts. "Would be helpful to decide on an area you like such as mobile, desktop, web front ends, backends etc. Even to just have a rough idea." - Well yeah, and I basically wanted to know what the possible areas are. –  AskQuestions May 31 '12 at 14:11
    
I would say off the top of my head there is web, mobile, desktop, servers / backends are probably high level areas, but then you have cross over areas like mobile websites, web based applications etc. Generally speaking I would say the biggest difference to decide is whether your into web based or offline. Web you have a lot of html, css, scripting languages. while offline, like desktop apps would be java, c++, objective-c etc. So there would be some big differences between them. Its just a difficult question because JSF is java but web based, so areas can cross over –  Simon McLoughlin May 31 '12 at 14:22
    
I decided on mobile because I really enjoy making the things you can with mobile devices, my decision wasn't really based on languages or anything like that. I no a fair few people in my class chose theres based on the languages they liked, and a few descovered what they liked through their final year projects. I would recommend maybe taking a summer and experimenting with a few different technologies / platforms to see what you like because nobody can really answer this for you –  Simon McLoughlin May 31 '12 at 14:24
    
Thanks, that's what I needed to know. –  AskQuestions May 31 '12 at 16:02

Its better to know how to do more than how to do a few things in many languages. Practice a lot, aim for a particular project and start coding. That project doesn't have to be new, great or even useful, the idea is to get you comfortable with creating software.

Good projects include: writing a bloging system from scratch, writing your own programming language, creating a 3d renderer, writing an operating system shell (make that shell accessible via the telnet program), create a game from scratch, make a recipe or checkbook balancing program with a GUI, create a simulation of some environment like fire fighting, terrorist hunting, etc.

The idea behind those projects is get you introduced to concepts like threading, processes, parsing, networking, basics of security, event-driven programming, animation, and other ideas.

share|improve this answer

I wouldn't worry as much about languages, as general themes and topics.

For what it's worth, I got the most long term benefit out a data structures class (which happened to be in Modula/2), information systems (where my final project happened to be in Visual Basic) and a theory sequence (which had no programming). In all three cases, the lessons I took away were about methodology, and structuring and solving problems. I regret not going deeper into operating systems and compilers, but that's more about wanting to know how the guts of systems programming works, rather than getting better at any specific language.

This may be counter intuitive since job postings (and HR screeners) generally look for specific buzzwords, but it's my experience.

CS Majors are in short supply. If you're smart, hungry and presentable, you'll get a first job. Word of mouth will get you your second job.

Good luck with the remainder of you program!

share|improve this answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.