Fair and efficient allocation of resources is a fundamental problem in many disciplines, including computer science, economics, and social choice theory. This age-old problem arises naturally in a wide range of real-life settings such as division of labor, inheritance, computing resources, divorce settlements, air traffic management, and frequency allocation. In a classic instance, we have agents and items. Each agent has a valuation function that captures her (dis)utility for any bundle allocated to her. The objective is to find a "fair" allocation of items so that each agent is content with her share. The resources to be divided can be divisible or indivisible, and they can be classified as desirable (goods) or undesirable (bads). Impressive progress has been made on fair division of divisible goods over the last seven decades by economists and computer scientists. In contrast, fair division of indivisible goods (also called discrete fair division) is relatively less understood. In this talk, we highlight the fundamental concepts, techniques, and challenges in discrete fair division. Subsequently, we show our contributions in answering important open problems in this area.