programmingtechnology

Getting the Most Out of Basic Gemini for Coding Project

So I haven’t been blogging lately mostly because I haven’t really felt there’s been a lot of good topics I could write about. A lot of the news has been disappointing and even when there are things to write about, I’ve been struggling to find words or more importantly the passion to say anything that other people are better suited writing about. Beyond that, I don’t want to write something that seems forced and uninspired as my recent blogs have mostly just been reviews, which are fine but at least had some small amount of interest from me. However, there is a topic that I’ve been dealing with lately that I do think is interesting which is my work in coding with just Google Gemini in the browser.

Now, I know a lot of people are going to ask, “Why are you using Gemini? Why not use AntiGravity or some other tool? Gemini sucks!” So, I’ve tried a variety of plugins/IDEs, etc. The last time I updated Cursor, it went from a plugin for Visual Studio Code (VSC) to an agent-first application. I’ve used Windsurf, which is like Cursor but they changed and I haven’t really touched them in a while. The actual Gemini plugin for has been killed off because Google wants you to use their AntiGravity. I don’t touch Claude Code because last I heard they want you to spend money; similarly, I don’t even use Claude except when I’m in a desperate situation. And ChatGPT is in the same category.

But the bottom line is that I’m unwilling to spend a dime right now on any AI agent to do my work. I’ve tried Agent first products and some are okay but at least in my experience, they take a while to do anything, don’t necessarily produce the outcomes I want and are changing frequently to the point where you have to constantly be keeping up with the product to really figure out how to get the most out of anything. I read a lot of complaints on forums where people burn through their allotted PAID tokens quickly then are jammed on projects twiddling their thumbs and staring at their navels until their weekly refreshes come up. I simply cannot afford this situation at the moment. And it is a bummer for me because I do feel as though I’m getting left behind in this “great AI race” in terms of tooling.

At the end of the day though, I’m not here to force myself to learn a tool that I may not necessarily like. I certainly am not going to pay for a tool on my own unless there’s a real benefit. I know some people have been able to make money from their apps created through some AI system like a Cursor. But I’ve also seen the resulting code and it makes me wonder just what the fuck people are doing.

Right now, you seem to have two types of groups and both are extremists on each end. Those that are all-in for AI agentic coding and more traditionalists who do not want to see their skills erode. At the end of the day, I’m going to continue to view AI on a whole as a tool that I will use as long as it helps move my needle forward. That’s it. I’m not going to swing one way or another. But at the same time I’ve been fairly impressed by the results I’ve managed to produce. Yes, the AI can fuck up but I can say one thing clearly right now: I ain’t paying for it when it fucks up.

Despite all this, the real meat of the matter for this post isn’t this drawn out viewpoint. Instead, what I want to talk about is my general journey about my current usage with Gemini and potentially other tools in this field. So first, why did I choose Gemini of all the various tools? Why not a ChatGPT even though it’s better, etc.? Again, I must emphasize cost. Even with basic screen interaction, ChatGPT turned me off from the start when it imposed restrictions on usage. While I can appreciate that such a system is going to expensive to run on their backend, as a tool, this is horribly disruptive to my work flow; if I’m in the middle of trying to wrangle out an answer, I want that answer especially if it takes multiple steps.

At least at this stage, Gemini’s basic model that they give you has been unlimited in terms of the prompting and basic response aspect if you go with the default. When Gemini started, it did impose a limit too but at least at this stage, that limit seems rescinded for basic things. For coding projects, if there’s a limit then it probably occurs at a much higher level because I don’t see it. And for someone “who iz po” (I’m poor), I’m going to take advantage of this situation while it last.

When it comes to coding, my setup is pretty simple. I have a dedicated account for doing my coding projects and I try to reuse the same chat session to retain the context of the discussion. Now, with Gemini, the longer the discussion goes, the higher the chance that the conversation can bork down the road. In the past, one of the biggest problems I’ve encountered is that the context window/chat would get too large to the point where Gemini would not be able to respond. But I think that might’ve been older models and how it was handling chats. My recent project and chats do not seem to encounter these issues anymore.

