I'm a junior developer at a company that has asked me to establish academic goals for the near future. I didn't realize how hard of a question this was until I could only come up with one answer, off the top of my head:

This question appears to be off-topic. The users who voted to close gave this specific reason:

"Questions seeking career or education advice are off topic on Programmers. They are only meaningful to the asker and do not generate lasting value for the broader programming community. Furthermore, in most cases, any answer is going to be a subjective opinion that may not take into account all the nuances of a (your) particular circumstance." – Jim G., MichaelT, gnat, GlenH7, Telastyn

What technology are you working with? Are there advanced topics specific to your on-the-job tech that you could delve deeper into?
–
FrustratedWithFormsDesignerMay 25 '11 at 15:05

I'm a general tools guy for the department. So if they need a website, Java lib, or even something deployed on a server, they add it to my todo list. A tad overwhelming, actually. haha.
–
MYouMay 25 '11 at 15:11

9 Answers
9

The items that have helped me most significantly (along with references to texts) are:

Domain Driven Design ... Has made a huge difference, since for most software projects the primary focus should be on the domain and domain logic and properly understanding the domain. How to translate the domain into code is the secret for avoiding the big ball of mud.

Test Driven Development and Unit Testing ... Not just writing tests, but writing test properly has made an enormous difference. I can no longer imagine writing code without a proper set of unit tests.

I agree with most of everything listed above, but wanted to include something I wish more developers regardless of their level knew. Know your tools.

Watching some of my developers is painful as they take the most difficult way to get things done. Learn the ins and outs of your various IDEs or command line utils. While learning all of the stuff already mentioned will make you a better developer, learning the tools will make you more productive.

For me, it was more practical than academic: XML/XSL, which was never really covered in as much depth as was necessary in school.

Also good to know if you don't already know is databases and SQL. If you do have experience in this area - go deeper (you can always go deeper) into topics like data warehousing and analytics. General (not specific to any particular system) data modelling is also a good skill. Of course, these are hard to work on if there's no basis for these skills in your workplace (but it's usually possible to find something, even if a bit contrived).

@Thorbjørn Ravn Andersen: True, I needed to improve skills for both at the same time for a specific project, though I know they don't have to go together.
–
FrustratedWithFormsDesignerMay 26 '11 at 13:58

You need to understand how to effectively design normalized databases and how to write efficient queries. Daabase do not refactor as easily as other code and you need to be in the habit of getting it close to right from the beginning. No one should be allowed to touch a databse without a thorough understnding of joins and how to do things in sets rather than row-by-row. No one should be writing code for a database that is large and under much performance stress without knowing how to write high performance queries and what things to avoid doing (Cursors, correlated sub-queries, etc.) I could easily come up with several hundred training topics on databases alone.

How to effectively do a code review is another skill many people don't have.

I've alawys found it helpful to develop training topics on mistakes that I, as a senior person, see happening frequently when I code review, especially when more than one person makes them. So ask your seniors what mistakes they frequently see juniors making. Those are critical training topics.

For example, a software engineer would know to pick the best design pattern for the task at hand.

If you are using Unix or Linux, learn and master vi, sed, awk, regex, perl/python, shell scripting, etc, enough to be able to automate as much of the repetitive tasks as possible. If you use an IDE, learn all there is about it. This will be boring and off-putting to begin with. But you'd see how powerful these tools are when those who have mastered them use them to delegate most of their mundane tasks to the computer.

Touch typing/typing closer to the speed of thought can be very useful. If possible, learn Colemak or Dvorak after some investigation into both, to suit your needs. Both are known to cause less strain on the hands and cause tremendous speed gains.

Design patterns, as you suggest, is an excellent topic to learn. While design patterns are heavily used in object oriented programming, the principles laid out in Code Complete are said to be useful to their readers in who work in other programming paradigms as well.

Also, The Architecture of Open Source Applications is an excellent book and freely available on the web. This book aims to show you the architectures of reputed open source software and critique the architectures. Much like what an architecture student would go through at university, says the book.