How useful is the knowledge of discrete math for computer programmers?
Discrete math is essentially pure logic. Logic is very important for programmers, for obvious reasons.
Are there skills learned in a typical Discrete math course that are actually directly used in the field of Software Engineering?
Here is a description of the Discrete Math class at my school:
Theory and applications of discrete mathtematical models fundamental to analysis of problems in computer science. Set theory, formal logic and proof techniques, relations and functions, combinatorics and probability, undirected and directed graphs, Boolean algebra, switching logic.
The skills are not directly used in programming, but a knowledge of formal logic will help you immensely in many indirect ways.
Discrete Math is very important in understanding how computers, hardware and software, work. All the circuits in a CPU are discrete functions, all the arithmetic and all operations are performed in binary values (binary values being boolean strings). It's also useful in theoretical computer science and the analysis of certain very hard problems as well as in the performance analysis of algorithms.
It will help you know what is going on, how your code works at the machine level, how it performs, what is the domain and range of your algorithms, etc.
From a programming perspective it is important to get you to understand Recursion, which very powerful and often used, and some basic stuff like Boolean math. Graphs also have a special place in computer science, but most of this stuff is straightforward, and plain common sense.
Separate names with a comma.