views:

2007

answers:

26

UPDATE

Please do not post game ideas. I am not looking for game ideas here.

I am looking for ideas like; "Network browser", "File encrypter", "Notepad-clone", "Rss feed generator".

Hello world.

I have been programming on and off for some years, mainly with game development. Now I am interested in refining my skills in application development, and I feel like getting down and dirty with creating at least one usable application. I am quite wandered in C#, but I feel as if I haven't really done "usable" application yet.

In game programming, people often get the advice to start with some simple games such as pong, tetris and pacman. Pong focuses on getting input, rendering and collision working basically. Tetris adds problem solving through algortihms. Pacman adds more problem with agent behaviour.

I would like to get inspiration for a simple application that solves a problem. That is - a "window application Pong program". What would you recommend being a newbie application problem that fulfilles the following requirements?

  • Usability : The application should solve a recurring popular problem
  • Difficulity : The problem should not be too advanced, yet not too simple
  • Timespan : The application should take no more than two weeks to solve for a single programmer
  • Feature-"rich" : The application should consist of menues, allowing users to config the program
  • Platform : .Net 2.0+, C#

I would also want to play around a little with custom user controls.

Some of my own ideas include notepad-clone, mspaint-clone, simple file transfer program. While I guess these make up good exercises for aspiring application developers, I'd like to hear more from you. What makes a good beginnners application for programmers?

ACCEPTED PROJECT #1

I decided making a simple file encrypter. Actually, the library I wrote supports any stream, but I use it only for file encryption. I can't say that I have much of an application going on. I have a menu to open files for encryption or decryption, and an option window where you can set algorithm password and initialization vector. Looks boring. Feels boring. I am considering throwing in a file browser in it, to spruce things up. But then I could just integrate with shell.

At the moment, it only supports symmetric algorithms. Any symmetric algorithm deriving from System.Security.Cryptography.SymmetricAlgorithm should work, but I have only tested it with AES.

A: 

I suggest building a tool to help you program.

Like a text file differ, ftp client, or note clone.

That way you can learn about eating your own dog food. Seriously!

Link: http://en.wikipedia.org/wiki/Eat_one's_own_dog_food
TonyOssa
A: 

Personally I'd drop the C# application idea and pick up a book on dojo (dojotoolkit.org) or perhaps WPF or such..

I'm really enjoying the different approach from my normal back-end engineering work.

chrisb
Thank you, but I want some experience in C# application development.
Statement
+1  A: 

How about a library to allow users to create user-defined fields? I've seen it in more than a few applications, and it could really use standardization. Looking though your criteria list, I think it applies to everything you've listed.

Danimal
I am not quite sure I get what you are saying... Fields?
Statement
user-defined fields: You create a program like, say, MS Project. Ever task you list has some basic properties (deliverable, amount of work, start date, etc), but every company has different needs. For example, my company might need a billing code attached to a task, while your company might not.
Danimal
Such things are freqently attached as user-defined fields (UDF), which are non-trivial. Sometimes you need a base type (string or integer), but other times you might need a lookup list, or specially-formatted value.
Danimal
+10  A: 

My advice is to avoid those clones - notepad-clone, mspaint-clone - they have no real values other than as programming exercises.

Instead, try to find a real-world problem and write a small application to address that problem. That way you'll feel more motivated, more fun, and the application could end up solving a real problem and people could benefit from it.

SamS
There are exceptions, though. Paint.NET *is* really nice, despite having started as a managed clone of Paint (albeit with more features).
Joey
+4  A: 

I think you are on the right track with Notepad clone. Generally speaking, creating a text editor requires 'touching' many different parts of the language -- GUI, text manipulation, file I/O, regular expressions (if you want to do syntax highlighting), multithreading, etc. -- and would serve as a good learning experience.

