Before I start to do my research as a grad. student, I would like to learn how to construct applications with proper structure. I have looked around the internet and either examples are too simple and contrived or are complex open source projects which make it hard to understand why they do things a specfic way. I have never had to time or intership to work and discuss large projects and how they engineer certain things. I feel like I have learnt a lot of concepts in school in a sandbox and I'm ignoring so many concepts I learned about design patterns and software.
Of course not all companies have the best practices, but in my experience most do. If you decide to find an internship, ask about design patterns / code reviews in your interviews.
Alternatively, you could read up on good design patterns and practice. I've heard people recommend Uncle Bob's "Clean Code" and "How to Design Programs". Also see https://news.ycombinator.com/item?id=25299547.
The first part is usually something that you can solve with the most obvious algorithm... the second part requires a far more optimum solution. These exercises are fun, challenging, and online, you can do them any time.
Also note that these are great for trying out that new programming language you wanted to learn.
it's also like asking for advice on how to write a book, whilst having never read a book.
read lots of code, write lots of code, listen a lot, and form your own path