Short Stories from the Life of a Developer

Author: Miroslav Jovanovic

  • Silence is what remains

    Silence is what remains

    It was the end of the ’80s, and I was in the middle of 5th grade. In math class, I was given an issue of Math Journal—a publication made for students interested in math topics beyond the regular curriculum. I was a bit above average in math, so the teacher subscribed me without even telling me. In that terrible socialist country, these things—and many others—were free for those who showed interest.

    Of course, I didn’t like math. I flipped through the pages and didn’t find anything interesting. Toward the end, there was a chess problem, which caught my attention a bit. But there were too many possible solutions, so I kept flipping. Chess is for nerds, I thought…

    And then, on the very last page, there was something I had never seen before: a task from computer programming. What the heck is programming? It immediately captured my interest.

    I couldn’t understand how I was supposed to solve the task. I couldn’t possibly imagine how I would tell a machine to calculate the area of a triangle. Any given triangle! Oh boy.

    There was also something mentioned about programming languages. Wait—there’s a language that the machine understands? And I can learn it?

    At the bottom, there was a solution from the previous issue. I saw a “program” that told a machine how to calculate the modulo in a division. For any A and B at the input!

    It was a way to solve a math problem by specifying the logic that would calculate the result. And it would work for any input! This was how you told the machine what to do and always get the correct answer. Boy, this was a way to talk to a machine.

    This was a revelation for me. Ever since then, I’ve been into programming and computers. Some of my friends also got interested, but they were mostly into games, while I was buying every programming book I could find. I became obsessed.

    But there wasn’t much literature available back then. English books were out of reach, and only a few local authors wrote in my native language. Still, there were some great computer magazines in that terrible country.

    I read anything I could lay my hands on.

    Man, I was reading the original Commodore 64 manual—written in German! And I didn’t even speak German. I still don’t.

    Programming became a true passion of mine. It was the only thing I wanted to do in the future. My friends wanted to become astronauts, actors, footballers, carpenters—most of them didn’t really know. But I always knew what I wanted to be: a programmer.

    I had other interests, sure, but programming was my passion, and I planned to turn it into my profession. Doing a job you love and have a passion for—what could be better, right?

    And I did become a programmer. I studied computer science, started working, and learned so many things. The dream came true.

    For a couple of years…

    Today, after more than 20 years in the industry, if I were to find a lamp, rub it, and a Genie offered me three wishes, the first two would be for my family and for a stranded humanity. But the third one would definitely be: Please don’t make me write a single line of code for the rest of my life.

    And I’ve spent a lot of time thinking about what went wrong. What happened along the way?

    Is it because the industry changed so much that I, as a software engineer, do everything but software engineering?

    Is it because of all the processes and constraints we impose on ourselves, making it feel impossible to deliver?

    Finish the coding. Test locally. Push. Test in staging. Code review.
    Do all the changes from the review. Change code. Test locally. Push. Test in staging. Fix tests. Fix linter. Static analysis. Merge.
    Oh, someone merged something. Conflicts.
    Resolve. Test locally. Push. Test in staging. Fix tests. Fix linter. Fix static analysis. Merge.
    Oh, someone just came back from vacation and had a small comment on your pull request…

    Is it the growing expectations companies have for me? All non-tech-related expectations. Or worse—wrong-tech-related.

    And I keep asking myself the same questions, feeling like I’m stuck in an endless loop.
    You know, while(true);

    Maybe I should be asking better questions:

    When was the last time you really solved a problem with your code?
    When was the last time you actually had fun coding?

    When was the last time you felt the same excitement you did when you opened that Math Journal in 5th grade?

    What happened to that passion and drive that made you struggle to understand a book in a language you didn’t even speak?

  • How I got deprecated by AI

    How I got deprecated by AI

    I used to be a brilliant developer. I could write beautiful code, understand stakeholders even before they spoke, and I was able to answer any question about our complex domain in seconds. Sometimes all at the same time. I could tell the history of every line of code in our projects — when it was written, why it was written, who modified it, and who wrote the best and worst version of it.

    I used to spend my evenings reading about how Java counts references to objects to dispose of unused ones. I used to discuss the differences between pointers and references in C++ over coffee. Man, I was living my dream.

    I had great conversations with my peers regularly. One day, I was having coffee by the water cooler when my colleague Shanya came along. She was mumbling something about wasting so much time trying to get answers from ChatGPT.

    • I should’ve googled it, like every normal developer. Stack Overflow, whatever…

    Back then, AI was pretty new, but people had already started fearing it would replace us all eventually. I wanted to get another opinion, so I said with a grin:

    • Hey Shanya, take it easy — in a few years, it’ll just be ChatGPT. No more us.
    • Yeah, right! — she almost yelled. — I can totally see ChatGPT setting up Service A, B, and C, Kafka and AWS queues, plus external CRM and payment integration every time Jim from Product wakes up with another brilliant idea — one that’s not even clear to him.
    • Sure, just tell it to ChatGPT and by lunch your idea will be in production.
    • He he, yeah, that’ll be the day.
    • Don’t worry, Miro. From what I’ve seen, it won’t be able to replace us anytime soon.
    • You’re safe for at least 10 years! — Shanya said.

    I must say I felt a little reassured, but I still decided to check the job market later that evening. I had a habit of browsing new opportunities from time to time, even when I wasn’t actively looking — but I hadn’t done that in a while.

    I was surprised to see how many developers were looking for jobs. Every open position had 100+ applicants. Hundreds of developers like me, searching. Had I missed something in the last few years?

    I explored the companies deeper. I found startups building very simple products. I installed some of them — they were really easy to use. Judging by the reviews, mostly young people instantly embraced and understood these tools. Literally products for a new generation.

    Some of these companies offered similar products and services to what my company was doing at the time. My company had over 1,000 employees. These startups? Five or six people total.

    I shut the laptop and went to dinner. I didn’t know what to think, but it seemed to me that companies with 10 employees couldn’t build serious services. Anyway, under my mantra #ForeverDeveloper, I decided to double down on sharpening my skills. All this AI fuss was just an empty balloon. AI would never reach my level of ninja developer.

    And indeed, over the next year, I mastered Kotlin and Spring. I could talk about JVM internals like people talk about the weather. You could’ve woken me up in the middle of the night and asked about lambda expressions — and I’d know the answer.

    But during that year, I also noticed changes in the company. I saw more and more new colleagues without any deep knowledge of a particular domain. Power users of hundreds of tools — not developers. None of us devs knew how to work with them. We made jokes internally, wondering what their role was and what they were even paid for.

    We didn’t know how to refer to them, so we jokingly called them Z vibers.

    But then we started to notice how well they handled business people. Tech and business had always felt like two separate worlds. Our Z vibers were the ones finally bridging that gap. They could talk about tech with business — and business with tech. And somehow, we understood it. It felt natural.

    In crisis situations, when we had to fix something fast, we ninja developers usually did something ugly, just to make it work. Fix now, improve later. But Z vibers? They were able to come up with beautiful classes and solutions, even in those chaotic moments. They contributed code I’d later study, wondering, How did this person come up with such elegant code, solving exactly what was needed, in such a short time?

    But my status as a ninja developer was still unshaken. I was learning new things. Reaching developer sensei level. I was safe.

    Until one day, I found myself looking for job opportunities. For real this time — not just browsing the market.

    It’s 2030. HR asks me what I can do. I say:

    • I can code.
    • Haha, phew! Even ChatGPT can code! But can you do something real?
    • You can ask me about JVM internals. Or lambda expressions.
    • Do you have any real skills?
    • No, I’m a developer. Senior developer.

    It’s 2030… or 2025? I’m not sure…

    Read the story from parallel universe here.

  • How I Outsmarted Artificial Intelligence with Natural Stupidity

    How I Outsmarted Artificial Intelligence with Natural Stupidity

    I was always an average developer. Although I had stardom moments, most of the time I struggled with basic programming problems—how to organize my classes, refactor the code, and where to put what. Until someone would make a simple remark in a code review or a water-cooler discussion, and suddenly it all made sense to me.

    Sometimes I was confused about whether to use an AND or OR operator in a condition. That’s how bad I was.

    I had problems understanding what I was truly working on. There was always this brilliant developer on the team who knew the exact answer to every question. He pointed to the exact part of the system where the issue lay and could tell the whole history about this particular part of the code—how and when it was created and how it evolved over time.

    I was never that developer.

    I, on the other hand, had to think long about every problem or question, and sometimes had to sleep on it for a few nights. When I came up with the solution, it was usually too late.

    At some point during my career, AI became a hype in software development. Everyone was talking about it.

    I knew that AI would never replace me at my desk. I mean, how could AI figure out all the required changes in our multi-service ecosystem, think of the ways to implement those in different services, test, and make them all work together? C’mon, every task I do is a struggle just to even set up the environment so the services can work together. Sometimes I just rely on tests in one service and test with other services in a staging environment. No, AI will never be able to do that.

    But then again, I remember the hype in the industry when the Internet was invented. Yes, I’m that old. The Internet itself is a much simpler thing, and still, it disrupted the whole industry.

    So I thought I should not underestimate the impact that AI would have on the industry.

    I thought, instead of AI making me obsolete as an employee by replacing me at my desk, I could imagine companies changing—new companies using different tools to create products that are more suited for the current generations; companies changing their approach to developing products and services. I imagined companies that understand the moment and the new user base, able to deliver with tens of fewer employees than traditional companies.

    I decided to incorporate AI into my daily work. When I designed a new feature, I sketched the solution into a few classes and asked AI to implement it for me in the way I imagined. It worked pretty well. It even refactored the code the way I told it to.

    When even the most stupid thing was not clear to me, I could ask and get the explanation I really understood.

    Then I thought, I can try to create something of my own using those tools. I could learn frontend and implement some of the ideas I had along the way. I already knew the backend. I could fill in infrastructure gaps also with aid from AI. I could have a complete product myself.

    So I tried many ideas.

    I used ChatGPT to create a React frontend for an appointment scheduling app, and also used ChatGPT to automate email communication with users. Success bookings, reminders, and error emails were all handled by AI.

    Then I switched to Copilot to create a React app for displaying all possible guitar scales. I used AI to also help me with my pipelines, building out my CI/CD.

    I tried building a shift scheduling app, again with help from AI, to create schedules based on rule inputs. I also automated communication about shifts, including the ability to cancel or swap, using ChatGPT. It was the best customer support I’d seen—and it was automatic.

    I tried those ideas and many more.

    And I failed in all of them.

    But the industry changed very quickly. Many companies struggled, and layoffs were inevitable.

    And when layoffs happened, some were kept. Some were even able to find jobs in other companies. Not the ones who kept JVM internals in the back of their head. Not even the ones who mastered object-oriented principles and were able to apply them in no time.

    The ones who stayed—or got hired—were those who could adapt to new tools and use them to quickly build and deploy complete products and services. With a little help from AI.

    And users loved the products, according to the reviews and reactions.

    It’s 2025. I’m still an average developer. But I build brilliant things for people.

    Read the story from parallel universe here.

  • I am a developer. Senior developer

    I am a developer. Senior developer

    Everybody wants to be a developer. You get a MacBook, a kicker table at the office, free lunch, coffee and fruits and, if you’re lucky, you can even get a chance to work from your home most of the time. How cool is that?

    Because being a developer is so awesome, I was curious to explore a couple of days in software developers’ lives. From my view of the fly on the wall, being the most invaluable and insignificant employee on the team.

    Analysis and Synthesis are developers, senior developers. Everybody suspects they are Greek, but nobody ever dared to ask them. Our company’s Manifest of Seven Great Values strictly forbids conversations about nationality, gender, religion, sports or literature. In fact, the only things that the Manifest allows are conversations about weather, Netflix series and software engineering topics. We value freedom, diversity and openness, and that’s why these topics are forbidden.

    • It is raining today…
    • Yes, indeed. It also rained yesterday…
    • And the day before – someone would add.
    • No, I am sure I was fixing the deployment pipeline the day before. And I never fix the pipelines when it rains. – someone would reply.
    • Actually, I am not sure myself. I spent the whole day watching Netflix.
    • I hope it will not rain tomorrow…
    • Why?

    These kinds of talks were happening by the water dispenser.

    Soon after the morning chat, it was time for daily standup. The team went to their desks and then met in the Slack room for a meeting. Besides Analysis and Synthesis, there were two more developers – Greeny and Pushy, product owner Prodo, and scrum master Scrumico.

    • Good morning, team! – Prodo started – I hope you had time to rest and you are ready for new challenges. Because we have a new requirement and a big challenge ahead. Yesterday evening I was approached by the finance team, and they brought to my attention the difficulties they have with inconsistent address format in our orders. At some point, our fellow Shouldy decided to make an address field in the orders table a free text entry, and that makes it hard to create data analysis for the finance team. We will have to find a way to split this into separate fields: street, number, zip code and city. And we have to treat this with the highest priority. What do you think, team?

    The awkward silence broke out in the virtual room. Here and there some ‘Hmmm’ could be heard.

    Shouldy was also a senior developer. He spent an extremely long period at the company, somewhere between 2.5 and 3 years, and he designed most parts of the application. His name could be heard very often among current members of the team, what he did well, but mostly what he did wrong and how he succeeded in blocking 80% of all further development even after he left the company.

    • I think this opens up a lot of questions – first started Analysis. – What should we do with existing data which is all contained in a single field in who-knows-what format? Besides reports, we need to change the user interface. What about the validation? We should allow input of only valid zip codes and cities. Maybe there is some external service for validating if the street exists, maybe from the National Post?
    • Hmmm… – Synthesis added.

    Another round of awkward silence. Luckily, Scrumico had a suggestion.

    • Hm… I remember the customer service team did a similar thing some time ago. They faced a similar problem when trying to make a breakdown by city and region, so they added zip code to their reports. They might be able to help us.
    • Customer service has a completely different database and what they did was probably just adding a field in their SELECT queries – concluded Synthesis quickly.
    • Are you sure that’s what they did? How do you know this information? – Scrumico asked.
    • Well, not sure, but I assume – Synthesis confessed.
    • Ha! Never assume! One of the main principles of agile. Have you been visiting the agile workshops I’ve been organizing?
    • Yes, but I will apply again – said Synthesis, a little bit ashamed.
    • Anyway, I know who can help. I will send you the contact later, so you can ask about their experience and see if there’s something you can take away from there. – concluded Scrumico.
    • Good, that’s fixed – said Prodo. He had the habit of using that word ‘fixed’ so it seemed like he was actually always fixing something.

    After the daily standup, Analysis was still confused. So many questions he had were simply ignored and the ball was transferred to Synthesis. He wanted to discuss it with Synthesis, but not until he had everything sorted out in his head. So he started to investigate on his own a little bit, then he would align with Synthesis and get back to his own task.

    In the afternoon, Synthesis got a message from Scrumico: “Hi, sorry for my late response, I was jumping from meeting to meeting and didn’t have time to ping you earlier. You can contact Rupert from reports, he will be able to help you.” Synthesis had a feeling this was a waste of time, but he had to fulfill his prophecy.

    • Hi Rupert, sorry for interrupting you. I was told that you have recently added zip code to your reports, so you can make a regional breakdown easier. We are facing the same challenge and I was wondering if you could share your experience and maybe help us out. Thanks!

    After an hour and a half, Rupert answered:

    • What zip?
    • Did you add a zip code to your reports recently?
    • No
    • Did you have problems making a breakdown by city in your reports?
    • Yes
    • How did you solve it?
    • We added a postal code to our reports.
    • Ok, can you share your experience with that, maybe it will help us do the same? – Synthesis was already green in his face.
    • Sure, why don’t you simply ask clearly what you need 🙂 Have you been visiting structured communication workshops? You should check them out 🙂 But anyway, we added a field ‘postal_code’ in our SELECT queries.
    • So you didn’t need to normalize the database, or anything?
    • Can you repeat the question?
    • You already had a ‘postal_code’ field in your table?
    • Of course we had it, how would we add it if we didn’t have it?
    • Cool, thanks Rupert for sharing your experience, it was very helpful.
    • Always man :+1

    Synthesis had a feeling he already wasted a lot of time for nothing and the job needed to be done. So he decided to take things into his own hands. He made a migration to add new fields and then he took sample data and started looking for patterns. He was able to quickly come up with a couple of regular expressions to extract data into new fields. He made the migration script out of it. He was also good at JavaScript, so he adjusted the user interface in no time.

    Everything seemed in place and he felt a wave of joy and satisfaction for doing the job himself, without these unnecessary and fruitless back-and-forths imposed by others.

    He also added indexes for all new fields, so the aggregation and all the crazy joins that the finance team may come up with can be possible and even performant. He also added a few compound indexes to make sure all the combinations were covered. He gave his pull requests to Greeny, a young and smart developer who was still new to the company and mentored by Synthesis.

    Greeny had quite a few comments and suggestions about code formatting, forgotten block comments, unused imports, and shortening conditions using the coalesce operator. But those were just small things for a senior developer like Synthesis was. It was corrected in no time and pull requests were merged. Release was happening.

    Synthesis was happy he did the task so quickly. He went to take a coffee and talk about the weather. He even went home earlier because he felt he had accomplished his mission for today.

    All this time, Analysis was trying to find the answers to his questions, to be able to join forces with Synthesis and do the task together. However, there were many unknowns, so he did not have anything in hand to start the conversation with. Prodo was not able to provide any answers to the questions already asked. Prodo just mentioned that, whatever we do, we want to have the metrics to measure the impact of our change.

    Metrics! Now Analysis was paralyzed!

    Tomorrow morning, everything seemed normal. A bunch of people around the water dispenser, discussing the rain and some new Netflix show that was announced. Synthesis was still full of confidence because he solved the problem so easily and fast and, most importantly, by himself. Analysis looked already exhausted and ready for retirement.

    When Synthesis logged into his computer, he saw a dozen messages in the deployment channel in Slack.

    • Who added these new fields to the orders table?!?! The ALTER command took 4 hours to execute!!!

    Synthesis knew that the table was locked for 4 hours and no user could use the application during this period.

    And that was not all. Customer support had been receiving a lot of complaints about extremely slow application performance ever since the last release. Synthesis saw a message in the database channel:

    • Who added so many indexes on a table this big?!?!

    The primary instinct of a developer in this situation is: rollback. And Synthesis hit the button automatically…

    This time the service was down for 5 hours… but this time not due to the database, but that’s a topic for a whole other story…