views:

2748

answers:

21

Just wondering what projects you would recommend to a beginning programmer who already understands the basics of programming, but has little experience actually creating large or practical projects.

If possible you could also mention the reasons you chose the project and some advise and common pitfalls.

This question isn't really language specific, but if you feel that the project you recommend is more suited for one language than others it could be mentioned.

+3  A: 

Think of a problem you have, be it math related, cooking related, or otherwise. Now make a project to help you do that task. Not only will you learn something, but you will be motivated because you will be working on a task you are interested in.

scubabbl
+7  A: 

In the direction of challenging puzzles, http://projecteuler.net/ is a good collection. Contributing to an Open Source project is also an oft-recommended way to get introduced to a large code-base and see how it's organized.

Tom Ritter
awesome link to projecteuler.net. i needed programming exercises. more than half the books out there never have exercises at the end of the chapter.
centr0
I like projecteuler, but it is not so much about programming as it is about math. You're going to wish you paid attention to those calculus lessons!
Francisco P.
+5  A: 

A simple game is often a good choice. Something like the Game of Life, or "Pong"...

Dima
A: 

When learning a new language or even trying to improve my knowledge of an existing one, I tend to create a library of some sort that can be recycled or reused. This can be good exercise and still remain relatively open to interpretation.

Depending on what language you want to explore, you can make a simple interface to one of your favorite websites or even a small library to compute some data or express an algorithm.

Nick Gerakines
+1  A: 

Try to find some little task you'd like to automate or make easier. It's always more motivating to work on something you know you'll use.

It's also fun to do programming challenges/competitions. One of my favorites is Project Euler.

Lucas Oman
+3  A: 

My advice is to just start working as many projects as you can. That may not be the answer you were looking for but its the best advice I have. As with anything in life, the more you do, the more you learn. If you aren't being tasked with a project at work just pick a project that you would find interesting. You could write a simple game that you like playing or you could try to automate some task or process that you commonly perform manually and that you find tedious.

As you work these projects, try to apply any theory or best practices that you've learned. Try to recognize where theory and reality come together in a land I like to call compromise. Also, try new things, go against theory and best practice. Don't be afraid to write your own framework even if one exists.

Mostly, just do it.

lfoulkrod
+1  A: 

The real key is to find something that is practical to you, if you have an interest or a need for something you will push yourself to keep making it better, to keep learning more!

Mitchel Sellers
+1  A: 

Anything that you have a need for and which you are interested in developing. Something that "scratches your itch".

In other words, don't pick something to do just because other folks think it would be a good exercise; pick something that really interests you.

JoshM
A: 

The best I can think of is a framework that supports a series of Solitaire style card games.

  1. They are fun to play - and testing is easy.
  2. You can do them in any language - so implementing in something new allows you to learn different approaches to the problem. Procedural (say C) OO (Java) functional (LISP or Javascript).
  3. They have a graphics portion, so GUI and graphics programming is touched on.
  4. As you research Solitaire games (Spider, Solitaire, Tri-Peaks etc) and implement each version, you start to learn a lot about code resuse, architecture, designing for growth, etc.
  5. The overall project is large enough to cut your teeth, but small enough not to intimidate.
Doug
A: 

I would say it needs to contain a few key factors:

  • CRUD database access
  • Multiple layers
  • Cohesive user interface (web or forms depending on your company)

The pitfalls that are most likely to be encountered are:

  • Validating and cleansing user input
  • SQL injection
  • Error handling
  • Badly structured code

The project itself does not have to be something particularly interesting and depends if there are any needs within your business. Some ideas that spring to mind:

  • Call logging
  • Bug tracking
  • Timesheet management

If you cannot think of a suitable project it would probably be worth asking your development team for ideas because there should be someone who has a suitable pet idea.

Garry Shutler
+1  A: 

I would recommend, Building a simple blog engine or a Content management system

It will build all the basic experience required around areas like,

  1. Building an object model - OOPS concepts
  2. Database interaction - DAL
  3. UI that works with the above - User interface
  4. Some amount of XML will go in to it.
  5. Regex for sanitizing (Jeff Atwood loves Regex, they are my favorites too)
  6. Event handling
  7. Logging and exception handling
  8. Styles - again UI

Of course any LOB (line of business) app that has the above mentioned points will also do.

Create something that solves a problem or a necessity.

If you are math oriented pick up a Game project.

Vin
+1  A: 

There are a couple existing questions similar to this. I recommend reviewing the questions with practice and challenge tags for additional ideas.

John B
+11  A: 

The most important thing is that it's a project you're excited about. It should be something you come home from work and spend time hacking on instead of watching the latest episode of Lost. It should be something you're hacking on until you realize you need to go to bed because you have to get up in 5 hours.

