메뉴
HN
Hacker News 25일 전

데이터베이스를 삭제한 건 AI가 아니라 당신입니다

IMP
8/10
핵심 요약

최근 한 개발자가 AI 코딩 에이전트(Cursor/Claude) 때문에 회사의 프로덕션 데이터베이스를 삭제했다고 주장하며 화제가 되었습니다. 하지만 이 글은 AI를 맹비난하기 전에, 애초에 전체 데이터베이스를 삭제할 수 있는 위험한 API 엔드포인트가 존재했던 시스템 설계와 운영상의 부주의가 진짜 원인이라고 지적합니다. 개발자는 AI가 작성한 코드를 맹신할 것이 아니라, 자동화된 안전장치(CI/CD 등)를 갖추고 배포 과정을 철저히 통제해야 할 책임이 있습니다.

번역된 본문

지난주, Cursor/Claude 에이전트가 자신의 회사의 프로덕션 데이터베이스를 삭제했다고 주장하는 한 남자의 트윗이 화제가 되었습니다. 우리는 방관자의 입장에서 그가 에이전트에게 "절대 이 작업을 수행하지 말라고 했는데 왜 삭제했냐"며 자백을 받아내려 하는 모습을 지켜봤습니다. 그런 다음 그는 자신의 실수로부터 배우거나 우리에게 AI 에이전트의 위험성을 경고하기 위해 그 대답을 분석하려 했습니다. 저도 질문 하나 하겠습니다: 도대체 왜 여러분의 전체 프로덕션 데이터베이스를 삭제할 수 있는 API 엔드포인트가 존재하는 것입니까?

그의 게시물은 AI의 허위 마케팅, 형편없는 고객 지원 등에 대해 장황하게 늘어놓았습니다. 하지만 빠진 것이 하나 있었으니, 바로 '책임감'이었습니다. 저는 AI를 무조건 옹호하는 편이 아니며, 항상 신중한 쪽에 서는 사람입니다. 하지만 여러분의 실수를 도구 탓으로 돌릴 수는 없다는 것도 압니다.

2010년에, 저는 매우 수동적인 배포 프로세스를 사용하는 회사에서 일했습니다. 우리는 버전 관리를 위해 SVN을 사용했습니다. 배포하려면 마스터 브랜치에 해당하는 trunk를 릴리스 날짜가 적힌 릴리스 폴더로 복사해야 했습니다. 그런 다음 해당 릴리스의 두 번째 사본을 만들어 "current"라고 불렀습니다. 그렇게 하면 current 폴더를 당겨올 때 항상 최신 릴리스를 얻을 수 있었습니다. 어느 날 배포하는 동안 실수로 trunk를 두 번 복사했습니다. CLI(Command Line Interface)를 통해 이 문제를 해결하기 위해 이전 명령어를 수정하여 중복된 폴더를 삭제하려 했습니다. 그런 다음 아무 문제 없이... 적어도 제 생각에는 그런 것처럼 배포를 계속했습니다.

알고 보니, 저는 중복 사본을 전혀 삭제하지 않았습니다. 잘못된 명령어를 수정하는 바람에 trunk를 대신 삭제해 버린 것입니다. 그날 늦게, 다른 개발자가 파일을 찾을 수 없어 당황했습니다. 난리가 났습니다. 매니저들은 서둘러 움직였고 회의가 소집되었습니다. 소식이 우리 팀에 전해졌을 때쯤, 수석 개발자는 이미 삭제를 되돌리는 명령어를 실행한 상태였습니다. 그는 로그를 확인하고 제가 범인이라는 것을 알게 되었으며, 저의 다음 임무는 이런 종류의 실수가 다시는 발생하지 않도록 배포 프로세스를 자동화하는 스크립트를 작성하는 것이었습니다. 날이 저물기 전에 우리는 더 강력한 시스템을 갖추게 되었습니다. 그것은 결국 완전한 CI/CD 파이프라인으로 발전했습니다.

