views:

830

answers:

16

As an experienced software developer, what advice would you give to a first-year college/university student for things to do during a software engineering course?

I was asked this yesterday by a local college student who had to interview an IT professional for an assignment. I suggested three things:

  1. Write lots of code - you get good by doing. Preferably start a personal/hobby project so you get to build something real (and hopefully new) that you can work on for longer than the average college assignment.
  2. Write (not just code) and publish - so you learn to write, because written communication skills matter. These days, the obvious thing to write is a personal blog, although there are other options.
  3. Learn to touch-type - so 1 and 2 do not take up all of your spare time. This is not a hard thing to do.

Obviously, these are not original, and I think there is at least one Coding Horror article on each one. What I am looking for are more creative or original suggestions, either for what do (e.g. learn to write) or how (e.g. write a blog).

Note: the One piece of advice question is related, but not specifically about things to do while at college.

A: 

If you're just going into college now and you can't touch type... good luck to you! With all the instant messaging and texting these days they ought to be pretty darn good at that.

My suggestion would be to read the programming books. That was the single most important thing that I did my freshman year. I learned a lot and in the later years I didn't have time to read all of the stuff and I felt that I missed out because of it.

With all due respect, you can write code all day long. But unless it is good code, you're not really learning much in my opinion.

Joe Philllips
+7  A: 

Learn how to learn. (and college/university is the perfect place for that).

That is the one skill that will really be with you your all career, as illustrated by the question "How to remain employable in the face of constant technological change"

VonC
+1  A: 

Learn the principles of Object Oriented Design. Its the one thing I regret not learning at university! Yes I was taught it...and yes I thought I understood it...but years later I'm looking back at how I've programmed and realized that I have not been programming in an Object Oriented manner....even though I thought I was. I'm fixing this mistake now...but I wish I had understood that the abstract and difficult to understand theories being taught in Programming 101 were more important than getting my hands dirty in code.

Learn the basics first and experience (and others experiences) will teach you the rest.

mezoid
The only problem is that good OO design cannot be taught. You can learn the principles, yes, but it will always be that way: You thought you understood it, but a year later you see it's crap. Experience is all that matters here.
gimpf
+2  A: 

Classes will sadly not teach skills needed for software development in the real-world. Thankfully most universities have many programs that allow the students to work with professors or at companies through interships. Do it every semester and every summer. Seriously. If you can, do 2-3 at a time. For a while I was working 60 hours a week while in full-time school, the experience was well worth it. I feel sorry for Seniors who are just starting their first internships, they've already lost so much time to learn.

DavGarcia
+3  A: 

Learn to negotiate. Dealing with people is considerably more complex than dealing with machines, and fresh college graduates are at a disadvantage due to inexperience.

Kim Reece
A: 

Learn other things - take other courses, be rounded. Take the hard computing courses - compilers, natural language processing, complexity theory, logic programming - not just because you can, but because you will pick up things that really are generally useful.

But also take the other subjects (and not just maths, statistics and physics), but economics, history and so as to be able to talk and reason about the real world.

Unsliced
A: 

I would take issue with your first point, Write lots of code, it’s a bit ambiguous. I would rather tell people to practice a lot and stretch their ability, they will make lots of mistakes but here I think this is the most important part. They have to learn from their mistakes, understand why what they did was a mistake and find a better way to do it and understand why it’s a better way.

Also I wouldn't tell people to practice writing code or using a particular framework but to practice design, learn to design databases and data structures and which patterns or algorithms to choose and when to apply them and how it all fits together to form a coherent system.

After all the language we choose and the code we write is just how we communicate with the computer the most important part is having something good to say in the first place, if you wanted to write a good book you wouldn't achieve that by practicing your hand writing.

Fair point - I'll see if I can think of a better way to phrase that. I meant that getting plenty of practice is good, and that trying to build a whole application will force you to learn more than just coding an algorithm, as well as providing more context for the theory you are already learning.
Peter Hilton
+1  A: 

Learn SICP from abelson-sussman-lectures through videos Work out exercise in SICP book.

yesraaj
+11  A: 

Read, read, read, read, read and read some more.

And while you are reading...code, code code, code, code and code some more!

