The act of programming a piece of (usually) existing code when one does not fully understand the language, algorithms or assumptions used to create the code in the first place. Often done by novice programmers to twiddle a feature or try to fix a bug in a large complex project.

Each line of code balances on a knife-edge of assumptions. It has been placed there carefully by a skilled programmer that had to keep about a thousand little details (assumptions) in mind when writing that particular line of code. Some assumptions are critically important so they are manifest in the use of the "assert" macro just to make sure that the programmer (or more often other programmers) do not forget that "here" things must be just so or disaster will strike.

Other assumptions are made so that the program will run faster. For example, you could recompute the digits of Pi from basic principles each time you needed it. But it is faster just to assume that Pi is 3.14159... and use the constant value instead of the computed value.

Assumptions are made when things are static. The duration of this condition depends on the algorithms. Some data is only static for a few microseconds (a couple of lines of code) so the assumption can be quickly dismissed as trivial. Other assumptions can be made for the duration of the program and have a larger influence. And, in every other case in between, assumptions are at the "heart" of each step in the program.

Then some young, wide-eyed, know-it-all, hack comes along and thinks: "I know what I’m doing" and starts changing code at random failing to consider the consequences of his actions completely disregarding the careful tapestry of assumptions the original programmer has laid. And, presto, you’ve got bugs coming out the wazoo.