I would look at improving roughly in this order, in iterations with each building on the previous one:
- Programming concepts. Understand things like memory management, pointers, stacks, variable scope, etc.
- Languages. Work on mastering several modern languages.
- Design concepts. Learn about design patterns. Practice using them.
- Communication. Often-overlooked. You can only become a highly valued Software Engineer if you can communicate effectively with non-tech people. Learn to listen and understand the needs that people are expressing, translate that into a set of requirements and a technical design, but then explain what you understood (and designed) back to them, in terms they can understand, for validation before you code. This is not an easy one to master, but it is essential.
- Architectural concepts. Learn to understand the big picture of large, complex systems.