This is a graduate-level course on optimization. The course covers mathematical programming and combinatorial optimization from the perspective of convex optimization, which is a central tool for solving large-scale problems. In recent years, convex optimization has had a profound impact on statistical machine learning, data analysis, mathematical finance, signal processing, control, and theoretical computer science. The first part of the course is dedicated to the theory of convex optimization and its direct applications. The second part focuses on advanced techniques in combinatorial optimization using machinery developed in the first part.