레이블이 개발자 학습법인 게시물을 표시합니다. 모든 게시물 표시
레이블이 개발자 학습법인 게시물을 표시합니다. 모든 게시물 표시

2026년 7월 31일 금요일

AI 시대의 학습 1 - 지식은 어떻게 내 것이 되는가

시리즈 · AI 시대의 학습

연재글 · 연재 완료

1회 · AI 시대의 학습 1 - 지식은 어떻게 내 것이 되는가

필자는 개발자라는 직군은 평생을 공부해야 하는 운명을 가졌다고 생각합니다. 아니, 모든 사람들 특히 전문직군은 자신의 전문성의 신선함을 유지하기 위해 끊임없이 공부해야 합니다. 여기서 고민이 생깁니다. 공부란 무엇일까요? 나이가 먹어 갈수록 질문은 점점 단순해지는 듯합니다. 이런 질문에는 정답이 없으니, 이 글은 필자의 개인적인 생각으로 읽어 주시면 좋겠습니다. “그렇게도 생각할 수 있겠구나” 하는 정도로 편하게 봐 주셔도 충분합니다.

공부란 필요성 인지 → 지식 습득 → 체득 → 응용의 과정이다.

이 네 단계는 따로 떨어진 목록이 아니라 하나의 학습 사이클입니다. 먼저 왜 필요한지 알아야 공부가 시작되고, 지식을 얻은 다음에는 직접 해 보며 체득해야 합니다. 체득한 원리는 다른 문제와 플랫폼에 응용할 수 있습니다. 이 사이클이 반복되면 자주 다루는 언어와 기술에 주종목이 생기고, 주종목의 원리를 다른 언어와 플랫폼으로 옮기는 과정에서 풀스택 역량이 만들어집니다. 1부는 이 흐름을 차례대로 따라가고, 2부는 AI가 그 흐름의 어디를 압축하는지 살펴봅니다.

이 과정을 필자는 지식 체득이라고 부릅니다. 읽고 들은 내용을 직접 다시 만들고, 실패 원인을 설명할 수 있을 때 비로소 지식 체득이 일어납니다.

여기서 말하는 개발자 학습법은 자료를 많이 소비하는 요령이 아닙니다. 필요한 지식을 골라 자기 것으로 만들고, 다시 써먹을 수 있는 소화력으로 바꾸는 절차입니다.

1. 첫 단계는 필요성 인지다

공부의 첫 단계는 책을 펴는 행위가 아닙니다. “이걸 알아야 내 문제가 풀린다”는 필요성을 알아차리는 순간입니다. 필요성이 없으면 강의 목록을 저장하고 책을 사도 실제 학습은 시작되지 않습니다.

개발자는 문제를 만나면서 공부를 시작합니다. 서버가 배포되지 않거나, 데이터 모델이 꼬이거나, 화면과 API의 계약이 어긋날 때 비로소 어떤 지식이 필요한지 질문이 선명해집니다. 좋은 학습은 막연한 호기심을 없애는 것이 아니라, 해결해야 할 문제를 더 정확한 질문으로 바꾸는 데서 출발합니다. 공부의 갈증은 다양하겠지만 갈증없이는 한모금의 물도 마실수 없습니다.

TEXT
문제 상황

왜 막혔는가? → 필요한 개념·API·도구를 이름 붙이기

학습 범위를 한 문장으로 제한하기

필요성 인지는 학습의 방향뿐 아니라 깊이도 정합니다. “웹을 공부한다”는 너무 넓지만, “이번 주에는 인증 토큰의 생성·검증·만료를 직접 구현한다”는 실행 가능한 목표입니다. AI에게 질문할 때도 이 문장이 있으면 답변을 모으는 대신 학습 단위를 설계할 수 있습니다.

2. 두 번째 단계는 지식 습득이다

책을 읽거나, 공식 문서를 확인하거나, 강의와 동영상을 보는 것은 모두 지식 습득의 과정입니다. 다만 화면을 재생한 시간과 지식이 내 머릿속에 남은 시간은 같지 않습니다. 흘러들어온 지식은 흘러나가기 쉽습니다.

특히 개발자는 직접 찾아 읽는 과정을 건너뛰면 나중에 문제를 재현하지 못합니다. 검색 결과의 요약이나 영상의 설명은 출발점이지 계약서가 아닙니다. API 문서의 입력·출력 조건, 예외, 버전, 권한을 원문에서 확인해야 “왜 이 코드가 동작하는지”를 설명할 수 있습니다.

