Worked for two years at a start-up company. Learned practical problem-solving abilities and delivering software tasks under time pressure.
Frequent exposure familiarized me with the scenario of being new to a very large codebase.
Codebase with a lot of new technologies I did't yet know, and tasks to be delivered sooner, rather than later.
I got better at handling that scenario.
Learned operating within the agile development process. I got better at knowing how to deal effectively with pressures, and problems invovled with, the product releases every two weeks.
Learned effective communication: every work day meant "daily" and talking about software, from which I learned how to form my thoughts about it in a simple, clear and concise manner.
Probably most importantly, I learned how to learn efficiently, in the ever-more dynamically changing, demanding world of IT.
Programming concepts:
Data structures:
Aside from work experience, I've trained problem solving by:
I've learned that attacking the problem head-on almost never works, nor is it worth it to skip basic preparation and just go at it.
For what it's worth, I learned to always have a simple roadmap, with a reasonable priority path, tasks and few likely contingencies.
It's either that, or the solution work will be circular, random, repetetive and everything will take 10-20x longer, if that.
This applies to developing any larger-scale thing, even if it's just a feature:
That's how I trained myself to work, to improve effectiveness of my efforts.
I keep it as simple as possible but I always de-compose things into smaller components, determine how these fit together, make tasks to push it forward, and then tackle one small priority at a time.