<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Charles Villard</title><description>Devlog and portfolio of Charles Villard, software engineer</description><link>https://charlesvillard.co/</link><item><title>The newest trend in design will be words.</title><link>https://charlesvillard.co/blog/the-newest-trend-in-design-will-be-words/</link><guid isPermaLink="true">https://charlesvillard.co/blog/the-newest-trend-in-design-will-be-words/</guid><description>The push to accelerate is a push back towards creativity.</description><pubDate>Mon, 27 Apr 2026 17:14:42 GMT</pubDate><content:encoded>&lt;p&gt;A lot of what we&apos;re seeing today in the developer space is oriented around the acceleration of value. AI being the trendy topic, it&apos;s only natural that corporations want to appear invested, employees want to seem knowledgeable, and investors want to see it supported. I won&apos;t bore anyone reading this with a list of examples; throw a stone and you&apos;ll hit five. Still, just to summarize, AI seems to be the latest threat used by some people coming for the lunches of engineers, designers, project managers, and, to some extremes, generally other people, in the most haunting way.&lt;/p&gt;
&lt;p&gt;Asking an LLM when ChatGPT became mainstream seems trite, but I did, and the answer I got back was 2022. That seems like a short and long time ago at the same time. Short, in that it&apos;s only been a few years, but long when it comes to the industry&apos;s race to innovate exponentially faster. People can build all kinds of things, in varying capacities of &quot;good&quot; or &quot;bad&quot;, cheaper now than ever. Whether that&apos;s &quot;good&quot; or &quot;bad&quot; is not why I&apos;m writing this, though.&lt;/p&gt;
&lt;p&gt;On the other side of React Miami 2026, I&apos;m thinking back to James Mikrut&apos;s &lt;a href=&quot;https://www.reactmiami.com/speakers/mikrut&quot;&gt;Robots Can&apos;t Taste&lt;/a&gt; and Serge Leon&apos;s &lt;a href=&quot;https://www.reactmiami.com/speakers/leon&quot;&gt;The Anti-Shiny Object Syndrome&lt;/a&gt;, both fantastic talks that share intention as a through line. The former highlights how AI can&apos;t have opinions or points of view, and how those are still the responsibility of the user. The latter was a study on one company&apos;s findings while growing out their codebase and building lasting tools. One takeaway from both: human input and discretion are key. Maybe that&apos;s not saying much, but it&apos;s important enough to repeat and remember. The &quot;human in the loop&quot; is more than just a checkbox.&lt;/p&gt;
&lt;p&gt;Even so, as we try to design better ways to accept AI into our workflows, it feels to me like there&apos;s always a fuzzy border to keep an eye on. Adoption of these tools often foments proliferation of these tools, and that pushes the border closer to human users, leaving us with less to have a say in. Which is why I think we&apos;re overlooking what&apos;s likely our best design tool.&lt;/p&gt;
&lt;p&gt;You&apos;re reading them, actually.&lt;/p&gt;
&lt;p&gt;In 2013, Mig Reyes wrote a fantastic post that&apos;s stuck with me reminding us that &lt;a href=&quot;https://migreyes.com/writes/design-is-still-about-words/&quot;&gt;design is still about words&lt;/a&gt;. I think that&apos;s probably more true now more than ever. Websites are simply a medium for us to contextualize our content, and applications are a throughway for us to move that content and context around. AI tools are certainly capable of generating content, but without the human experience, it will only parrot what it thinks we want. We can guide it, but that doesn&apos;t replace thought, consideration, care, and detail.&lt;/p&gt;
&lt;p&gt;Is it possible it may learn how to accomplish that in time? Yeah, but the funny thing about the human experience is that it&apos;s probably the one thing that changes exponentially faster than technical innovation. As long as we don&apos;t allow human creativity to be quashed, I can see a world where AI may expedite the technical, but we as humans will drive the experience we want our users to feel, not simply use or see.&lt;/p&gt;
&lt;p&gt;Really roundabout way to suggest that you start creating or blogging again, but if you read this far, I must have done something right, huh?&lt;/p&gt;
</content:encoded><updated/></item><item><title>Let&apos;s play ball</title><link>https://charlesvillard.co/blog/lets-play-ball/</link><guid isPermaLink="true">https://charlesvillard.co/blog/lets-play-ball/</guid><description>A bit of a homecoming, and a hell of an onboarding.</description><pubDate>Thu, 05 Feb 2026 14:54:18 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s been a few weeks since I start, and these &lt;a href=&quot;https://www.nbcmiami.com/news/local/after-historic-cold-snap-in-florida-cold-weather-is-still-expected/3758024/&quot;&gt;cold snaps&lt;/a&gt; need to stop. Warming my fingers up every ten minutes has slowed my coding down so much. It&apos;s a stark difference compared to week one on the job.&lt;/p&gt;
&lt;h2&gt;New job, freshly landed&lt;/h2&gt;
&lt;p&gt;I would describe Santo Domingo as, at times, ...aggressive. Buildings often felt like they loomed over the bumper-to-bumper traffic and motorcycles would thread through lanes in a semi-calculated dance. Elevated expressways, crowded with vehicles leaving the city, cut through swaths of tightly-packed apartments and businesses, some close enough to step over to from the overpass.&lt;/p&gt;
&lt;p&gt;Amongst the throng was the van ferrying me to the second day of my new job: &lt;a href=&quot;https://www.mlb.com/marlins/team/front-office#:~:text=Senior%20Software%20Engineer%3A%20Charles%20Villard&quot;&gt;Senior Software Engineer for the Miami  Marlins&lt;/a&gt;. Along with the rest of the Baseball Systems team, we headed to the Marlins Academy in the Dominican Republic, east of Boca Chica.&lt;/p&gt;
&lt;p&gt;Talk about setting a high bar for onboarding.&lt;/p&gt;
&lt;p&gt;My claim of &lt;a href=&quot;https://charlesvillard.co/blog/landing/&quot;&gt;week one being a lot&lt;/a&gt; was accurate. The idiom &quot;drinking from the firehose&quot; doesn&apos;t do it justice. Between learning about our cohort&apos;s responsibilities and initiatives, the technology they&apos;ve deployed, what projects are coming down the pipe, and the Academy&apos;s work as part of the Dominican Summer League and the Marlins&apos; recruitment pipeline (did I mention we were in the Dominican Republic, yet?), a firehose feels like a weak comparison. It was more like being dropped in the ocean. Thankfully, my colleagues were and have continued to be plenty supportive, answering my questions and entertaining my curiosities about the game and how the Marlins are trying innovating in the sport. It&apos;s going to be a fun year, to be sure.&lt;/p&gt;
&lt;p&gt;On top of a fantastic and productive offsite, whether through serendipity, happenstance, kismet, or something else, I got to reunite with some of my family. The bookend to my trip was being able to visit my father, whom I hadn&apos;t seen in more than five years.&lt;/p&gt;
&lt;h2&gt;Removing friction to win&lt;/h2&gt;
&lt;p&gt;As someone whose last athletic foray was a poorly played season of JV basketball during his freshman year of high school, I never consciously drew parallels between sports and software. Yet, when you consider everything that gets tracked about players&apos; efforts in any sport, the need for intuitive tools to understand it all makes sense.&lt;/p&gt;
&lt;p&gt;Over the last few decades, professional teams across sports have realized this, and have become highly invested in building better tools to improve their chances at a championship. The drama &lt;a href=&quot;https://en.wikipedia.org/wiki/Moneyball_(film)&quot;&gt;Moneyball&lt;/a&gt; touts how the Oakland A&apos;s leaned on the concept of &lt;a href=&quot;https://en.wikipedia.org/wiki/Sabermetrics&quot;&gt;sabermetrics&lt;/a&gt; to out-recruit teams with deeper pockets and reach the playoffs in 2002, winning 20 consecutive games along the way. Tools for this kind of work have modernized since then, but like many an internal tool and enterprise software, &quot;good enough&quot; meant software was left alone as long as it got a result, even if it took minutes. My job is basically to help break that notion with intentionally designed, performant front-end code.&lt;/p&gt;
&lt;p&gt;When I first applied to this job, I have to admit it was for the nostalgia. I was born and raised in Miami, growing up alongside the Marlins back when they repped Florida. Learning more about the work got me excited about building intuitive interfaces to surface a wide range of data, and working around areas like machine learning, data visualization, and statistical analysis.&lt;/p&gt;
&lt;p&gt;Needless to say, I&apos;m thrilled to have made the cut. I can&apos;t talk about much, but I&apos;m excited to share more about what I learn. For now, does anyone have some throwing drills to recommend? My fielding needs some work.&lt;/p&gt;
</content:encoded><updated>Thu Feb 05 2026 16:17:15 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Landing</title><link>https://charlesvillard.co/blog/landing/</link><guid isPermaLink="true">https://charlesvillard.co/blog/landing/</guid><description>New year, new starts</description><pubDate>Wed, 07 Jan 2026 16:28:23 GMT</pubDate><content:encoded>&lt;p&gt;The end of 2025 was... well, it sucked. Getting laid off is never fun.&lt;/p&gt;
&lt;p&gt;Immediately after I got the news, I started reaching out to people in my network to find something fast. If you&apos;re someone who reached out to me, thank you for the kind words, support, opportunities, and referrals. If you&apos;re someone who never knew me before last November and met with me anyways, thank you for your consideration, guidance, direction, and time. I&apos;m really grateful to be in touch with so many brilliant, empathetic people.&lt;/p&gt;
&lt;p&gt;The holidays were really a bit of a mess for me, getting ready to celebrate Thanksgiving and Christmas in between the severance paperwork, intro calls, panel interviews, technical assessments, coding exercises, and feedback reviews. Lots of possibilities were considered: pivoting to developer relations, switching to DevOps or AI engineering, freelancing, starting my own thing. None of these options were realistic in the short term, but between the economy, the industry, and my pyramid of intrinsic needs, I was willing to consider them.&lt;/p&gt;
&lt;p&gt;As luck would have it, an organization I applied to shortly before I was released reached out to me. It wasn&apos;t one I expected to hear back from, but it was one of those opportunities you get curious about because it generates a feeling. Kind of like being a teenager and landing a gig at that one shop you and your friends always stopped by.&lt;/p&gt;
&lt;p&gt;Well, after many conversations with their team, I can say I&apos;ve accepted an offer from them. I won&apos;t be saying who they are just yet, but I start next Monday. I couldn&apos;t be more grateful for the chance.&lt;br /&gt;
&lt;br /&gt;
Week one is going to be a lot.&lt;/p&gt;
</content:encoded><updated>Wed Jan 07 2026 16:45:58 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Ready for new opportunities</title><link>https://charlesvillard.co/blog/ready-for-new-opportunities/</link><guid isPermaLink="true">https://charlesvillard.co/blog/ready-for-new-opportunities/</guid><description>Now that I&apos;m available for full-time work, this is what I&apos;m looking for in a role.</description><pubDate>Mon, 17 Nov 2025 22:15:16 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m currently on the market looking for a new full-time software engineering role! What follows is a bit about myself and what I&apos;m looking for in my next position.&lt;/p&gt;
&lt;h2&gt;I am a...&lt;/h2&gt;
&lt;h3&gt;Builder of digital things&lt;/h3&gt;
&lt;p&gt;I level up websites and applications with modern tooling and best practices, curating cohesive and compelling brand stories, building intuitive user interfaces for unique solutions, and developing tooling and platforms to help other engineers excel.&lt;/p&gt;
&lt;h3&gt;Flexible learner&lt;/h3&gt;
&lt;p&gt;I pride myself on the ability to learn and become productive with new languages and esoteric tools quickly. I&apos;m not afraid to step outside my comfort zone, and I&apos;m always willing to experiment, explore, and come back with insights.&lt;/p&gt;
&lt;h3&gt;Collaborator&lt;/h3&gt;
&lt;p&gt;Collaboration on diverse, cross-functional teams is important to me, learning from the perspectives of others, whether they&apos;re designers, marketers, engineers, product managers, or otherwise.&lt;/p&gt;
&lt;h3&gt;Presence on stage and screen&lt;/h3&gt;
&lt;p&gt;I enjoy employing my background in communications to present demos, speak on podcasts, deliver talks, and even read lines for voice acting. I&apos;ve presented at multiple hackathons, hosted meetups and conferences, and have spoken to college students about web development and the tech industry.&lt;/p&gt;
&lt;h3&gt;Advocate for the community&lt;/h3&gt;
&lt;p&gt;Advocacy is something I care about very much. I do my best to be an active participant in the discourse of the web development community in social media threads, Discord servers, and Slack channels.&lt;/p&gt;
&lt;h2&gt;What I&apos;m looking for&lt;/h2&gt;
&lt;h3&gt;Frontend and Full-stack Development&lt;/h3&gt;
&lt;p&gt;I have a decade of experience in frontend and full-stack development, building intuitive, accessible user interfaces and integrating APIs written in PHP, Ruby on Rails, and TypeScript. I&apos;ve even worked on ASP.NET Web Forms projects in C#.&lt;/p&gt;
&lt;p&gt;Some of my favorite projects involve informing and enabling others with the best experience possible, whether that&apos;s building tools for development teams or open-source, applications for users, or marketing websites to inform visitors. I enjoy roles with novel problems to solve that allow experimentation and are open to suggestions.&lt;/p&gt;
&lt;p&gt;Roles I&apos;m interested in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frontend or Full-stack Engineer&lt;/li&gt;
&lt;li&gt;Design or UI Engineer&lt;/li&gt;
&lt;li&gt;Design Technologist&lt;/li&gt;
&lt;li&gt;UI Platform Engineer&lt;/li&gt;
&lt;li&gt;Web Engineer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I&apos;m definitely open to discussing their &quot;senior,&quot; &quot;staff,&quot; and &quot;developer&quot; derivatives as well.&lt;/p&gt;
&lt;h3&gt;Developer Advocacy&lt;/h3&gt;
&lt;p&gt;Another area that&apos;s been particularly interesting to me has been developer advocacy. I enjoy working with developers, communities, and non-technical staff to find answers to novel questions, and bring constructive feedback to project owners and engineering teams. If you are hiring for roles involved in developer relations, advocacy, evangelism, documentation, or similar, please feel free to reach out! I&apos;d love to have a conversation.&lt;/p&gt;
&lt;h2&gt;What makes a role stand out&lt;/h2&gt;
&lt;p&gt;Beyond the salary, there are a few things an organization can offer that would catch my attention.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I prefer and have thrived in remote roles. Currently based outside of Tampa, Florida, so I am also open to flexibly hybrid roles within the Central Florida area. I&apos;m also open to discussing relocation, though I expect it would be difficult at this time.&lt;/li&gt;
&lt;li&gt;Medical, dental, and vision benefits that significantly cover the health costs of both myself and my family&lt;/li&gt;
&lt;li&gt;401k match&lt;/li&gt;
&lt;li&gt;Inclusive employee resource groups that represent the diversity of your organization&lt;/li&gt;
&lt;li&gt;Professional development budget&lt;/li&gt;
&lt;li&gt;Flexibility to pursue personal growth opportunities like speaking engagements&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Things I&apos;m not looking for&lt;/h2&gt;
&lt;p&gt;I&apos;m willing to consider positions at many companies or for a variety of causes, but there are a few lines and veils I do my best to adhere to.&lt;/p&gt;
&lt;p&gt;I&apos;m not interested in roles that focus heavily on direct sales, account management, people management, or marketing. I enjoy being as close to the code as possible.&lt;/p&gt;
&lt;p&gt;While the tenants of decentralization are appealing and I wouldn&apos;t mind exploring projects like the AT protocol more, I&apos;m not interested in working in web3, blockchain, or cryptocurrency. Nor am I interested in military defense contracting.&lt;/p&gt;
&lt;h2&gt;How you can get in touch with me&lt;/h2&gt;
&lt;p&gt;If my &lt;a href=&quot;https://charlesvillard.co/resume/CDVResume2025-Web.pdf&quot;&gt;resume&lt;/a&gt; and what you&apos;ve read here aligns with a position you&apos;re looking to fill, please feel free to reach out to me at &lt;a href=&quot;mailto:c.d.villard@gmail.com&quot;&gt;c.d.villard@gmail.com&lt;/a&gt;. You can also learn more about me at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/cdvillard&quot;&gt;https://www.linkedin.com/in/cdvillard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bsky.app/profile/charlesvillard.co&quot;&gt;https://bsky.app/profile/charlesvillard.co&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.github.com/cdvillard&quot;&gt;https://www.github.com/cdvillard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><updated>Mon Nov 17 2025 22:35:24 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Running TypeScript in Node in Date.now()</title><link>https://charlesvillard.co/blog/running-typescript-in-node-in-datenow/</link><guid isPermaLink="true">https://charlesvillard.co/blog/running-typescript-in-node-in-datenow/</guid><description>Reminding myself of a quick way to run TypeScript</description><pubDate>Sun, 06 Jul 2025 00:39:06 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;TL;DR: Use &lt;a href=&quot;https://tsx.is/&quot;&gt;tsx&lt;/a&gt; as a modern replacement for tools like ts-node and nodemon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Platforms like &lt;a href=&quot;https://deno.com/&quot;&gt;Deno&lt;/a&gt; and &lt;a href=&quot;https://bun.sh/&quot;&gt;Bun&lt;/a&gt; support TypeScript out of the box. However, peek into any API-related course using TypeScript like I did recently, and you&apos;ll likely be working with &lt;a href=&quot;https://nodejs.org/en&quot;&gt;Node&lt;/a&gt;. The particular API design course I used was a bit dated by a few years, from before when Node supported native ESM imports. The instructions asked students to install &lt;a href=&quot;https://www.npmjs.com/package/ts-node&quot;&gt;ts-node&lt;/a&gt;, a TypeScript engine and REPL, to run TypeScript files locally.&lt;/p&gt;
&lt;p&gt;Unfortunately, that was a roadblock for me, throwing type errors left and right when I tried to start my development server. No matter how many errors I fixed or changes I made to my config, if my app didn&apos;t throw:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TypeError: Unknown file extension &quot;.ts&quot;&lt;/code&gt;,&lt;/p&gt;
&lt;p&gt;it was throwing:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Error: Cannot find module &apos;./index.js&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Part of the problem, I&apos;m guessing, was that I was using newer versions of Node and TypeScript than the course was designed for, with &lt;a href=&quot;https://pnpm.io/&quot;&gt;pnpm&lt;/a&gt; instead of npm to boot. The course was released back when &lt;code&gt;ts-node&lt;/code&gt; was the common approach. The &lt;a href=&quot;https://github.com/TypeStrong/ts-node&quot;&gt;ts-node project&lt;/a&gt; hasn&apos;t received updates since then, so there was likely some discrepancy between what would work then versus now. This might be old news for TypeScript developers working on APIs everyday, but as a front-end developer trying to refresh my full-stack skills, silly me for not remembering the pace of JavaScript&apos;s innovation.&lt;/p&gt;
&lt;p&gt;Finding a solution for running TypeScript projects locally was a frustrating rabbit hole. Typical TypeScript development calls for code to be compiled with the &lt;a href=&quot;https://www.typescriptlang.org/docs/handbook/compiler-options.html&quot;&gt;tsc&lt;/a&gt; CLI before restarting the server for every change you might want to test. A Google search for a solution to smooth that experience out kept turning up dated content with titles like &quot;How to set up a Node server with TypeScript in (insert any year after 2020 here),&quot; all basically recommending &lt;code&gt;ts-node&lt;/code&gt;. The circular nature of my predicament frustrated me enough to almost put down the work altogether.&lt;/p&gt;
&lt;p&gt;Thankfully, I came across &lt;a href=&quot;https://tsx.is/&quot;&gt;tsx&lt;/a&gt;. According to its documentation, tsx is designed to &quot;enhance&quot; Node.js, with support for CommonJS and ESM modes, and a built-in Watch mode to restart development servers on every saved change. Beyond being an easy drop-in replacement for ts-node, it can also be &lt;a href=&quot;https://tsx.is/node-enhancement&quot;&gt;used in place of Node commands&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The big benefit I&apos;ve enjoyed from &lt;code&gt;tsx&lt;/code&gt; is not needing to toss out my coursework to start over with another version of Node. I could have tried to use newer versions of Node now that &lt;a href=&quot;https://nodejs.org/en/learn/typescript/run-natively&quot;&gt;TypeScript is supported natively&lt;/a&gt;, sure, but then, I&apos;d need to figure out what else might be compatible or incompatible, and at that point, I might as well be forget about API design and start writing my own course!&lt;/p&gt;
&lt;p&gt;The point is, &lt;code&gt;tsx&lt;/code&gt; is a quick and easy way to run TypeScript files with little fuss around configuration, and it&apos;s with that in mind that I&apos;m writing this post. I hope other developers who need a quick solution can find this and avoid the dated solutions still topping the search results today. If you&apos;re one of them, please ping me on &lt;a href=&quot;https://bsky.app/profile/charlesvillard.co&quot;&gt;Bluesky&lt;/a&gt;! I&apos;d love to know how it worked for you.&lt;/p&gt;
</content:encoded><updated>Sun Jul 06 2025 05:51:31 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>A warning about Upwork</title><link>https://charlesvillard.co/blog/a-warning-about-upwork/</link><guid isPermaLink="true">https://charlesvillard.co/blog/a-warning-about-upwork/</guid><description>Never share your Upwork account.</description><pubDate>Tue, 01 Jul 2025 23:38:43 GMT</pubDate><content:encoded>&lt;p&gt;I won&apos;t bury the lede with this one: no matter who contacts you or what the pitch is, never share an Upwork account.&lt;br /&gt;
&lt;br /&gt;
If someone reaches out to you asking to borrow your Upwork account, or asking you to act as a &quot;senior so-and-so&quot; to  market services via an Upwork account, immediately report them as best you can. They&apos;re trying to scam you.&lt;/p&gt;
&lt;h2&gt;Some context&lt;/h2&gt;
&lt;p&gt;As more engineers struggle to find opportunities, especially those entering the industry, it may become more tempting to find alternative streams of income. This is nothing new. I&apos;ve seen a few booms and busts when it comes to the web development economy. It&apos;s during those busts that I&apos;ve witnessed a disturbingly consistent trend throughout my nigh-on ten years in web development, and it&apos;s still happening today.&lt;/p&gt;
&lt;p&gt;Upwork is one of the longest-running marketplace platforms for businesses and freelancers. It lets companies find and pay hired help for projects, and lets freelancers find and get paid for work on said projects. I don&apos;t know how popular it is now, but it was fairly common when I was getting started to see early web developers try and cut their teeth on freelance projects via Upwork.&lt;/p&gt;
&lt;p&gt;Ever since I started putting myself out there as a web developer, I&apos;ve been contacted by dozens upon dozens of accounts seeking assistance. They&apos;ll initiate contact, maybe with small talk or a plea for help. Eventually, they&apos;ll ask you a favor. The request is always the same. Whether it&apos;s that they&apos;re located in a country that can&apos;t access it, or they&apos;ve been banned by mistake and their livelihood depends on it, they will ask you to play liaison to clients through an Upwork account you control, offering a percentage of or fee from the project&apos;s profits.&lt;/p&gt;
&lt;h2&gt;Don&apos;t 👏 do 👏 it  👏.&lt;/h2&gt;
&lt;p&gt;While it may be tempting to do so, never entertain the idea that the person pitching you a partnership where you put your name and reputation on the line and on an Upwork account is in it with your best interest at heart. If you&apos;re caught, you would be the one losing your account and likely banned for the privilege. &lt;a href=&quot;https://support.upwork.com/hc/en-us/articles/18513114070419-Represent-yourself-authentically#section_2&quot;&gt;This kind of operation violates Upwork&apos;s ToS&lt;/a&gt;, and might end up supporting illegal activities like money laundering, fraud, or impersonation.&lt;/p&gt;
&lt;h3&gt;Where&apos;s all this coming from?&lt;/h3&gt;
&lt;p&gt;I&apos;ve got my start in web development teaching myself how to code, and that&apos;s was back when things were rough for me financially. While non-traditional paths into web development aren&apos;t uncommon, it&apos;s been my experience that people taking those paths come from an &quot;up from the bootstraps&quot; background. In times where many people in the workforce, both new and tenured, are financially vulnerable, hearing there&apos;s a way to make money by skirting the rules a little can be tempting. So I say this in the hopes that it informs someone before they make a bad choice out of desperation: don&apos;t share an Upwork account.&lt;/p&gt;
</content:encoded><updated>Tue Jul 01 2025 23:41:06 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Leet Heat Travelogue</title><link>https://charlesvillard.co/blog/leet-heat-travelogue/</link><guid isPermaLink="true">https://charlesvillard.co/blog/leet-heat-travelogue/</guid><description>What a blast</description><pubDate>Mon, 23 Jun 2025 06:54:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Earlier this year, &lt;a href=&quot;https://www.youtube.com/watch?v=ZY3uQb_goHk&quot;&gt;I got to be on an episode of Leet Heat&lt;/a&gt;! Jason, Mark, Annie, and the entire crew were phenomenal to work with! I&apos;m a few days behind publishing this after some very necessary days off, but I wrote most of this months before the episode aired, so I could tell you about my experience while it was fresh. Consider this a little peek behind the scenes.&lt;/p&gt;
&lt;h2&gt;The show&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;For those who haven&apos;t seen it yet, Leet Heat is a game-show concept from the mind of &lt;a href=&quot;https://jason.energy/&quot;&gt;Jason Lengstorf&lt;/a&gt;. If you like Jeopardy, web development, and Hot Ones, you will certainly dig this! It&apos;s basically &quot;the worst technical interview ever,&quot; as two contestants spin a wheel of categories and answer questions based on what it lands on. Should a player get the question wrong, they&apos;re docked points, their spice level is increased, and they have to eat a spicy &lt;a href=&quot;https://www.youtube.com/watch?v=3JrR7uktimg&quot;&gt;Deno Nuggie&lt;/a&gt;! The higher a player&apos;s spice level, the hotter the bite, up to level 10.&lt;/p&gt;
&lt;p&gt;Every game also starts with one &quot;Leet Heat&quot; tile. When a player spins and lands on that tile, their spice level is automatically increased, and they have to eat a spicy bite. Plus, once a category is played through, that category also becomes a &quot;Leet Heat&quot; tile! That means players eventually end up with a five-in-six chance to automatically down some spicy noms! Whoever gets the most points at the end of two rounds of spinning and spice wins the game and... well, bragging rights, essentially!&lt;/p&gt;
&lt;h2&gt;On the set&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Walking into the studio, it was so cool seeing the setup in person. The whole thing is shot on several high-def cameras with &lt;a href=&quot;https://marktechson.com/&quot;&gt;Mark Techson&lt;/a&gt; hosting, &lt;a href=&quot;https://anniesexton.com/&quot;&gt;Annie Sexton&lt;/a&gt; serving up punishing Deno Nuggies, Jason producing a la the &quot;man in the chair,&quot; and the contestants at their podiums, all mic&apos;ed up. Watching Jason&apos;s crew handling lighting, sound, hair, makeup, props, set design, still photography, and video production was amazing. (Also, special thanks to &lt;a href=&quot;https://jasonhillphoto.com/&quot;&gt;Jason Hill&lt;/a&gt; for the photos you&apos;ve seen so far!)&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Standing in the midst of all that made being there all the more real and my nerves started getting to me. My biggest fear at that moment was seizing up in front of the camera. Thankfully, everyone had my back. My opponent, &lt;a href=&quot;https://brittanyellich.com/&quot;&gt;Brittany Ellich&lt;/a&gt; (who also got to shoot an &lt;a href=&quot;https://www.youtube.com/watch?v=X2sEoZG8EIw&amp;amp;t&quot;&gt;episode of Web Dev Challenge&lt;/a&gt;, you should check it out!), was super encouraging leading up to our shoot. Mark was ever the consummate game show host, checking in on us when he could, keeping us loose, and making sure it was fun the entire time.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;After our episode was in the can, I hung out for the rest of the day and got to see more of the behind-the-scenes process. The goal was to shoot five episodes in a day, which Jason and the crew managed to knock out on time despite setbacks and hold-ups. Given the number of moving parts and variables, it&apos;s hard to describe how impressive a feat this was. Once a groove was found, everything and everyone felt in sync.&lt;/p&gt;
&lt;p&gt;Now, this will be the corniest line I&apos;ll ever write, but the real magic was indeed the amazing group of people I got to connect with along the way. Whether it was someone I only got to chat with online before that day, or someone I&apos;d never met before, it was a blast hanging out with the other contestants! There&apos;s something about connecting with other developers and engineers that re-energizes me about this work. It gets me wanting to learn and build! If you&apos;re reading this and we met on the Leet Heat set, you were an absolute pleasure to hang out with, and I hope we can do it again sometime!&lt;/p&gt;
&lt;h2&gt;A thanks and a plea&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I can&apos;t thank Jason enough for letting me be a part of this! If this is how you&apos;re learning about &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eQwPfZx8lixhpBg22KCCZzo&quot;&gt;Leet Heat&lt;/a&gt;, I can&apos;t wait for you to watch these episodes. Some are hilarious, and some are real nail-biters!&lt;/p&gt;
&lt;p&gt;If there is something I could ask of you, though, it&apos;s that you please share these with your colleagues or even people outside the tech community! We&apos;re in a time right now where the tech industry can use some levity. It&apos;d make me so happy to see Jason and others do more cool stuff like this! The more eyeballs these get and the more companies see people like this kind of content, the more companies might be willing to sponsor it, and the more opportunities we create for our community to make and build fun stuff together!&lt;/p&gt;
</content:encoded><updated>Mon Jun 23 2025 07:04:01 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>VueConf.US 2025 Recap</title><link>https://charlesvillard.co/blog/vueconfus-2025-recap/</link><guid isPermaLink="true">https://charlesvillard.co/blog/vueconfus-2025-recap/</guid><description>Coming back to the framework I started with</description><pubDate>Mon, 26 May 2025 18:58:47 GMT</pubDate><content:encoded>&lt;p&gt;I attended Vueconf.US 2025 this past week as it returned to Tampa, Florida! This was a bit of a homecoming for me, as Vueconf.US was where I gave my first-ever talk to a live crowd when it was last in Tampa in 2019. I finally got some time to write, having taken the week off to also celebrate graduations and get some downtime, so here&apos;s a recap and some thoughts on my experience!&lt;/p&gt;
&lt;h2&gt;My history with Vue&lt;/h2&gt;
&lt;p&gt;For those unfamiliar with my backstory, I cut my teeth using front-end frameworks with Vue.js back when I worked for Tenet Partners as a full-stack web developer in 2016. When a client requested custom features to help their employees select the right letterhead for their communications, I was challenged to add single-page application-like features to a predominantly multi-page application built on .NET Web Forms. After reviewing multiple options, I landed on Vue.js for its developer experience and progressive approach to installation. I worked with Vue in various roles until my current role at Hewlett-Packard Enterprise, where I work predominantly with React and HTML5 custom elements. All that to say, I have quite a bit of history with the framework.&lt;/p&gt;
&lt;h2&gt;Two days of great talks&lt;/h2&gt;
&lt;p&gt;Vueconf.US features a day of workshops, which I didn&apos;t get to attend, followed by two days of talks, the first of which was all stress because I was &lt;a href=&quot;https://vueconf.us/session?sessionId=824948&quot;&gt;one of the speakers&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;My talk, &quot;&lt;a href=&quot;https://charlesvillard.co/talks/full-circle-vueconfus-2025/&quot;&gt;Full-Circle: A Time Traveler&apos;s Perspective on Vue,&lt;/a&gt;&quot; is a recap of the last ten or so years of Vue&apos;s ecosystem. Like the title suggests, it&apos;s from the perspective of someone who used to work within the ecosystem and is returning to it after years away. When I started researching for this talk, what was a comparison of what I used to work with and what Vue developers are using also became a discussion about the impact of Vue 3&apos;s rewrite, the struggles of major migrations, and the impact engineering decisions can have on developers and engineers.&lt;/p&gt;
&lt;p&gt;Giving the talk and hoping all my slides worked was one thing, but it was another thing to be giving it following the creator of the Vue framework, Evan You! No pressure, right?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;In addition to giving my talk and emceeing for the afternoon, I got to enjoy fantastic talks by fantastic speakers! I won&apos;t go through every one, as they&apos;ll all be available online at some point, but some talks of note:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Evan forwent his typical State of Vue-style address to get into the technical details of Vue&apos;s new &lt;a href=&quot;https://www.vuemastery.com/blog/the-future-of-vue-vapor-mode/#the-case-for-vapor-mode&quot;&gt;Vapor Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://roe.dev/&quot;&gt;Daniel Roe&lt;/a&gt; and &lt;a href=&quot;https://www.lichter.io/&quot;&gt;Alexander Lichter&lt;/a&gt; of the Nuxt core team spoke about the state of Nuxt development and underutilized features, respectively&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://alex.party/&quot;&gt;Alex Riviere&lt;/a&gt; gifted us the use-magic-props package after teaching us increasingly chaotic ways to define props on Vue components&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kgrayson.com/&quot;&gt;Kathryn Grayson Nanz&lt;/a&gt; embodied the &quot;Pirate City Vue&quot; theme, encouraging us to ruin our users&apos; experiences for fun and profit&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://abbeyperini.dev/&quot;&gt;Abbey Perini&lt;/a&gt; hit us in the feels with her talk about how ADHD can be some developers&apos; superpower and how they must advocate for themselves&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developingdvlpr.com/&quot;&gt;Nerando Johnson&lt;/a&gt; called us all out about our side projects, whether they&apos;re our sidekicks or mentors&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/HenryLie&quot;&gt;Henry Lie&lt;/a&gt; showed us how automating our testing suites (you do have tests, right?) isn&apos;t as daunting as we think&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On top of the talks, the &quot;hallway track&quot; always makes for insightful conversations, speaking with developers from around town and the world about their challenges and discoveries. All in, I couldn&apos;t have asked for a more energizing experience. If ever you get the opportunity, I encourage you to attend an in-person conference. Especially in the recent climate of the tech industry, it&apos;s one of the best places to find inspiration, connection, and drive.&lt;/p&gt;
&lt;p&gt;Special thanks to Pratik and Vincent of &lt;a href=&quot;https://connectevents.io/&quot;&gt;connectevents.io&lt;/a&gt; for having me!&lt;/p&gt;
</content:encoded><updated>Wed May 28 2025 13:41:51 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Leveraging GitHub Copilot for Git commits</title><link>https://charlesvillard.co/blog/leveraging-copilot-for-git-commits/</link><guid isPermaLink="true">https://charlesvillard.co/blog/leveraging-copilot-for-git-commits/</guid><description>Sometimes it&apos;s the small things in AI.</description><pubDate>Thu, 03 Apr 2025 20:16:33 GMT</pubDate><content:encoded>&lt;p&gt;I would never call myself an early adopter when it comes to software trends, and one of those trends I&apos;m admittedly behind on is AI integrations in my toolset. I do have access to GitHub Copilot via work, and I recognize it&apos;s been &lt;a href=&quot;https://code.visualstudio.com/blogs/2024/12/18/free-github-copilot&quot;&gt;free for everyone&lt;/a&gt; for a while now, but I&apos;m all about gradual adoption when it comes to new things. Some people try stuff by tossing out their entire kit and diving into the new tools headlong. I dip my toes in to make sure it&apos;s not too shallow.&lt;/p&gt;
&lt;p&gt;That gradual adoption has helped me spot a lot about AI integration I&apos;m not thrilled about, but also many smaller things that I can appreciate. Case in point: I recently learned &lt;a href=&quot;https://code.visualstudio.com/docs/sourcecontrol/overview#_generate-a-commit-message-with-ai&quot;&gt;GitHub Copilot can suggest commit messages&lt;/a&gt;. It&apos;s smaller features like this that help me improve my workflow and draw me to AI more than &lt;a href=&quot;https://x.com/tobi/status/1909231499448401946&quot;&gt;being told to use it outright.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Normally, I&apos;d advocate that it&apos;s a good practice to commit often, and I stand by writing &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/#summary:~:text=The%20commit%20contains%20the%20following%20structural%20elements%2C%20to%20communicate%20intent%20to%20the%20consumers%20of%20your%20library%3A&quot;&gt;informative commit messages about the intent&lt;/a&gt;, not the content, of the commit. However, I&apos;d be lying if I said I never wrote a bunch of code, only to look back and start picking through files to determine which files match with what and how to group them best in case of a reversion. I posit that&apos;s one of the better curb-cut uses of the feature: identify what I did and summarize it for me so I can either improve on the message or commit it in the meantime. &lt;br /&gt;
&lt;br /&gt;
Either way, it sure beats my commit history being a mix of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Changes&quot;&lt;/li&gt;
&lt;li&gt;&quot;Fix a typo&quot;&lt;/li&gt;
&lt;li&gt;&quot;Remove a comment,&quot; and&lt;/li&gt;
&lt;li&gt;&quot;Please work now&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oh, and before I&apos;m labeled an AI doubter, or worse, not a team player, I&apos;m not saying I&apos;d never use tools like Cursor or that I&apos;d never vibe code. Normalizing on a set of tools is normal for an organization, and it&apos;s a practice companies exercised before AI was a thing. I&apos;m simply taking my time to bring it into my personal workflows.&lt;/p&gt;
</content:encoded><updated>Thu Apr 17 2025 05:10:41 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Tell a story you&apos;re a part of.</title><link>https://charlesvillard.co/blog/tell-a-story-youre-a-part-of/</link><guid isPermaLink="true">https://charlesvillard.co/blog/tell-a-story-youre-a-part-of/</guid><description>Sometimes the story you need to tell isn&apos;t about just you.</description><pubDate>Thu, 16 Jan 2025 23:30:34 GMT</pubDate><content:encoded>&lt;p&gt;A friend was preparing for a job interview at a pretty high-profile startup when he reached out for advice in an online community we both frequent. The recruiters had laid out some expectations for the interview that seemed pretty bog-standard, but one particular item prompted my friend to seek some guidance. Paraphrasing a bit, the prompt stated interviewees were expected to talk about a few things including:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&apos;s a complex project you&apos;ve worked on, relevant to this position? Who did you collaborate with? How did you contribute to the project? What were some challenges you overcame? How did your work affect the project in the end?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That first part can hit the panic button pretty hard.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&apos;s a complex project you&apos;ve worked on...?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s a fairly common question to get asked in interviews, especially for tech-related jobs, and yet, it always seems daunting to answer.&lt;/p&gt;
&lt;p&gt;Imagine someone walking up and asking this right when you&apos;re about to order some food. I&apos;d wager your first thought may be, &quot;Wait, what? I trying to get a sandwich.&quot;&lt;br /&gt;
&lt;br /&gt;
Give it a second, let it sink in, and your next thought may be, &quot;Oh, goodness. What&apos;s a complex project I worked on? What work did I complete that was genuinely complex, let alone relevant to the next job I want?&quot;&lt;/p&gt;
&lt;p&gt;For most people, this is likely when they scroll through their job history in their minds and find the most complex project they led and delivered, start to finish, top to bottom, soup to nuts. I&apos;m hardly innocent of this myself. I can count on my fingers how many times I answered similar questions with a vote of confidence, and that would be a good guess at best.&lt;/p&gt;
&lt;p&gt;For my friend, the nuance of answering this question wasn&apos;t about what complex project he solved, but that he hadn&apos;t solved any complex problems yet, in his mind. He hadn&apos;t worked in software development that long. How was he to honestly answer this with only so much work experience under his belt?&lt;/p&gt;
&lt;h2&gt;Main character syndrome&lt;/h2&gt;
&lt;p&gt;In this day and age of AI-driven web scrappers, I presume you who are reading this are like me and are human. We humans naturally tend to center ourselves when asked questions about what we&apos;ve done. Speaking for myself, talking about and upselling my work is probably one of the most uncomfortable positions to be in, and I bet I&apos;m not alone in that sentiment. Let&apos;s take a second to re-interpret the prompt, though.&lt;/p&gt;
&lt;p&gt;Instead of thinking about it as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&apos;s a complex task you yourself organized, led, championed, and delivered?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&apos;s try interpreting it as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What work have you contributed to a complex project?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Suddenly, answering this just got a lot easier, didn&apos;t it? Talking about your role in something complex can be a lot easier than talking about a complex role you had to fill.&lt;/p&gt;
&lt;p&gt;Part of the sum&lt;/p&gt;
&lt;p&gt;Anyone working on software, let alone anything in general, is rarely asked to deliver deeply technical and complex solutions all by themselves. Any given project is usually broken down into tasks. Those tasks are delegated to people, often based on their specialties or bandwidth. The sum results of these individual tasks being completed, in addition to solutions to challenges the team collaborates on, are what generate outcomes. At that point, it&apos;s usually fairly clear how someone&apos;s completed work can influence those outcomes. That throughline, starting from the tasks a contributor was delegated and ending at those outcomes, is what recruiters asking that question want to hear about.&lt;/p&gt;
&lt;p&gt;Sure, sometimes there are highly passionate, high-output contributors whose work supports the outcomes of the project to an outsized degree, but they&apos;re outliers. Even their work doesn&apos;t usually meet the project&apos;s goals in and of itself. Heck, Superman could thwart the best-laid plans of many villains, but even he was part of the Justice League.&lt;/p&gt;
&lt;p&gt;What if you&apos;re the only one on the team solving those problems? What if you&apos;ve built something for yourself to solve your own complex problems? The same rubric applies, and you&apos;re still not in a silo. You&apos;re likely still collaborating with stakeholders, one of which can definitely be you in the mirror, to identify deliverables and timelines. You may own more of the project, but you&apos;re still handling tasks and challenges in threads instead of drawing the rest of the owl in one step.&lt;/p&gt;
&lt;h2&gt;Complexity by any other name&lt;/h2&gt;
&lt;p&gt;When my friend asked about how to respond, he also served up another interesting question: What counts as &quot;complex?&quot; Other friends in the community chipped in on this one.&lt;/p&gt;
&lt;p&gt;One pointed out, &quot;Complexity doesn&apos;t necessarily have to be strictly technical.&quot; The complications of any given project could refer to resource constraints, prioritization, or regulatory and standards compliance of one kind or another. It&apos;s common to even have conflicting milestones on the same project that make it difficult to navigate towards a single outcome.&lt;/p&gt;
&lt;p&gt;Someone else added, and I&apos;m paraphrasing a little, that the important bit of talking about one&apos;s role in a complex project is &quot;your ability to recognize that there was a system, that it was complex, that you recognized it as complex instead of diving head-first only to regret it a week later, and how your actions treated it as the complex project that it was.&quot; This is a sharp edge I&apos;ve cut myself on numerous times. Learning how to identify a system or project as complex takes time and experience, but that learning can be done through experimentation and study.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Taking a look at the prompt as a whole one more time:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What&apos;s a complex project you&apos;ve worked on, relevant to this position? Who did you collaborate with? How did you contribute to the project? What were some challenges you overcame? How did your work affect the project in the end?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;it&apos;s easy to see now how redefining the mental image of a &quot;complex project,&quot; changing it from a one-person show to a collaborative effort, can help answers for the rest of the prompt fall into place. Being asked what you&apos;ve worked on is a chance for us to talk about our smaller part in a larger whole. It&apos;s not a question about how you found and climbed the mountain. It&apos;s more about how you, and maybe your team, worked to make climbing that mountain easier, even if your part in that seemed small at the time.&lt;/p&gt;
</content:encoded><updated>Fri Jan 17 2025 17:33:33 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>What environments social media can create</title><link>https://charlesvillard.co/blog/what-environments-social-media-can-create/</link><guid isPermaLink="true">https://charlesvillard.co/blog/what-environments-social-media-can-create/</guid><description>Product of our surroundings</description><pubDate>Thu, 24 Oct 2024 14:16:17 GMT</pubDate><content:encoded>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m primarily a front-end developer. That means I often deal with user experience-adjacent concerns and the environments developed for users. I have also been a Twitter user, officially since 2008 but actively since mid-2010s. It was around the same time I began exploring web development. I created my account on the advice of my mentors at the time because that&apos;s where the web development community was most active. The platform was a boon to my career, helping me keep up with industry trends, build my network, and find new opportunities. It was far from perfect, but it was an environment I grew to enjoy.&lt;/p&gt;
&lt;p&gt;As that platform stands today, I hardly recognize it as the same environment anymore. When the new owners posted that ridiculous kitchen sink video, it was clear the platform would change. Those changes started drastically enough, but to what degree they would go in the long run wasn&apos;t clear. Today, we see what decisions like changing the platform&apos;s name, laying off critical departments, deeply monetizing major existing features, and the recent changes to safety tools have wrought.&lt;/p&gt;
&lt;p&gt;In becoming a part of people&apos;s daily lives, the Internet is a part of their environment and is thus impactful to how they view themselves, others, and the world around them. Many people still don&apos;t see the Internet as anything more than a reference tool, but just as many are constantly connected, whose ages skew increasingly younger. These younger users see Internet access as an expectation of their everyday world, not a new feature like older generations. That&apos;s why the online social environments we develop must treat trust and safety as first-class concerns, moreso than performance, profitability, and features.&lt;/p&gt;
&lt;p&gt;Twitter, despite all of its warts and issues, grew some understanding of those concerns over time. The current regime running what was once Twitter doesn&apos;t understand that, nor do they seem to care. Their &lt;a href=&quot;https://metricool.com/x-twitter-changes-block-feature&quot;&gt;latest revisions&lt;/a&gt; to the platform say as much.&lt;/p&gt;
&lt;p&gt;The reach the platform provides can&apos;t be denied, and I have continued using it, but what reach I&apos;ve enjoyed there has been the product of the time I had invested in building my network and presence there. I&apos;m not one of the larger creators on the platform, receiving ad revenue for engagement. Nor am I one of the platform&apos;s subscribers, receiving access to features. My investment in the platform paid out when I was able to speak and interact with people in my industry in a way I enjoyed. Many of those creators have since moved on. So to that end, I&apos;ll likely start looking to &lt;a href=&quot;https://bsky.app/profile/charlesvillard.co&quot;&gt;bluer skies&lt;/a&gt; and other places to make my mark, if this trend continues.&lt;/p&gt;
</content:encoded><updated>Thu Oct 24 2024 15:34:53 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Learn your tools</title><link>https://charlesvillard.co/blog/learn-your-tools/</link><guid isPermaLink="true">https://charlesvillard.co/blog/learn-your-tools/</guid><description>Your tools have more depth than you think.</description><pubDate>Sat, 31 Aug 2024 04:51:30 GMT</pubDate><content:encoded>&lt;p&gt;A typical pattern most developers get caught in when learning the tools of their trade is learning the 20% of the available functionality that can get them through 80% of their work, which is perfectly understandable. I&apos;m no different. Once we can get started on work, why dive too much deeper? The downside of that mindset is that we miss out on beneficial functionality that won&apos;t come up without some digging.&lt;/p&gt;
&lt;p&gt;There&apos;s so much efficiency to unlock by digging a little deeper into the editors and libraries we use daily. Plus, it can be such a flex! During the technical interview for my first job, way before CoPilot was a thing, I made an entire class skeleton pop up in a Visual Studio C# project with a keyboard shortcut. The hiring manager did a double-take and paused the interview to make sure I wasn&apos;t copy-pasting code. You&apos;d be surprised by who doesn&apos;t know this and, with that knowledge, how many people you could teach.&lt;/p&gt;
&lt;p&gt;A solid strategy to learn these features is to hunt them down while working on projects, especially when we wonder how to improve an awkward workflow. I did this while fixing an issue with my blog and thought I&apos;d share two examples. Hopefully, you&apos;ll see some parallels with bits of awkwardness in your workflow and be encouraged to find ways to improve them.&lt;/p&gt;
&lt;h2&gt;The issue at hand&lt;/h2&gt;
&lt;p&gt;The homepage of my site features a blog list sorted by a simple &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort&quot;&gt;Javascript sort&lt;/a&gt; method before it renders the posts on the page. That code sorts the posts by newest first based on each post&apos;s &lt;code&gt;updatedDate&lt;/code&gt; and &lt;code&gt;pubDate&lt;/code&gt; properties. I use &lt;a href=&quot;https://tina.io/&quot;&gt;Tina.io&lt;/a&gt; for my CMS. When configuring the &lt;a href=&quot;https://tina.io/docs/schema/&quot;&gt;content model&lt;/a&gt; for a project, each &quot;collection&quot; of a particular class requires a field type for each property on that class. In this case, the &lt;code&gt;updatedDate&lt;/code&gt; and &lt;code&gt;pubDate&lt;/code&gt; properties of my post were of field type &lt;code&gt;datetime&lt;/code&gt;, which returns a Date string in ISO string format.&lt;/p&gt;
&lt;p&gt;I would have liked to set a new Date for these values as a default for a new post but I couldn&apos;t find a reliable way to do so, likely due to a version mismatch between what I installed and what the docs described. So, to be sure I didn&apos;t publish a new post without these dates set, I made them required fields as a reminder to manually update them. It was far from ideal, but it suited my needs.&lt;/p&gt;
&lt;p&gt;I published &lt;a href=&quot;/blog/curation&quot;&gt;&quot;Curation&quot;&lt;/a&gt; pretty late on August 27th, followed by &lt;a href=&quot;/blog/giving-grace&quot;&gt;&quot;Giving yourself grace&quot;&lt;/a&gt; the night after. The code was pushed to GitHub and picked up by Netlify, which ran the build commands for Tina and Astro. All lights came back green, all good.&lt;/p&gt;
&lt;p&gt;At least, it would have been, except that the post at the top of the blog list was still &quot;Curation.&quot; I found &quot;Giving yourself grace&quot; below the fold. Why?&lt;/p&gt;
&lt;p&gt;Well, when I had written those content models, the definition of the &lt;code&gt;updatedDate&lt;/code&gt; and &lt;code&gt;pubDate&lt;/code&gt; fields were pretty barebones, just setting the field name, a readable name, and the type of &lt;code&gt;datetime&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig } from &quot;tinacms&quot;;

