I'll keep the story short here but to sum things up:

I have always liked computers. Hardware has always been my thing. I have my own custom built desktop and love changing and messing with it every day. I also work (part time) as an IT guy for small business. I mainly do software deployment, imaging. I help choose hardware when ordering and can basically fix most software related problems that are experienced in the real world. Ok.

I am a junior at my university getting a CS major. I have always been bad at math. I failed calculus once and got D the second time. Comp sci can be very mathy and honestly I am pretty bad at it I feel. I have survived through the classes but don't think I am at the level I should be.

The first year here I had a basic Python course with a guy older than the sun. He retired the next semester and basically I learned nothing new from the class. I already knew how to do basic variable assignment, basic function calls and arrays just from Youtube and personal curiosity.

OK. Next up was beginning C++. The guy that taught the course would be fired a year later. He "taught" this beginner course by handing us relatively complex programs and saying you need to figure out the code to fix this and make it work. Or write this whole function to make the rest of the program work. Well this approach left me confused and angry mostly. Instead of just having us build the whole program ourselves and taking things a step at a time we were patching in fixes for complex classes.

Next up was even more advanced c++. This professor would be fired at the end of the semester. This area was not her expertise. She basically told us half way through the semester that everyone in the class would get an A as long as they turned everything in. I would have failed this class no doubt if it wasn't for that. I got an A and felt that I had gained nearly 0 from that class. Skip to this year. Doing Python programming for things lie web sockets and language models with ngrams. I have passed through the year basically borrowing code from online and piecing it together. I can understand well enough to tailor a program already written to suit my needs but if I had to write start to finish any of the programs assigned so far this year I would have been sunk. I feel like to survive I will continue this trend until graduation upon which I will be handed a CS diploma. I fear I will not be at the level anyone is / I should be at.

What kind of skills / tutorials should I brush up on over the summer to try and gain programming skills that I might need?

Can I get a job doing the same real world IT type stuff with a CS degree? (And still actually make money)
Thanks for any input. Just hoping to somehow figure this out.

Sorry for the book:
TLDR; comp sci major that doesn’t know how to program

What kind of skills / tutorials should I brush up on over the summer to try and gain programming skills that I might need?

You'd need an extraordinary amount of talent to pick up programming well enough over a single summer to be at a professional level. Sorry, but that's just the way it is. You could probably get an excellent head start by getting heads down in a good book on the languages your anticipated job would require, but I think that's the limit.

However, realistically, a good employer will hire someone with promise even if they aren't up to snuff in terms of skills and knowledge. Programming professionally is really just endless on the job training, and a decent recruiter will understand that. I've yet to get a project where I know how to do everything needed to ship on time and on budget.

Can I get a job doing the same real world IT type stuff with a CS degree?

Certainly. In fact, if the IT side is your passion, I'd suggest spending the summer getting a few certifications and target that for your career instead of software development.

My company hires college interns in their junior or senior year and pairs them with senior engineers to learn and see what they are capable of. The good ones are brought on board as staff engineers when they graduate, and get to keep their internship time as part of their job seniority. A young fellow working with me last year graduated, was hired full time, and after less than a year as full-time employee is celebrating 4 years of seniority! That said, he is exceptionally bright, self-motivated, and prototyped our new Windows phone browser in less than a week...

Math? Important, but not always critical unless you are going into analytics and angling for a position as "data scientist" - we have people with math PhDs for that. Logic (especially formal logic) is, in my opinion, critical for software engineers. So many bugs I have had to track down were due to bad logic, often written by otherwise fine software developers.

My organization works in Java, Java Script, C, C++, Python, PHP, and other languages (bash, Perl, etc). We have a lot of really good Java engineers who are lost with C/C++, and vice-versa. The best don't care about the language - they mostly differ just in syntax and subtle details until you migrate into functional languages (Haskell, et al), but that is an entirely different kettle of fish! :-)

Certifications? We don't pay much attention to those when interviewing people for open positions. If they pass our phone inteviews, they are called in for in-depth personal interviews and get to prove that they know what they are doing. When I was interviewed I felt like I had gone through a wringer! To show I knew C/C++/Java I had to write from scratch a recursive factorial solver on the whiteboard. The fact that I am a non-degreed engineer is not considered in that I am a senior systems/performance engineer for a top-10 tech corporation and earn a nice 6-figure income (in US$).