Ben Hoffstein
You have good points here. It is a simple enough application to create, but the problem is very general. I/O, string formatting, regexes all is basic issues that should be mastered imho. I am a bit scared about threading still, but could see what I can do about that.
Statement
You can start with a general text editor and then give it a twist to make things more interesting for yourself. For example, you may decide to turn it into a simple IDE, or allow multiple users to edit simultaneously, or whatever. It can go in a lot of directions.
Ben Hoffstein
[regexes for syntax highlighting] -- really? Wouldn't context-free grammars be more appropriate? Or is lexing enough to distinguish between names of types and names of variables? It isn't in C++, IIRC.
Jonas Kölker
+4  A: 

Go for a "Time Tracker" app. There's some of those out there but most are done poorly and you might even have something to share at the end of the day. A simple way would be to allow entry of various projects then have a start stop button for time when working on each. A simple report could be used to show daily/weekly/monthly summaries for each project.

Turnkey
Good idea. That way I can use it when I code myself. I can then measure the next project in spent hours. +1
Statement
A: 

When I was starting out I took something that I had a need for and used that to build my design requirements. I was too cheap to buy Quicken so I used that functionality as a guideline for what my app would to. Something like that, IMHO, is a good place to start.

It's simple at its base level but provides a good deal of latitude for advanced functionality - spending charts, integration with online banking, support for Quicken & MS Money files, security, etc.

Chuck
+1  A: 

A simple "business automation" application might be a good idea. Write an inventory management application, or software to handle work scheduling, maybe?

Mark Bessey
I think that requires too much domain knowledge that I don't have. While it is a good idea for those who understands those kinds of problems, I will personally look for something simpler. Still a very good idea!
Statement
As an alternative, how about a cataloging application for your books or record collection? That's practically a cliche, actually.
Mark Bessey
+2  A: 

one of my uni assignments was to create a chat program. This had quite a few aspects to it, the server, client and text parsing, so you could have written commands, IRC-esque. This would be quite a good way to start, cos it has quite a bit of scope on difficulty

Richard
True, but I find it hard to see anyone would have a use for my application (including myself, unless I chat with myself). It makes a good problem, but fails at usability, since people often stick with their favourite chat programs. Unless I make an IRC client, or another-popular-protocol client.
Statement
A: 

There are many possibilities. In keeping with the SO tradition of "one answer per answer", I'll suggest: web browser. A simple one takes surprisingly little time to write in Java; I have every reason to believe it's easily done in C# as well.

Note that by simple, I mean all it does is provide a blank for typing a URL, and then performs the GET. Not too advanced, and gets your feet wet with the API in less than ten minutes. Then comes all the extras - graphical rendering, POST, Javascript implementation, cookies, etc. There are MANY features - more than would fill two weeks' time - but in nearly every case, you can stop whenever you want.

Obviously, it's been done before (or you wouldn't be here). But web programming is so open-ended that you could very likely brainstorm a feature that would be useful, that no one else has done, and then you could dress it up and submit it as, say, a Firefox mod.

Paul Brinkley
A: 

To do something that might be useful instead of a simple clone of something else, why not look to your favorite online app that provides a good API (maybe Google Maps/Apps, Flickr, Facebook etc) to provide some killer missing function! That'll get you working with web service stuff, useful knowledge to have IMHO.

Along these lines but an alternative approach to writing an app on your own, Facebook has some puzzles with something a little like specs varying in difficulty that might be of interest to help get you started.

Brabster
A: 

Write an application able to load a bitmap image and identify shapes on it. Start with a B/W image and evolve it from there. :)

Daniel
What is the usability here?
Statement
A: 

I recommend writing a video game. Video games are under rated by non programmers, but they require a lot of thinking and a neat design or you'll end up with spaghetti code.

The first program that I wrote was a Snake game and it really helped me to develop a more abstract way of thinking. Once it was done, I practiced a bit more by adding different levels, obstacles, odd rules and a special scenario in which a second snake appeared in the opposite position and it moved always to the opposite direction. Sounds kind of silly, but it is really a good exercise.

Usually the clever algorithms will be found in video games, not "real life" applications, thats why now it takes around 5 years to develop a play station game.

Since you already have written some games, take it to the next level. Add features like different difficulty levels, save the state of the game so it can be continued at a later time, add hidden cheats. This kind of features involve different kinds of writing and reading data. Techniques such as serialization or the use of XML.

