7 Tips on how I Leverage AI and Still Write My Own Code

Jorge Cortez
July 1, 2025
Read time
Tech Talk

AI’s popping up in every dev workflow, and it can save you tons of time, but lean on it too hard and you risk letting your own skills fade.

If you missed my last article, I argued engineers ignoring AI risk getting left behind.

As a seasoned developer working with AI tools daily, I’ve developed 7  habits that let me tap AI for productivity, while still being able to do the heavy lifting myself if needed. After all, it will be us fixing things the old-fashioned way if AI is not available at any point.

Rubberducking, an old but gold way to problem solving

Bounce Ideas

Sometimes when working in a complex legacy codebase or just looking at a new functionality to add, you need to look at the requirements and decide what and how to do it. In the past I used to take the requirements, think of a solution and, why not, go and bounce the idea with a co-worker. I have also “rubberducked” to see if my solution would work as expected, call it “old school vibe coding”. Now this piece is easily replaced by Chat GPT, or straight in your IDE or Text Editor of choice like its the case of Cursor or Copilot, I use the “Ask” mode quite a lot for this.

Most of the time it looks something like this:

1“I’ve drafted this plan to add FlashList: override item layouts, debounce scroll events, and memoize item renders. Can you point out any gaps or suggest optimizations?”

This way, I’m laying out the idea and I already know the solution I want to use but I’m getting what I need to know before the implementation so I can catch some things I may have missed before like not adding a overrideItemLayout prop which is an optional parameter to decide the height of the items to improve scroll precision.

Now, what about when I have an issue or want to implement something I’m unsure how to do. Same story here, I would start by asking :

“I’m working on x but I’m not particularly sure on how I want to implement it, help me generate a fix or feature based on this information I currently have”

and bounce it from there. Sometimes I would actually get something that solves most of the problem and I would just switch to agent mode and implement it but It is always important to check things first.

Think First, Ask Second.

We all know the struggle of not knowing how to fix or do something, thankfully since 2008  stack overflow has been helping developers solve issues and ship faster. I won’t shame anyone for copy-pasting solutions, I have my fair share of questions and answers in the platform. But over time you learn a couple of things about doing so, getting an answer quick and easy is not always the best and you need to be able to tell if what you are about to add to your codebase is really what you are lookin for. Take this as an example:

LLM suggesting dangerous rm -rf command

In this particular case I know there is a certain amount of people that would have just run the test because “well, it may work” in this case thankfully the AI mentions this will remove all files under this directory but this is not always the case; any seasoned developer knows that running an rm command in the command line is most likely not the move you are trying to do. Specially when the request was adding a couple of lines to your .gitignore. This is just an example of why we should always question the answer we get, not only from AIs but honestly from any source. We sometimes go for the quick and easy road to get something done but it is important to remember that any tool is here to improve our work, to make us better in our way of thinking, not to replace it.

Challenge Yourself Before Asking

I’m a stubborn developer sometimes, as I mentioned in my past article, I like to try and get solution by myself, though I’ve been doing this mostly for the more complex tasks lately. I don’t want AI dependency to take over my ability to do things as I’ve been able to for the past decade. Let’s be honest most of the time the answer or solution is actually pretty simple, we just become lazy over time and would rather go the easy way. I know not everyone will be with me on this one because it is not the “efficient” way to do things but doing things this way you can make sure you maintain your ability to problem solve on your own. In my opinion this is something to consider when the task is complex, when it will provide you with a challenge to keep your abilities sharp, for a lot of our day to day tasks we can probably leverage AI to do things fast.

Get the Logic Right

One thing I've seen that is happening to a lot of devs is that they're losing the ability of coming with a proper solution before thinking of asking AI for one. This is not only happening to devs, according to a study from researchers at MIT’s Media Lab it is happening to students, writers, and others. Our critical thinking abilities are getting reduced the more we relay on AI instead of attempting the task on our own.

My way to overcome this is simple, if you are in a planning phase take the time and care for your project, get all of the requirements and get a solution that you think could work.

After that you can polish the plan with AI to make sure you are not missing anything or check if there is a better way to do things. I would often bounce the idea with a coworker before I start doing so with AI.

Remember AI is a tool and as any other tool it is intended to empower the one doing the task, not replace it. Besides in a lot of cases, and I’m saying this from my own personal POV, leaving the parts of the work that I enjoy doing in the hands of AI can make the work feel empty sometimes.

Embrace Test Driven Development (TDD)

Test driven development workflow
Test driven development workflow

