Program synthesis is the task to automatically construct a program that meets a specific goal. It finds many applications such as end-user programming, optimization, and bug fixing. This lecture will introduce the basic concepts, methods, and typical applications for program synthesis, as well as pointers for future learning. This lecture will cover both the classic approaches for synthesizing a program to meet a formal specification, as well as recent approaches that rely statistical models to infer a likely program for an indefinite goal. The content of the lecture will be based on program synthesis lectures in the course “software analysis” taught at Peking University. Bio: Yingfei Xiong is an associate professor at Peking University. He got his Ph.D. degree from the University of Tokyo in 2009 and worked as a postdoctoral fellow at University of Waterloo between 2009 and 2011. His research interests lie in software engineering and programming language in general, and program analysis, synthesis, and repair in particular. He has proposed theories and techniques for reducing the efforts of writing and changing programs. For example, the repair approach, ACS, is the first one that achieved >70% precision on a general benchmark; the delta-based bidirectional transformation framework is now considered as one of the standard types of bidirectional transformation frameworks. His work has been adopted by the industry, such as a Linux kernel configuration project, the Huawei company, and the YanCloud DaaS system.