Too vague to be honest, your basically asking "how does one find an exploit that no one else has found", there are tons of different platforms and types of vulnerabilities. Basically you just need to get good and learn as much as you can.
Well finding 0Days isn't exactly hard, however someone that has no idea of what his doing wouldn't even consider it an 0Day, therefore being just another unknown bug.
0Days are always a flaw in the programming of the source, could be a function, the language itself, or just the way the coder used the function or coded is tool.
With that being said all you need to find an 0Day it's either focus on something you want to exploit and look at it's source-code (if it's available) and try to find a vulnerability, or simply fuzz it.
Fuzzing it's (in a basic way) just doing a bruteforce of input and parameter to your target and trying to find something, either a segmentation fault, memory access, anything.
Answering the question how to begin.
First off you should see what kind of 0Day you want and what do you consider an 0Day, some people consider SQLi on a website an 0Day because no one else had found it, others consider only Overflows and Format String Attacks and others consider only new findings as 0Day, like Slowloris when it came out (although it used the SYN Flood technique).
Anyhow from there you'll need to study your target (the language and it's source) for instance, PHP it's an interpreter, so if you can't find a vulnerability that would exploit the website, perhaps you can find something that exploits the interpreter itself, and those are different matters. Exploiting PHP requires PHP knowledge, exploiting the interpreter requires ASM knowledge.
Just like Tsar said , you're being to vague, because you can exploit a program, a library, an API, the language itself, protocols, and it's a very different approach in some cases.
To exploit a program all you need is to fuzz it, send lot of random parameters, until you find some vulnerability that allows you to get a shell.
When exploiting protocols your objective might not be to get a shell but for instance to make a server inaccessible and for that you need to look to the source code and find uncovered options.