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.

In thinking of making a good introductory resource guide for new Computer Science students...

What is a good list of expected knowledge and ability for a computer science BS grad? And if you graduated a while ago, how does this compare to the standards for graduates at that time?

And, are there any things you would want college grads to know that most entering the field don't?

Many thanks!

share|improve this question

closed as not constructive by MichaelT, Martijn Pieters, Oleksi, Jim G., Dynamic Mar 20 '13 at 20:47

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance.If this question can be reworded to fit the rules in the help center, please edit the question.

2  
Well, Steve Yegge would say that you should know how a compiler works: steve-yegge.blogspot.com/2007/06/rich-programmer-food.html –  mipadi Nov 2 '10 at 18:16

9 Answers 9

up vote 18 down vote accepted

I'm not a CS grad, but I am a coder and I've hired other coders. Here are some of the things I wish more of them knew:

  • Enough about language design to know which language is the best tool for a given job.

  • How to use an issue tracker.

  • How to use revision control.

  • How to pick up new skills on the fly (technology is always evolving!) without being spoon fed.

  • How to effectively document their code.

  • How to effectively manage their time.

  • How to communicate well with their boss and coworkers.

Lastly and most importantly, at least in open source shops like mine: They should grok open source, including how to use community resources, and generally be a good hacker-citizen.

share|improve this answer
10  
That's funny, you don't learn any of this in college –  Andreas Bonini Nov 2 '10 at 18:48
    
+1 Do you have a resource to learn about language design? –  Martinez Nov 2 '10 at 18:50
    
@Kop Unfortunately, you seem to be right. –  HedgeMage Nov 2 '10 at 18:50
2  
@Martinez: I wish I had the perfect resource to point you to, but I learned by spending time with more experienced coders and picking their brains.I posed your question to the coder I go to with such problems, and he didn't know of one either. He says that he learned by "marinating [his] brain in a jillion different languages." I'm poking at him to write something on the subject; I'd like to read it, too. :) –  HedgeMage Nov 2 '10 at 20:15
1  
@Martinez pragprog.com/titles/btlang/seven-languages-in-seven-weeks It might not be the best feel for language design per se, but it should at least give you a head start on understanding some of the differences in outcome from the language process. –  Thomas Langston Nov 3 '10 at 13:23

I'd say the #1 most important thing for any recent grad to know is How to Teach Themselves.

I see students that sometimes think that once they're done their degree they'll know everything they need to know for a job in the IT field but that just isn't the case. I think understanding that you need to keep learning, and being able to teach yourself new things is a very important skill for anyone starting out in this field.

share|improve this answer

How to teach themselves is the most important, but a Computer Science BS grad should be expected to know:

  • Difference between primitive and reference value types.
  • Conditional statements and loop constructs.
  • Functions and recursion.
  • Data structures such as array, linked list, queue, dictionary, and tree.
  • Objects, polymorphism, and inheritance.
  • How to query a relational database.
  • Basic theory behind concurrency constructs and techniques.
  • Basic theory behind compilers, tcp/ip, and web servers.

What they should know:

  • Power user level knowledge of at least one OS.
  • Source control
  • Build tools
share|improve this answer

Something to remember is that college/university leads to many paths, industry is one of them, academia is another. The number one takeway I've gotten from my education is that university teaches you how to learn. It provides you with the resources to learn and people who are passionate and helpful in areas that interest you.

Through my computer science undergraduate education (still ongoing) I've learned pretty much everything my future job shouldn't have to teach me. How to approach problems, how to break them down, classify them, how to analyze proposed solutions, what tool to use for a given situation, how to make trade offs etcs.

Some people will say that you should know your algorithms and data structures (I agree) or how to use version control, build systems etc (I agree too). Ultimately you have to acknowledge that you will always be a student, the sooner you embrace that there will always be new things to learn and and people to learn from, the better off you will be.

share|improve this answer
1  
+1 for "you will always be a student" –  EricBoersma Nov 3 '10 at 13:16
    
