15 ms·
Articles like this are equal parts fascinating and worrisome. Fascinating because as a developer I love to see elaborate systems built to accomplish a goal. Wor
by PragmaticPulp 5y ago
Articles like this are equal parts fascinating and worrisome. Fascinating because as a developer I love to see elaborate systems built to accomplish a goal. Worrisome because as a manager I have alarm bells going off in my head when I start reading about systems that get so complex that they have to add even more complexity just to tame problems introduced by earlier complexity:
> First it determines all content changes that occurred between the commit that's being built and the commit of the last time there was a refresh (that value is stored in redis and my server exposes an endpoint for my action to retrieve it). If any of the changed files were in the ./content directory, then the action makes an authenticated POST request to another endpoint on my server with all the content files that were changed. Then my server retrieves all the content from the GitHub API, recompiles the MDX pages, and pushes the update to the Redis cache which Fly.io automatically propagates to the other regions.
> This reduces what used to take 10-25 minutes down to 8 seconds
If my team reached the point that simple website deploys were taking 25 minutes or required long chains of API calls between bouncing between various internal and external services, I’d start to worry about what sort of complexity we’ve built into our stack. On one hand their solution is neat, but on the other hand I can’t help but worry about how we got here in the first place. More importantly: Why? What does this complexity give us that we couldn't achieve with a simpler solution? Imagine being asked to take over this project and having to understand the long chain of events required just to get new content into the website.
I understand these articles are meant to be a showcase of technologies and how they can be used, but I’ve also seen a lot of otherwise simple webdev projects spiral into unnecessarily complex projects like this. I've also mentored a lot of juniors who think their companies are doing something wrong if they're not building complexity-first web projects or they're not using a long checklist of the hottest webdev tools.
These complex projects are fun to work on and learn, but it becomes a huge burden to maintain. The webdev world moves so fast that a project built on 15 different trendy projects will inevitably have some of them fall out of favor or become deprecated each year. Any long-term project like this will inevitably start losing time to constant refactoring and rebuilding around the newest trendy components each year.
It’s critically important for these teams to have some oversight in the form of someone asking pointed questions about whether or not each additional layer of complexity is truly necessary. Some times the most elegant solutions are also the most painful maintenance nightmares down the road as the original architects cycle out of the company.
Side note: As much as I appreciate all of the great free learning resources made available by authors like this, I can't get past the inherent conflict of interest involved with educators advocating for complex projects and then selling learning materials to understand them. This seems especially common in the webdev world where the popular tooling changes from year to year and can require a lot of learning to get it right. Sure enough, this blog post ends with a call to purchase tickets to learning workshops to understand what's going on here:
> It's been a ton of fun and I'm excited to put my learnings into blog posts and workshops to teach you the specifics of how I did this stuff so you can do it too. In fact, I've already scheduled some workshops for you to attend! Pick up tickets now.
As always: Caveat emptor. Complex projects are fun, but don't assume that a modern website must be complex.
- titzer 5y ago> > First it determines all content changes that occurred between the commit that's being built and the commit of the last time there was a refresh (that value is stored in redis and my server exposes an endpoint for my action to retrieve it). If any of the changed files were in the ./content directory, then the action makes an authenticated POST request to another endpoint on my server with all the content files that were changed. Then my server retrieves all the content from the GitHub API, recompiles the MDX pages, and pushes the update to the Redis cache which Fly.io automatically propagates to the other regions. So it's a makefile with rsync. Gotcha.
- thr0wawayf00 5y agoI completely agree with you that an architecture like this would likely become cumbersome to maintain as product requirements shift. That said, I've noticed that new tech kinda feels like an arms race in terms of recruiting. Top companies pledge to use newer technologies as a carrot to lure in devs as older technologies fall out of style, so the expectation is then placed on developers to learn new tech in order to get those top jobs. I see this as the dark side of "always be learning new things", because we often justify the need to learn these new technologies by translating them into job opportunities.
- PragmaticPulp 5y ago> Top companies pledge to use newer technologies as a carrot to lure in devs as older technologies fall out of style, so the expectation is then placed on developers to learn new tech in order to get those top jobs. Having been on both sides of this (IC and hiring manager), I've realized it goes both ways: A lot of candidates assume that unless your company is using the latest technologies, it's not a good place to work. This drives a lot of team leads and engineering managers to try to play Buzzword Bingo to make their project look most attractive to candidates. Candidates see this and assume that they also have to play Buzzword Bingo to be compatible with those most attractive jobs. It's a vicious cycle.
- kodah 5y agoLike usual, our society operates in extremes. When I first came into tech businesses would use old, cumbersome stacks because refreshing every 5 years was of no benefit to business oriented people. A good chunk of businesses (still) don't really like the word refactor, so they don't integrate a certain percentage of it into the roadmap. Then engineers got tired of maintaining software that was on life support without acknowledgement, and the competition for engineers took over. Now you have incredibly new relatively untested stacks and tech being used as a recruitment tool. This might be my personal opinion, but if you write modular code and dedicate about 40% of your roadmap to refactor, commiting code upstream, and engineering related tasks you won't run into near as many long term maintainability issues.