처음 시작하는 당신에게
이 글을 읽고 나면
코딩이 왜 "공부"가 아니라 "경험"인지 납득하게 됩니다. 그리고 이미 코드를 몇 줄 실행해본 사람이 됩니다.
Part 1. 우리는 이미 알고 있다 — 언어를 배우는 법
아무도 문법부터 가르치지 않았다
태어나서 처음 들은 말을 기억하시나요?
기억 못 하는 게 당연합니다. 하지만 분명한 건, 그때 아무도 이렇게 말하지 않았다는 겁니다.
"자, 한국어의 기본 문장 구조는 주어-목적어-서술어야. 먼저 이 원리를 이해하고 나서 말해봐."
그런 일은 없었습니다.
어머니는 그냥 "맘마"라고 했고, 아버지는 "아빠"라고 했습니다. 의미를 설명하지 않았습니다. 규칙을 가르치지 않았습니다. 그냥 반복했습니다. 저마다의 방식으로, 기준도 없이, 문법도 없이. 그리고 우리는 — 어느 날 말을 하고 있었습니다.
코딩도 마찬가지입니다.
그냥 따라 해보세요 — 첫 번째 코드
아래 코드를 보세요. 이해하려고 하지 마세요. 그냥 Run 버튼을 눌러보세요.
print("Hello, World!")
assert "Hello" in "Hello, World!"화면에 Hello, World!가 나왔나요?
축하합니다. 이게 1991년 팀 버너스리가 세계 최초의 웹사이트를 만들었을 때 화면에 띄운 것과 본질적으로 같은 일입니다. 컴퓨터에게 "이걸 화면에 보여줘"라고 말한 겁니다. 세상의 모든 프로그램은, 모든 앱은, 모든 웹사이트는 — 이 한 줄에서 시작했습니다.
단순한가요? 네. 그리고 이게 바로 시작입니다.
우리 분야의 언어로 인사하기
이번엔 우리에게 익숙한 걸로 해봅시다. 그냥 눌러보세요.
dna = "ATGCGATCG"print(f"서열: {dna}")print(f"길이: {len(dna)}bp")
assert len(dna) == 9dna라는 이름표를 붙이고, 거기에 "ATGCGATCG"라는 서열을 넣었습니다. len()은 길이를 재는 자(ruler)입니다. 우리가 겔 위의 밴드 크기를 재듯, 컴퓨터도 서열의 길이를 잽니다.
이해가 안 되는 부분이 있어도 전혀 괜찮습니다. 지금은 그냥 "아, 이런 게 되는구나" 하고 넘어가면 됩니다.
컴퓨터는 계산기입니다 — 아주 빠른
연구실에서 희석 배수 계산할 때 계산기 꺼내시죠? 컴퓨터는 그 계산기입니다. 다만 조금 더 빠릅니다.
stock = 10.0target = 2.0dilution_factor = stock / targetprint(f"희석 배수: {dilution_factor}배")print(f"10 mg/mL 원액을 {dilution_factor}배 희석하면 {target} mg/mL")
assert dilution_factor == 5.0stock / target — 이게 전부입니다. 나누기입니다. 원리를 컴퓨터공학자들이 만들어뒀고, 우리는 그걸 활용하면 됩니다. 우리가 추구하는 건 새로운 프로그래밍 언어를 만드는 게 아닙니다. 이미 있는 도구를 우리 연구에 쓰는 겁니다.
여러 시료를 한 번에 처리하기
96-well plate에 시료를 하나씩 넣듯, 컴퓨터에게도 여러 개를 한꺼번에 줄 수 있습니다. 그냥 눌러보세요.
samples = ["시료_A", "시료_B", "시료_C", "시료_D"]
for sample in samples: print(f"{sample} → 분석 중...")
print(f"\n총 {len(samples)}개 시료 처리 완료!")
assert len(samples) == 4for가 뭔지 몰라도 됩니다. 지금은 "아, 여러 개를 한 번에 돌릴 수 있구나" — 이것만 느끼면 충분합니다. 문법은 나중에 궁금해지면 그때 찾아보면 됩니다. 사전을 찾아보듯, 조금씩.
이름을 불러주면 인사합니다
name = "김연구원"lab = "유전체분석실"
print(f"안녕하세요, {lab}의 {name}님!")print(f"DevBench에 오신 것을 환영합니다.")print(f"오늘부터 {name}님도 코딩하는 연구자입니다.")
assert "김연구원" in f"{name}"name을 본인 이름으로 바꾸고 다시 눌러보세요. 컴퓨터가 여러분에게 인사합니다.
이 방식이 맞는 이유
지금까지 코드를 몇 번 눌러보셨나요?
아마 대부분 이해 못 하셨을 겁니다. print가 뭔지, f""가 뭔지, for가 뭔지. 그게 정상입니다. 아니, 그게 맞는 겁니다.
우리가 추구하는 건 이런 흐름입니다:
- 그냥 따라 해본다 — 이해 안 돼도 괜찮습니다
- 실행해보고 결과를 본다 — "아, 이런 게 되는구나"
- 바로 잊어버린다 — 괜찮습니다. 잊어버리는 게 자연스러운 겁니다
- 나중에 다시 한다 — "어, 이거 전에 본 거 같은데?"
- 반복하면서 재미를 느낀다 — "이런 것도 만들 수 있는 거 아니야?"
- 궁금해지면 그때 찾아본다 — "아~ 이게 이거였구나!"
처음부터 원리를 파악하려고 하지 마세요. 우리는 컴퓨터의 역사를 처음부터 되짚는 게 아닙니다. 지금 눈앞에 있는 신기한 것들을 직접 만져보면서, 자연스럽게 받아들이는 겁니다.
그리고 이건 단순한 정신론이 아닙니다. 과학적 근거가 있습니다.
Part 2. 뇌가 알아서 해줍니다 — 과학이 보장합니다
여기서부터는 제 전공 이야기를 좀 하겠습니다. 생명공학자로서, 우리 뇌가 왜 "그냥 반복하면 되는" 구조인지 설명해드리겠습니다.
Hebb의 법칙: "함께 발화하는 뉴런은 함께 연결된다"
1949년, 신경심리학자 Donald Hebb이 발견한 원리입니다.
뇌의 뉴런(신경세포)은 약 860억 개가 있고, 이들은 시냅스(synapse)라는 연결부를 통해 서로 소통합니다. Hebb의 법칙은 이렇습니다:
"Neurons that fire together, wire together." 함께 발화하는 뉴런은 함께 연결된다.
print라는 단어를 보고 → 키보드를 치고 → 화면에 결과가 나오는 경험을 할 때, 뇌에서는 시각 피질, 운동 피질, 보상 회로의 뉴런들이 동시에 발화합니다. 이 뉴런들 사이의 시냅스는 반복할수록 물리적으로 강해집니다. 시냅스 후막의 AMPA 수용체가 증가하고, 장기강화(Long-Term Potentiation, LTP)가 일어납니다.
쉽게 말하면, 반복하면 뇌가 알아서 연결을 만듭니다. 이해하려고 노력할 필요가 없습니다. 뇌가 해줍니다.
neurons = ["시각(print를 본다)", "운동(키보드를 친다)", "보상(결과가 나온다!)"]
for neuron in neurons: print(f"🧠 {neuron} → 발화!")
print("\n→ 시냅스 강화! 다음번엔 더 빨라집니다.")
assert len(neurons) == 3절차적 기억: 몸이 기억합니다
기억에는 두 종류가 있습니다.
**서술적 기억(Declarative Memory)**은 "파이썬에서 변수는 값을 저장하는 공간이다"처럼 사실을 외우는 기억입니다. 해마(hippocampus)가 담당하고, 쉽게 잊어버립니다.
**절차적 기억(Procedural Memory)**은 자전거 타기, 피펫팅, 그리고 — 코딩처럼 반복적인 동작을 통해 형성되는 기억입니다. 기저핵(basal ganglia)과 소뇌(cerebellum)가 담당하고, 한번 형성되면 잘 잊어버리지 않습니다.
코딩 문법을 교과서에서 외우는 건 서술적 기억입니다. 금방 잊어버립니다. 하지만 직접 코드를 치고, 실행하고, 에러를 만나고, 고치는 과정을 반복하면 — 그건 절차적 기억이 됩니다. 자전거처럼, 피펫팅처럼, 손이 기억합니다.
그래서 우리는 이론을 먼저 가르치지 않습니다. 먼저 해봅니다.
memory_types = { "서술적 기억": {"예시": "for문은 반복문이다", "뇌 영역": "해마", "지속": "쉽게 잊음"}, "절차적 기억": {"예시": "코드를 직접 치고 실행하기", "뇌 영역": "기저핵+소뇌", "지속": "오래 남음"},}
for name, info in memory_types.items(): print(f"\n📌 {name}") print(f" 예시: {info['예시']}") print(f" 담당: {info['뇌 영역']}") print(f" 특징: {info['지속']}")
assert "해마" in memory_types["서술적 기억"]["뇌 영역"]assert "기저핵" in memory_types["절차적 기억"]["뇌 영역"]수초화(Myelination): 처음엔 느리다가, 어느 날 갑자기 빨라진다
뇌의 신경세포에는 축삭(axon)이라는 긴 돌기가 있습니다. 전기 신호가 이 축삭을 따라 이동합니다. 처음에는 축삭이 벗겨진 전선 같아서 신호가 느립니다.
하지만 같은 경로를 반복 사용하면, 희소돌기교세포(oligodendrocyte)가 축삭 주위에 **미엘린(myelin)**이라는 절연체를 감기 시작합니다. 이게 수초화입니다.
수초화가 진행되면 신호 전달 속도가 최대 100배 빨라집니다. 도약전도(saltatory conduction) 덕분입니다.
이게 무슨 뜻이냐면:
- 처음 코딩할 때:
print하나 치는 데 3분 고민 → 정상입니다 - 열 번째: "아 print... 이거 출력하는 거지" → 미엘린이 감기는 중
- 서른 번째: 손이 먼저
print()를 침 → 수초화 완료
"어느 날 갑자기 술술 된다"는 경험, 있으시죠? 그건 기분 탓이 아닙니다. 미엘린이 충분히 감겨서 신호가 빨라진 겁니다. 물리적 변화입니다.
stages = [ ("1회차", 0.5, "느린 전도"), ("10회차", 5.0, "미엘린 형성 중"), ("30회차", 50.0, "도약전도 시작!"),]
print("🧬 수초화(Myelination) 시뮬레이션\n")for trial, speed, status in stages: bar = "█" * int(speed) print(f" {trial:>6s} | {bar:<50s} | {speed:>5.1f} m/s — {status}")
assert stages[2][1] == 50.0그러니까, 과학이 말합니다
- Hebb의 법칙: 반복하면 뇌가 알아서 연결합니다
- 절차적 기억: 직접 해봐야 몸이 기억합니다
- 수초화: 처음엔 느려도, 반복하면 물리적으로 빨라집니다
이 세 가지가 우리에게 말하는 건 하나입니다:
이해하지 않아도 됩니다. 반복하면 됩니다. 뇌가 알아서 합니다.
이건 정신론이 아닙니다. 시냅스의 AMPA 수용체 밀도가 높아지고, 기저핵의 절차 회로가 강화되고, 축삭에 미엘린이 감기는 — 측정 가능한 물리적 변화입니다.
자, 그럼 시작합시다
우리가 하려는 건 이겁니다:
- 컴퓨터 공학의 역사를 처음부터 공부하는 게 아닙니다
- 프로그래밍 언어의 문법을 외우는 게 아닙니다
- 새로운 프로그래밍 언어를 만드는 것은 더더욱 아닙니다
우리는 이미 있는 도구를 우리 연구에 쓰는 법을 배웁니다. 원리는 컴퓨터공학자들이 만들어뒀습니다. 우리는 그걸 활용합니다. 마치 PCR 기계의 회로 설계를 모르더라도 PCR을 완벽하게 돌릴 수 있는 것처럼.
당장 이해가 안 되어도, 그냥 따라 해보세요. 보고 나서 바로 잊어버려도, 괜찮습니다. 뭐가 뭔지 모르겠지만 여기 있는 것들을 그대로 해보면서, "아... 그냥 이런 건가 보다" 하고 넘어가세요.
시간이 지나면 "어? 그럼 이런 것도 만들 수 있는 거 아니야?"라는 생각이 듭니다. 그때 다시 찾아보면 됩니다. "아~ 이게 이거였구나." 그러면서 조금씩 나아갑니다.
이 공간은 그런 곳입니다. 코딩을, 그리고 최근의 AI까지, 처음부터 이해하려고 하지 않아도 되는 곳. 우리가 처음 말을 배웠듯, 자연스럽게 받아들이는 공간입니다.
print("=" * 40)print(" 🧪 DevBench에 오신 것을 환영합니다")print(" 이해하지 마세요. 그냥 시작하세요.")print("=" * 40)
started = Trueassert started == True다음 글에서는 터미널을 열어봅니다. 검은 화면이 무섭지 않다는 걸 알게 될 겁니다.