Do I Really Need To Be So Bespoke?
Bespoke describes any item commissioned to a particular specification, altered or tailored to the customs, tastes, or usage of an individual purchaser.
-- wikipedia
The Joy of Bespokeness
All software developers acquire certain tastes and preferences over time. A feel for what code and systems should look like.
This sometimes results in satisfying moments where we're able to shape our little worlds 'just so'. Of course, our tastes may change over time, but for the moment, everything feels perfect.
Software engineering can be a craft, and there's no reason we shouldn't enjoy being crafty with it when we can. Without a little creativity and craftsmanship, our jobs would be pretty mundane at times.
The Dangers of Bespokeness
Sometimes the desire to have everything just so can lead to deep rabbit holes or ever-expanding work. For example, check out my current work in progress for Jernel.
I'm having fun deciding just what I want to build, and how I want to build it. It's nowhere near complete, but I've already made some key decisions: zero build, zero dependencies, no frameworks, custom elements, reactive collections, etc.
None of these are inherently good or bad decisions, but they do have consequences. So far, though I've written, refactored, and tested a few hundred lines of code, the actual app is basically nothing. I can type some text in a box, and it shows up in another box. If I do that a few times, then I've got a list of boxes. I could have done that in React or Vue in much, much less time.
So, I don't have an interesting working app yet. I have a boring app, and some mediocre code to manage all of the data / state, reactivity, and rendering. You know, things that I could get out of the box with React, Vue, or other libraries / frameworks.
From a pure 'business value' standpoint, I might be headed in the wrong direction!
Where Will I Go From Here?
Frankly, I'm not sure. I enjoy tinkering with the low-level details sometimes. None of my code so far is particularly inspiring, but it's allowing me to think through exactly how the little pieces should connect. And, though I haven't articulated it yet, I have a vision for how some of these pieces will come together. This is a personal project, and I don't mind doing things the hard way, at least a little bit. As long as it leads to a better end result, or to worthwhile learning.
I'm definitely creating more work for myself than I need to, and that may be slowing my progress. But I also have a feeling that it will be easier to achieve a couple of my functional goals via bespoke code than by wrestling with opinionated libraries and frameworks.
My problem for now, though, is that I haven't articulated my goals specifically enough. Without specific goals, I can't make specific comparisons. For example, I can't say that a certain type of data structure, reactivity, or customization will be worse in React or Vue than in my bespoke code.
What Is The Next Responsible Decision?
Since this is just a personal project, it doesn't really matter what I decide to do. The worst consequence will be either unnecessary effort or (yet another) unfinished project. But nobody is depending on me, so maybe that's ok?
BUT! We can often find ourselves at a very similar crossroads in 'real' projects. In these cases, we need to make an explicit decision, at some point. Is the flexibility gained from bespokeness real or imagined? And is it worth the cost? Exactly what are we gaining, or what are we giving up? Exactly what is the cost?
I think my next step - for my benefit and as an illustration for you - will be to express some of my requirements in more concrete terms. Requirements that can be tested, maybe prototyped and compared in different frameworks or libraries.
Stay tuned ...
PS - If You Need a 'Reasonable Default' Way to Think About This
Sometimes having a reasonable default approach to certain decisions is helpful. So, here's the reasonable default for this case. In many - possibly most(?) - 'real world' software development scenarios, you'll deliver more and better value faster by using a well established framework rather than reinventing all the things yourself. Bespoke can often be very expensive in the long run. Sometimes the value you're creating really is in the very low level code details, but often it's in the big picture of how the components come together to do cool things.