Зачем обычному программисту знать языки, на которых почти никто не пишет. Алексей Воинов, Яндекс

11,176 views

Published on

Алексей Воинов, Яндекс

Закончил МГТУ им. Н.Э.Баумана в 1998 году. Посвятил часть своей жизни свободному программному обеспечению. Замечен в любви к языкам, как к алгоритмическим, так и к человеческим, как к естественным, так и к искусственным. Работает в Яндексе с 2009 года, занимается разработкой Яндекс.Почты.

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

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
11,176
On SlideShare
0
From Embeds
0
Number of Embeds
9,710
Actions
Shares
0
Downloads
22
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Зачем обычному программисту знать языки, на которых почти никто не пишет. Алексей Воинов, Яндекс

  1. 1. Зачем изучать языки,на которых почти не пишутАлексей Воиновразработчик-экспертYaC, Москва, 19 сентября 2011 года
  2. 2. О чём это? 2
  3. 3. Функциональные vs ИмперативныеПромышленные vs Академические 3
  4. 4. О чём это? 4
  5. 5. О чём это? 5
  6. 6. 6 6
  7. 7. 6+1 7
  8. 8. 8
  9. 9. Зачем учить? Любопытство Видение мира Понимание Заимствование Общение Работа 9
  10. 10. Любопытство 10
  11. 11. 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
  12. 12. haskell или q?fact 0 = 1;fact N = N * fact (N - 1); 12
  13. 13. gambit-c (scheme)(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))))) 13
  14. 14. whitespace ......».».$ ...»».»»»»$ ...»».»»..$ ...»».»»..$ ...»»..».»$ ...»..»...$ »$ ..»$ ..»$ ..»$ ..»$ ..»$ ..$ $ $ 14
  15. 15. Зачем учить? Любопытство Видение мира Понимание Заимствование Работа Общение 15
  16. 16. Видение мира 16
  17. 17. Первый взгляд(define (factorial n) (letrec ((helper (lambda (n a) (if (<= n 1) a (helper (- n 1) (* a n)))))) (helper n 1))) 17
  18. 18. Что видят лисперы(define (factorial n) (letrec ((helper (lambda (n a) (if (<= n 1) a (helper (- n 1) (* a n)))))) (helper n 1))) 18
  19. 19. С + Assemblyprintf("%dn", (int *)2 + 3)); movl $2, %eax addl $12, %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf 19
  20. 20. Зачем учить? Любопытство Видение мира Понимание Заимствование Работа Общение 20
  21. 21. Понимание 21
  22. 22. С++ / Schemestd::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. 23. Больше слов 23
  24. 24. Зачем учить? Любопытство Видение мира Понимание Заимствование Работа Общение 24
  25. 25. Заимствование 25
  26. 26. Haskell + C++ 26
  27. 27. Scheme + Erlang = Termite(let ((me (self))) (spawn (lambda () (! me "Hello, world!"))))(?) Hello, world! 27
  28. 28. …?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
  29. 29. …?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
  30. 30. …?key=value&...lazy_split_iterator s(src.begin(), src.end(), &), e;for_each(s, e, ... 30
  31. 31. Зачем учить? Любопытство Видение мира Понимание Заимствование Работа Общение 31
  32. 32. Мы пишемплохой код 32
  33. 33. Есть причины некогда думать унаследованный код лень 33
  34. 34. Знаем больше больше видим лучше понимание знаем новые идеи не боимся их применять 34
  35. 35. Работаем лучше пишем чище пишем быстрее больше времени лучше код 35
  36. 36. Зачем учить? Любопытство Видение мира Понимание Заимствование Работа Общение 36
  37. 37. Круг общения 37
  38. 38. Повод похвастаться 38
  39. 39. Y-combinator 39
  40. 40. Зачем учить? Спокойный сон Больше информации Тренировка ума Хорошие решения Чистый код Признание и авторитет 40
  41. 41. Учите языки 41
  42. 42. Спасибо Алексей Воинов voins@yandex-team.ru http://voins.program.ru/yac.html Вопросы?

×