Software Fault Tolerance is evolved as a technique to increase the dependability of computing systems. Because of limitations with producing of error free software, Majority of software errors are design faults. The root cause for software design errors is the complexity of the problem domain. Software Fault Tolerance (SFT) has become an important concern A number of Fault Tolerance techniques designed at minimizing the effect of software faults are being investigated. An N-version software (NVS) unit is a fault tolerant software unit that depends on a generic decision algorithm to determine a consensus result from the results delivered by two or more member versions of the NVS unit. Results of five consecutive experimental investigations are summarized, and a design paradigm for NVS is presented. In this paper, a critical review of NVP is presented. The advantages, current challenges, and further research areas of NVP are discussed.