Volunteer Programming For Dummies?
Tios writes "I've been studying programming languages (C++, Java, C, Visual Basic) on my own with the self-guided, basic textbooks and tutorials, and I'm starting to get tired of working with examples that are not put into real use. I'm motivated to utilize my programming potential, but I've not had any experience programming in a team environment with lead developers, mentors, or collaborators. If finding a programming job isn't an option, I wonder if I could volunteer for programming in an open-source community. If this is a good idea, how do I start? What resources are out there that could get me oriented in volunteering? What kind of basic projects are out there, with a supportive team/mentor for me to develop, practice, learn, and contribute?"
The best practice is just doing it. That's how me and probably many others have learned about programming. In 90's I did have some programming and game developing books, but I pretty much read about those out of curiousity and because they were interesting. Actual programming knowledge comes from making something you like and learning from it. Every time you will learn more and more and it just goes along the way. In my teenage years coding games made the most fun out of it and I always learned more. This was even before Internet started to be so widespread, and only help I had was Delphi's (great!) manual.
Seems you only have experience in programming by examples. There's lots of times you need to be able to solve a specific problem, and programming by examples doesn't teach that really well. You will also be relying on someone's elses views and "best coding practices" thinking, instead of actually developing your own and seeing much further. You need to be comfortable programming and solving problems by yourself if you look to join a team.
I suggest you take some topic that's interesting to you and develop program around it. If you later get a better idea, don't be afraid to move into it. That's what happens to lots of programmers, but when learning it also improves creatly how you look at the problems and you see what you could have done better in your previous projects.
Here are a few notes I wrote a while ago on the subject:
http://kegel.com/academy/opensource.html
http://kegel.com/wine/sweng/ might also be of some interest.
Sourceforge
Gna!
The Wise adapts himself to the world. The Fool adapts the world to himself. Therefore, all progress depends on the Fool.
That was my first thought too - he's missing the *middle* step. In between examples and collaborating on a huge multi-programmer project he needs to make something for himself first.
Weaselmancer
rediculous.
I feel like I'm in the same boat as you. I like to read programming books and I feel that I'm pretty good at many of the higher-level languages; however, I'm not sure how to take that knowledge and apply it to an open-source community. I started by looking at Google Code and Sourceforge and the source code they provide for many programs. I feel like I'm capable of working on some of these projects, but it's intimidating when the program is stable and you don't know what to contribute. There are bug reports I can look at, but they are generally over my head.
Rentacoder.com. There are a number of requests out there for simple things, requested by people without any money. The strategy seems to be for people new to the site to do a few free or low paying jobs to get their rating up before tackling the high paying jobs, but a lot of these people just need something simple and don't have the time to do it and are (necessarily) understanding of people with little experience.
My wife does odd jobs on there every now and then. Unless you work at it, it's not going to be a good way to make money, but you'll get practical experience (coding experience, if not so much development experience) from it.
Whale
Pick a skill you want to hone and find a project requiring that skill that has problems. Download the code and start playing.
Request a contributor role or developer role on the project. If the team has it together, they will ask you for some samples or patches to their code base for them to review. After you've done that for a couple of patches, then you'll start getting some more access/authority and after a while, you're in.
A good place to start (for Java based stuff) is dev.java.net or kenai.com (pronounced "key-nigh") That's where most of Sun's open source stuff is handled.
If you want to really impress people, find a shortcoming in a tool, or a capability you want to have within your own stuff and create it. Then Blog, Blog, Blog... about it and register it with some open-source repositories like github (ruby / RoR) or Kenai (Java / JavaFX).
Make a game, even if you are not a big gamer, and there is a chance you'll quit it before its 100% complete. Here is why:
- Games are fun for the majority of people, even if you are not into FPSs or MMORPGs, perhaps you'd be interested in some sort of card or casino game, or perhaps a puzzle game, or a jepordy / wheel of fortune trivia game, or a sports game.... the list just goes on and on
- Game development covers alot of topics, obviously depending on the game, you will need I/O (eg keyboard / mouse handling), 3d graphics, networking / socket programming, AI, and more
- Even if you quit part of the way through, you might have an idea for future projects, or perhaps you can spin off a component of your game into its own project
There are many other reasons, these are just the few I just thought of.
While it might not be exactly what your looking for, I really have to give it up for the mind/life-suck that is MUDding for me, though you could just as easily apply it to the whole gaming universe as a whole, modding, etc.. It's something that brings both fun and function/al learning together, least it did for me.
:-) That was that the first one I did. Let's see, each CD has an Artist, and multiple Tracks, and each Track can have multiple Artists, each CD has a year, each track has a year, genre, cd has a name, bleh bleh bleh bleh.
Write some program to keep track of your CDs. Then, realize what a dumb-ass you are, and get a job :-) rinse lather repeat
you could join the Peace Corps and teach the locals how to write 'Hello Third World' programs using discarded VIC-20's.
"You can't really dust for vomit" --Nigel Tufnel
I think you've identified that as being the key for you.
Do you live near a Junior/Community College? They are often great resources for things like this. The computer club or whatever they call it these days is a great way to meet people you could collaborate with, and most of the professors at most of these schools (in my experience) definitely enjoy being mentors. You'd probably need to enroll in a class to be able to participate, but classes are relatively cheap and they might benefit you anyway.
When I finished college and relocated for a job, but didn't have a family yet, I took classes at my local CC for fun and to meet people, and joined a couple of clubs. This was a great experience for me, and there were several non-traditional (read: older) students who also participated (you might fit into this group). The great thing about the computer club was that other groups would come to us for help... we wrote a lot of programs to help the other clubs (especially the engineering club, since there was so much crossover in membership).
I'd imagine that the computer clubs now participate in open-source projects a lot, but it's been a while since I was involved... but it probably wouldn't hurt for you to start there.
"Trolls they were, but filled with the evil will of their master: a fell race..." -- J.R.R. Tolkien on Olog-hai
This isn't a bad idea. I've started attending our local .NET User Group simply to get ideas for projects. This was one that came up which I've been planning on doing for practice. There was also a simple .NET Woot Notifier for Woot-Offs which someone developed for himself.
The people who contribute most to the community are those who take a look and figure out for themselves what they might contribute and then get working on it.
Those who ask what to do are the ones who are joining because they like the idea of being part of something but aren't so willing to put in the effort needed to start contributing anything worthwhile. They will want their hand holding and constant reassurance from day one.... or I might be completely wrong.
"Volunteer Programming For Dummies"
The headline says it all. You have a marketable skill for which sensible people will pay you MONEY to perform. Giving that skill away for free devalues the skill AND your worth to the market.
To use the car analogy, that is like saying that since you enjoy tinkering and working on your automobiles, and thus posses the skills to do so, you should not work at all on your car or any other unless someone pays you.
What happened to doing things just for the joy of it, or even for bragging rights. Oh yes, and I'm sure being the creator and primary developer on that big open source project that now tons of people are using will not help you in any way in a job interview and / or getting a higher salary (see all of developers who authored / worked on an open source project on their own time, and later was hired and paid well by some company to work on it for your job)
I've had a lot of experience volunteering for non-profit organizations. Granted, it's not the same type of "volunteering" that you mention, but it is a very good path to gain not only coding experience, but leadership skills, business experience, and of course, contacts. On the resume, it is definitely a differentiator. In interviews, I am always asked about my volunteer work.
That being said, there are several pitfalls:
1) The vast majority of non-profits are inherently very conservative and risk adverse due to their unique cash flow situation. You cannot just go into a group and say, "I'll build you X,Y, and Z and it will be fabulous." You must spend time gaining their trust in a volunteer capacity they ask for. If they're advertising on a volunteer site for a programmer, great. You're in. If there is an organization you want to help, but they're not asking for IT help, you may have to spend a long time volunteering for them in whatever role they need, buddy up to the higher ups, then offer advice on how you can streamline things for them.
2) Be careful of the organizations you list on the resume. They might not always help. The homeless, animals, and children are all very good causes that won't offend anyone. Sadly, though, gay and lesbian causes may turn off a born-again HR screener. I'm not saying don't volunteer for controversial causes, but I am saying be careful of what you put on the resume.
3) Be sure you know what you're doing. Even though it is a learning experience for you, it isn't. You are not giving any long term help to a organization by selecting obscure tools and sloppy coding. You will not be there forever. This goes for paid work and non-profit work. You may be hit by a bus, you may have a falling out. However, the product you create will be used for a long, long time. Use best practices and common tools. Mod me down, RoRers, but I recently talked to a non-profit that couldn't find anyone with RoR experience willing to help modify an app that some fly-by-night volunteer developed. They spent months posting on Craigslist and the usual volunteer sites, and eventually had to agree on a complete rewrite in PHP from another volunteer.
If you really want real world experience, then find an open-source project where a key developer has just left. The more isolated, but critical the module they were responsible for, the better. Extra points if the details of their code was known only to them, and if they were fervently against comments of any kind. Step in and attempt to decipher their code in order to add enhancements. Request that the project leader withhold 50% of the requirements for all enhancements until 2 days before a release. Work 80hrs a week to implement those requirements on time, only to have the whole effort canceled at the last moment. Lament how you thought software development was all about teamwork instead of a shallow money trench where good men die like dogs.
I started at a general computer support/consulting company doing non-programming things. Made it known with my boss I was into that (my degree was CompSci), and we started doing inhouse things with Lotus Notes, which moved into web apps and SQL databases. Then clients started wanted work done and I was able to do that until now I'm basically doing web app/database development full-time with ASP.Net and SQL Server. The only drawback being I'm the only developer, so I don't get to interface with other devs to bounce ideas off of, or know when I'm on the wrong track with something.
On the other hand, I'm learning and playing with Objective-C on OS X from a book, which is how I learned the other languages I currently use, so if the books work for you it's not a bad route to take.
I will shred my adversaries. Pull their eyes out just enough to turn them towards their mewing, mutilated faces. Illyria
And who will pay him for programming work if he doesn't have experience?
You are not a great developer are you?
Drop the Visual Basic. Do it now. And never, ever, mention it again.
Confucius say, "Find worm in apple - bad. Find half a worm - worse."
I've been pondering over the same questions for some time, and appart from starting your own project (a good way, but not everybody has the creativity to make a successful new application, many skilled persons are best performers when putting into code someone's else ideas), I would advise you to pick a middle sized project (2 or 3 regular devs), and begin with ancillary tasks.
Many small projects build badly for instance ; so why not clean things up there, providing a good configure script ? Submit this, do the package for your distro, and maintain it. That should give you some familiarity with the code.
Do the code documentation if lacking, or write the user doc. Most projects lack this too. Read each line of the code in the process. At this step, you will certainly become part of the team in some way, and you will have expertise over the code.
Clean bugs. Now, you begin to have a feeling where they might be lurking.
Get involved in the roadmap. Code the new features you feel like you can.
That would be my take on the process
the best course ? find something that interests you, maybe something that you use every day - and find something you don't like about the product, or maybe think of how it could be improved.
it's famously called scratching your own itch.
why is that an effective way ? because you are interested, of course ! you see the results of your work, you use them.
what project to choose ? it's completely up to you. pick one, look at what they have on their web, wiki, join their irc channel, talk with people. see whether you like them - because that is important.
you could look at major projects who have specific sections to help new contributors like http://contributing.openoffice.org/ or http://techbase.kde.org/Contribute, or take a look at the many smaller projects in various categories like personal or system management software, games or... anything.
but really, basic requirements :
1. you are interested;
2. you can work with the people on the project.
everything else will come itself.
also, you are in no way limited to a single project - actually, it is beneficial to participate in multiple projects because you'll get familiar with various organisational, code versioning, documentation and communication practices. contributing a few fixes here and there can be very eye-opening on how these things come together.
good luck :)
Rich
Here's a few tips from my experiences. Try www.projecteuler.net Yes, they're problems with a well defined goal. But it's always up to you how to go about doing them. It's probably one of the best sites to help you develop problem solving skills using programming and forces you to delve into the often vast pool of predefined classes and methods that you will undoubtedly use again in your future if you're a dedicated programmer. I'd also suggest trying to recreate programs you've used before. One of the first things I tried to recreate was minesweeper; a project that vastly improved my recursive function programming, frame organization, and event listening. The point I'm trying to make is, the best way to improve your skills and put the knowledge you already have to good use is to just program. Go out (Well, since we're talking programming, I guess we'll stay in) and just experiment. You don't even need to have a goal in mind. Experiment with the limits of a language. Go see how well arrays handle redefinition. Find instances where you prefer one method over another. Try to improve on your past work and examples that you've been given. Just do it.
"The Y chromosome is genetic. The odds are very good that if you are male then your father was too." -Internet Commenter
Go to sourceforge, find a project that you have an interest in, and send a note to the developer to see if he could use the help.
Be honest about your skill level and intentions...
I do not read or respond to AC's. If you want a discussion, log in. Otherwise, don't waste your time.
Don't learn four languages at once. C++ itself takes a solid year of learning to be proficient. Anybody who says otherwise has no idea about how complex and dangerous C++ is.
Don't use "tutorials". They are always vain efforts written to bring attention or AdSense revenue. The very worst ones are video tutorials - search YouTube for "C++ tutorial" some time. It is sickening.
Find a problem you have, and try to solve it by programming. Like make an address book, where you can enter in people's information and search by last name or something. Or make a program that organized your MP3 and finds duplicates. Or make a program that automatically solves Sokudo puzzles. It'll be something with utility you can use and play with, and improve over time as your skills increase. Good Luck!!
I have helped with OpenVZ and mysqlBind/unxsBind/iDNS. What I liked the most is that you don't need to be an expert kernel hacker to provide value. And the unxsVZ source code is very easy to read and code for. Since they use academic UK style C indentation and not the K&R classic style.
The government has a defect: it's potentially democratic. Corporations have no defect: they're pure tyrannies. -Chomsky
It isn't open source but it is volunteering for non-profits. I'm actually volunteering as a developer next weekend. Student volunteers are accepted and they are partnered up with more experienced developers. The projects are scoped to be completed in a three day time frame, and it is a great opportunity to meet people in your field, not to mention being able to contribute to a worthy cause.
God, schmod. I want my monkey man!
There are a growing number of Mono based applications being released into the wild in an attempt to undermine the Linux world. Pick one you think you might be able to port to C++ or C or some other non Microsoft language and get cracking. You'll be doing all of us a favour.
Says the guy who dreams to work at Microsoft and is too dumb to be accepted by the community.
http://www.kde.org/getinvolved/
-- I was raised on the command line, bitch
Programming has always been about "scratching your own itch", at least that's how I got started in the early 80s when computing classes were introduced at our school in the mid 80s. I wrote a simple basic program on a genie16+ to help us with our maths assignment (some linear algebra stuff) and we both promptly got an "A" for solving the problem in an intelligent manner and not just crunching the numbers, er equations by hand.
I agree that in today's IT world, software is available out there in abundance that probably solves 99% of the problems you might have tackled yourself 20 or even 30 years ago, but there's always something left that may seem interesting. Maybe it's not even outright programming, but "scripting together" some available tools to do a job not previously thought of by the original designers.
The last pet project I worked on was a "remote control" for vdr because I got fed up with vdradmin-am's javascript based remote control that disappeared whenever I had to restart Minefield (so daily as I'm running 3.6a ;-). I needed a stand alone program for that, so I dabbled with Mono and its gui tools a bit, but ultimately ended up with coding something rather ugly in glade / Python.
Of course any python guy worth his salt would ban me into the lower chambers of VB development if they saw the code, but even after 25 years of dealing with computers it's still a bit of a buzz to use your own stuff, something you wrote and that can be adapted quickly to scratch any new itch that might come up.
In closing, you'll find something to work on without ever resorting to sourceforge if you think long and hard enough.
Ever wondered whats wrong with the world? http://www.ishmael.org/
Try some of the easier projects on http://codegolf.com/ . The goal is to write the code to create a given output in as small a file size as possible, but it gives you a defined goal to achieve without being too much like the "Hello World" programs you find in every programming book and tutorial on the planet. Some of them are pretty easy, some of them i just stare at and wonder how on earth I'd ever complete them. A lot of them (maybe all of them?) are more about creativity than knowing obscure functions in a given language.
I wonder if I could volunteer for programming in an open-source community.
There is an infinite supply of worthy projects. The hardest part is not the feature/bug you intend to do work on, it's getting a handle on the coding style of the project. One person's readable code is another person's spaghetti code.
And then there's the social hurdle of contributing code. If the person maintaining the code base may not accept your patches. Don't take this the wrong way. If they are motivated to assist you in becoming a better coder, they'll give you good feedback. If they aren't, and many times they won't be, then don't let that stop you from maintaining a set of patches and perhaps a build of the same code.
Whatever the depth of your motivation enthusiasm, you want to match your time commitment/capabilities to code quality. For some, a little time is needed to do elegant coding. For me right now, lots of time. So, I contribute minor things whenever possible while others more skilled would contribute by solving harder bugs adding bigger features.
If this is a good idea, how do I start?
Start today! (gorrilla biscuits anyone?)
http://www.maxineudall.com/2010/02/should-economists-be-sued-for-malpractice.html
The existing forms and reports development platform included in OpenOffice needs a ton of work. Take a look at M$Access. It's a very easy-to-use development platform but the back end is NOT a real database (like, say, PostgreSQL, MySQL).
*** Don't be dull.***
Think of a problem that you would be interested in solving. (this is how most open source projects start) Once you've got an idea, look to see if a project exist. If you find one (or a few) see which one interest you the most and make contant with the project and see if you can offer help. Being inexperienced can be a road-block, but you have to keep at it. If you don't find a project you like or are unable to help out, start your own! Head on over to SourceForge and create a project!
Android, iPhone, WME: your choice.
These gizos are loaded with more GUI devices than average computer which suggest creative uses. At the same time cell phones have less computing resources- almost as small as a 20th century computer [shudder]. Limited resources can teach you some programming economies.
Look into GNU projects! http://www.gnu.org/ for example, kde is always looking for developers :)
http://www.kde.org/getinvolved/
I think these are good places to look for projects * ~
If you started programming as a hobby, you need feedback to see if you are proceeding correctly. Take a couple of community college classes. Usually the instructors are experienced software engineers who are teaching on the side.
Hey there, We created Codekindness, http://www.codekindness.org/ a site that links volunteer programmers and other techs with nonprofit organizations. Interestingly, the project itself needs some support, and so if you (or anyone else) who reads this would like to take it over, please contact me (through the contact form on http://www.plml.org./ The site has been successful in the past, but there simply isn't a time to run it now - despite that the need is greater than ever. Want to make a difference? It's an open project! Cheers, --Dave
If you never wrote anything useful, or are not able to think of any meaningful goal, you are still on a basic skill level. If you need other people to motivate you to keep learning, programming may not be your vocation. It isn't the end result what motivates a developer, it's the joy of learning, and writing software is part of it. But don't despair, I guess you didn't see the whole picture yet. Choose a language and start reading weblogs, you may find a vibrant community to inspire you. And more important: have fun, only that will keep you going.
Depending where you live, (Me in Canada)...you at least need the certificate to open the doors, just doing it in your basement does not cut it anymore. If we lived in the old world based on skill and merit, maybe but, the new world is all about what's on paper.
Although a certificate does not mean much, it can portray you at least respect you need some sort of formal training and
this will let them believe that you might also respect their company's structure.
When I was in your position, I happened upon a local food coop that needed some programs written to help with mailing lists, customer info, etc. They didn't have much money and I didn't have much skill - it was a perfect fit. This helped me in my programming and more importantly, how to spec/estimate for programs and communicate with customers. I also got some free snacks and drinks every time I went to see them.
Error reading device 'Signature'. (A)bort, (R)etry, (F)ail?
Find an Open Source project your interested in (I work on OpenGroupware) and ASK! If you demonstrate you are seriously interested I doubt you'll have any shortage guidance. In Open Source, and probably proprietary shops as well, aspirations also exceed available resources (time).
Using "Common Sense" is being either to arrogant or to ignorant to ask people who know more about something than you.
Step 1: find a peice of F/OSS software that you are interested in, use, or would like to use
Step 2: use it to do real work
Step 3: notice something in the product that appears to be a bug or a limitation related to your real-world use or desired real-world use
Step 4: grab the code and start looking through it. Determine where in the code the problem seems to exist. If this is a segfault or something, fire up GDB, get a stack trace, grab the correct variable state to show the data conditions leading to the problem
Step 5: construct a repro case for the bug that shows it is a problem with the code and makes the problem portable out of your environment into the maintainers environment
At this point, you can contact the maintainers of the project if you want to. They'll appreciate the detailed research you've done and usually it won't take them long to come up with a good fix.
Or, you could keep going
Step 6: construct a hypothesis about what the problem is. If you have a repro-scenario and know where in the code the problem is surfacing, work backwards to understand the data and instruction flow that gets you from reading the repro state to the code blowing up. Based on your understanding, form a hypothesis as to what the specific defect is.
Step 7: begin working on a local fix (i.e. don't do a world-visible checkout to a version control repository) to the problem. Continue iterating on your fix until the repro-case you identified earlier appears to have been repaired. Now test the program on cases that used to work prior to your fix to do some sanity checking that you've not introduced regressions.
Step 8: once you have a fix that appears to work, check your fix against any coding styles or other conventions that appear to be in use in the project. You may want to look at past respository commits and comments in the file(s) you've worked into infer as much as possible about this.
Step 9: wrap it all up. Compose an email describing the problem, the repro case, your understanding of the the solution, your patch, and the tests you did on the patch. Email the maintainers of the project and ask them if your problem and solution make sense.
Step 10: based on what the maintainers say, your work may be done or you may need to iterate on your patch to improve its quality or conformance to the projects expectations. Your goal is to get a developer to accept any part of your work -- ideally, they'd commit your patch as-is, but if nothing else, the investigation you've done thus far will be helpful to them if they want to do a "better" fix in the future. And the tests/repros you've documented will be helpful for you (and them) to try when evaluating future fixes.
This is the easiest way to get your feet wet in _any_ F/OSS project. I've contributed small fixes to a few different projects, and all of them were because I was trying to do something with the software that didn't work for me and my scenarios, and I investigated the problem to resolution and then submitted my findings to the real maintainers. In no case have I asked to become "part of the project" or any other such thing. If you find yourself drawn to a particular project on a regular basis, doing what I've described on a frequent basis will show the existing maintainers that you are serious, you are committed, and that you do good quality work. They'll ask YOU to start looking at stuff above and beyond what you've already done, and the involvement and sense of inclusiveness will happen naturally.
Most people love to get free work done on their projects. Most have open repositories, email lists, and IRC channels. Just get to work :)
My opinions are my own, and do not necessarily represent those of my employer.
For me it used to be about creating character generators for various role-playing games. I had some pretty good ones back in the Commodore days. I especially liked my Star Frontiers generator. Good times, good times.
If you live in a 1st world economy, I wouldn't bother w/ RAC. Most buyers will only pay 3rd world wages to RAC sellers.
If I were wanting to break into programming though, it seems like a good approach - it's better than an unpaid internship in that you earn a little, and have some practical work experience you can point to (which is more than a number of college grads can say).
"There is more worth loving than we have strength to love." - Brian Jay Stanley
A lot of comments here are of the "scratch your own itch" or "just find a project and dive in" variety. I think those are great ideas.
But what about finding a mentor or coach? I've been a professional developer for about eight years now, spanning two jobs. In my first job, I had a mentor. Not so much for coding, but just someone to show me the ropes around the company, explain why things are the way they are, etc. I learned a ton from him; maybe stuff I could have learned on my own (or at least via asking lots of different people questions), eventually, but the frustration level would have been significantly higher. My mentor ultimately moved on, but by then I had gained experience and responsibility in that group. I knew what I was doing.
Another, experienced developer came into the group. I wouldn't call him so much a mentor, but a peer who was great just to bounce ideas off of. We could have easily worked in "silos", with a minimum of communication, and probably been reasonably successful. But, again, just having a willing cohort made things go a lot more smoothly.
All the above regarding my previous job has been underscored by my second and current job: no mentoring, total "trial by fire". Yeah, I know what I'm doing now, and can get by well enough. But I was miserable for a long time, given that there were simple things that someone could have helped me with and saved me a lot of time and frustration. And the "team" I'm on consists of me and one other guy. The other guy could have been a mentor, as he has several more years of experience in this field than me. But his communication skills are awful. And even though his code works, everybody who has ever looked at it cringes in disgust. So, if anything, he's an anti-mentor.
The point in all this: in coding, or even work in general, it's nice to have a mentor, or at least a teammate with whom you can have an intelligent conversation. I personally find myself learning more, at a faster pace, and less frustrated when working with someone who's at least in the same ballpark as me mentally. Especially with coding: I greatly lament my current lack of teammates with whom I can do "cardboard programming"---just talking through my work out-loud, or bouncing ideas off someone often results in better code or design, or in the worst case, a better understanding of the issue(s) at hand.
It's less important for you to read books on how to use specific programming languages, and more important for you to know how to code well. A book like Code Complete is a good start. Make sure you can write clean, efficient, well organized and sufficiently (but not overly) commented code. Once you are confident you won't be doing shoddy work, hop onto a site like Sourceforge and start browsing the open source projects on there. Pick an application that interests you or maybe one that you already use and enjoy.
Start by writing small enhancements for it like bug fixes, plugins, addons or new features. Submit your code to the project's community for review and critique and feedback. See about having it added to the core application or to the list of plugins. Log your bug fixes on to the bug reports.
For example, I really enjoy using the open source Wiki engine Dokuwiki. If I was going to try starting to learn PHP (I already know it) I might start by contributing some plugins for Dokuwiki for example.
I would agree with many of those saying start your own project first, or some simple stuff from places like Rent-A-Coder that another poster mentioned.
The thing is, that being not very experienced you could well do more harm than good to start with. It's why it's so hard to find a job with a company just starting out, and also why you might have trouble integrating at first with a big open source project.
So you need to build a bit of real world experience... your own project is good, as long as you publish it somewhere so people can look at it and decide if they like the work you do. You could go into an established open source project and do simple fixes here and there, submitting them for approval until you build up the credibility to be a committer.
I'm not sure I'd go into non-profits as one person recommended, because chances are you are going to be The Guy. That is really the situation where you could do more harm than good until you do have the experience to ask them what they really want (or better yet, really need) instead of building what they say to build.
"There is more worth loving than we have strength to love." - Brian Jay Stanley
I'll try to be as unbiased and fair as I can.
First, I would not take someone with no experience in programming into any of my projects. I expect the projects I'm working on to be, at every level, as thorough as they can be, and this will not happen with a completely inexperienced person. IF I would decide that there is a small part completely isolated and replaceable (and re-writable by an experienced person in a couple of hours), which would not effect the performance and security of the product, then MAYBE. But, in general, would be a no.
Second, the fact that you assume that's the language that counts makes me see how inexperienced you are. Is not enough to know programming languages, one should know basics about how a computer works (some OS understanding), how certain networks or protocols work, what algorithms should be applied and when, basics about transactions, files operations and sharing, possibly databases, and frankly some parallelism and multi-threaded programming. I wouldn't be worried if one doesn't know that should use a "repeat/until" instead of a "for", but I'll be worried that a highly-used table in a database will be locked.
In conclusion, define a problem you'll personally like to solve (same way that youtube, facebook, twitter and myspace started), and bang in it until it starts looking like a "product". Consider it a serious project, think about source control, backups, test harness to check the performance and security, and it will give you enough insight to give you the experience you want... With a project done (or sufficiently advanced) at your belt, you should be a lot more marketable.
Good luck
I had another sig before, but this one is better
I'm sure this point has been made in one way or another but I want to make a simple point about Open Source and beginning programming. Open Source is driven by private projects.
If there is something you'd like to use (i.e. an application that interfaces with something or calculates something for you) and you don't know where to find it build it! That'll give you the experience AND that's how most Open Source projects start :) Even better, if you'd like to integrate something like Twitter or Facebook into something you'll get experience doing something for yourself using tools provided by someone else (so you get that mentor/lead dev kind of feel).
If dealing with web stuff isn't your cup of tea theres always Android dev or something like that. With Android you'll have the experience of using Eclipse and all that while developing for a simpler platform.
I'm only like 1 step ahead of you in all of this so I hope my advice helps. I'm explaining what I've noticed going through the same motions you are :)
Here is why you are making this a difficult problem for yourself. Social and technical skills do not have to be acquired simultaneously. First and foremost, programming is best learned on your own, and programmers often aren't good teachers of teamwork to begin with. So I say, do something specifically for teamwork. Like, picking up a team sport.
If you are making social skills into a technical problem for yourself, you are already starting off on the wrong foot.
If you want to become the leader of a programming team, first and foremost, you should be the best programmer on that team. If you were at that level with your programming, you wouldn't be looking to volunteer.
If you just want to be on a team, but not necessarily lead, then you don't need to focus on team skills. Just get your foot in the door with your programming portfolio/degree, and learn at the workplace like the rest of us.
Get open watcom c++ http://www.openwatcom.org/ and start here: http://www.scene.org/dir.php
Are we talking about dummies programming the volunteers?
I think the scientologists are over there ---->
Confucius say, "Find worm in apple - bad. Find half a worm - worse."
congratulations for deciding you could use someone with experience to be around
go to the most challenging and difficult shop you can possibly. not a community college or a university.
someplace where they write compilers for toy languages over a weekend. can spend an hour talking about the
first 100 instructions after hard reset. someplace where they actually code instead of whinging about patterns
If you haven't seen it already, you'll want to watch this great Google Tech Talk on how to survive and thrive on Open Source project teams.
Beyond what the title claims you'll learn from the talk, you'll also also come away with a ton of excellent insight into how to recognize healthy project teams.
I was on a message board for a while and had a strop and threw my rattle (long story, nobody comes out looking good).
Anyway, decided I could do better myself.
I use Oracle at work, so knocked up something in PL/SQL. Now nothing wrong with Oracle, but it's a slight over-kill for a message board and a little expensive should you choose to license.
So I picked up an O'Reilly PHP/MySQL book and started reading.. then got bored and started coding.
It is SO much more productive to have a goal and bang your head against it until it crumbles (the tears and suffering fade from the memory). Anyway, got it done and if nothing else I have new lines for my CV.
Site was popular, over-ran the shared hosting, so now leased a dedicated server (kind patrons of the site pretty much cover the lease).
Once you've got the server, the mind wanders - so SSL, mail servers, MMS/SMS integration, Google Maps etc etc follow. Once you've got a 'project' suddenly feature creep is quite fun - get to spend an evening prototyping something, and if it works then you have a new feature. (bobpitch.com)
Next 'thing' was that I wanted to sell some DVDs on Amazon/Ebay - I'd bought NAS and was going media-less. Found it a pain in the arse trying to work out what stuff was worth cash and what wasn't. So stumbled on the Amazon API and automated it. Seemed a waste not to share my knowledge, so just shoved up a domain with a lookup on it (checkean.com).
Then somebody saw that and actually asked if I'd make a tool for them that would bulk it through CSVs and check another site. Other site didn't have an API, so I learnt about curl. Anyway got it working and got a bit of cash. Doesn't match my 'real world' hourly rate, but felt so f'in good for somebody to recognize your tinkering as being worth cash. Since then a few other people have stumbled across it, and signed up as well.
Anyway, not quite sure what my point is. Maybe there are a few:
PHP/MySQL - Easy to make stuff with and bang it out.
Web Apps - People will 'find them' and you get to plunder and mash all the rest of the stuff that's out there. Build what interests you - and tinker yourself stupid
Work alone - Personally, I have enough of hierarchy at work. The stuff I do is MINE. I MADE IT. Doesn't mean others haven't helped me out and that I don't appreciate the help, but just something lovely about an idea coming into your head and making it real. Message Board 'project' is sortof finished now and code's been cleaned up. Few more things to do, but then I'll chuck it at sourceforge. I like OSS, but seemingly don't like sharing.
There's probably more and I think I'm just repeating what others have said - I'll stop.
When I learned to program, I think reading a lot of source code from different open source projects I was interested in helped me a lot. I usually picked up small enough programs. You don't need to understand the whole program either, if you're bored, you can satisfy yourself with only a piece of the code. You'll have to do that and read books too, because sometimes you will come upon programming constructs that you don't know but which are commonly used and documented in books. For example, once I discovered a linked list implementation and tried hard to figure out how the hell it worked, then later I read about linked lists in a textbook. Reading source code shows you how to write clean code (or at least recognize clean code from dirty code), lets you pick up coding styles you like, and above all shows you how scores of programming tricks and methods are used in the language of your choice. Things that you may only know from one lonely poor example or exercice, you will get them in the real code, with a more practical and significant context and purpose.
"Just dive in" works for some, not all. Dreamwidth.org is a LiveJournal clone that has a lot of support and mentoring for new coders. THe idea that people need help and encouragement and to do things in small steps is built in to their development model.
(The subject was the title of a research assignment I was once given in Jr. High School).
Gee, it's almost like they don't want people to learn to how to contribute.
There is no royal road to learning. It's very much an individual thing. You will find that in most serious projects, there are instructions as to how to go about contributing.
I can tell you how I did it ...
First off, pick a project that interests you. You do not have to be any sort of an expert at first. Then, hang out where people are asking questions, user interface-wise, programming-wise, it doesn't particularly matter which though a combination of both helps. Then go through it and research the answers to the questions people are asking. Start posting answers when you get confidence in yourself.
Once you have a bit of reputation as someone who answers questions, it will not take much, you can offer your services doing documentation. Open source projects are always looking for people to do that. Probably someone will ask you first before you offer services. The best part is that documentation is what separates the pros from the rest of the field.
After you've done all that you're in a position to start tackling various programming assignments. These will vary from project to project. Start with simpler things first and work your way up.
In my case I went from answering various questions on comp.emacs, and later, comp.emacs.xemacs to getting interested in Gnus and writing the first Gnus 5 FAQ. When the XEmacs FAQ maintainer stepped down, I was ready to take that on too. Post 19.14 release, I tackled the barrage of questions and issues on comp.emacs.xemacs. By then, I was starting on doing various maintainer sorts of things like random bug fixes, synching newer lisp code and stuff like that.
When Chuck Thompson decided to step down in the autumn, they ended up asking me to take over in his place.
And yes, when I was Mr. XEmacs, I wrote letters of recommendation for every contributor who was looking for his first job out of college who asked.
If you're looking for cool random things to hack on just for the joy of programming, the ACM Programming Contest http://developers.slashdot.org/article.pl?sid=09/04/22/1820229 has some interesting looking problems to solve. Perhaps choose a language you want to learn to write your solutions in.
Incidentally, I initially got started programming by hacking an existing Lunar Lander clone written in GW-BASIC and provided with the family computer.
Yeah, that's a good idea. I was very, very lucky when I wanted to become a Unix expert in the mid 1980s. I had a System V-oid box at home and much of the code posted to the old Usenet source code newgroups (particularly games) were written for Berkeley Unix. Porting the stuff I was interested in to System V was as much fun as educational.
Actually, I believe everyone reads the links (ObCarAnalogy: you pretty much have to look; it is not entirely unlike an auto accident scene in this regard.) What is much more rare is for people to click on the link, read the article, give it careful consideration, augment that with some research, and post an intelligent well thought out post peppered with interesting, insightful observations and funny anecdotes. Oh yeah, I almost forgot ... if you do what I just described - and this is especially true if the subject involves Windows - you can expect to get modded as a flamebaiting troll.
Guns don't kill people; Physics kills people! - John Lithgow as Dick Solomon on Third Rock From The Sun
If you are really just learning to "program," then practice alone first by working on a solo project. That's because working in a group requires lots of skills that aren't directly related to what is typically called "programming."
For instance, lots of open source projects are concerned with portability, meaning they need to use something like Automake and Autoconf. Working with these systems requires some knowledge, and although it is "programming" it's probably not what you had in mind. When you write something for yourself, all you have to know is that it works on your system.
Collaborating may also require that you use a version control system like SVN, CVS or git. These tools are not easy enough to learn in five minutes. They can be handy when working alone, but when working alone you don't have to mess with them.
Penny - plain text accounting
I've got a small project that will benefit allot of people moving to GNU/Linux. I could use some help on enhancing it if you are interested. It is a firefox plug-in that is finished to the degree it is ready for distribution. It lacks allot of desirable features you could work on. Nothing too complicated either. Send an email to jade -@- kglug do.t org.
well, I'm working (thinking of working?) on a project: visit www.mathspace.net & if your curiosity is piqued, contact me. In other words, I am volunteering to try to be a supportive mentor. In any case, I admire your initiative & wish you good fortune in the endeavor.
You seem more skilled than I!
Just browse Source Forge for a bit to find a project you would like to (or have the skills to) contribute to. If you already know a project which meets these criteria then that's great. Go hang in the IRC channel and maybe just start with some bug fixes or a simple plugin.
You can also be of great help to some projects and not "just another contributor" by checking out which projects are looking for help. Go to the SourceForge Help Wanted section and pick your weapon/project.
As long as you know how to write documentation, administer a mailing list/forum or do HTML/CSS then you can get into FOSS.
I think you would like to do something in the middle of an "big" open source project, and just small testing examples, and start with something that is a bit competing and difficult, and when you succeed, go on with a new harder project.
When I started programming, I made a lot of useless programs to test out different things.. After getting tired of doing that, I started to make different games. Usually based on that you are a person just walking in a two dimensional world. After a while I found Simple Direct media Layer:
http://www.libsdl.org/
Looking through the introduction, you can see it is fairly easy to load in graphics from a .bmp file, and display it. I will recommend you to try writing a game like tic tac toe, drawing board and bricks in any graphical program, saving as .bmp. If your not used to making things like this, you probably would get more or the less stuck sometimes. But when you find a solution to your problem, it would probably give you a good kick to continue. After you finish, you would probably have the self confidence to a larger project, maybe a open source, maybe a bigger game, or another useful program/utility. I recommend that if you don't know what to do.
Another tip. Maybe you already do know, but I was knowing the basics of C++ for long time(self thought), but actually I didn't know about standard template library, STL. If you do not know about STL, I really would recommend you to study it, not only how to use it, but also how it works. A vector may often come handy. Before I knew STL, I made those things by myself. Another funny thing to do, is to try implementing something like Dijkstra's algorithm(and others, like quicksort and mergesort if you not already have done that) in C++, such things also makes you have to think and focus.
If you not have done those things I've mentioned, I will recommend you to try. If you have implemented all of above(more or the less), you should be prepared for any project(but you just don't know or are aware that you actually are good enough:).
Myself I've been programming several years, since I was a little kid. I've been teaching students(that sometimes looks to be completely lost in the beginning, but in the end they succeed on their assignment). I think in programming it is not the most important to have a lot skills in everything(but is definitively useful), but having confidence to attack a difficult problem and figure out what you need to know on the way to the solution..
If you get a task, but don't know a good solution, then try to find any solution(that will solve the problem, even "bad" ones). Maybe there aren't better solutions, or maybe you would find a better solution later.
Happy programming.
Are you trying to get experience so that you are more marketable in the job market? If so, and you're in a post-secondary, try internship / co-operative education.
If you just want to program for the sake of programming, try contributing to an existing project.
If you're trying to learn how to run one, start a project.
This is by no means the definitive way to do things, nor correct, but I think you get the idea.
You don't need to ask anyone permission, just show up and start helping out. If you check out the source code to the Apache HTTP Server (find out how at http://httpd.apache.org/dev/devnotes.html), you'll find 50 instances of the word "FIXME" in the source code (case insensitive search). Check out what the original author thought still needs fixing, and post a patch to dev@httpd.apache.org. Alternatively, you can look in the bug database and start picking low hanging fruit. Again, no permission needed. If your patches are good, they'll get committed. If they aren't, we'll tell you how you can improve.
You will find that every project has its own coding conventions, macros, libraries and idiosynchrasies. Real code will look very different from the examples and exercises you have worked with so far. You'll have to learn the particulars and become comfortable with each project you take on. This is a tedious and uncomfortable process, but it does tend to pay off.
What Would the Fab Five Do?
I have a project or 2 that I've been looking for help with. We're a small team (maximum 3 coders right now) just doing things for the fun of it. Come on over to www.dragoncontroller.org and introduce yourself.
G'Day I'm currently working on a project written in Java for a volunteer organisation and I'd welcome all the help I can get... you or anyone interested in finding out more drop me an email at sir_september@yahoo.com.au
Net Tuesday is about using the social web for social change. Have you looked into this community for volunteering your newly minted programming talents? If there is not a Net Tuesday in your area, you could always start one: http://www.netsquared.org/share/meetup/start-a-group.
Interesting concept.
Have you heard about competition?
IANAL but write like a drunk one.
> "I've been studying programming languages (C++, Java, C, Visual Basic) on my own
> with the self-guided, basic textbooks and tutorials, and I'm starting to get
> tired of working with examples that are not put into real use
Here's some hard-won lessons from the real world:
1. "Write as if the utility/OS/other stuff is flawless" -- Doesn't sit too well with a customer if it's Microsoft's fault. We're spending 1.2 million on it, just fix it, thxbie.
2. References are only useful if you're familiar with the stuff. If you don't know what some system's equivalent of printf is, or how to add numbers in some other langauge, you can't look it up because you don't know that terminology.
3. Don't try to initialize what a FILE * points to. Not the pointer itself, that's fine to set to NULL. But *ptr = xxx.
4. "Pass by reference" and "Pass by value" are backwards from their intuitive meaning, which, as most programmers will forget, first seems like "pass by a copy of" and "pass the actual variable so it can be modified for the caller". The first is actually "pass a pointer to the variable so the function can change it for the caller" and "pass a copy of the value that will have no affect on the variable in the caller no matter what the function does with it."
5. Global and local variables are "automatic" because they're created on the stack, not allocated as by malloc or new. What this means is mumbo jumbo, but you need to know that generally you can't pass the address of such a thing to a different thread in your process, while you can do that with an object that was allocated with malloc or new. The first address is really an offset from the stack pointer while the new'd addresses are a full pointer within the processes' virtual address space mumbo jumbo.
6. Generally, the qsort library function takes a pointer to a C, not a C++ function. This can cause you to have to give it a C-style function declaration if done inside a C++ file. Otherwise nasty stuff occurs.
7. Program defensively -- Always use a block {} after things like if and for and while and not just a single line with a ; . Also, when creating the opening block, create the closing block. Always init everything even if it's first use is assigning it to something else. Always init pointers to NULL if not to an address in their declaration. Always test for NULL before using the pointer. You can get rid of that later for true tight inner loops in intensive calculations, but it's rare you'll ever get anywhere near that type of calculation.
8. Always save off a copy of your file from time to time if you aren't checking it into a version system regularly. Once every half day is fine -- if you don't mind losing a half a day's worth of work. Eventually, this will kick your ass. You do something stupid like accidentally hit a key combo that translates roughly as "delete everything from the cursor to the end of the file" and you don't notice it and save the file.
Especially do this if you're gonna put in major changes. Also, save off a copy of "the last version that worked" as you progress on a more complicate feature with sub-steps. I have had files that I recreated by hand and they worked, even though they seemed identical. Some stray character or symbol somewhere throws off the compilation without generating a syntax error, and you can't find it for love or money. This, too, will eventually kick your ass.
(-1: Post disagrees with my already-settled worldview) is not a valid mod option.
Hi, also take a look at http://search.cpan.org/.
Much is already there, but new good stuff can be, and is, added every day.
I'd like to have a lexer for Scintilla for (basically) the TWiki markup language. It can be written in C++ (preferred) or Lua, or possibly some other ways (as an "external" lexer).
I'm looking into it, but I'm not a C nor C++ (nor a Lua) programmer--if you're interested in helping, give me a shout.