A while ago I learned about test driven development, this I implemented for the first time while working on an Android app at a past job, I was using JUnit. Doing this came up after we got an audit regarding implementation of best practices at work. It was early in 2017 and not gonna lie It felt like such a bother to develop that way, at least for projects with tight deadlines that kept changing on the daily basis but it gave me a glimpse of what a well written project brings to the table.

Now a days I can confidently say that writing tests before you write code isn’t just for over-achievers, it actually gives one as a developer the means to prevent issues in the future and a blueprint to launch new features fast. This works the same way for AI, it gives it a clear view of what it needs to do more so than a well defined prompt or following the vibes by asking, “Hey AI, can you fix my code?”.

Embracing TDD can really help you make sure your agent knows exactly what you are expecting.

You can start by asking your AI of choice something like:

Generate unit tests for functionx. it will have { x } as an input and return { y } Validate both success and failure, and include edge cases.


You can specify the library you’re using to get it better written, then I’d recommend reading the test and making sure all is accounted for. This way your next step will be to just write the function in a way it gives you the results you want and also passes your tests. If you are into leet code, this is pretty much the same you do when trying to make your function pass.

If you are more into AI First development the once you have your test you can do something like this:

“I’ve written these test cases for feature X can you implement the code so all tests pass? Here are the requirements and the test file.”


That way, AI generates code that’s already aligned with your expectations.

This is great because of several reasons:

  • Structure up front: Tests force you to think through edge cases before you dive into implementation.
  • AI checks itself: If the AI‐generated code fails any test, you get immediate feedback (“Oh, I forgot to handle null inputs!”).
  • Faster bug catch: I’ve saved hours by catching off-by-one loops or missing error checks in the tests, rather than discovering them in production.

Block Non-Agentic Time

If you just like my self got into software development because it is something that you’re really passionate about or simply it is something you enjoy doing you might understand the feeling of boredom that comes from vibe coding. Sure you can vibe code for a little while and be relatively happy with the result but it does not fill you with the same feeling you get when you finally finished that complex functionality you needed to add or when you finally got the layout to look as you wanted it.

It is true that we’ve been seeing how relying too much on this tools is hindering some of our ability to do what we were perfectly capable of doing just 6 months ago. This does not only apply to Software development, it applies to all things we’ve shoved AI to. A thing I personally like doing is scheduling blocks of time in which I simply won’t use any of this tools and take a bit of time to exercise my own brain. As I’ve mentioned many times before, these tools are here to empower you not to replace you, if you don’t want to be replaces make sure you can keep yourself being able complete the task with or without them.

Create Documentation

This is one of the funniest things I can recommend and it is because it is a task most developers don’t want to spend time doing. Creating documentation is not just about leaving a trace of how things are supposed to work, it is about allowing yourself to forget knowing that it will help you meet any requirements in the future and that it will empower your team to continue building non stop.

We’ve all stumbled upon a non-documented project in which we spend great part of a week trying to understand where and why things were built that way, and I’m sorry to break this to you but if you haven’t seen a project like this you’re in for a treat once you do.

Now this has been an issue as old as the career itself, simply things change too fast and no one has enough time to do it in the past, and every once in a while someone decides to update the docs and that stays obsolete for many versions until someone offers again. This is something we can and should definitely leverage AI for.

First we have inline code which will be really useful for documenting global utility functions or hooks in the case of react. this way things are right there when you are using them which  makes it way easier to handle.

like the following function:

JsDocs, inline documentation for your project
JsDocs, inline documentation for your project

Using copilot it took just a minute to generate documentation for this function and all of the outputs as well, 5 minutes to read and review and you’re set to re-use this module even if you haven’t done it in a while or if you brought it from one project to another.

This is a powerful tool that takes no time and gives out a great reward!

Wrapping Up

Those are my seven go-to habits for squeezing maximum value out of AI without letting my own coding skills collect dust. Whether you’re brainstorming with an LLM, double-checking every suggestion, or carving out “AI-free” deep-work time, this flow will keep you both productive and sharp. What AI +code tricks have you picked up in the age of AI? Drop your favorite tip in the comments I’d love to hear how you strike your own balance.

Read Next

Explore Blog
After building many sites with Webflow, here’s my go-to stack from planning and design tools to automation and custom features.
My Webflow Toolkit: Tools, Tips, and Resources I use daily
A dev with 16 years of experience shares what it’s like coding with AI in 2025—how it helps, where it fails, and why problem-solving still matters.
Coding with AI in 2025: What It’s Really Like
Most people assume better software quality costs more. The truth? High internal quality makes future development faster and cheaper. Here’s why.
High-Quality Software: What Is It and Why Is It Worth It?