Confessions of a Software Developer*
I’m ready to confess. It’s time to lay it all on the table. Ready?
I can’t keep up!
Wow, that was liberating! I think I should start a taxi service for developers.
There is so much going on in the world of software, how can I keep up with it all, while still making progress in my job? I can’t shift with the winds of what’s new or popular–even if it makes sense–they just shift too fast, it seems, and there’s no way I can be productive at work and keep up with all the new stuff. Goodness knows I try.
Here’s a list of things/buzzwords I really want to learn or use but haven’t had the time, or more importantly, haven’t had a real project that I could practice on. Growing in your software development abilities and experience relies on mentoring and apprenticing, after all. I wholeheartedly believe that. That’s why I work to surround myself with incredible people.
1. TDD – Test Driven Development
For a while now I’ve been at the point where I see the great benefits to TDD, and would love to do it, I just don’t know where to start. I need to really learn it. And by learn, I mean "be mentored". I can read about it, but implementing it on a project takes it to a ‘hole nutha level‘. And if I don’t know what I’m doing, I can’t implement it on a real project at work.
2. DDD – Domain Driven Design
This is a tough one, as it’s not really a technology or methodology, but more of a way of thinking. Which always makes me wonder: am I thinking this way? Should I be, if I’m not? How can I apply this way of thinking to my projects, considering that in many cases I’m adding features to existing products that haven’t necessarily been designed this way?
3. BDD – Behavior Driven Development
No comment. I think I just need one or two more xDD acronyms to investigate.
4. DI/IoC – Dependency Injection/Inversion of Control
This feels pretty basic, and I understand the concepts and at least grok the list of available frameworks. But in my experience it’s an architectural decision that if you don’t make from the start of an enterprise project, well, good luck getting it in later without a significant effort. And doing this right plus learning one of the existing frameworks takes a large investment that frequently I don’t have. At the moment we’ve chosen to use CAB (and related technologies) at work for our new projects, and I’m on the learning curve for it right now. I wish I was more well-rounded.
5. ORM – Object Relational Mapping
Basic stuff, right? Not for me. I work on a real-time system, not so much a database driven one, although I have done a lot of database-related work in the past. ORM doesn’t apply to me as much right now, but if you work on anything but a real-time system you’re probably using one. I’ve been learning NHibernate lately with CodeCampServer, and it’s definitely a stretch for me. I think the real problem is combining the ORM with DDD. ASAP, PDQ. FYI.
6. AOP – Aspect Oriented Programming
Another "nice to learn" idea, but I have trouble making time to learn it, not to mention how to apply it.
7. A bunch of stuff from this list (though not nearly everything)
Stuff like refactoring (specifically how to apply it successfully to large projects), proper and structured integration of LINQ and dynamic languages (if at all), what I’ll call "reasonable agile" — non-extreme agile practices, visual modeling/model-driven design, evolving architectures, etc.
You might notice that some of these things on my list aren’t exactly new or groundbreaking. This is a confession, after all. Would it be confessing to say that I don’t know much about Astoria? Nah, most people don’t. So… does anybody else struggle to learn and incorporate stuff like this? What about those who don’t? Got any suggestions for me, and people like me? What are some good sources that a random developer on the Internet can find for being mentored in practices like TDD?
* Disclaimer: I have to limit the term "software developer" to what I am: a non-consultant, full-time developer leading a team of 8 (within a dev organization of 130+) working on a mature and complex product with a release cycle of 12-18 months, and handling escalated support cases–you can’t not mention support! Oh, and I have a family and a life. 🙂