tags:

views:

696

answers:

17

My question is broader than merely expanding language specific skills. I'm wondering what sort of advice anyone might offer to someone with a desire for knowledge, but a lack of direction. Feel free to skip down to the question.

Background: I've taken a single computer science course in java at my University, but i'm planning on majoring in Computer Science and Electrical Computer Engineering (ECE). My java class was quite rudimentary. We were provided with a framework and merely edited/created a few methods and classes to perform a simple task. We made a version of Breakout, and created an AI for a simple connect-four game. Although I'm somewhat familiar with big O notation, I haven't actually studied it in class (My next CS class covers this). In my introductory ECE course we also programmed BOE-Bots in PBASIC to compete in an obstacle course of sorts. As an engineering student, I was also introduced to matlab, although I've only used it for linear algebra homework. In summary, I don't have much programming background, but I've loved pretty much everything I've done so far, and I'm looking for ways to build a more valuable skill set.

Steps Taken: After paying more attention to the programming section of reddit, I found a link to Project Euler. This summer I've been hacking away at those problems (finished my 42nd solution yesterday), but I'm looking for some more direction. I've been reading blog entries and SO heavily. I'd like to learn something about php, and perhaps create a dynamic webpage, but fundamentally I want to do anything in my power do to improve myself and prepare for the working world.

Question: What would direction would you recommend for me? Should I learn a new language? Keep attacking Project Euler? Read some books on programming? Start a coding project(I wouldn't even know where to begin)? Wait until school? Learn about more fundamental programming principles?

I guess with all the paths available, I'm just a little overwhelmed, and I don't want to fall into a path that might be detrimental to my career opportunities. I'm also really bad at making decisions. Your advice would be greatly appreciated!

+5  A: 

There is only one thing that can improve your skills as a programmer: Program.

Reading books about programming is akin to reading books about cycling. It's not going to turn you into a cyclist.

Program something that you'll use and have a vested interest in. Then just put your head down and do it - reading any supporting information as you go.

rein
Do you think the only thing Lance Armstrong does to improve his cycling is actual cycling? Wouldn't there be some other types of exercise that he could do to improve his cycling ability? Writing a thousand CRUD applications isn't going to help you to learn anything. You have to be branching out, and programming stuff you haven't programmed before. This is the only way you are going to learn. Programming things you haven't programmed before is going to require things like, reading books, so that you understand what you are trying to accomplish, and how one would normally go about doing it.
Kibbee
Jim Ferrans
@Kibbee and @Jim : that's why I said: Read any supporting information as you go. Too many people simply read and think that it will turn them into whatever they read. To be a programmer, you have to program. Period. To master programming you need to program AND study various literature to aid you. Simply studying the literature won't make you into anything.Program first. Then use literature to guide you where you might go wrong.
rein
+3  A: 

Programming skills are just a small part of what makes a successful programmer, IMHO. Being able to read specifications, ask questions and interact with other people to extract the information you need to program are very important too. Pay attention to your 'soft' skills, they will help you a lot in being a successful programmer in a commercial setting.

Jeroen van Bergen
+2  A: 

I saw an interesting link for a site called CodeKata that might help you. The important thing to get your skills going quickly is to actually code for practical problems that you will be likely to encounter in any real job.

Steerpike
+2  A: 

Since you already know the fundamentals of programming, and obviously have the desire to learn I would start a pet project.

Nothing has forced me to learn great deals about a technology, language or idea more than having a fairly challenging pet project to throw my self into.

I would recommend, like rein mentioned, picking a project you really have a true interest in. Other wise it will get boring pretty fast and you'll have no idea why you are working on it. I think it would be wise to make the project fairly non-trivial. I always found the less trivial a project I was working on, the more I learned and took away from it.

Also If you live near a college/university research labs on campus are pretty much always looking for summer interns to work on code in one shape or form. Some will even pay you. I did this for 4-5 years through high school and some university and it was a great learning experience.

Obviously participating in an open source project is a great way to gain experience at working with other developers. Check out stuff on github, sourceforge, bitbucket.

I'd only caution you to ask for help and bother the core developers of a project you are very interested in and you are going to stick with. Generally open source developers dedicated to there project are few and far between. Their time is really valuable to the community and to waste it on someone who is just going to fly by night and never be seen again is kind of a shame.

Brian Gianforcaro
+2  A: 

Besides picking an interesting project and implementing it from scratch, reading others' code can also be valuable in improving your skills. Scott Hanselman has a good series on reading code: Weekly Source Code

Turnkey
+3  A: 

I'd reccomend you take a multi-pronged approach. Reading books can only take you so far, since they don't provide you with practical experience in developing an application from scratch. Programming is much more now about writing code; you have to be able to design applications, read documentation, and know how to solve the needs of a customer who doesn't know how to tell you what to write.

If you're still in college, try to find an internship with a development firm. You'll get access to people and resources who already have this experience. If you for some reason can't do an internship, find and make a friend who is a developer. The impact of having someone who knows what they're doing to bounce ideas off of is immeasurable.

In addition to surrounding yourself with people with knowledge, you should also take on writing an application all your own. Pick something that interests you, but at the same time try not to make it too complicated, you don't want to frustrate yourself by writing a boring application, or choosing something that has too steep of a learning curve. Remember that the application is at it's core, a tool to assist you in learning, so it's OK if it turns out to be less complex then you imagined, or if the code you're practicing doesn't apply within the scope of what you're trying to write.

KeRiCr
+3  A: 

You definitely need to write code in order to become a better programmer. If you don't have a particular idea for a program to write, pick an open-source program (ideally one that you use), contact them and find out what they need done; contribute something. Fix a bug, implement a feature... start small and work your way up. This will help you learn about working on a team, writing maintainable code, preventing problems, and working on useful tasks. Much of what people write while learning to program is just exercise code, and not actually useful or representative of anything realistic. That is why a real, useful program is the best thing to do.

Mr. Shiny and New
+1  A: 

Write programs to automate things that you do manually on a daily basis.

Like, todo lists, keeping accounts, checking RSS feeds.. the list could be endless. If you do some business on the side, write some simple code to assist you in that.

The essence is:

to improve your programming, do programing! :D

Here Be Wolves
+2  A: 

It sounds like you are writing programs happily, and are a decent java programmer. So writing more might not be your most productive way of learning new things.

As a result, I'd say learn a new language - knowing more than 1 always exposes you to new concepts. As a java programmer I'd suggest C/C++ as they've immensely popular but they fill areas that the 'managed high level' languages don't go, the low-level high-performance, to-the-metal applications. If you learn C# (for example) you'll find you're just doing a different dialect of java (roughly) and you won't learn too much.

If you don't like the idea of C/C++, get into a scripting language instead - bash, VBScript/WMI, or perl or python. they'll be sufficiently different to teach you some good stuff.

Or do both!

gbjbaanb
+7  A: 

Most everyone is suggesting doing more programming. Whilst that's obviously important, I think it's important to understand the environments that your programs work in.

I would investigate how operating system work (how they allocate resources for you, how they schedule programs and threads), how networks work (routing, TCP/UDP behaviours and limitations etc.), and some database theory.

I see a lot of junior programmers with great language knowledge, but beyond the sandbox of their program they don't have a clue how the computer/network enables their stuff to run.

Knowing something of the above will make you a better programmer in terms of how you write your programs, and how you understand how they'll work (and indeed, how to debug them or analyse their failures)

Brian Agnew
That's exactly the sort of information I was looking for. Do you have any more resources?
Grantismo
Not off the top of my head, I'm afraid. OReilly will always have good stuff on this, and it's worth looking at Richard Steven's Unix and Networking books. This isn't so much the sort of stuff that appears in blogs (unless people know differently?) but rather in books, so you may have to make a small investment in print :-)
Brian Agnew
Good answer, and so true. Tess from Microsoft Sweeden (http://blogs.msdn.com/tess/) has a .NET Debugging lab I always thought would be useful in exploring the inner workings of memory. While it isn't Java sounds like you have enough initiative to not let that hinder you, and the techniques will most certainly be useful anywhere.
David McEwing
+2  A: 

You already know how to program; in order to prepare yourself for a real life job, the most important thing is probably not how to program better, but to learn the things you'll have to do that aren't programming.

In your workplace, you most likely won't be asked to write line "fire and forget" programs, but work in a team on large applications. In order to do that effectively, you need to learn:

  • How to communicate effectively with analysts, customers, managers and your fellow programmers
  • How to plan and coordinate work: using source control systems and bug tracking systems, working with written specifications, following a development process - "software engineering"
  • Perhaps most importantly: get used to working with other people's code - third party libraries, frameworks, and of course colleagues' code.

This, too, can most effectively be learned through hands-on experience in a real project. For me, the big eye-opener was working in a group of about 10 students in an experimental project organized by university with some industry support. Perhaps you can find or organize something similar at your university? If it has a chair dealing with software engineering, they should be happy to do something like that if they aren't already. Failing that, joining an open source project is good too.

Michael Borgwardt
+10  A: 

The word quickly worries me... I suggest you read Teach Yourself Programming in Ten Years - Why is everyone in such a rush? ~~ Peter Norvig

Forgive yourself if you're not setting the world on fire three weeks after sitting down at the keyboard... maybe you're destined to be a late bloomer?

;-)