export default defineConfig({
  // ...
  schema: {
    collections: [
      {
        name: &quot;post&quot;,
        label: &quot;Posts&quot;,
        // ...
        fields: [
          {
            type: &quot;datetime&quot;,
            name: &quot;pubDate&quot;,
            label: &quot;Publish Date&quot;,
            required: true,
          },
          {
            type: &quot;datetime&quot;,
            name: &quot;updatedDate&quot;,
            label: &quot;Updated Date&quot;,
            required: true,
          },
          // ...
        ],
      },
    ],
  },
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This lightweight definition defaults to an ISO date string with just the year, month, date, and a localized time value of midnight GMT. That meant both &quot;Curation&quot; and &quot;Giving yourself grace&quot; had &lt;code&gt;pubDate&lt;/code&gt; values of &lt;code&gt;2024-08-27T04:00:00.000Z&lt;/code&gt; and weren&apos;t sorted at all in the blog list, which was rendered out of order.&lt;/p&gt;
&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;The solution to this seemed pretty straightforward: ensure the &lt;code&gt;datetime&lt;/code&gt; values for the &lt;code&gt;pubDate&lt;/code&gt; and &lt;code&gt;updatedDate&lt;/code&gt; properties include the time whenever changes to a post are saved. This way, the values would always be unique enough for sorting unless manually edited. Finding the right approach was the tricky part, though. As I said before, setting a default of the immediate time and date when the user clicked on &quot;New Post&quot; would have saved me time, but that seemed like more installing and troubleshooting than I cared for at the time.&lt;/p&gt;
&lt;p&gt;Looking through my code, I couldn&apos;t spot a convenient fix. There had to be some way to address this in Tina&apos;s documentation. After a bit of digging around, I came across exactly what I needed in the form of the &lt;a href=&quot;https://tina.io/docs/extending-tina/before-submit/&quot;&gt;Before Submit Function&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Before Submit Function is a function property nested in the content model that lets you control aspects of the output when you hit &quot;Save&quot; in Tina&apos;s editor. It effectively acts as a lifecycle hook for your publishing workflow that lets you access the form, the Tina CMS instance, and the values you input to said form. The latter lets me access both properties and update their values with &lt;code&gt;new Date().toISOString()&lt;/code&gt;. I also added a &lt;code&gt;timeFormat&lt;/code&gt; property to both properties, which will let me edit them in the CMS should I need to in the future.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { defineConfig, Form, TinaCMS } from &quot;tinacms&quot;;

export default defineConfig({
  // ...
  schema: {
    collections: [
      {
        name: &quot;post&quot;,
        label: &quot;Posts&quot;,
        path: &quot;src/content/posts&quot;,
        ui: {
          filename: {
            readonly: false,
          },
          beforeSubmit: async ({
            form,
            cms,
            values,
          }: {
            form: Form
            cms: TinaCMS
            values: Record&amp;lt;string, any&amp;gt;
            }) =&amp;gt; {
            if (form.crudType === &apos;create&apos;) {
              return {
                ...values,
                pubDate: new Date().toISOString(),
              }
            }

            if (form.crudType === &apos;update&apos;) {
              return {
                ...values,
                updatedDate: new Date().toISOString(),
              }
            }
          },
        },
        fields: [
          // ...
          {
            type: &quot;datetime&quot;,
            name: &quot;pubDate&quot;,
            label: &quot;Publish Date&quot;,
            description: &quot;This will be generated at first publish&quot;,
            ui: {
              timeFormat: &quot;HH:mm&quot;, // adding `timeFormat` will make sure I can edit the time in the CMS
            }
          },
          {
            type: &quot;datetime&quot;,
            name: &quot;updatedDate&quot;,
            label: &quot;Updated Date&quot;,
            description: &quot;This will be generated if it&apos;s already published on save.&quot;,
            ui: {
              timeFormat: &quot;HH:mm&quot; // adding `timeFormat` will make sure I can edit the time in the CMS
            }
          },
          // ...
        ],
      },
    ],
  },
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That checked the boxes for both the automatic generation and ensuring I got the exact time of publication, meaning unique strings to sort by! As a bonus, I could update both based on the &lt;code&gt;crudType&lt;/code&gt; property of the &lt;code&gt;form&lt;/code&gt; value that gets passed into the &lt;code&gt;beforeSubmit&lt;/code&gt; function. Something to note is that I had to remove the &lt;code&gt;required&lt;/code&gt; property from both fields to allow the form to save successfully without validating their respective inputs.&lt;/p&gt;
&lt;h2&gt;First this, then that&lt;/h2&gt;
&lt;p&gt;While fixing the sorting issue, I crossed paths with a familiar annoyance in &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt;. Some might say &lt;a href=&quot;https://code.visualstudio.com/docs/editor/intellisense&quot;&gt;Intellisense&lt;/a&gt; is an unsung hero of modern development, but I&apos;ve always had a nitpick with it. While Intellisense can provide type-ahead suggestions, it falls a little short with things like TypeScript libraries. If I know what I&apos;m typing, it can offer suggestions and will usually list what I&apos;m looking for, but if I want to explore an object&apos;s properties, I have to play &quot;guess the letter.&quot;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;It always bugged me because all the answers are in the type inference. I could do a lookup with &quot;Go to Type Definition,&quot; but now I&apos;m pulling myself away from my code and going down another rabbit hole. So hey, since we&apos;re digging around documentation already, let&apos;s check out VS Code&apos;s docs to see if they- oh, &lt;a href=&quot;https://code.visualstudio.com/docs/editor/intellisense#_intellisense-features:~:text=You%20can%20trigger%20IntelliSense%20in,(.)%20in%20JavaScript&quot;&gt;they did&lt;/a&gt;! It turns out that hitting the keyboard shortcut &lt;code&gt;Ctrl+Space&lt;/code&gt; will trigger Intellisense and show all the properties and methods available within the class your cursor is in. That can be a huge efficiency boost when your primary job is to find the methods and properties to make the magic squiggles on the screen keep squiggling.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;So, what did we learn?&lt;/h2&gt;
&lt;p&gt;Huzzah! Our sorting problem is solved, but the real treasure was the new tricks we learned along the way, right?&lt;/p&gt;
&lt;p&gt;Yeah, kind of, but not quite. What I hope you take away from this aren&apos;t niche solutions but that you, as a developer, should learn your tools. Sometimes, it takes a bit of searching to find what you&apos;re looking for. Look at how far into the documentation I&apos;d need to traverse to find information on the Before Submit Function if they didn&apos;t have a search bar! That would have taken time! And effort!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The thing is that time and effort are well worth spending now to be more productive later. The Copilots and chatbots of the world can help, but in that half-automated pair programming session, you&apos;re still the one driving. You need to know your ship.&lt;/p&gt;
</content:encoded><updated>Sun Sep 01 2024 02:45:25 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Giving yourself grace</title><link>https://charlesvillard.co/blog/giving-grace/</link><guid isPermaLink="true">https://charlesvillard.co/blog/giving-grace/</guid><description>Sometimes, rest is sweeter.</description><pubDate>Wed, 28 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I have a confession to make: despite having kept up with my commitment publishing to my blog every day for what&apos;s now three days in a row, I am only human. While I was drafting my post about &lt;a href=&quot;https://charlesvillard.co/blog/curation/&quot;&gt;human curation&lt;/a&gt;, I was truly and utterly exhausted from the culmination of a busy work day and a severe case of &lt;a href=&quot;https://www.verywellmind.com/what-is-revenge-bedtime-procrastination-5189591&quot;&gt;revenge bedtime procrastination&lt;/a&gt;. I was trying to drum up my thoughts while also calling into a late-night push-to-production meeting with about 100 of my closest co-workers, just in case something needed a last-minute bug fix.&lt;/p&gt;
&lt;p&gt;Between the fact-checking and fits of micro-sleeping, I had already lost my progress, twice, to sleepily drifting fingers accidentally closing or refreshing the browser window I was editing the post in. That sure well teaches me to not write drafts in an online editor. For the curious and opinionated, &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; is my go-to tool as I&apos;m writing this.&lt;/p&gt;
&lt;p&gt;After losing my introduction a second time, I had to laugh at myself and find some folks to laugh with me. Sharing my experience on my Discord server of choice netted me what was an appropriate response.&lt;/p&gt;
&lt;p&gt;Fair enough, but I was really excited to expand on the intersection between curated subject matter websites, the need for human connection, and a lack of community and conversation for web developers ever since Twitter changed. This was going to be a truly insightful post! I had to get it down and published for the masses to read so I could change the minds of powerful people at a fundamental level!&lt;/p&gt;
&lt;p&gt;Then I looked at the clock. It was 1:00 am. I had to get up the next morning to get the kids&apos; school lunches ready and hop on a networking call. As they say, time is undefeated.&lt;/p&gt;
&lt;p&gt;So, I&apos;ll be giving myself some grace, especially when I want to write but rest is required. That post about community and conversation is still forthcoming, but it will have to wait for a more rested version of myself to write it. At the very least, a tomorrow version. Right now, I&apos;m going to bed.&lt;/p&gt;
</content:encoded><updated>Thu Aug 29 2024 03:55:18 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Curation</title><link>https://charlesvillard.co/blog/curation/</link><guid isPermaLink="true">https://charlesvillard.co/blog/curation/</guid><description>Algorithms can produce things. Conversation and community, not so much.</description><pubDate>Tue, 27 Aug 2024 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Some of my favorite Internet finds are websites dedicated to telling their readers about a single subject. Curated and maintained by a single person or a community of folks in their spare time, they are rarely fancy. There aren&apos;t any complicated algorithmic suggestions, and there is no pressure to pay with your money or data. They might have a blog, update feed, or tools of some kind. All told, these websites are intentionally designed to stand as independent, growing, evergreen repositories of information about a single subject.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I loved websites like these, back when I was learning how to code, like Shay Howe&apos;s &lt;a href=&quot;https://learn.shayhowe.com/&quot;&gt;Learn to Code HTML &amp;amp; CSS&lt;/a&gt;, and Jon Chan&apos;s &lt;a href=&quot;https://bento.io&quot;&gt;Bento&lt;/a&gt;. Industry-specific websites that I&apos;ve kept coming across over the years include Dee Bradley Baker&apos;s &lt;a href=&quot;https://iwanttobeavoiceactor.com/&quot;&gt;&quot;I Want To Be A Voice Actor!&quot;&lt;/a&gt; and Jason Thor Hall&apos;s &lt;a href=&quot;https://www.develop.games/&quot;&gt;develop.games&lt;/a&gt;. I even developed one called &lt;a href=&quot;https://cdvillard.github.io/miami-data/&quot;&gt;Miami Data&lt;/a&gt; when I was learning about civic tech.&lt;br /&gt;
&lt;br /&gt;
Of course, there are more websites out there on all kinds of subjects. These were just the first I thought of when I saw Chad Stewart&apos;s recently launched &lt;a href=&quot;https://job-search-resources.techishiring.com/&quot;&gt;Job Search Resources&lt;/a&gt; site on TechIsHiring. Visitors to the site can check out resources across a few categories and submit their own. Chad&apos;s goal is to grow it over time and, hopefully, the community will help it grow into a central repository geared towards helping those on the job hunt.&lt;/p&gt;
&lt;p&gt;I think the coolest thing about Chad&apos;s Job Search Resources site is that it&apos;s not trying to be anything more than a resource to those who will benefit from it, contribute to it, and have conversations around it. It is an addition to another website, but it could stand on its own as a resource just as well. With algorithms driving what parts of the Internet I discover, and AI now generating what content it thinks will get the best spot in that algorithm, these kinds of websites are more dear to me than ever before.&lt;/p&gt;
&lt;p&gt;It&apos;s a sentiment I hold for more than just websites, and one I&apos;m not alone in holding. &lt;a href=&quot;https://adactio.com/journal/21241&quot;&gt;Jeremy&lt;/a&gt; has &lt;a href=&quot;https://adactio.com/journal/21278&quot;&gt;talked&lt;/a&gt; about this before. &lt;a href=&quot;https://cassidoo.co/post/human-curation/&quot;&gt;Cassidy&lt;/a&gt; has &lt;a href=&quot;https://cassidoo.co/post/seattle-internet/&quot;&gt;discussed&lt;/a&gt; it as well. The Internet can, will, and probably should evolve, but it was supposed to be a resource for humans to connect through. The directions companies have taken the Internet through their practices and legislation have leveled up its capabilities but seemingly at the cost of curiosity and genuine organic interest. The Internet we know today doesn&apos;t offer the same sense of wonderment when surfing through new and unfamiliar parts as it once had.&lt;/p&gt;
&lt;p&gt;It still can, though. We may just need to build it ourselves.&lt;/p&gt;
</content:encoded><updated>Tue Aug 27 2024 04:00:00 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>By the 46th episode</title><link>https://charlesvillard.co/blog/by-the-46th-episode/</link><guid isPermaLink="true">https://charlesvillard.co/blog/by-the-46th-episode/</guid><description>Trying to build something more than a career outside of my job</description><pubDate>Mon, 26 Aug 2024 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I didn&apos;t get to see it in theaters, but the family and I finally got to stream the newest &lt;a href=&quot;https://en.wikipedia.org/wiki/Ghostbusters_(franchise)&quot;&gt;Ghostbusters&lt;/a&gt; movies last weekend. I&apos;ve been a fan of the franchise since catching reruns of The Real Ghostbusters when I was a kid. I still enjoy the early movies, The Extreme Ghostbusters reboot series, and I even liked the 2016 take on the movie, whatever the critics said.&lt;/p&gt;
&lt;p&gt;There was a bit in &lt;em&gt;Ghostbusters: Afterlife&lt;/em&gt; that really stuck with me. A supporting character going by the name of Podcast mentions he hosts a conspiracy-theory sci-fi podcast (get it?) that doesn&apos;t get a bunch of listeners, but &quot;really finds its voice in Episode 46.&quot; It&apos;s paid off later much to Podcast&apos;s delight, which is how I&apos;d like to imagine I&apos;d react if someone knew me from my work. &lt;br /&gt;
&lt;br /&gt;
Funny enough, people have told me they&apos;ve seen my work, namely my blog posts. It&apos;s happened a couple of times, much to my surprise. However, instead of delight, the feeling I got was pure apprehension. What did they think of it? Was it too short? Did it actually convey anything useful? Did I sound like someone else? Did my Anthony Bourdain fanboy rear its ugly head again? No, what did they &lt;em&gt;really&lt;/em&gt; think of it? What about in this particular paradigm, angle, and context, how about now? Okay, for real though, why didn&apos;t they saying it was actually bad?&lt;/p&gt;
&lt;p&gt;It&apos;s this nerve and anxiety that&apos;s held me back from drafting a lot of my ideas, let alone posting or publishing them. Fun fact, I&apos;ve even chickened out of a small book deal because of this kind of self-talk. I could be swimming in likely tens of dollars from my split as the author of the definitive manual about Vue 3 and the composition API! Tens of dollars!&lt;/p&gt;
&lt;p&gt;In all seriousness, this kind of doubt is also what keeps me from pursuing other endeavors. I&apos;ve plied my trade as a web developer and software engineer for more than eight years now, but mainly full-time for companies. That contrasts wildly from the people in this industry I really admire, those that follow the Indie Hacker ethos, that build for themselves and make a living through their passions, that stream all day while building a business and brand that lets them live on their terms. Sure, I&apos;ve got guaranteed health insurance and RSUs, but if my employer goes under or lays me off, being able to build like these people could save my family&apos;s bacon and bank accounts.&lt;/p&gt;
&lt;p&gt;So, eight years in, I&apos;m deciding now is as good a time as any to start figuring it out. I&apos;m still working a 9-to-5, but I&apos;m at least  going to start working towards a business, a brand, something I can call my own. Hence why I applied to get into &lt;a href=&quot;https://www.discolink.com/club&quot;&gt;DiscoLink Club&lt;/a&gt;. Their Discord server is full of hackers, entrepreneurs, creators, and builders either trying to improve the outcome of their businesses, or trying to get started building their own.&lt;/p&gt;
&lt;p&gt;I&apos;ve only been a part of it for a few days, and I can tell &lt;a href=&quot;https://twitter.com/saronyitbarek&quot;&gt;Saron Yitbarek&lt;/a&gt; has built something really special here. I&apos;ve had the pleasure of learning about &lt;a href=&quot;https://twitter.com/DiscoLinkClub/status/1827707022776934539&quot;&gt;content creation from Scott Hanselman&lt;/a&gt;, got some great advice and coaching from &lt;a href=&quot;https://coxcoaching.co/&quot;&gt;Ryan Cox&lt;/a&gt;, and I&apos;m getting a lot of encouragement from people who have been in the same place I am now. In fact, another member of the DiscoLink Club, &lt;a href=&quot;https://jonathanyeong.com/&quot;&gt;Jono Yeong&lt;/a&gt;, suggested I try a 30-day posting challenge to get over this nervousness about how &quot;worthy&quot; my writing is. That&apos;s why you&apos;re seeing this post today.&lt;/p&gt;
&lt;p&gt;What I&apos;ll be writing about over the next 30 days, 30 posts, or however long is going to be a bit up in the air. It will likely involve some JavaScript, some thoughts on the tech industry, maybe even a bit about cooking, who knows? I&apos;m just hoping that by the end, I can be a little bit more like Podcast, build some neat things that I can turn into something neater, and find my voice some time in between.&lt;/p&gt;
</content:encoded><updated>Mon Aug 26 2024 04:00:00 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>There&apos;s no %20 in file-system naming!</title><link>https://charlesvillard.co/blog/theres-no-20-in-file-system-naming/</link><guid isPermaLink="true">https://charlesvillard.co/blog/theres-no-20-in-file-system-naming/</guid><description>Ever wondered why programmers don&apos;t want space in their directory names?</description><pubDate>Sat, 24 Aug 2024 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over the last few years of my career, I&apos;ve focused on front-end web development. I work a lot within file systems, but the code I typically write doesn&apos;t manipulate files. So when I hit a weird bug while refreshing my Node basics, I was reminded of a question from when I was learning to code: why do programmers seem to avoid adding spaces to their directory names?&lt;/p&gt;
&lt;p&gt;During the &quot;FS module&quot; chapter of &lt;a href=&quot;https://frontendmasters.com/courses/node-js-v3/&quot;&gt;Scott Moss&apos; Introduction to Node v3&lt;/a&gt; on Frontend Masters, Moss introduces his students to using the &lt;a href=&quot;https://nodejs.org/api/fs.html#fspromisesreadfilepath-options&quot;&gt;fsPromises.readFile&lt;/a&gt; method to asynchronously read the project&apos;s &lt;code&gt;package.json&lt;/code&gt; file. The code is pretty straightforward:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/** bring in the promise version of fs */
import fs from &apos;node:fs/promises&apos;;

/** define readPackageJson */
const readPJson = async () =&amp;gt; {
  /** 
   * get the path to the package.json, but create a URL 
   * because Node no longer has __dirName 
   * */
  const pJsonPath = new URL(&apos;package.json&apos;, import.meta.url).pathname;
  /** log the output of package.json */
  console.log(JSON.parse(await fs.readFile(pJsonPath, &apos;utf-8&apos;)));
}
/** run the code */
readPJson();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Scott runs the code on his machine. The output is a JSON object in his terminal. I ran it on my machine, and my output was this error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# truncated the pathnames for privacy and readability
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[Error: ENOENT: no such file or directory, open &apos;/Users/.../Frontend%20Masters/intro-nodejs-v3/package.json&apos;] {
  errno: -2,
  code: &apos;ENOENT&apos;,
  syscall: &apos;open&apos;,
  path: &apos;/Users/.../Frontend%20Masters/intro-nodejs-v3/package.json&apos;
}

Node.js v20.11.0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is odd, thought I. I&apos;ve run all the other fs commands introduced so far, so why is this one failing? I did just upgrade my laptop&apos;s operating system. Sometimes, OS upgrades mean permissions changes. It wouldn&apos;t be the first time. Could it have something to do with that? Let me run a test script in the same file to see if it&apos;s some read permission issue.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/** same promise-version of fs */
import fs from &apos;node:fs/promises&apos;;

/** 
 * this time, log all the files in the same directory
 * from which this command is run
 */
console.log(await fs.readdir(&apos;./&apos;, (err, files) =&amp;gt; {
  console.log(files || err);
}));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The resulting output was an array of the filenames I expected to be in the directory I ran the code from. So it was unlikely a permissions problem. Now, I admit, I shortcut solving this bug using CoPilot, but keen-eyed readers might have caught the bug in my code already, especially if they noticed the detail in the title. Let&apos;s look at the path in the error one more time.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  ...
  path: &apos;/Users/.../Frontend%20Masters/intro-nodejs-v3/package.json&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That &lt;code&gt;%20&lt;/code&gt; in the pathname represents a UTF-8 encoded space character. If we look at another command-line tool that can read pathnames, &lt;code&gt;pwd&lt;/code&gt;which returns the path of the directory the user is currently in, the output looks a little different.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# truncated the pathname for privacy and readability
$ pwd
  /Users/.../Frontend Masters/intro-nodejs-v3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That space makes all the difference. Renaming the &lt;code&gt;Frontend Masters&lt;/code&gt; folder to something like &lt;code&gt;frontend-masters&lt;/code&gt; fixed the issue.&lt;br /&gt;
&lt;br /&gt;
The workaround for issues like this is decoding the pathname string. I could see this being common practice, used as a precaution to avoid the headache of dealing with pathnames, but I don&apos;t write enough backend code dealing with file systems to know for sure.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import fs from &apos;node:fs/promises&apos;;

const readPJson = async () =&amp;gt; {
  const pJsonPath = new URL(&apos;package.json&apos;, import.meta.url).pathname;
  /** Yay, no need to worry about spaces with this line! */
  const decodedPath = decodeURIComponent(pJsonPath);
  console.log(JSON.parse(await fs.readFile(decodedPath, &apos;utf-8&apos;)));
}

readPJson();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;
So, yeah, big revelation: encoding and decoding special characters can make reading files finicky. It&apos;s no surprise developers deal with this kind of thing at work every day. Imagine working around these problems at the scale of large applications like word processors or digital asset management software. No wonder developers do whatever they can to avoid inconveniences like character decoding.&lt;/p&gt;
</content:encoded><updated>Sat Aug 24 2024 04:00:00 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Copy other people&apos;s copywork</title><link>https://charlesvillard.co/blog/2024-04-21-copy-work/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2024-04-21-copy-work/</guid><description>Copying work will get you to unique work.</description><pubDate>Mon, 22 Apr 2024 03:32:35 GMT</pubDate><content:encoded>&lt;p&gt;After I updated my post about &lt;a href=&quot;https://charlesvillard.co/blog/2024-04-07-a-new-developer-biome-get-it/&quot;&gt;replacing ESLint with Biome&lt;/a&gt;, I asked in a Discord server how to set up my &lt;a href=&quot;https://charlesvillard.co/rss.xml&quot;&gt;RSS feed &lt;/a&gt;to share that a post was updated. &lt;a href=&quot;https://www.cassidoo.co&quot;&gt;Cassidy&lt;/a&gt; pointed me in the right direction and shared with me her entire approach. She sent me links to everything including query schemas, conditional logic, her XML setup, everything to help me get an “updated” property on my RSS feed. I let her know I was grateful. &quot;This is really cool, thank you! I&apos;m stealing this during lunch.&quot;&lt;/p&gt;
&lt;p&gt;To write that phrase, to say I&apos;m going to steal someone else&apos;s idea, openly, might have scared me early in my career. I think it scares most people today, especially beginners.&lt;/p&gt;
&lt;p&gt;A lot of conversation has come up about retaking the web and building things for fun as of late. &lt;a href=&quot;https://twitter.com/whitep4nth3r/status/1772589938518712676&quot;&gt;Salma Alma-Naylor&lt;/a&gt; has talked about it. Jason Lengstorf basically &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eRDgZbo9vOKdSMeDfbDMlJu&quot;&gt;lives it&lt;/a&gt; &lt;a href=&quot;https://www.youtube.com/playlist?list=PLz8Iz-Fnk_eRtJeLjx9CxPQw6MzbDgaEu&quot;&gt;every day&lt;/a&gt;. This discourse became personally ironic to me when I started looking up old Frontend Design Conference content, of which I&apos;ll be attending the 2024 edition this week, and saw that Adam Kuhn spoke at the last one about &lt;a href=&quot;https://frontenddesignconference.com/2019/schedule/#:~:text=The%20Inherent%20Value%20of%20Building%20Useless%20Shit&quot;&gt;the same thing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They&apos;re right. Web developers should build all kinds of useless fun things and make the Internet our own. Not just SaaS clones of eCommerce stores, but fun, impractical websites and applications. These projects are how web developers learn the basics and more advanced parts of our digital practice.&lt;/p&gt;
&lt;p&gt;However, I think there&apos;s something we also need to add to that discussion, or at least say it out loud once again, because the algorithms that currently govern the Internet might not. We do ourselves, and especially those entering the space, a service by giving us and them permission to build whatever they want. That comes with a disservice, however, if we don&apos;t address it. We as a community can give all the permission in the world to build, but we also need to give permission to steal.&lt;/p&gt;
&lt;h2&gt;Overwhelm&lt;/h2&gt;
&lt;p&gt;One of the first things I wanted to build when I started learning web development was a website for myself. My first thought was, I better look up some inspiration and see what others have done. What do they post on their portfolios?&lt;/p&gt;
&lt;p&gt;One Google search later and my early-career web developer brain was dumbfounded. The top results were basically listicles featuring &lt;a href=&quot;https://bruno-simon.com/&quot;&gt;amazing&lt;/a&gt;, &lt;a href=&quot;http://www.rleonardi.com/&quot;&gt;unique&lt;/a&gt;, &lt;a href=&quot;https://2019.wattenberger.com/&quot;&gt;well-crafted&lt;/a&gt; &lt;a href=&quot;https://www.adhamdannaway.com/&quot;&gt;portfolios&lt;/a&gt;. Crawling through Twitter bios uncovered even more, chockfull of &lt;a href=&quot;https://www.sarasoueidan.com/&quot;&gt;insightful&lt;/a&gt; &lt;a href=&quot;https://danmall.com/&quot;&gt;blog posts&lt;/a&gt; about &lt;a href=&quot;https://daverupert.com/&quot;&gt;their experiences&lt;/a&gt; and &lt;a href=&quot;https://chriscoyier.net/&quot;&gt;their work&lt;/a&gt;. &lt;a href=&quot;https://sarahdrasnerdesign.com/&quot;&gt;So&lt;/a&gt; &lt;a href=&quot;https://ethanmarcotte.com/&quot;&gt;much&lt;/a&gt; &lt;a href=&quot;https://bradfrost.com/&quot;&gt;inspiration&lt;/a&gt;! Whatever could I do with it all?!&lt;/p&gt;
&lt;p&gt;I  saved them all to a folder in the bookmarks and called it a day.&lt;/p&gt;
&lt;p&gt;It was too much. All of these websites expressed things about these developers and engineers that I just didn&apos;t believe I had: personality, insight, experience, confidence, skill. There was no way I could build something comparable.&lt;/p&gt;
&lt;p&gt;Eventually, I worked out a website based on a &lt;a href=&quot;https://github.com/poole/hyde&quot;&gt;Jekyll theme&lt;/a&gt; and made it my own. It featured a picture of myself, had some blog posts, and a page for my resume. that was about it. I tried to believe it was okay, and people were encouraging, but I knew what was out there and I had no idea how to get that good.&lt;/p&gt;
&lt;h2&gt;Copycat&lt;/h2&gt;
&lt;p&gt;It was by happenstance that I came across Dan Mall&apos;s blog post about &lt;a href=&quot;https://danmall.com/posts/stealing-your-way-to-original-designs/&quot;&gt;stealing your way to designs.&lt;/a&gt; In this piece, Dan&apos;s first step in the process is copywork, taking something already set in stone and making it again. This post was encouraging because, at the time, I had an inkling of a talk idea that I never gave and this made me feel like I was on the right track. The point of the talk was to give yourself permission to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lie to yourself that you can build great things and work towards proving myself right&lt;/li&gt;
&lt;li&gt;Cheat with tools and abstractions until you feel ready to learn what they provide and how they worked&lt;/li&gt;
&lt;li&gt;Steal inspiration from those around you and see how you might build somthing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The talk sounded good in my head. It was freeing to think I could give myself that permission, to crawl through and imitate other people&apos;s code and not worry about whether what I&apos;m using it for was original or unique or innovative. Alas, in the same way that I never gave that talk, I never followed my own advice. I never worked that muscle and developed projects on the side. I never wrote about the niche technical details, or at least now I&apos;m trying to and it&apos;s really, really hard.&lt;/p&gt;
&lt;h2&gt;We already have it&lt;/h2&gt;
&lt;p&gt;The funny thing about web development is that we already have the permission to &quot;steal,&quot; in a way. Our entire industry is built on the shoulders of open-source software development, the contributions of many developers before us who cribbed from each other and learned collectively. That history comes with its twists and turns, but the sum of it is that our community is built on borrowed code and ideas.&lt;/p&gt;
&lt;p&gt;We&apos;re seeing history repeat itself as new frontend frameworks help websites go from servers, to statically generated, to single-page applications, to server-side rendered again. All the while, they&apos;re borrowing ideas, patterns, and constructs from one another. Heck, Fred Schott &lt;a href=&quot;https://youtu.be/bPTZmUR7z90?si=Dc4_OAL2nf_73qWs&quot;&gt;admitted&lt;/a&gt; to asking Ryan Carniato for ideas. This is the norm! So why shouldn&apos;t it be the norm to try and build your own version of a silly piano or taco builder?&lt;/p&gt;
&lt;p&gt;As we try and retake the Internet and build cool things again, I simply want to help others get ahead of this analysis paralysis now. If you know someone who is staring at that blank canvas, who wants to build a new Geocities, or a Bridgerton Binge Tracker in preparation for season three, and they don&apos;t have a direction to start with, send them this with a message: it&apos;s okay to steal inspiration.&lt;/p&gt;
&lt;p&gt;I mean, don&apos;t be a jerk and copy someone else&apos;s work wholesale. It&apos;d be pretty easy to spot if you did.&lt;/p&gt;
&lt;p&gt;But steal ideas. Steal patterns. Steal snippets. Learn what the code does and why it works. This kind of copywork will only help you grow.&lt;/p&gt;
&lt;p&gt;Oh, and Cassidy&apos;s response when I said I was stealing it? “You are very welcome!!”&lt;/p&gt;
</content:encoded><updated>Mon Apr 22 2024 14:08:21 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Trying out a new developer Biome (get it?!)</title><link>https://charlesvillard.co/blog/2024-04-07-a-new-developer-biome-get-it/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2024-04-07-a-new-developer-biome-get-it/</guid><description>Developer experience is just as much about shedding bytes and time off the user experience as website performance is. Biome helps with that in a major way.</description><pubDate>Sun, 07 Apr 2024 21:20:14 GMT</pubDate><content:encoded>&lt;p&gt;These days at work, I&apos;m responsible for maintaining a new global common header. It&apos;s built with web components using &lt;a href=&quot;https://www.fast.design/&quot;&gt;Microsoft FAST&lt;/a&gt; elements and TypeScript, with ESLint for linting and formatting. The setup is pretty bog-standard, and really common these days. Visual Studio Code offers Intellisense for TypeScript and JavaScript out of the box, but adding ESLint for TypeScript requires adding a few other packages to your project. Which may not be the end of the world, but it does mean more dependencies to download and manage, which inherently chips away at the developer experience.&lt;/p&gt;
&lt;p&gt;An alternative to ESLint I&apos;ve started trying out is &lt;a href=&quot;https://www.biomejs.dev&quot;&gt;Biome.js&lt;/a&gt;. The history behind this package is fascinating. Long story short, Biome is a fork of Rome Tools, a project promising an all-in-one JavaScript ecosystem that was unfortunately plagued with issues and eventually abandoned. Biome is still aims to provide that complete ecosystem with linting and formatting for many flavors of JavaScript built-in including TypeScript. This means no ESLint-specific dependencies and plugins just to have TypeScript in the environment.&lt;/p&gt;
&lt;p&gt;For my particular project, implementing Biome meant replacing all of this…:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
@typescript-eslint/eslint-plugin:    2.680MB
@typescript-eslint/parser       :    0.018MB
eslint-plugin-headers           :    0.052MB
eslint-config-airbnb-base       :    0.094MB
eslint                          :    3.030MB
____________________________________________

Total size of files             :    5.874MB

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…with just this…:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
@biomejs/biome                  :    0.130MB

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…and effectively getting the same thing.&lt;/p&gt;
&lt;p&gt;All of the packages I get to remove are just developer dependencies and won&apos;t directly affect the end user&apos;s experience, but the difference and benefits are still pretty significant. Considering the primary consumer of this packages are product teams looking to maintain consistent branding, this change means less code for them to download and install. It also means less surface areas for potential issues and threats, which translates to Dependabot having less to scan and fret over.&lt;/p&gt;
&lt;p&gt;I highly encourage developers working with ESLint to take a look. Your milage may vary, of course, and I&apos;m still testing it before merging it into the project, but it&apos;s that much less to worry about installing every time.&lt;/p&gt;
</content:encoded><updated>Sat Apr 20 2024 21:26:04 GMT+0000 (Coordinated Universal Time)</updated></item><item><title>Testing for &apos;U&apos;s and not &apos;u&apos;s</title><link>https://charlesvillard.co/blog/2024-03-19-testing-for-us-and-not-us/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2024-03-19-testing-for-us-and-not-us/</guid><description>In a world where code coverage rules with an iron fist, someone needs to standup for developer productivity.</description><pubDate>Tue, 19 Mar 2024 03:44:08 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s fifteen minutes ‘til the hour, what most people call “midnight”. Tonight, I&apos;m calling that &quot;end of day.&quot;&lt;/p&gt;
&lt;p&gt;That was when I said I&apos;d have the new feature merged into the main branch of the repo. I was so confident that I&apos;d have this working, ready to get into staging, by “end of day.” I had no doubt in my mind.&lt;/p&gt;
&lt;p&gt;Lo, and there was a sullen cry, as if a million Github Actions and test runners rang out and said, &quot;No.&quot;&lt;/p&gt;
&lt;p&gt;I don&apos;t know what I was thinking. I should have remembered. I&apos;d done this dance before. We, us engineers, we rallied against this hydra before. We asked for the time and resources to slay this multi-headed beast sucking up our flow state, this parallelized threat to our work-life balance. We finally got what we needed! And yet, at what cost?&lt;/p&gt;
&lt;p&gt;This Minotaur we wrestle with on an hourly basis? Our monolithic - no, not monorepo, our monolithic front-end&apos;s testing suite. What was once a well-meant suite of tests and checks meant to gatekeep the release of bugs and broken features from production. Now, a massive amalgamation of integration and end-to-end tests, the culmination of years of copied and pasted testing patterns, rushed descriptions, and accepted Copilot suggestions. The spitting image of the &lt;a href=&quot;https://martinfowler.com/articles/practical-test-pyramid.html&quot;&gt;Testing Pyramid&lt;/a&gt; upturned.&lt;/p&gt;
&lt;p&gt;On every pull request, the paralellized processing power of 30 machines must grind away at these tests to sate what could likely be done - nay, should be done! - by unit tests. Should even one fail, be it a test related or not to the pull request, it&apos;s a slow and arduous wait until the others finish before the the failed machine can be started again. And if it is related, may luck go with you that the task of correcting it and pushing a change not send you into a seemingly Sisyphean spiral as it has for me on this dark night.&lt;/p&gt;
&lt;p&gt;What pray tell is causing my tests to fail? Could it be another timeout as the test runner searches for an element that may or not be there? Could it be a change to a conditional that only now has finished trickling down with out proper vetting? Or is it another string expected to start with a capital “U” again in a phrase like &apos;Delete Users&apos; . . . where all others are expected to be sentence-cased?&lt;/p&gt;
&lt;p&gt;But alas! The bells of the test runner chime again for me! Another failure. I must tend to it, lest I be here another hour. Quickly. Flee. Flee from whence you came. Away from those tempting warmth of “80% test coverage!” I shall shield your escape while I return to my work . . .&lt;/p&gt;
</content:encoded><updated/></item><item><title>Post-to-post: 2023 from the rearview mirror</title><link>https://charlesvillard.co/blog/2024-01-08-2023-from-the-rearview-mirror/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2024-01-08-2023-from-the-rearview-mirror/</guid><description>2023 is officially so last year. Mine was fairly eventful. I forgot to write about it until now.</description><pubDate>Tue, 30 Jan 2024 23:43:56 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s been over a year since my &lt;a href=&quot;https://charlesvillard.co/blog/2023-02-05-keeping-a-record/&quot;&gt;last post&lt;/a&gt;, ironically enough. That post discussed the importance of writing regularly and declared that I would be doing so.&lt;/p&gt;
&lt;p&gt;That didn&apos;t happen. I&apos;ve drafted an idea or two, but I didn&apos;t get a single new post out. Whoops.&lt;/p&gt;
&lt;p&gt;This wasn&apos;t because I had nothing to say. Much like many others, the habit of writing blog posts and building side projects is not one that ever came naturally to me. Day-to-day life is usually my reason d&apos;jour, and mine is replete with work, children, family, chores, events, concerns, a limited amount of energy, and all kinds of other excuses.&lt;/p&gt;
&lt;p&gt;So, in an effort to kickstart a change in that habit, I wanted to highlight a few things that I accomplished over the course of the last year as a senior member of a hybrid UI platform/infrastructure team. While I can&apos;t show off much code, I think this will give a peak into what front-end development can look like beyond the components and styling for which it&apos;s popularly known.&lt;/p&gt;
&lt;h2&gt;New dashboard, whose service?&lt;/h2&gt;
&lt;p&gt;The first project I tackled last year was leading the development of a redesigned dashboard for HPE GreenLake. This project is kind of special to me. With all its ups and downs, it was my first real test as a developer with the word “Senior” somewhere in their title.&lt;/p&gt;
&lt;p&gt;The outline for this project seemed pretty straightforward: rebuild the dashboard to focus on the services each of our main applications offer instead of the applications themselves. Between myself and another engineer, we managed a proof-of-concept in record time. However, like many projects, what seemed like a &quot;simple reconfiguration&quot; of the UI turned into a far deeper rabbit hole. In one conversation, teammates involved in building the dashboard&apos;s previous version estimated our work would replace approximately 80% of the pre-existing monolithic front-end.&lt;/p&gt;
&lt;p&gt;There were plenty of obstacles and red tape to get through, and challenges I won&apos;t get into details about here. Despite all of them, we completed our work in time for it to preview at HPE&apos;s annual Discover event, and that very work is now available to all of HPE&apos;s users. This work really taught me what it means to be a senior engineer by putting my feet to the fire. I came away from it with a better understanding of what senior- and staff-level individual contributors may need to navigate, what&apos;s worth documenting, what hills are worth fighting for, and much more.&lt;/p&gt;
&lt;h2&gt;&quot;DivOps?&quot; &quot;WebOps?&quot; Front-end build tooling&lt;/h2&gt;
&lt;p&gt;Not long after I completed and handed off the dashboard build, I got the opportunity to work in a vageuly defined subsection of front-end development. Though I do like how Ben Ilegbodu defined it: &lt;a href=&quot;https://www.benmvp.com/blog/what-divops-engineer/&quot;&gt;DivOps&lt;/a&gt;. A number of applications were being prepared for a new offering, and it necessiated an update to our micro-frontend architecture to ensure we could host applications not only in the cloud, but also on-premises. This meant divesting ourselves of libraries like single-spa-react and adjust to hosting applications as individual SPAs.&lt;/p&gt;
&lt;p&gt;Unfortunately, its work that won&apos;t make it into production. Such is the nature and whim of business. On the other hand, it got me getting comfortable with JavaScript build tools and their capabilities. It also got me working with a lot of teams and writing a lot of documentation, ultimately a lot of good practice. It also set the groundwork for a lot of really cool frontend architecture work our team will be taking on in the coming months.&lt;/p&gt;
&lt;h2&gt;Headers are hard. Who knew?&lt;/h2&gt;
&lt;p&gt;After working on front-end build tools for a while, and after the decision to shelf my previous work, my responsibilties moved back towards UI, maintaining a new and improved global header. It&apos;s my primary focus these days, and a really interesting challenge. When we designed the v1 of this new header, we decided on building out a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_components&quot;&gt;web component-based header&lt;/a&gt; to allow applications built on any framework to consume it with a simple set of contracts to meet. This next year is going to involve a number of new integrations and features that I&apos;m excited and anxious to build out.&lt;/p&gt;
&lt;h2&gt;What about now?&lt;/h2&gt;
&lt;p&gt;Now that we&apos;re a month into the new year, I&apos;m hoping to increase my output outside of work hours as well. I&apos;ve &lt;a href=&quot;https://www.twitch.tv/cdvillard&quot;&gt;already streamed a bit&lt;/a&gt; and I&apos;m hoping to write a bit more as well. We&apos;ll see what comes of this next year. All in, I&apos;m seeing this as a blank slate opportunity to define my career moving forward. Hope you stick around to check it out.&lt;/p&gt;
</content:encoded><updated/></item><item><title>Keeping a record</title><link>https://charlesvillard.co/blog/2023-02-05-keeping-a-record/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2023-02-05-keeping-a-record/</guid><description>On the practice of recording your career</description><pubDate>Thu, 19 Jan 2023 17:00:28 GMT</pubDate><content:encoded>&lt;p&gt;When I started learning web dev, I had built a portfolio and blog. The work featured mainly websites for loved ones or agency work and a few odd posts. It made it way easier to get eyes on my resume.&lt;/p&gt;
&lt;p&gt;However, after VueConf.US in 2019, I lost the practice of maintaining it. I had decided to rebuild my portfolio using Gridsome. Somewhere between &lt;em&gt;npm install gridsome&lt;/em&gt; and life, I hit a road block. My portfolio sat in an &quot;under construction&quot; state for ages.&lt;/p&gt;
&lt;p&gt;My career progressed forward without it, nonetheless. It wasn&apos;t that I didn&apos;t need one, just that I had established some experience and that was enough to get me hired. Now I&apos;m a senior engineer, and it could be said I got here despite not having a well-maintained portfolio or website.&lt;/p&gt;
&lt;p&gt;Except I don&apos;t have anything concrete to look back on except for a one-page resume.&lt;/p&gt;
&lt;p&gt;The practice of writing isn&apos;t for everyone, but I would advocate that maintaining some record of your career is a healthy practice to pick up. That could take the form of maintaining a series of side projects, blogging, or even just journaling in private. It helps build a detailed history and breadcrumb trail of your career you can look back at to help remind you of what you learned and when, of the reasons behind choices made, of what you want to avoid moving forward. It&apos;s part of the reason why I&apos;m working on this site, to revive that practice for myself, taking the &lt;a href=&quot;https://chriscoyier.net/2023/01/05/i-feel-contractually-obliged-to-link-to-a-post-like-bring-back-personal-blogging/&quot;&gt;advice&lt;/a&gt; of prolific blogger Chris Coyier.&lt;/p&gt;
&lt;p&gt;It&apos;s harder for me now, being a senior engineer and a family man, to find the time to write detailed, technical long-form pieces or long-living libraries. But I still think the practice is worth it, and I know that it will only become easier with repetition. I will never not advocate that developers at all points in their career consider keeping a record of their career, be it as a blog, diary, notes, or heck, even bullet journaling. Just build yourself a history, and preferably on a platform where your data is yours to keep.&lt;/p&gt;
</content:encoded><updated/></item><item><title>Jamstack Conf 2022 - One Dev&apos;s Recap</title><link>https://charlesvillard.co/blog/2023-02-05-jamstack-conf-2022-one-devs-recap/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2023-02-05-jamstack-conf-2022-one-devs-recap/</guid><description>One developer&apos;s recap of Netlify&apos;s Jamstack Conf 2022. It&apos;s me. I&apos;m the developer.</description><pubDate>Tue, 29 Nov 2022 17:00:33 GMT</pubDate><content:encoded>&lt;p&gt;It&apos;s already been almost a month since Netlify&apos;s 2022 Jamstack Conf. In that time, I&apos;ve been trying to get my thoughts of this year&apos;s event for all things &quot;Jamstack&quot; on paper.&lt;/p&gt;
&lt;p&gt;The short version of those thoughts: the Jamstack has not changed much at all. Its concepts and practices are pretty well documented at this point, if not by &lt;a href=&quot;https://sdtimes.com/webdev/jamstack-brings-front-end-development-back-into-focus/&quot;&gt;the company that coined the term in 2015&lt;/a&gt;, then by the robust community and ecosystem backing it.&lt;/p&gt;
&lt;p&gt;What has changed are the problems and challenges the Jamstack community is trying to solve today. In years past, the big question was, &quot;How do developers get a website stood up faster and less painfully without maintaining a server?&quot; That question has been answered by now. All kinds of solutions are offered by the likes of &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;, &lt;a href=&quot;https://aws.amazon.com/amplify/&quot;&gt;AWS&lt;/a&gt;, &lt;a href=&quot;https://pages.cloudflare.com/&quot;&gt;Cloudflare&lt;/a&gt;, &lt;a href=&quot;https://pages.github.com/&quot;&gt;Github&lt;/a&gt;, and &lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt; itself. And that&apos;s great, but as with anything that needs to scale, it seems answering that one question has uncovered more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;How do we keep this ecosystem healthy?&quot;&lt;/li&gt;
&lt;li&gt;&quot;How do we help non-technical people contribute?&quot;&lt;/li&gt;
&lt;li&gt;&quot;How do we get our content to users faster?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my mini-recap of Jamstack Conf, I mentioned a few themes strung across the whole conference: &lt;strong&gt;collaboration&lt;/strong&gt;, &lt;strong&gt;abstraction&lt;/strong&gt;, and &lt;strong&gt;access&lt;/strong&gt;. This post will aim to elaborate a bit on what I saw of those themes.&lt;/p&gt;
&lt;p&gt;Recordings of the talk are starting to make their way onto &lt;a href=&quot;https://www.youtube.com/@JamstackConf&quot;&gt;the @JamstackConf YouTube channel&lt;/a&gt;, so I&apos;ll add links to the ones I mention here as they&apos;re made available. Until then, I&apos;ll try and do the general vibe of the conference and Phil Hawksworth&apos;s hosting justice.&lt;/p&gt;
&lt;h2&gt;Abstraction (or &quot;How Third-Party Tools Help Take the Pain Away&quot;)&lt;/h2&gt;
&lt;p&gt;As Bud Abbott once said, &quot;Now wouldn&apos;t this be a fine [baseball] team without a pitcher?&quot; Well, wouldn&apos;t the Jamstack be a fine architecture without abstractions? Every year, Jamstack Conf highlights what abstractions can do for developers. This year was no different, with presentations covering libraries, frameworks, and as-a-Service... services.&lt;/p&gt;
&lt;p&gt;Some talks felt like seeing the sentiments of Chris Coyier&apos;s &lt;a href=&quot;https://www.youtube.com/watch?v=grSxHfGoaeg&quot;&gt;2018&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=lFOfQsi5ye0&quot;&gt;2019&lt;/a&gt; Jamstack Conf talks become manifest. Amy Dutton of the &lt;a href=&quot;https://compressed.fm/&quot;&gt;COMPRESSEDfm&lt;/a&gt; podcast talked about how she and her co-host, James Q. Quick, &lt;a href=&quot;https://www.youtube.com/watch?v=WrqoANCpA7w&quot;&gt;built all kinds of nifty features and tooling&lt;/a&gt; into their podcast&apos;s website leveraging Jamstack tools. Phil chatted with Aaron Emery and Kady Wood about &lt;a href=&quot;https://www.youtube.com/watch?v=AsycaWgpmys&quot;&gt;how TripActions bet on the Jamstack&lt;/a&gt; to move their monolithic marketing project towards more nimble tooling.&lt;/p&gt;
&lt;p&gt;Other presentations highlighted the many challenges teams can face on various technical levels and offered innovative solutions. The abstractions available to developers today are bonkers compared to where we were a few years ago. Content managements systems were of course well represented, but the Jamstack has clearly grown much further than that. Services on display covered problem areas including database management and orchestration, websockets, eCommerce, collaborative design, and monorepo build systems. A few that caught my eye in particular:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://clutch.io/&quot;&gt;Clutch&lt;/a&gt;, providing visual tools that allow designers to work on a canvas while allowing devs to use code for prototyping.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ably.com/&quot;&gt;Ably&lt;/a&gt;, aiming to simplify the development and management of websockets and realtime communication&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tanstack.com/router/v1&quot;&gt;TanStack Router&lt;/a&gt;, which offers framework-agnostic, type-safe routing and serialized state management&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://qwik.builder.io/&quot;&gt;Qwik&lt;/a&gt;, a new front-end framework that focuses on resumability instead of hydration to send as little JavaScript as possible with amazingly fast time-to-interactive.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Collaboroation (or &quot;Why Can&apos;t We Be Friends?&quot;)&lt;/h2&gt;
&lt;p&gt;Many of the services I mentioned offered features that let non-technical people contribute in technical ways. More crucially, though, a few of the presentations stressed the importance of &lt;strong&gt;how&lt;/strong&gt; we enable others to contribute. Sanity&apos;s &lt;a href=&quot;https://twitter.com/@kmelve&quot;&gt;Knut Melvær&lt;/a&gt; drove home why caring about the content creator is important, and how Markdown isn&apos;t helping. OSS organizations and maintainers discussed how they&apos;re welcoming the cross-pollination of ideas more in recent years. Personally, Iooking at the open-source space today, I think it shows!&lt;/p&gt;
&lt;p&gt;One panel of independent framework developers discussed &lt;a href=&quot;https://www.youtube.com/watch?v=bPTZmUR7z90&quot;&gt;the importance of working together and inspiring each other&apos;s work on community-driven tools&lt;/a&gt; instead of dogmatically black-boxing ideas. Another panel, this time of database experts, highlighted &lt;a href=&quot;https://www.youtube.com/watch?v=yIoFpfr4vA0&quot;&gt;the concerns of scaling database management today&lt;/a&gt; . Yet another discussed the problems of building runtimes and logic closer and closer to the edge.&lt;/p&gt;
&lt;p&gt;The overarching sense I came away with was that many people in tech are all trying to solve similar problems. So why make it difficult for others to help solve them? Why fight over what the &quot;silver bullet&quot; answer to every edge case might be? These kinds of open conversations are encouraging and healthy for the community. They show that, despite competition, there&apos;s collaboration and stewardship involved in finding the solutions.&lt;/p&gt;
&lt;h2&gt;Access (or &quot;How I Learned to Stop Worrying and Embrace the Edge&quot;)&lt;/h2&gt;
&lt;p&gt;It felt like almost every talk acknowledged the potential of leveraging &quot;the Edge.&quot; So much so that I effectively learned more about what that phrase meant at Jamstack Conf than anywhere else. And that&apos;s coming from someone who currently works at a cloud service provider!&lt;/p&gt;
&lt;p&gt;Cloudflare&apos;s Obinna Ekwuno and Netlify&apos;s Erica Pisani gave great talks that helped define what the Edge is to developers and users. Erica taught us about the &lt;a href=&quot;https://www.youtube.com/watch?v=Bg_lPsOhfuc&quot;&gt;benefits of leveraging edge functions&lt;/a&gt;, while Obinna dicussed the &lt;a href=&quot;https://www.youtube.com/watch?v=SxGDut4or8A&quot;&gt;challenges of deploying databases closer to the user&lt;/a&gt;. Obinna&apos;s points and concerns were also echoed in the databases panel I mentioned earlier, particularly in figuring out how to abstract the database away from developers while maintaining up-to-date state close to the user.&lt;/p&gt;
&lt;p&gt;The real highlight for me around this topic was the edge runtimes panel. Despite copious amounts of notes, I feel like I need to watch it a couple more times to get everything! It serves as a pretty good study of what the Edge represents and where it&apos;s going. Much of the conversation reminded me of the &quot;next billion users&quot; concern that became popular a while back. As access to the Internet becomes increasingly common worldwide, how do you give users the same responsive experience whether they have high or low connection speeds? As more developers start building applications at scale, what are the acceptable tradeoffs to keep data healthy and in sync?&lt;/p&gt;
&lt;h2&gt;So, so much more and so little time.&lt;/h2&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m missing a lot here. It&apos;s really hard to bottle my experience at this conference and confidently say I&apos;m doing Phil justice here. Everything I&apos;ve touched on doesn&apos;t even cover the &quot;hallway track.&quot; When I missed talks, I was having fascinating conversations with vendors at their booths, with folks about their thoughts on challenges I&apos;m trying to solve, or even just in passing. Nevertheless, it was nothing short of a fantastic experience.&lt;/p&gt;
&lt;p&gt;I&apos;d like to shout out to everyone who made my time at Jamstack Conf 2022 such a delight! Thank yous again to &lt;a href=&quot;https://twitter.com/thisisjofrank&quot;&gt;Jo Franchetti&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/trostcodes&quot;&gt;Alex Trost&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/biilmann&quot;&gt;Matt Biilmann&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/NikitaFTW&quot;&gt;Sara Viera&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/bencodezen&quot;&gt;Ben Hong&lt;/a&gt;,  &lt;a href=&quot;https://twitter.com/bdougieyo&quot;&gt;Brian Douglas&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/chr_bach&quot;&gt;Chris Bach&lt;/a&gt;, and &lt;a href=&quot;https://twitter.com/jemyoung&quot;&gt;Jem Young&lt;/a&gt;, as well as to &lt;a href=&quot;https://twitter.com/calebjasik&quot;&gt;Caleb Jasik&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/mhevery&quot;&gt;Misko Hevery&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/dglawson/&quot;&gt;Dana Lawson&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/zachleat/&quot;&gt;Zach Leatherman&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/philhawksworth&quot;&gt;Phil Hawksworth&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/jlengstorf&quot;&gt;Jason Lengstorf&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/monicasarbu&quot;&gt;Monica Sarbu&lt;/a&gt;, and anyone else I may have forgotten! I know everyone here is just a regular person, but it&apos;d be a lie to say I wasn&apos;t a bit starstruck.&lt;/p&gt;
&lt;p&gt;One more thing: if you managed to make it to the end of this recap and you yourself have not attended a conference, I implore that you make attending one a goal. Even if it&apos;s a small one without a ton of coverage or big names, I encourage you find out where one is, whether their code of conduct is up to snuff, and if it is and you&apos;re up to it, try and attend. Network with people, speak about what you&apos;re concerned about, and add your voice to the conversation. The ecosystem needs it, and you&apos;ll be all the better for the experience later.&lt;/p&gt;
</content:encoded><updated/></item><item><title>On the way home from JamstackConf 2022</title><link>https://charlesvillard.co/blog/2023-02-05-on-the-way-home-from-jamstackconf-2022/</link><guid isPermaLink="true">https://charlesvillard.co/blog/2023-02-05-on-the-way-home-from-jamstackconf-2022/</guid><description>Heading home from Jamstack Conf 2022, and trying to contain all I learned in one brain.</description><pubDate>Fri, 11 Nov 2022 17:00:51 GMT</pubDate><content:encoded>&lt;h2&gt;My head is still reeling&lt;/h2&gt;
&lt;p&gt;Reeling, I say! - from two days of talks, discussions, and laughs while attending Netlify&apos;s &lt;a&gt;JamStackConf 2022&lt;/a&gt;. I got to meet and say hi to a bunch of brilliant people like &lt;a href=&quot;https://github.com/thisisjofrank&quot;&gt;Jo Franchetti&lt;/a&gt;, &lt;a href=&quot;https://github.com/trostcodes&quot;&gt;Alex Trost&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/biilmann&quot;&gt;Matt Biillman&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/NikkitaFTW&quot;&gt;Sara Viera&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/bencodezen&quot;&gt;Ben Hong&lt;/a&gt;,  &lt;a href=&quot;https://twitter.com/bdougieyo&quot;&gt;Brian Douglas&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/chr_bach&quot;&gt;Chris Bach&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/JemYoung&quot;&gt;Jem Young&lt;/a&gt;, and so, so many others! A few major themes could be seen across the whole of the conference:&lt;/p&gt;
&lt;h3&gt;Collaboration&lt;/h3&gt;
&lt;p&gt;So many new and neat tools are trying to solve creative problems not just for developers, but for the team members that work with developers. Content management tools that provide both strong DX and UX, visual design tools letting developers prototype logic where the layout design lives, database tools that let non-technical users manage stored procedures, and companies trying to use the Jamstack for the greater good.&lt;/p&gt;
&lt;h3&gt;Abstraction&lt;/h3&gt;
&lt;p&gt;Those aforementioned tools exhibited the power of low-code/no-code tooling in today&apos;s ecosystem. In my discussions and in several talks and panels, speakers highlighted how using reliable services for concerns like authentication, payments, form submission, user registration, and more paid more dividends than just &quot;building it ourselves.&quot;&lt;/p&gt;
&lt;h3&gt;Access&lt;/h3&gt;
&lt;p&gt;As more and more users connect to the Internet, the advent of serverless technologies is allowing for more of the application stack these users see to not just exist on someone else&apos;s metal, but closer to the user by putting it &quot;on the edge.&quot; Effectively this means hosting as many copies of an application as possible as close as possible to the user, leveraging distributed servers to make responses to their browser and app requests faster. We&apos;ve successfully managed this with storage, as well as app logic by way of edge functions. The next step of this movement is now moving data to the edge, and finding ways to reliably provide accurate copies of databases and changes made to them to users around the globe as quickly as possible.&lt;/p&gt;
&lt;p&gt;I plan on writing a blog post in the coming days to further discuss what all happened and some personal thoughts, but the future really is bright for the Jamstack. I&apos;m here for it!&lt;/p&gt;
</content:encoded><updated/></item></channel></rss>