It's ideal to have those abilities before going to university, but you are lucky to have gone to a university that values, let alone teaches, them. Most of the recent CS grads I know are so accustomed to being spoon-fed knowledge that they are completely at a loss as to how to address an unknown problem or learn something independently. I wonder: who or what could cause more universities to change their spoon-feeding ways? Is it possible to reform the spoon-fed grad, and if so, how? –  HedgeMage Nov 3 '10 at 19:37

You should be able to take a set of written or verbal instructions and translate them into a working program. Really.

If someone tells you: create a program that takes text as input, counts the number of characters in the text, and displays the number of characters in the text -- you should be able to do it.

Not only should you be able to write the program, but you should be able to:

  1. Write an explanation of how to use your program, and how to identify and troubleshoot common problems that might arise while using the program.
  2. Be able to send your program's source code and project file [if any] to someone, allowing them to, with a minimal amount of effort, load your program and work on it as you have been working on it.
  3. Isolate and send the executable/run-time portions of the project to someone in a form in which they will be able to execute and use it without too much trouble. This means also sending them (or describing to them) any dependencies that your program might have, as well as describing the basic system requirements for running the program (e.g. OS version.)

Of course the above isn't the only thing you need to know. But in my opinion, it something you really should be able to do. Besides the obvious core knowledge, I also advise:

  1. Be inquisitive. Be ready to learn every day. Be flexible. Be self reliant.
  2. Learn how to use search engines well. And use them. If I can find the documentation, white paper, or technical article, you should be able to find it too.
share|improve this answer
  • Willing to learn
  • And, The power of Internet
share|improve this answer

Here's a recap of what my CS courses covered back in the mid 90s as I graduated in 1997:

  • 1st year - basic write a program using Pascal and know some basic tests to do. Learning of various types and things like arrays and linked lists.
  • 2nd year - Types of testing, white box, black box and permutation. Basics of the Software Development Life Cycle. Introduction to parsing and some basics of how a compiler works.

There were 6 3rd year courses where I went to university that covered the following topics:

  • Data Structures & Algorithms
  • Concurrent Programming
  • Digital Design and Architecture
  • Operating Systems
  • Theory of finite automata
  • Numerical Analysis

Part of the Operating Systems course covered TCP/UDP and some other network elements like sending packets and OSI layers. The Web had only really started to take off in my later years when Netscape Navigator and Yahoo! were big internet names if you remember those years. I never had a formal course on e-mail, but after my first year I did have an e-mail account and was on the UNIX network as that is what we used after the first year Macs to do our work. There was even an electronic submit that automatically sent assignments to the proper place to be graded. This was also back when there were newsgroups for all sorts of things, including various classes I took. While there was a 4th year Distributed Systems course I opted for the more theoretical mix of Algorithm Design & Analysis, Computational Complexity Theory, Introduction to Artificial Intelligence, and Symbolic Computation, which was a nice contrast to Numerical Analysis in many ways.

share|improve this answer
    
nothing about internet , networking ? –  Ayush Goyal Nov 2 '10 at 18:58
  • Data-structures
  • Software Engineering (includes team collabaration stuff, use case diagram etc.)
  • Basic understanding of common algorithms
  • Basic understanding of programming languages
  • Basic understanding of compilers (might not be a requirement)
  • Networking
  • Some background in basic AI
  • Basic graphics
  • a couple of programming languages ...

that's about it ...

share|improve this answer

A CS grad should have a pretty good idea of what they don't know. In terms of breadth vs. depth, while a CS grad should have pretty good depth in the basic areas, they should have also walked around the entire field with a spray-bottle making sure that they at least understand what kind of tools and concepts exist. This way, when faced with a problem, they at least have a vague idea if there are possible solutions out there instead of always unknowingly reinventing the wheel.

Much of the detailed knowledge I learned in college is long gone, but the shadow of it is there - I don't remember exactly how exactly A* search works or how it's implemented, but I know that it exists and I understand the class of problems it's designed to help solve.

share|improve this answer

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