After my previous post introducing Post-Architecture, I received a bunch of positive feedback, as well as enquiries from people wanting to know more. So I figured a follow-up was in order. Feel free to ask questions here as well as on Mastodon!
Something that definitely separates me from some of my less experienced coworkers is that, when I sit down and start to implement a plan I came up with in my head, if it turns out that things start exploding in complexity then I reevaluate my plan and see if I can find a simpler approach. By contrast, my less experienced coworkers buckle down and do whatever it takes to follow through on their plan, as if it has now become a test of their programming skills. This makes life not only more difficult for them but also for everyone who has to read their code later because their code is so hard to follow.
I try to push back against this when I can, but I do not have the time and energy to be constantly fighting against this tendency so I have to pick my battles. Part of the problem is that often when the code comes to me in a merge request it is essentially too late because it would have to be essentially completely rewritten with a different design in order to make it simpler. Worse, the “less experienced” coworker is often someone who is both about a decade older than me and has also been on the project longer than me, so even though I technically at this point have seniority over them in the hierarchy I find it really awkward to actually exercise this power. In practice what has happened is that they have been confined to working on a corner of the project where they can still do a lot of good without others having to understand the code that they produce. It helps that, as critical as I am being of this coworker, they are a huge believer in testing, so I am actually very confident that the code they are producing has the correct behavior, even when I cannot follow the details of how it works that well.
I’ve had a colleague or two like that before. “I’m willing to put in the work to fix the code” is something I would hear, as if it were some kind of virtue. To their credit, people like this move mountains to make shit work, and it usually does. Yet, trying to read and understand their code (much less change it) is a Sisyphean endeavor.
Thanks! This mirrors quite some experiences I’ve had over the years indeed. And for what it’s worth, I think the way you’re handling that is not bad at all.
As someone else mentioned in the comments on Mastodon, one of the hardest things about mentoring is articulating the lessons you may not even realize you’ve learned. I don’t think anyone can be blamed for failing to teach or convince someone else, since people are simply too different to be able to teach and convince them all. As you say, you have to pick your battles, and as long as you let your teammates do their work respectfully in their own way, that alone is a great achievement!
This definitely resonates with me. Guess it helps that we’ve all probably been on both sides here. The last time one of our juniors did something overly complicated I showed them some code from an old commit I made years ago, and asked them to explain what it did - neither of us could figure it out in a reasonable amount of time 🤣
I vividly remember some of the garbage code I’ve written in the past. Huge interface definitions… Weird and brittle abstractions… Overly complex processes to do what should have been a simple task…
Funny thing is, I read and understood the same kinds of things as any other coder worth their salt: agile, SOLID, YAGNI, do one thing well, and so on – but it was all just theory. It takes experience and mistakes to really grok it all.
Is there a meaningful difference between this idea of Post-Architecture and emerging architecture?
I assume you’re referring to this blog series: https://medium.com/prospa-technology/emerging-vs-intentional-architecture-385071ae5d75 ? I wasn’t aware of it, and it seems to have some insightful observations! There’s definitely some overlap, but by the looks of it, I think I will diverge quite a bit with my next post. I think I’m pretty aligned on the “One-Way Decisions” vs “Two-Way Decisions” part. A One-Way decision in my mind would be, which programming language or framework do we use? Do we use REST or GraphQL?
But it doesn’t really go into how to deal with Two-Way decisions, apart from saying to trust your developers. And I think it kinda glosses over the part that things that may appear to be Two-Way decisions initially may actually be closer to One-Way decisions if you continue to build on them. So where that blog still focuses quite a bit on the process, I think I want to shift the focus a bit more to the technical side (so far I’ve mostly laid down the values that inform the technical direction), especially when it comes to Two-Way decisions. I wasn’t thinking about covering One-Way decisions much, but rather on how to shape everyday coding to be more in alignment with Post/Emerging architecture so that you can avoid the Two-Way decisions that in retrospect aren’t as much of a Two-Way decision as you’d hope.
Hope that makes sense :D
I will read that post sometime (maybe). I wasn’t really referring to some well defined thing, but rather to something that happens naturally when complex software development is done right. Quasi-scientific: make assumptions, build the thing, test assumptions, update assumptions, rinse and repeat. The “architecture” ends up being the collected knowledge about the system which emerges from the development.
Something like that anyway. Interested to read about One and Two Way decisions.
Ah, fair :) then yeah, I’d say it’s pretty aligned with emerging architecture, just that I’m trying to define the values (and in the next post, technical guidelines based on those values) to (hopefully!) help you make the right decisions as you’re working on an emerging architecture.