First-Order Methods in Optimization