tags:

views:

1117

answers:

19

In light that many of the Stackoverflow members are CS college students (myself included), and there are many veterans surfing the website at the same time, I feel that it would certainly be beneficial for us to get some advice during our time in the college.

I've read th article Advice for Computer Science College Students from Joel on Software a few years ago. Most (if not all) of the advice are still valid to-day. However, I feel that we can have more than 7 pieces of advice with a larger community here.

I'll start from some advice that I've gotten from some seniors:

  1. Learn to use LaTeX instead of Microsoft Word

  2. Learn a source control system

  3. Try to program without an IDE

+8  A: 

I think it's really important to network as much as you can while in school. It was through the contacts I made while in school that I was able to land my first development job outside of it.

tribus
+3  A: 

In my opinion programming without an IDE is a little ridiculous. When programming in the "Real World" its all about productivity. You should use all tools at your disposal to help you code better and quicker. This is one reason why IDE plugins are such a big market (I like CodeRush and Refactor!).There are some old school guys, and idealogical purists that might like to write code without an IDE but overall I think its a bad idea.

Justin
I don't think he was suggesting programming without an IDE all the time, but a temporary detour into vim can significantly expand your knowledge of the language (no code completion). I know this from personal experience...
William Brendel
After reading the post again I see he is not talking about programming only outside an IDE. As a learning exercise it is helpful to not use an IDE. It will help you learn the language better. Outside of that I stand by my post.
Justin
I never understood the notion of learning the language better without an IDE. The IDE is one of the greatest tools you have to learn the language! An IDE with decent intellisense will have helpful comments about why your code is not compiling, and it will be able to suggest what keywords/syntax is available based on where you are. Furthermore, it is the easiest way, by far, to browse available fields and methods on your objects as you use them.
JoshJordan
I think the problem is that many programmers are unable to "look beyond the IDE", so to speak, so that it ends up holding them back, rather than helping. There are a lot of programmers who say things like, "I wouldn't use X because it doesn't have a decent IDE." A lot of people say that about Python, for example, and those programmers are really missing out. An IDE might be practically necessary for verbose languages with huge libraries (e.g., Java, C#), but reliance on an IDE becomes a problem when a programmer assumes they are necessary to be productive in ALL languages.
mipadi
@JoshJordan The way I see it is an IDE will help you discover a language while writing without one will help you commit it to memory.
Justin
programming without an IDE: agreed, that's a little ridiculous. What is he going to use, Notepad.exe? However, *compiling* without an IDE could be quite helpful, no matter what he uses: msbuild, nant, makefiles, etc.
azheglov
Learn the basics. Doing some work without an IDE forces you to learn things you wouldn't with an IDE, and what you do learn will be more transferable. Think of it as comparable to building your own linked list rather than using the library implementation.
David Thornley
+3  A: 

Develop some soft skills to go with your technical knowledge. Understand the basics of finance and business. Learn what to look at to decide whether a company you're going to go to work for is in the right market at the right time.

Make sure you have an elevator pitch for yourself (be able to describe your value in 1-2 minutes).

Once you're out of school, pick a business area and apply your technical expertise to it - learn it inside and out. Augment your tech expertise with some business knowledge in a specific area or maybe two.

jn29098
+3  A: 

Try to get in touch with open source communities and help them by fixing bugs/implementing features. That will be a great experience and will surely enable you to learn more.

Alan Haggai Alavi
+5  A: 

First of all, the advice that you already have:

I disagree about not learning Microsoft Word. If you are going to make a career developing software for Business, the MS Word is surely going to be one of your major tools in writing huge documents related to design, spec, user requirements etc.

Source Control System, I think it is good to have this knowledge but not having this knowledge shouldn't harm you if you go in search of a job. Every employer should know that source control is one of the things that every fresh grad learns in his first job.

My Advice is to hone your base concepts such as how things work under the hood e.g., why a pointer is of 4 bytes in a 32-bit architecture. What are registers. Virtual memory, Instruction Pointers (These are just a few things). Important thing is to develop your concepts and stop worrying about latest cool graphic IDEs.

And most importantly, Learn How to KISS

Aamir
+6  A: 

Get out once in a while.

Don't just sit in the labs or library studying all of the time. You need social skills in this industry; whether you're in a meeting or with a client - you need social skills.

Go to the bar - have a drink or two - talk to random people....

PSU_Kardi
I agree. Try to talk to people before drink 3. The less you know a person and are able to carry on a conversation, the better you're off.Don't ever underestimate the ability to carry on conversations with total strangers. This will aide in the ability to deal with customers.
Chris Rittersdorf
+3  A: 

Don't wait for a certain class to learn something. My Relational Databases class wasn't until senior year. I would have gained a lot from learning about DBs in my spare time in my freshman or sophomore year at least.

AndyMcKenna
+5  A: 

The best thing I ever did for myself as a professional was to choose a graduate degree in Software Engineering after completing my CS degree. As a CS student, you're going to learn all kinds of things about your computer and how to make it do what you want. However, a famous CS practitioner once said that there's a lot more to programming than just programming.

I am not suggesting a grad degree in SE, but rather to read popular SE texts and literature. Learn about the areas of Processes, Process Improvement, Quality, Requirements, Documentation, Re-engineering, Maintenance, Modeling, and so forth. These are important and relevant to your career if you choose to work as a software engineer professionally.

To get a taste of these, consider applying your CS knowledge by taking part in an open source or significant personal project.

EDIT: I see you mention MIT and CMU in your comments. I'm not really familiar with MIT's CS and CS-related departments, but CMU has an excellent Software Engineering department. It is one of the best in the country. One of the greatest things you could do for yourself would be to take your electives from there, if you are a CMU student.

JoshJordan
+1 for Process(es)
Nader Shirazie
+3  A: 

Always have one or more projects of your own on the go as the assignments in school will take you only so far. Programming for yourself will help sharpen your skills further and maybe give you some insight as to which industry you want to focus on after graduation.

csj
+2  A: 
  1. Make sure you choose the right tool to fit the job. Don't force a project down a path just to use a new trick you learned.

  2. Plan, plan, plan, plan. The planning stage is where most of the projects either live or die. Sitting down to just code is much more likely to result in several "Oh, we didn't realize you were going to do THAT"

  3. Find out what your users really want, but understand that they may not know till the end. Get as specific requirements as you can, but be prepared for iterative development. Most of the time, your boss or customer is going to throw you a curve - just roll with the punches.

  4. Be honest about how long it will take and how hard (or not) it really is. Over budgeting time may sound fun, but nobody is impressived when the project that is obviously 12 hours gets tacked up at 30. (This isn't to say that you shouldn't give time for errors and such).

  5. Learn at least one language from the MS stack (I'm not a M$ fan, but they have lots of shop about), one scripted language (ie, perl,python...), and web framework.

  6. If you wish to advance to anything more than a code monkey, you'll have to learn to talk to non-technical people, about technical issues. Get good at trying to draw valid analogies between technical areas and real life.

  7. Understand the business that you're developing for. If you're developing internally, see if you're employer will provide some basic training about the business aspect of the company. If you're developing for an external company, try to learn some about their business - whatever method is available. Learning about the business may prevent silly errors that the customer (internal or external) may be assuming is common knowledge.

  8. If a shortcut or clever trick doesn't provide noticeable, needed improvement - go for whatever is most verbose. You'll thank youself when come back to it in 9 months and you actually understand WHY.

rfusca
+7  A: 

THE MOST IMPORTANT ONE: Try hard to study math!

jcadam
+2  A: 
  1. Don't be intimidated. By anyone. Nobody is off-limits.

Most of my commentary builds off of this miraculous observation about the school dynamic.

  • Take important undergrad classes early so you can progress to graduate curriculum earlier.
  • Use it to get good summer internships.
  • Try to work in your department, giving you visibility, new skills, and opening doors to future opportunities.
  • Make good friends -- and I mean your peers. Your fellow students are the biggest resource ever, and some of them are really going places.

LaTeX is important, and so forth, but there's no "essential ingredient" to your success in college.

Overflown
+3  A: 

Make sure you know how you learn something. Everyone learns in a different way so be sure you know yours so if you have to pick up a new concept or technology you are able to do so.

Look to non-CS courses for usefulness in future situations. Taking courses in a foreign language can be great for getting some insights into how people in other parts of the world may learn how to read and write. I found this particularly true of a course where the alphabet is dramatically different such as Russian compared to English. There is some work on communication skills in taking these courses, IMO. Similarly, business or economics courses can be useful for learning how the world works to some extent. Lastly, Math and other Science classes can be useful if you plan on going into research or just to get used to doing things in a logical manner and knowing how to successfully justify an answer to a given problem.

Understand that there are many different roles within software development and IT. See if you are better at one part more than the others or if you like one part more than the others and build your career on that if you lucky enough to do both in that role.

As you start your last year, if you haven't already start researching how you want to try to find that first out of school job. Does your school have a section for recent grads to find jobs? Does your local community have resources for finding jobs? Is there an annual career fair for the soon-to-be graduates that is where you could meet with dozens of employers on one day? Part of this is planning and persistence as it isn't always easy to get that first job as I had a few months of struggling back in '97 when the economy was much better but getting that first development job was hard for me.

JB King
+1 for the first paragraph, and that's because I can't give a +2.
David Thornley
+1  A: 
  • Do not be a douchebag or condesending to other CS and non-cs people!
  • You do not know everything and you do not always have an answer.
  • You can always learn from someone.
  • Be able to take criticism.
  • Socialize, nobody cares how good you are at coding if you can't relate/talk to your users/people/customers like a normal person.

I have seen smart coders completely fail in the real world because they couldn't talk to people.

Troggy
DNBADB should be stressed more often. Treating anyone like a moron because they don't know what you had to study to know is foolish.
xnine
+3  A: 

Learn on you own.

Take what you've learned inside your classes and try to go out and build real applications or how to do some of the more advanced things in the language that your class didn't cover. Try to create something real that you or other people can use: a utility program, an open source library, a website, a compiler, whatever you're interested in.

No matter how much you know, when you start working you will encounter something new that you need to learn, so its important that you find the methods that help YOU learn new things.

tl;dr go program even more!

TJB
A: 
  1. I would like to emphasize the importance of actually going to class!
  2. Don't rely on so-called study groups, especially when it's just for homework... even good-intentioned people sometimes end up just saying the steps/answers and then you're not really learning anything.
  3. For tests, you should go to study groups though.
  4. If you feel lost, and the assigned textbook doesn't make it clearer for you then you should really consider using other sources to try to learn the material outside of class. The teacher helping is only going to go so far (because of #2). This is especially true for calculus and physics courses, at least it was for me. It's very unfortunate, but some texts are just not helpful for actually learning the material.
+3  A: 

unless you want to be stuck doing windows development the rest of your life, learn the unix/linux based operating systems. most companies out there doing any kind of embedded programming or web programming are using unix servers and networks. if you can't hold your own with unix, you're not going to get hired for the fun jobs.

davidivins
A: 

First, at the moment, CS degrees are about as worthless as toilet paper.

When I graduated from High School everyone said get a degree in CS, that is where it is at, and to some extent that is true. But having to have a CS degree was not.

I graduated from the University of Kentucky in 1992. It took me 6 years to work my way into a decent paying job programming and not once was I asked if I had a degree.

Then all the certifications started coming out from the different vendors, Microsoft, Novell, etc...

Companies did then start asking if I had any of these certificates and began to hire these over those who had gone to college.

On top of all this Computer Science is a strange breed for a professional field. This is because we actually work with our hands when we are finished.

The professional world is not ready to recognize a profession that gets as involved in our work as we do. I asked a Electrical Engineer instructor in college if we were going to have a chance to apply what we were learning by physically building circuits. He said, "You man this is a University not a trade school.".

Another problem in our field is it is not easy to see the actual results of our work. This I believe has caused most management in Corp. USA to think that what we do is easy.

Every company I have worked for when it came time to show profits the first out the door were the IT folks. The average IT job is around 3 years and that is basically what my career has been and every company I have worked for I rose to be the most senior engineer, architect and even manager due to my accomplishments many involving NASA projects but when it came time to go there was no consideration as to how it would affect the company. As I said we are not looked upon as peers.

Another problem CS has is the fact that when you earn your degree you do not have to get a license like 99% of the other professions you would go to college for.

Personally my children will not go into this field they will go into one that requires a license to practice.

I spent 6 years in school. My brother skipped college and he and I make about the same amount of money programming.

When you think about hospital equipment think about how the Engineer had to have a license to build it but the programmer did not have to have a license to program it.

Think of all the fields that are not even considered professions by definition in relation to college that require a license. Real-estate, Contractors, Barbers and so on.

Then I could go into how quickly the field changes and I know I have spent more time being educated that a Medical Doctor probably 3 times over.

So my advice, if you want a sustainable career, is to go into a field that requires a license to practice it.

Anthony Mathews
Kinda negative, aren't we? I've seen more companies wanting a CSci degree than a certification, and if you've got the degree getting the cert will be easier, and (which is likely more important) getting the cert that's valuable in ten years will be easier then. I'm also puzzled by your attitude: when I took a Mechanical Engineering course, it was plenty hands-on.
David Thornley
A: 
  1. Take as much math as you can
  2. RTFM
  3. Check your return values
  4. Cozy up with Knuth and SICP

  5. $$$

blargh