아이디어와 인사이트

AI 퍼스트 개발, 코딩 가드레일, 그리고 폐기 가능한 아키텍처를 탐구합니다.

AI Safety Stack: types, contracts, property tests, mutation gates

AI-generated code를 production에서 버티게 하려면 code review만으로는 부족합니다. type constraints부터 mutation testing, runtime containment까지 layered safety stack이 필요합니다.

AI-generated code의 가장 위험한 점은 항상 틀리다는 데 있지 않습니다. 가장 위험한 점은 너무 자주, merge해도 될 만큼 그럴듯해 보인다는 데 있습니다. 바로 그 점이 리스크입니다. 명백히 깨진 code는 잡힙니다. 하지만 그럴듯해 보이고, 몇 개의…

훌륭한 engineering 아이디어가 AI가 경제성을 만들기 전까지 niche에 머문 이유

Design by contract, property-based testing, mutation testing, model checking은 나쁜 아이디어가 아니었습니다. 지속적으로 운영하기에 필요한 expertise가 너무 무거웠을 뿐입니다. AI가 그 방정식을 바꿉니다.

software engineering에는 읽는 순간 바로 맞는 말처럼 느껴지는 아이디어가 많습니다. 당연히 contracts는 function이 무엇을 받아들이고 무엇을 반환해야 하는지 정의해야 합니다. 당연히 tests는 몇 개의 예제만 보는 대신 properties를 검증해야…

Vibe coder를 위한 React Native App Lifecycle 가이드

개발 환경에서는 잘 되는데 점심 먹고 돌아오면 앱이 하얀 화면을 띄운다. 네이티브 lifecycle을 제대로 다루는 resume status 패턴을 설명합니다.

Cursor로 멋진 Expo 앱을 만들었다. Claude Code가 auth flow, dashboard, settings screen까지 전부 생성해 줬다. 배포했다. 사용자가 설치했다. 그리고 DM이 오기 시작한다. "점심 먹고 돌아와서 열면 왜 하얀 화면이 뜨죠?" "왜 아침마다…

왜 Vibe-Coded React Native 앱은 실행 직후 크래시가 나는가 (그리고 막는 법)

optional SDK가 core infrastructure처럼 초기화되면 앱은 실행 직후 crash할 수 있습니다. non-critical tool이 production을 함께 끌어내리지 않게 만드는 dependency tier 시스템을 설명합니다.

Vibe-coded 모바일 앱에서 흔한 launch failure 중 하나는 analytics, attribution, crash reporting이 정말로 critical한 service와 나란히 초기화되는 것입니다. 그런 optional SDK 중 하나가 특정 device나 특정…

왜 Cursor에서 NativeWind로 Vibe Coding 하면 React Native 앱이 규모가 커질수록 망가지는가

주말 동안 Cursor로 MVP를 배포했지만 이제 색 하나 바꾸려면 47개 파일이 흔들린다. 그 출혈을 멈추는 styling contract를 설명합니다.

Cursor를 열고 prompt를 입력하자, Claude Code가 순식간에 완전한 React Native UI를 만들어 냈습니다. flex layout, 둥근 버튼, color theme까지 첫 시도에 모두 동작했습니다. TestFlight에 올렸고, 사용자가 다운로드하기…

왜 Claude Code가 당신의 코드를 리뷰하면 안 되는가 (대신 무엇을 써야 하는가)

LLM 코드 리뷰는 비결정적이고 느리며 아키텍처 위반을 놓친다. 실제로 코드를 깨끗하게 유지하는 O(1) guard stack을 설명합니다.

제 네트워크에 있는 한 개발자가 CI 코드 리뷰어로 Claude Code를 붙였습니다. "PR은 그냥 Claude한테 보게 하면 돼요"라고 하더군요. "제가 놓치는 것도 잡아 줘요." 그래서 같은 PR을 Claude에게 두 번 돌려 보라고 했습니다. 첫 번째 리뷰는 error…

마이그레이션하지 말고 삭제하라: Vibe-Coded React Native 앱의 리팩터링 전략

AI가 생성한 코드를 리팩터링한다는 건 애초에 없던 의도를 역으로 해석하는 일이다. 삭제를 안전하게 만드는 interface 중심 replacement 패턴을 설명합니다.

생물학에서 autotomy는 더 이상 유용하지 않은 신체 일부를 스스로 떼어 내는 행동입니다. 도마뱀은 포식자를 피하려고 꼬리를 버립니다. 한때는 유용했지만, 살아남으려면 놓아줘야 합니다. 그리고 새 꼬리가 다시 자랍니다. Vibe-coded React Native 앱을 리팩터링할…

Cursor와 Claude Code가 React Native 아키텍처를 망가뜨리는 방식 (그리고 고치는 법)

AI가 만든 auth는 새 feature가 잘못된 service를 건드리기 전까지는 멀쩡해 보입니다. vendor 교체와 feature 작업이 login을 깨뜨리지 않게 만드는 interface 중심 architecture를 설명합니다.

Vibe-coded React Native 앱에서 반복해서 보이는 failure mode 중 하나는, 새 feature가 기존 service를 직접 import하고 자기 소유가 아닌 state를 건드린 뒤 전혀 관계없는 flow를 깨뜨리는 것입니다. auth가 특히 자주 희생되는…

왜 Deep Link가 Vibe-Coded React Native 앱을 크래시시키는가 (그리고 Zod로 검증하는 법)

deep link, push payload, 공유 URL은 모두 untrusted input입니다. 잘못된 param이 screen까지 들어오기 전에 Expo Router boundary에서 검증하는 방법을 설명합니다.

Vibe-coded 앱에서 deep link bug는 대체로 지루한 input 문제에서 시작합니다. malformed user ID, 오래된 campaign URL, push payload에서 빠진 enum 값 같은 것들입니다. 그다음 앱은 그 input을 신뢰해 버리고,…

useSyncExternalStore: Vibe-Coded 앱을 state 버그에서 구하는 React Hook

메모리 누수와 state 업데이트 누락을 만드는 useEffect subscription 코드를 그만 쓰자. 외부 state를 단단하게 다루는 React 18 패턴을 설명합니다.

예전의 저는 대부분의 Vibe coder처럼 network detection hook을 작성했습니다. 에서 NetInfo를 subscribe하고, connectivity가 바뀌면 state를 갱신하고, 잘 되길 바랐습니다. 개발 환경에서는 괜찮았습니다. production에서는…

Vibe Code에서 Production까지: AI-Coded React Native 앱이 확장되려면 Guardrails가 필요한 이유

AI는 React Native MVP를 아주 빠르게 ship할 수 있지만, guardrails가 없으면 작은 변경 하나가 전혀 상관없어 보이던 flow까지 깨뜨릴 수 있습니다. declarative constraint가 속도가 fragility로 바뀌지 않게 만드는 방식을 설명합니다.

Vibe coding의 첫 구간은 믿기 어려울 만큼 생산적으로 느껴집니다. Cursor와 Claude Code는 login, dashboard, settings, push notifications까지 순식간에 만들어 내기 때문에, founder 혼자서도 며칠 만에 MVP를 live로…