I can't emphasise this enough (the web only has two accepted emphasis tags!) Reading and coding are the best ways of developing yourself.

  • If you are given coursework where you have a choice of exercises (as can happen in many programming modules) - do the one you are most comfortable with and submit that - but then do the others. You will learn more, and most decent lecturers are more than happy to go through the others (after the fact of course)
  • Get involved and get active - Internships, open source, small individual projects. All of them can help develop you and your abilities
  • Don't get hung up on one language, one paradigm or one software engineering method. Many new coders fall into this trap, mainly due to universities only teaching one option.
  • Learn the basics, and learn them well - I don't care what anybody says, design patterns, paradigms, high-level point and click software "design" will get you nowhere (except bothering the rest of us.) Learn discrete mathematics (Set theory, Graphy Theory, Discrete Probability, Finite State Automata), algorithms (Sorting, Searching at a minimium), basic data structures (Arrays, Linked Lists, Trees, Queues, Stacks) machine architecture (Very low level stuff - logic gates, Von-Neumann, Data Storage and Memory etc.), Assembly language (See how well you understand the architecture!) . These are the building blocks which you can use to understand higher level stuff a hell of a lot better than people who grab a copy of Learn Buzzword in 24 Hours and attempt to build their knowledge from the ground down
  • Read at least one of the following - The Annotated Turing (Best introduction to computational theory I have read - goes through Turing's original paper on the subject), Godel, Escher and Bach - An Eternal Golden Braid (This will get you thinking about more aspects of computation, including it's link to other areas - not exactingly about software engineering, but it has definitely made me better for reading it.) or The Art Of Intrusion (again not a software engineering book but this will give you an idea of the hackers mentality - ann essential read if you ever plan to go into security)

Hope that helps!

Jamie Lewis
Great Answer!! Thank you...
tranced_UT3
A: 
  • Read

Books, other people's code, blogs. There's all sorts of resources to learn from - consume them.

Of course it's good to write - but if you work in a vacuum you'll be restricted to your own ideas, which won't always be the best ideas.

slim
A: 
  1. Read - Many have said this, but it's really important. Read books and blogs daily.
  2. Contribute to Open Source - Working with other people on real projects is a huge benefit, and really helps one understand how things really work.
  3. Explore - Learn as many different languages and technologies as you can. Have a wide foundation to build your career on is priceless.
  4. Use best practices - Experience with hte best practices, like using version control, testing, refactoring. Even in small home-projects. It's a fun learning experience.
abyx
A: 

Learn multiple ways of thinking. For example:

grom
That is likely to be an explicit part of the course itself
Peter Hilton
+6  A: 

Mine would be more focused, because I think that it's more likely to affect a first year student:

  1. Don't skip class - ever. No reason is good enough except for violent illness. If you show up, at least you'll hear the material once. Divide your fee bill by the number of classes you can attend during the year. The per-class fee will astound you. Don't blow that cash. Show up.
  2. Don't wait until the week before an assignment is due to start thinking about it. Dive into that prototype on the day it's assigned. Last minute work is never good, especially in computer science.
  3. Talk to a professor or a TA when you stumble into a black hole. Don't wait and let it fester into a real problem.
  4. Learn another domain well besides computer science/programming. Accounting, engineering, physics, biology - domain knowledge will be as helpful as programming languages. Know something about the kinds of problems you can solve.
  5. Attend seminars that are over your head. You might not understand the topic when you hear it, but you will someday if you keep at it.

The other stuff about learning, reading widely, thinking, etc. - I agree with all that. But these are things that I wish someone had told me when I was an undergrad.

duffymo
I totally agree with you on numbers 1, 2, 3 and 4. They were what enabled me to be successful in school, especially communicating with professors when I was having trouble with the material. Nice list.
pave
+2  A: 

Go to parties and have fun. You will regret that more than not reading about code later on in life, if you miss out.

ENJOY college. It's supposed to round out your education and make you a well-rounded citizen, not just a specialized subspecies that can bend machines to your will. (Although that latter part is fun too!)

Genericrich
A: 

My advice for university:

  • Learn math, for me it's an excellent way of brain training.
  • Learn system architecture (low level stuff, how does a CPU work, assembly, OS)
  • Learn (or play with) more than one paradigm (functional, oo, etc) and language (C++, haskell, ..)
  • Start some coding projects (during my university years I coded an RTS, which didn't turn out the way envisioned it at all ;), but it's a good experience)

All of the above points are more or less open doors, especially as these are part of moest CS curricula.

What I would advise is to get involved in other stuff as well, go work in the school bar, join a youth political party, go to some seminars (communication, economics, business stuff, you name it), work together with class/schoolmates. Don't be a dick.

But most of all make sure you have a good time.

Do your best, get good grades, but don't slap yourself (maybe a little) if you fail a course, spending a few months more isn't negatively affecting your carreer, while extra curricular activities are always a plus!

Oxymoron
+1  A: 

I'm going to reiterate a lot here because I think these statements are important.

  1. Go to class. SO IMPORTANT.
  2. Read everything, ask questions, and do the assignments.
  3. Pick the brains of your professors and teaching assistants. They've walked a similar path before you and they are there for a reason. For that matter, pick the brains of software developers outside of academia. They will be able to give you advice on where the industry is heading and what they are seeing show up on their desks.
  4. Focus on the fundamentals so that you will be able to apply what you've learned to whatever is thrown at you in the future.
  5. Don't stop learning when the class is over. Pick out the parts that interest you and delve into those subjects.

Finally, for fun, don't start playing an MMORPG till they hand you your diploma.

Reece