Dunlosky 연구진의 학습기법 검토는 연습 테스트와 분산 학습처럼 스스로 꺼내 보는 방식이 단순 재독보다 유용할 수 있다고 정리합니다. Karpicke와 Roediger의 retrieval practice 연구도 기억에서 답을 꺼내는 행위 자체가 장기 학습에 중요한 역할을 한다고 보고했습니다. 개발자식으로 번역하면 문서를 읽은 직후 탭을 닫고, 방금 본 API를 보지 않고 설명하거나 작은 코드를 다시 작성해 보는 일입니다.

3. 세 번째 단계는 체득이다

지식을 습득했다면 반드시 체득 단계로 넘어가야 합니다. 체득은 “알고 있다”가 아니라 “처음부터 다시 만들 수 있고, 실패 원인을 좁힐 수 있다”는 상태입니다. 개발자에게 가장 좋은 체득 도구는 거대한 사이드 프로젝트가 아니라 작고 끝나는 미니 프로젝트입니다.

예를 들어 인증을 공부한다면 다음 정도면 충분합니다.

  1. 로컬 데이터베이스에 사용자를 저장합니다.
  2. 로그인 요청에서 짧은 수명의 access token을 발급합니다.
  3. 보호된 API에서 토큰의 서명·만료·권한을 검증합니다.
  4. 잘못된 토큰, 만료된 토큰, 권한이 부족한 토큰을 각각 테스트합니다.

이 과정에서 화면은 단순해도 됩니다. 중요한 것은 서버를 직접 띄우고, 데이터 모델을 만들고, 요청을 보내고, 로그와 실패 응답을 읽는 것입니다. 코드를 복사해 실행만 했다면 아직 체득한 것이 아니라 관찰만 한 것입니다.

A developer moving through four connected stages labeled Need, Acquire, Embody, and Apply at a workbench with code, documentation, and a small running project

<필요성 인지에서 응용까지 이어지는 개발자 학습 루프 1.1>

4. 네 번째 단계는 응용이다

응용은 기존 코드를 다른 곳에 붙여 넣는 일이 아닙니다. 한 문제에서 얻은 원리를 새로운 제약에 맞게 다시 설계하는 일입니다. HTML로 웹 화면을 만들던 개발자가 모바일 앱을 추가하면서 Flutter를 접할 때, 단순히 문법을 새로 외우는 것이 아니라 상태·이벤트·네트워크·배포라는 구조를 새 플랫폼의 문법으로 옮기게 됩니다. 당연히 연관된 백엔드의 새로 생겨난 예외사항들이 끊임없이 괴롭힐 것입니다. 이 과정이 응용력이 확장되는 과정입니다.

체득이 있으면 플랫폼이 바뀌어도 질문이 달라집니다. “버튼을 어떻게 그리지?”에서 “상태가 어디에 있고, 이벤트가 어떤 경계를 넘어가며, 실패를 어떻게 복구하지?”로 관심이 이동합니다. 반대로 체득 없이 응용을 시도하면 프레임워크의 기본 예제를 조합하는 수준에서 멈추고, 작은 요구사항 변화에도 전체를 다시 검색하게 됩니다.

5. 사이클의 반복이 언어와 주종목을 만든다

필자가 말한 필요성 인지 → 지식 습득 → 체득 → 응용의 사이클은 한 번 돌고 끝나지 않습니다. 개발자는 여러 프로젝트에서 이 과정을 반복하면서 자주 호출하는 언어와 기술을 발견합니다. 어떤 사람은 Java와 데이터 모델·쿼리 최적화에 강해지고, 어떤 사람은 JavaScript·TypeScript와 UI 상태·접근성에 강해지며, 또 다른 사람은 C++와 메시지 큐·분산 시스템을 주종목으로 삼습니다. 주종목은 처음부터 정하는 직함이 아니라 반복해서 해결한 문제의 흔적입니다.

언어는 단순한 문법 목록이 아닙니다. 하나의 언어를 오래 다루면 그 언어의 모듈링 방식, 예외 처리, 동시성, 스트림, 테스트 습관, 생태계의 설계 관례가 몸에 밴다는 뜻입니다. 반복된 체득이 쌓이면 “문법을 안다”를 넘어 “이 언어로 이 문제를 어떻게 설계하는지를 안다”는 수준에 도달합니다. 이것이 주종목의 실력입니다.

