views:

647

answers:

15

As a student I worry constantly about the outside world. I've worked for some companies already providing Web Design/Development and SEO help, even the occasional DB work, but I still worry about how I'll cope in the real world as a developer or a graduate student (hopefully) at a top university.

Aside from the obvious answer being Work Experience, what would you recommend that current Computer Science and Software Engineering students do to help prepare themselves for the rest of their courses and getting a job after graduation? What holes do the current educational system leave unfilled?

As this topic has received a reasonable number of differing replies I have decided to make this a Community Wiki to allow people to add more suggestions and links.

  • Finding a Project (perhaps Open Source) and getting involved.
  • Joining LUG's (Local User Groups)
  • Read key texts, such as "Structure and Interpretation of Computer Programs"
  • Experiment with different languages and paradigms. For example, learn C and learn Functional Programming.
  • Take an internship if one is available to you
  • Seek out a Professor or Mentor to help you progress in the right direction
  • Persue alternatives routes in your own education
  • Learn about Business and Software Engineering processes
+14  A: 

FLOSS - find a project and Get Involved!

LUGs - join your local user groups - Linux, Perl, Python, whatever your platform(s) of choice.

Build stuff - if you want to use it, build it (or make an existing one better). Code samples are likely to be requested before any development job would be offered.

Read - don't stop reading and learning on your own: find something that sounds cool, and learn everything there is to know about it.

Write - related to Read, after you read about something, write about it: share what you've learned on a blog, reputable website (like the ACM's Ubiquity), etc. If you can write about it, you can most likely do it.

warren
A: 

There are really two things I wish I'd learned more when I was in college; the first is foreign languages, and the second is software engineering process.

The former is useful not only if you are interested in working abroad, but also because I feel that human and computer languages work similar parts of the brain. I've felt that the process of becoming fluent in another language subtly changed the way I looked at writing code.

As for SE practices, I don't regret this as much because I realize that I would have probably too immature to fully appreciate it in my younger years. Still, I'd recommend studying up on software design, team coordination, TDD, and so on. For instance, it's amazing to me that so many CS students never use SCM systems in school, and have to learn about all these tools afterwards. Knowing how to properly develop software with tools like this would have saved me a lot of headache.

Nik Reiman
+4  A: 

Programming Challenges like:

  1. TopCoder
  2. Project Euler
Matt Price
Also, the Valladolid Programming Competition.http://acm.uva.es/problemset/
Phoenix
I was going to put that up, but when I found the page they said they had moved and the new one didn't support Firefox 3 :( so I couldn't verify the link.
Matt Price
+13  A: 

There are good programs and great teachers out there, but in general, a lot of the current education systems will try to treat your degree like a trade program. They'll teach you Java, just because you can get a job writing Java.

  • Read "Structure and Interpretation of Computer Programs".
  • Learn C.
  • Experiment with functional languages.
  • Read and write constantly.
  • Take internships.
  • Build new things for fun.
  • Seek out a professor or mentor who is interested in seeing you move forward.
  • Program every day.

It's always good to be part of a community. Stack Overflow is not a bad place to hang out. You could also try to seek out some open source projects, or interesting user groups in your area (or at your school).

keparo
+1  A: 
  1. Internships - These are invaluable, look stellar on a resume, and seriously do prepare you for what a development job will be like.

  2. Experiment - Always experiment with programming whether it be your own personal projects or an open source project. If you have the passion, your career will naturally guide itself.

  3. Read Books - Force yourself to read interesting programming books (not just on programming languages or technologies but also practices/paradigms/etc.)

j0rd4n
+6  A: 

Start a blog. Take an extra humanities course. Do whatever you can to improve your communication skills.

Scottie T
Starting a blog is definitely a great recommendation. Not only does writing entries clarify what you think you've learned, but comments from other people that read it add even more.
Scott A. Lawrence
I disagree. A Blog does not make someone a better developer. At a push it may improve your grammar and/or your web development skills.
EnderMB
+1  A: 

Open source and internships--or even better, both. Practical experience is the best supplement to an education.

Dark Shikari
+3  A: 

I agree with the other suggestions about things you can do outside your course. But it's also important to make the most of opportunities in your subjects. Some ideas:

  • Don't just do the minimal work to pass an assignment - try to do the best you can, and look for areas where you can actually do extra.

  • Speak to your teachers about the things that really interest you in the subjects you're studying. They'll be able to point you to further things to read, or interesting applications you might not be aware of. They'll also be able to recommend other subjects that will build on your interests.

  • Look for a novel way of solving an assignment. I remember we had an assignment in finite automata, and while the teacher's intention was that we solve it by hand, I found that I could use genetic algorithms to search for an answer. I ended up learning an enormous amount that I wouldn't have encountered otherwise, and really surprised the teacher with both the results and the approach.

In my experience, many students get only a small fraction of the value that they could get from their university education.

