<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title>dtg</title><id>https://example.com/feed.xml</id><subtitle>Recent Posts</subtitle><updated>2026-10-15T19:24:52Z</updated><link href="https://example.com/feed.xml" rel="self" /><link href="https://example.com" /><entry><title>Emacs as an Agentic Coding Environment</title><id>https://example.com/emacs-as-an-agentic-coding-environment.html</id><author><name>Dylan Gleason</name></author><updated>2026-10-15T14:51:00Z</updated><link href="https://example.com/emacs-as-an-agentic-coding-environment.html" rel="alternate" /><content type="html">&lt;p&gt;After evaluating and using agentic coding tools for the better part of
the year, and now finally integrating them into my development
workflow, the most salient question inevitably came to mind: how do I
make this work in &lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;Emacs&lt;/a&gt;?&lt;/p&gt;
&lt;h2&gt;Background: My Emacs Journey&lt;/h2&gt;
&lt;p&gt;I am an Emacs lifer. Other than Notepad or TextEdit, I can't recall
using another editor before it, and it was &lt;em&gt;the&lt;/em&gt; editor I wrote my
first line of code in. Since picking up Emacs, I've seen numerous
editors and IDEs over the years, but none of them stuck with me or
interested me as much as Emacs.&lt;/p&gt;
&lt;p&gt;I can't place the exact date, but my journey with Emacs started back
in the late aughts. Unsurprisingly, my first encounter with it
coincided with my first experience using Linux. Back then—I think it
was in 2008 or 2009—the netbook craze was in full swing, so I bought
an Asus EEE PC on a lark, then quickly discovered how underpowered it
was running the preinstalled OEM version of Windows 7. I decided to
give Linux a try and installed &lt;a href=&quot;https://xubuntu.org/&quot;&gt;Xubuntu&lt;/a&gt;, which
was suitable for my low-spec netbook.&lt;/p&gt;
&lt;p&gt;My main machine at the time was a 1st gen Intel Macbook Pro, which I
bought in 2006. I was using it primarily for digital audio projects,
and though I wasn't yet into programming, my interest in audio
technology brought me within close proximity to it. Later, influenced
by a fellow audio technology enthusiast, programmer, and friend, I
eventually started using
&lt;a href=&quot;https://supercollider.github.io/&quot;&gt;SuperCollider&lt;/a&gt;, which opened up an
entirely new world to me.&lt;/p&gt;
&lt;p&gt;After installing Xubuntu on my netbook, my first order of business was
to install SuperCollider and continue my audio experiments
there. However, SuperCollider, being primarily a MacOS focused
project, did not ship their SCIDE integrated development environment
to Linux. The only two options were Vim and—you guessed it—Emacs. For
better or for worse (some might say worse… and they might have
a point 😅), I chose Emacs.&lt;/p&gt;
&lt;p&gt;The rest, as they say, is history.&lt;/p&gt;
&lt;h2&gt;Using Claude Code and Codex CLIs with Vterm&lt;/h2&gt;
&lt;p&gt;Back to the topic at hand. My first attempt at integrating Claude and
ChatGPT found me running Claude Code and Codex (respectively) using
&lt;a href=&quot;https://github.com/akermu/emacs-libvterm&quot;&gt;vterm&lt;/a&gt;, a modern terminal
emulator for Emacs. On second thought… allow me one more,
brief diversion into Emacs terminals before we get into vterm.&lt;/p&gt;
&lt;h3&gt;A Brief Technical Note on Emacs Terminals&lt;/h3&gt;
&lt;p&gt;Proper terminal emulation has long been considered the missing link
for Emacs users wanting to do everything from within Emacs, as most of
the available options are pretty limited.&lt;/p&gt;
&lt;p&gt;For example, the built-in
&lt;a href=&quot;https://github.com/emacs-mirror/emacs/blob/master/lisp/term.el&quot;&gt;term&lt;/a&gt;
is written in Emacs Lisp, which runs in a single thread. It creates a
shell sub-process that in turn allocates a pseudo terminal for
receiving and interpreting shell commands. Emacs handles user input,
which it then parses and sends as a string to the sub-process.&lt;/p&gt;
&lt;p&gt;From there, an event handler function called a &lt;em&gt;process filter&lt;/em&gt;
handles output generated by the sub-process. Roughly, the process
filter:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;processes each byte, one at a time, transforming each byte into an Emacs text object,&lt;/li&gt;
&lt;li&gt;applies faces for color and styling,&lt;/li&gt;
&lt;li&gt;updates the cursor position, handles scrolling, etc.,&lt;/li&gt;
&lt;li&gt;then renders the output to the buffer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is slow when compared to a purpose-built terminal emulator app,
which can take advantage of multiple operating system threads and are
designed to stream large volumes of text quickly. Terminal emulator
apps also implement a much larger subset of terminal escape codes than
&lt;code&gt;term&lt;/code&gt;, so they are much better suited to running rich TUI
applications like Claude Code or Codex.&lt;/p&gt;
&lt;h3&gt;Enter Vterm&lt;/h3&gt;
&lt;p&gt;Emacs vterm, which is itself based on &lt;a href=&quot;https://www.leonerd.org.uk/code/libvterm/&quot;&gt;libvterm&lt;/a&gt;,
addresses a lot of these issues.  In short, it gets around the
limitations of Elisp terminals by delegating emulation to an efficient
C library, which Emacs loads as a &lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/elisp/Dynamic-Modules.html&quot;&gt;dynamic module&lt;/a&gt;.
Vterm fully controls parsing of terminal escape codes and maintains
the state of the terminal, tracking whether the virtual terminal screen
needs to be updated and periodically writing updates in batches to the
Emacs buffer.&lt;/p&gt;
&lt;p&gt;It's about as smooth of a terminal emulation experience as you're
likely to get from within Emacs.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;To install vterm, I first needed to install a number of dependencies
described in the &lt;code&gt;README&lt;/code&gt; From there, adding the dependency via
&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_mono/use-package.html&quot;&gt;use-package&lt;/a&gt;
is as simple as the following bit of elisp:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package vterm
  :ensure t)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From there, it is just a matter of firing up a terminal and running
Claude or Codex as one normally would.&lt;/p&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;While this generally works well enough, it wasn't long before some
annoyances started to appear. For example, Claude seems to use the
&lt;code&gt;/tui fullscreen&lt;/code&gt; setting by default, and while this works great in a
dedicated terminal emulator app, it causes problems in Emacs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vterm scrollback doesn't work. while this isn't a problem for native
terminals, this doesn't really work with vterm due to Claude Code's
alternate screen buffer design.&lt;/li&gt;
&lt;li&gt;claude's scrollback is limited to 2000 lines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The alternative that I landed on was to just use the &lt;code&gt;/tui default&lt;/code&gt;
setting, which at least allows me to scroll back—although, even there,
I need to enable &lt;code&gt;vterm-copy-mode&lt;/code&gt; if Claude is in the middle of
writing something, as vterm will automatically scroll to newly written
output. Additionally, to avoid quickly exhausting the scrollback
limit, I needed to update my config accordingly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package vterm
  :ensure t
  :init
  ;; Increase max scrollback so it isn't quickly exhausted
  ;; for longer sessions.
  (setq vterm-max-scrollback 100000))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are still yet other annoyances, for example redrawing issues
