I intend to eventually formally learn CS algorithms and data structures. So far, I haven't run into a situation where not knowing them has catastrophically hindered the viability of my code. I understand that I don't know what I don't know. [1] I often see comments along the lines of, "I learned algorithms and data structures while getting my CS degree, but rarely (or never) used them in practice. Without reviewing them, I wouldn't likely pass a technical interview that heavily relies on whiteboarding and CS theory."
Is this most often the case, or is it just the case that is most often verbally expressed? For each professional programmer who doesn't know or rarely uses CS theory in practice, is there one or more that uses it regularly? I understand there will be specific positions that rely on CS theory more often, but my questions are meant to cover the general range of professional programmers.
I prioritize the list of topics I wish to learn or improve as there's too many to learn them all within a given time period. I often push algorithms and data structures down the list below topics I immediately need to know to complete parts of projects following best practices as well as I'm aware. The strongest case I can see for learning or memorizing algorithms and data structures before I encounter a situation that requires I implement them in practice is in order to do well in a technical interview. I wonder if I'm really restricting my ability to code better because my thoughts on this are misguided. Should I at least skim through resources on CS theory so that I can better recognize situations where I should utilize it?
[1] http://en.wikipedia.org/wiki/Dunning–Kruger_effect
In actual fact, nobody uses recursion in real life, and dynamic programming is of limited use outside of some very niche areas (unless you consider the generic concept of caching to be a type of dynamic programming). And, rarely do you need much in the way of data structures beyond lists, arrays, hash tables, and things that can be constructed out of them.
Most notably of the set of "things that can be constructed out of them," you want to know something about trees and graphs.
Anything beyond that is something that's going to apply only in certain very specialized situations. For example, if you're writing a crawler, knowing about Bloom filters comes in really handy.
Things that will actually come in handy are knowing various architectural patterns. This doesn't mean design patterns per se -- this would be things like service oriented architecture, for example. Most of these things you'll naturally gain through experience, but it can't hurt to read a book or two about them.
So, as far as actionable advice, I'd pursue at least the equivalent of a formal data structures class to strengthen your knowledge and give you the vocabulary to talk about things with other engineers. And, as I mentioned, background reading about things like architectural patterns won't hurt, either.
This is just my personal experience as a junior/mid level engineer. Your mileage may very well vary, and I hope some more senior people have other things to say.