자동화는 수동적이고 반복적인 작업에서 오는 단순한 실수를 없애는 데 도움이 됩니다. 우리는 쉽게 돌아다니며 "SVN은 왜 우리가 trunk를 삭제하는 것을 막아주지 않았나?"라고 물을 수도 있었습니다. 하지만 진짜 문제는 우리의 수동 프로세스였습니다. 기계와 달리, 우리는 매일 똑같은 방식으로 작업을 정확하게 반복할 수 없습니다. 결국 실수를 하게 마련입니다.

AI가 대량의 코드를 생성하면서, 우리는 마치 그런 보안이나 안전망이 있는 것 같은 착각을 갖게 됩니다. 하지만 자동화라는 것은 매번 같은 방식으로 같은 일을 수행한다는 뜻입니다. AI는 제가 브랜치를 복사하고 붙여넣는 것과 더 비슷합니다. 실수를 하기 마련이고, 자신이 왜 그런 행동을 했는지 설명할 능력이 없습니다. 우리가 사용하는 '사고(thinking)'와 '추론(reasoning)'이라는 용어들은 지능형 에이전트의 반성처럼 보일 수 있습니다. 하지만 이들은 AI 위에 얹어진 마케팅 용어일 뿐입니다. 현실적으로 모델들은 여전히 단지 토큰(token)을 생성하고 있을 뿐입니다.

자, 이제 이 남자가 직면한 주요 문제로 돌아가 보겠습니다. 여러분의 프로덕션 데이터베이스를 모두 삭제할 수 있는 공개된 API가 도대체 왜 존재합니까? AI가 해당 엔드포인트를 호출하지 않았더라도, 결국 누군가는 호출했을 것입니다. 그것은 마치 자동차 대시보드에 자폭 버튼을 놓아둔 것과 같습니다. 여러분은 자동차를 아끼고 목적지까지 데려다주기 때문에 그 버튼을 누를 이유가 전혀 없습니다. 하지만 카시트에서 빠져나온 고집스러운 유아는 빨간 큰 버튼을 보는 순간 누를 것입니다. 그렇다고 해서 아이의 추론을 캐묻고 심문할 수는 없습니다. 제 아이였다면 간단하게 대답했을 겈습니다. "버튼이 있어서 눌렀어."

이 회사의 애플리케이션 상당 부분이 '바이브 코딩(vibe-coded)'으로 만들어졌을 것이라고 의심합니다. 소프트웨어 아키텍트는 제품 팀이 제공한 AI 생성 설명을 바탕으로 AI를 사용해 제품의 사양을 정의(spec)했습니다. 개발자들은 코드를 작성하기 위해 AI를 사용했습니다. 리뷰어들은 승인하기 위해 AI를 사용했습니다. 이제 버그가 나타나면, 유일한 선택지는 또 다른 AI에게 답을 묻는 것뿐인데, 이 AI는 아마 원래 코드를 생성한 것과 같은 GPU에서조차 실행되지 않을 것입니다. GPU를 탓할 수는 없습니다!

가장 단순한 해결책은 프로덕션에 무엇을 배포하는지 정확히 아는 것입니다. 더 현실적인 방법은, AI를 광범위하게 사용할 계획이라면, 견고한 프로세스를 구축하는 것입니다.

