what I REALLY need, is that programmer mindset, which is something that I haven't developed yet.
There's a very good aptitude test here:
http://www.cs.mdx.ac.uk/research/PhDArea/saeed/test(week-0).doc and a writeup of the premises behind it here:
http://www.cs.mdx.ac.uk/research/PhDArea/saeed/
This test is designed to judge whether a person's basic mindset is conducive to programming. The questions look programming-specific, but there is actually no correct answer to any specific question. What it looks at is whether or not the person can create a cohesive mental model and apply it consistently to all the questions. So instead of rating how many questions you get right, it's "graded" on whether each answer is consistent with the rest, no matter which specific answers are chosen.
The premise of the test, which is controversial, is that you're basically born with the right mindset, or you are not. The results bear this out - those who cannot answer the questions in a consistent manner before getting any programming instruction still do not answer them consistently after a year of classes. And those people have a very high rate of dropping out of computer study, or continue to struggle even after going into programming jobs.
My guess is that nearly any INTP can do that, it's what we do. If you've been at it for a while, if you feel like you get the way computers "think", if you aren't struggling with basic concepts (like loops, branching, functions, etc), and if you still find it enjoyable, you probably already have the right mindset. The rest is just learning and experience. In developing that, there's no substitute for working out as many problems as you can and coding solutions for them. Even simple things done just for exercise work for this, but they need to be real-world kind of problems, not the stupid things they teach in classes like outputting the Fibonacci sequence.
The other thing is learning more than one language. I think it's the biggest flaw in the way people are taught to think about programming, that it is seen as language specific. It's like teaching auto mechanics to be "socket wrench mechanics", or "Phillips screwdriver mechanics", rather than teaching them how to just fix cars and how to use all the tools needed to do that, and how to choose the proper one for each task. I wince whenever I see someone starting out say "I am a VB programmer", or "I am a C programmer". It's fine to have a language or two you are most proficient at, but if you're just a "C programmer", then you aren't really a programmer.
As soon as you are comfortable with Perl, try Python, or C, or just about anything. This will help show you the difference between syntax and core concepts like structure, flow control, etc. If you develop those basic skills, the terminology and syntax problems become just a matter of detail, and languages become almost interchangeable after a while.
Getting a good sense of design takes longer, but it will come. Especially when you get into object oriented programming. I was doing OOP for two years before polymorphism really clicked as a design concept, even though I understood it mechanically pretty quickly. After 7-8 years of professional programming, I'm still learning things about good design.
Good luck. Keep at it, it sounds like you're on the right track already.