Software Defined Networking (SDN) has been a prominent technology in the last decade that increases networking programmability. The SDN philosophy decouples the application, control, and data plane to increase the network programmability. The data plane is an essential but unsolved component that receives less attention than control and application planes. Traditionally, the data plane uses fixed functions that forward packets using a limited number of protocols. The P4 (Programming Protocol-independent Packet Processors) language makes it possible to program SDN data plane, which push the SDN to the next level. In the research community and industry, programming the data plane has garnered significant attention. Surprisingly, there has been no comprehensive reviews of programmable data-plane switches, which have many advantages in today's networks. The authors reviewed the evolution of networks from legacy to programmable data planes, explained the fundamentals of programmable switches, and summarized the network generation from traditional to programmable networks. In this paper, SDN is described from a P4-centric standpoint and discusses over 75 related research papers. Several taxonomies for the field are provided, outline potential research areas, and provide greater details regarding the patterns that have led to the development of this technology.