roman01la

2 марта 2015, Chernihiv, UA

# Понедельник 68 твитов

Привет. На этой неделе здесь я — @roman01la. Будем говорить о парном программировании, функциональном JS, о доступности и других штуках.

10:24

Кто-нибудь практикует парное программирование? Какие, по вашему мнению, плюсы/минусы в таком подходе?

10:54

У нас на проекте это нормальный процесс. Поначалу было странно, но уже скоро стали очевидны преимущества.

10:57

Так вот, работать в паре веселее, хотя, в целом, процесс идет медленнее.

11:31

В то же время растет качество кода, если хотя бы один из пары достаточно опытен. Обмен опытом — еще одно неизбежное преимущество.

11:34

Для новых людей на проекте работа парами — это возможность быстрее разобраться в коде и познакомится с командой.

11:41

Важно постоянно менять партнера, например раз в пару месяцев. Партнера по коду, конечно же :)

11:47
@jsunderhood вот пара моих рассказов про парное программирование: events.yandex.ru/lib/talks/559/ и events.yandex.ru/lib/talks/1447/
11:48

Если чувствуете себя некомфортно с новым партнером, важно не промолчать и высказаться. Вам еще работать вместе.

11:57

Ну или сменить партнера, в крайнем случае. Умение ладить с людьми работая парами всегда пригодится.

12:11

Только что менялись парами: стали в круг, разбираем задания и, по желанию, меняемся. Тимлид всегда помогает в этом процессе.

12:19

.@toivonens попросила написать о сообществе разработчиков здесь, во Львове.

12:36

Львов — один из центров аутсорса в Украине. Поэтому большинство митапов проводятся в стенах таких компаний.

12:40

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

12:41

Например на прошлых выходных, на территории горнолыжного курорта Буковель, прошла конференция WeBukovel webukovel.org.ua

12:45

Спасибо ее организатору @ArtyomTrityak. Я был рядом, но, к сожалению, не было возможности зайти.

12:49

Еще во Львове есть @LvivJS — конференция фронтенд разработчиков lvivjs.org.ua Был там в прошлом году, очень понравилось.

12:52

Может кто-нибудь из Львовских расскажет больше о местных митапах?

13:00
@jsunderhood фраза о важности выбора партнера по парному программированию звучит грозно по соседству с такими твитами pic.twitter.com/fPwnIdfB1D
13:04

Пытался достучаться до местной JS юзер группы jsug-lviv.blogspot.com Судя по блогу ребята давно не собирались.

13:09

Вообще удивительно, что, при таком количестве разработчиков в городе, не возникают новые митапы. Или я чего-то не знаю.

13:19

Многие посещают конференции и воркшопы в Европе. Большой аутсорс может позволить себе отправлять разработчиков по всему миру.

13:35

Нужно только суметь убедить заказчика в пользе для проекта от посещения таких событий.

13:36

А что бы убедить в необходимости посещения события, практически все митапы дают такой мануал fluentconf.com/fluent2014/pub…

13:52

Дальше по плану функциональный JS и немного FRP. Сейчас эта тема особенно активно обсуждается вокруг сообщества React.

15:47

Уже есть полно библиотек для написания кода в функциональном стиле, а на Хабре постоянно размещают посты на эту тему habrahabr.ru/hub/funcprog/

15:59

Кто-нибудь практикует функциональный JS? Было бы интересно услышать впечатление от работы с JS пришедших из функциональных языков.

16:14

В целом функциональный подход интересен хотя бы тем, что это альтернатива привычному ООП.

16:25

Одной из характеристик функционального ЯП являются функции высшего порядка и функции первого класса.

16:38

Проще говоря — функции оперирующие другими функциями.

16:40

И любые операции представляются как функции. Например: `2 + 2` в JS и `(+ 2 2)` в Clojure.

16:47

По сути в JS математические операции — это функции с неявной записью. Поэтому их нужно адаптировать, оборачивать в явные функции.

16:54

`let add = x => x + x;`

16:56

Кстати, синтаксис fat arrow function из ES6 отлично подходит для описания таких базовых функций, короткая запись, ничего лишнего.

16:59

Имея набор таких базовых функций, можно воспользоваться одним из преимуществ функционального программирования — композицией.

17:05

`capitalize(trim(string))` — композиция двух операций.

17:11

Каждая из операций возвращает результат своего выполнения, таким образом можно создавать более сложные операции.

17:13

Но запись через вкладывание неудобна, поэтому нам понадобиться функция высшего порядка для миксования других функций в новую операцию.

17:17

Такую функцию часто называют `compose`. Вот пример ее реализации jsbin.com/finiziyulo/1/

17:30

Теперь новые операции можно создавать так: `let convert = compose(trim, capitalize);`.

17:32

И тут я осознал еще одно преимущество функционального подхода: ваш код говорит ЧТО делать, а не КАК, в случае с императивным подходом.

18:11

Для этого в JS нужно отказаться от циклов в пользу `.map()`, `.filter()` и т.д.

