Developer's golden cage
Tags: tooling, githubcopilot, vim, opinion
Published: 2024-04-14 14:42:44

## The observation

Recently I started working on different tech stack. I'm primarily an Android developer, I know Kotlin, Java, and Groovy, using Jetbrains IDEs. Now I work on a backend project in TypeScript, with GraphQL API, using VS Code. Quite a difference.

I noticed how much I miss the static typing, the decent IDE support for types, and simple mocking for tests.

So I started thinking, is it TypeScript and VS code that sucks, or I just became too comfortable with the tools I know. Too dependent on my IDE, my plugins, my key bindings, my tools, and my language.

Aren't dependencies bad, like generally in programming? We always try to avoid or limit them.

I even added a new dependency to my already bloated stack. AI assistant, Copilot, ChatGPT. I know how to code, I just don't know Typescript that well, so instead of learning it, I ask AI to write me the code I described. Sometimes I ask it to explain to me what is going on in some code or help find the best solution to a problem.

But not always, I'm often happy with just getting code that more-less works. AI itself is a great tool - if used wisely. Explaining concepts, comparing solutions, giving alternatives.
But it's just too tempting to `just get the code generated`. Fire and forget. And I tend to fall into this trap.

It seems like I've automated the process of copy-pasting from StackOverflow. In technologies, I know I wouldn't make silly errors, non-compiling code, or linter alerts. I don't want to see them in the new tech stack, but I'm not willing to invest the time learning it the hard way.

I don't have the same amount of humbleness as when I was first learning how to code. Back then it was always my fault, my lack of knowledge when something didn't work. But I could sit on my ass and grind for hours until I got the code working. I can't and don't want to anymore.
Now I know what to expect from code, how things work and how to solve problems in the project. I usually know the syntax (come on, programming languages are not rocket science). What I miss frameworks, nuances, or idiomatic ways of doing things in a specific technology.

## Snowflake

I became a snowflake. I can work without soy latte and avocado toast, but not without my IDE, AI, or hardware I'm used to. I find myself taking offense when my code doesn't work immediately, or when I struggle to solve a problem. And as a true snowflake, I don't find problems in myself. Oh no, this is the everything else problem, not me. The language is bad, and the IDE is wrong. The AI helps, so I'll rely on it. Another dependency on the already bloated stack.

![tell me that I'm stupid without telling me that I'm stupid](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fc8gwvk5kpvovey8x47.png)

> Tell me that I'm stupid without telling me I'm stupid. Compile time error.

Most developer surveys will tell that people are generally happy with Copilot's help. Because of the same reasons I rely on it so badly. "It makes me faster and more productive", "I make fewer mistakes", and "I don't waste time thinking on syntax". Thats all valid points, but there is a hidden cost. Lost opportunity to create a stronger neuron connection in your brain, when you fail 10x times before finding a working solution. When the code is generated by AI I tend to not remember details, I fix it here and there, maybe rename something, and that's it. I may not be able to recreate similar solution to similar problem, and go back to AI help again.

