Learning with AI

LatinR 2026

Nic Crane

November 12, 2026

2016

Unrealistic Expectations

The Data Science Unicorn

2026

AI skill threat

Nearly half of developers show signs of AI skill threat - that their their current competencies will become obsolete due to AI

Cat Hicks, The New Developer: AI Skill Threat, Identity Change & Developer Thriving in the Transition to AI-Assisted Software Development

Centaur

Human head and torso, horse body.

Human judgement and thinking, with the speed and strength of the horse.

An enhanced human.

e.g. human assisted by AI

Reverse Centaur

Cory Doctorow, via Wes McKinney at posit::conf

Horse head, human legs.

Can’t really do much.

The worst of both worlds.

e.g. AI assisted by human

how can we use AI so we become more capable, and not dependent?

First open source contribution - 2018

🎉

Arrow - 2021

Work with large datasets in R

Work with Parquet files

Learning to maintain Arrow

Mentor curated issues for me.

Read code slowly.

Sketched how pieces fit together.

Only possible working full-time.

Learning by analogy

ellmer - 2026

Work with LLMs directly from R

Learning to maintain ellmer

Working more independently

Getting up to speed faster

Working part-time

Learning aided by AI

DeepWiki

https://deepwiki.com/tidyverse/ellmer

Writing code with AI

Using SKILL.md files

---
name: skill-name
description: What this skill does and when to use it
---

# Contents

Instructions in Markdown describing what the agent should do
  • Define a process or set of rules to use every time
  • Adding your own knowledge into the process

Using skills effectively

  • Find existing ones
  • Write your own
  • Intervene when an agent gets the same thing wrong repeatedly

https://github.com/posit-dev/skills

But how can I trust the code that I generate?

Understand it!

Using LLMs for self-directed learning

Lin, X (2023), Exploring the Role of ChatGPT as a Facilitator for Motivating Self-Directed Learning Among Adult Learners

  • Builds on a five-step self-directed learning framework (Kim et al., 2014) that predates AI
  • Describes where an LLM can help at each step

Took the process, customised, and turned it into a skill

Rapid learning skill

A skill for quickly learning about code

https://github.com/thisisnic/rapid-learning

Example: how do tool calls work in ellmer?

Tool: gives the LLM access to information by running R code

library(ellmer)
chat <- chat_anthropic()
#> Using model = "claude-sonnet-5".

chat$chat("what's the time")
#> I don't have access to real-time
#> information, so I can't tell you
#> the current time.
library(ellmer)
chat <- chat_anthropic()
#> Using model = "claude-sonnet-5".

time <- tool(
  fun = Sys.time,
  description = "Get the time",
  name = "time"
)

chat$register_tool(time)

chat$chat("what's the time")
#> ◯ [tool call] time()
#> ● #> "2026-11-12 08:40:46"
#> The current time is **8:40:46 AM**.

The LLM can’t run R. So who called time()? 🤔

Using the rapid learning skill

1. Establish Learning Goals

What do you want to learn, and why?

How tool calling works in ellmer

Where are you starting from?

I’ve used tools in ellmer before but that’s it

How would you like to learn this?

Running code

How much time do you have?

10 minutes

Using the rapid learning skill

1. Establish Learning Goals

Primary learning goal: by the end of 10 minutes, be able to explain what happens between asking a question and getting an answer, and where a tool call fits in.

Supporting objective: compare a conversation with and without a tool call and spot the difference

Using the rapid learning skill

2. Locate and Access Resources

You want to learn by running code, so our resource is an R session with ellmer loaded.

Using the rapid learning skill

3. Adopt and Execute Learning Activities

Activity 1: Compare a conversation with and without a tool call

  1. Start a conversation and ask a simple question.
  2. Register a tool, then ask a question that will need the tool to answer.
  3. After each question, run chat$get_turns() to list everything sent back and forth. What extra steps does the tool call add?

Using the rapid learning skill

3. Adopt and Execute Learning Activities

Without a tool call…

library(ellmer)
chat <- chat_anthropic()
#> Using model = "claude-sonnet-5".
chat$chat("Say hi!")
#> Hi there! 👋
#>
#> How are you doing today? I'm happy to help with whatever you need...
chat$get_turns()
#> [[1]]
#> <Turn: user>
#> Say hi!
#>
#> [[2]]
#> <Turn: assistant>
#> Hi there! 👋
#> ...

Using the rapid learning skill

3. Adopt and Execute Learning Activities

With a tool call…

time <- tool(fun = Sys.time, description = "Get the time", name = "time")
chat$register_tool(time)
chat$chat("what's the time")
#> ◯ [tool call] time()
#> ● #> "2026-11-12 08:43:13"
#> The current time is **8:43:13 AM**.
chat$get_turns()
#> [[1]]
#> <Turn: user>
#> what's the time
#>
#> [[2]]
#> <Turn: assistant>
#> [tool request (toolu_01CW...)]: time()
#>
#> [[3]]
#> <Turn: user>
#> [tool result (toolu_01CW...)]: "2026-11-12 08:43:13"
#>
#> [[4]]
#> <Turn: assistant>
#> The current time is **8:43:13 AM**.

