Во многих ответах упоминается о программировании, и я бы начал с этого, если вы этого не сделаете.
Я бы также порекомендовал читать качественный код. Прочитайте, скажем, реализацию bzip2 . Не беспокойтесь о том, что не поняли все на первом проходе. Есть много мелочей, идиом, ... которые можно уловить, даже не читая о алгоритме, который реализуется заранее (кстати, алгоритм тоже интересен).
Если вы заинтересованы в верификации программы, взгляните на ACSL , язык спецификации для написания (и проверки) контрактов для функций на Си.