Recently I saw a video of [Primeagen](https://www.youtube.com/watch?v=GkmUwDXvWiQ), where he comments on another [video](https://www.youtube.com/watch?v=Wap2tkgaT1Q&t=0s) about leaving Copilot behind. There are some interesting findings. The "Copilot" delay, so writing code in a way you make space for the Copilot to kick in. You wait for the nice AI to help you write code. It becomes a habit. A dependency.

I did get my fair amount of irritation and failures, feeling stupid and worthless when learning programming. But I did learn it. Was it so bad I tried to avoid it by the cost of depending on external tools and getting comfortable in my golden cage?

> The cage is not the problem, but getting comfortable in it is.

I think it's the wrong direction. I want to go back a few steps, take the irritation pill, and power through my limitations. And... limit my dependencies.
I want to build some sort of `developers survival kit`, a minimum setup (both hardware and software) that I can still effectively use for work. Just in case I have to run from home and all I can take is my laptop. The war next door made me think about it... Like what will I take if I have 2 minutes to pack and run for my life?

Hardware can also spoil. I believe I've gathered a decent collection of gear. Ultrawide screen, mechanical keyboard, ergonomic mouse.

I remember having some full-size gaming keyboard with 18 extra macro keys, now I use 75% and I don't think I'm missing something. When I started my first programming job I got an old iMac with 2GB of RAM, which was not enough to run the AngularJS app, IDE, and Source Tree for Git. I had to downgrade my IDE from WebStorm to SublimeText, and start using GIT from a terminal. And I still do. Even though I can afford to run a GUI app now, I just don't need it. OK, I enjoyed GitKraken but not enough to pay for it to use it with private repos.

But it got me thinking again: if you start from a complex GUI app like SourceTree, do you even know how GIT works? Or you know which icon to click. If you start from IntelliJ Idea, do you know what commands are running when you press the play button? You probably do to some extent. And you may started similar to me, in simple editors annoyed with the amount of typing and hoops to perform mundane tasks. Then discovered nice IDEs that do all that and more and just stayed there. In a comfy zone. Getting used to countless notifications, panels, distractions, and dependencies you now rely on.

## My plan

So I plan to reduce what I need to be comfortable programming to a minimum. I identified 3 areas: hardware, OS, and IDE/Software. I'm comfortable using a touchpad and laptop keyboard - I guess I'm good here. I used both Linux and MacOS for years at work. Windows is for gaming. Sorry. The biggest change would be ditching IDE in favor of terminal tools. I'm not addicted to AI code generation yet, and I will try to stay out of it :)

I will try to:

- reduce using AI for generating code
  - use it for code I would write anyway the same way, that it's tedious, and I understand every single part of it
  - if anything is unclear, use AI to explain concepts, google stuff, read some docs and **MAKE NOTES**
- limit IDE dependency
  - switch to Vim :)
    - and learn how to use it effectively
  - try to remember more code, names, etc. but without exceeding the limits of healthy cognitive load
    - I want to achieve by this, some discipline in naming stuff, so I don't need to remember that much but still can find everything I need without much IDE help
- use a standard keyboard layout
  - no 40% or Corne with layers. For now.
  - I don't want to train muscle memory for some custom layout keyboard
- use 1 screen
  - learn tmux

Wait what? Instead of learning one new IDE and language like a sane person, I go for turning the table upside down, downgrading (debatable) to a terminal tool, and spending hours learning how to use it, hoping at some point I will get close to my original productivity. But that is not my point, I'm not a masochist.
There always will be "one new tool" and I'm curious about using something almost as old as me, that can run on a calculator. An omnipresent tool, on every Linux, Macos, and probably Windows also has it available.

What I hope to achieve is to focus more on the work I'm doing rather than tooling. I already noticed writing this post in Vim is kinda nice. Just me and the text. I also want to use less mouse. Weird flex but still, I think it's cool - old-school hacker style.

There is reasonable fear, that AI will replace software engineers. But tell me, who will be replaced first, those who currently rely on AI, particular IDE, tools, and plugins, or those who can create anything, using terminal tools, with deeper understanding of technicalities? I'd say the first kind should be worried. My goal is to be like Rambo, but in programmers sense:

> A man who's been trained to ignore the pain and ignore the weather. To live off the land... To eat things that would make a billy goat puke.

It's always gonna be `survival of the fittest`.

The upcoming process may not be as enjoyable as I'd like, similar to my aversion to healthy food. But in the end - it's going to be good for me. Limiting distractions and dependencies is good.
By all means, I don't want to make my life harder by losing all the helping tools just for the sake of bragging how cool I am with my terminal setup. I see this as training, as forcing myself to get uncomfortable and learn like I used to learn.
I remember hearing a decade ago from a university buddy, that the best Ruby programmers use just Vim to code. I thought it was crazy and unreasonable, but maybe there is a method in this madness.

> Slow success builds character, fast success builds ego - Ratan Tata

This post was written in NeoVim. It was painful at first but I'm slowly getting used to it. Let's call it a good beginning.
I noticed that I get no distractions when the terminal is full screen and all I see is Vim, which is a good thing for writing. Or coding.

## How about you?

What are your thoughts? Are you already using Vim? What is your Minimum-Viable-DevSetup? Or you can't imagine leaving fancy IDE and Copilot? If you can't I think you should. Leaving your comfort zone is part of life, a life that is full of experiences, and not just cozy safe feelings.