18:17

В одном из своих докладов @jhusain из Netflix рассказывает о функциональщине в JS youtube.com/channel/UCGGRR…

18:22

Еще у них есть классный интерактивный курс по основам jhusain.github.io/learnrx/

18:23

Если используете Underscore.js, то ура — в библиотеке есть набор функциональных инструментов, которые вы тоже наверняка уже использовали.

18:27

Хотя @drboolean считает, что Underscore делает это неправильно youtube.com/watch?v=m3svKO…

18:29

У этого парня есть шестичасовой курс по ФП в JS «Hardcore Functional Programming in JavaScript» frontendmasters.com/courses/functi…

18:32
@jsunderhood бро, заканчивай эту тоску, пжалста. Или давай сразу про эндофункторы и стрелки и точки неподвижные в разрезе трансдьюсеров.
18:32

А если хочется теории, то на том же Хабре есть что почитать. Например Теория катеогрий habrahabr.ru/search/?q=%D1%…

18:34

Больше всего понравилась серия переводов «Теория категорий для программистов» habrahabr.ru/post/245797/ Очень доходчиво.

18:38

Хотя на практике польза от этого сомнительна. Возможно стоит начать изучать Haskell?

18:43

Если нет времени читать статьи, вот отличные слайды yogsototh.github.io/Category-Theor…

18:44

Пожалуйста поправляйте, если с чем-то не согласны.

18:50
@jsunderhood на недавнем 19-м @moscowjs выступал Трдат с докладом про FRP. Скоро будет видео! ;)
18:50

Мне кажется, что для лучшего понимания ФП нужно попробовать функциональный язык. Например Clojure и в частности ClojureScript.

19:30

А выбрал я ClojureScript потому, что для него есть Om — cljs интерфейс для React github.com/omcljs/om

19:44

В cljs данные всегда неизменяемые (immutable) и вот почему это хорошо...

19:46

С точки зрения CPU намного быстрее создать, обработать и выбросить, чем создать, обработать, положить в память, запросить, обработать и т.д.

19:53

К сожалению быстро это работает для многопотоковой архитектуры. Но не отменяет того факта, что с неизменяемыми данными работать проще.

19:56

Это был краткий пересказ слов @jhusain

19:58

А в сочетании с более медленными абстракциями над циклами типа `.map()` функциональный код в JS будет еще медленнее.

20:02

Так что, в ближайшем будущем, тяжелые приложения на функциональном JS лучше обходить стороной.

20:05

Например игры, где каждую секунду по 60 раз выполняются сотни функций.

20:07

На интерфейсы это не распространяется, железо уже достаточно производительно.

20:07

# Вторник 21 твит

Еще немного о ФП

9:31

Реализация неизменяемых структур данных в JS: Immutable.js facebook.github.io/immutable-js/ и mori swannodette.github.io/mori/

9:32

Паттерны ФП youtube.com/watch?v=AvgwKj…

9:35

Скринкаст по Haskell youtube.com/watch?v=mtVk8R… что бы понять, как ФП работает в функциональных языках.

9:40

И очень крутая лекция про монады youtube.com/watch?v=ZhuHCt… Крокфорд так не объясняет :)

9:44

Теперь немного о функциональном реактивном программировании...

14:27

ФРП — это ФП + потоки.

14:31

Поток — это данные поступающие со временем.

14:32

На практике это может выглядеть как преобразование событий DOM в поток таких событий и их обработка инструментами ФП.

14:33

Например как это делает RxJS github.com/Reactive-Exten…

14:34

Используя базовый набор операций над потоками можно облегчить себе жизнь в создании интерфейсов.

14:51

Об этом хорошо рассказывает все тот же техлид из Netflix в докладе «Async JavaScript with Reactive Extensions» youtube.com/watch?v=FAZJsx…

14:53

Вот еще неплохо написано о реактивном программировании в JS gist.github.com/staltz/868e7e9…

14:54

Короткий и информативный доклад @swannodette о неизменяемых структурах данных youtube.com/watch?v=SiFwRt… /cc @rdvornov

18:11

На React.js Conf @jlongster рассказал о другом подходе в работе с асинхронным JS пришедшем из Clojure и Go — это CSP youtube.com/watch?v=W2DgDN…

19:11

Communicating sequential processes представляет концепцию процессов и каналов, по которым общаются эти процессы.

19:16

Один процесс забрасывает данные в канал, другой достает их.

19:20

Рядом с CSP всегда упоминаются трансдьюсеры. На Хабре было несколько постов о них. А в этом автор создает их с нуля phuu.net/2014/08/31/csp…

20:05

Если просто, то трансдьюсер — это способ трансформирования данных через композицию.

20:07

А это пятая серия «Better Call Saul» youtube.com/watch?v=tt2iU2…

20:12

# Среда 23 твита

На wiki.ecmascript.org можно почитать об интересных штуках которые не стали частью ES6 и о возможных изменениях в JS в далеком будущем.

