I have been fortunate in my, admittedly brief, career and that I was blessed with two mentors in my early* career. Some of the really cool aspects of the situation were:
- They were friends
- They sat next to each other
- They were very different personality-wise
The fact that they were friends was great because I could speak and work with either one of them and be able to reference the other without there needing to be additional context added. Each understood what the other’s viewpoints were.
In the early days of my employment at my current company they had cubicles (low-walled) across from each other so at any time, depending on my mood, I could decide which I was going go to for advice. But since they were so close, either could chime in with their thoughts, which created an awesome arena for hashing out ideas.
The last was perhaps the most important because, far from getting the “company line” they had very differing views on a lot of technical decisions in addition to their way of conveying their ideas. This is not to say that the actual ideas they had were always the opposite, it was more the way they felt that the solution should end up getting done. For instance, they may have both agreed on the “ideal” solution, but one of them, we’ll call him Jerry, really would want it to be done in the most elegant and closest to the “ideal” as possible and was very opinionated on it. The other, Jess, was more practical and would tend more toward feeling that it was ok to get it done within a reasonable time-frame while at least trying to keep the ideal in mind. He did not advocate just “hacking it together” by any means, but rather acknowledged that there were time and system constraints that would make it prohibitive to do it perfectly.
What this meant for me was that on any project — especially when I myself could come up with multiple solutions or felt that my current design wasn’t feasible or featured a lot of “you don’t need it yet” — I could go to them for advice and, depending on who I chose, either argue the crap out of it until the way it was going to be done became clear or be gently led toward a design that both solved the problem in a good way but also took into account compromises that resulted from the context surrounding the problem (such as time, previous designs, etc).
I should have mentioned earlier, but neither of these guys are/were “Architecture Astronauts” were just lived in the clouds of design. Both of them can and do write amazing code that other people use willingly in their own projects. Writing together (they really were friends and worked together well) as well as alone, they wrote the Sourceforge-hosted object relational mapper (ORM) system that our company uses, a J2ME UI framework used in multiple production and internal applications, a regular expression library which was incorporated into the GNU Classpath project, among many other things. One was responsible for the design of the core system that we use at our company, which services millions of transactions a month. Together they did much of the initial implementation.
In short, they know what they hell they are talking about and I am incredibly thankful that I had them at the start of my career (and continuing today) when I was fresh out of college. They took chances in me (giving me projects that I probably hadn’t actually demonstrated the ability to deliver on) and let me make mistakes, never ever forcing me to do it their way.
As readers, you’re in one of 5 camps:
- Know exactly who I am talking about but perhaps haven’t worked with them
- In addition #1, have had the pleasure of the same experiences that I have
- Can think of somebody who has acted in the same way for you
- Have not had a mentor
- Are the people I’m talking about
For #1, Rest assured, if you were uncomfortable hearing myself and “Jerry” having rather loud discussions, there was definitely no anger involved in our discussions, only passion about what we did.
For #2, You know exactly what I mean by all of this.
For #3, Hopefully your experience was as positive as mine and you know exactly what I mean. Go be a mentor for somebody else who is just starting out.
For #4, Find one! I don’t think it matters how long you’ve been in the industry, you’ve got a lot to learn, we all do. If nothing else, at least find somebody that you respect that you can bounce ideas off of. It’s ok to be unsure about how you should design or implement something, you may find that as you discuss it that the “right” answer just seems to coalesce. It might not be perfect, but it never will be. Unless you’re working completely on your own, time will always be a factor. You can’t rewrite a whole system to let your new idea “plug-in” without taking time and resources to do it. But if at least you agree on the compromises with someone you respect, you can feel good in knowing that at least you’re doing the best you can do within the constraints.
For #5, thank you, both of you.
* I’m specifically talking about my early career here, but not to imply that I don’t still have mentors because I think that in some ways every developer (and even non-developer) I meet or read about can act as a mentor in some form as they end up teaching me something. I truly believe, and have been known to say on occasion, that you “learn something every day”