The syntactic approach is really useful as a programmer. A Logical Approach to Discrete Math[0] teaches programmers how to develop proofs in this style using logic and syntactic substitution. Once shown how easy it is to achieve rigour it is hoped that work-a-day programmers can formulate their own proofs and develop stronger specifications using mathematical tools.
I'm not a formally trained mathematician and am completely self-taught as a programmer but with some background in set and graph theory I found it approachable. It's certainly a good companion text to learning more practical systems like TLA+ or Lean.
[0] https://www.amazon.ca/Logical-Approach-Discrete-Math/dp/0387...
http://www.amazon.com/Logical-Approach-Discrete-Monographs-C...
A Logical Approach to Discrete Mathematics: https://www.amazon.com/Logical-Approach-Discrete-Monographs-...
And a more pragmatic approach to the same material (with a lot of cross-over in terms of proof-style, etc):
Programming in the 1990s: http://www.springer.com/gp/book/9780387973821
But one I particularly enjoyed early on was written for liberal-arts level students of maths (who might've been traumatized by maths in the past):
Introduction to Graph Theory: https://www.amazon.com/Introduction-Graph-Theory-Dover-Mathe...
It will actually get you into writing proofs in set theory within the first couple of chapters.