decoupled the shift calculation from the Job itself