Had to leave a separate answer because I don't have enough rep to put it as a comment on @Lacoppidan's answer.
First, I salute you on your attempts to become a proper programmer ;)
Second, I want to scotch some of the BS that other's have written:
- You do not need an undergrad degree in CS, unless the course says that you do. Many Masters courses are designed to accept cross-discipline students, which yours clearly is, as it wouldn't even have a DS&A module if it weren't!
- Age probably isn't a major factor. Yes, neuroplasticity drops as you get older, but all that means is that you need to work harder not that you can't do it. Certainly, I've found that there are things that I can understand intuitively now that I couldn't when I was younger. Also, if you have a settled/stable home life and job, that's going to put you at a massive advantage compared to many, as anxiety is the biggest blocker to learning you can get.
It smells to me like you've got two separate things working against you:
- You're doing part-time.
- You're worrying about passing; about whether you can do it.
Part-time is ++hard (see what I did there? ;) ) - the most valuable resource you have at university are your peers. I found that just having other people to talk about stuff with helped me enormously both in improving my understanding and consolidating my knowledge as well as building my confidence.
So, my #1 tip to anyone undertaking a university-level course is: find people on your course(s) that you get along with and build relationships with them around the work. Don't worry about 'the age thing', worry about if those people help you understand what's going on or not.
Also, don't worry about asking someone 'super clever' for help - you'll actually be doing them a favour by getting them to explain it to you in a way that you can understand. Sounds strange, I know, but having to explain something to someone (who may or may not be as clever as you), forces you to understand your subject better; to organise your own thoughts. I'm sure you know from your real-world experience, that being 'good' and 'clever' isn't enough - you have to be able to communicate your ideas to others and work collaboratively, because interesting software is non-trivial and non-trivial software is too big & complex for one person to do on their own.
Worrying about succeeding or not will always hold you back. It's something that I've struggled with many times.
One strategy I found works for me, is to just focus on learning stuff; just learn anything that's related to the course. Read for the sheer hell of it! Focus on the stuff that you find interesting. And write lots of code.
By focusing on just learning you'll get much more out of the time you put in and you'll be more satisfied with what you've learnt. True, it may not help you pass your course, but chances are, it will, because when you've got back into the habit of just learning stuff, you'll find it easier to learn the stuff you need to pass.
Another strategy is to write more code. One thing I definitely didn't do enough of as an undergrad, was write enough code. This is particularly important for stuff like DS&A - the only way to get really familiar with an algorithm or with things like pointer manipulation, is to do it. Lots.
If you can do it and can explain how it works, then you understand it.
This should be where your broader experience comes in; you've got 10 years experience of writing code, so you've no doubt picked up lots of techniques and skills that will help you. Use them!
Use things like dry-running (something that I don't think is taught much these days, but it's still a fantastic tool, particularly for learning DS&A) and/or interactive debugging to step through your execution.
The third technique I found really helpful is mind-mapping. I used it as a way to fill the gaps in my knowledge, by breaking a topic into its constituent parts, exploring the things I didn't understand and then return to the parent topic while this new knowledge was fresh in my mind.
For example (sorry, no pictures), the subject of 'linked lists' might decompose into:
- dynamic memory allocation
I'd then look at each of these and ask myself "do I know what each of these is?" If the answer is 'yes', then I move on, if 'maybe', I check my knowledge against Google, if 'no', then I create a separate sheet and work on it until I do (decomposing further as necessary). That way, the next time I'm coming to a subject I and I see "linked list", I will either:
- know what a linked list is and how it works; or
- have a good set of notes that I can quickly use to refresh my memory
Again, practice, practice, practice. The more code you write and have to debug, the better you'll get to understanding what's going on.
This turned into a much longer answer than I'd intended, but I do hope you find it useful.