The Care and Feeding of Chatbots, Part 2: Building the Rest of Your Instruction Files
Posted: May 18, 2026 Filed under: Uncategorized Leave a commentComing soon…
The Care and Feeding of Chatbots
Posted: May 18, 2026 Filed under: Uncategorized | Tags: AI, Artificial Intelligence, chatbots, chatgpt, technology Leave a commentPart 1: Common Misses, or Teaching AI What Not to Waste Your Time With

TL;DR
I used AI to help write and refine this article, which seems fair given the subject. The point isn’t that AI should replace your thinking. The point is that AI works better when you give it durable context, clear constraints, and a list of things you already know you don’t want.
This is Part 1 of The Care and Feeding of Chatbots, a series about using reusable instruction files for everyday AI use. The broader idea of using “vault files” isn’t mine — I picked it up from Allie K Miller. The specific “Common Misses” name and concept came from Claude during one of my own experiments. What I’m sharing here is how I’m applying those ideas in practice.
This first piece introduces COMMON_MISSES.md: a file for capturing the suggestions, assumptions, formats, and defaults that usually miss the mark.
Part 2 will cover the rest of the instruction-file framework: what other files are useful, what belongs in them, and why most of the important stuff isn’t what people expect.
Most AI advice still sounds like it was written for someone using ChatGPT for the first time. Write better prompts. Be specific. Give it more context. That’s not wrong, but it’s incomplete — and it misses the actual problem most regular AI users have, which isn’t how to ask one good question. It’s how to make AI work consistently across many conversations, many tasks, and many moods, including the moods where you can’t be bothered to write a perfect prompt because it’s Tuesday night and you’re already tired of everything.
Software developers have already started solving a version of this. Modern agentic coding tools rely on small instruction files that tell the tool how to behave inside a project. Claude Code reads CLAUDE.md. Codex reads AGENTS.md. Copilot reads copilot-instructions.md. These files aren’t glamorous, but they’re often the difference between a coding assistant that works within your project and one that confidently wanders into the woods, invents a second architecture, and explains that this is “more scalable.”
The developer community figured out pretty quickly that you can’t just tell an AI tool “You’re an expert software engineer” and trust that the model knows what that means in your codebase, with your build process, your testing standards, your naming conventions, your security requirements, your legacy baggage, and your one file that everybody’s afraid to touch. So we started writing things down.
Instruction files usually contain a bunch of “do this” and “don’t do that” guidance, often organized under headings like Code Quality, Unit Testing, Architecture, Security, Pull Request Standards, or Things We Tried in 2021 and Will Not Be Repeating For Legal and Spiritual Reasons. The point isn’t that Markdown files are magical. The point is that reusable context matters. If you want an AI assistant to produce consistent work, you can’t expect every conversation to start from zero.
That same idea applies outside of code.
Most people, including software developers, still treat general chatbot conversations like disposable one-offs. We open the app and ask something like “Where’s a good place to eat tonight?” That sounds simple, except the chatbot has no idea what “good” means. Good for who? Good how? Cheap? Quiet? Open late? Won’t require a reservation?
This is where a lot of AI use quietly falls apart. The answer might be technically reasonable and still useless. The chatbot gives you a list. The list contains options. The options aren’t insane. But none of them fit you, your constraints, your energy level, your existing tools, your actual schedule, or the thing you were really trying to avoid.
You can solve that once by writing a better prompt. You can say, “I’m tired, it’s a weeknight, I don’t want to drive far, I don’t want anything spicy, I don’t want a place that requires reservations, and I need something that won’t make me regret being alive tomorrow morning.” That’ll probably get you a better answer. Once. Then the next time you ask, you get to type the whole thing again. And again. And again.
Even when AI tools have memory, custom instructions, projects, profiles, or workspace settings, they still benefit from explicit, durable guidance. Memory can help. Custom instructions can help. Project context can help. But they aren’t a substitute for having a clear written model of what the AI should consistently consider, avoid, prioritize, or ask about.
That’s where I think instruction files become useful — not necessarily as literal files in every tool, but as a portable framework for reusable context. One of the files I use in my own version of this approach is called COMMON_MISSES.md.
What Is Common Misses?
COMMON_MISSES.md is a file I tell chatbots to read before they work with me. It contains examples of past responses, habits, assumptions, formats, and suggestions that usually don’t work well for me. Not because those things are universally bad, but because they’re bad for how I work, how I think, or what I’m usually trying to accomplish.
A few examples from my own file:
- Don’t ask multiple clarifying questions at once. Pick one.
- Don’t bullet-point every response. Some things are better as sentences.
- Weigh suggestions against my likely energy level, time of day, and whether tomorrow is a workday. I’m not going hiking at 9pm on a Tuesday.
- Don’t recommend tools that require a new account, new service, or new subscription without asking whether I want to add to my existing stack.
This isn’t about making the chatbot “nice.” It’s about making it useful. A chatbot that knows what not to do can often be more helpful than one trying to guess the perfect thing to do.
That may sound negative at first. A file full of “don’t do this” and “avoid that” can seem like a strange way to improve creativity. But in practice, it often works better than trying to define the ideal answer upfront. The number of things you might want is enormous. The number of things you already know you’ll reject is usually much smaller.
That’s what makes “common misses” valuable. They’re reusable filters. They remove the obvious bad fits before the conversation spends energy on them.
Personal Example: Dinner, or Why You Keep Ordering Takeout
Say it’s Tuesday night and you need to figure out what to cook. You open your usual recipe sites. You scroll. You bookmark three things. You make none of them. Then you order takeout for the fourth time this week and pretend this was always the plan.
Or maybe you ask a chatbot for dinner ideas. It gives you recipes that all assume you have fresh herbs, a clean kitchen, emotional stability, and 90 minutes of available time. You pick the least bad option. Halfway through, you realize you’re missing two ingredients, one of the steps says “meanwhile, make the reduction,” and somehow you’re now eating pasta with whatever was in the fridge.
This is exactly where COMMON_MISSES.md helps. Instead of asking the chatbot to magically know what you want, you tell it what to filter out before it starts suggesting things.
For example:
- No recipes with more than ten ingredients.
- No recipes over 45 minutes.
- No recipes requiring a separate trip to a specialty store.
- No recipes using techniques I’ve never tried before.
- No recipes whose first instruction is “the night before, marinate…”
That last one should be illegal on weeknights.
The chatbot doesn’t need to know exactly what you’re hungry for. Half the time, you don’t know exactly what you’re hungry for. What it needs to know is what you’ll reject immediately.
The list of disqualifiers is short. The list of “perfect recipes for me tonight” is essentially infinite, changes by mood, depends on what’s in the fridge, and is why you keep ending up with DoorDash. Filtering out the obvious misses first isn’t glamorous. But it works.
Professional Example: Dependency Selection, or Future You Hates Present You
The same idea applies at work.
Say you’re adding a feature and need a library. Maybe you need to parse JSON in some unusual format. Maybe you need authentication, image processing, PDF generation, logging, charting, scheduling, or one of those deceptively simple tasks that starts with “surely there’s a package for this” and ends three days later in a GitHub issue from 2018.
You ask the AI what library to use. It suggests the popular one. You install it. You ship the feature. You move on.
Six months later, you find out the library has a known unpatched CVE. Or it’s maintained by one person who just changed jobs. Or the original package is dead and everyone quietly moved to a fork. Or it pulled in fifty transitive dependencies and now your bundle size has developed ambitions. Congratulations. You saved twenty minutes and purchased a future incident.
This is another place where a “common misses” file earns its keep. Instead of asking the AI to find the “best” library from scratch, tell it what kinds of libraries shouldn’t even make the first cut.
For example:
- No libraries with unpatched critical CVEs.
- No libraries with only one active maintainer.
- No libraries that haven’t had a meaningful commit in the last six months.
- No libraries that pull in a large dependency tree without a strong reason.
- No libraries with licenses incompatible with the project.
- No libraries that have been effectively replaced by a community-blessed alternative.
The chatbot doesn’t need to magically know the perfect library before the conversation starts. It needs to keep the bad candidates off your desk.
That’s the boring work you don’t want to repeat every time you add a dependency. Most of these checks are security and maintenance concerns you don’t really want to think about every time, but you do want handled. Once those options are filtered out, then you can have the more useful conversation: Which library fits this project? Which one matches the team’s style? Which one is easiest to maintain? Which one will future-you hate the least?
That’s where AI can actually help. But only after the rejection list has done its job.
Why “Don’t Do This” Is More Useful Than It Sounds
A lot of COMMON_MISSES.md is negative language. Don’t do this. I don’t want that. No tools like this. Avoid suggestions that assume that.
At first, that can feel backward. Shouldn’t we tell the chatbot what we do want? Sometimes, yes. But the problem is that the number of potentially good answers is enormous, while the number of known deal-breakers is usually manageable.
Most of us are open to a wide range of options except for a handful of things we already know won’t work. We have foods we hate. Tools we don’t want to use. Formats that annoy us. Suggestions that sound good in theory but collapse immediately when exposed to a normal Tuesday. Workflows that look elegant in a demo and then die when they meet an actual legacy system, an actual budget, or an actual human being with 23 minutes before their next meeting.
So name the deal-breakers. Write them down. Give the chatbot the list of things you’re likely to reject anyway. That doesn’t make the conversation rigid. It makes it more efficient. You’re not telling the chatbot to stop being creative. You’re telling it not to waste its creativity on things you already know are wrong for you.
That’s the simple reason this works. There’s a second reason, and it’s the more important one.
A rejection list isn’t only a filter. It tells the chatbot which dimensions actually matter to you. Once it knows what you reject, it knows what to ask about. The conversation gets sharper because the chatbot has a much better idea of which clarifying questions are worth asking and which would waste your time.
Without a rejection list, a chatbot asking what kind of dinner you want defaults to obvious dimensions: cuisine, dietary restrictions, prep time. Those are sometimes the right questions, but usually they aren’t — by the time you’ve answered them, you’re still nowhere closer to dinner. With a rejection list, the chatbot already knows you’ve ruled out long prep times, complicated techniques, and specialty-store ingredients. The remaining dimensions are different. The question becomes “what’s your energy level tonight, and do you want one of your usual rotations or something new within those constraints?” That’s a question that actually helps you decide.
Pair the rejection list with another standing instruction — something like “ask a clarifying question when current conditions might change the answer” — and the chatbot’s questions get noticeably better. Instead of suggesting “why don’t you go for a hike?” at 9pm on a weeknight, it might ask “do you have to work tomorrow, and how much energy do you actually have right now?” And depending on the answer, it might correctly suggest you stream The Lord of the Rings and fall asleep somewhere around Rivendell.
The Bigger Point
COMMON_MISSES.md isn’t magic. It doesn’t turn a chatbot into a trusted advisor, senior architect, personal chef, therapist, business consultant, or dependency auditor. What it does is simpler and more useful: it gives the chatbot a list of ways not to waste your time.
That matters because many bad AI responses aren’t wildly wrong. They’re slightly wrong in ways that make them useless. Too generic. Too eager. Too formal. Too verbose. Too dependent on tools you don’t use. Too optimistic about your available time, energy, patience, budget, or willingness to create another account.
A good “Common Misses” file helps remove those answers before they land. And once the obvious misses are gone, the actual conversation gets better.
This is where I think a lot of practical AI use is headed. Not toward everyone becoming a prompt engineer, and not toward every problem being solved by a giant enterprise platform. The useful middle ground is reusable context: durable instructions, known constraints, recurring preferences, and clear rejection rules.
In other words, the same basic lesson developers are learning from agentic coding tools applies much more broadly. If AI is going to be part of everyday work, we need better ways to tell it how we work.
COMMON_MISSES.md is one file in a larger framework I’ve been building: a set of instruction files that do for everyday chatbot conversations what AGENTS.md, CLAUDE.md, and copilot-instructions.md do for coding agents.
Because if we’re going to keep inviting these tools into more of our work and our personal lives, we should probably stop making them guess who we are every time.
Next time, I’ll get into the rest of that framework: what other instruction files are useful, what belongs in them, and why most of the important stuff isn’t what people expect.
The Care and Feeding of Chatbots, Part 2: Building the Rest of Your Instruction Files
Learning to Run a Local LLM
Posted: October 5, 2025 Filed under: AI, Learning, LLM, Software Development | Tags: AI, Artificial Intelligence, linux, LLM, Software Engineering, technology Leave a commentA few days ago, I decided it was time to start getting hands-on with local LLMs, so I installed Ollama and dove in. At first, it was great. Simple install, intuitive workflow, clean command-line interface. I was off and running. Then I came back to it today… and found that my setup wasn’t working. So began a day-long reminder that “learning” often looks a lot like “debugging”.
For the first few hours, I was convinced local LLMs were going to change how I work. Running models locally with no APIs, no rate limits, and full control over data felt empowering. Everything worked exactly the way the docs said it would. Then the next day, I opened my terminal, ran the same command, and nothing happened. No error, no response. Just a blinking cursor daring me to figure it out.
Diagnosing the hang
I started troubleshooting the way any developer does: open multiple terminals, compare outputs, and start narrowing down variables. When “ollama run” hung and “ollama ps” showed no active models, I knew something wasn’t connecting. After walking through the logs (and burning through a few chatbot sessions for second opinions), I finally traced it back to something simple but non-obvious: Git Bash. Turns out “ollama run” needs a fully interactive terminal, and Git Bash on Windows doesn’t play nicely with Windows executables. The fix was straightforward once I knew what was happening: wrap the Ollama command in “winpty“, which acts as a bridge between Linux-style terminals and Windows-native programs.
echo "alias ollama='winpty ollama'" >> ~/.bashrc
source ~/.bashrc
That little alias solved it and, in the process, it taught me a lot more about how Bash interacts with Windows than I expected to learn that day.
Rediscovering the fundamentals
Even after years of working in development, it can be frustrating to find things that I don’t know I don’t know. This was one of those moments. I’ve spent most of my career in C# and Visual Studio where I know what I’m doing. While working on hobby projects and expanding my knowledge base, I consistently find I need to learn and relearn things I’d never really learned as a Windows user stuck in a Windows world (like what sudo actually does, why >> appends text to files, and how source ~/.bashrc immediately applies your changes without restarting). Digging into Bash reminded me how different the mindset is between GUI-based and shell-based workflows, and how valuable it is to stay fluent in both.
The GPU detour
Once I had Ollama working, I noticed my CPU was maxed out during inference. That sent me down another rabbit hole: GPU acceleration. After a bit of research, I learned my system’s AMD Radeon 780M isn’t supported for GPU inference on Windows. AMD’s ROCm framework only works on Linux, and even then, not reliably with integrated GPUs. I spun up WSL2 with Ubuntu to see if I could make it work there… and it did, technically, but still CPU-only. Lesson learned: hardware support for local AI is still very NVIDIA-centric.
Looking ahead
For now, Ollama runs perfectly fine on CPU. It’s slower, sure, but it’s stable, and that’s what matters when you’re learning the ropes. The bigger takeaway isn’t just about Ollama. It’s about understanding how Windows, Bash, WSL, and the GPU driver layer all fit together. It’s the kind of problem that doesn’t just teach you “how to fix it,” but “how it works.”
Next up, I may eventually invest in a proper dev machine with a dedicated NVIDIA GPU.
Until then, I’ll keep experimenting, learning, and sharing what I find.
Weather Monitor Project Progress
Posted: September 19, 2025 Filed under: Uncategorized | Tags: Artificial Intelligence, Career Growth, Data Science, Software Development, Weather Forecasts Leave a comment
From Backyard to Bytes: Why I’m Tracking My Own Weather
A couple of weeks ago, I posted on LinkedIn that I’ve started a project to track local weather patterns in my neck of the woods. I made this post for several reasons:
- I told my wife I’d work on said project.
- I had, indeed, started such a project. In fact, I started it over a month ago, shortly after purchasing and setting up my own weather station.
- I wanted to gain more experience in developing open-source applications. Historically, I’ve been a Microsoft tools guy, for better or worse. I have more thoughts about this, but I’ll reserve those for later. The point is, I want to branch out to other tech stacks, and starting my own personal project is one of the best ways I can think of to do this.
- With the rise of several AI tools for “vibe-coding” or “prompt engineering” (or what I would term “exploratory development”), undergoing such a project would be significantly sped up.
- I figured it would look good in my experience (on both LinkedIn and in my resume).
Tip for Job Seekers
It turns out that people really like seeing project posts. I hadn’t anticipated the responses I’d receive simply by stating that I’ve started working on it. If you’re in between jobs and looking for a new employer, I highly recommend starting and posting about a project. LinkedIn makes a distinction between employers that’ve hired you and projects you’ve worked on, and you can explicitly add a “projects” section to your profile. My personal preference is to work on a project that’s meaningful to you, but perhaps contributing to an existing open-source project might be more doable for you.
How It Began
My wife and I recently decided to move back to our favorite part of the country, the Pacific Northwest. At the same time, we both took an interest in growing our own food. Although we’re still new to the idea, we got advice that the area we were moving to likely has its own micro-climate, which can be tricky to forecast. I purchased and set up my own weather station to assist in tracking the weather more accurately.
After seeing that the weather in my region had indeed diverged not only from the official forecasts we were watching but also diverged from other actual readings near us, I decided to start tracking the results digitally. Eventually, I figure I’ll have enough data recorded that I could produce my own more accurate forecasts, hyper-focused on the couple of acres my house sits on.
How It’s Going
With the help of a few favorite AI chatbots, I created a Node.js application that would scrape historical readings and forecasts from WeatherUnderground. It then stores the results in a PostgreSQL database, hosted by Neon.tech. Most recently, I uploaded the code to a GitHub repo and set up an action to run it automatically every day. After working out some of the kinks and bugs produced by AI, I had a couple of weeks of data to start analyzing.
My next step is to use the data I’ve collected and build a mobile app that will crunch it and spit out its observations. I already know SQL pretty well, so I can help guide it to create meaningful queries, but I’m also interested in seeing what an LLM can produce on its own. For this step, I’ll be looking to create a self-hosted local LLama or other GPT. Not that I’m too concerned about privacy (I kind of am), but more because I want the learning experience of hosting my own LLM.
This weather monitor project started as a simple idea: to better understand the micro-climate of my little corner of the Pacific Northwest. But more than that, it’s a chance to explore new technologies, to learn by doing, and to share that journey with others. Along the way, I’ve also rediscovered the joy of building something from scratch and scratching my own itch.
If you’re on the fence about starting an AI-assisted coding project, let this be your nudge. What’s the question you want to answer or the problem you want to solve? Share your progress, embrace the detours, and don’t underestimate the value of putting your work out there. Who knows? Your side project might just spark a conversation, land you a job, or even help you grow better produce.
I’ll post more as this project progresses. Follow me here or on LinkedIn if you’re curious to see where it goes. And if you’re working on something similar (or wildly different), I’d love to hear about it!
Software Developer Learning Resources (Revisited)
Posted: September 18, 2025 Filed under: Uncategorized | Tags: Ai Assisted Learning, Learning Strategy, Productivity, Self Education, Software Development Leave a comment
TL;DR:
AI tools like ChatGPT now complement (and often speed up) traditional learning. For technical topics, skim books for depth, take quick notes, and use AI for instant answers and step‑by‑step help — just ensure you have a basic foundation first. For non‑technical books, let AI summarize, extract key actions, and build habit‑tracking aids. Combining books with AI gives faster mastery and more career opportunities.
A few weeks ago I dug up an old blog post of mine from 2015 — Software Developer Learning Resources. At the time, I’d essentially said:
“For me, most online courses are hit or miss. I learn by playing with things until I get that ‘aha’ moment, and a book lets me do that perfectly — I can read, pause, experiment, and re‑read at my own pace. Trying to do the same with a video just leads to the frustrating ‘skip‑forward, skip‑back’ game where I waste time and lose my context. Most of the time, a book is just a better use of my time.”
Back then that made perfect sense. Today, however, the landscape has shifted dramatically thanks to AI assistants like ChatGPT, Claude, Gemini, Copilot, and a host of other specialized coding agents. If I were to rewrite that post now, I would foreground AI as the primary catalyst for learning, while also distinguishing between strategies of technical and non‑technical reading material.
AI is reshaping software development, but rather than making the craft obsolete, it actually speeds up the learning curve. By integrating AI tools into study routines, mastering new concepts can be achieved even faster, opening more career doors.
Technical Books — When to Reach for Them (and When Not To)
There’s still a place for a well‑written technical book. A solid textbook can be a pleasant way to spend an afternoon, and its structured chapters, detailed indexes, and comprehensive references make it a reliable fallback when you need depth. Yet, in a world where a single line of code can be generated or explained in seconds, the cost‑benefit balance has tilted.
- Speed matters. Modern developers often need an answer now — sometimes within a minute. Instead of thumbing through chapters, I first scan the table of contents, jump to the relevant section, or use the PDF’s search function.
- Active note‑taking. While reading, I dog‑ear pages, highlight passages, and copy the most useful snippets into a Notion workspace. This creates a personal “lookup” library that I can query later with a quick search (and/or use an AI agent to act upon).
- AI as a deep‑dive partner. When I already have a rough mental model of a topic, I fire up a chatbot for a more nuanced explanation. For instance, I once pasted an error I was seeing in Neon.tech’s SQL editor, “ERROR: must be owner of table forecasts (SQLSTATE 42501)”, into a chat session. The bot responded with a step‑by‑step remediation guide, linked the official Neon documentation, and even suggested a small script to verify permissions. The result was a solution I could apply immediately — something that would have taken me at least ten minutes of manual Googling.
Caveat: If you start from zero, the AI’s answer can feel like a wall of jargon. A basic grounding in the subject (even a quick skim of a chapter) helps you evaluate whether the suggestion is sound or needs tweaking.
Non‑Technical Books — Let AI Do the Heavy Lifting
Reading for personal growth doesn’t have to be a marathon. Imagine you want to absorb How to Win Friends & Influence People but only have a couple of spare hours. An AI can:
- Summarize the core ideas in a concise paragraph, preserving the author’s tone while stripping out filler.
- Generate actionable items — for each principle, the bot can draft a short “to‑do” list you can tick off as you practice the skill.
- Build a habit tracker. With a few prompts you can have the assistant scaffold a tiny web app or a Zapier Zap that nudges you daily to reflect on your interactions and record progress.
In short, AI turns a dense, time‑intensive read into a series of bite‑size, immediately applicable insights.
Bottom Line
My old rule of using books over videos still holds water for me, but it’s no longer the whole story. AI has become the bridge between the static knowledge locked in books and the dynamic, on‑demand assistance we need in modern development workflows. My current recommendations are:
- Use books as a deep reference and a source of curated, vetted information.
- Pair them with AI to surface the right page instantly, flesh out explanations, and generate practical artifacts (notes, scripts, habit trackers).
- Stay grounded in the fundamentals before leaning heavily on AI; a solid base lets you spot errors and ask better questions.
By weaving AI into both technical and non‑technical learning, you can accelerate mastery, stay current, and ultimately unlock more opportunities in your software‑development career.
Bonus: My thoughts on SwiftRead
I’d be remiss if I didn’t mention that I’ve evaluated both traditional speed-reading and the more modern “SwiftRead” in an attempt to quickly absorb information. For me, neither has worked well. SwiftRead works slightly better than traditional speed-reading, but it’s still not a win for me. I was curious why that is, so I asked an AI chatbot. Its response was quite informative. In particular, items 1, 2, and 6 are very applicable to me.
Here’s the chatbot’s full response:
SwiftRead (or speed-reading tools in general) might not work well for you for a few common reasons. Here are the most likely explanations — and what you can try instead:
1. You’re a “Deep Processor”
- Why? Speed-reading tools like SwiftRead force you to skim, but if you naturally read for comprehension, analysis, or retention (especially with technical or complex material), skimming can feel unsatisfying or even confusing.
- Fix: Use speed-reading only for low-stakes content (e.g., newsletters, emails, or light blog posts). For deep work, stick to your natural pace.
2. The Content is Too Complex
- Why? Speed-reading works best for simple, familiar, or narrative-driven content. If you’re reading code, research papers, or dense technical docs, your brain needs time to parse, connect ideas, and reflect.
- Fix: Reserve speed-reading for previews or reviews (e.g., scanning a paper’s abstract/conclusion first). Use traditional reading for the core content.
3. You’re Not Used to the Format
- Why? SwiftRead uses Rapid Serial Visual Presentation (RSVP), where words flash one at a time. This can feel unnatural if you’re accustomed to scanning, backtracking, or visually “chunking” text (e.g., reading code blocks or diagrams).
- Fix: Try adjusting the speed (start slow) or chunk size (show more words at once). If it still feels awkward, it might not suit your cognitive style.
4. You’re Multitasking Mentally
- Why? Speed-reading requires full focus. If you’re distracted (e.g., thinking about code while reading), you’ll miss more and retain less.
- Fix: Pair speed-reading with focused time blocks (e.g., Pomodoro sessions). Close other tabs/apps to reduce context-switching.
5. The Tool Itself Isn’t a Good Fit
- Why? Not all speed-reading tools are created equal. Some lack features like:
- Customizable pacing (too fast/slow for you).
- Highlighting key phrases (helpful for technical content).
- Integration with your workflow (e.g., reading PDFs or code).
- Fix: Experiment with alternatives like: Spreeder (more customizable), Bionic Reading (focuses on guiding your eyes), Manual skimming: Practice scanning headings, bullet points, and summaries first.
6. You Prefer Active Engagement
- Why? If you annotate, highlight, or take notes while reading, speed-reading tools can feel passive and less effective.
- Fix: Use tools that let you interact with the text, like Notion or Obsidian (for note-taking while reading). Physical books/printouts (if you retain better with a pen in hand).
What to Try Instead
If speed-reading isn’t clicking, focus on optimizing your existing reading process:
- Preview first: Read the abstract, headings, and conclusion before diving in.
- Set a purpose: Ask, “What do I need from this text?” (e.g., “Find the API’s rate limits”).
- Use text-to-speech: Tools like NaturalReader let you “read” while doing something else (e.g., walking or coding).
- Practice “chunking”: Train your eyes to group words (e.g., read 3–4 words at a glance instead of one).
Disclaimer: This post was augmented with assistance from Lumo, Proton’s AI assistant, and Le Chat, both of which are much better at writing than I am.
Good Advice
Posted: September 18, 2025 Filed under: Uncategorized Leave a commentThe following is good advice from a developer I’ve admired for a while. The 2nd bullet is especially important whenever using an AI agent to create code!
- Don’t fear the code. It’s just code.
- Never write (or copy) a line of code that you don’t fully understand.
- Figure out how things really work and why they work they way they do.
- If you don’t understand something, go deeper. Read the source code for the library you’re using.
- Use tools to figure out how things work-debugger, unit tests, sample programs.
- Create a punchlist to guide your work-investigations, things to do, things to test
- Test the hell out of your code. Be as thorough as possible
- When you get stuck, go for a 5 minute walk.
- When you get stuck, describe your stuckness out loud to somebody else.
- Write down what you’ve learned. Create a FAQ document and answer all the questions.
- Try to teach someone else what you’ve learned. Create a blog.
- Leave breadcrumbs for yourself and others-personal notes or comments in the code.
Comparing Job Opportunities
Posted: August 3, 2022 Filed under: Uncategorized | Tags: Compensation, Job Search, Recruiters Leave a comment
Important Rules
Rule #1: Start comparing on day one of your job search.
You may think you should wait until offers come in to start comparing them. If you do, you’ll have missed some good opportunities and potentially wasted time on some bad opportunities. If possible, get the recruiter to give you some compensation figures before even setting up an interview with them. They could very well let you know you’d be wasting your time (and theirs too, but they don’t always see it that way) if the role doesn’t pay what you’re looking for.
If you’ve got a base pay number, great! You can usually find out more though. See the sections below to see what other things to factor in. Sometimes you can find out what these factors are and quantify them through the recruiter. Often, you can’t. You may need to talk to the hiring manager or HR person at the company to fill in the blanks. Sometimes, if the company is nice to you, they’ll put some details in the job description and/or on their careers page of their website. If you can’t get actual dollar figures, give your best estimate. I’ll give examples of how to estimate some of these things later.
Lastly, money isn’t everything. Start researching the company. Look for reviews. Talk to current or past employees if you feel comfortable doing so. You’re looking for factors that may alter your feelings about the money you’d be making, either positively or negatively. You might even get lucky and find out early on that it’s not a culture fit for you, regardless of the financial gain.
Rule #2: Get it in writing.
Preferably from the recruiter themselves, but if they don’t put it in writing, you should. I was contacted by a recruiter that was promising up to a certain value for a role. Since that number was in my range, I invested time into the opportunity. At some point later, that figure was $10,000 less. I didn’t call them out on it immediately, but I made note of it. When it dropped another $10,000 later, and I had competing offers that were higher, I thanked them for their time and told them I would be withdrawing my candidacy. Alternatively, I could have pushed back and asked them what happened to the $20,000 that got shaved off, and let them know I would continue working with them if it was added back in.
Rule #3: Not all dollars have the same value.
There are many factors that can go into a decision to show you the dollar’s true value. I’ll elaborate more on the general reasons for this below when I show in detail how to compare offers. For now, though, know that if you have 2 offers with identical pay, they don’t equate to the same value.
Considering a permanent position vs. a contract position skews the value of the dollar even further. You might think that $50 per hour is a better deal than $100,000 a year, but the opposite is true. Financially, the permanent position is the more valuable of the two.
Calculating Contract Positions
There are many things to consider when you want to figure out how much a contract will pay annually. First off, you’ll have to accept that it’s impossible to arrive at a true answer. The best you can do is estimate. If you’re the type of person that likes to know every single dollar in your budget, a contract position may not be right for you. If that’s the case, your decision should be easy. Turn down any opportunities that aren’t permanent. If you can live with some uncertainty, continue reading this section.
Your base estimate, you may think would be the hourly rate x 40 hours x 52 weeks. Nope. You could start there, but you must subtract some time if you’re going to be realistic. Here’s what you might be looking at:
- Does the role include holiday pay? Will they pay you for working on holidays? Subtract the holidays they observe if not.
- Do they offer their employees entire weeks off with pay throughout the year? Will they allow you to work those weeks and/or get paid for them? Subtract those weeks if not.
- Are you going to want to take any days off? Subtract the number of days you plan to take because you won’t be paid for them.
- Are you going to want to end your days early sometimes? Will they allow you to make up the time later? Subtract those hours if not.
- Are you going to get sick? Subtract some hours for projected sick time.
- Can you request overtime? If so, try to estimate a reasonable amount you might get.
Once you’ve got a number for all of these, you’re likely looking at something closer to 35 hours x 48 weeks. Remember that $50 per hour example above? That’s now about $84,000. But you’re not done subtracting yet. Here are some more things to consider:
- Do you have health insurance? If not, figure out how much it will cost, and subtract that. The cost here is not only premiums & deductibles, but also out-of-pocket costs on top.
- Does the contract have an end date? Will you have something else lined up when it ends? If not, subtract whatever you’ll need to have in savings to continue your standard of living when it ends. There’s no easy way to determine what this number will be, but if you have a consistent budget and an idea of how long you’ll be searching for a new role, then calculate out the time x expenses and add about 20% padding to it for good measure.
- Taxes are taxes, right? Not really. You probably can write off personal expenses as a contractor. I’m not a tax professional though, so I don’t have specific advice to give here. Unfortunately, you’ll have to do your own homework here.
- But still, the rate of taxes before write-offs is the same, right? Nope. Do you have a spouse, and if so, do you file jointly? What’s your gross pay projected to be? Are you close to the dividing line between tax brackets? How many of your expenses can be subtracted pre-tax?
When you’ve factored in all these other things, you’re likely looking at an even smaller number.
Calculating Permanent Positions
Permanent positions are much easier to compare to each other than contract positions are. Still, there are some factors that change the overall value of the position. In addition to the health insurance, taxes, and savings considerations, generally you’ll have some benefits to weigh. Some examples include:
- What’s the PTO policy? If they have unlimited PTO, it may be less value to you than a limited policy. For instance, with a limited policy if you don’t take time off, you will get paid out the unused time when you change jobs. Unlimited policies typically don’t. Also, try to figure out how much time their employees take on average, especially if they have an unlimited policy. When you have an idea of how much PTO is available, you’ll still want to determine whether that’s a 1:1 dollar value to you.
- Do they offer scheduled bonuses? If so, how much and how often?
- How often do they offer pay increases?
- Is there possibility of a sign-on bonus?
- What does their health insurance cost you? Does the company pay a portion of the health insurance costs? If so, how valuable is that to you?
- Do they offer a 401(k)? Do they match your contributions to it? Is their match fully vested? Can you afford to contribute enough to make their match worth it to you?
- Do they offer stock options? Are those fully vested?
- What’s the commute going to cost you (in money and time)?
- Does the company pay for training and/or certification? Would you take advantage of that?
- Are there free perks in the office that can save you some money? Is there a gym on-site or a company-paid membership? Will you use it? Do they feed you throughout the day? How valuable are the free meals and/or snacks to you?
- Do you get paid and/or reimbursed for travel and entertainment?
Non-Monetary Considerations
Pretty much everything I’ve mentioned to this point can be calculated (or at least estimated) to have a monetary value. What about non-monetary things? Those have value too. How should you factor those in? Here it gets a little fuzzy, and there are no real solid answers. The value of the following things will vary depending on the importance you place on them. You may choose to assign a dollar value to these things to keep the comparison easier. Alternatively, you may assign “points” that get compared differently. No matter what method you choose, you’d do well to give them some sort of value. Things you can consider in this category are:
- How comfortable is the work atmosphere?
- Will your coworkers be relatable and fun to be around?
- Will you develop lasting relationships? Conversely, will you be forced to work with people who you don’t get along well with?
- How stressful is the work?
- If it’s a salaried position, will you often work more than 40 hours? Will you work during off-hours and/or weekends? If so, are you allowed to “get that time back” later?
- Will you learn on-the-job? Or will you be the teacher?
- What are the prospects of advancement, promotion, and/or recognition?
- How much customer interaction is required or available, depending on what you’re looking for?
- How good or bad is the company retention? You can look this up on LinkedIn in most cases. A high or low retention rate doesn’t necessarily translate to good vs. bad. Consider the context of why people choose to come and go.
- How diverse is the company? You can usually get a rating of this on sites such as Glassdoor.
- How diverse is the team you’ll work with?
- What overall rating does the company have on sites such as Glassdoor?
- What do the reviews look like on sites such as Glassdoor?
- Etc.
Adding It All Up
The way I keep track of all of this is by keeping a simple spreadsheet. At the top I set the monetary values. I’ll highlight anything that isn’t guaranteed so that I’m sure to keep that in mind for my final decision.
Disclaimer: The dollar values listed below are an example only. They’re not actual offers that I’ve received. Always do your homework to determine what is a good market rate for your experience and skill level.

