A computer implemented method, the method comprising the steps of: - associating an index reference value with each point in the progress of a program's execution; - assigning one or more of the index reference values to each program object created on execution of the program, wherein one of the one or more index reference values is associated with the point in the progress of the program execution at which the program object was created; - generating a first program snapshot by storing a serialized state of the program associated with a first index reference value; - subsequently recreating a state of the program by: o receiving an indication of a second index reference value, the second index reference value being embedded within a selected program object; o recreating the state of the program according to the serialized state of the program associated with the first index reference value, the first index reference value being associated with a point in the progress of the program execution that precedes the point in the progress of the program execution associated with the second index reference value; and o executing the program from the recreated state of the program to the point in the progress of the program execution associated with the second index reference value, including using previously stored non-deterministic values determined by a first evaluator program that evaluates the program during a first execution of the program and determines and stores non-deterministic values, wherein the non-deterministic values are computed or used by non-deterministic calls made by the program during execution. - associating an index reference value with each point in the progress of a program's execution; - assigning one or more of the index reference values to each program object created on execution of the program, wherein one of the one or more index reference values is associated with the point in the progress of the program execution at which the program object was created; - generating a first program snapshot by storing a serialized state of the program associated with a first index reference value; - subsequently recreating a state of the program by: o receiving an indication of a second index reference value, the second index reference value being embedded within a selected program object; o recreating the state of the program according to the serialized state of the program associated with the first index reference value, the first index reference value being associated with a point in the progress of the program execution that precedes the point in the progress of the program execution associated with the second index reference value; and o executing the program from the recreated state of the program to the point in the progress of the program execution associated with the second index reference value, including using previously stored non-deterministic values determined by a first evaluator program that evaluates the program during a first execution of the program and determines and stores non-deterministic values, wherein the non-deterministic values are computed or used by non-deterministic calls made by the program during execution. o receiving an indication of a second index reference value, the second index reference value being embedded within a selected program object; o recreating the state of the program according to the serialized state of the program associated with the first index reference value, the first index reference value being associated with a point in the progress of the program execution that precedes the point in the progress of the program execution associated with the second index reference value; and o executing the program from the recreated state of the program to the point in the progress of the program execution associated with the second index reference value, including using previously stored non-deterministic values determined by a first evaluator program that evaluates the program during a first execution of the program and determines and stores non-deterministic values, wherein the non-deterministic values are computed or used by non-deterministic calls made by the program during execution.