Mainly due to optimizations carried out when the source code is compiled it's not feasible to get the source code from the bytecode/opcode itself. Refer this question.
Compilation back to the original source code is impossible because all
variable names, type names and even function names are removed. It
might be technically possible to arrive at some source code that is
similar to the original source code but that is very complicated,
especially when the optimizer was used during compilation. I don't
know of any tools that do more than converting bytecode to opcodes
So if the contract code is closed-source then it's not possible to find the source code. But if the contract is public there might be chance of finding the source code. You may refer this question.
There is no general solution for this because the solidity code is not
published on the blockchain. On the blockchain only the resulting byte
code is published. There are different block explorers like
ether.camp that offer the option to upload the solidity code.
They can use the solidity code to verify that it indeed matches with
the byte code on the address.
There is one project that aims to do this automatically by
scraping github repositories for source code that fits to published
byte code
AFAIK, there is no obligation to publish the contract source code. It's upto the user to have it verified before using. So if a smart contract developer wants the attraction of the most people, it's upto him to reveal the code so the other can trust it. Given the solidity code and it's address, then anyone can verify the deployed contract using this method.