One of the major stumbling blocks that I consistently encounter and does require a great deal of patient is the degenerative memory issue with Gemini over time. What that means is that despite you, the developer, knowing how a file may look on your end, Gemini slowly loses that bit of information and requires periodic “reminding”. That “reminding” ends up becoming this back and forth of uploading files and/or copy pasting bits of code into the chat. I think part of the issue is that Gemini was designed as an LLM so it wasn’t really built with permanent “memory” in mind. This is something the designers ought to work on. Likewise, it doesn’t have your project the way say AntiGravity does; but it’s clear that they want to steer you towards an AntiGravity because they can’t directly hook into Github, which stinks. So in that sense, you sacrifice some efficiency by using the chat mechanism as opposed to a dedicated tool.

When it comes to producing code, my biggest issue when you try to go from prompt to results is that Gemini has a tendency to overproduce or what I consider “overthinking” a problem. I know one of the keys to AI is the ideas of a greedy algorithm; so I think what’s going on is that it’s attempting to be “greedy” in terms of overproducing the results. In turn, it wastes a lot of resources because frequently you’ll see this massive amounts of data with citations, links, explanations, etc. when all you really want is a simple response.

The problem here for me is that combing through a single response becomes mentally exhausting for me. You have to assume that the response is either wrong or there’s problems with it especially if you have an architect’s mind like me (or worse yet, you’re a control freak like me when it comes to code). While it may be easier to simply copy paste the response back into a file as-is, you need to be highly discerning here. I think it’s the same with agent tools where one of the most frequent complaints I read is how developers have transformed into code reviewers as opposed to coders. I will address this idea later. But I treat the situation as though I’m the lead in a project and I have junior and mid level developers who are responsible for the stories/task from a sprint and my job is to organize and coalesce these results into something usable and maintainable. So you’re effectively a babysitter, which is where the mental taxation comes into play.

Now, typically the way I handle the situation is to severely restrict what the AI should be producing. I’ve read how people use something called “skills.md” files, which enforce architectural and product standards in a code base these days with various agent tools. Because I’m not using an agent tool to handle my code, I don’t really need a skill file at the moment. Nonetheless, what I tend to do is generally trust the AI to handle the conventions of a language. For instance, at the moment I’m doing a game project completely in React and Typescript. The AI has been doing most of the file, directory, function and class naming. This is fine for me because I don’t keep up to date with every little nuance in every language I use.

What I do pay attention to is how things are structured and the specific naming. Things like constant, types, etc. are critical because I think the AI/Gemini has a nasty tendency to try and solve the most immediate problem. Unfortunately, Gemini is not good at architecture unless you enforce some sort of standard so it will do things based on the data it’s trained. While I have seen improvement in this area, the one area Gemini and other tools (I’ve read/heard) are bad at is large projects. Then again, I’m not sure if anyone is really good at dealing with large projects mostly because there aren’t a lot of great examples out there (maybe open source ones but those tend to be more tools rather than business type of projects).

At any rate, again the point here is to severely restrict Gemini in the scope of the problem. The best way to handle a prompt is to treat the scenario like a sprint with stories and subtasks. The moment you try to describe a problem that’s too broad (i.e. Gemini, Make me money!), the AI is going to break down. Instead, bite sized chunks of problems are what you need to feed the prompt.

Let me provide an example here. For my current gaming project, I’m now dealing with building a save game situation. If I outright stated, “build me a save game feature,” Gemini would have so little context beyond the things we established that it might’ve created a whole backend solution with Firebase, etc. because the scope is far too large. Instead, what I did (especially because I’m building an RPG) is that I first went through an ideation phase where I brought in examples of other games with a save game feature that involved parties and state. I discussed how Bard’s Tale 3 and Baldur’s Gate 2 handled their saved games. Gemini is familiar with both games, but I need to give Gemini more context on how those games operated to show the aspects I wanted. But I needed to establish that as part of the ideation phase so Gemini could “learn” from my side what I generally wanted. Also, explicitly mentioning that the prompt was for ideation enforced to Gemini that I did not want any coding; it was meant to strictly be a discussion to flesh out the story.