You might work on an music visualization like flight404 does with processing or programmatic music generator like Giles Bowkett does, or maybe butterflies between software and hardware. Write a tiny web server like Zed Shaw did in your favorite language - even if you don't know how web servers work, by having to write one you will learn more than you thought possible.

Read blogs, get inspired, and make something that you have never done before. It doesn't have to be original, you can reinvent wheels - that's useful too. Write something that you will use yourself - that's a great motivator to get it right and to fix the bugs you find, both actual and design flaws.

You will learn the most from doing something that you have never done before, that actually solves a problem you have. Write a blog? Write your own blogging software - maybe not fancy, but it should do exactly what you want it to do. Have a music collection? Write a php website that will show it off to the world, integrate with amazon for cover art and musicbrainz for metadata. Movie buff? IMDB interface sucks, it hasn't changed in ten years; write a better IMDB replacement for your movie collection.

Aeon
A: 

The program that I like, and was the second second program that I wrote, was a simple app that got the size of the recycle bin through the WinApi, brought up a form that I created and then gave the user an option of either emptying the Recycle Bin or canceling. If the user chose empty, the app then emptied the recycle bin. The original was written in C++. I would recommend this project to a .net programmer cause it involves: P/Invoke, GUI, a simple class, and event handling. It deals with understanding the OS calls and how/why they were designed the way that they were. Its also good cause it requires a bit of investigation on the part of the programmer to sites like www.msdn.com and www.pinvoke.net. Some of the things that I would recommend when doing this project is to not use the designer to create the form, but rather build the form in code.

MagicKat
+2  A: 

Build a book store.

Really anything that involves SQL, logic, and a UI to get stuff into and out of it. At first blush you can just build an object model that includes Books and Carts, but then adding categories, customers, adjustable pricing structures during checkout (for example: free shipping if you spend over $100), integrate with OpenID, etc etc. You can also experiment with different technologies like XML and Workflow systems. Play around with the internationalization features of your language and try making a French and Japanese version :)

Segregating the ability to add books to the store (administrate), and the ability to buy books from the store (shop) should help you get used to dealing with roles based security. The different code layers of "Data Access", "Mid-tier Services" and "Presentation" should help you learn where to put what.

Remember to build it so that you can use anything as your presentation. Maybe the ability to administrate the site is a thick client, and the ability to shop is a web page. Maybe the presentation is completely browser based, but next week it will need to be a windows app, and the week after that it will be a mac app. The phrase I use to describe this process is "insulating yourself from change". Hopefully you'll learn pretty quickly why that is important.

slf
+1  A: 

Oh, and programming quiz sites are great too. There's probably one for every language; I like RubyQuiz.

Aeon
A: 

My first programming project, and what got me excited about programming, was a first order logic theorem prover; a large component of the program was a parser, and learning about how to write parsers and how programming languages were implemented was, to me, very helpful.

nathan
A: 

It's been mentioned a couple times already, but I would recommend actually writing a program that either a) interests you, or (b) would find useful. As you said you want to work on a large or practical project, write something that you would actually use. (And maybe you'll end up with something you want to share with the rest of the world!)

In my case, I had assignments during my university chemistry classes which required data analysis, however the instructions for the analysis either, a) involved a ridiculous procedure or b) was too tedious that building a tool would have been better suited. As any programmer who hates busy work would do, I ended up making a couple tools that fulfilled the need of the two separate assignments.

Later on, when I had some time (read: session breaks), I ended up merging the two tools together to make a larger application, which I continue to add features to this day.

Perhaps the pitfall of my project was that as the program began to grow in size, the codebase became messier and the lack of good design principles led to a ugly mess. I'd recommend looking into books or articles on design patterns to get a good feel for what patterns to use under certain conditions and how.

In your case, you probably would have some practical needs to fulfill by starting your own project, say, a text editor that has version control features. Or, perhaps a cooking recipe appication. There are quite a few good suggestions that the other posters have mentioned, so find something that you'd want to work on, and get working at it :)

coobird
+1  A: 

Try implementing Tic-Tac-Toe. I had the pleasure of working with a young man who was practicing programming (his job was a tester and he was in a major wait cycle). It was a great task for him, and he could expand the application with increasing levels of difficulty.

  1. Figure out how to draw stuff on the screen.
  2. Figure out the user interation.
  3. Figure out the rules. (This allowed him to test w/ 2 players).
  4. Figure out a simple AI. Tic-Tac-Toe is easy enough that some of the decision logic can be implemented even by a new programmer.
torial
+1  A: 

Make a Tetris clone.

Terhorst
It is a bit shocking at first (does the world need another Tetris clone?) but it is actually a good advice: funny, non trivial, good learning.
PhiLho
A: 

If you want to practice finding program solutions, try some of the problems from this online programming contest site. There are problems for every skill level.

unclerojelio