At the bottom of the spreadsheet, I assign either a point or dollar value to the item. Since this area is completely subjective, I won’t explain how I came up with my figures. You do you here. I choose to subtotal this section in dollars, which means something to me. You may choose differently. I also choose to add the top and bottom sections together to make the overall decision a little easier.
At the end of it all, if you choose to compare in the same way that I compare opportunities, the spreadsheet may indicate which opportunity has the most value to you. However, it may not. You may have a gut feeling that somehow makes you choose the opportunity that appears to be less valuable on paper. I’ve found myself in both positions throughout my life. Sometimes I chose Company A and sometimes I chose Company B. However, making the comparison to determine what values the opportunities held for me has always made my decision easier in the end.
P.S. If you’re currently employed, it’s also a good idea to run this comparison against your current position to ensure you’re not actually leaving the better company after all. 🙂
Why the engineer’s solution isn’t the best solution
Posted: July 19, 2022 Filed under: Uncategorized | Tags: Coding, Customer Experience, Software Engineering Leave a comment
I’m going to strike a few nerves and bruise a few egos in my own field. But I’m doing it because it’s necessary. As software engineers, we need to do better.
We need to deliver the solutions our customers need, not the solutions that we want them to have. We need to get out of our ivory towers where we look down on the customer-facing people and the customers themselves. We need to stop thinking we know better than them simply because we’ve studied and worked with technology. We need to realize that our way isn’t the best way and that it’s only because we often hold the cards and can force others to go our way that they accommodate us. There will come a time when we no longer hold those cards. But before that time comes, we should act out of respect instead of fear to create the best possible solution for our customers.
The Problem
As software engineers, we either grew up loving code, or at a later point in life we looked at the world of software and fell in love with it. We learned how to write “Hello, world!” in C/C++ and/or our favorite higher level language. Then we learned how to create an app that does CRUD operations. Then we learned how to do it with a better framework. Then we learned how to use the advanced features of that framework. Then we learned how to do all of that in other languages and frameworks.
What didn’t we learn? We didn’t learn what the actual problems were. Our customers have actual problems that need to be solved. We didn’t take the customer-minded approach to creating the solution that they need. Maslow said it best when he said, “if all you have is a hammer, everything looks like a nail”. We pounded their problems as if they were nails, when they needed us to create a new kind of tool that would fix their very unique problem without destroying the environment they work in. We needed to make their lives better, but we made it more complex instead.
The Solution
Here is where I need your insight. I’m good at identifying problems, but I’m not the best at solving them. I’m a software engineer. I know languages and frameworks. I used to have an eye on business problems, but that was a long time ago. I need your help to find the right solution. Thanks in advance for your feedback!
Software Engineer Resources
Posted: July 17, 2022 Filed under: Uncategorized | Tags: Career Advice, Learning, Networking, Recruiters, Software Engineering Leave a comment
Learning How to Learn
How we “learned to learn” in school is backward and outdated. Learning new skills requires an entirely different way of learning. I would’ve added this book to my books section below, but learning to learn is so crucial to software engineering that it needs to be highlighted at the top. Buy it today! Start using it tomorrow!
Another good resource for getting started, in software development specifically, is the following video. Ideally, you’ll have significant cash to spend on a software development boot camp. Many people don’t have that kind of spare cash available, though. If you do, the good news is, that the boot camp will help you figure out what, how, and when to learn. There are thousands of free or low-cost tutorials available for those who can’t go that route and/or start their own learning path, but it can be very difficult to determine which ones to try. In his video, Andy will help you out. Be sure to stick around to the end of the video to see the free book he offers.
Getting Started in Software Development
This is another book I think is worth mentioning up front, especially if you’re brand new to software development, or maybe you haven’t even decided yet whether it’s the career for you. Summer’s transparency of the industry and the job search process is very refreshing, and the book is a steal at the price Summer is asking for!
Skills Acquisition
Not sure what to focus on next? Or you’d like to know what it takes to be a Front-end vs. Back-end vs. DevOps developer? roadmaps.sh has you covered!
Getting a Great Start
If you’ve decided you want to do this for a career, you may as well do it to the best of your ability, right? John Sonmez has a LOT of great advice for beginners in the field. The following video, while its intent is to get you up to a high income quickly, is great advice in general, regardless of how much money it helps you earn.
I haven’t used this yet, so I can’t quite vouch for it, but it sounds like an interesting concept to help you put together your résumé. Hope it helps!
Data Structures and Algorithms
Check out this work of art today! It’s fun, entertaining, and informative all-in-one! Bravo, Tomomi!
Comparing Job Opportunities
I have this post near the top here because I believe it’s something you should start on day one of a new job search. After all, how would you know if an opportunity is worth pursuing if you don’t know its value?
Stump the recruiter
When you turn on that “Open to Work” status in LinkedIn, or you start posting your resume on job sites, you’ll get tons of messages and/or phone calls, and many of them won’t be worth your time. Taylor has very good advice on weeding out the junk. You could literally copy/paste his questions directly to figure out whether the “great opportunity” they’re offering is really that. Or, if you think they may be legit, pick and choose which questions to ask them from his list.
Interview preparation
You may feel pressured to “just get a job” when finances are tight. Or you may have time to weigh things out. Either way, you’ll be glad if you follow the advice in these threads to spot red flags and go with your gut when you do. Especially helpful are Alex Chiou’s responses.
https://first20hours.com/https://first20hours.com/
I haven’t paid for the advertised content on this site, but I found the free stuff to be very useful, so I imagine the paid stuff is even better.
Check this out for some unique and thoughtful questions you can use when the interviewer asks, “What questions do you have for me?”
The following articles from Pen Magnet are all good, but in particular, from their list I highly recommend these:
– How to Answer Negative Interview Questions
– Why Software Companies Often Reject Awesome Programmers
– Developers, Stop That Stressful Interview Preparation
System Design Interviews
If you’re interviewing for a mid-to-senior position, you’ll need to know system design. Alex’s books are immensely helpful (see Books I recommend below) and well worth the cost to pick up. His videos, however, are 100% FREE, so there’s no reason not to watch them!
Books I recommend
I can’t get hired! Nobody wants a software engineer with no experience!
Raymond Gan has some advice for you if you’re in this tough situation.
How to tell when it’s time for a different role
As I sit here writing this, I’m a week away from ending my time with one employer and moving on to the next. My mind was mostly made up, however, several months ago. I held on as long as I could, hoping that I could find my fit and have the things I was looking for at my current employer, but as I saw each of my values slip away, I knew I wouldn’t be doing them any favors by pretending that everything was okay, and I certainly wouldn’t be doing myself any favors by staying where I didn’t feel fulfilled, regardless of how much they expressed their satisfaction in me and my work.
When I found this post I had already made my decision to move on, but I retroactively filled out the grid to see if it would line up, and to get validation to know I wasn’t leaving for the wrong reasons. I reviewed my journals and notes from one-on-ones with my manager, and I filled out the grid. As I suspected, the point at which I had decided to look for something new was the point at which my score fell to 40%, and although the categories in which I was unfulfilled slightly improved after that, due to attempts on my part to make it work out better, other categories slipped lower, and the score didn’t end up rising above 40%.
Recruiters I’ve worked with and recommend
I spoke with Mike for about half an hour, and the entire time was spent on me — who I am, what my goals are, where I’m at in my career, and where I want to go. He didn’t talk about himself nearly at all, except to tell me that his approach is to invest his time in getting to know each and every job seeker. I highly recommend speaking to Mike!
Right at the top of her profile, Hannah states “I actually read your resume”. Can’t get much better than that! Oh, wait, sure it can! Hannah also is “a self-taught UI developer turned recruiter who loves technology and helping people find their dream careers.” I highly recommend Hannah!
Danny works for one of the best recruiting firms in the country. Danny is very personable, very responsive, and very good at his job! Are you an engineer? If you’re reading this, then the answer is probably “yes”, so you should get in touch with Danny!
Madison is by far the easiest and most responsive recruiter I have ever worked with. She is currently with Aya Healthcare. If you’re a .NET and/or Angular developer, you’ll want to talk to Madison!
Lukins is one of the most professional and knowledgeable recruiters I’ve worked with. If you’re looking for work with a consulting firm and have Angular, .NET, and/or DevSecOps experience, you’ll want to get in touch with Lukins!
Not a recruiter, but Ibotta is an awesome company, and the only reason I didn’t apply to work for them is that I don’t have experience in their tech stack. They currently have several positions available in design, data, analytics, machine learning, Rails, React, and Vue.js.
Recruiters I haven’t worked with (yet)
https://first20hours.com/https://first20hours.com/https://first20hours.com/https://first20hours.com/
A Few Takeaways from Don’t Make Me Think, Revisited
Posted: July 2, 2022 Filed under: Uncategorized | Tags: User Experience, Web Design, Web Development Leave a comment
In 2000, Steve Krug’s wrote a book — Don’t Make Me Think, A Common Sense Approach to Web Usability. In 2014 he updated it to add Mobile usability. You can find his book here: https://sensible.com/dont-make-me-think/.
More than 20 years after his book was initially published, I’m surprised to still encounter websites and applications with poor usability. This is even further surprising because we have very popular, heavily used front-end frameworks and libraries that make usability very easy. Ironically, as web developers, we barely need to think in order to make a website that our users don’t have to think about.
I’d like to share a few main takeaways from Krug’s book that really weren’t obvious at first. If these help you think about web development in a different way, I highly recommend you pick up the book to gain the rest of his insight and tips.
We don’t read pages. We scan them.
Krug explains in detail why we do this, and he emphasizes that if we expect our users to read everything on the page, we’ve failed. We should be ensuring that the path to the information (or actions) we want them to care about is the fastest, most direct path.
We don’t make optimal choices. We satisfice.
If we’ve failed to make the best path the fastest and most direct, our users will find a sub-optimal path to get what they need. What’s worse is that they’ll stick to that path even if they happen to find another way, because they’re already familiar with it.
We don’t figure out how things work. We muddle through.
This one is, I believe, the most distressing fact that Krug points out. Think about all those unit tests and integration tests you’ve painstakingly created. What do the majority of them have in common? They choose the correct and optimal path to get to the result. What do our users do? If we haven’t made their job easy, they choose the incorrect and sub-optimal path, effectively making all those tests useless.