As an undergraduate I decided to spend the three years and whatever resources were available sharpening my programming skills. By the time I graduates, I was fairly competent using Python, had some experience with C and C++, and had published several passable Windows Forms applications. I was able to use MySQL servers to host application databases. Every programming course I did up until that point taught only the core programming languages.
It wasn't until a group project during my Masters' degree course that I came to appreciate there's a lot more inviolved in producing software as a team for a client. How would I assign tasks between a team of developers? How would features be prioritised? How would I merge several instances of the source code so we always had a definitive version? How would I document evidence that we followed an Agile development process? Which third-party code was the safest to re-use?
A couple of years later, I started my first proper development/DevOps job. For the first time, I had to work with about 50-odd developers on applications that needed to meet specific requirements, needed to be interoperable with a range of things and needed to be maintained.
The general point is that developers need to become increasingly multi-skilled. It's no longer enough to know just one or two programming languages and just one framework. Developers need to become skilled in the range of things that makes their software work.
Software Engineering Principles
The first thing I needed was to get away from the old methods of functional programming - in the past I was happy with something that followed the old coding conventions, ensure the source was readable and somewhat structured.
In the real world, where code is maintained by multiple developers, a developer might change or extend only some highly specific function, and some component need to be tested in isolation. For these reasons, we follow closely as possible
the SOLID Principles of Software Design. What does SOLID mean? It means you need to know about 'loose coupling', abstractions, interfaces and implementations, repositories and inheritance.
SQL or Other Database Skills
Most applications are developed as user interfaces for some database or other. Therefore, a database is part of the application's core functionality, and would likely need to be analysed and modified. Most developers I know are comfortable with SQL.
Unit Testing
I'm fortunate enough not to need to do unit testing much, but it's necessary to learn if a development team insists on test-driven development.
Application Lifecycle Management / Task Boards
How are development tasks managed and allocated to members of a development team? How are test scripts and software components mapped to features? If you're using an ALM system, such as Team Foundation Server, you'd ned to know about iterations, features, user stories and tasks.
For other situations all I want is a Kanban board, and for that I use Trello.
We have iterations - features - user stories - tasks.
Version Control
This brings us to the problem of how multiple developers merge their instances of the source code, so there is always a definitive version being tested and released. There are two common version control systems in particular: TFS version control and Git.
It's useful to get some experience with both. Learn how to map a repository to a local directory, and how to push changes. Fortunately it's possible to get practical exposure to both, as both Microsoft Team Services and GitHub accounts are free.
Server Administration
Where are you going to deploy applications to, and how do you know the application is suitable for the deployment environment?