여기서 중요한 점은 주종목과 시야를 맞바꾸지 않는 것입니다. 한 분야를 깊게 파되, 다른 분야의 언어와 실행 환경을 조금씩 만져야 설계의 선택지를 비교할 수 있습니다. 미니 프로젝트를 여러 번 끝낸 사람은 “이 기능을 어디에 넣을까”뿐 아니라 “이 기능을 이 경계에 넣는 것이 맞나”를 묻게 됩니다.

6. 주종목의 깊이가 풀스택으로 이어지는 과정

주종목이 생겼다고 해서 다른 분야를 닫아 버리는 것은 아닙니다. 다양한 프로젝트를 반복하면 개인적인 지식의 양이 늘고, 분야를 가리지 않고 조금씩 찍먹한 체득이 생깁니다. 이때 한 언어와 주종목의 모듈링·아키텍처링은 극도로 발전하고, 디자인 패턴·아키텍처·스레딩·스트림 같은 핵심 코어 이해력이 설계에 자유롭게 응용됩니다.

핵심은 설계가 언어에 묶이지 않는 순간입니다. 아키텍처와 설계가 특정 언어의 문법에서 벗어나면, 다른 언어의 간단한 문법을 이용해 비슷한 패턴을 구현할 수 있습니다. HTML로 웹사이트를 만들던 개발자가 Flutter로 앱을 추가할 때도 마찬가지입니다. 문법은 갈아 끼우지만 상태, 이벤트, 데이터 경계, 오류 처리라는 설계의 뼈대는 옮겨 갑니다.

같은 설계가 언어별로 어떻게 대응되는지 확인해 보겠습니다. 예시는 소셜 로그인 provider입니다. SocialSession은 로그인 결과의 공통 계약이고, SocialContract<T>는 특정 provider가 반환할 세션 타입을 제한합니다. AuthProviderFactory<T>는 공통 로그인 흐름을 감싸고, Google 구현은 GoogleSession만 반환하도록 컴파일 단계에서 보장합니다.

Java에서는 T extends SocialSession과 인터페이스 구현으로 이 관계를 표현합니다.

JAVA
interface SocialSession {
    String accessToken();
}

interface SocialContract<T extends SocialSession> {
    T login(String authorizationCode);
}

abstract class AuthProviderFactory<T extends SocialSession> {
    protected abstract SocialContract<T> contract();

    public T login(String authorizationCode) {
        return contract().login(authorizationCode);
    }
}

record GoogleSession(String accessToken) implements SocialSession {}

final class GoogleProviderFactory
        extends AuthProviderFactory<GoogleSession> {
    @Override
    protected SocialContract<GoogleSession> contract() {
        return code -> new GoogleSession("google:" + code);
    }
}

TypeScript에서는 extends 제약과 구조적 타입을 사용합니다. 런타임에는 제네릭이 사라지지만, 컴파일할 때 Google provider가 GoogleSession을 반환하는지 검사합니다.

TYPESCRIPT
interface SocialSession {
  accessToken: string;
}

interface SocialContract<T extends SocialSession> {
  login(authorizationCode: string): T;
}

abstract class AuthProviderFactory<T extends SocialSession> {
  protected abstract contract(): SocialContract<T>;

  login(authorizationCode: string): T {
    return this.contract().login(authorizationCode);
  }
}

type GoogleSession = SocialSession & { provider: "google" };

class GoogleProviderFactory extends AuthProviderFactory<GoogleSession> {
  protected contract(): SocialContract<GoogleSession> {
    return {
      login: (code) => ({
        accessToken: `google:${code}`,
        provider: "google",
      }),
    };
  }
}

C#에서는 where T : ISocialSession 제약으로 같은 설계를 표현합니다.

CSHARP
public interface ISocialSession
{
    string AccessToken { get; }
}

public interface ISocialContract<T> where T : ISocialSession
{
    T Login(string authorizationCode);
}

public abstract class AuthProviderFactory<T> where T : ISocialSession
{
    protected abstract ISocialContract<T> Contract { get; }

    public T Login(string authorizationCode)
        => Contract.Login(authorizationCode);
}

