This course covers Network Function Virtualization from the perspective of a systems engineer. It first discusses the proliferation of middleboxes in enterprise networks and the necessity of virtualizing these components just like software applications. It then details several optimizations in operating systems to facilitate efficient networking on virtualized hardware followed by design decisions in user-plane libraries for bypassing the kernel for efficient packet processing. It then covers the challenges and solutions for building scalable systems for providing networking services in datacenters, specifically the synergy between SDN and NFV to achieve this. The course concludes with a discussion of real-world applications of NFV technology in the cloud computing ecosystem.