Can/Can’t Do/Don’t

The other day, I asked my daughter if she wanted me to make her some eggs. She responded with a “Yes!” in text and came to sit up at the counter while I cooked for us both. We chatted a bit, and at one point she said, “Thanks for cooking, but it’s not that I can’t cook.”

I laughed a bit and responded with “this isn’t a can/can’t situation, it’s a do/don’t or will/won’t one.” I know my girl can cook; I made sure all my kids learned how to cook. It’s that they often choose not to, hunting for leftovers, going for takeout, or skipping meals.

I’ve never been one who likes to hear “can’t” from anyone. Even today, when I coach kids and one say “I can’t do that,” my response is “yet. You can’t yet.”

It’s easy to think that because you don’t know how to do something, or don’t have confidence, or you’ve not done it well (or right) in the past, that you can’t do it now. That could be true, but often I find people default to “can’t” when they really mean they don’t want to do something or won’t do something. Easy to confuse those, and easy to brainwash yourself when using the wrong words too often.

There are things I can’t do. For example, I can’t run a 10.0s 100m dash. I can’t dunk a basketball, though there was a time I could. However, on the ranch or at work, I rarely find that I can’t do something if I apply myself with a little curiosity, effort, and experimentation. I can learn most things and do them well enough to meet a goal. Someone else might do them better, but I can learndo them.

I see too few people in the world who aren’t curious at work, aren’t willing to put in extra effort to get a task completed, or don’t feel an urge to tackle tasks outside of their comfort zone. I see fewer people dedicated to making an effort to learn outside of work time, whether on their own or at an event like a SQL Saturday.

Most of the people I see succeed and thrive in jobs aren’t smarter than others. They just do the work. And if they don’t know something, they teach themselves what they need in order to get the job done. They drive themselves forward.

Life is hard, but it gets easier when you want to put in effort to make it better.

Steve Jones

Listen to the podcast at Libsyn, Spotify, or iTunes.

Note, podcasts are only available for a limited time online.

Posted in Editorial | Tagged | Comments Off on Can/Can’t Do/Don’t

Advice I Like: Training Employees

Train employees well enough that they could get another job but treat them well enough that they never want to. – from Excellent Advice for Living

This one is close to my heart. I firmly believe that you need to find good employees and invest in them. Employees can make a big difference in how well you succeed as well as how efficiently you can run an organization. If you trust employees, you can get a lot done, but takes work.

There’s an old joke that expresses a similar sentiment. Here it is as a quote attributed to Peter Drucker, a well known management consultant.

2025-10_0146

Perhaps one of the best reasons to train people is time. Time is a valuable resource, and the more it’s wasted, the less you get done, the less competitive you are, and the less your employers earn their pay.

Train them and benefit more.

If you worry about training those that might not be worth investing in, that’s hard to know. Train everyone, but hold them accountable to use that training and improve. If not, cut them loose and move on.

I’ve been posting New Words on Fridays from a book I was reading, however, a friend thought they were a little depressing. They should be as they are obscure sorrows. I like them because they make me think.

To counter-balance those, I’m adding in thoughts on advice, mostly from Kevin Kelley’s book. You can read all these posts under the advice tag.

Posted in Blog | Tagged , | Comments Off on Advice I Like: Training Employees

Be Wary of Data

I fly a lot, as you might have guessed if you read my blog regularly. In 2025, I’ve been on 56 United planes as I write this, with about 10 left to go before the end of the year. One of the things United does is sometimes send out a quick “survey” after a flight, checking to see if everything went smoothly. I don’t always fill these out, but recently I decided to give some feedback as I had a great experience.

I really wanted to just complement the onboard crew, but the survey was quite a few pages (10?) and a lot of questions. I started to try and fill it out, but lost focus after a few pages. This felt like a chore, and I started to just randomly click some of the selections asking me to rate things 1-10. I wasn’t really rating the items; I was trying to get done. Eventually, I bailed on the survey and didn’t complete it, but that got me thinking about the data from these surveys.

I’m somewhat detail-oriented and I try to do a good job, but I couldn’t finish the survey. How many others just click through things and don’t really give an accurate picture of their feelings?

A similar situation occurs at work, where we have an HR rating system (Thymometrics), which I really like. Over time, it helps me to keep an eye on how I feel about my job, the company, and my general attitude about work. We get quarterly reminders to fill this out, but I know quite a few people who don’t fill it out at all, or just click on it and save the ratings without thinking about them. Another place data might be suspect.

At work we get feedback on various product metrics, in addition to uninstall feedback and product feedback, sometimes with a rating that people click. Is that what they really think about their experience or did they just click the first thing they saw? Or did they mis-click the wrong thing, and they can’t change their rating (clicking 2 when they meant 9).

There is a lot of data that organizations collect from people that is very subjective. Across a large group of users, this should provide some sort of indication of how people feel, but if the sample sizes are small, can you really use this data? I think it’s easy for people in product management, marketing, and sales to view this data as much more accurate than it might be. I know I’m always wary of any outliers when I see feedback, and often I want to know how many people contributed.

Unless it’s a decently large number (100s at least) and there is a clear trend from many people (> 5%), I tend to discount the data as an outlier and not representative.