For a "usable" application I would go for a music player, they are not easy to build. The prove of it is that there are many of them and none of them are perfect.

Gastoni
I am not interested in writing further games. Music player is sort-of-good idea but I doubt it will fit in 2 weeks.
Statement
A: 

Create a basic application that uses the same keyboard and mouse for two computers - like Synergy but not as complex.

This will not only introduce you to networking in C#, form development, but also how to use the Win32 interop. It will teach you lessons about how messages are handled, and low level application hooks. Also, for the networking side, you will have to learn about multithreading as well.

I wrote this on my own in about 4 days in C++. I imagine it would take a much shorter time in C#. With mine, I was able to move the cursor to one side of the screen and it would appear on the other computer - then all mouse and keyboard input would be redirected to the other computer until I moved the cursor to the far edge of that computer.

This was a very good learning experience for me. My main motivation was to work with a practical networked application.

nlaq
Cool idea. This would been so much easier to test if I had two computers at home. :) I still fail to see the usability of it, unless the video is streamed back to the client who controls the mouse. While it makes a good problem, I doubt there is much use for it. I will think about it :)
Statement
On my desk I have my laptop, and then a desktop PC with two monitors. You would think two monitors would be enough; but adding my laptop as a third is just awesome. Unfortunately, I found out about Synergy after my weekend-of-coding... But it was a great learning experience :)
nlaq
+1  A: 

Make a simple file encrypter.

TraumaPony
A very good idea for beginners that know about encryption. Shouldn't take too long to create. Could add some configurations to choose from different encryption algorithms. Perhaps make it pluggable with custom algorithms. I can see the usability here aswell. This goes to the todo-list! +1
Statement
A: 

File Splitter/Joiner File copier that emulates DOS's xcopy (both using a GUI)

Those are the two I used to do whenever I wanted to try out a new language.

ilitirit
+1  A: 

From my experience, the best thing to start with is something you would actually use. That way you have more motivation and when you're finished you have something extremely useful to you, if not others as well.

Before I was able to program, I tried every rss reader/podcast downloader and imo, they all had major flaws (used too much memory, unreliable or missing key features.) I knew that when I started programming that I had to create my own rss reader and that's what I did. I've been using it for around a year now, but more importantly I have been constantly improving it every time I learn something new. I'll find something here on SO and realise that it would be a perfect addition or a more elegant solution for my program.

So, ask yourself what application you're missing or would make your life easier and then start making it!

sieben
A: 

I usually find that doing something relatively useful and simple, like a contact manager or some other type of tool that will have benefit to you to be a good place to start. A contact manager uses various aspects of a UI, data storage, import and export in other formats, such as CSV, for data manipulation, configuration of settings for what information to view, how to present the information, etc. Lots of aspects of an environment can be utilized, and as you get comfortable with the technology, more features can be added using other aspects of the development environment. For example, you can move the application from Windows Forms to WPF, as a way to learn that part of the .Net environment.

It does not matter too much which application you choose, but if you choose something that you will use yourself, on a regular or semi-regular basis, you'll also have an easier time determining what features to add to it.

Another possible project might be a defect tracking system. Start with something light weight, and you can use it to track the bugs that occur in it, and that way you can test it by using it. There are also tons of features that could be added as time and desire present themselves.

Stephen MacDougall
A: 

Find a simple puzzle game you like, and implement your own version of it.

dicroce
I am not looking into making games. I looking for good examples of "normal" applications. I have already made enough game programming to fulfill my daily quota :)
Statement
+1  A: 

I usually give new developers the task of creating a tic tac toe game but in steps.

  1. Basic Tic Tac Toe Game.
  2. T3 Game that has separation of gui and logic, they have to use the same library for both a web and GDI app.
  3. T3 Game that has a computer that can play back with simple AI.
  4. T3 Game that can be played across the network and keeps score.

This tests a lot of things, it gets them thinking about design, architecture, reusability, and tests fundamental concepts of software development. It also shows them how to incrementally improve on the same application.

As a side benefit, it'll keep you developing games!

sontek
Yeah, but I am looking into making system applications. I want to try something else than games for a change.
Statement
+1  A: 

