Software Foundations
I&#x27;d recommend people interested in learning formal methods <i>do not</i> start with things such as Coq or Isabelle&#x2F;HOL. Most people find the process of learning or using those so difficult that they quit with a potentially-permanent aversion to the term formal verification. In engineering, it&#x27;s often advised to use best tool for the job esp with highest ROI. So, if you&#x27;re interested in formal methods, I strongly encourage you to start with so-called, lightweight methods that give a lot of return for little investment. They teach you how abstract specifications with tool-assisted reasoning can quickly catch deep errors tests often won&#x27;t.<p>Two of those with lots of benefit in realistic projects are Alloy Analyzer (esp for structure) and TLA+&#x2F;PlusCal (esp for order):<p><a href="http:&#x2F;&#x2F;alloy.mit.edu&#x2F;" rel="nofollow">http:&#x2F;&#x2F;alloy.mit.edu&#x2F;</a><p><a href="https:&#x2F;&#x2F;learntla.com&#x2F;introduction&#x2F;" rel="nofollow">https:&#x2F;&#x2F;learntla.com&#x2F;introduction&#x2F;</a><p>These are immediately useful. Especially in distributed systems for TLA+. Then, you get a book such as Chlipala&#x27;s Certified Programming with Dependent Types or Pierce et al&#x27;s Software Foundations. Chlipala is also doing a new one called &quot;Formal Reasoning About Programs.&quot; You can try to use those to get some elementary stuff done with the heavyweight methods. It will probably take you 1-2 years to get proficient enough for real stuff. Two outcomes are common:<p>1. You don&#x27;t make it. Don&#x27;t get mad: most don&#x27;t even when they&#x27;re smart. Good news is you enjoyed lighter stuff that you&#x27;ll probably continue to apply and expand on for rest of your career. If other users are lucky, you might have run into their limitations enough to start improving the tooling, documentation, or something else. Those will get better since you learned them but avoided heavyweight stuff.<p>2. You made it! Now, best result for us IT folks is you apply your skills to real-world software formally-verifying useful algorithms, protocols, compilers, OS&#x27;s, and so on. For inspiration, be sure to look at CRYPTOL, miTLS, CompCert, CakeML, RockSalt, seL4 or VAMOS, Verdi, verified garbage collectors, foundational backing of static analyzers like Verasco, tools with automation such as SPARK Ada, ACL2 for hardware, and maybe rewriting-based stuff like C semantics in K Framework.<p>If you can understand heavyweight verification, then apply your knowledge to more stuff like that since you&#x27;ll (a) possibly be having real-world impact and (b) be doing work challenging enough that you can be very proud of your successes.