Learning a New Language

with Generative Drawing

발단

대외적인 이미지로 오랫동안 시달려 왔습니다.

 

업무와 관계없이 새로운 언어를 배워야겠다.

 

그렇다면 어떤 기준으로 새로운 언어를 선택할까?

나만의 기준을 생각해보기

  1. Pragmatism

  2. Succinctness

  3. Dynamism

 

중요하게 생각하는 순서대로 적었습니다.

There are only two kinds of languages: the ones people complain about and the ones nobody uses.

― Bjarne Stroustrup

장기적으로 유용할 것

질문. 근래에 대중화에 성공한 언어들의 특징은?

 

답변.

  1. 기존의 에코시스템을 무시하지 않았다. Kotlin, Scala, TypeScript
  2. 특정 도메인의 문제를 잘 푼다. R, Go
  3. 든든한 기업 스폰서가 있다(?) 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

표현력이 우수할 것

과거의 경험:

  • 모든 코드는 그 가치와 관리비용이 함께 발생
  • 코드베이스가 커질 수록 한계비용은 높아짐

 

한계비용이 높아지는 이유:

  1. 대부분의 코드는 시간이 지나면 거의 항상 녹슬기 때문
    • 녹이 생기는 부분은 주로 본질이 아닌 영역
  2. 인간의 기억력의 한계
  3. 개발자 증가에 따른 커뮤니케이션 비용 증가

 

ME: 굳이 코드를 짜야 한다면 최대한 간결하게 표현하고 싶다.

Premature optimization abstraction is the root of all evil.

¬ by Donald Knuth

동적인 언어일 것

과거의 경험:

  • 어떠한 개념을 범주화하려는 시도는 거의 항상 실패
  • 잘못된 범주화는 오해를 부르고, 오해는 끊임없이 전이됨

 

잘못된 범주화의 원인:

  1. ​개념의 몰이해
  2. 어휘/어휘력 부족
  3. 랑그와 빠롤

동적인 언어일 것

섣부른 범주화의 원인:

  1. OOP
  2. Type System
  3. Design Patterns
  4. Frameworks
  5. Human Nature (불확실성을 참지 못하는)


ME:

  • 본질을 왜곡하는 요소들은 조심스럽게 선택하고 싶다.
  • 틀리지 않는 것이 편리함보다 더 중요하다.

그래서 저의 선택은...

Clojure

(조건을 만족하는 후보는 Lisp 계열밖에 없었습니다)

Clojure Way

→  JVM​, CLR

→  Lisp Dialect

→  "map"s everywhere

  1. Pragmatism

  2. Succinctness

  3. Dynamism

함께 딸려오는 것들

  1. Lisp

  2. Immutability & Persistency

  3. Laziness

  4. Concurrency constructs

  5. 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

학습에 효율적인 이유

  1. 피드백이 빠르고 직관적임
     

  2. 첫 구현까지 오랜 시간이 걸리지 않음

    • 개념 학습 → 구현 → 완성까지 대략 10~20시간
    • 주말마다 틈틈히, 4개월간 약 20개
       

  3. 새로운 아이디어를 쉽게 더할 수 있음

주요 소재들

  1. IFS (Fractals)

  2. Tiling

  3. Cellular Automata

  4. Autonomous Agents (boids)

  5. 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.

Didier A.

 

 

ME: 위 소감과 비슷합니다.

Generative Drawing 소감

  • 재밌다!
    • 테스트 코드도 없고 리뷰도 안하니까!
  • ​자연스러운 학습 곡선
    • 코딩 교육에 매우 적절
  • 내면의 예술성을 발견
    • 예술은 하면 안되겠구나

Summary

  • 요약할 만큼 중요한 내용이 없습니다.

Q & A

Made with Slides.com