Learning to learn with AI

Introduction

I know I know, another blog post about AI. But this one is different, I swear! In a sea of AI agents, tools, IDEs and everything in between, it’s really easy to get lost in the “let this thing do it for me” mindset. And I have to admit, I’ve been there.

I love using AI to take the boring away from me. That be boilerplate, revision of PRs, things that I can’t be bothered to do. But I’ve also been guilty of using AI to do things that I should be doing myself, not because I know how to do them, but because I don’t. let’s talk about it.

The problem

AI is great right? you can build shit that you wouldn’t normally be able to build, and without much effort. Are you a web-dev that wants an app? no problem, just ask Claude to build it for you. Are you an iOS dev that wants a backend? Sick, Cursor has go you sorted. We’ve all been there, and it’s great.

But what happens when you don’t know what you don’t know? when AI inevitable hits the infinite feedback loop of “a ha! now i see the problem” and you’re left with a bug or unexpected behavior?

Or, and perhaps more importantly, what happens when you don’t know what you’re supposed to know? That can be the codebase that you’re working on in your job, that can be a feature or a product you’re delivering to a client, or that can even be something that you’re trying to learn?

What happens when someone asks you, live, face to face or in a meeting, “how is this thing done?”, “how long will it take to do this?”, “is this thing feasible?”? if you don’t know what you’re doing, you’ve only been a pass-thorough to some agent, you be stuck in a very embarrassing situation.

And lastly, you’re going to change jobs eventually. might not be today, might not be next week, but it’s going to happen. and you’re going to be left stuck in the same place, with whatever knowledge you’ve had the last time you were actually coding, stagnant. the world moves fast, and if you’re not continuously learning, you’re left behind.

My approach

You’ll notice that i’m not calling this section “the solution”, because I don’t claim to have the answer. or at least not the answer that will work for everyone. i have the answer that has worked for me and I’m going to share it with you.

I’ve recently started a new job at a tremendous company, and the code base is a bit of a beast. firstly, we use KMP, a framework i have never touched before, bar the tiniest of projects. And secondly, it has a lot more emphasis on Kotlin and Android than i had in the recent years, being an iOS developer. I haven’t lied during my interview process, the company knew i’m an iOS developer who’s happy to learn new things, but i still felt like i have that self-inflected stress over my head of “you should be able to do this”.

Not only that, i’ve also had some client work that has involved some MacOS development, which i’ve never done before. goes without saying, that has stressed me out as well.

So, while i could use AI to do tickets for me ( or at least attempt to), i’ve been using it for a different purpose. I’ve been using it to teach me about the project, about KMP, and about everything else that i’m not familiar with.

The obvious way i do this is by asking AI how things are done in Kotlin, or on MacOS, or whatever that might be. while yes, i can just ask it to do it for me, by asking it how things are done, and then doing them myself, i get the repetition and learning process.

Another way i’ve been using it, is by asking it to onboard me on certain parts of the codebase. So if i’m working on a new feature in an existing module / part of the code, i will ask it to explain to me:

These questions help me greatly understand what am i looking at. this is a very important step in learning any new code base, and i think it’s crucial to understand those pointers so you can become comfortable and confident in the codebase, and then you can start to build your own knowledge of the codebase.

Tools

So while doing this, i’ve found certain tools seem to be more helpful than other, but like everything else in programming (and life), pick the right tool for the job.

Cursor

I’ve been using cursor for context-specific code questions that require knowledge of the codebase. The main ways i’ve used this before is “Where is this thing”, or “Why is this error happening”, or my personal favorite, “am i doing this like the rest of the codebase?”

The reason for the last question is that we’ve all been doing things our way, and that’s great. but new codebases have their own ways of doing things, their own conventions and patterns. so while you might be used to having view models and presenters, the new codebase might have a different approach. so it’s good to ask either before you start, or just after you’ve started, “is this following the codebase’s conventions?”

Claude

Claude has been my new google for a while now. i mainly use it for “how do you do this in Kotlin?” or “how do you do this in Android?” or “how do you do this in KMP?”. Think of it like that, you know that the thing you’re building needs a switch statement, you write switch, but whoops the compiler doesn’t understand what you’re talking about? that’s because switch is called when in Kotlin. These are small, minuscule things, but they might waste your time, and there’s no need for that struggle - you know what you want to do, syntax is just a tool to get there.

Copilot

Admittedly, i’ve been using copilot less and less now, as cursor has been replacing it more and more, but when i write code either in Xcode or Android Studio, i still use it for auto completion of basic things. So i try not to use it for too big of a job, as i still want the repetition to build the muscle memory, but i use it for things like autocompletion of init methods, or auto completion of basic functions.

Pitfalls

Like everything else in life, this isn’t a 100% solution. AI can be, and is, wrong. sometimes i’ll ask it where something is, and it will hallucinate a location or a module, and i’ll be sent down a rabbit hole of trying to find it. Sometimes it guesses the autocompletion of an init method and i’ll be left with a bug that i didn’t see coming.

But that’s the beauty of it, it’s not a replacement for you, it’s a tool to help you. It’s a tool to help you learn, to help you understand, to help you get things done.

Main takeaways