Gemini then asked me a few follow up pertinent questions such as how I wanted to handle created characters and the idea of autosave/quicksaves. These were really good questions because the other games I mentioned have those scenarios or similar scenarios. Auto/quicksave was an easy one and I said simply, “Let’s not deal with that at this stage.” I could see that Gemini was eager to build out the feature, but we don’t want Gemini to do more than a small amount of features because we need to review the ones it produces and test them, which is still a pain in the ass (because I’m acting not just as a product manager here but a QA person too)

Now, the created character situation was far more complex which required more discussion on how other games handled that. Like Baldur’s Gate 2 does a snapshot of the current party but if you use multiplayer mode, you can import/export your own custom characters. Bard’s Tale 3’s saved game would just snapshot the current state of all characters in that moment. These two situations are quite distinct and have their own complexities, which means that the underlying save format/data structure required close examination.

I ended up going for a snapshot of the active roster + characters that are saved in the moment. What that means, is that I would serialize the entire custom characters into the file (actually the browser’s local storage) along with any flags that need to be set. Then if a player wants to start a fresh game, they would get new flags and just use the characters in the created characters local storage structure. But that new game scenario would need a separate process to establish the flags for a fresh game.

Right now, the only parts I have implemented are the saved game structure. I’m working on the new game portion at the moment yet it’s important to note that I needed to view how this scenario was going to play out and review the data structure before proceeding since this is foundational. Also, I needed to ensure that the AI wouldn’t attempt to create the new game screen, the town, the dialog screen, etc. because it was doing that and became too overwhelming to review.

Yet, that’s where I think the AI gets a lot of the errors in bigger projects. The AI generally is pretty decent with syntax but the long term problems end up being architectural if you don’t constantly keep watch and refactor as you progress on the project. This is no different than any normal project a person is on (as long as you have a supportive/reasonable SDLC/management team). But the key here is that only you can control the direction of the project and you should treat the AI as a junior/mid level developer in terms of trust with architectural decisions as well as long term project planning. But again I need to emphasize the bite sized chunk philosophy of features where as a developer, product planner and tester, you should not trust the output especially when these agents overproduce.

Now, I did mention syntax which is a huge thing to some developers. I might be getting brainrot when it comes to my hard coding skills such as knowing the exact syntax for certain idioms or situations with a Typescript. But let’s face facts here. Programming has become this monster with the various proprietary languages and the constant evolution with tools where strict memorization should be considered secondary. Part of the reason IDEs are great is that they help prevent common syntax issues with highlighting, etc.

In my early years especially with languages like Perl and Java, I did not have access to an IDE. I was on Vi (not even Vim!) with no syntax highlighting nor anything fancy. When I had to work on 1000 Unix servers at the investment bank in Japan, my only editing tool was Vi. I once made the error of using a semi-colon rather than a colon for a separator on some stupid ass passwd file that caused a ton of headaches for a lot of people. While that’s a simple error, the results were pretty catastrophic because I simply could not see the difference on a shitty command line between “;” and “:”. So having something that mostly is syntactically correct and helping to error check me is a boon because I won’t make a stupid mistake like that ever again (at least not the same kind).

I know there are developers who are resistant to this because I think having this memorized, privileged knowledge of syntax gives them a sense of power; kinda like that kid back in high school who would memorize the dictionary then use words without really understanding the context to impress his classmates. Generally, that kid turned out to be an asshole with various mental issues accompanying him because of this insecurity problem that was part of a huge self esteem thing. But this is no different. In my case, I value the results and having the tool to help solve a problem more efficiently and sometimes better than I ever could as opposed to showing how tiny of a dick I have. Keep that in mind.

The one thing I will say though and I’ve brought this up in the past where I’ve discovered a weakness is on certain APIs or external frameworks, tools or packages. For instance, one of my biggest frustrations with React applications is validation and managing forms. For web applications, I have commonly chosen react-hook-form in conjunction with Zod. Now, Zod has some major differences between the 3 & 4 versions where the AI may not be trained. So at least in the past when I used these two together and had Gemini write me up schemas and tried to reincorporate them with react-hook-form, it ended up being a pure nightmare. The worst were number formats; to me this is more of an issue with incompatibility and how Zod’s change deprecated the old changes but it doesn’t really solve the other problem where the AI is only as good as its training data.

