3: Minifying is not reversible in the typical meaning of the word. A minified program is just required to behave identically to the un-minified program (not counting execution time).
You can't reproduce the layout as it was: white spaces or the comments, the actually used variable names, nor parenthesis. It's also possible that some minifiers do constant evaluation (i.e. 1.0*(1.0+1.0) could become 2. or 2); Can't reproduce removed dead code.
(ie. this block is removed)
if (0==1) { // TODO: why isn't this working?
i++
alert('');
}
2: No, it's not easy at all
Even the very first stage of removing white spaces and comments could be beyond the final assignment of programming 101.