I was a damn lucky kid when I graduated college. It was 2019, and recruiters were flooding my LinkedIn messages with positions in every major city near the suburb I lived in. I had so many offers I was able to negotiate a salary almost as large as the collective income my two parents raised me with, and that was the floor for my budding career. The pandemic soon followed in its horror, but the position I landed almost seamlessly transferred into remote work. Not only was I safe, I was still getting calls for job offer after job offer. Recruiters had more junior positions than they could fill, and were desperate to put butts in seats. I was in an employee's market that may never happen again in my lifetime. Times were good. Materially. But there were many...*interesting* quirks in the positions I worked. At my first position one of the first tasks my supervisor gave me was to remove all the "unit tests" my predecessor wrote because they kept failing. I write "unit tests" in quotes because at best they had more mock statements than actual exercised code. Others had deep integrations with remote databases, and seemingly passed and failed at random. I was actively discouraged from writing automated tests, which meant single line changes ended with me having to exercise entire codebases by hand and examine gigabytes of data. For every day I spent coding I spent a week testing. And manual testing came with manual errors. In a perfect world, I would have been given as much time as I wanted to refactor the entire codebase with automated tests running at 100% coverage. And upon concluding my work I would have been seen as the hero of my company. In a less perfect world, management would be aware of these issues would consult me on what could be done to address them. We would work together to synthesize good-enough solutions that were reasonable and suited business needs. However, we live in a world where there was a culture in our department to blame end users for code instability. If something crashed on a new input, I was expected to make a case to other departments that they wrote their requirements wrong. I had an end user come up to me one day almost trembling in fear. She sneezed when she clicked on a job submission, accidentally hit the mouse twice, and concurrently set off two work processes which ended up bringing down our backend. I'm glad I was able to reboot everything before any higher ups noticed what happened. These objective quality issues don't even speak to the subjective quality of this code, which despite being Python, looked like cargo-culted Java written in styles popular before I was born. They didn't speak to the passwords we dumped to plaintext logs, or the private binary keys my seniors were committing to source, or the hand-rolled json parsers and formatters written with C styled for loops in the front end, or at this point I just remembered sanity is a finite resource and I think I'm going to stop. Looking for greener grass, I moved to a new position. I took a contract that should have been a simple ETL migration. My team consisted of me, another programmer, a project manager, and a business analyst. I was tasked with setting up the cloud infrastructure while the other programmer wrote the business logic. I still remember the first day I got on a Teams call with the other programmer. He shared his screen and had a tutorial up on how to write a for loop. Uh-oh. This project was a mess for more reasons than I can write up here. But by the time this other programmer had 1) not finished his work and 2) "moved on to a better position," we were well past deadline. I inherited a bunch of barely functioning StackOverflow copy/paste headaches and by the time I was able to deliver this project we were so over deadline there was no way I was being considered for a contract renewal. It turns out our hiring manager was interviewing so many candidates that were lying or otherwise dishonest about their work experience he thought highly of candidates willing to say they didn't know something. During my interview I forgot the terms OLTP and OLAP. I said as much, which I found out later the interviewer appreciated. I guess the other guy said "I forgot" a lot sooner. Sometimes you get dealt a bad hand. But the job market was still hot and I moved on. Within two weeks of my contract ending I had a full time position at an AI shop. Do you think this story gets better or worse? No test environments. Just a bunch of EC2 instances where we all shared a root password. Databases in containers without volume mounts. Code full of ``try:except:pass``. In one project, data was "stored" in message queues. When code consumed the messages and failed there was no way to trace the failure, if it was even noticed. It's really tough to get called out for having errors in your code when they all disappear into the ether! But to be fair, perfect code doesn't ship, and with a lot of manual intervention everything was able to run. And we shipped our data analysis to our clients! And so much of it was incomplete and incorrect at least one of them stopped paying us. This place eventually popped. And when I went looking for a new job, there weren't any. I entered the workforce when interest rates were so low people were speculating on what would happen if they went negative. Investors had to make money but also had to compete with loans that would barely turn a profit. So they casted extremely wide nets throwing money at anyone with an idea in hopes of getting any return possible. A lot of these ideas needed programmers. And it turns out when companies are desperate for programmers, they will hire almost anyone. But now it's more expensive to borrow money, so investors are funding less ideas and they're not desperate anymore. Jobs are harder to find, salaries are lower, and the luxury of working remote is fading. But the other side of this coin is these companies are now desperate to make a profit. That means they need good ideas *and they need those ideas to actually work*. Snake oil and grifts are going to die faster, and they're going to suck up less of the supply of coders. The fakers and incompetent are going to have to fight harder to not get weeded out, and I hope the ones that fight become competent and capable. I'm optimistic that ideas that were never viable are going to be better vetted by investors in the future. And I'm optimistic that viable products are going to need viable teams. I've worked with more competent developers I loved and respected than the damaging ones I've mentioned, and I know they were being dragged down with me through all these issues. So I'm optimistic that company processes will correct to vet out bad apples ruining these great bunches. And I'm also optimistic to take this market as an opportunity to clean out any bad apple habits I have picked up over the years. After years of finding new and exciting ways to iterate over parquet and CSV files, I failed an interview because I couldn't write a BFS, which I don't find acceptable. So I'm playing around with leetcode. I don't want to solve the hardest esoteric problems but I need to make sure I'm not writing excessively naïve and inefficient algorithms. I'm also building a front end portfolio so I can transition from backend to full stack. Plus I'm putting this blog together to work on my communication skills and become active in more coding communities. I'm growing and going to become better. Good luck out there, and when times are good again, remember interviews work both ways. 😉 <font size=1>Published 2024-05-03</font>