I have a few thoughts. First, when I started programming I asked my manager what a good application would be to start and he told me that I should write an app which details information about a website using , specifically he wanted it to:

1) List the names, sizes and load times of all the images shown on a page using the WebBrowser control. 2) Show the total page size and load time. 3) Show the results in a new web page.

This was a great intro, it helped me get familiar with objects, data structures, looping and regular expressions but it wasn't overly complex. Later I found all sorts of additional, useful features I could add. For example, I later added functionality to throttle the network so it emulated a wireless mobile device accessing a WAP page.

There are tons of apps that do the same type of things (like the Yslow add on for Firefox), but it was fun and taught me a lot.

I also highly suggest taking a C# app someone else has written and adding features to it since that's a common real world scenario. It will help you learn to read code, work with others and using other people's code.

Very good suggestion. I suppose I can find a lot of these apps at source forge
Statement
+1  A: 

Check out Project Euler at http://www.projectEuler.net for a 200+ very interesting problems. I've been trying to use LINQ and lambdas in C# to solve where possible to improve my understanding of these language features.

Matthew
+4  A: 

Build a password manager. It's a perfect project because you should never be using anyone else's.

"You should never use anyone else's" +1
FUZxxl
+3  A: 

I'd suggest making an application you'd use on a regular basis. For me I've always wanted 2 things:

1 - A simple contact manager that stores names, phone numbers, addresses, and extra notes.

2 - I'd like to write a time tracking program. At work, my timesheets are never filled out on time. For me personally, I'd like a program that runs in the system tray and pops up at me every 2-4 hours and asks me what I've been working on then stores all that in an easy to read plain text document.

jsl4980
Sometimes, the problem is to come up with just those ideas, right? Stuff you want on a regular basis :) Good inspiration, still.
Statement
A: 

It is nice seeing people that really want to learn.

I had a similar study project a couple of years ago. I simply concentrated on the technologies (Microsoft Smart Client Factory, DX Component Suite and IoC Container back then) and building the app reliably and efficiently in a short amount of time. For the implementation scenario I've picked app for extensible information management (since that's what, after all, all my full-time job was about).

And soon after this study finishing it I've got my first commercial project in exactly this area))

You can find screen-shots and a project report here (under xLim 1), if interested.

Rinat Abdullin
+1  A: 

I see that you have already picked an answer, however, have you considered building a Neural Network? As part of my university assignment, I constructed one using Java and enhanced it with a GUI, to allow more flexibility, and ease of use. My program simply recognizes digits in an 8 X 8 bit map. Although the GUI wasn't strictly neccessary, it helped me understand Swing (Java's GUI library) very well indeed, with multi-threading, event-handling etc in order to show a live progress of the Neural net training process and to draw digits on a panel to be recognised by the neural net.

* Usability : Artificial Intelligence is a nice field to explore, and quite interesting - IMHO
* Difficulty : Well, the algorithm used for Neural Networks can be a little hard to understand if you've never done one before, but this site does offer many nice AI examples in C# : http://dynamicnotions.blogspot.com
* Timespan : I implemented the Neural Network itself in a weekend and the GUI parts over 2 weeks.
* Feature-"rich" : There are a lot of features that you can think of. For example an animated graph showing the training process?
* Platform : .Net 2.0+, C# (I did mine in Java, but it's eminently doable in C# and .NET).

Also, I believe it will be more interesting than what you're about to do now..and a nice foray into the topic of Artificial Intelligence.

Jean Azzopardi
Good tips. Well I haven't really "picked an answer". Most thoughts are valid answers. Truthfully I havent had time to dig into app-programming lately but I did make a simple cryptography application. (Cont.)
Statement
AI programming is/sounds fun but I fail to see any real usability. Why would anyone want an application that recognizes digits? (I should be more careful to not make a comment like; "Who would ever want a computer in their home?", but oh well...)
Statement
It's a start towards exploring the field. Sure, it isn't usable in itself, but for me at least, it was a very interesting project, and one which will direct me into programming more useful applications. Consider it a sort of "hello world" for AI programming, if you will.
Jean Azzopardi