Зачем обычному программисту знать языки, на которых...

42
YaC, Москва, 19 сентября 2011 года разработчик-эксперт Алексей Воинов Зачем изучать языки, на которых почти не пишут

description

Алексей Воинов, Яндекс Закончил МГТУ им. Н.Э.Баумана в 1998 году. Посвятил часть своей жизни свободному программному обеспечению. Замечен в любви к языкам, как к алгоритмическим, так и к человеческим, как к естественным, так и к искусственным. Работает в Яндексе с 2009 года, занимается разработкой Яндекс.Почты. Тема доклада Зачем обычному программисту знать языки, на которых почти никто не пишет. Тезисы Есть категория алгоритмических языков, которые большинство программистов считает в лучшем случае странными. Это такие языки как Haskell, *ML, Lisp, Q. «Странные» языки не приживаются в промышленной разработке софта, потому что они не дают возможности писать стандартный «промышленный» код. Однако они бывают очень хороши для придумывания приёмов, которые помогают улучшить промышленный код. Впоследствии многие из них становятся стандартными промышленными. Знание «странных» языков очень полезно, когда в силу внешних обстоятельств сделать промышленный код радикально лучше невозможно, но его можно улучшать небольшими шагами.

Transcript of Зачем обычному программисту знать языки, на которых...

YaC, Москва, 19 сентября 2011 года

разработчик-экспертАлексей Воинов

Зачем изучать языки,на которых почти не пишут

О чём это?

2

Функциональныеvs Императивные

Промышленныеvs Академические

3

О чём это?

4

О чём это?

5

6

6

6+1

7

8

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеОбщениеРабота

9

Любопытство

10

clojure(def N (atom 0))(defn foo [] (dotimes [i 100000] (swap! N inc)))(defn start-threads [] (let [t1 (Thread. foo) t2 (Thread. foo)] (do (.start t1) (.start t2) (.join t1) (.join t2))))

(defn main [] (start-threads) @N)

11

haskell

fact 0 = 1;fact N = N * fact (N - 1);

или q?

12

gambit-c(define fifo (open-vector))

(define (suspend-and-die!) (call-with-current-continuation (lambda (k) (write (call-with-output-string '() (lambda (p) (output-port-readtable-set! p (readtable-sharing-allowed?-set (output-port-readtable p) 'serialize)) (write obj p))) fifo) (newline fifo) (force-output fifo) (thread-terminate! (current-thread)))))

(scheme)

13

whitespace ......».».$...»».»»»»$...»».»»..$...»».»»..$...»»..».»$...»..»...$»$..»$..»$..»$..»$..»$..$$$ 14

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеРаботаОбщение

15

Видение мира

16

(define (factorial n) (letrec ((helper (lambda (n a) (if (<= n 1) a (helper (- n 1) (* a n)))))) (helper n 1)))

Первый взгляд

17

(define (factorial n) (letrec ((helper (lambda (n a) (if (<= n 1) a (helper (- n 1) (* a n)))))) (helper n 1)))

Что видят лисперы

18

С + Assembly

printf("%d\n", (int *)2 + 3));

movl $2, %eax addl $12, %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf

19

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеРаботаОбщение

20

Понимание21

С++ / Scheme

std::for_each(str.begin(), str.end(), phx::if_(phx::bind(std::isalpha<char>, _1, phx::construct<std::locale>())) [ phx::let(_a = phx::ref(char_counts)[_1]) [ ++_a ] ]);

22

Больше слов

23

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеРаботаОбщение

24

Заимствование

25

Haskell + C++

26

Scheme + Erlang

(let ((me (self))) (spawn (lambda () (! me "Hello, world!"))))

(?)

= Termite

Hello, world!

27

…?key=value&...

string::size_type s = 0;string::size_type e = src.find("=");while(e != string::npos) { string::size_type a = src.find("&"); if(a != string::npos) { ...

28

…?key=value&...

typedef iterator_range<string::iterator> Ir;std::vector<Ir> params;split(params, make_iterator_range(src.begin(), src.end()), _1 == '&');BOOST_FOREACH(Ir& ir, params) { ...

29

…?key=value&...

lazy_split_iterator s(src.begin(), src.end(), '&'), e;for_each(s, e, ...

30

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеРаботаОбщение

31

Мы пишем плохой код

32

Есть причины

некогда думатьунаследованный кодлень

33

больше видимлучше пониманиезнаем новые идеине боимся их применять

Знаем больше

34

пишем чищепишем быстрее

Работаем лучше

больше временилучше код

35

Зачем учить?ЛюбопытствоВидение мираПониманиеЗаимствованиеРаботаОбщение

36

Круг общения

37

Повод похвастаться

38

Y-combinator

39

Зачем учить?Спокойный сонБольше информацииТренировка умаХорошие решенияЧистый кодПризнание и авторитет

40

Учите языки

41

[email protected]

http://voins.program.ru/yac.html

Алексей Воинов

Спасибо

Вопросы?