James Potter was a positive character, but he was neither a hero nor completely good. Like every other character in the book, James Potter was gray. He was that popular kid and jock who was full of himself and bullied other kids. Of course he was good at heart and just being an immature teen. He grew out of it. However, anyone who has been through the motions of being a teenager knows the dynamics of the popular students vs the freaks/geeks/nerds etc.
Snape is a negative character, but he was neither a villain nor evil. While he possessed negative traits like sadism, jealousy, resentment and bitterness he was not bad at heart. Unlike the rest of his family who actually had streaks of evil, Snape never intended harm or genuine ill will on anyone. Harassment and bullying yes, but harm never.
His unconditional love for Lily also is his redeeming factor. Unrequited love hurts, but nothing hurts more than someone you love being with someone you hate. Snape could have easily been the jilted lover and turned vengeful. He could have easily joined Voldemort in destroying James and then Harry. Many people experiencing unrequited love act in such ways.
However, even though Lily never reciprocated love for Snape, he showed an unconditional loyalty and love towards her. He acted in genuine good emotions. In all honesty Snape and Lily would have never worked out, but had it not been for Lily - Snape would be a much darker person.