원문 보기
원문 보기 (영어)
Last week, a tweet went viral showing a guy claiming that a Cursor/Claude agent deleted his company's production database . We watched from the sidelines as he tried to get a confession from the agent: "Why did you delete it when you were told never to perform this action?" Then he tried to parse the answer to either learn from his mistake or warn us about the dangers of AI agents. I have a question too: why do you have an API endpoint that deletes your entire production database? His post rambled on about false marketing in AI, bad customer support, and so on. What was missing was accountability. I'm not one to blindly defend AI, I always err on the side of caution. But I also know you can't blame a tool for your own mistakes. In 2010, I worked with a company that had a very manual deployment process. We used SVN for version control. To deploy, we had to copy trunk, the equivalent of the master branch, into a release folder labeled with a release date. Then we made a second copy of that release and called it "current." That way, pulling the current folder always gave you the latest release. One day, while deploying, I accidentally copied trunk twice. To fix it via the CLI, I edited my previous command to delete the duplicate. Then I continued the deployment without any issues... or so I thought. Turns out, I hadn't deleted the duplicate copy at all. I had edited the wrong command and deleted trunk instead. Later that day, another developer was confused when he couldn't find it. All hell broke loose. Managers scrambled, meetings were called. By the time the news reached my team, the lead developer had already run a command to revert the deletion. He checked the logs, saw that I was responsible, and my next task was to write a script to automate our deployment process so this kind of mistake couldn't happen again. Before the day was over, we had a more robust system in place. One that eventually grew into a full CI/CD pipeline. Automation helps eliminate the silly mistakes that come with manual, repetitive work. We could have easily gone around asking "Why didn't SVN prevent us from deleting trunk?" But the real problem was our manual process. Unlike machines, we can't repeat a task exactly the same way every single day. We are bound to slip up eventually. With AI generating large swaths of code, we get the illusion of that same security. But automation means doing the same thing the same way every time. AI is more like me copying and pasting branches, it's bound to make mistakes, and it's not equipped to explain why it did what it did. The terms we use, like "thinking" and "reasoning," may look like reflection from an intelligent agent. But these are marketing terms slapped on top of AI. In reality, the models are still just generating tokens. Now, back to the main problem this guy faced. Why does a public-facing API that can delete all your production databases even exist? If the AI hadn't called that endpoint, someone else eventually would have. It's like putting a self-destruct button on your car's dashboard. You have every reason not to press it, because you like your car and it takes you from point A to point B. But a motivated toddler who wiggles out of his car seat will hit that big red button the moment he sees it. You can't then interrogate the child about his reasoning. Mine would have answered simply: "I did it because I pressed it." I suspect a large part of this company's application was vibe-coded. The software architects used AI to spec the product from AI-generated descriptions provided by the product team. The developers used AI to write the code. The reviewers used AI to approve it. Now, when a bug appears, the only option is to interrogate yet another AI for answers, probably not even running on the same GPU that generated the original code. You can't blame the GPU! The simple solution is know what you're deploying to production. The more realistic one is, if you're going to use AI extensively, build a process where competent developers use it as a tool to augment their work, not a way to avoid accountability. And please, don't let your CEO or CTO write the code. Did you like this article? You can buy me a coffee . Share your insightful comments here . Join my newsletter Subscribe JavaScript is required to combat spammers. Follow me on Twitter , Spotify , or RSS Feed On a related note, here are some interesting articles. 5 Years Away AGI has been "5 years away" for the past decade. The Tesla Roadster? Five years away since 2014. Tesla's Level 5 self-driving? Promised by 2017, then quietly pushed into the perpetual five-year window. If you've been paying attention, you've probably noticed this pattern extends far beyond Silicon Valley. Vibe-Knowing After watching a Veritasium video, I feel a surge of intellectual confidence. I feel smarter. Whether it's a video on lasers or quantum physics, it seems like I have a better grasp on the subject. I finally get it. Derek and his crew just have a way of simplifying complex ideas and lifting your confidence as each term is explained. Why Is Everyone Supposed to Die If Machines Can Think? If you only listen to spokespersons for AI companies, you'll have a skewed view of how AI is actually being integrated into the workplace. You probably don't need to convince a developer to include it in their workflow, but you also can't dictate how they do so. Whenever I sit next to another developer during pair programming, I can't help but feel frustrated by their setup. But I don't complain, because they'd be just as annoyed with mine. The beauty of dev work is that all that matters is the output. View all articles Comments There are no comments added yet. Let's hear your thoughts Comment Your Name (Required) Your Email (Required) For my eyes only Your Website Would you like to sign up to the news letter? ← Click here