From the point of view of someone who writes code for a living, having a good familiarity with NP-completeness is important for:
1. Recognizing when you're barking up the wrong tree
NP-complete problems are the easiest of the NP-hard problems and yet as far as we can tell, it takes time exponential to the size of the input to solve such a decision problem. So, as a practical matter if you can show that the problem you're trying to solve is NP-hard (typically by showing that an efficient solution to it would also give an efficient solution to some NP-complete problem), you know that you can stop searching for an efficient algorithm to solve it exactly in general. Instead, you can select from known algorithms that promise good approximations for NP-hard optimization problems and get on with the rest of your project.
2. Finding the right tree
Because computers are often used to attack NP-hard problems, specialized solvers have been developed that can efficiently solve some NP-hard problem instances. Recognizing that your problem is NP-complete is the first step toward finding an existing tool (SAT, ILP, SMT, CSP to name a few) that might help you find exact solutions in some cases where you otherwise would have had to settle for an approximation.