causing line heights to shift and seemingly lose focus on prompt
inputs, among others. This seems to happen quite often when resizing
the window containing the vterm buffer, and it creates an absolute
visual mess.&lt;/p&gt;
&lt;p&gt;It seemed like there has to be something else out there.&lt;/p&gt;
&lt;h2&gt;More Bells and Whistles with Claude Code IDE&lt;/h2&gt;
&lt;p&gt;By the time I arrived at &lt;a href=&quot;https://github.com/manzaltu/claude-code-ide.el&quot;&gt;Claude Code IDE&lt;/a&gt;
for Emacs, I was using Claude Code for the majority of my agentic
coding &amp;quot;needs&amp;quot;, and was hoping to find a solution that addressed many
of the problems I encountered using the vanilla vterm and claude setup I
described earlier. From the &lt;code&gt;README&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Claude Code IDE for Emacs provides native integration with Claude
Code CLI through the Model Context Protocol (MCP). […]
Transforms Claude into a true Emacs-aware AI assistant that works
within your existing workflow and can interact with your entire
Emacs ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sounds promising.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Installing Claude Code IDE via &lt;code&gt;use-package&lt;/code&gt; is also straightforward:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package claude-code-ide
  :ensure t
  :vc (:url &amp;quot;https://github.com/manzaltu/claude-code-ide.el&amp;quot; :rev :newest)
  :bind ((&amp;quot;C-c '&amp;quot; . claude-code-ide-menu))
  :config
  (claude-code-ide-emacs-tools-setup))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note, since the package is not available via MELPA, I have to
explicitly set the version control host and point it at the author's
Github repository. I've also added a key binding to bring up the IDE
menu, which uses &lt;a href=&quot;https://github.com/magit/transient&quot;&gt;Transient&lt;/a&gt;.
Also, in order to enable MCP integration between Emacs and Claude, I
instruct Emacs to evaluate the &lt;code&gt;claude-code-ide-emacs-tools-setup&lt;/code&gt;
function after the &lt;code&gt;claude-ide-package&lt;/code&gt; loads.&lt;/p&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Claude Code IDE definitely improves upon the vanilla vterm setup I
described earlier.&lt;/p&gt;
&lt;p&gt;The first thing I noticed after starting a new session interactively
via &lt;code&gt;claude-code-ide&lt;/code&gt;, Emacs opens and displays a vterm buffer running
Claude in a side window, and it shows the current file I am visiting,
which is a nice touch.&lt;/p&gt;
&lt;p&gt;The automatic layout Claude Code IDE chooses is not ideal on my 14&amp;quot;
laptop, as it occupies most of the Emacs frame. Adjusting via
&lt;code&gt;(enlarge|shrink)-window-horizontally&lt;/code&gt; works, but this still seems to
intermittently cause the redrawing issues mentioned above.&lt;/p&gt;
&lt;p&gt;Also, since I am used to hiding buffers with &lt;code&gt;delete-window&lt;/code&gt;,
&lt;code&gt;delete-other-window&lt;/code&gt; etc, which don't work in this setup, I instead
invoke the &lt;code&gt;claude-code-ide-menu&lt;/code&gt; function interactively and use the
&lt;code&gt;w&lt;/code&gt; key to quickly toggle the side window. This is just a minor
workflow adjustment, and the transient menu is nice enough that this
isn't a major issue for me.&lt;/p&gt;
&lt;p&gt;Some of the more interesting bits with this setup is the MCP
integration with Emacs, which allows Claude to interact with various
Emacs capabilities from within Claude Code. Querying Claude code about
those capabilities, it shows the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;| Tool                       | Use it for                                  |
|----------------------------|---------------------------------------------|
| `imenu-list-symbols`       | Outline of a file: functions, headings      |
| `xref-find-references`     | Where an identifier is used                 |
| `xref-find-apropos`        | Search symbols by pattern                   |
| `treesit-info`             | Tree-sitter syntax tree at a spot in a file |
| `project-info`             | Project root and metadata from project.el   |
| `mcp__ide__getDiagnostics` | flycheck/flymake errors and warnings        |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For example, running &lt;code&gt;project-info&lt;/code&gt; at the prompt (notably, it is not
a slash command) reports various info regarding the project, including
the project root, and the number of files contained within the
project. Neat.&lt;/p&gt;
&lt;p&gt;Prompting Claude to run &lt;code&gt;xref&lt;/code&gt; for a file within an Elixir project I
am working in doesn't yield much:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;|   Tool                    | Query            | Result                                    |
|---------------------------|------------------|-------------------------------------------|
| `xref-find-references`    | `compare_answer` | No references found                       |
| `xref-find-apropos`       | `batchim`        | One hit: korean.ex:125, `def has_batchim?`|
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In my tests, Claude cannot detect whether the Emacs language server is
running, so I tell them that eglot is indeed running. Claude suggests
that the MCP tool itself is problematic, so I ran
&lt;code&gt;xref-find-references&lt;/code&gt; for the &lt;code&gt;compare_answer&lt;/code&gt; function from within
the buffer containing the relevant file, with eglot running, and sure
enough it found many references to it in other project files. It seems
like this particular MCP tool is not quite there yet, unless I am
doing something wrong (which is probable).&lt;/p&gt;
&lt;p&gt;That said, I don't think I would use many of these tools via a Claude
query anyway. If I am running &lt;code&gt;xref-find-references&lt;/code&gt; or
&lt;code&gt;imenu-list-symbols&lt;/code&gt;, I am most certainly doing that from within the
source code buffer as I am bopping around the code.&lt;/p&gt;
&lt;p&gt;I do like the idea of using a transient interface to interact with the
Claude process, and it is nice to be able to send a prompt from within
the minibuffer to get around the usual multiline prompt annoyances (I
always forget to use &lt;code&gt;C-j&lt;/code&gt; instead of &lt;code&gt;Shift+Return&lt;/code&gt;). But a lot of
the problems with vterm and claude I described above still exist here,
and the split between the transient interface and the claude terminal
buffer creates a workflow that feels a bit disjoint.&lt;/p&gt;
&lt;p&gt;Overall, though, it is a net improvement over the previous solution. I
also understand that, supposedly, the &lt;a href=&quot;https://codeberg.org/akib/emacs-eat&quot;&gt;Eat&lt;/a&gt;
terminal emulator provides a better experience with Claude Code IDE
when compared to vterm, particularly with regard to the line-wrapping
woes I experienced with the latter. But I have yet to try it out.&lt;/p&gt;
&lt;h2&gt;Local Coding Agents with Ollama and Aidermacs&lt;/h2&gt;
&lt;p&gt;While settling into a reasonable workflow with Claude Code IDE, I also
wanted to explore local LLMs for agentic coding. Armed with a new
Macbook Pro with 24GB of RAM, I figured it was time to give it a try.&lt;/p&gt;
&lt;p&gt;The first solution I explored for a local LLM setup was
&lt;a href=&quot;https://aider.chat/&quot;&gt;Aider&lt;/a&gt;, an agentic coding application written in
Python. It supports both cloud-based backends like Claude, as well as
local models hosted via &lt;a href=&quot;https://ollama.com/&quot;&gt;Ollama&lt;/a&gt;, or apparently
any other model that supports an OpenAI compatible API. And,
naturally, there is an Emacs project called
&lt;a href=&quot;https://github.com/MatthewZMD/aidermacs&quot;&gt;Aidermacs&lt;/a&gt;, which integrates
Aider with Emacs.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;First, I needed to install Aider, per the docs:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-command&quot;&gt;python -m pip install aider-install
aider-install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, as per usual, I installed aidermacs via &lt;code&gt;use-package&lt;/code&gt;. Since I
wanted to use aider with a local Ollama server, I specify a hook
function to tell aider where the Ollama API base URL is located:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package aidermacs
  :ensure t
  :bind ((&amp;quot;C-c a&amp;quot; . aidermacs-transient-menu))
  :hook
  ((aidermacs-before-run-backend . (lambda ()
                                     (setenv &amp;quot;OLLAMA_API_BASE&amp;quot; &amp;quot;http://localhost:11434&amp;quot;)))))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aidermacs implements a simple shell written in Emacs Lisp using
&lt;a href=&quot;https://www.gnu.org/software/emacs/manual/html_node/emacs/Shell-Prompts.html&quot;&gt;Comint&lt;/a&gt;
mode. While certainly not as fast as vterm, it is not meant to be a terminal
emulator and it doesn't need to be. It feels a lot more Emacs-y a
result. Aidermacs also exposes a transient interface, similar to
Claude Code IDE, which I found myself using a quite a bit when adding
files to the agent's context (this becomes important when dealing with
local models and context length limitations; more on that below).&lt;/p&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;Ultimately, the headaches of dealing with Aidermacs really had little
to do with Aidermacs as such, and more to do with working with highly
constrained, under-resourced local model. I had to do a lot of tuning
so that it was &amp;quot;usable&amp;quot; for agentic coding (which is to say, barely,
at least outside of smaller, tightly constrained tasks).&lt;/p&gt;
&lt;p&gt;By default, Ollama's &lt;a href=&quot;https://docs.ollama.com/context-length&quot;&gt;context length&lt;/a&gt; term
is very small for anything less than 24 GB of GPU addressable RAM;
with my 24 GB of unified memory the context is limited to 4k tokens,
so the model I was working with, &lt;code&gt;qwen3-coder:30b&lt;/code&gt;, would keep showing
me an error like this after every prompt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Empty response received from LLM. Check your provider account?

Tokens: 1.6k sent, 0 received.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basically the context is exhausted and the model sends back an empty
reply. I was able to resolve this issue specifying the &lt;code&gt;num_ctx&lt;/code&gt;
parameter in the &lt;code&gt;.aider.conf.yaml&lt;/code&gt; for the project:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;model: ollama_chat/qwen3-coder:30b
  extra_params:
    num_ctx: 32768 # This can be set globally via `OLLAMA_CONTEXT_LENGTH`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trying again, the fans really started to kick into high gear on my
laptop. I noticed the Aidermacs shell prompt just kept spinning, but
when inspecting the Ollama server via &lt;code&gt;ollama ps&lt;/code&gt;, there was no
Qwen3-Coder process running. I checked the activity monitor and it
showed resident memory nearly maxed out. Since I neglected to inspect
the Ollama logs, it wasn't clear what Ollama was up to, whether it was
attempting to read/write swap or something else entirely—but my system
started slowing to a crawl so I was desperately trying to kill the
Ollama server process. Oops.&lt;/p&gt;
&lt;p&gt;On a subsequent attempt, I tried a more reasonable value of 16,384
tokens. The system no longer falls over, though the CPU still works
very hard. The results are fine, but nothing to get too excited about.&lt;/p&gt;
&lt;p&gt;That said, it does seem OK for very simple things. A unit test here, a
short shell script there. The other day I had it write a simple
waveform plotter, which worked out reasonably well, even though it
used Matplotlib instead of the GNU Plot, despite instructing it to use
the latter. 🤦&lt;/p&gt;
&lt;p&gt;With respect to Aidermacs as such, an interesting workflow
consideration is that Aider tightly integrates with Git and therefore
assumes you want to use Git. If the directory you are working in
doesn't contain a Git repo, it will ask you to create one. It also
automatically commits every change. If a particular commit doesn't
really do what it says it does, which seems to be the norm when
working with local LLMs, you're gonna be typing the &lt;code&gt;/undo&lt;/code&gt; command a
lot. While you can disable auto-commits, the Aider documentation
recommends against it.&lt;/p&gt;
&lt;p&gt;Given my frustrations with the local LLM output and my mild irritation
at Aider's opinionated workflow preferences, I put Aidermacs down for
a bit and retreated to Claude's warm embrace. And for this next,
albeit brief, phase, I stopped experimenting and decided to use a
setup that was a bit more familiar.&lt;/p&gt;
&lt;h2&gt;Terminal Emacs with Ghostty, Tmux and Claude Code&lt;/h2&gt;
&lt;p&gt;OK, I let Claude dictate the process in this brief, Emacs GUI-less
interregnum. But I went with a reliable, well-worn solution: cracking
open a good, proper terminal emulator in &lt;a href=&quot;https://ghostty.org/&quot;&gt;Ghostty&lt;/a&gt;, dusting off my
&lt;a href=&quot;https://github.com/dylangleason/dotfiles/blob/master/dot_config/tmux/tmux.conf&quot;&gt;tmux config&lt;/a&gt;,
and running Emacs and Claude in separate tmux windows. Hey, it
works—and font rendering and terminal colors in Ghostty look pretty
dang good. But still, after about a solid week using this setup, I
found myself longing for GUI Emacs. Surely, there's got to be
something else I can try, in my never-ending quest for Emacs
glory…&lt;/p&gt;
&lt;h2&gt;Agent-shell and a Unified Emacs Experience&lt;/h2&gt;
&lt;p&gt;After hearing from a fellow Emacs user and their own experience going
through a similar journey, they recommended that I look at
&lt;a href=&quot;https://github.com/xenodium/agent-shell&quot;&gt;agent-shell&lt;/a&gt;, so I did
precisely that.&lt;/p&gt;
&lt;p&gt;From the README, Emacs agent-shell is billed as&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A native Emacs shell to interact with LLM agents powered by ACP
(Agent Client Protocol).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rather than relying on a vendor-specific TUI, agent-shell uses ACP;
ACP is to agents what LSP (Language Server Protocol) is to programming
languages. In other words, it solves the problem of each editor having
to implement custom integrations for various agents, as long as the
client and the API server used to interact with the agent implement
the protocol.&lt;/p&gt;
&lt;p&gt;Like Aidermacs, &lt;code&gt;agent-shell&lt;/code&gt; uses the familiar comint to implement
it's shell functionality, and it also supports a transient interface
for interaction, so we're in familiar Emacs territory.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;For Claude Code, I needed to install an separate, external
&lt;a href=&quot;https://github.com/agentclientprotocol/claude-agent-acp&quot;&gt;ACP client&lt;/a&gt;
to interact with the Claude Code agent. Via &lt;code&gt;npm&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-command&quot;&gt;npm install -g @agentclientprotocol/claude-agent-acp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As per usual, I then installed the package via my Emacs init file:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-elisp&quot;&gt;(use-package agent-shell
  :ensure t
  :config
  ;; Uses login-based authentication by default
  (setq agent-shell-anthropic-authentication
        (agent-shell-anthropic-make-authentication :login t)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Seeing that &lt;code&gt;agent-shell&lt;/code&gt; supports multiple different models, I also
wanted to test it with my local LLM setup, which is exposed via the
OpenCode ACP client, which I install via my package manager:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-command&quot;&gt;sudo port install opencode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Some additional configuration is required to make it work with Ollama,
by adding the latter as provider to the OpenCode configuration at
&lt;code&gt;~/.config/opencode/opencode.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  &amp;quot;$schema&amp;quot;: &amp;quot;https://opencode.ai/config.json&amp;quot;,
  &amp;quot;permission&amp;quot;: {
    &amp;quot;edit&amp;quot;: &amp;quot;ask&amp;quot;,
    &amp;quot;bash&amp;quot;: &amp;quot;ask&amp;quot;,
    &amp;quot;webfetch&amp;quot;: &amp;quot;allow&amp;quot;
  },
  &amp;quot;provider&amp;quot;: {
    &amp;quot;ollama&amp;quot;: &amp;quot;qwen3-coder:30b&amp;quot;,
    &amp;quot;npm&amp;quot;: &amp;quot;@ai-sdk/openai-compatible&amp;quot;,
    &amp;quot;options&amp;quot;: {
      &amp;quot;baseURL&amp;quot;: &amp;quot;http://localhost:11434&amp;quot;
    },
    &amp;quot;models&amp;quot;: {
      &amp;quot;qwen3-coder:30b&amp;quot;: {
        &amp;quot;name&amp;quot;: &amp;quot;Qwen3-Coder 30b&amp;quot;
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A dummy API key also needs to be configured, apparently:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;{
  &amp;quot;ollama&amp;quot;: {
    &amp;quot;type&amp;quot;: &amp;quot;api&amp;quot;,
    &amp;quot;key&amp;quot;: &amp;quot;ollama&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With my configuration in place, I am ready to go.&lt;/p&gt;
&lt;h3&gt;Testing&lt;/h3&gt;
&lt;p&gt;While I haven't spent too much time with &lt;code&gt;agent-shell&lt;/code&gt;, I am already
feeling like this is possibly the best solution for me, at least for
now. Similar to Aidermacs, the comint-based shell and transient
interface gives it a distinctly Emacs feel. Naturally, I spent most of
my time with the Claude ACP client, and it worked wonderfully.&lt;/p&gt;
&lt;p&gt;In particular, the shell felt comfortable and interactive enough
without feeling cluttered. Tool prompts are rendered in the shell as
buttons, which can either be clicked (useful for graphical Emacs) or
executed via single key bindings. For example, when the agent writes
code and proposes a change, it presents an option to view the diff. If
I click the &lt;code&gt;v&lt;/code&gt; key, I am presented with an easy to read diff that I
can accept or reject. And, like Aidermacs, the output isn't prone to
weird text rendering issues and line height shifts as seen in vterm.&lt;/p&gt;
&lt;p&gt;I also had a bit more luck running local agents this time around when
pairing &lt;code&gt;qwen3-coder:30b&lt;/code&gt; with the OpenCode provider. While it is
still a far cry from Claude Code, I tuned my Ollama configuration well
enough by this point that it worked OK for smaller coding tasks. To be
clear, this has little to do with &lt;code&gt;agent-shell&lt;/code&gt;. And, at least until
either my hardware or the technology improves, I think I will continue
to get better use out of local LLMs when using them as chat
interfaces, e.g. with &lt;a href=&quot;https://github.com/s-kostyaev/ellama&quot;&gt;Ellama&lt;/a&gt;,
rather than as coding agents.&lt;/p&gt;
&lt;p&gt;Still, like Aidermacs, it's nice to know that I can use both local and
other LLMs with this solution. If I want to spin up a Claude Code or
Codex session alongside a local one, it's as easy as invoking
&lt;code&gt;agent-shell&lt;/code&gt; interactively (or the &lt;code&gt;agent-shell-help-menu&lt;/code&gt;) and
starting another session with the desired provider. Unlike Aidermacs,
it also doesn't assume I want to use Git for every project.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;For a long-time Emacs user such as myself, there are now a lot of
options for working with coding agents without leaving the confines of
Emacs.&lt;/p&gt;
&lt;p&gt;While vterm paired with the Claude Code CLI is a perfectly workable
solution, the small annoyances with terminal emulation within Emacs
started to grate. Aidermacs seemed like a good alternative, given its
comint and transient style interface, but my frustration getting it to
work using local LLMs and it's opinionated workflow constraints
steered me away.&lt;/p&gt;
&lt;p&gt;After a brief return to running Emacs side-by-side with Claude Code
via Ghostty and tmux, I found Agent Shell, which, like Aidermacs, can
integrate with multiple LLM providers and uses a more Emacs native
feel. Unlike Aidermacs, it doesn't impose a Git-centric workflow and
the shell itself is a bit more interactive and user friendly.&lt;/p&gt;
</content></entry><entry><title>False Starts and New Beginnings</title><id>https://example.com/false-starts-and-new-beginnings.html</id><author><name>Dylan Gleason</name></author><updated>2026-07-10T10:55:00Z</updated><link href="https://example.com/false-starts-and-new-beginnings.html" rel="alternate" /><content type="html">&lt;p&gt;Well, after a good deal of thought, we've decided to relocate to South
Korea. My partner and I have been talking about it for years, but we
never seriously considered it, until recently.&lt;/p&gt;
&lt;p&gt;Like many Americans (or, at least those that have been paying
attention), I was partially motivated by the re-election of DJT, and
more importantly what that portends for our democratic republic. And
while I readily admit to being a pessimist, &lt;a href=&quot;https://www.npr.org/2026/02/16/nx-s1-5705955/us-autocracy-concerns-grow&quot;&gt;things do not look
great&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But there were more practical concerns. Chief among them: my partner
wanted to be closer to family. Also, when we made our decision, I was
in the midst of a long unemployment cycle and there was no clear sense
of when I would be able to find stable employment, unlike previous
cycles. While we were able to cover mortgage payments and other
expenses during my partner's busy season, things would get more
difficult once her busy season ended.&lt;/p&gt;
&lt;p&gt;We talked about what it might be like to cohabitate with &lt;em&gt;eomeoni&lt;/em&gt; (my
mother-in-law), since finding an apartment on our income was not going
to be realistic, at least not for the foreseeable future. Assuming
that arrangement would work for everyone, my partner ran through the
numbers, and came to the conclusion that life in South Korea would be
more affordable. Health insurance is cheaper, exchanges rates are
favorable, and the cost of food and transportation are generally more
affordable (although how long that will last, &lt;a href=&quot;https://www.chosun.com/english/industry-en/2026/06/20/U5SE2IPX75GOTNEY56PYKAZWU4/&quot;&gt;who
knows&lt;/a&gt;…).
Plus, if we could sell our house, that would give us a significant
financial buffer while I search for employment.&lt;/p&gt;
&lt;p&gt;Shortly after my partner's busy season ended, I somehow managed to
land an offer for a fully remote Senior Software Engineer position in
the US. It was a bit of a downgrade salary-wise compared to my last
role, but it was an exciting opportunity, and it seemed to be a great
fit. Even so, we decided to move forward with our plans to
relocate. Though I was unsure if I could make it work with my new
employer, having some income to finance our move in the interim was
definitely going to help, so I decided to take the offer. Two months
later… well, suffice it to say, it didn't end up working out.&lt;/p&gt;
&lt;p&gt;Obviously this came as a disappointment, since I worked very hard to
search for my new job, and I was finally starting to get my footing
and contribute meaningfully. Plus, the job market for software
engineers seems to be getting &lt;a href=&quot;/posts/job-search-2026.html&quot;&gt;more competitive&lt;/a&gt;
by the day, not just in the US but also in South Korea. But, such is
life, I guess. Time to start thinking about the next thing.&lt;/p&gt;
&lt;p&gt;I only have a vague idea about what that &amp;quot;next thing&amp;quot; is, and I am not
entirely sure what's in store for me and my family as we start our new
life in South Korea. My feelings on this big life change contain a
mixture of apprehension, excitement, sadness, but also—dare I
say—&lt;em&gt;optimism&lt;/em&gt;.&lt;/p&gt;
</content></entry><entry><title>Top 5 Guitarists of All Time (Or, Just Those I Am Listening to Now)</title><id>https://example.com/top-5-guitarists-of-all-time-or-just-those-i-am-listening-to-now.html</id><author><name>Dylan Gleason</name></author><updated>2026-05-31T21:39:00Z</updated><link href="https://example.com/top-5-guitarists-of-all-time-or-just-those-i-am-listening-to-now.html" rel="alternate" /><content type="html">&lt;p&gt;The other day, a good friend of mine asked me over the group chat who
my &amp;quot;Top 5 Favorite Guitarists of All Time&amp;quot; are. Since answering that
question is impossible, I am instead going to name the first five
guitarists I could think of based on songs I have been listening to
recently. So, keeping that recency bias in mind, here they are (in no
particular order), some of my favorite guitarists:&lt;/p&gt;
&lt;h1&gt;George Benson&lt;/h1&gt;
&lt;p&gt;Most listeners will recognize George Benson from his 1976 smash hit
&lt;a href=&quot;https://www.youtube.com/watch?v=G1QjyskJ9jw&quot;&gt;&amp;quot;Breezin'&amp;quot;&lt;/a&gt;, which helped
usher in the smooth jazz era and for a time was a fixture of
supermarket background music heard across America (alongside Chuck
Mangione's &lt;a href=&quot;https://www.youtube.com/watch?v=YKp7g0mxHVc&quot;&gt;&amp;quot;Feels So Good&amp;quot;&lt;/a&gt;). But don't get it
twisted—George Benson is a certified guitar hero. I am most familiar
with his output on CTI records, because records released on that label
were very easy to find on the second-hand market back when I was
collecting a lot of vinyl. Here is one such song from his 1976 album,
&lt;a href=&quot;https://www.discogs.com/master/52449-George-Benson-Bad-Benson&quot;&gt;&lt;em&gt;Bad Benson&lt;/em&gt;&lt;/a&gt;,
called &amp;quot;The Changing World&amp;quot; (hip-hop fans may also recognize this
one):&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/FiSeub38_Oc&quot; title=&quot;YouTube Video Player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;Scott Henderson&lt;/h1&gt;
&lt;p&gt;I first heard Scott Henderson by way of The Chick Corea Elecktric
Band, specifically their eponymous
&lt;a href=&quot;https://www.discogs.com/master/61748-The-Chick-Corea-Elektric-Band-The-Chick-Corea-Elektric-Band&quot;&gt;debut album&lt;/a&gt;.
And while credit goes to Carlos Rios for the guitar work on my
favorite song on that album, &lt;a href=&quot;https://www.youtube.com/watch?v=gPLH6D9XT_4&quot;&gt;&amp;quot;Cool Weasel Boogie&amp;quot;&lt;/a&gt;,
Henderson contributed some fantastic guitar work on that album as
well. That said, the latter is probably more well known for his output
with his band, Tribal Tech. Their 1987 track &amp;quot;Mr. Hee&amp;quot; is a standout,
with it's mysterious Eastern (albeit somewhat Orientalist—check the album
cover) feel, glassy FM keyboards, and phenomenal lead and rhythm guitar work
by Henderson.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/W6XVi-o-QCg&quot; title=&quot;YouTube Video Player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;Chuck Schuldiner / Andy LaRocque&lt;/h1&gt;
&lt;p&gt;OK, I am kinda cheating on this one because I've listed two guitarists
here. But bear with me, because both are integral to the amazing
guitar work heard on Death's &amp;quot;Trapped In A Corner&amp;quot;, from the 1993
album &lt;a href=&quot;https://www.discogs.com/master/15932-Death-Individual-Thought-Patterns&quot;&gt;&lt;em&gt;Individual Thought Patterns&lt;/em&gt;&lt;/a&gt;.
Death was essentially Schuldiner's project, with various players
drifting in and out of the rotation over the years. King Diamond's
Andy LaRocque makes a guest appearance here, offering a jaw-dropping
solo at the track's midpoint, accompanied by Chuck's potent,
syncopated riffing. Chuck adds his own blistering solo to close out
the proceedings. This really represented the apex of technical death
metal and guitar pyrotechnics at the time, and it remains to this day
a classic of the genre.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/wH56VOptIDI&quot; title=&quot;YouTube Video Player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;Wes Montgomery&lt;/h1&gt;
&lt;p&gt;Arguably the best jazz guitarist of all time, Wes Montgomery's
influence on both jazz and generations of guitarists is undeniable. In
particular, I love his solo on the Gary McFarland penned &amp;quot;13 (Death
March)&amp;quot;, which appears on the 1968 collaborative album
&lt;a href=&quot;https://www.discogs.com/master/33174-Jimmy-Smith-Wes-Montgomery-Jimmy-Wes-The-Dynamic-Duo&quot;&gt;&lt;em&gt;Jimmy &amp;amp; Wes: The Dynamic Duo&lt;/em&gt;&lt;/a&gt;
album, co-starring Hammond B3 virtuoso Jimmy Smith. Wes' guitar solo
is a masterful demonstration of musical restraint and melodic
phrasing, and his octave vamps are instantly recognizable.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/bLoIMAoFgDw&quot; title=&quot;YouTube Video Player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h1&gt;Tony MacAlpine&lt;/h1&gt;
&lt;p&gt;I listened to a lot of shredders when I was in high school, back when
I was (somewhat) seriously pursuing guitar. Naturally, I listened to
Yngwie Malmsteen, Steve Vai, Joe Satriani, and Tony MacAlpine. And of
course, Eddie Van Halen and Randy Rhoads were both huge influences on
my musical education. That said, outside of Eddie &amp;amp; Randy, I don't
really listen to those guys that much anymore, but I do find myself
going back to Tony MacAlpine regularly. While he can obviously
shred like nobody's business, more importantly, he writes good songs
with interesting melodies. As far as albums go, I think
&lt;a href=&quot;https://www.discogs.com/master/243403-Tony-MacAlpine-Maximum-Security&quot;&gt;&lt;em&gt;Maximum Security&lt;/em&gt;&lt;/a&gt;
is probably his most cohesive and consistent effort from his eighties
hair metal phase. But if I had to name one song, it would be &amp;quot;Stream
Dream&amp;quot;, off of 1992's &lt;a href=&quot;https://www.discogs.com/master/423193-Tony-MacAlpine-Freedom-To-Fly&quot;&gt;&lt;em&gt;Freedom To Fly&lt;/em&gt;&lt;/a&gt;.
It is such a euphoric, energetic, and wonderful song. Also, it totally
reminds me of console games I played growing up in the 90s, imbuing it
with a nostalgic quality that brings me a lot of comfort.&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/F2HFP2aSr7Y&quot; title=&quot;YouTube Video Player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
</content></entry><entry><title>Job Search 2026</title><id>https://example.com/job-search-2026.html</id><author><name>Dylan Gleason</name></author><updated>2026-04-21T13:20:00Z</updated><link href="https://example.com/job-search-2026.html" rel="alternate" /><content type="html">&lt;p&gt;After roughly 4 months of searching for a software engineering job,
I've come away with a few observations, along with some other stray
thoughts that seem worth sharing, regarding my personal experience in
current job market.&lt;/p&gt;
&lt;h2&gt;Specialists Over Generalists&lt;/h2&gt;
&lt;p&gt;As a software generalist, my skills are all over the map. I have
worked in startups mostly, in various languages, and in different tech
stacks. My polyglot, &amp;quot;jack of all trades, master of none&amp;quot; background
seems particularly ill-suited to this very competitive market.&lt;/p&gt;
&lt;p&gt;Though I am searching for backend &lt;em&gt;product&lt;/em&gt; engineering roles, because
I am also looking primarily at companies that require Go programming
skills, most of the open Go roles I've seen are focused more on
&lt;em&gt;platform&lt;/em&gt; engineering. This makes sense, as Go is a language that is
particularly well suited to a lot of platform engineering
tasks. Typically, these roles require a fair amount of experience with
container orchestration technologies, in particular Kubernetes. Since
I don't have a ton of professional experience with Kubernetes, I am
finding trouble positioning myself with hiring managers for these
types of roles.&lt;/p&gt;
&lt;p&gt;While I have some experience in web operations and &amp;quot;DevOps&amp;quot; more
broadly (CI/CD, automation and the like) and full-stack development,
my skills are not current enough or specialized enough to be seriously
considered for these types of roles.&lt;/p&gt;
&lt;h2&gt;Tech Stack Alignment / &amp;quot;What Have You Done for Me Lately&amp;quot;&lt;/h2&gt;
&lt;p&gt;At the other end of the spectrum, I interviewed for a role to lead a
development team writing code for a monolithic Ruby on Rails
application. Here, too, I failed to pass muster. Per a former
colleague, who was kind enough to refer me to the hiring manager, I
learned that one of the main reasons for my rejection was because I
didn't have &lt;em&gt;recent&lt;/em&gt; experience with Rails, despite the fact that I
had shipped successful solutions to production using Ruby on Rails in
the past.&lt;/p&gt;
&lt;p&gt;On the other hand, for a platform engineer role I applied to, I was
able to get a screening call based on adding
&lt;a href=&quot;https://temporal.io/&quot;&gt;Temporal&lt;/a&gt; and &lt;a href=&quot;https://nats.io/&quot;&gt;NATS&lt;/a&gt;
experience on my resume from my most recent role. So it seems like
tech stack alignment and recency in that tech stack is particularly
important now.&lt;/p&gt;
&lt;h2&gt;Technical Screens&lt;/h2&gt;
&lt;p&gt;I encountered most of the usual suspects for technical screens, but
also one new format that I hadn't experienced (more on that
below). Notably, companies appear to be utilizing pre-interview
screening assessments more frequently than in past interview cycles.&lt;/p&gt;
&lt;h3&gt;LeetCode… Yay&lt;/h3&gt;
&lt;p&gt;Of course, there are your LeetCode style assessments. These were
always annoying, and are now even more so, in part due to rampant
&lt;a href=&quot;https://tech.yahoo.com/articles/cheating-tech-interviews-soaring-managers-080901006.html&quot;&gt;AI-assisted cheating&lt;/a&gt;
and interview fraud making the experience worse for everyone. What
this translates to in practice is use of proctored tests. In one
such test, I had to turn my camera on, solve a sequence of contrived
algorithm problems, and explain my thought process throughout. The test
proctor didn't interact with me outside of warning me when time was
almost up. Then there are the ones where you have to use Codility
or CodeSignal or any of the other enumerable web editors with
automated test harnesses and the like. The unifying theme here is no
interlocutor to bounce ideas off of or converse with. Not fun.&lt;/p&gt;
&lt;h3&gt;Pair-Programming? Yay!&lt;/h3&gt;
&lt;p&gt;One company I interviewed with for a senior engineer role conducted
the interview using a structured pair-programming format. I was asked
to implement an API endpoint for an inventory system, optimizing for
read performance and integrating with a SQL database. I discussed how
I would test it, scale it, and how it could be extended for future
requirements. In other words, it focused on a real-world engineering
problem. Fun, actually!&lt;/p&gt;
&lt;h3&gt;The &amp;quot;Take-Home&amp;quot;&lt;/h3&gt;
&lt;p&gt;Then, there are your so-called &amp;quot;take-home&amp;quot; projects. While I often
enjoy these for the sake of learning, they tend to be a big time-sink
and tend to have a low success rate. The ones that do get through, I
end up spending at least double the amount of time stated to solve the
problem. As an interview format, it feels too squishy and subject to
the whims and biases of the person reading the code to be worthwhile,
but I know a lot of people prefer these to the live coding interview
format.&lt;/p&gt;
&lt;h3&gt;Uh...&lt;/h3&gt;
&lt;p&gt;That leaves the weirdest one: a cognitive aptitude test. Specifically,
the &lt;a href=&quot;https://www.criteriacorp.com/candidates/ccat-prep&quot;&gt;Criteria Cognitive Aptitude
Test&lt;/a&gt; (CCAT), which
I guess is a thing some companies are asking candidates to do now? I
hate any and all standardized tests, so I opted out of this one,
especially since the remainder of the interview process was going to
be a gauntlet anyway.&lt;/p&gt;
&lt;h3&gt;Screen &amp;amp; Roll&lt;/h3&gt;
&lt;p&gt;While unfortunate, I can see why companies use pre-interview technical
screens when trying to vet hundreds of candidates for a single role
(did I mention that the job market stinks?). Still, I am finding I
have less tolerance for these types of assessments, especially the
older I get, and the more automated and impersonal they become. I
always go back and forth on whether I should opt out of these
entirely, but I will probably continue to do them, contiuning my
transformation into a 21st century digital
&lt;a href=&quot;https://www.newyorker.com/culture/infinite-scroll/will-ai-trap-you-in-the-permanent-underclass&quot;&gt;lumpenproletariat&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The Elephant in the Room&lt;/h2&gt;
&lt;p&gt;Generative AI is the new wrench thrown into the interviewing
experience, at least for me. When I have been lucky to get an
interview with a real human and (even luckier still) get deep enough
into the interview process to learn about how the team uses AI, it
seems most teams are still figuring it out.&lt;/p&gt;
&lt;h3&gt;AI in Technical Interviews&lt;/h3&gt;
&lt;p&gt;From the standpoint of technical interviews, most companies I have
interviewed with thus far did not allow use of AI tools. In fact, most
seemed wholly uninterested in evaluating how I personally use these
tools. However, there was one company that specifically encouraged the
use of coding agents for their take-home challenge.&lt;/p&gt;
&lt;p&gt;That particular challenge involved quite a few moving parts, and it
was time-boxed to 2 to 3 hours, so it seemed like a good opportunity
to get practice with Codex. I used the latter to write the tests and
the code, using a TDD-based approach, as well as steering and design
documentation to guide implementation, the latter of which I wrote.&lt;/p&gt;
&lt;p&gt;I am not really sure what the correct approach here was, but it
evidently wasn't mine, as I was told upon rejection that it was not
&amp;quot;robust&amp;quot; enough for a senior role. Despite completing the stated
objective and implementing tests validating the requirements, the code
quality was… unremarkable. Perhaps another coding agent such as
Claude Code would have produced higher quality output, but I could
nonetheless see their point. Moving on.&lt;/p&gt;
&lt;h3&gt;AI in Practice&lt;/h3&gt;
&lt;p&gt;Among the hiring managers and devs for the roles I interviewed with,
there was no clear consensus on how to effectively use AI as part of
their business or engineering process. However, there were some common
themes. For example, all indicated challenges reviewing AI-generated
code at scale and defining governance for agentic workflows. Most I
talked to seemed to be taking a tactical and measured adoption of its
use, which seemed like a good sign that (at least this relatively
small sample of) teams are not totally cargo culting AI. One hiring
manager described AI succinctly: AI is a &amp;quot;force multiplier&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Where Have All the Junior Engineers Gone?&lt;/h2&gt;
&lt;p&gt;Speaking of junior engineers, it seems many of these same companies
are no longer hiring junior talent and are hiring senior and staff
engineers exclusively. It's hard to tell how much of this dislocation
is due to AI or due to existing trends (based on experience from my
most recent roles, I have seen fewer juniors and less emphasis on
mentorship overall). There's a lot to parse in the current AI
discourse right now, and how this informs hiring practices of junior
talent I am not sure, but it is notable.&lt;/p&gt;
&lt;p&gt;&amp;quot;We don't have the time to teach someone who is just starting out&amp;quot;,
&amp;quot;we need to hit the ground running&amp;quot;, &amp;quot;we aren't able to do a lot of
hand-holding&amp;quot; …are some of the responses I've heard. The ones
that do have junior engineers on their team, unsurprisingly, call out
mentorship explicitly in job descriptions.&lt;/p&gt;
&lt;h2&gt;The Dreaded Job Gap Question&lt;/h2&gt;
&lt;p&gt;I was laid off in October, and spent two months on garden leave, until
my employment officially ended in December. I put on my resume that my
most recent role ended in October, which in hindsight was probably a
mistake. Almost everyone has asked me what I have been doing since
October. In the past, I've only been out of work around 3 months max
and have never been asked this, but it seems to be a concern this time
around. Perhaps this is reflective of the very risk-averse / buyer's
market mentality of the current software job market.&lt;/p&gt;
&lt;p&gt;On a similar note, another hiring manager grilled me on why most of my
roles have been fewer than 3 years in length. I generally try to give
a generic answer like &amp;quot;due to external factors beyond my
control&amp;quot;—which is true for all but a few roles, by the way—and
redirect the conversation by expressing my desire for a long-term
position. But, when probing the circumstances around my departure from
one particular company, the hiring manager seemed incredulous that I
should be laid off given the seeming importance of my role. Fair
enough, I guess. Sometimes you aren't gonna please people.&lt;/p&gt;
&lt;h2&gt;Miscellaneous&lt;/h2&gt;
&lt;h3&gt;Recruiters&lt;/h3&gt;
&lt;p&gt;The recruiting experience is still about the same, though it seems
like ghosting is noticeably more severe this time around. I generally
expect ghosting from recruitment agencies by default, but even a
number of in-house recruiters have failed to follow up after having
gone through an interview. I suspect this is due mostly to
disorganization and trying to juggle multiple (perhaps dozens) of
candidates for various roles at a time, but it still isn't a great
feeling to be ghosted. And of course this says nothing about LinkedIn
&lt;a href=&quot;https://www.forbes.com/sites/technology/article/how-to-spot-and-avoid-linkedin-scams/&quot;&gt;recruitment scams&lt;/a&gt;
and other fake job postings out there.&lt;/p&gt;
&lt;h3&gt;Hiring Managers&lt;/h3&gt;
&lt;p&gt;Hiring managers seem to be a lot pickier this time around as well,
which aligns nicely with the aforementioned &amp;quot;crappy job market&amp;quot; theme
I've been rolling with. For base qualifications, they seem to want the
sun and the moon, even for contract roles. If I manage to get an
interview with the hiring manager, they are pretty
hit-and-miss. Sometimes I knock it out of the park, other times it
becomes evident that they have no interest.&lt;/p&gt;
&lt;p&gt;Though I usually do quite well on behavioral or &amp;quot;culture fit&amp;quot;
interviews, there's at least one question I get asked that I don't
have catalogued in my memory bank of
&lt;a href=&quot;https://resources.biginterview.com/behavioral-interviews/star-interview-method/&quot;&gt;STAR&lt;/a&gt;
method stories. Then I stumble, forget details, go down rabbit holes,
only to pause my nervous gesticulating to take note of the hiring
manager's vacant stare, as they absent-mindedly tab through their web
browser (I caught one yawning, too. Ouch.).&lt;/p&gt;
&lt;h3&gt;Interview Preparation&lt;/h3&gt;
&lt;h4&gt;Behavioral&lt;/h4&gt;
&lt;p&gt;Speaking of STAR method stories and GenAI, I have been using the
latter to good effect to help me refine the former. Typically, these
stories need to be delivered within a minute and with utmost
clarity—and I have found LLMs are pretty decent when editing for
clarity, especially when the language is interview-ese.&lt;/p&gt;
&lt;h4&gt;System Design&lt;/h4&gt;
&lt;p&gt;For system design interviews, I have been re-reading sections of
&lt;a href=&quot;https://dataintensive.net/&quot;&gt;&lt;em&gt;Designing Data-Intensive Applications&lt;/em&gt;&lt;/a&gt;
and have also been using LLM chatbots to help brush up on certain
technical topics. For example, I had an interview where a hiring
manager hinted that the system design portion of the interview might
be to implement a leaderboard or a chat system. Prior to the
interview, I used ChatGPT to structure system design interview
questions on these topics, then I walked through my solutions,
discussed my approach and tradeoffs, and then requested feedback.&lt;/p&gt;
&lt;h4&gt;Live Coding&lt;/h4&gt;
&lt;p&gt;For two different backend Go roles, I was asked to do live coding
assessments, and I wanted to try and anticipate what kinds of
questions each interviewer might ask. One recruiter indicated the
interviewer for one role was interested in someone who had a firm
grasp of relational databases, in particular someone who knew how to
write efficient queries. Another indicated that I would likely be
asked a concurrency related problem. Similar to the system design
task, I enlisted ChatGPT's help to design a test harness for several
different scenarios in each domain, and in each case I asked it to
produce a program that I could play around with to test.&lt;/p&gt;
&lt;p&gt;For RDBMS stuff, I designed a basic order and shipments system, I then
prompted ChatGPT to generate a script for quickly migrating and
seeding the database with enough data to demonstrate query efficiency,
then had it implement queries for things like keyset pagination,
aggregations, choosing appropriate indexes to improve efficiency as
the data scaled, as well as common Go / SQL interop patterns.&lt;/p&gt;
&lt;p&gt;For the concurrency related interview, I again prompted ChatGPT to
generate examples for different types of workflows using goroutines
and channels, including fan-in / fan-out pipelines, workloads using
write vs read-write mutexes, and so on. I then asked it to wrap
examples in a convenient little CLI executable that accepted flag
arguments for testing the various scenarios. All of this in a matter
of seconds. Neat!&lt;/p&gt;
&lt;h4&gt;No LeetCode Grind&lt;/h4&gt;
&lt;p&gt;I didn't grind any LeetCode. While I have done so in years past, I can
rarely ever motivate myself to do so, and this time was no exception.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;For all the rapid changes in software each new year, it is striking
how little the software engineer interview process has changed.&lt;/p&gt;
&lt;p&gt;Even the oft-hyped &amp;quot;AI&amp;quot; hasn't really seemed to make much of an impact
on the interview process overall, except to perhaps make it slightly
more annoying. On the other hand, my own use of LLMs for interview
preparation has been somewhat fruitful.&lt;/p&gt;
&lt;p&gt;Either way, it seems that employers are mostly doubling down on
existing tech interview processes; there are just more of them,
they're more difficult, and more time-consuming.&lt;/p&gt;
&lt;p&gt;But, for every 10 annoying multi-round gauntlets, there are always a
few gems here and there. And, it's generally a good opportunity to
improve my skills and clarify my strengths, weaknesses and career
goals.&lt;/p&gt;
</content></entry><entry><title>Intro</title><id>https://example.com/intro.html</id><author><name>Dylan Gleason</name></author><updated>2026-04-07T16:20:00Z</updated><link href="https://example.com/intro.html" rel="alternate" /><content type="html">&lt;p&gt;Hi there. This is my first blog post. Or, to be more accurate, my first
&lt;em&gt;published&lt;/em&gt; blog post.&lt;/p&gt;
&lt;p&gt;The idea of a personal blog has been knocking around in my head for a
while, and the code base for this website has been gestating
since 2021. As in 2021, the primary impetus for starting a blog is the
sudden abundance of time I've been granted due to recent unemployment.&lt;/p&gt;
&lt;p&gt;I suppose a bit of an explanation is in order. I was laid off late
last year, just prior to concluding a rather large project for a major
casino and resort company. While there, I helped build a fairly
complex web backend for a real-money online casino. The work was equal
parts challenging, frustrating, and illuminating, and I definitely
learned a lot. Alas, for reasons beyond my control, said company
closed my division in October and I now find myself in that familiar
place again.&lt;/p&gt;
&lt;p&gt;But, I digress. The real reason I wanted to write today was to
introduce myself and this blog. So without further ado:&lt;/p&gt;
&lt;p&gt;My name is Dylan and, as you may have inferred from the above, I am a
software engineer. As such, I will likely be writing about software
engineering, technology and related topics.&lt;/p&gt;
&lt;p&gt;But, to be honest with you, it may also serve as a vehicle for me to
talk about life and bitch about the current state of the world. Which
is to say: I may also write about current events and politics from
time to time. So if you &amp;quot;don't do politics&amp;quot;, consider yourself warned.&lt;/p&gt;
&lt;p&gt;With that said, I hope to write a new post at least once a month.
Though I am not holding myself to such a commitment, I think I can
manage.&lt;/p&gt;
&lt;p&gt;Until next time…&lt;/p&gt;
</content></entry></feed>