module division and complexity general-purpose and special-purpose code separation when to bring modules together splitting and joining methods code repetition