A lot of progress (and sometimes, regress) in computer science and software engineering seems to come from rejecting, modifying or otherwise modifying the “natural order”. By natural order I refer to the generally accepted, industrial paradigm of how development “is done”.
A lazy student can easily find ‘revolutionary’ projects by simply fiddling with this accepted order.
For example, take the modern imperative/object-oriented paradigm for software languages. Subtract some feature, and explore the consequences. What happens when, for instance, you cannot use getters/setters/properties? I’m not sure, but it’d be interesting to know. What happens if you subtract assignment? And so on. In a way some functional languages changed thinking by subtracting changes in state.
Another thing you can try is to move something from one phase of program life to another, or to collapse phases. Lisp, for instance, allows the programmer to have instructions run at compile-time (ie, macros), rather than simply at runtime. What else can you move out of its natural phase? Take CPU scheduling. Currently this always happens during the runtime phase, but could it be moved? Can there be load time scheduling? Compile time scheduling?
I’m sure that you can think of many other such examples.