Knot Floer homology is an invariant for knots discovered by the authors and, independently, Jacob Rasmussen. The discovery of this invariant grew naturally out of studying how a certain three-manifold invariant, Heegaard Floer homology, changes as the three-manifold undergoes Dehn surgery along a knot. Since its original definition, thanks to the contributions of many researchers, knot Floer homology has emerged as a useful tool for studying knots in its own right. We give here a few selected highlights of this theory, and then move on to some new algebraic developments in the computation of knot Floer homology.