11:45

Например чтсла SIMD (single instruction, multiple data) ru.wikipedia.org/wiki/SIMD

11:48

На самом деле SIMD перенесли в ES7 и эта спека уже частично реализованна в FF Nightly.

11:49

SIMD инструкции обеспечивают параллелизм на уровне данных.

11:51

Такая оптимизация даст прирост в производительности например в графике, где данные представлены в виде векторов.

11:55

Например: в JS нету векторов, обычно представляют в виде массива или объекта, тогда операции над такими векторами выполняются почленно...

11:59

Поэтому [1,2,3] + [1,2,3] выполнится в три процессорных такта, а с SIMD всего в один такт.

12:01

Спеку можно почитать здесь github.com/johnmccutchan/…

12:01

Наглядный пример оптимизации рендеринга фракталов в asm.js peterjensen.github.io/mandelbrot/js/… только FF Nightly

12:07

Кстати, о графике в вебе. Посмотрите на эти примеры физически правильного рендеринга в WebGL blog.sketchfab.com/post/112612737… Очень круто!

12:25

Другая интересная спека — Typed Objects wiki.ecmascript.org/doku.php?id=ha… тоже не попала в ES6, но реализована в FF Nightly

12:46

Типизированные структуры данных `new StructType({ x: uint32, y: uint32 });`.

12:49

В ночной сборке FF все типы находятся в глобальном объекте TypedObject pic.twitter.com/LyudFyhtfM

13:19

Или вот предложенный в ES7 оператор `.=` batch assignment для объектов wiki.ecmascript.org/doku.php?id=st…

14:18

И guards, как в Haskell wiki.ecmascript.org/doku.php?id=st…

14:38

Вот еще несколько интересных спек: короткий синтаксис для function expression wiki.ecmascript.org/doku.php?id=st…

15:34

Иммутабельные структуры типа объект wiki.ecmascript.org/doku.php?id=st…

15:34

И иммутабельные последовательности (массивы, листы) wiki.ecmascript.org/doku.php?id=st…

15:38

Параллельно с Atom пробую Light Table lighttable.com Особой популярностью не отличается, но есть крутые штуки.

20:34

Например результат выполнения кода, который пишешь, возникает в той же строке. Наблюдение за значением переменных, тоже круто.

20:36

Похоже на то, что делает wallabyjs.com с тестами.

20:37

Перед тем, как заняться фронтендом, делал веб-дизайн. Сейчас вкус к красивым интерфейсам практически пропал. Все свелось к минимализму.

22:42

Вы поддерживаете свои дизайнерские способности? Если да, то каким образом?

22:43

# Четверг 14 твитов

@jsunderhood, минимализм не отменяет красоту интерфейса, а наоборот обнажает истинную красоту, скрытую в его логике.
9:42
@jsunderhood перечитываю «Кради как художник»
9:42

Джависты недоумевают почему `array === $(array) // false`

11:37

Это можно объяснить как неявное приведение типов.

11:43

Еще джавистам сложно понять ООП в JS, что уже говорить о React. Поэтому берут Angular.

13:35

Fat arrow не единственный новый тип функции в ES6, еще есть tag function: fn `Hello ${name}!`. Вызов без скобок, принимает template string.

13:43

Используется для чтения исходных данных из строки: значения и части строки tc39wiki.calculist.org/es6/template-s…

13:44

С ES6 Proxy можно делать method missing, как в Ruby soft.vub.ac.be/~tvcutsem/prox…

14:17

Но такую штуку можно сделать и без Proxy, через нестандартный метод `__noSuchMethod__`, который вызывается если вызываемого метода нету.

14:18

А вы стримили в /r/WatchPeopleCode/ ? Или может наблюдали за процессом разработки reddit.com/r/WatchPeopleC…

14:54

Можно залипнуть на вечер и узнать что-нибудь новое для себя. Подходы, техники.

14:56

Даже простым +1 в комментариях к обсуждению желаемой фичи вы можете повлиять на ее реализацию.

20:52

# Пятница 10 твитов

Добавил иконку React в плагин file-icons, для подсветки .jsx файлов, в Atom github.com/DanBrooker/fil… pic.twitter.com/ZTPnKibkml

8:14

Заодно получил опыт создания иконочного шрифта в Inkscape.

8:15

Суперский инструмент для экспорта набора иконок в шрифт icomoon.io/app/

8:18
@jsunderhood fontello.com с более простым, но схожим функционалом
9:24

А существует ли логотип закрепленный за картами кода?

9:47

Видео со вчерашней ng-conf youtube.com/user/ngconfvid…

10:07

И итоги EmberConf 2015 github.com/poteto/emberco…

10:07

Добротный туториал об npm модулях на ES6 habrahabr.ru/post/252389/

18:17

Библиотека функций высшего порядка для итераторов из ES6 fitzgen.github.io/wu.js/

19:06

habrahabr.ru

github.com

www.youtube.com

wiki.ecmascript.org

other