In the 1960s, as programming languages were being used to write larger programs, those programs became harder to understand, and people began to worry about issues such as correctness, that is, determining whether a program computed what it was supposed to compute. As a consequence, researchers started to look into the pragmatics of programming, leading among others to a criticism of the GOTO statement [2] and the development of structured programming by Knuth and Wirth. These greatly helped writing programs that were easier to understand, but the issue of showing program correct remained. Undoubtedly helped by the fact that programs had a cleaner structure, researchers began investigating formal approaches to proving programs correct, or, in general, proving that programs satisfied properties of interest. Most approaches involved deriving the proof of a property as one was writing the program, taking advantage of the structured way these programs were written [3, 8]. These approaches were formalized, leading to the total or partial correctness assertions of Hoare [10] or the weakest-precondition calculus of Dijkstra [3]. Essentially, the logic of Hoare dealt with assertions { A } P { B } around a program P, indicating that if A were true, executing program P would result in B being true. Inference rules indicated how to transform assertions about programs into assertions about larger programs. For instance, if { A } P 1 { B } and { B } P 2 { C } were true, then one could infer that { A } P 1 ; P 2 { B } was true, with the intuitive reading of P 1 ; P 2 as the sequential composition of P 1 and P 2. Many more formal systems along such lines were devised, and they collectively acquired the name logics of programs, or program logics. In a 1976 landmark paper, Pratt recognized that many such program logics could best be understood as modal logics, by essentially associating with every program a modal operator [13]. His idea was developed and refined by Fischer and Ladner [6] and others, culminating into a particular form of program logic called Dynamic Logic. Basically, the recognition of the relationship between program logic and modal logic allowed researchers to make use of the vast array of results on modal logics.The book "Dynamic Logic", by Harel, Kozen, and Tiuryn, offers a self-contained introduction to the subject. The earlier treatments on the subject are either dated, such as the survey by Harel [9] giving the state of the field in 1984, or study Dynamic Logic as a non-trivial extension of modal logic [7]. The latter approach is much more abstract and technically involved. In this review, I hope to give a taste for the subject by looking at its simplest incarnation, the propositional variant of Dynamic Logic, called PDL. (The book describes both the propositional and the first-order variants.) Following which, I will return to the structure of the book, and some personal opinions.