본문 바로가기
잡담

AI 개발 시대에 대한 내 생각

by lms0806 2026. 5. 9.
728x90
반응형

최근 AI개발 시대가 도래하면서, AI만능론자들이 많아지는거 같다.

그게 왜?

이전에 다음과 같은 이야기를 들었었다.

A : 이 코드 왜 이렇게 작성했어요?
B : 이거 AI가 작성해줘서, 잠시만요 물어볼게요
A : ???

본인이 commit한 내용에 대해서, 이해하지 못하고 그저 코드가 정상적으로 작동한다는 이유만으로 AI가 작성해준 코드를 프로젝트에 적용하면서 발생한 문제다.


최근에는 한명의 개발자가 백엔드, 프론트, 인프라, 엔진, AI 를 모두 개발한다는 사실을 들었다.

 

해당 이야기는 물론 가능할지도 모른다.

 

그치만, 해당 직무에 대한 지식이 전혀 없는 개발자가 AI로 개발을 진행하다면, '해줘'와 '어 되네 commit'만 진행할지도 모른다.

 

그렇게 되면, 코드는 계속해서 복잡해지고, 인간이 코드를 보기에 복잡해지고, 유지보수가 힘들어질지도 모른다.

 

비개발자가 Vibe Coding으로 코드를 작성하기에는 쉬울지는 모르지만, 그렇게 계속적으로 진행한다면 유지보수가 어려운 코드로 발전할지도 모른다.

그럼 너는 AI 안써?

물론, 저 또한 AI로 코딩을 진행하고 있습니다.

 

진행하고 있는 웹프로젝트에서는 백엔드는 Rust, 프론트는 Ts로 개발을 진행하고 있죠

 

프론트의 경우 AI로 개발을 진행하고 있습니다.

 

AI가 작성해준 코드를 보고, 불필요한 코드를 작성하면 이를 리팩토링하고, 해당 코드를 왜 그렇게 작성했는지에 대해 물어보고 이를 보완하도록 명령합니다.

그럼 뭐가 문젠데?

제가 진행하고 있는 프로젝트의 예시를 들어보도록 하겠습니다.

 

이야기하기에 앞서 몇가지 Rust에 대하여 설명드리도록 하겠습니다.

  1. rust는 null이라는 값이 존재하지 않습니다.
  2. serde_as는 구조체로 선언된 값을 rest api통신으로 받아온 값들을 저장할 수 있도록 도와주는 라이브러리입니다.
  3. #[serde_as(deserialize_as = "DefaultOnNull")]는 null값이 들어오면 default 값으로 변경해주는 녀석입니다.

만약, 해당 코드에 '각 값들이 외부 api 요청을 통해 null값이 들어온다면 default값으로 처리되게 해줘'라고 AI에게 요청을 한다면 어떻게 될까요?

#[serde_as]
#[derive(Deserialize, Serialize, Debug)]
pub struct AndroidEquipment {
    a: String,
    b: String,
    c: String,
    d: String,
    e: String,
    f: String,
    g: String,
    h: String,
    i: String,
    j: String,
    k: String,
    l: String,
}

몇몇 AI들은 다음과 같이 작성해줄지도 모릅니다.

 

그치만 몇몇 개발자들은 해당 코드가 매우 복잡하여 하나로 합쳐서 진행하고 싶어할 겁니다.

#[serde_as]
#[derive(Deserialize, Serialize, Debug)]
pub struct AndroidEquipment {
    #[serde_as(deserialize_as = "DefaultOnNull")]
    a: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    b: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    c: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    d: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    e: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    f: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    g: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    h: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    i: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    j: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    k: String,
    #[serde_as(deserialize_as = "DefaultOnNull")]
    l: String,
}

물론, 코드를 신경쓴다면 다음과 같이 하나로 통합하여 사용이 가능합니다.

#[apply(
    String => #[serde_as(deserialize_as = "DefaultOnNull")],
)]
#[serde_with::serde_as]
#[derive(Deserialize, Serialize, Debug)]
pub struct AndroidEquipment {
    a: String,
    b: String,
    c: String,
    d: String,
    e: String,
    f: String,
    g: String,
    h: String,
    i: String,
    j: String,
    k: String,
    l: String,
}

그저 AI에게 모든걸 맡긴 개발자는 AI가 모든 값들에 #[serde_as(deserialize_as = "DefaultOnNull")]을 붙여준것에 대하여 신경을 쓸까요?

 

제가 해당 포스팅에 대해 말씀드리고 싶은 내용은 다음과 같습니다.

  1. 모든 것들을 AI에게 전적으로 맡겨서 개발을 진행하지 말자.
  2. AI는 그저 IDE와 같은 하나의 도구로써, 개발을 진행하는데 도움을 주는 것으로 생각하고 사용하자.
  3. AI가 만들어준 코드도 '돌다리도 두들겨보고 건너자'라는 마음으로 확인을 하고 진행하자.
728x90
반응형

댓글