Ext
Ext is what you get when you push the Hom functor through the derived-functor machine — and its first group answers a wonderfully concrete question: in how many genuinely different ways can one module be assembled from two given ones? Hom(A, B) sees only direct maps; Ext^1(A, B) sees the hidden extensions, the ways A and B can be glued into a middle module that is not simply their direct sum.
Formally, for R-modules A and B, Ext^n(A, B) is the n-th right derived functor of Hom(-, B) evaluated at A: take a projective resolution P_* -> A, apply Hom(-, B) to get a cochain complex, and read off cohomology. (Equivalently one may derive Hom(A, -) using an injective resolution of B; the two agree.) Then Ext^0(A, B) = Hom(A, B), and Ext^n vanishes for all n > 0 exactly when A is projective (or B is injective).
The interpretation of Ext^1 is the heart of the matter: elements of Ext^1(A, B) correspond bijectively to equivalence classes of short exact sequences 0 -> B -> E -> A -> 0, with the zero element being the split extension E = A ⊕ B. This is why Ext classifies extensions and detects obstructions: a nonzero class is an honest, non-split way of building E. Higher Ext groups govern obstruction theory and appear throughout deformation theory and the cohomology of groups and algebras.
Over Z, Ext^1(Z/nZ, Z) ≅ Z/nZ. Resolving Z/nZ by 0 -> Z -> Z -> Z/nZ -> 0 and applying Hom(-, Z) gives Z -> Z (multiplication by n); its cokernel Z/nZ is Ext^1. The nonzero classes record non-split extensions of Z/nZ by Z.
Ext^1(Z/nZ, Z) computed from a free resolution.