corlettk
I included "quickly" , because I'm impatient :] . Thanks for the great link though.
Grantismo
+1 from me - exactly right.
duffymo
@Grantismo, it's going to take years. So just keep plugging away at it, enjoy your growth and don't force it/burn yourself out.
Simucal
A: 

Find out about best practices (for example training videos on windowsclient.net). Get any problem and solve it using database as input and database as output. Start over several times. That's as close as you can get to the real world scenario. Read books recommended by Joel.

Domagoj Peharda
A: 

Here's my multi-prong suggestion:

1) Big picture work - Look at various Software Development methodologies and see how when you program you follow one of these approaches. You did some Java work, was that web, windows application, console application, or something else? Learning a little about the other types may also prove useful

2) Medium picture work - Have you looked at Refactoring and Design Patterns? These can be very useful but may require a bit more coding experience to see how they can be useful.

3) Small picture work - Study various algorithms and understand various trade offs one can make in choosing various implementations of a data structure, e.g. linked lists vs. arrays. There is a big white book about Algorithms that some use when studying them.

JB King
A: 

My multi-advise:

  1. Keep training, and write code. Participate in small open source project.
  2. Read standard book (here is the Jeff's list)
  3. Learn from your mistakes, or better from the mistakes of others by reading site like www.badprogramming.com
Steve Gury
See http://thedailywtf.com for more stories of awful programming.
Jim Ferrans
A: 

From 99 ways to become a better developer:

  1. Program! and try to diversify your work as much as possible
  2. Find a mentor
  3. Be a mentor
  4. Learn about the different aspect of software development other than code (business of software etc.)
Eran Kampf
+1  A: 

Contributing to open source projects has a surprisingly high impact on your ability to develop software, as opposed to the ability of writing code:

  • you get to work on code written by others, which is sometimes brilliant and sometimes abysmal;
  • collaborate within a geographically distributed team;
  • get introduced to team politics ( yay! );
  • understand what it means to have actual users.

to quote just a few. Some good places to look:

Robert Munteanu