<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>code review on Olaf Alders</title><link>https://www.olafalders.com/categories/code-review/</link><description>Recent content in code review on Olaf Alders</description><generator>Hugo -- gohugo.io</generator><language>en</language><image><url>https://www.olafalders.com/rss-image.png</url><title>code review on Olaf Alders</title><link>https://www.olafalders.com/categories/code-review/</link></image><managingEditor>olaf@wundersolutions.com (Olaf Alders)</managingEditor><webMaster>olaf@wundersolutions.com (Olaf Alders)</webMaster><copyright>© 2026 Olaf Alders</copyright><lastBuildDate>Tue, 13 Oct 2026 21:15:19 -0400</lastBuildDate><atom:link href="https://www.olafalders.com/categories/code-review/index.xml" rel="self" type="application/rss+xml"/><item><title>Publish-Only</title><link>https://www.olafalders.com/2026/10/13/publish-only/</link><pubDate>Tue, 13 Oct 2026 21:15:19 -0400</pubDate><author>olaf@wundersolutions.com (Olaf Alders)</author><category>Programming</category><category>community</category><category>code review</category><guid>https://www.olafalders.com/2026/10/13/publish-only/</guid><description>I find some people on social media can have a pretty hefty capacity for trying to ruin someone else's day. I accept that such people exist, but I also accept that I don't need to engage with them.</description><content:encoded>&lt;p&gt;There&amp;rsquo;s more than one way of delivering a code review, and that&amp;rsquo;s the topic
that got me on this tangent.&lt;/p&gt;
&lt;!-- markdownlint-disable MD003 MD033 MD046 --&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/10/13/publish-only/featured.jpeg"&gt;&lt;img src="https://www.olafalders.com/2026/10/13/publish-only/featured.jpeg"
srcset="https://www.olafalders.com/2026/10/13/publish-only/featured_hu_4805b04ebe479a2c.webp 720w, https://www.olafalders.com/2026/10/13/publish-only/featured.jpeg 1024w"
sizes="(max-width: 768px) 100vw, 672px"
width="1024" height="768"
alt="featured"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- markdownlint-disable-line --&gt;&lt;p class="attribution"&gt;"&lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/40075562@N00/1175522045"&gt;Message in the bottle&lt;/a&gt;" by &lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/40075562@N00"&gt;Dasha Bondareva&lt;/a&gt; is licensed under &lt;a target="_blank" rel="noopener noreferrer" href="https://creativecommons.org/licenses/by-nc/2.0/"&gt;CC BY-NC 2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had code reviews from people who thought it was some sort of a flex to go to
great lengths to find any kind of an issue in a pull request. It can take a
lot of the joy out of the job and some days I&amp;rsquo;d dread sitting down at my desk
knowing that I would have to deal with this kind of largely meaningless back and
forth. I&amp;rsquo;ve toned down my own code reviews a lot after being on the receiving
end of meaningless pedantry.&lt;/p&gt;
&lt;p&gt;It may sound silly, but I had a colleague who would use emoji in code
reviews and it was always kind of fun to see which ones he could jam
into the review.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dependency bump? 📦 ⬆️&lt;/li&gt;
&lt;li&gt;Fixing a flaky test? 🎲 🚫&lt;/li&gt;
&lt;li&gt;Performance improvement? 🐢 ➡️ 🐇&lt;/li&gt;
&lt;li&gt;Deleting code? 🔥 🪓&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What eventually happened is that other people started doing this and it became
kind of a fun game to see if you could express the intent of a PR with emoji.
When you get this kind of feedback, you know that whatever else is in there
isn&amp;rsquo;t going to be harsh. It sets a fun tone for what can actually be an
enjoyable exercise: you get to learn something from a colleague and sometimes
what you learn is that your work is okay to merge without changes.&lt;/p&gt;
&lt;p&gt;Contrast that with the reviews that are a laundry list which send the
message &amp;ldquo;what are you even doing here?&amp;rdquo; and you pretty quickly get to know whom
you enjoy working with. Making a code review not feel like being hit with a
hammer is not hard. It just takes a bit of effort. You will give up some
economy, but you&amp;rsquo;ll also retain more humanity.&lt;/p&gt;
&lt;p&gt;On a slightly related note, one of the funniest things I ever saw at this
workplace was a chat message where one developer announced they were going
&amp;ldquo;afk (away from keyboard) for 20 minutes&amp;rdquo; only to have a teammate attach the
&amp;ldquo;📰🚽&amp;rdquo; emoji to the message. &lt;em&gt;Obviously you&amp;rsquo;d need to tread lightly with this
kind of jocularity.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="lux-toilet-soap.jpeg"&gt;&lt;img src="lux-toilet-soap.jpeg" alt="A 1947 newspaper advertisement for Lux Toilet Soap" width="551" height="1024" loading="lazy" decoding="async" style="margin-left: auto; margin-right: auto;"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- markdownlint-disable-line --&gt;&lt;p class="attribution" style="text-align: center;"&gt;"&lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/159358942@N07/48526511256"&gt;1947 advertisement for Lux Toilet Soap&lt;/a&gt;" by &lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/159358942@N07"&gt;Matthew Paul Argall&lt;/a&gt; is marked with &lt;a target="_blank" rel="noopener noreferrer" href="https://creativecommons.org/publicdomain/mark/1.0/"&gt;Public Domain Mark 1.0 &lt;img src="https://www.olafalders.com/img/cc/pd.svg" alt="" style="height: 1em;" /&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, depending on the culture of your workplace, you may need to put up with
this kind of thing at work, but you do not have to grin and bear it everywhere
else. The same types are on social media. Depending on where I&amp;rsquo;m sharing
something, I may treat it as a publish-only space. For example, I find some
people on Reddit can have a pretty hefty capacity for trying to ruin someone
else&amp;rsquo;s day, so I often just won&amp;rsquo;t read the comments there. (That&amp;rsquo;s not to say
Redditors are inherently cruel, but that the platform often doesn&amp;rsquo;t
disincentivise bad behaviour.)&lt;/p&gt;
&lt;p&gt;Your mileage may vary, but that&amp;rsquo;s what I&amp;rsquo;ve found helps me better enjoy my day.
I accept that people who lash out exist, but I also accept that I don&amp;rsquo;t need to
engage with them.&lt;/p&gt;
&lt;p&gt;I could also just say I&amp;rsquo;m not going to share posts on Reddit, but the truth is
that it can drive a significant amount of traffic. So, depending on how I&amp;rsquo;m
feeling on a particular day with Reddit, I may just throw something over the
wall and not stick around to find out what happened. If I feel I have a thick
enough skin on a different day, I may engage fully. I don&amp;rsquo;t have a blanket ban
on commenting there.&lt;/p&gt;
&lt;p&gt;My one other caveat about Reddit is that I have to make sure there&amp;rsquo;s not even a
whiff of an em-dash in my writing for fear that people start getting their LLM
pitchforks out. I had one post removed from r/programming for being &amp;ldquo;mostly
LLM-generated&amp;rdquo;. Spoiler alert: it wasn&amp;rsquo;t. My feelings on that are that I like
em-dashes and I have for a lot of years, but I&amp;rsquo;ll probably need to use some
other kind of punctuation in their place if there&amp;rsquo;s a chance a post gets
arbitrarily removed. That&amp;rsquo;s currently not a hill I&amp;rsquo;m willing to die on.&lt;/p&gt;
&lt;p&gt;Publish-only is a valid choice, in the same way that I don&amp;rsquo;t engage with someone who
flashes me their middle finger from their car in traffic. If communication
feels like a fool&amp;rsquo;s errand, I don&amp;rsquo;t have to default to playing the fool.&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/"&gt;Code Review Is the Hard Part&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/10/13/publish-only/"&gt;Read on website&lt;/a&gt;&lt;/p&gt;</content:encoded><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://www.olafalders.com/2026/10/13/publish-only/featured.jpeg"/></item><item><title>Who Handles Your Security Reviews?</title><link>https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/</link><pubDate>Wed, 09 Sep 2026 00:00:00 -0400</pubDate><author>olaf@wundersolutions.com (Olaf Alders)</author><category>security</category><category>LLM</category><category>Claude Code</category><category>code review</category><guid>https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/</guid><description>LLMs are very good at finding exploits, but they're also really good at creating them — just like humans. So who handles your security reviews?</description><content:encoded>&lt;!-- markdownlint-disable MD003 MD033 MD046 --&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/featured.jpeg"&gt;&lt;img src="https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/featured.jpeg"
srcset="https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/featured.jpeg 600w"
sizes="(max-width: 768px) 100vw, 672px"
width="600" height="450"
alt="featured"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- markdownlint-disable-line --&gt;&lt;p class="attribution"&gt;&lt;a target="_blank" rel="noopener noreferrer" href="https://commons.wikimedia.org/wiki/File:Door_handle_designed_by_Jasper_Morrison.jpg"&gt;Door handle designed by Jasper Morrison&lt;/a&gt; by JT at JMLtd, licensed under &lt;a target="_blank" rel="noopener noreferrer" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;CC BY-SA 4.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve had a closer look at what&amp;rsquo;s happening in the world of OSS security
these past few months, and I&amp;rsquo;ve seen firsthand where vulnerabilities are turning
up. What I find particularly surprising is that it&amp;rsquo;s not just in legacy code.
&lt;a href="https://www.cve.org/"&gt;CVEs&lt;/a&gt; are also turning up in brand new code that&amp;rsquo;s being uploaded right now.
Just because we now have more tools at our disposal doesn&amp;rsquo;t mean that
security issues are a solved problem.&lt;/p&gt;
&lt;p&gt;How do we solve this problem? Probably via review. But review by whom? Maybe
you use an LLM. Or a friend who is interested in security. Possibly your
ecosystem already has a &lt;a href="https://alpha-omega.dev/blog/join-the-fight-building-a-team-of-open-source-security-engineers-in-residence/"&gt;program with engineers you can request reviews from&lt;/a&gt;. It
could be all of the above.&lt;/p&gt;
&lt;h2 id="llms-cut-both-ways"&gt;&lt;a class="heading-anchor" href="#llms-cut-both-ways" aria-label="Permalink to this section"&gt;#&lt;/a&gt;LLMs cut both ways&lt;/h2&gt;
&lt;p&gt;While LLMs are very good at finding exploits, they are also really good at
creating them — just like humans. The cynical approach to this says that of
course &lt;a href="https://en.wikipedia.org/wiki/Vibe_coding"&gt;vibe-coded&lt;/a&gt; software will be riddled with errors, but to be fair, the vibe coders
also have defensive tools at their disposal. They&amp;rsquo;re either not using them
consistently or stuff is just getting through — in the same way that you can
get a security review from your very annoying and brutally thorough colleague
and they will likely still have missed something.&lt;/p&gt;
&lt;h2 id="make-security-review-a-habit"&gt;&lt;a class="heading-anchor" href="#make-security-review-a-habit" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Make security review a habit&lt;/h2&gt;
&lt;p&gt;If you use LLMs, one way to improve your odds is to get into the habit of
invoking a specialized security reviewer on your new code. Here&amp;rsquo;s my standard
&lt;a href="https://github.com/oalders/kitchen-sink/blob/main/commands/security-review.md"&gt;security-review.md&lt;/a&gt;
which might give you a starting point if you&amp;rsquo;re looking for inspiration. At the
end of the day it&amp;rsquo;ll come down to what your LLM skills are directing the agent
to look for but also which model you are using to implement the skill.&lt;/p&gt;
&lt;p&gt;Depending on which model you are using, you may want to avoid doing things like
asking for a &lt;a href="https://en.wikipedia.org/wiki/Proof_of_concept"&gt;proof of concept&lt;/a&gt;. Certain Claude models have been known to deny
the request or even lock you out of your account. (I have that as first-hand
anecdata). If you&amp;rsquo;re serious about doing security research and you use Claude,
you may want to look at Anthropic&amp;rsquo;s &lt;a href="https://support.claude.com/en/articles/14604842-real-time-cyber-safeguards-on-claude-opus-and-sonnet"&gt;Cyber Verification
Program&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="scan-the-code-you-already-have"&gt;&lt;a class="heading-anchor" href="#scan-the-code-you-already-have" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Scan the code you already have&lt;/h2&gt;
&lt;p&gt;As an interesting exercise, try pointing an LLM scanner at your existing code.
You may be surprised at what you find, and maybe you can even ship fixes before
the security researchers find them. For example, just a few days ago I found
security hardening worth doing in
&lt;a href="https://www.npmjs.com/package/diff-lockfiles"&gt;diff-lockfiles&lt;/a&gt; while making
unrelated changes.&lt;/p&gt;
&lt;h2 id="ask-for-help"&gt;&lt;a class="heading-anchor" href="#ask-for-help" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Ask for help&lt;/h2&gt;
&lt;p&gt;Your ecosystem may already have a program you can turn to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/introducing-the-drupal-ai-security-initiative-the-first-six-weeks/"&gt;Drupal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/freebsd-ai-assisted-vulnerability-discovery-project-launch/"&gt;FreeBSD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/announcing-the-node-js-ai-security-engineer-in-residence/"&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/the-perl-and-raku-foundations-security-engineers-in-residence-april-task-force/"&gt;Perl/CPAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/announcing-the-ecosystem-security-team-at-the-php-foundation/"&gt;PHP Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/strengthening-security-for-the-ruby-ecosystem-a-team-of-security-engineers-in-residence/"&gt;Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpha-omega.dev/blog/an-ai-security-engineer-in-residence-for-the-rust-ecosystem/"&gt;Rust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re involved with one of these ecosystems or already know a security
researcher, ask them to scan your code and send you the results. Or ask a human
to review it the old-fashioned way — that has worked for decades and is still a
fine choice.&lt;/p&gt;
&lt;p&gt;Related posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.olafalders.com/2026/08/24/pinning-claude-code/"&gt;Pinning Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.olafalders.com/2026/07/17/claude-code-anatomy-of-a-misfeature/"&gt;Claude Code: Anatomy of a Misfeature&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.olafalders.com/2026/07/06/the-dot-claude-attack-surface/"&gt;The dot claude Attack Surface&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.olafalders.com/2026/06/11/claude-will-find-a-way/"&gt;Claude Will Find a Way&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/"&gt;Read on website&lt;/a&gt;&lt;/p&gt;</content:encoded><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://www.olafalders.com/2026/09/09/who-handles-your-security-reviews/featured.jpeg"/></item><item><title>Code Review Is the Hard Part</title><link>https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/</link><pubDate>Sun, 26 Jul 2026 00:00:00 -0400</pubDate><author>olaf@wundersolutions.com (Olaf Alders)</author><category>Open Source</category><category>GitHub</category><category>community</category><category>LLM</category><category>code review</category><guid>https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/</guid><description>I don't have an actual solution for this. I'm just saying that the gatekeepers in my universe seem to be in short supply.</description><content:encoded>&lt;p&gt;There is currently some recognition of the fact that with code creation having
become cheaper, the burden of code review has not necessarily become easier.
This is especially the case for people who get LLM-written pull requests who
don&amp;rsquo;t use LLM tools for review. I can only imagine how exhausting it must be. I
have only seen one complete waste of time pull request on one of my projects,
but it was pretty irritating. Having said this, for some of my projects, review
has been the hard part for many years already. It&amp;rsquo;s often easy to send a drive-by
pull request but it can be much harder to find a competent, careful reviewer
who is familiar with a whole bunch of RFCs, some superseding the others, who
can say &amp;ldquo;this is correct and probably won&amp;rsquo;t break a bunch of legacy code you
don&amp;rsquo;t know about&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Add to this the fact that you don&amp;rsquo;t get much credit on GitHub for &amp;ldquo;spent X
hours in careful review of brittle pull request that had Y sharp edges that the
contributor never considered&amp;rdquo;, but you do get kudos for every one of the low
effort pull requests that you send (I&amp;rsquo;m looking at you, &lt;a href="https://hacktoberfest.com/"&gt;Hacktoberfest&lt;/a&gt;).&lt;/p&gt;
&lt;!-- markdownlint-disable MD003 MD033 MD046 --&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/featured.jpeg"&gt;&lt;img src="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/featured.jpeg"
srcset="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/featured_hu_d950cd5de5b701e2.webp 720w, https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/featured.jpeg 726w"
sizes="(max-width: 768px) 100vw, 672px"
width="726" height="800"
alt="featured"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;!-- markdownlint-disable-line --&gt;&lt;p class="attribution"&gt;"&lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/mikekline/864978176"&gt;Using a Magnifying Glass and Driving&lt;/a&gt;" by &lt;a target="_blank" rel="noopener noreferrer" href="https://www.flickr.com/photos/mikekline/"&gt;Mike "Dakinewavamon" Kline&lt;/a&gt; is licensed under &lt;a target="_blank" rel="noopener noreferrer" href="https://creativecommons.org/licenses/by/2.0/"&gt;CC BY 2.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re doing it for the likes, then code review is not the way to go, even if
it&amp;rsquo;s equally as important as writing the code.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have an actual solution for this. I&amp;rsquo;m just saying that the gatekeepers
in my universe seem to be in short supply.&lt;/p&gt;
&lt;p&gt;Do I use LLMs for code review? I do, but while I might trust the LLMs to find a
lot of the problems in a pull request, I don&amp;rsquo;t trust them to find &lt;strong&gt;all of the
problems&lt;/strong&gt; and I certainly don&amp;rsquo;t trust them to be the final arbiter of code
correctness. For any non-trivial change to Open Source code that actually
matters, I don&amp;rsquo;t see a good way to keep a human out of the loop. I write a lot
of Open Source that doesn&amp;rsquo;t matter, but if it&amp;rsquo;s actually something that people
use, I feel a responsibility to make a best effort not to explode whatever
they&amp;rsquo;re working on.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/"&gt;Read on website&lt;/a&gt;&lt;/p&gt;</content:encoded><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://www.olafalders.com/2026/07/26/code-review-is-the-hard-part/featured.jpeg"/></item><item><title>GitHub Copilot Chat: First Impressions</title><link>https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/</link><pubDate>Thu, 29 Feb 2024 00:00:00 -0500</pubDate><author>olaf@wundersolutions.com (Olaf Alders)</author><category>LLM</category><category>GitHub</category><category>code review</category><guid>https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/</guid><description>Recently I got access to GitHub's Copilot Chat. I have been trying to figure out how (and if) Copilot can help to improve my productivity.
Initially I did not think yet another article on AI would have any point, but many smart, competent software developers do not use AI (yet?). Some of them may not be aware of how they can leverage AI and some may rightly just be wary of all the hype. My plan is to share some practical examples and you can judge for yourself if it is worth your time.</description><content:encoded>&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/featured.jpeg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/featured.jpeg"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/featured_hu_6c349fdb5e573c1b.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/featured.jpeg 1024w"
sizes="(max-width: 768px) 100vw, 672px"
width="1024" height="1024"
alt="man with bot"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Recently I got access to GitHub&amp;rsquo;s Copilot Chat. I had seen a demo of it back in
December and was very impressed with what it can do. Since getting access, I
have been trying to figure out how (and if) Copilot can help to improve my
productivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota bene&lt;/strong&gt;: This article is not an advertisement for AI. I am aware of many
of the caveats when it comes to AI, but in the short term I am interested in
seeing how I can get a genuine positive result from it.&lt;/p&gt;
&lt;p&gt;Initially I did not think yet another article on AI would have any point. If you
read Hacker News, you may be of the opinion that everyone is using AI already,
but that&amp;rsquo;s not the case. Many smart, competent software developers do not use AI
(yet?). Some of them may not be aware of how they can leverage AI and some may
simply be wary of all the hype.&lt;/p&gt;
&lt;p&gt;My plan is to share some practical examples. This won&amp;rsquo;t be a &amp;ldquo;how to&amp;rdquo; article,
but rather a higher level overview of what might be possible. I won&amp;rsquo;t be going
into details about exactly which prompts I used to get my results. I will leave
that as an exercise for the reader. It is my hope that I&amp;rsquo;ll give you enough
information that you can judge for yourself if it is worth your time to play
around with this.&lt;/p&gt;
&lt;h2 id="my-setup"&gt;&lt;a class="heading-anchor" href="#my-setup" aria-label="Permalink to this section"&gt;#&lt;/a&gt;My Setup&lt;/h2&gt;
&lt;p&gt;I have been using Copilot for completion for a few months now. My setup is
&lt;code&gt;neovim&lt;/code&gt; + &lt;code&gt;nvim-cmp&lt;/code&gt; with the following plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zbirenbaum/copilot.lua"&gt;zbirenbaum/copilot.lua&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zbirenbaum/copilot-cmp"&gt;zbirenbaum/copilot-cmp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That mostly works for me. Sometimes the completion is a bit funky. Opening up
related files to give Copilot more context is helpful. For me, Copilot is a net
positive, but it can be a bit of a slog sometimes.&lt;/p&gt;
&lt;p&gt;In order to use Copilot Chat, I opted to set up VS Code with the following
plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;GitHub Copilot Chat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means that I need to live in VS Code when using Copilot&amp;rsquo;s Chat features.
This is not ideal, but so far I accept the trade-off as necessary and I am not
grumbling about it. I am still in &lt;code&gt;neovim&lt;/code&gt; when VS Code is not required, but
with all of the file reloading, they are playing nicely together for the most
part.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I should note that
&lt;a href="https://github.com/CopilotC-Nvim/CopilotChat.nvim"&gt;CopilotC-Nvim/CopilotChat.nvim&lt;/a&gt;
does exist. I haven&amp;rsquo;t tried it as I wanted to get up and running in a hurry.
&lt;code&gt;neovim&lt;/code&gt; purists may prefer it.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="building-a-new-jekyll-site"&gt;&lt;a class="heading-anchor" href="#building-a-new-jekyll-site" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Building a New Jekyll Site&lt;/h2&gt;
&lt;p&gt;As you may be aware,
&lt;a href="https://www.linkedin.com/in/olafalders"&gt;I am looking to pick up some freelance work&lt;/a&gt;
right now. I have had some success, but there is still room in my schedule. I
have not actively looked for work in some time. My web site did not look very
modern and the listed skill set was dated &amp;ndash; I have not written an iOS app in
years.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/old.jpg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/old_hu_bc4f6ff1674e8abe.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/old_hu_1916a96625cd7b.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/old_hu_bc4f6ff1674e8abe.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="727"
alt="the legacy site"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My site was deployed using a web application framework, but I no longer need to
do anything dynamic. Time to find a static site generator. Jekyll is a very
mature site builder with lots of available themes, so I started there.&lt;/p&gt;
&lt;p&gt;First,
&lt;a href="https://github.com/jeromelachaud/freelancer-theme"&gt;I settled on a theme&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-top.jpg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-top_hu_58a5f543fb2f5009.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-top_hu_b852311e56b24781.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-top_hu_58a5f543fb2f5009.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="766"
alt="the theme"
loading="lazy" decoding="async"&gt;&lt;/a&gt;
&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-portfolio.jpg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-portfolio_hu_24b7daf988f808af.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-portfolio_hu_8c2c5b5166587447.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/theme-portfolio_hu_24b7daf988f808af.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="758"
alt="the theme"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I like the look of it. It has a lot of GitHub stars and a small number of open
issues and pull requests. I extrapolate wildly from this that people are using
it and not having a great deal of problems. That&amp;rsquo;s good enough for right now.
It&amp;rsquo;s going to be a huge improvement.&lt;/p&gt;
&lt;h3 id="installing-rbenv"&gt;&lt;a class="heading-anchor" href="#installing-rbenv" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Installing rbenv&lt;/h3&gt;
&lt;p&gt;I needed &lt;code&gt;ruby&lt;/code&gt; to run my Jekyll build locally. I&amp;rsquo;ll want to be able to edit my
site on more than one machine, so I quickly wrote
&lt;a href="https://github.com/oalders/is/blob/main/examples/rbenv.sh"&gt;an installer script&lt;/a&gt;
to install &lt;code&gt;rbenv&lt;/code&gt; if needed and then to install an arbitrary version of &lt;code&gt;ruby&lt;/code&gt;
if needed. I used &lt;a href="https://github.com/oalders/is"&gt;is&lt;/a&gt;, which is a command line
tool which I recently wrote. I am quite happy with how simple and readable this
script turned out to be. If you&amp;rsquo;re curious about &lt;code&gt;is&lt;/code&gt;, I have written
&lt;a href="https://www.olafalders.com/2023/09/28/is-an-inspector-for-your-environment/"&gt;an introduction to is&lt;/a&gt; not
so long ago.&lt;/p&gt;
&lt;h3 id="replacing-google"&gt;&lt;a class="heading-anchor" href="#replacing-google" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Replacing Google&lt;/h3&gt;
&lt;p&gt;As I was exploring what I needed to do, I used Copilot Chat as a Google
replacement, asking it the kind of things I normally would have searched Google
for. That went very well. I got good information without having to wade through
a top result from W3Schools followed by lots of mediocre Medium posts and dated
Stack Overflow answers.&lt;/p&gt;
&lt;p&gt;Using Copilot as my search engine has the added benefit of not requiring me to
leave my editor. Once the response has been generated, being able to directly
replace code with Copilot&amp;rsquo;s suggestion is a nice little productivity feature as
well.&lt;/p&gt;
&lt;p&gt;Aside from not needing Google for good information about how to set up Jekyll, I
have found Copilot to be powerful when doing mundane things like scaffolding
config files. I can say something like &amp;ldquo;Give me a best practice &lt;code&gt;eslint&lt;/code&gt;
configuration&amp;rdquo; and I might see an answer like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;es6&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extends&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;eslint:recommended&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;plugin:react/recommended&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;globals&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Atomics&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;readonly&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;SharedArrayBuffer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;readonly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;parserOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ecmaFeatures&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;jsx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;ecmaVersion&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sourceType&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;module&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;plugins&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;rules&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;indent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;linebreak-style&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;unix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;quotes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;double&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;semi&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;always&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;no-console&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;warn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;no-unused-vars&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;warn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;react&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;detect&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can argue about whether or not this really is best practice, but I do not
have strong opinions on this. At the end of the day I just want code that is
consistent and this gives me a starting point, since it&amp;rsquo;s in my nature to fiddle
with settings. Also, VS Code tells me what the config file should be called.
That may seem trivial but on more than one occasion I have struggled with
figuring out why some tool is not working only to realize the file needed to
start with a dot.&lt;/p&gt;
&lt;p&gt;Looking back on this, I could have refined the prompt to say that I&amp;rsquo;m not using
React, which should have pared down the file a bit, but for an 80/20 approach
where I try to get the main things done now and I get to fiddle with it later,
superfluous settings in a config file aren&amp;rsquo;t going to keep me up at night.&lt;/p&gt;
&lt;h3 id="front-end-design"&gt;&lt;a class="heading-anchor" href="#front-end-design" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Front End Design&lt;/h3&gt;
&lt;p&gt;As I was working on the layout, I asked Copilot for help in tweaking the layout.
It helpfully gave me advice and generated CSS to go with it.&lt;/p&gt;
&lt;h4 id="asset-upgrades"&gt;&lt;a class="heading-anchor" href="#asset-upgrades" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Asset Upgrades&lt;/h4&gt;
&lt;p&gt;As I took a closer look at the theme, I saw that some included assets were very
old.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrap (3.2.0, released in June 2014)&lt;/li&gt;
&lt;li&gt;jQuery (1.11.0 from January 2014)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything still worked, but this seemed like a fun chance to experiment with
Copilot. Could it do the right thing or would I be stuck in a world of find and
replace? Time to find out. I upgraded the Bootstrap assets and asked Copilot to
upgrade the CSS usage to Bootstrap 5. To my surprise, that mostly just worked.&lt;/p&gt;
&lt;p&gt;As for jQuery, I asked Copilot to convert it to pure JavaScript. That worked
very well, requiring very little intervention from me. I even eliminated a third-party
library in the process. jQuery was not bringing much to the table here and
I was able to eliminate a pretty large dependency. So far, so good.&lt;/p&gt;
&lt;h4 id="asset-creation"&gt;&lt;a class="heading-anchor" href="#asset-creation" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Asset Creation&lt;/h4&gt;
&lt;p&gt;I then used Microsoft Image Creator to come up with some artwork.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-top.jpg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-top_hu_e146b5f47008b621.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-top_hu_19c11bb3991817eb.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-top_hu_e146b5f47008b621.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="788"
alt="the theme"
loading="lazy" decoding="async"&gt;&lt;/a&gt;
&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-services.jpg"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-services_hu_8fb2ab3ef12da487.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-services_hu_41a53628d7db5fb0.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/new-services_hu_8fb2ab3ef12da487.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="789"
alt="the theme"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Again I was quite happy with &lt;a href="https://www.wundersolutions.com"&gt;the result&lt;/a&gt;. The
image creation has some limitations. It seems to want to give me blue eyes, even
when I ask for brown. It also makes my White Shepherd look more like a Husky,
but that feels like quibbling. In real life she often gets called a Husky,
occasionally even by Husky owners.&lt;/p&gt;
&lt;h4 id="responsive-design"&gt;&lt;a class="heading-anchor" href="#responsive-design" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Responsive Design&lt;/h4&gt;
&lt;p&gt;The only remaining issue was that the layout did not work consistently across
various device resolutions. Copilot could not help me with this, partly because
I lacked the vocabulary to describe the problem. Luckily a very generous friend
gave me the help that I needed to get this little problem sorted out.&lt;/p&gt;
&lt;h3 id="the-end-result"&gt;&lt;a class="heading-anchor" href="#the-end-result" aria-label="Permalink to this section"&gt;#&lt;/a&gt;The End Result&lt;/h3&gt;
&lt;p&gt;Over a few hours on a Saturday and Sunday, I was able to switch to
&lt;a href="https://www.wundersolutions.com"&gt;a brand new site&lt;/a&gt;, run by a static site
generator. When I push my commits, the Jekyll site rebuilds and publishes via
GitHub Pages. It all requires very little intervention from me. As someone who
does a bit of web hosting, it might seem weird that I am not dogfooding my web
site, but at this point in my career I am more interested in the right tools for
the right job. Occasionally I enjoy an overly complicated hobby project, but
this ain&amp;rsquo;t it.&lt;/p&gt;
&lt;h3 id="lessons-learned"&gt;&lt;a class="heading-anchor" href="#lessons-learned" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Lessons Learned&lt;/h3&gt;
&lt;p&gt;Now that I&amp;rsquo;ve used AI to kick-start a rapid web site replacement, what have I
learned?&lt;/p&gt;
&lt;h4 id="trust-but-verify"&gt;&lt;a class="heading-anchor" href="#trust-but-verify" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Trust, but Verify&lt;/h4&gt;
&lt;p&gt;Copilot will tell you things with such confidence that it can be jarring when it
is clearly wrong. I recently gave Copilot a bit of Ansible config which updates
a system configuration file. I asked for this to be converted to an equivalent
bash one-liner. Copilot was more than happy to do this. The caveat was that the
resulting code was set up to blow away the original multi-line system file and
replace it with the one line I was trying to add. I did not get caught by this
bit of misinformation, but &lt;strong&gt;caveat emptor&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t been using Copilot in anger on really gnarly or convoluted code.
Copilot cannot get context from all of the code in a really large project. The
bigger and more complicated your project is, the greater the possibility that
you&amp;rsquo;ll get less than helpful output from Copilot. Just as you would not blindly
copy/paste a Stack Overflow answer into production code, you don&amp;rsquo;t want to ship
Copilot suggestions without proper scrutiny.&lt;/p&gt;
&lt;h4 id="copilot-can-tidy-things-that-tidiers-possibly-cant"&gt;&lt;a class="heading-anchor" href="#copilot-can-tidy-things-that-tidiers-possibly-cant" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Copilot Can Tidy Things that Tidiers Possibly Can&amp;rsquo;t&lt;/h4&gt;
&lt;p&gt;I love tidiers and tidying. I talked about this a bit in
&lt;a href="https://www.olafalders.com/2024/02/06/find-and-fix-more-typos/"&gt;my post about typos&lt;/a&gt;. I have long been
frustrated by the lack of tidiers which are template-aware. Copilot did a great
job of respecting Jekyll template syntax when I asked it to reformat the HTML in
the files. I am hopeful it is equally good at Go and Perl HTML templates. Even
if it is currently not, I am confident that this is on the horizon.&lt;/p&gt;
&lt;h4 id="mundane-tasks-become-less-soul-crushing"&gt;&lt;a class="heading-anchor" href="#mundane-tasks-become-less-soul-crushing" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Mundane Tasks Become Less Soul-crushing&lt;/h4&gt;
&lt;p&gt;I recently wrote two Playwright tests in TypeScript which were largely similar,
but with important, subtle differences. Copilot not only refactored these to
allow them to share common code, but it actually created table-driven tests for
me. The result was so much cleaner and more maintainable than what I had started
with. The practical benefit is that I hope I am in a position where I do not
always have to write code with the inevitable refactor in mind. I liken this to
the fact that I rarely format my own code these days. I just write something
that&amp;rsquo;s mostly readable and I rely on a tidier to enforce style.&lt;/p&gt;
&lt;p&gt;The wider implication is that if I am asked, in the parameters of a code review,
to do some tedious task that I really do not want to do because &amp;ldquo;why are you
asking me now when you could have saved me a bunch of time by mentioning this
earlier&amp;rdquo;, I can ask Copilot to implement the request for me. If it works,
everybody wins. If it does not, then I still have the choice to punt on the
change if I think it can wait or to dig in and try to refactor the code myself.&lt;/p&gt;
&lt;p&gt;What that means to me is not having to spend mental energy on things that do not
matter that much. I can lose a lot of time dealing with code review nitpicks
that I often do not have the energy to argue against. Now I have a chance to see
if my new toy can implement the request for me.&lt;/p&gt;
&lt;h4 id="legacy-projects-get-new-life"&gt;&lt;a class="heading-anchor" href="#legacy-projects-get-new-life" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Legacy Projects Get New Life&lt;/h4&gt;
&lt;p&gt;I recently realized that the landing page for
&lt;a href="https://perladvent.org/"&gt;the Perl Advent Calendar&lt;/a&gt; looked quite dated. If you
looked at it you would be forgiven for thinking the calendar was possibly
abandoned. We published a full calendar of articles in 2023 and 2022, so it&amp;rsquo;s
anything but abandoned.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-old.png"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-old_hu_ba19b352e943a2de.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-old_hu_f47cef42d0fc96b0.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-old_hu_ba19b352e943a2de.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="493"
alt="the legacy advent page"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/perladvent/Perl-Advent/pull/407"&gt;I asked Copilot&lt;/a&gt; to
modernize the design and it did so quite happily, giving me a workable result on
the first try. I then asked it to add some JavaScript to redirect to a different
page in December and January of any given year. These are all things which I
could have done myself, but I did not want to.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-new.png"&gt;&lt;img src="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-new_hu_ee81efbbc8a973fd.webp"
srcset="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-new_hu_e6ab01c2965e7714.webp 720w, https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/advent-new_hu_ee81efbbc8a973fd.webp 1440w"
sizes="(max-width: 768px) 100vw, 672px"
width="1440" height="716"
alt="the new advent page"
loading="lazy" decoding="async"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can argue that this kind of work isn&amp;rsquo;t hard. It&amp;rsquo;s not really, but it was
onerous enough that nobody did it for many years. I liken this to taking on a
task myself or having an intern do it. If the intern does it, I still need to
explain the problem and check the work, but it frees me up to do something else
in the meantime. If the intern is effective, it&amp;rsquo;s a time saver. If the intern
needs a lot of help, then I haven&amp;rsquo;t gained much at all. I need to figure out
what the intern can handle and then assign appropriate tasks.&lt;/p&gt;
&lt;p&gt;With refactoring and modernising of code becoming easier to handle, the burden
of maintenance decreases. Perhaps projects which have fallen into disrepair can
more easily be revived.&lt;/p&gt;
&lt;h4 id="creating-tabular-content"&gt;&lt;a class="heading-anchor" href="#creating-tabular-content" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Creating Tabular Content&lt;/h4&gt;
&lt;p&gt;I love Markdown tables, but boy do I not enjoy creating them. Let&amp;rsquo;s try it with
Copilot.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Create a markdown table of the names of the 12 months of the year. Each row
represents one month. The columns are the month names in Latin, Italian,
Spanish, French and German&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Surprisingly, we get what we asked for.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Latin | Italian | Spanish | French | German |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| ---------- | --------- | ---------- | --------- | --------- |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Ianuarius | Gennaio | Enero | Janvier | Januar |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Februarius | Febbraio | Febrero | Février | Februar |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Martius | Marzo | Marzo | Mars | März |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Aprilis | Aprile | Abril | Avril | April |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Maius | Maggio | Mayo | Mai | Mai |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Iunius | Giugno | Junio | Juin | Juni |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Iulius | Luglio | Julio | Juillet | Juli |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| Augustus | Agosto | Agosto | Août | August |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| September | Settembre | Septiembre | Septembre | September |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| October | Ottobre | Octubre | Octobre | Oktober |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| November | Novembre | Noviembre | Novembre | November |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| December | Dicembre | Diciembre | Décembre | Dezember |
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Will we double-check the spelling before using this in anger? You bet we will,
but if we had typed this by hand we would have checked it anyway.&lt;/p&gt;
&lt;p&gt;If we want this table in HTML, we say &amp;ldquo;convert the table to HTML&amp;rdquo; and it is
done. Likewise, we can ask for a CSV:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csv" data-lang="csv"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Latin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Italian&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Spanish&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;French&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;German&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Ianuarius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Gennaio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Enero&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Janvier&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Januar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Februarius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Febbraio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Febrero&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Février&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Februar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Martius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Marzo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Marzo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mars&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;März&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Aprilis&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Aprile&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Abril&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Avril&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;April&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Maius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Maggio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mayo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mai&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mai&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Iunius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Giugno&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Junio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Juin&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Juni&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Iulius&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Luglio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Julio&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Juillet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Juli&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Augustus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Agosto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Agosto&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Août&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;August&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;September&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Settembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Septiembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Septembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;September&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;October&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ottobre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Octubre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Octobre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Oktober&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;November&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Novembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Noviembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Novembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;November&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;December&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Dicembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Diciembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Décembre&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Dezember&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Of course you can already do this with bash/sed/awk/jq or what have you, but not
everyone views command line data transformation as a rewarding hobby. Now you
have the option of getting arbitrary tabular data just by asking for it. It&amp;rsquo;s
one more tool in your toolbox.&lt;/p&gt;
&lt;h4 id="code-review"&gt;&lt;a class="heading-anchor" href="#code-review" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Code Review&lt;/h4&gt;
&lt;p&gt;Looking to the future, I see how Copilot could be useful when it comes to code
reviews.&lt;/p&gt;
&lt;h5 id="ask-copilot-to-explain-code"&gt;&lt;a class="heading-anchor" href="#ask-copilot-to-explain-code" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Ask Copilot to Explain Code&lt;/h5&gt;
&lt;p&gt;If I check out the branch I am reviewing and select some code with a language
feature I do not quite understand, I can ask Copilot to explain it to me. (If I
am asking it to explain some convoluted code, that&amp;rsquo;s a red flag for the review,
but it can still help me get from A to B). I see this as potentially a
significant time saver, but not a replacement for an in-depth review by a human.&lt;/p&gt;
&lt;p&gt;The same pattern can be applied to SQL. If you&amp;rsquo;re dealing with a lot of nested
subqueries, CTEs (Common Table Expressions) or someone who treats SQL as their
favourite programming language, then Copilot can help you untangle the logic.
It&amp;rsquo;s no replacement for trying to understand the code yourself and it&amp;rsquo;s not
always going to be 100% correct, but it&amp;rsquo;s nice as a second opinion. I expect
this functionality will also improve with time.&lt;/p&gt;
&lt;h5 id="ask-copilot-to-suggest-improvements"&gt;&lt;a class="heading-anchor" href="#ask-copilot-to-suggest-improvements" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Ask Copilot to Suggest Improvements&lt;/h5&gt;
&lt;p&gt;On a similar note, I can select some code and ask Copilot to suggest
improvements. This may bring up some points which I had not previously
considered. Again, it is not a replacement for the human review, but I imagine
this could find issues which may get glossed over otherwise, based on who is
reviewing the code.&lt;/p&gt;
&lt;p&gt;Taking this one step further, I can ask Copilot for code suggestions before
submitting my own code for review. This can catch issues before we start the
code review feedback loop. The more I can prevent a lot of back and forth in a
code review, the better placed I am to get it merged quickly. So this could be a
time saver as well.&lt;/p&gt;
&lt;h4 id="improve-copy"&gt;&lt;a class="heading-anchor" href="#improve-copy" aria-label="Permalink to this section"&gt;#&lt;/a&gt;Improve Copy&lt;/h4&gt;
&lt;p&gt;Copilot can suggest improvements to documentation or even plain web site copy.
When I tried this, the suggestions were a clear improvement, turning awkward
turns of phrase into something more easily readable. This can be useful in the
proofreading phase, especially for non-native English speakers. (I have no idea
how it performs in other languages.) I do often come across technical blog posts
where the author&amp;rsquo;s language skills get in the way of the point they are trying
to make. This could be a very useful tool in that case.&lt;/p&gt;
&lt;h3 id="thats-a-wrap"&gt;&lt;a class="heading-anchor" href="#thats-a-wrap" aria-label="Permalink to this section"&gt;#&lt;/a&gt;That&amp;rsquo;s a Wrap&lt;/h3&gt;
&lt;p&gt;There is a lot of concern about the explosion of AI and I think that these
discussions are generally good to have, even if I am not going to get into that
here. As far as some of my other successful experiments, there are still a number I
did not even get to today. One of my most positive experiences has been with
using AI to sell items on Kijiji, but there is too much to explore there. Maybe
that&amp;rsquo;s a subject for another day.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve made it this far, thanks for sticking with me on this meandering
journey &amp;ndash; it has been an enjoyable ride.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/"&gt;Read on website&lt;/a&gt;&lt;/p&gt;</content:encoded><media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://www.olafalders.com/2024/02/29/github-copilot-chat-first-impressions/featured.jpeg"/></item></channel></rss>