Learning a New Language
with Generative Drawing
발단
대외적인 이미지로 오랫동안 시달려 왔습니다.
업무와 관계없이 새로운 언어를 배워야겠다.
그렇다면 어떤 기준으로 새로운 언어를 선택할까?
나만의 기준을 생각해보기
-
Pragmatism
-
Succinctness
-
Dynamism
중요하게 생각하는 순서대로 적었습니다.
There are only two kinds of languages: the ones people complain about and the ones nobody uses.
― Bjarne Stroustrup
장기적으로 유용할 것
질문. 근래에 대중화에 성공한 언어들의 특징은?
답변.
- 기존의 에코시스템을 무시하지 않았다. Kotlin, Scala, TypeScript
- 특정 도메인의 문제를 잘 푼다. R, Go
- 든든한 기업 스폰서가 있다(?) Swift, Go, TypeScript,
Dart, Hack
ME:
- 대중적일 필요는 없지만, 이도저도 아닌 것은 피하자.
If debugging is the process of removing software bugs, then programming must be the process of putting them in
— Edsger Dijkstra
The Best Code is No Code At All
― Jeff Atwood
표현력이 우수할 것
과거의 경험:
- 모든 코드는 그 가치와 관리비용이 함께 발생
- 코드베이스가 커질 수록 한계비용은 높아짐
한계비용이 높아지는 이유:
- 대부분의 코드는 시간이 지나면 거의 항상 녹슬기 때문
- 녹이 생기는 부분은 주로 본질이 아닌 영역
- 인간의 기억력의 한계
- 개발자 증가에 따른 커뮤니케이션 비용 증가
ME: 굳이 코드를 짜야 한다면 최대한 간결하게 표현하고 싶다.
Premature
optimizationabstraction is the root of all evil.¬ by Donald Knuth
동적인 언어일 것
과거의 경험:
- 어떠한 개념을 범주화하려는 시도는 거의 항상 실패
- 잘못된 범주화는 오해를 부르고, 오해는 끊임없이 전이됨
잘못된 범주화의 원인:
- 개념의 몰이해
- 어휘/어휘력 부족
- 랑그와 빠롤
동적인 언어일 것
섣부른 범주화의 원인:
- OOP
- Type System
- Design Patterns
- Frameworks
- Human Nature (불확실성을 참지 못하는)
ME:
- 본질을 왜곡하는 요소들은 조심스럽게 선택하고 싶다.
- 틀리지 않는 것이 편리함보다 더 중요하다.
그래서 저의 선택은...

Clojure
(조건을 만족하는 후보는 Lisp 계열밖에 없었습니다)
Clojure Way
→ JVM, CLR
→ Lisp Dialect
→ "map"s everywhere
-
Pragmatism
-
Succinctness
-
Dynamism
함께 딸려오는 것들
-
Lisp
-
(Almost) No syntax
(((((((((( )))))))))) -
Macro
-
REPL
-
-
Immutability & Persistency
-
Laziness
-
Concurrency constructs
-
Paradigm shift
익숙해지기
일반적인 숙달 과정
📝
설계
↖ ↙
💡
개선 아이디어
위 과정을 반복하며 실력이 향상됨
⌨️
구현
→ → →
🐛
디버깅
✨
완성
효율
쓸모
재미
"Pick Two"
효율
쓸모
재미
알고리즘
문제풀이
딥러닝
프로젝트
회사일
게임
만들기
웹서비스
개발
∅
효율
쓸모
재미
Generative
Art
Generative Art란?
학습에 효율적이고 재미있지만 쓸모가 없는
MicroImage, Casey REAS (2002)

ILLUMINATIONS B, Marius Watz (2007)
Infinite Rainbows (by Marius Watz)

원을 그려보세요

Java (Processing)
void drawCircle()
{
float radius = 100;
int centX = 250;
int centY = 150;
float x, y;
float lastx = -999;
float lasty = -999;
for (float ang = 0; ang <= 360; ang += 5) {
float rad = radians(ang);
x = centX + (radius * cos(rad));
y = centY + (radius * sin(rad));
point(x,y);
}
}Clojure (Quil)
(defn polar->cart [r theta]
[(* r (cos theta))
(* r (sin theta))])
(defn circular-points [n r]
(let [angle (/ q/TWO-PI n)
rads (map #(* angle %) (range n))]
(map (partial polar->cart r) rads)))
(defn draw-circle [center points]
(q/with-translation center
(doseq [[x y] points]
(q/point x y))))
데이터
N개의 좌표
반지름과 N, 중점
로직
좌표계 변환
삼각함수
2차원 이동
부수효과
점 그리기
선 그리기
Live Coding
학습에 효율적인 이유
-
피드백이 빠르고 직관적임
-
첫 구현까지 오랜 시간이 걸리지 않음
- 개념 학습 → 구현 → 완성까지 대략 10~20시간
-
주말마다 틈틈히, 4개월간 약 20개
- 새로운 아이디어를 쉽게 더할 수 있음




주요 소재들
-
IFS (Fractals)
-
Tiling
-
Cellular Automata
-
Autonomous Agents (boids)
-
Algorithm Visualization
- Voronoi Diagram
- Maze Generator/Solver
- ...
의도적인 학습
- 언어와 라이브러리 학습을 의도한 문제 선택
-
Generative test → Penrose Tiling -
Lazy sequence → Dejong Attractors -
Reducers → High-res Fractals -
Go blocks → Automated Agents -
Logic Programming → Maze Solver
-
More Examples

Buddhabrot (from Wikipedia)

Burning Ship
Cellular Automata 3D (images by Karsten Schmidt)

Watercolor paint

Images from @thingybot
Clojure 소감
Learning Clojure is like going from driving a car on the right side of the road, to driving a car on the left side of the road.
ME: 위 소감과 비슷합니다.
Generative Drawing 소감
-
재밌다!
- 테스트 코드도 없고 리뷰도 안하니까!
-
자연스러운 학습 곡선
- 코딩 교육에 매우 적절
- 내면의 예술성을 발견
- 예술은 하면 안되겠구나
Summary
- 요약할 만큼 중요한 내용이 없습니다.
Q & A
Learning a New Language with Generative Drawing
By Hyunwoo Nam
Learning a New Language with Generative Drawing
- 925