This thesis addresses the problem of information transmission over noisy channels. In 1993, Berrou, Glavieux and Thitimajshima discovered Turbo-codes. These codes made it possible to achieve a very good performance at low decoding complexity. In hindsight, it was recognized that the underlying principle of using sparse graph codes in conjunction with message-passing decoding was the same as the one proposed in Gallager's remarkable thesis of 1963, although Gallager's work had all but been forgotten in the intervening 30 years. In 1997, there occurred a breakthrough in the analysis of this type of codes. Luby, Mitzenmacher, Shokrollahi, Spielman and Stemann were able to give a complete characterization of the behavior of Low-Density Parity-Check code ensembles in the infinite blocklength case when used over the binary erasure channel. Soon thereafter, Richardson and Urbanke extended their results to binary-input memoryless symmetric channels. In this thesis we present tools to analyze the performance of these types of codes and ways to optimize their parameters. The optimization for the infinite blocklength case is relatively straightforward and we give a simple and efficient method of doing so. However, this does not really solve the problem in practice, since the asymptotic analysis has only limited relevance for the short or moderate blocklengths that are typically used in practice. This brings us to the main objective of this thesis, which is to bridge the gap between the asymptotic case and the practical finite-length case. We follow the lead of Luby et al. by considering the binary erasure channel. We show that the performance of LDPC codes obeys a well-defined scaling law as the blocklength increases. This scaling law refines the asymptotic analysis and provides a good way to understand and approximate the behavior of LDPC codes of short to moderate length. We show how to compute the scaling parameters involved and demonstrate how to use the resulting approximation as a design and optimization tool.