Using the rapid learning skill

3. Adopt and Execute Learning Activities

With a tool call…

#> [[1]]
#> <Turn: user>
#> what's the time
#>
#> [[2]]
#> <Turn: assistant>
#> [tool request]: time()
#>
#> [[3]]
#> <Turn: user>
#> [tool result]: "2026-11-12 08:43:13"
#>
#> [[4]]
#> <Turn: assistant>
#> The current time is **8:43:13 AM**.

What do you see in the second turn?

The assistant turn is calling time()?

Is it calling it, or requesting it?

Oh. Requesting.

Right. The model never calls anything. It only asks. And what do you see in the third turn?

Using the rapid learning skill

3. Adopt and Execute Learning Activities

With a tool call…

#> [[1]]
#> <Turn: user>
#> what's the time
#>
#> [[2]]
#> <Turn: assistant>
#> [tool request]: time()
#>
#> [[3]]
#> <Turn: user>
#> [tool result]: "2026-11-12 08:43:13"
#>
#> [[4]]
#> <Turn: assistant>
#> The current time is **8:43:13 AM**.

There’s a user turn with the result, but I didn’t type that.

So who ran time()?

…ellmer?

And who did it send the result to, and as whom?

To the LLM. As me?

Yes. Why would it need to do that?

So the LLM has what it needs to answer.

Using the rapid learning skill

4. Monitor and Evaluate Performance

Checkpoint before we move on. In your own words: who decides to use the tool, who runs it, and who sees the result?

The LLM decides, ellmer runs it, and the LLM gets the result as if I’d sent it.

That’s the whole mechanism, and you got there yourself. 🎉 Activity 1 done, five minutes under its timebox.

Using the rapid learning skill

5. Reassess Learning Strategies

What was most valuable about this session?

Comparing the two conversations side by side.

Noted. I’ll lead with a comparison next time.

What did this give me?

  • Huge reduction in overhead planning learning
  • Take on more ambitious tasks
  • More confidence in my learning

Use AI to customise learning to make it work for you

“What can I work on that I can be sure is having an impact?”

March 2026 with Posit Assistant, using Claude Sonnet 4.6 and Claude Opus 4.5

A new metric…

Wait… whut?!

A poor experience for newcomers?

These PRs are sitting entirely unacknowledged, which is both a poor contributor experience and a growing triage burden for maintainers.

Some are substantive pieces of work (look at <list of PRs>) that just didn’t make it through.

😢

🤔

Don’t add judgemental comments about poor contributor experience please, just report the facts.

Hmm… how do you know? These were opened within 3 mins of each other…

A revelation

What happens to new contributors’ PRs?

New categorisation scheme

  • “There was a comment in the past 2 weeks”
    • New category: “active”
  • “Last comment was from maintainer over 2 months ago with no response from author”
    • New category: “abandoned”
  • “Last comment by the author over a month ago, still waiting for a maintainer reply”
    • New category: “stale-risk”

Back to my original question

What can I work on that I can be sure is having an impact?

  • Find stale PRs and either:
    • answer the question myself
    • ping the maintainers for an answer
  • Find abandoned PRs and either
    • finish them off
    • close them

What I learned

  • Wrong answers were still useful
  • Fast iteration made me realise I was asking the wrong question
  • Domain knowledge and scepticism did the hard work

Use AI to run experiments cheaply and learn about your reality

Arrow in January 2026

  • Loads of new code contributions
  • Way too many tests
  • Never interact much

Arrow’s AI guidelines

  • “Only submit a PR if you can debug and own the changes yourself”

  • “Be upfront about AI usage”

The effect

  • nobody paid attention
  • frustrating experience reviewing code
  • arguing with other maintainers

Automatic AI code review with Copilot

Not so bad, right?

Things had changed more than we thought

Trying to keep up

  • all the caffeine!
  • just need to try harder

How do air traffic controllers maintain concentration?

Decision fatigue

Rethinking my approach

“How does <prominent maintainer> say no?”

  • Thank them
  • Explain why
  • Move on

A PR is a proposal, not a gift

A proposal

Not a gift

The actual solution

Set boundaries!

What does setting good boundaries look like?

You are allowed to say “no” without long justifications

  • I’m not going to read a 300-line AI-written PR description

What does setting good boundaries look like?

Focus on your own actions, not theirs

  • I can’t stop people submitting AI-generated pull requests, but I choose which ones get my time

What does setting good boundaries look like?

“If X then Y”

if(human_involved){
  engage()
} else {
  close_pr()
}
  • If there are signs a human is engaged, I’ll review their code
  • If not, I close it without one

AI Reviews

  • Copilot reviews the PR, I clean up after it 👎
  • AI drafts a review locally, I read it, own it, and act on it 👍

Change how you work, not who you are

Learning throughout history

370 BC · Writing

1970s · Calculators

1990s · The internet

Thank you!

www.niccrane.com

https://github.com/thisisnic

https://bsky.app/profile/niccrane.bsky.social