I’m not sure how many of you do this, but critically examine data and be wary of drawing conclusions. Especially when you are getting impressions, feelings, and opinions from others.

Steve Jones

Listen to the podcast at Libsyn, Spotify, or iTunes.

Note, podcasts are only available for a limited time online.

Posted in Editorial | Tagged | 1 Comment

Creating a Striped Backup Set with AI

I needed to test a striped backup, so I decided to ask the AI’s for help.

This is part of a series of experiments with AI systems.

The Problem

A customer wanted to know if we could handle a large striped backup set. In this case, 20 files. I didn’t want to try and do this myself because I was busy at the time, so I thought I could get the AI’s to help me.

I started with this prompt:  for a sql server database called “Sandbox” can you generate a backup command that will stripe the backup across 32 files with “sandbox” the current date/time, and a number for the backup file name?

Local Gemma3 LLM

I started with a local model because I had that open. I got a result that looked OK.

2025-10_0149

Below this I had PowerShell code to help me:

-- Using PowerShell (example):
# $i = 1
# while ($i -le 32)
# {
#   $filename = "D:\Backups\Sandbox\_" + REPLACE(CONVERT(VARCHAR, GETDATE(), 112), ' ', '_') + "_" + $i.ToString("D3").PadLeft(3, '0') + ".bak"
#   # Execute the backup command:
#   Invoke-Command -ComputerName <ServerName> -ScriptBlock {
#       & "backup.exe" -Database "Sandbox" -BackupFile "$($filename)" -BackupType "D" -Init -Format "MEDIANAME = \"Sandbox\""
#   }
#   $i++
# }

This won’t work, proving that there isn’t enough database training in some of these small models. The model does warn me this won’t work as is.

Claude

Since the local model was slow, and didn’t get me what I wanted, I tried Claude. Same prompt, and I got this code, which is nice in that it handles the current date time whenever I run it.

DECLARE @BackupPath NVARCHAR(500) = 'C:\Backups\' -- Change this to your backup directory
DECLARE @DateTime NVARCHAR(20) = CONVERT(NVARCHAR, GETDATE(), 112) + '_' + REPLACE(CONVERT(NVARCHAR, GETDATE(), 108), ':', '')
DECLARE @BackupCommand NVARCHAR(MAX)

SET @BackupCommand = 'BACKUP DATABASE [Sandbox] TO '

-- Generate 32 striped backup files
SET @BackupCommand = @BackupCommand +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_01.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_02.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_03.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_04.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_05.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_06.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_07.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_08.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_09.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_10.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_11.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_12.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_13.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_14.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_15.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_16.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_17.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_18.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_19.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_20.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_21.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_22.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_23.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_24.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_25.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_26.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_27.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_28.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_29.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_30.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_31.bak'', ' +
     'DISK = ''' + @BackupPath + 'sandbox_' + @DateTime + '_32.bak'' ' +
     'WITH COMPRESSION, STATS = 10'

EXEC sp_executesql @BackupCommand

I could easily then test this by adding a SELECT and commenting out the Backup command. When I do that, I see these results.

2025-10_0150

Note I’ve started adding some line breaks to the results so I can check things.

Prompt AI

I decided to try Prompt AI as well. I started with this code:

BACKUP DATABASE sandbox
TO DISK = ‘sandbox_20251013_x.bak’ WITH INIT

Then I opened Prompt AI and entered this: expand this backup command to create a striped backup of 32 files, replacing the x with a number for each file

You can see this below:

2025-10_0148

This got me a quick and dirty backup test.

2025-10_0147

2025-10_0151

Then we need to correct the syntax.

2025-10_0152

Now I have a command.

2025-10_0153

However, this doesn’t work as I can’t use string concatenation inside the backup command. I asked Prompt AI to generate a string for this instead (from this code) and then sp_exeutesql and got this code:

DECLARE @DateString VARCHAR(8) = CONVERT(VARCHAR(8), GETDATE(), 112) -- Format: YYYYMMDD
DECLARE @BackupCommand NVARCHAR(MAX)

-- Build the backup command as a string
SET @BackupCommand = 'BACKUP DATABASE sandbox TO '

-- Add all backup file destinations
SELECT @BackupCommand = @BackupCommand + CASE
                                              WHEN LEN(@BackupCommand) > 25 THEN
                                                  ', '
                                              ELSE
                                                  ''
                                          END + -- Add comma except for first item
     'DISK = ''sandbox_' + @DateString + '_' + CAST(number AS VARCHAR(2)) + '.bak'''
FROM master.dbo.spt_values
WHERE type = 'P'
       AND number
       BETWEEN 1 AND 32

-- Add WITH INIT
SET @BackupCommand = @BackupCommand + ' WITH INIT'

-- Execute the dynamically built command
--EXEC sp_executesql @BackupCommand
SELECT @BackupCommand

That works.

2025-10_0155

Summary

Both Claude and PromptAI worked, though Claude worked well with a first prompt. I continue to like the Sonnet model and find it really helpful in saving time.

It took me longer to write this post than generate the code in 3 places and test it. In terms of saving time, Claude would have saved me at least probably ten minutes, maybe more, as I’d spend time making decisions. With Claude, I got the code in under a minute and then needed to test it.

Always test your code. Including your AI-generated code.

Posted in Blog | Tagged , , , , | 2 Comments