Where can I start contributing?
There are two obvious stages to this: pick a language, pick a project.
Pick a language
You should pick a language with which you are familiar and proficient. I'd advise not trying to contribute to projects in languages you're not that great in - yes, it is a good opportunity to improve your skills in that language, but it's also a good way to annoy the developers because you're doing things in a way that the language could do much better. A good example of this is Python:
some_list = ["a", "b", "c"]
if hasattr(some_list, "a"):
This seems to be correct to many new in the language: the documentation suggests that
hasattr returns true if the given list has the given attribute. However, it won't work as expected, and could actually be done in a much more 'Pythonic' fashion:
some_list = ["a", "b", "c"]
if "a" in some_list:
Moral of the story: pick a language you're good at, so you don't have to worry about your coding style or practices being the cause of your pull requests getting rejected.
Pick a project
Now you pick a project, written in your chosen language, that you want to contribute to. If you've had some exposure to the language, you may already have come across useful utilities or tools that you use that are open-source: these are good choices because you'll be motivated to contribute well.
You should always pick a project which interests you. If you're not interested in crunching data, don't pick a graphing library. If machine learning gets you going, try to find something in that area. Maybe you can even contribute to a project you're already using.
A good resource for finding projects if you're stuck is Code Triage, which lists repositories on GitHub by the number of open issues they have. Pick your language, pick an interesting project, pick an issue and try to solve it.
What's the contribution flow?
This really depends what you're good at, though there are some givens. You should always start by familiarising yourself with the project: read the documentation, read the codebase. If the hosting supports it, you should clone the repository and build the software on your local machine, and have a play around with the code to figure out what each part does.
Once you're familiar, you can choose what you want to do. If you're a technical writer, writing documentation is probably a good choice for you. If you hate writing long documents, but you're good at programming, pick an issue and try to fix it.
Whatever you do, make your changes in a fork of the project's repository somewhere you control. Test them (see Whose responsibility is it to test contributions? for information about who does what testing) and make sure everything works. Make sure your code style conforms to that of the project: developers aren't going to be happy with ten thousand different styles in their project because they've got lots of pull requests. Make sure you've read any contributing information the project has. If you've conformed to everything, you can submit a pull request to the project's developers, who will review your changes.
You're not perfect and neither is your code; the project developers may well find some issues with it or some style point they don't like. It's your work, so it's your responsibility to fix these: monitor the feedback on your pull request, and use it to change anything they ask you to. When that's done, you can resubmit your pull request and have it merged. Wash, rinse, repeat.