TimB
+7  A: 

The biggest problems with new grads are generally the following:

  • They have never worked on applications with more than a few hundred lines of code.
  • They have never worked as parts of teams.
  • They have not had to read, modify, or debug code written by somebody else.
  • They have not had to write much error-handling code.
  • They have not had to rigorously test the code they've written.
  • They have not had to talk to customers.
  • They have not had to write user-targeted documentation.
  • They have not had to write developer-targeted documentation.

So, my suggestion is to read a lot of code, and write a lot of code. Whenever possible, do this with other people.

When reading, pick source for a "real program:" that is, some software that is used in the real world by actual users. Can you understand it? How could it be better organized to be better understandable? How would you have written it?

When writing, choose a project that people will actually use. That way, you'll get bug reports, complaints, demands upon your time, and all those other things that make software development so much fun.

Kristopher Johnson
Can you add to that... they have not had to talk to real customers to find out what they want (and who really don't know what they want until they get something else.) Communication with users is a vital skill.
thursdaysgeek
Added. Thanks for the suggestion.
Kristopher Johnson
+3  A: 

One of the most fundamental "gaps" (in my opinion, of course) in the traditional Computer Science curriculum is the lack of a focus on non-coding aspects of software development. There are very few jobs out there where you are going to be able to code without needing an understanding of development processes, management techniques, software architecture, the business aspects of software etc. CS Undergrad prepares you to write code, but it does not prepare you to build software. Obviously this is the sort of thing you learn on the job, but an understanding of the "Big Picture" of software is should be introduced into the standard CS curriculum. I understand most students take (usually) one Software Engineering course, but that they don't tend to cover the depth and breadth of what it really means to build software.

Another very important thing that isn't taught is that 95% of the work you'll be doing is maintenance. As soon as a line of code is written it enters into maintenance. A key skill is having the ability to read others code, understand it, and be able to maintain it.

Ben
I would definitely agree with you on that. Before studying for a degree in CS I studied Computing, which involved Software Engineering and Business processes within the IT industry. The second I started CS I was able to apply my knowledge on methodology and gain high marks.
EnderMB
Good point on the amount of maintenance work. Professors I had CS program at the University of Maryland did let us know there was a lot of maintenance. I suspect they do the same thing today.
Scott A. Lawrence
+1  A: 

Learn how to listen to users and pick out their requirements when they don't really know what they want. Don't get frustrated by the miscommunication, and don't look down on users who have a different skill set from you. You know more of your stuff, they know more of their stuff. The challange is to understand their stuff enough so that you can solve their problem.

thursdaysgeek
A: 

Learn when and how to ask for help == team; Learn when to spend the extra time to figure things out for yourself == individual; How? Read the posts with votes, since I can't vote.

softpro_sea
+1  A: 

Read existing code. Especially as an undergrad, no matter what you read and do in class, it won't prep you for what real code and real problems look like, and on your first job you will have to dive into an existing codebase, so practice early.

Uri
Any suggestions on how to find real code? Sure there are a ton of open source projects, but for someone starting out, it may be daunting trying to pick somewhere to start.
Scottie T
If you use open source software, the source code of a program you frequently use is a good place to start since you will already have an idea of what it is supposed to do.
chills42
+4  A: 

Having a "pet" project helps immensely. Something small that you care about enought to try and implement.

Personally I have had several such pets, none very useful:

  • Random character generators (for roleplaying games, or for the novel you plan to write)
  • An implementation of Ludo, the board game
  • A customized notepad, with just the right functionality for you. (Mine will save everything automatically, and keep a history of changes).
  • A commandline tool for logging every cup of coffee during the day (trying to cut back a little)

Some of these I come back to again and again, especially the random generator, and implement in different ways, or from a slightly different angle.. This is pure excercise for me - something with absolutely no value to anyone but myself.

+1  A: 

I recommend choosing a minor that requires a lot of writing, public speaking, or both. If anyone has suggested you join Toastmasters, that's a good idea too. I minored in English as an undergraduate and found that it significantly improved my ability to communicate technical ideas in writing to my superiors. This is especially important when the people making decisions about what you work on aren't very technical (which seems to be the case far too often). In an interview situation where you're up against peers with the same level of programming skill that you have, if you communicate better than your peers, you'll be the one getting the job offer. It's one of the qualities I've looked for in the past when asked to interview developers and recommend whether or not they should be hired. The field needs a lot more people with the ability to explain the what and why of design and implementation choices to less-technical people.

Another benefit of being able to communicate clearly is that it's a skill that will never become obsolete or go out of style. As technologies go in and out of favor and platforms change, the specific knowledge we have about this programming language or that application server won't be useful anymore (except in legacy maintenance situations, which tend not to be much fun anyway). Your ability to communicate will be a plus in moving you upward in the technical track at organizations, as well as give you opportunities to switch tracks to management (if you choose).

Scott A. Lawrence