With my current gaming project though, I’m using very limited external dependencies at the moment; just Tailwind for CSS, Typescript, basic React, Vite and Zustand for the store. There have been limited form elements but I made an early decision to NOT use Zod nor react-hook-form because those are overkill on this project. Instead, I found it better to have custom inputs with their own messaging, which has worked out quite nicely especially because my game has it’s own stylization. If anything the lesson to me with Gemini and external dependencies is the less used, the better because you won’t have to deal with as many incompatibility issues.

What about storyboards and unit testing? While I’ve structured my code to allow for these types of things, I simply don’t feel they’re necessary. I think storyboards are great when you have a larger team and want to give your product managers a way to view how a component may look and behave. And unit testing is good for teams when you have immense amounts of change but don’t necessarily trust your developers. In the case of having this 1:1 relationship with Gemini, I think both are storyboards and unit testing are redundant at this stage.

Overall, the one thing I constantly question myself over is whether or not I’m being as productive as I can be. Does Gemini actually inhibit my speed or does it make me more productive than I normally could be? Or would an agent first tool increase my overall velocity?

My guess is that no matter what, using an AI tool or tools would still require me being a babysitter for the code. I’m an admitted control freak when it comes to code and organization even without these tools so my OCD would get triggered no matter what. In that sense, I am my own worst enemy.

But as far as velocity, I do think that the tool is great for me. Maybe I’m not as fast as some friends that pay for their tools but the bottom line for me is that I’m able to make my limited resources work for me (in a very literal sense). Something like Tailwind would have bogged me down for days in terms of getting a component to look in a certain manner. But I know for certain that for the game I’m building, I would not have been able to come up with the UI without Gemini.

Then for the way the project had been setup, I must admit that I was just copy pasting commands from Gemini onto my terminal. And I have no shame about that because I hate trying to search and find some crappy Stackoverflow page that isn’t outdated or peruse through hundreds of results only to find some authentication walled off post that an asshole is trying to charge for that may not necessarily have the answers I really need. None of that was productive to me before and I didn’t feel like I really learned anything back then. So not having to do that menial part of the job has improved since I can go directly to the AI and it usually gets what I want done in a reasonable manner.

Is the situation frustrating to me? It’s like having any junior or midlevel guy working along side you where the mistakes aren’t as much syntax related but just big picture. I’ve worked with some really shitty people in the past (both in terms of skill-wise and as personalities). Let me tell you it’s difficult trying to find good talent that can coexist with how you do things (especially if you are a control freak like me). So yes, I have to do a lot of babysitting but generally it’s not that bad. There are error corrections and I need to get the AI to correct its course but that’s better than going into a sprint for days and not knowing what your coworkers are going to produce. Then when they go to code review, you’re shocked at how bad the output is and you’re forced to surgically fix everything because they’ve torpedoed the whole project with a bad commit. So I prefer my situation far more than to previous situations in dealing with people.

Is my situation ideal? No, of course not. I’d love to have access to these cutting edge tools but the reality is that I’m budget constrained. If someone would pay for my project, I’d gladly upgrade my situation to use better tools but it’s just not possible at this moment.

But the real point I’m trying to make here is that given my situation, I’m able to make the situation work for me. That’s what a real (good) tool does. It’s not supposed to solve all your problems; that’s the Silver Bullet/Golden Hammer/God Object anti-pattern. Gemini is a good chunk of my current arsenal but in truth the real tool still is my experience, base skills and vision of what I want to accomplish with this project or similar projects where I’ve used Gemini. At least for myself, I’ve managed to get some decent mileage out of it. At the same time, I set my expectations appropriately, which are to produce reasonably error free (syntax-wise) code that mostly works and generally does what I want it to behave. Gemini nor AI are mind readers; nothing is currently. Having unrealistic expectations for such a project are exactly what sociopathic CEOs possess as malformed behavior. I’m enough of a realist and have been through enough where I can see the balance and convergence of these things.

 

 

 

(Visited 2 times, 2 visits today)

Leave a Reply

Your email address will not be published. Required fields are marked *