public sealed record GoogleSession(string AccessToken) : ISocialSession;

public sealed class GoogleProviderFactory
    : AuthProviderFactory<GoogleSession>
{
    protected override ISocialContract<GoogleSession> Contract
        => new GoogleContract();

    private sealed class GoogleContract : ISocialContract<GoogleSession>
    {
        public GoogleSession Login(string code)
            => new($"google:{code}");
    }
}

세 언어의 문법은 다르지만 구조는 같습니다. 세션 계약, 제네릭 provider 계약, 공통 factory, Google 구현이라는 설계가 그대로 이동합니다. 이것이 주종목의 경험이 다른 언어로 전이되는 실제 모습입니다.

이 경험이 쌓이면 새로운 프레임워크, 언어, 컴파일 시스템을 접해도 완전히 낯선 세계처럼 느끼지 않게 됩니다. 처음부터 모든 것을 아는 것이 아니라, 이미 체득한 설계 원리를 새로운 환경에 번역할 수 있기 때문입니다.

웹·모바일·임베디드 환경에 같은 핵심 설계를 옮겨 적용하는 개발자의 작업대

<주종목의 설계를 다른 플랫폼으로 옮기는 응용의 모습 6.1>

7. 풀스택은 기술 목록이 아니라 기술전이 능력

국내에서 풀스택은 보통 프론트엔드와 백엔드를 함께 개발한다는 뜻으로 쓰입니다. 그 정의는 실무적으로 유용하지만, 더 무거운 의미의 풀스택은 언어 목록이 아니라 낯선 기술을 빠르게 응용 레벨까지 끌어올리는 전이 능력에 가깝습니다. 사실 풀스택 개발자라고 모든 기술을 모두 꿰다시피 외우는건 불가능 합니다.

필자는 풀스택 개발자를 “세상의 모든 기술을 아는 사람”이 아니라, 새로운 기술을 2주 안팎의 집중 실험으로 업무에 연결할 수 있는 숙련자라고 봅니다. 이 말은 모든 기술을 2주 만에 마스터한다는 뜻이 아닙니다. 공식 문서에서 핵심 계약을 찾고, 작은 실행 환경을 만들고, 실패를 기록하고, 기존 설계와 비교해 사용할 수 있다는 뜻입니다.

이런 수준은 단기간의 요령으로 생기지 않습니다. 필자는 빠르면 5년, 꾸준하지만 느린 속도로 가도 15년 정도면 비슷한 전이 능력에 도달할 수 있다고 믿습니다. 중요한 것은 연차를 채우는 일이 아니라, 그 시간 동안 필요성 인지부터 응용까지의 사이클을 실제 프로젝트에서 몇 번이나 제대로 반복했는가입니다.

TEXT
새 기술
  ├─ 핵심 개념 3개 찾기
  ├─ 최소 실행 예제 만들기
  ├─ 실패 사례 2~3개 재현하기
  ├─ 기존 주종목의 설계와 비교하기
  └─ 실제 문제에 작은 범위로 적용하기

이 전이 능력은 다음 회차에서 더 중요해집니다. AI는 지식 습득의 속도를 크게 높이지만, 체득과 응용까지 자동으로 대신해 주지는 않기 때문입니다.

마무리: 공부의 단위는 결과물이 되어야 한다

개발자의 학습은 필요성 인지에서 시작해 지식 습득, 체득, 응용으로 이어집니다. 문서를 읽고 영상을 보는 것은 필요한 과정이지만, 작은 서버·화면·데이터 모델·테스트를 직접 끝내야 지식이 개인의 도구가 됩니다. 반복된 체득이 주종목을 만들고, 주종목의 원리를 다른 언어와 플랫폼으로 옮길 수 있을 때 풀스택 전이 능력이 생깁니다.

다음 2부에서는 이 구조가 AI 시대에 어떻게 압축되는지, AI를 답안 자동판매기가 아니라 원천 지식을 파고드는 학습 파트너로 쓰려면 어떤 질문과 검증 루프가 필요한지 살펴보겠습니다.

404호 개발실 21 - 백화점

시리즈 · 404호 개발실 웹툰 · 연재 중 21회 · 404호 개발실 21 - 백화점 구글 백화점에서 옷을 찾다가 밤을 새웠습니다. <구글 백화점과 AI 코디네이터 21.1> 시리즈 전체 회차 1회 404...