bespoyasov

26 апреля 2021

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

Привет!
На этой неделе у микрофона Саша @bespoyasov.

Работаю в DRIVE2. Пришёл туда как фронтендер, потом писал б… twitter.com/i/web/status/1…

7:50

В основном пишу на TS, иногда на Python и C#. В разное время писал на PHP и C++, не зашло ни то, ни то 😃
Пробовал L… twitter.com/i/web/status/1…

7:50

На эту неделю хочу предложить вам вот такой план:

В понедельник поговорим об архитектуре. День начнём с наброса —… twitter.com/i/web/status/1…

7:53

Во вторник набросим ещё больше и обсудим ООП и современный фронт.

Кто они: «хорошие друзья» или «заклятые враги»?… twitter.com/i/web/status/1…

7:55

В среду поговорим о чистоте кода и обсудим, как сделать его читаемым и тестируемым.

Начнём с нейминга, закончим пр… twitter.com/i/web/status/1…

7:55

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

Что эффективнее: университет, галеры, опен-сорс… twitter.com/i/web/status/1…

7:55

В пятницу поговорим на несколько отвлечённую тему: зачем вести технический (или вообще какой угодно) блог.

Поделим… twitter.com/i/web/status/1…

7:56

В субботу обсудим, кто и как относится к пет-проектам. Не стали ли они завышенным требованием от разработчиков.

(А… twitter.com/i/web/status/1…

7:56

В воскресенье поболтаем о том, кто и как любит отвлекаться от работы и отдыхать. Какие у кого хобби, как получается… twitter.com/i/web/status/1…

7:56
@jsunderhood Говоришшш, реакт любишшш... pic.twitter.com/WiyGgRtICi

jQuery я тоже люблю! 😃

Один из любимых хуков вот! 😅
github.com/latviancoder/u…

@jsunderhood Говоришшш, реакт любишшш... pic.twitter.com/WiyGgRtICi

7:58

Сейчас закончу своё дейли, и начнём ^_^

7:59
@jsunderhood Я вот думаю так. Чистая архитектура, код – строгие правила. Они помогают тем, кто не ориентируется, д… twitter.com/i/web/status/1…

Второй абзац — это то, к чему я постараюсь подвести в конце, но предпосылки (первый абзац) у меня немного другие 🙂

@jsunderhood Я вот думаю так. Чистая архитектура, код – строгие правила. Они помогают тем, кто не ориентируется, д… twitter.com/i/web/status/1…

8:03

Как и обещал, начнём с наброса 😃
Что такое чистая архитектура, зачем нужна, плюсы, издержки.

Если вы работали c y… twitter.com/i/web/status/1…

8:26

Начнём с того, что такое «Чистая архитектура».

Behold! pic.twitter.com/7CSVZPn02Y

8:27

В общих чертах: весь код поделен на слои.

Центральный слой (домен) — ядро приложения, максимально независим и отве… twitter.com/i/web/status/1…

8:28

Адаптеры и порты — это связь со внешним миром: БД, UI, вот это всё.

Если хочется узнать побольше, то вот пара ссыл… twitter.com/i/web/status/1…

8:28

Когда я начал постить в блоге (о фронтенде) конспекты книг и статьи об архитектуре, мне стали прилетать вопросы тип… twitter.com/i/web/status/1…

8:29

Я отчасти понимаю природу этих вопросов.

Кажется, что архитектура это что-то далёкое от фронтенда: мы же просто ф… twitter.com/i/web/status/1…

8:29

Вот нафига мне выделять «слои» в приложении, если _всё_ моё приложение — это небольшое PWA с парой кнопочек?

Есть… twitter.com/i/web/status/1…

8:31

Да чтобы просто _нарисовать_ схему приложения по такой архитектуре у меня времени уйдёт больше, чем на то, чтобы на… twitter.com/i/web/status/1…

8:31

Я предлагаю начать с того, что архитектура — это прежде всего инструмент.

У любого инструмента есть область применения и ограничения.

8:31
@jsunderhood Реквестирую тред про интервью по системному дизайну и архитектуре. У меня завтра собеседование, а инф… twitter.com/i/web/status/1…

О! Я сам на таких интервью не бывал, но подозреваю, какие могут быть вопросы 🙂

Предлагаю вернуться к этому в сере… twitter.com/i/web/status/1…

@jsunderhood Реквестирую тред про интервью по системному дизайну и архитектуре. У меня завтра собеседование, а инф… twitter.com/i/web/status/1…

8:33
@jsunderhood >... максимально независим...

От чего?

Если коротко, ото всего, кроме языка, на котором пишем.

То есть, домен не должен ссылаться на фреймворки, на UI,… twitter.com/i/web/status/1…

@jsunderhood >... максимально независим...

От чего?

8:37

Например, у нас есть приложение на TS для веба и для React Native. Домен должен описывать такие сущности и правила,… twitter.com/i/web/status/1…

8:37

А в адаптерах и портах — всё, специфичное для конкретной платформы.

8:37

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

Но если саморезов 1000, то я уже подумаю:… twitter.com/i/web/status/1…

8:38

Архитектура, как и шуруповёрт, стоит ресурсов.

Поддержка сложного проекта с лапше-кодом, как и артрит, — тоже сто… twitter.com/i/web/status/1…

8:38

Свой первый вывод я сделал для себя, когда сравнил маленький и простой проект с навороченной архитектурой и большой… twitter.com/i/web/status/1…

8:39

Дело было так: я однажды попал в сложный проект на PHP с кучей легаси и запутанным кодом.

Ни о какой архитектуре… twitter.com/i/web/status/1…

8:39

Тогда я только-только начинал знакомиться с хорошими практиками в разработке софта, книжки там читать начал, всё та… twitter.com/i/web/status/1…

8:39

Работать было невозможно, потому что добавишь чё-нибудь-куда-нибудь, где-нибудь-что-то-ещё отвалится.

— Так напис… twitter.com/i/web/status/1…

8:39

Не писались там тесты, как бы мы ни старались 😃
Код был написан так, что чтобы протестировать какой-то модуль, при… twitter.com/i/web/status/1…

8:41

Поддерживать этот комбайн было трудно. И не только потому, что тестировать было неудобно — было трудно даже понять,… twitter.com/i/web/status/1…

8:42

Всё было намешано в кучу.

Держать в голове даже один модуль было трудно: модуль мог и за шаблонизацию отвечать, и… twitter.com/i/web/status/1…

8:45

Как и куда направлены зависимости тоже ясно не было. (Циклические зависимости себя не заставили долго ждать 😅)

8:45

Теперь контр-пример: прототип приложения на React.

Надо быстро, поддерживать будет, скорее всего, не нужно. А есл… twitter.com/i/web/status/1…

8:59

Страдая от, кхм, ПТСР с прошлого опыта, я накрутил туда архитектуры по всем правилам: вот тебе и домен, вот тебе пр… twitter.com/i/web/status/1…

8:59

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

Ладно хоть писал сам, а т… twitter.com/i/web/status/1…

8:59

И вот мой первый тогдашний вывод:
== Издержки должны быть меньше выгоды ==

Да, вот так очевидно 😃

9:00

После того проекта я решил порефлексировать на него.

Что бы произошло, если бы всё-таки прототип пришлось перепис… twitter.com/i/web/status/1…

9:00

*Сейчас пойду поработаю, а после расскажу:

9:03

Обед! Продолжим 😃

Итак, что бы произошло, если бы всё-таки прототип пришлось переписать.

10:37

Кто-то уже мог догадаться, что я клоню к домену.

Домен — это самое главное, что есть в приложении. Та функциональ… twitter.com/i/web/status/1…

10:37

То, что мне точно пришлось бы перенести из прототипа в продукт — именно домен.

Да, вероятно, с изменениями, возмо… twitter.com/i/web/status/1…

10:37

Второй вывод:
=== Стоит начать с домена ===

Сперва можно и не городить оставшиеся слои, не писать адаптеры к библ… twitter.com/i/web/status/1…

10:38

Я это называю, кхм, «прагматичной архитектурой» 😃

Это как правило 20/80, только про дизайн систем.
ru.wikipedia.org/wiki/Закон_Пар…

10:38

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

Так было в запутанном проекте из первого приме… twitter.com/i/web/status/1…

10:39

Имей мы на руках функции и модули конкретных сущностей, мы бы уже знали, как они себя ведут и что с ними можно дела… twitter.com/i/web/status/1…

10:39

— Ок, допустим. Но вот я читаю книжки об архитектуре, там сплошное ООП. А я не хочу в свой проект его тащить.

Пони… twitter.com/i/web/status/1…

10:41

Ну то есть понятно, что большая часть книг написана с примерами на ОО-языках, но это не значит, что нам нельзя взят… twitter.com/i/web/status/1…

10:41

Домен можно вообще писать как хочется. Главное, чтобы код был понятным и независимым.

Я, если пишу не в ОО-стиле,… twitter.com/i/web/status/1…

10:41

Профит в том, что если проект выстрелит и начнёт быстро расти, вам будет проще накрутить мяса вокруг самого важного… twitter.com/i/web/status/1…

10:42

Чем проще и прямолинейнее домен, тем очевиднее, что в системе можно вытворять, а что нет.

А чем очевиднее правила… twitter.com/i/web/status/1…

10:42

— Ладно, это всё, конечно, круто, но ты кажется забыл, что мы тут вс же на JS пишем. Какие нафиг типы? 😃

Отсутств… twitter.com/i/web/status/1…

10:48

Ну то есть да, статичная типизация помогает проектировать, но и без неё можно справиться.

Ну там JSDoc, объекты-ст… twitter.com/i/web/status/1…

10:48

(Без интерфейсов сложно сконцентрироваться на взаимодействии между сущностями.

Труднее выделять публичное API, аб… twitter.com/i/web/status/1…

10:48

Я для прототипов тесты, например, не пишу.

Но как только становится понятно, что из прототипа надо делать продукт… twitter.com/i/web/status/1…

10:48

В целом считаю, что выделенный домен — это то самое минимальное необходимое количество ресурсов, которое стоит выде… twitter.com/i/web/status/1…

10:48

— Окей, ладно. С доменом разобрались, допустим. Но вот зачем остальные слои? Они нужны?

Короткий ответ: не всегда.… twitter.com/i/web/status/1…

10:52

И это правда, перебраться с него на какой-то другой шаблонизатор сложно. У него богатая экосистема, куча уже написа… twitter.com/i/web/status/1…

10:52

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

Кто-то, наверное, даже успешно его менял на как… twitter.com/i/web/status/1…

10:53

Он обычно затрагивает много кода: хранилище, события всякие, привязка к UI.

Вместе со всем этим кодом надо и тесты… twitter.com/i/web/status/1…

10:53
@jsunderhood Можно попросить привести более конкретный пример для типового веб приложения? Скажем, для фронт энда о… twitter.com/i/web/status/1…

Да! ^_^

Недавно меня уже спрашивали в Твитере, что-куда-и-как можно вынести.

Я ответил на примере приложения с… twitter.com/i/web/status/1…

@jsunderhood Можно попросить привести более конкретный пример для типового веб приложения? Скажем, для фронт энда о… twitter.com/i/web/status/1…

11:11

Сейчас в дополнение к котикам сделаем онлайн-магазин печенек! 🍪

11:11

Допустим, наш магазин продаёт разные виды печенек. У каждой печеньки есть цена, состав и срок изготовления.

Пользо… twitter.com/i/web/status/1…

11:11

В доменный слой я бы вынес следующее.

11:11

Дальше, слой адаптеров и портов. (Да, сейчас поговорим о самом внешнем слое, я в конце покажу, почему именно так: б… twitter.com/i/web/status/1…

11:15

Задача адаптера — сделать интерфейс стороннего сервиса совместимым с тем, который _хочет наше приложение_.

Это зна… twitter.com/i/web/status/1…

11:15

Порт — спецификация, как сторонние сервис _может_ общаться с нашим приложением, или как наше приложение _хочет_, чт… twitter.com/i/web/status/1…

11:15

Это всё был внешний слой.

Прикладной слой (между доменом и портами/адаптерами) — описывает сценарии, конкретно это… twitter.com/i/web/status/1…

11:16

Тогда прикладной слой магазина будет содержать:

11:16

При этом ту часть, например, оплаты, которая использует внешний сервис (допустим, PayPal), мы вынесем в адаптер.… twitter.com/i/web/status/1…

11:16

С адаптером для стейт-менеджера переезд попроще 🙂

Слой адаптеров — это барьер, который говорит, где заканчивается… twitter.com/i/web/status/1…

11:20

Адаптеры и порты делят внешний мир от нашего приложения как мембрана клетки отделяет её от окружающей среды.

И вс… twitter.com/i/web/status/1…

11:20

Адаптеры как бы ограничивают распространение изменений. Мы пишем такие «переходники», которые делают внешний мир бо… twitter.com/i/web/status/1…

11:20

Из-за этого и API _приложения_ меняется редко. Адаптеры же можно написать (в идеале) для любой сущности, с которой… twitter.com/i/web/status/1…

11:20

Это, кстати, ещё и ограничивает распространение ошибок 🙂

Об этом писал Ганмер в «Паттернах отказоустойчивых прило… twitter.com/i/web/status/1…

11:20

Кроме ошибок, это ещё и помогает рефакторить код.

Разделение по слоям — идеальный «шов», как называет его Физерс в… twitter.com/i/web/status/1…

11:20

Итак, к этому моменту:

11:23

...Но если это очень дорого и бессмысленно (проект точно не доживёт до момента, когда мы захотим поменять React на… twitter.com/i/web/status/1…

11:23

Хорошо, вот мы поняли, что нашему проекту на Реакте _нужна_ суровая масштабируемость, и одним выделением доменного… twitter.com/i/web/status/1…

11:25
@jsunderhood У нас в компании юзается Mobx, и там просто гигантский стор, в котором и ui данные, и данные сервера.… twitter.com/i/web/status/1…

Кстати, да!

Забегая вперёд (к рефакторингу и тестируемости): место, где всречаются серверные и клиентские данные… twitter.com/i/web/status/1…

@jsunderhood У нас в компании юзается Mobx, и там просто гигантский стор, в котором и ui данные, и данные сервера.… twitter.com/i/web/status/1…

11:28
@jsunderhood Реквестирую тред про интервью по системному дизайну и архитектуре. У меня завтра собеседование, а инф… twitter.com/i/web/status/1…

Теперь немного о собственно проектировании.

Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

@jsunderhood Реквестирую тред про интервью по системному дизайну и архитектуре. У меня завтра собеседование, а инф… twitter.com/i/web/status/1…

11:30

Мы (люди) плохо умеем прогнозировать будущее. Проектирование систем — это прогнозирование будущего.

Чем больше исх… twitter.com/i/web/status/1…

11:30

(О соотношении карты и территории: ru.wikipedia.org/wiki/Соотношен…)

11:32

Что нам необходимо знать?

11:36

Чего мы хотим добиться:

11:36

  • ...Кода должно быть минимальное необходимое количество.
  • Модель системы должна быть максимально простой.
  • Напра… twitter.com/i/web/status/1…
  • 11:36

    Я недавно писал пост о дизайне системы с помощью слоёв и DDD:
    bespoyasov.ru/blog/generatin…

    Давайте используем его как п… twitter.com/i/web/status/1…

    11:37

    Так-с, обед закончился 😅
    Ответим на вопросы после работы!

    11:37

    Продолжим 🙂

    На какие вопросы мы ищем ответы? В первую очередь — какие перед нами стоят задачи. Потому что ответ н… twitter.com/i/web/status/1…

    13:53

    Кроме этого — какое решение мы посчитаем достаточным, какая требуется глубина проработки.

    Если мы делаем приложени… twitter.com/i/web/status/1…

    13:53

    В первом случае мы можем не прорабатывать слой адаптеров так уж тщательно, потому что переиспользовать какой-то код… twitter.com/i/web/status/1…

    13:53

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

    Ту… twitter.com/i/web/status/1…

    13:53

    Невозможно проработать систему на 100%. Всегда останется что-нибудь, что можно улучшить.

    Это стоит иметь в виду,… twitter.com/i/web/status/1…

    13:53

    При непосредственно дизайне я люблю сперва проектировать домен. Обычно я беру бумажку с ручкой и рисую квадратики с… twitter.com/i/web/status/1…

    13:53

    В стрелочках я указываю публичное API, возможно, абстрактно формат сообщений, которыми сущности будут обмениваться.… twitter.com/i/web/status/1…

    13:53

  • ...Всё ли нормально с направлением зависимостей;
  • Следую ли я принципам SOLID;
  • Что будет, если захочу заменить… twitter.com/i/web/status/1…
  • 13:53

    Обычно получается нечто вроде такой диаграммы (из поста с деревьями): pic.twitter.com/o32dDa4TPH

    13:54

    Я не стал упарываться, покрывая веб-платформу адаптерами с ног до головы, так как был уверен, что мне это не понадо… twitter.com/i/web/status/1…

    13:54

    Также помогает выделить Driver (управляющие), и Driven (управляемые) адаптеры: pic.twitter.com/F4bK9UnJrZ

    13:55

    (На эту тему ещё раз посоветую эту статью herbertograca.com/2017/11/16/exp…)

    13:56

    Диаграмма помогает не писать сразу код, а сперва приметиться на бумаге — «а оно вообще поедет?».

    Иногда диаграммы… twitter.com/i/web/status/1…

    13:59

  • ...Нужна шина событий, чтобы связать какие-то сущности;
  • Нарушаем SRP, DIP, ISP и прочее.
  • 13:59
    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

  • Писать код ещё рано. Проектиурем!
  • 14:00
    Да! ^_^

    Недавно меня уже спрашивали в Твитере, что-куда-и-как можно вынести.

    Я ответил на примере приложения с… twitter.com/i/web/status/1…

  • Прорабатываем взаимодействие модулей:
  • 14:02

  • Пишем код домена.
  • 14:05

  • Прикладной слой и порты с адаптерами.
  • 14:05

  • Держим при написании в голове разницу между выгодами и издержками.
  • 14:06

    Архитектура — это не только возможность масштабироваться, но ещё и увеличенный порог входа. Возможно, будет нужен о… twitter.com/i/web/status/1…

    14:08

    7. Стараемся не плодить абстракций сверх меры.

    Слои нам нужны, чтобы не смешивать зоны ответственности модулей.

    14:11
    @jsunderhood А как ты относишься к идее совы?
    github.com/feature-sliced

    У меня есть смутное подозрение, что это именно то, что в статье “How I put it all together” называют компонентом.… twitter.com/i/web/status/1…

    @jsunderhood А как ты относишься к идее совы?
    github.com/feature-sliced

    14:13

    То есть там конечно есть особенности, и оно не «точь в точь такое же», но кажется, будто бы идея где-то очень близко.

    14:14

    Кстати!

    Структура папок никак не влияет на архитектуру и не отражает её 😃

    То есть мы можем поделить приложение н… twitter.com/i/web/status/1…

    14:15

    А вообще идея разделения файлов/папок на фичи мне больше нравится, чем разделение их на те же «слои».

    Кажется, что… twitter.com/i/web/status/1…

    14:16
    @jsunderhood Будет вообще интересно поговорить о том, что такое чистая арихтектура и что конкретно это на фронте. Л… twitter.com/i/web/status/1…

    Теперь немного ссылок на Гитхабы!

    Есть несколько шаблончиков для Реакта:

    @jsunderhood Будет вообще интересно поговорить о том, что такое чистая арихтектура и что конкретно это на фронте. Л… twitter.com/i/web/status/1…

    14:24

    Есть и без Реакта!
    Вот я писал недавно пост об архитектуре, есть репозиторий для с исходниками:
    -… twitter.com/i/web/status/1…

    14:24

    Структура файлов в двух последних репозиториях не отражает слои, но из поведение — вполне.

    Кстати, репозиторий с с… twitter.com/i/web/status/1…

    14:24

    Без ссылок на Гитхаб — Тяжеловато:
    fuckgrechka.ru/tzlvt/

    Писал в блоге, почему и как я его переписал. Там даже д… twitter.com/i/web/status/1…

    14:27

    За диаграмму особо не ругайте, он старая, я тогда ещё не умел рисовать нормально и стрелки в нужные стороны направлять :–/

    14:28
    И вот мой первый тогдашний вывод:
    == Издержки должны быть меньше выгоды ==

    Да, вот так очевидно 😃

    Плохо умею в треды, продолжение вот тут, простите 😅

    И вот мой первый тогдашний вывод:
    == Издержки должны быть меньше выгоды ==

    Да, вот так очевидно 😃

    14:38
    @_olegkusov Ты правильно заметил, что там в основном отображение.

    Я дашборда не видел, поэтому сложно советовать,… twitter.com/i/web/status/1…

    Приложение с котиками тут:
    twitter.com/bespoyasov/sta…

    @_olegkusov Ты правильно заметил, что там в основном отображение.

    Я дашборда не видел, поэтому сложно советовать,… twitter.com/i/web/status/1…

    14:52
    @jsunderhood Так вот такие штуки можно и НУЖНО пихать в домен или shared kernel.

    Они позволяют куда эффективней о… twitter.com/i/web/status/1…

    Про домен не соглашусь, shared kernel — да, тоже может быть. Главное не переусердствовать!

    @jsunderhood Так вот такие штуки можно и НУЖНО пихать в домен или shared kernel.

    Они позволяют куда эффективней о… twitter.com/i/web/status/1…

    14:54
    @jsunderhood А можно вообще найти весь тред про архитектуру в виде какой-нибудь статьи? Формат твитов не очень подх… twitter.com/i/web/status/1…

    В самую первую очередь советую вот эту статью!
    herbertograca.com/2017/11/16/exp…

    @jsunderhood А можно вообще найти весь тред про архитектуру в виде какой-нибудь статьи? Формат твитов не очень подх… twitter.com/i/web/status/1…

    15:39

    Потом ещё DDD:
    ddd.fed.wiki.org/view/welcome-v…

    15:40

    А дальше — книги 😃

    Я в блоге делал конспекты

    15:41

    Спасибо всем, кто отвечал и задавал вопросы сегодня! ^_^

    Ухожу спать. Завтра продолжим и подкинем в костёр несколько ООП-дровишек 😃

    17:56

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

    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    6:24

    А пока идёт голосование, обсудим, чем ООП плохо и хорошо, а что его не любят и наоборот.

    Начнём с хейта 😃

    7:12

    Сразу начну с того, что не каждому проекту ООП нужно.

    Иногда гораздо проще написать пару функций с объектами, и н… twitter.com/i/web/status/1…

    7:12

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

    Я подозреваю откуд… twitter.com/i/web/status/1…

    7:12

    Я согласен, что иммутабельные структуры данных — это круто и надёжно. Но сам лично не считаю мутации чем-то плохим,… twitter.com/i/web/status/1…

    7:12

    Но беспорядочные мутации — это не проблема ООП, это проблема плохо написанного кода 😃

    Запутанный код можно написат… twitter.com/i/web/status/1…

    7:12

    Для управления мутациями давно уже придумали много способов работы, тот же CQS:

    7:12

    С ним, кстати, вполне реально выстроить как 1-way, так и 2-ways data-flow, он достаточно универсален, чтобы быть удобным в обоих случаях.

    7:17

    Так вот, тот ООП энтерпрайз, который следовал CQS, был вполне себе понятным ¯\_(ツ)_/¯
    Так что, возможно, дело не в… twitter.com/i/web/status/1…

    7:17

    Но опять, это не проблема самого ООП 😃

    Да, среди принципов SOLID есть SRP, single responsibility principle. Он гов… twitter.com/i/web/status/1…

    7:17

    Может, дело просто в самой его сложности?
    Ну… ООП сложный, но не сложнее настоящей™ функциональщины.

    Теорию групп… twitter.com/i/web/status/1…

    7:17

    Хотя я даже работал на проекте, где это использовалось.

    Очень оказалось полезно как раз для ООП. Проще стало пони… twitter.com/i/web/status/1…

    7:17

    Мне кажется, весь хейт в том, что ООП на фронте с JS просто не удобен.

    Использовать его по-настоящему не получаетс… twitter.com/i/web/status/1…

    7:19

    Но есть TypeScript 🙂

    Он всё ещё страдает от JS-райнтайма, но у него уже достаточное API, чтобы писать нормальный™… twitter.com/i/web/status/1…

    7:19

    Другое дело, что это опять-таки не всем проектам нужно 🙂

    7:19

    Парадигма программирования, как и архитектура, — это инструмент для укрощения сложности. И, как с архитектурой, нам… twitter.com/i/web/status/1…

    7:22

    Взять те же принципы SOLID.
    ota-solid.now.sh

    Мы можем (хоть с оговоркой и не все) использовать их в отрыв… twitter.com/i/web/status/1…

    7:22

    В коде Тяжеловато даже классов нет 😃

    Я вообще считаю, что ООП — это больше не про классы, а про отношения между су… twitter.com/i/web/status/1…

    7:22

    В простейших случаях можно обойтись и объектом с парой функций.

    Но вот то, как эти объекты будут друг с другом вза… twitter.com/i/web/status/1…

    7:22

    Я причём не говорю, что интерфейсы и реализации — это строго лишь ООП, нет.

    Просто как их использовать для проекти… twitter.com/i/web/status/1…

    7:22

    — Ладно, вот простой вопрос: можно ли вообще писать в ООП-стиле фронтовый код? Не бекенд, а фронт?

    Да. (Но нужен TypeScript 😃)

    7:23

    Есть ошибочное мнение, что фронт — типа ненастоящее программирование.

    Но современный фронт сложный ¯\_(ツ)_/¯
    А с… twitter.com/i/web/status/1…

    7:23

    Со сложностью надо как-то справляться.

    У нас есть фреймворки и библиотеки, это хорошая помощь, но они решают толь… twitter.com/i/web/status/1…

    7:24

    И вот тут ООП может помочь:

    7:24

    Из всего, что я пробовал у ООП наиболее богатый инструментарий и словарь для проектирования систем ¯\_(ツ)_/¯

    Крут… twitter.com/i/web/status/1…

    7:24

    Кстати, ООП не запрещает использовать преимущества ФП! 🙂

    Мы можем продолжать использовать чистые функции, иммутаб… twitter.com/i/web/status/1…

    7:29

    У Марка Симанна есть отличная статья на эту тему, очень советую:
    blog.ploeh.dk/2020/03/02/imp… pic.twitter.com/pAj2w117dE

    7:29

    Мне в целом воинствующее разделение на ООП / ФП не нравится. Для меня срачи на тему парадигмы выглядят вот так 😅 pic.twitter.com/OXPoRmEByq

    7:31

    Но я немного отступил от темы. Можно ли писать нормальный ООП-код на фронте?

    Я недавно написал пост о том, как сов… twitter.com/i/web/status/1…

    7:33

    Внутри ссылаюсь на офигенную статью @hgraca
    herbertograca.com/2017/11/16/exp…
    там настолько круто всё разжёвано!

    Я перечи… twitter.com/i/web/status/1…

    7:33

    Для Реакта вон люди тоже придумали стартовые шаблоны:

    7:39

    Но опять же, тащить огромную инфраструктуру в небольшой проект я не стану — научен горьким опытом 🙂

    Сейчас я стар… twitter.com/i/web/status/1…

    7:39

    Обычно всё начинается с домена, внутри которого лежит пара функций да типы. Применяю S, O, I, а L и D на полшишечки… twitter.com/i/web/status/1…

    7:39
    Как и обещал, начнём с наброса 😃
    Что такое чистая архитектура, зачем нужна, плюсы, издержки.

    Если вы работали c y… twitter.com/i/web/status/1…

    Именно поэтому мы вчера столько времени уделяли проектированию:
    twitter.com/jsunderhood/st…

    Мы не хотим засорять код с… twitter.com/i/web/status/1…

    Как и обещал, начнём с наброса 😃
    Что такое чистая архитектура, зачем нужна, плюсы, издержки.

    Если вы работали c y… twitter.com/i/web/status/1…

    7:39

    (В Тяжеловато, например, я так и сделал: у меня есть пространство для манёвра с новыми инструментами, но самих инст… twitter.com/i/web/status/1…

    7:41

    Отследить, в какой момент пора наращивать инструментарий мне помогает ощущение «Чё-та сложна».

    Иду по индукции с… twitter.com/i/web/status/1…

    7:41

    Мне ещё иногда кажется, проблема и преимущество JS в том, что «нам не объяснили, как на нём писать правильно».

    По… twitter.com/i/web/status/1…

    7:41

    Так-с, ухожу работать!
    Потом продолжим 🙂

    7:47

    Продолжим 🙂
    Чем ООП полезен?

    Мне очень нравится, как ООП помогает делать мой код масштабируемым и тестируемым.

    9:37

    Под масштабирумеостью я понимаю возможность дописать, переписать, удалить какой-то модуль _без необходимости перепи… twitter.com/i/web/status/1…

    9:37

    Пример.

    Я как-то писал пост о DI:
    bespoyasov.ru/blog/di-ts-in-…

    В нём был логгер. Давайте рассмотрим, как он устроен.

    9:38

    В типах я описываю публичный интерфейс:
    github.com/bespoyasov/di-…

    Интерфейс — это контракт на поведение, он говорит,… twitter.com/i/web/status/1…

    9:38

    Реализация интерфейса описана классом:
    github.com/bespoyasov/di-…

    Реализация _инкапсулирует_ в себе детали, которые в… twitter.com/i/web/status/1…

    9:38

    Обратим внимание, что интерфейс называется более абстрактно, чем реализация.

    Нам важно сохранять инкапсуляцию и в… twitter.com/i/web/status/1…

    9:38

    Затем я в DI-контейнере указываю, какой именно класс реализует интерфейс `Logger`:
    github.com/bespoyasov/di-…

    Таким о… twitter.com/i/web/status/1…

    9:38

    В сущности, которой требуется логер, я указываю _интерфейс_ как зависимость:
    github.com/bespoyasov/di-…

    То есть мне з… twitter.com/i/web/status/1…

    9:38

    Это значит, что если я решу заменить консольный логер на какой-то другой, то единственное, что надо будет заменить:… twitter.com/i/web/status/1…

    9:44

    А чтобы протестировать модуль, который использует этот модуль как зависимость, мне надо замокать интерфейс Logger: pic.twitter.com/H0UU6LjkaZ

    9:44

    Этот мок я «подсуну» в регистрацию при тестировании: pic.twitter.com/wqw2Ee1Y6v

    9:44

    И ничего другого не поменялось!

    9:44

    Если мы ещё не будем забывать о LSP и OCP, то масштабировать будет ещё легче.

    9:46

    Теперь поговорим о том, чем ООП неудобен 🙂

    Расскажите о своём опыте тоже? пробовали ли? что не понравилось?

    9:48

    DI, за который я сейчас топлю, когда-то был для меня непреодолимым барьером 😃

    Я помню, пришёл в проект на первом А… twitter.com/i/web/status/1…

    9:53

    Поэтому для меня основное неудобство — это в первую очередь порог входа.

    Перед тем, как затащить какой-то доп. ин… twitter.com/i/web/status/1…

    9:53
    @jsunderhood Ну самый очевидный это многословность, интерфейсы, абстрактные классы, дочерние классы, дочерние дочер… twitter.com/i/web/status/1…

    Ещё, как правильно заметили в комментариях, иногда — избыточная многословность:
    twitter.com/zavodnoyapl/st…

    Я видел пр… twitter.com/i/web/status/1…

    @jsunderhood Ну самый очевидный это многословность, интерфейсы, абстрактные классы, дочерние классы, дочерние дочер… twitter.com/i/web/status/1…

    9:55

    Нужно постоянно лавировать между «кучей сущностей» и «дырявыми абстракциями» :–/

    У меня есть подозрение, что навы… twitter.com/i/web/status/1…

    9:56

    А проблема с насмотренностью в том, что не весь код, который мы видим каждый день — понятный.

    Мы начинаем думать,… twitter.com/i/web/status/1…

    9:58

    Я пока лишь могу порекомендовать читать книжки:
    bespoyasov.ru/tag/books/

    ...и пробовать руками.

    Ещё хочется пореко… twitter.com/i/web/status/1…

    10:02

    Дальше, не очень понятно, как это применять к нынешнему фронтенду — React, Vue, вот это всё.

    Есть шаблоны:
    -… twitter.com/i/web/status/1…

    10:07
    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    Это и правда требует больше времени и ресурсов.

    Но мы помним, что при проектировании мы уже взвешивали издержки и… twitter.com/i/web/status/1…

    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    10:07

    Сейчас уйду ещё поработать, а потом обсудим, почему строить грамотную архитектуру проще, но не обязательно с ООП.

    10:15

    ООП в своих принципах подразумевает деление сложного на части.

    Инкапсуляция, например — размещение данных и методо… twitter.com/i/web/status/1…

    12:30

    Полиморфизм тоже абстрагирует от деталей, позволяя использовать один механизм для работы с разными сущностями.… twitter.com/i/web/status/1…

    12:30

    В принципах SOLID также заложено разделение сложного на части, а ещё — барьеры на распространение изменений:
    ota-solid.vercel.app

    12:30

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

    OCP и LSP ограничивает изменения «коробо… twitter.com/i/web/status/1…

    12:30

    LSP и DIP обращают внимание на зависимости модулей и их направление.

    Всё это — какие-то части проектирования.

    У… twitter.com/i/web/status/1…

    12:30

    А теперь — о том, почему наследование как концепт должно умереть 😃

    12:38

    Наследование классов — это прямой путь к антипаттерну God-Object.

    Проблема наследования в том, что будущее нельзя… twitter.com/i/web/status/1…

    12:38

    Нам стоит, наоборот, собирать сложное из простого — использовать композицию.

    Давайте на примере воспользуемся насл… twitter.com/i/web/status/1…

    12:38

    Допустим, мы пишем приложение, в котором описываем живые организмы.

    Что нам нужно, чтобы описать человека, использ… twitter.com/i/web/status/1…

    12:46

    Что нам нужно, чтобы описать человека, используя композицию интерфейсов?

    Собрать те свойства и методы, которые на… twitter.com/i/web/status/1…

    12:46

    Ну окей, пока выглядит одинаково.

    ...До тех пор пока не приходит задача научить человека летать.

    Пусть в нашем… twitter.com/i/web/status/1…

    12:46

    Животные →
    Летающие животные?
    Летающие приматы?
    Суперчеловек?
    Человек.

    Нипанятна. Нам в какой-то момент придётся… twitter.com/i/web/status/1…

    12:46

    В композиции мы добавим дополнительные интерфейсы:

    Супергерой = <...Интерфейсы человека> + LaserShooter + Flyable.

    12:46

    Я, кстати, сейчас не говорю об абстрактных классах. Там несколько другое поведение, и используются они иначе. Сейча… twitter.com/i/web/status/1…

    12:46

    Как защититься от наследования? 😅

    12:48

    Кстати, а накидайте, пожалуйста, случаев, когда без наследования никак не обойтись?

    Я что-то пытался сейчас вспом… twitter.com/i/web/status/1…

    12:51
    @jsunderhood На ум приходит только когда надо переопределить метод в вендорах (понимаю надо форк или делать что то… twitter.com/i/web/status/1…

    Да, я совсем забыл, что мы живём в реальном мире 😃

    @jsunderhood На ум приходит только когда надо переопределить метод в вендорах (понимаю надо форк или делать что то… twitter.com/i/web/status/1…

    13:18
    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    В сегодняшнем треде об ООП:
    twitter.com/jsunderhood/st…

    ...мы уже немного затронули тестируемость :–)

    Завтра поговор… twitter.com/i/web/status/1…

    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    15:40

    Поговорим, как упростить тесты и найти на них время, обсудим причём тут TDD и парное программирование.

    А, да! И ещ… twitter.com/i/web/status/1…

    15:40
    @jsunderhood - Изменение поведения/композиции стороннего объекта.

    Первый пункт сегодня упоминали, второй — прям хорошо.

    (Не уверен, что актуально для фронта, но забывать об этом вс… twitter.com/i/web/status/1…

    @jsunderhood - Изменение поведения/композиции стороннего объекта.

    19:28

    # Среда 115 твитов

    По результатам вчерашнего голосования фронтенд и ООП скорее хорошие друзья, чем заклятые враги, но большинство пред… twitter.com/i/web/status/1…

    6:48

    А сегодня поговорим о том, как сделать код читаемым и тестируемым ^_^

    Расскажите о своих приёмах, как вы улучшаете… twitter.com/i/web/status/1…

    6:50

    Самое простое (и одновременно сложное 😃) — это нейминг.

    Хорошие и внятные имена для переменных и функций — это оч… twitter.com/i/web/status/1…

    6:51

    Хорошее имя для сущности: короткое, но полное и описательное.

    На Гитхабе есть классный чеклист по неймингу сущност… twitter.com/i/web/status/1…

    6:52

    Я люблю проверять имена всех экспортируемых сущностей на понятность со стороны пользователя.

    «Если я буду импорти… twitter.com/i/web/status/1…

    6:53

    Например, внутри модуля пользователя функция `create` выглядит органично, не дублирует контекст, короткая, описывае… twitter.com/i/web/status/1…

    6:53

    Но если функцию импортировать и начать использовать, то уже не так очевидно: pic.twitter.com/BR5u7SlaNB

    6:53

    А вот тут — наоборот: pic.twitter.com/RvAt00Fu1X

    6:53

    Годный шаблон для названий можно вот тут посмотреть:
    github.com/kettanaito/nam…

    6:53
    @jsunderhood А что на счет бэма? Еще актуально?

    Знаю проект, где всё ещё используется облегчённая версия БЭМ.

    Хотя в личных проектах я всё чаще CSS-модули исполь… twitter.com/i/web/status/1…

    @jsunderhood А что на счет бэма? Еще актуально?

    6:55

    Шаблон A/HC/LC:
    prefix? + action (A) + high context (HC) + low context? (LC)

    В идеале по названию переменной долж… twitter.com/i/web/status/1…

    6:56

    Для булевых значений можно использовать префиксы:
    should, is, has, will, did.

    Для функций — первым словом лучше п… twitter.com/i/web/status/1…

    6:56

    Иногда (редко) от шаблона можно отойти, если двусмысленность получается исключить:

    `let mounted = false` — тут сло… twitter.com/i/web/status/1…

    6:56
    @jsunderhood Расскажи, в чём там суть?
    Я для себя понял, что по части улучшения нейминга хорошо работает работает g… twitter.com/i/web/status/1…

    Если прям совсем коротко, то в коде должно быть ровно столько информации, сколько необходимо для правильного его по… twitter.com/i/web/status/1…

    @jsunderhood Расскажи, в чём там суть?
    Я для себя понял, что по части улучшения нейминга хорошо работает работает g… twitter.com/i/web/status/1…

    7:02

    Много о том, как делать так, чтобы было удобно читать:

    7:02
    @jsunderhood Расскажите что там с БЭМом, я его уже года 3 не видел нигде. Он умер? Если да, то почему?

    Живёт и здравствует! 😅

    Он чем-то на jQuery похож: мы сейчас им можем не пользоваться, но этот инструмент настолько… twitter.com/i/web/status/1…

    @jsunderhood Расскажите что там с БЭМом, я его уже года 3 не видел нигде. Он умер? Если да, то почему?

    7:05

    Мне кажется, если он и умрёт (что вряд ли), то только в настоящем™ сложном виде.

    Основная идея (об изоляции стилей… twitter.com/i/web/status/1…

    7:05
    Guys!! I just found out that /usr/ does NOT stand for "user", but is actually "universal system resources"! This ma… twitter.com/i/web/status/1…

    Моё любимое — не используйте аббревиатуры, пожалуйста 😃

    (А если используете, обязательно документируйте.)

    Guys!! I just found out that /usr/ does NOT stand for "user", but is actually "universal system resources"! This ma… twitter.com/i/web/status/1…

    7:11

    Всё настраиваемое лучше сразу выносить в конфиги. Пусть даже по началу это будет объект в том же файле.

    Это и чит… twitter.com/i/web/status/1…

    7:11

    Используйте паттерны проектирования.

    Есть замечательная подборка паттернов на том же Гитхабе, очень советую посмот… twitter.com/i/web/status/1…

    7:11

    Как правило, большую часть наших задач уже решили за нас до нас 😃

    Такие решения называются паттернами. Их польза н… twitter.com/i/web/status/1…

    7:11

    Паттерны удобно использовать в связке с SOLID. Некоторые из принципов прямо подразумевают какой-то из паттернов.

    М… twitter.com/i/web/status/1…

    7:11

    Чаще рефакторите код, но без фанатизма ¯\_(ツ)_/¯

    7:14

    Писать код и рефакторить — это как «писать» и «редактировать статью», сложно делать одновременно.

    Если кусок кода… twitter.com/i/web/status/1…

    7:14

    А ещё (самое сложное для меня) надо купировать перфекционизм 😅

    Отрефакторить до идеала сложно, а чаще всего не нуж… twitter.com/i/web/status/1…

    7:14

    Чтобы рефакторить безопасно, пишите тесты.

    Физерс в «Эффективной работе с легаси» писал о том, как можно рефактори… twitter.com/i/web/status/1…

    7:18

    Он предлагает искать швы — места, в которых можно относительно безопасно «распилить» комбайн на части.

    Покрыть швы… twitter.com/i/web/status/1…

    7:18

    Как найти хороший шов?

    Обычно шов — это место, где мы можем заменить одно поведение другим: месте соединения модул… twitter.com/i/web/status/1…

    7:18

    Представьте, где именно вы бы разделили систему на несколько частей (по смыслу, по поведению, по зависимостям) — там и будет шов.

    7:18

    В книжке много техник, как работать с кодом, когда вы уже определились со швом.

    Типа, как заменить зависимость:
    -… twitter.com/i/web/status/1…

    7:21

    Раз уж мы о книгах заговорили, то ещё «Чистый код» Мартина могу посоветовать:
    bespoyasov.ru/blog/clean-cod…

    Хотя и счита… twitter.com/i/web/status/1…

    7:22

    Ещё офигенная и практичная книга — “Debug it!” («Отдебажь это!», простите за кустарный перевод):… twitter.com/i/web/status/1…

    7:26

    Там даже содержание — это уже рецепт! 😃

    Глава 1 — Исследовать обстановку
    Глава 2 — Воспроизвести проблему
    3 — Опр… twitter.com/i/web/status/1…

    7:26

    Внутри каждой главы есть списки действий под ситуацию. Короче, рекомендую.

    7:27

    От читаемости к тестированию! 🦸
    Используйте TDD 🙂

    7:33

    TDD мне экономит кучу времени. К нему надо привыкнуть, потому что сперва приходится «вывернуть мозги», но он быстро окупается.

    7:33

    С ним:

    7:33

    Я недавно делал доклад о TDD на Frontend-crew:

    Там рассказыва… twitter.com/i/web/status/1…

    7:33

    Как упростить тесты при работе по TDD:

    7:33

    С TDD можно искать пахнущий код. Код пахнет, если:

    7:33

    Там же я рассказываю, как помочь увидеть пользу от TDD (и тестов вообще) руководству.

    Коротко: говорим только об… twitter.com/i/web/status/1…

    7:33

    Я ещё когда-то написал книжку с примером разработки крестиков-ноликов: bespoyasov.ru/ttt-tdd/

    Там показываю, как… twitter.com/i/web/status/1…

    7:34

    TDD можно использовать и при работе с React тоже.

    Недавно я проводил воркшоп об использовании TDD при разработке R… twitter.com/i/web/status/1…

    7:38

  • ...Функций бизнес-логики.
  • Функции, возвращающие случайные значения.
  • Простые компоненты.
  • Кастомные хуки, их… twitter.com/i/web/status/1…
  • 7:38

    Так-с, пора работать!
    Продолжим во время обеда 😃

    7:39
    @jsunderhood Основное правило для меня (для читаемости и понимаемости) — не заставлять мозг скакать вверх-вниз по у… twitter.com/i/web/status/1…

    Наглядный пример соблюдения SRP и места, где можно провести шов по зависимостям, если вдруг вы обнаружите у себя та… twitter.com/i/web/status/1…

    @jsunderhood Основное правило для меня (для читаемости и понимаемости) — не заставлять мозг скакать вверх-вниз по у… twitter.com/i/web/status/1…

    8:43

    Продолжим!

    Чем же так хорош TDD для тестируемости и читаемости?

    Он сразу поставит нас в ситуацию, когда сперва п… twitter.com/i/web/status/1…

    9:20

    Напомню стандартный цикл разработки по TDD. В нём 3 этапа:

    9:20

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

    Под этим я подраз… twitter.com/i/web/status/1…

    9:20

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

    9:20

    Когда мы проверяем, с какой причиной падает тест, он становится таким, которому можно доверять.

    (Если мы видим, чт… twitter.com/i/web/status/1…

    9:20

    Правильные тесты сразу же закрывают написанную функциональность.

    Рефакторить код становится безопасно: если мы чт… twitter.com/i/web/status/1…

    9:21

    А ещё TDD — это единственный способ безопасно (или даже вообще хоть как-то) отрефакторить легаси 😃

    9:21

    Кроме TDD тестируемость улучшит Dependency Injection.

    Вместо того, чтобы мокать всё подряд, можно использовать DI… twitter.com/i/web/status/1…

    9:25

    DI — это не обязательно контейнеры и всё такое страшное, можно использовать кустарный DI через объект с зависимостя… twitter.com/i/web/status/1…

    9:25
    @jsunderhood линтер. хук. пайплайн. .editorconfig

    Автоматизация рутинной работы — тоже полезная штука, особенно в том, что касается форматирования и выделения ошибок… twitter.com/i/web/status/1…

    @jsunderhood линтер. хук. пайплайн. .editorconfig

    9:29

    Сообщения о комитах — тоже часть кодовой базы.

    Мне на больших проектах нравится использовать conventional commits… twitter.com/i/web/status/1…

    9:29
    @jsunderhood Из простого — удаляю старый код и убираю дубликаты.

    Копипаста, кстати, не всегда однозначное зло:
    bespoyasov.ru/blog/copy-past…

    @jsunderhood Из простого — удаляю старый код и убираю дубликаты.

    9:33

    Дублирование кода _на ранних этапах_ может показать, как всё на самом деле работает, и какие паттерны мы ещё не уви… twitter.com/i/web/status/1…

    9:33

    Чтобы не потерять места с копипастой, помечаю их коммент-флагом `DUPLICATE`.

    После самого флага пишу, какую функци… twitter.com/i/web/status/1…

    9:33

    Оно немного противоречит DRY:
    ru.wikipedia.org/wiki/Don’t_repeat_yourself

    ...но экономит время в будущем.

    Проще вы… twitter.com/i/web/status/1…

    9:33
    @jsunderhood А можешь рассказать, как это должно работать? Я поняла концепт TDD, когда работаешь с нуля, а вот как… twitter.com/i/web/status/1…

    Да ^_^

    Если приходится писать тесты для махрового легаси, которое писали до вас, то советую посмотреть на книжку… twitter.com/i/web/status/1…

    @jsunderhood А можешь рассказать, как это должно работать? Я поняла концепт TDD, когда работаешь с нуля, а вот как… twitter.com/i/web/status/1…

    9:39

    Он предлагает искать швы — места, в которых можно относительно безопасно «распилить» комбайн на части.

    Покрыть швы… twitter.com/i/web/status/1…

    9:39

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

    Представьте, где именно вы… twitter.com/i/web/status/1…

    9:39

    В книжке много техник, как работать с кодом, когда вы уже определились со швом.

    Типа, как заменить зависимость:
    -… twitter.com/i/web/status/1…

    9:39
    @jsunderhood Dry вообще переоценён

    Как и со всеми инструментами, перед применением стоит сравнить выгоды и издержки в каждой конкретной ситуации ^_^

    @jsunderhood Dry вообще переоценён

    9:41

    Кстати, какие вы используете настройки для ESLint? 😃

    9:42

    Ещё, кстати, в TypeScript я стараюсь описывать тип-аргументы в дженериках не одной буквой, а нормальными названиями… twitter.com/i/web/status/1…

    9:46

    А вот старый код — действительно зло. Он отвлекает, а иногда и вводит в заблуждение.

    Если я подозреваю, что код м… twitter.com/i/web/status/1…

    9:51

    Тогда я смогу найти удалённое по истории и восстановить.

    Это потребует каких-то ресурсов, но зато код будет чище… twitter.com/i/web/status/1…

    9:51

    То же могу сказать и про закомментированный код. Он как бы удалён, но как бы нет.

    А когда и как его использовать… twitter.com/i/web/status/1…

    9:52
    Я люблю проверять имена всех экспортируемых сущностей на понятность со стороны пользователя.

    «Если я буду импорти… twitter.com/i/web/status/1…

    Часть треда снова ускакала не туда, простите :–/

    Я люблю проверять имена всех экспортируемых сущностей на понятность со стороны пользователя.

    «Если я буду импорти… twitter.com/i/web/status/1…

    9:59
    @jsunderhood Documentation first!
    Но если более приземленно, то я выработал привычку перед написанием класса, метод… twitter.com/i/web/status/1…

    Тоже описываю API до начала реализации.

    Помогает раньше найти ошибки на предыдущем этапе проектирования, если они… twitter.com/i/web/status/1…

    @jsunderhood Documentation first!
    Но если более приземленно, то я выработал привычку перед написанием класса, метод… twitter.com/i/web/status/1…

    10:29

    Дальше, чтобы код был понятнее, его должно быть как можно меньше 😃

    Всё, что можно может сделать браузер, лучше отд… twitter.com/i/web/status/1…

    10:52

    Нужно сериализовать форму?
    Используем FormData:
    developer.mozilla.org/en-US/docs/Web…

    Там есть конечно трудности со всякими кас… twitter.com/i/web/status/1…

    10:52

    Нужно сделать ленивую загрузку картинок?
    Испольуем `loading="lazy"`:
    developer.mozilla.org/en-US/docs/Web…

    Опять же, полифилим т… twitter.com/i/web/status/1…

    10:52

    Ну вы поняли 😃
    Кнопки — кнопками, короче.

    10:52

    Непонятное стороннее API лучше прятать за фасадом, чтобы намерение было выразительнее:
    github.com/kamranahmedse/…

    10:52

    Если язык позволяет, то для выбора из нескольких вариантов используйте pattern matching:

    10:52

    Снова перерыв на работу 🙂
    Вечером продолжим!

    10:55
    @jsunderhood А ещё есть proposal на pattern matching в js, надеюсь, когда-нибудь мы его увидим)
    github.com/tc39/proposal-…

    🔥

    @jsunderhood А ещё есть proposal на pattern matching в js, надеюсь, когда-нибудь мы его увидим)
    github.com/tc39/proposal-…

    13:01

    Продолжим!

    Ещё один приём, который улучшает читаемость — CQS, command-query separation.

    13:39

    Запрос — функция, которая возвращает результат и не имеет сайд-эффектов.

    Команда — функция, которая меняет состоя… twitter.com/i/web/status/1…

    13:39

    На чтение такого кода уходит меньше сил, потому что ожидания при чтении оправдываются, и мы можем строить прогнозы… twitter.com/i/web/status/1…

    13:39

    Ещё один приём рефакторинга, который улучшает читаемость — вынесение деталей в метод или функцию:
    -… twitter.com/i/web/status/1…

    13:42

    В этом случае мы как бы прячем детали за названием функции.

    Плюс в том, что нам не требуется больше прыгать по ра… twitter.com/i/web/status/1…

    13:43

    Ещё одна важная часть читаемого кода — это ошибки и стек-трейс.

    За сообщениями об ошибках тоже надо следить, пото… twitter.com/i/web/status/1…

    13:44

    Чем чище и понятнее ошибки, тем проще дебажить код ¯\_(ツ)_/¯

    13:44

    Кстати, вот мы говорили про вынесение кода в функцию или метод.

    Можно делать это не руками, а встроенными инструм… twitter.com/i/web/status/1…

    13:50

    Ну и конечно — документация!

    В ней нам стоит описывать не «как оно работает», а «почему оно работает именно так».… twitter.com/i/web/status/1…

    13:52

    А на вопрос «как оно работает», считаю, должны отвечать тесты 🙂

    13:52

    Давайте теперь поговорим о том, когда можно продать часть читаемости взамен на производительность 😃

    13:59

    У меня за всё время работы таких случаев не было вообще. Обычно мне хватает оптимизаций при сборке.

    Но вдруг и с J… twitter.com/i/web/status/1…

    14:00

    Случаи из не-JS мира тоже приветствуются! 😃

    14:01
    @jsunderhood Иногда встречаются ситуации, когда приходится делать не React-Way, например, чтоб всё не тормозило без… twitter.com/i/web/status/1…
    14:28
    Как и обещал, начнём с наброса 😃
    Что такое чистая архитектура, зачем нужна, плюсы, издержки.

    Если вы работали c y… twitter.com/i/web/status/1…

    Что происходило на неделе / Понедельник:

    Архитектура, проектирование, зачем это всё, как подружить DDD и чистую ар… twitter.com/i/web/status/1…

    Как и обещал, начнём с наброса 😃
    Что такое чистая архитектура, зачем нужна, плюсы, издержки.

    Если вы работали c y… twitter.com/i/web/status/1…

    14:58
    Да! ^_^

    Недавно меня уже спрашивали в Твитере, что-куда-и-как можно вынести.

    Я ответил на примере приложения с… twitter.com/i/web/status/1…

    Спроектировали магазин печенек по всем канонам ЧА и DDD:

    Да! ^_^

    Недавно меня уже спрашивали в Твитере, что-куда-и-как можно вынести.

    Я ответил на примере приложения с… twitter.com/i/web/status/1…

    14:58
    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    Обсудили практические аспекты проектирования:

    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    14:58
  • Писать код ещё рано. Проектиурем!
    twitter.com/jsunderhood/st…
  • Подвели итоги:

    14:58
    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    Вторник: ООП, надо ли его использовать во фронтенде, как это делать, как это делать проще.

    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    14:58
    Парадигма программирования, как и архитектура, — это инструмент для укрощения сложности. И, как с архитектурой, нам… twitter.com/i/web/status/1…

    Обсудили, почему проектировать удобнее в терминах ООП, но не обязательно в них:

    Парадигма программирования, как и архитектура, — это инструмент для укрощения сложности. И, как с архитектурой, нам… twitter.com/i/web/status/1…

    14:58
    Продолжим 🙂
    Чем ООП полезен?

    Мне очень нравится, как ООП помогает делать мой код масштабируемым и тестируемым.

    Чем ООП полезно:

    Продолжим 🙂
    Чем ООП полезен?

    Мне очень нравится, как ООП помогает делать мой код масштабируемым и тестируемым.

    14:58
    Теперь поговорим о том, чем ООП неудобен 🙂

    Расскажите о своём опыте тоже? пробовали ли? что не понравилось?

    Чем ООП неудобно:

    Теперь поговорим о том, чем ООП неудобен 🙂

    Расскажите о своём опыте тоже? пробовали ли? что не понравилось?

    14:58
    А теперь — о том, почему наследование как концепт должно умереть 😃

    Composition over inheritance:

    А теперь — о том, почему наследование как концепт должно умереть 😃

    14:58
    А сегодня поговорим о том, как сделать код читаемым и тестируемым ^_^

    Расскажите о своих приёмах, как вы улучшаете… twitter.com/i/web/status/1…

    Среда: как сделать код читаемым и тестируемым.

    А сегодня поговорим о том, как сделать код читаемым и тестируемым ^_^

    Расскажите о своих приёмах, как вы улучшаете… twitter.com/i/web/status/1…

    14:58
    Шаблон A/HC/LC:
    prefix? + action (A) + high context (HC) + low context? (LC)

    В идеале по названию переменной долж… twitter.com/i/web/status/1…

    Шаблон для нейминга сущностей:

    Шаблон A/HC/LC:
    prefix? + action (A) + high context (HC) + low context? (LC)

    В идеале по названию переменной долж… twitter.com/i/web/status/1…

    14:58
    Используйте паттерны проектирования.

    Есть замечательная подборка паттернов на том же Гитхабе, очень советую посмот… twitter.com/i/web/status/1…

    Паттерны проектирования:

    Используйте паттерны проектирования.

    Есть замечательная подборка паттернов на том же Гитхабе, очень советую посмот… twitter.com/i/web/status/1…

    14:58
    От читаемости к тестированию! 🦸
    Используйте TDD 🙂

    Как и зачем использовать TDD:

    От читаемости к тестированию! 🦸
    Используйте TDD 🙂

    14:58
    Продолжим!

    Ещё один приём, который улучшает читаемость — CQS, command-query separation.

    Приёмы и эвристики для улучшения читаемости:

    Продолжим!

    Ещё один приём, который улучшает читаемость — CQS, command-query separation.

    14:58
    Да ^_^

    Если приходится писать тесты для махрового легаси, которое писали до вас, то советую посмотреть на книжку… twitter.com/i/web/status/1…

    Что делать с махровым легаси:

    Да ^_^

    Если приходится писать тесты для махрового легаси, которое писали до вас, то советую посмотреть на книжку… twitter.com/i/web/status/1…

    14:58
    Копипаста, кстати, не всегда однозначное зло:
    bespoyasov.ru/blog/copy-past… twitter.com/myjsalterego/s…

    Копипаста — не всегда однозначное зло:

    Копипаста, кстати, не всегда однозначное зло:
    bespoyasov.ru/blog/copy-past… twitter.com/myjsalterego/s…

    14:58

    Подведём итоги за сегодня 🙂

    16:33

  • ...Грамотная архитектура улучшает тестируемость.
  • TDD также улучшает тестируемость и помогает разбивать легаси н… twitter.com/i/web/status/1…
  • 16:33

    Завтра поговорим о том, как расти в разработке. Обсудим, что лучше:

    16:36
    @jsunderhood Товарищ ошибается, и usr - это не аббревиатура :-) /usr означает "user", но со временем пользовательск… twitter.com/i/web/status/1…

    Я скорее тут хочу подсветить, сколько недопонимания это имя вызывает 🙂

    В ядре Линукса, думаю, хватает ограничений,… twitter.com/i/web/status/1…

    @jsunderhood Товарищ ошибается, и usr - это не аббревиатура :-) /usr означает "user", но со временем пользовательск… twitter.com/i/web/status/1…

    17:42

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

    Доброе утро четверга! ^_^

    Чем ближе конце недели, тем больше мы уходим от хард-скилов 😃

    Сегодня поговорим о том,… twitter.com/i/web/status/1…

    6:28

    На самом деле понятно, что пункты не взаимоисключающие, в жизни их можно сочетать 🙂

    Я попробовал всё, кроме, пожал… twitter.com/i/web/status/1…

    6:28

    За весь свой опыт я помню 3 случая, когда рост был взрывным — и все 3 случая были на работе под присмотром ментора 😃

    6:28

    Верстать я начал ещё в школе, но там у меня под рукой лишь были курсы Попова и много свободного времени 😃

    Показат… twitter.com/i/web/status/1…

    6:28

    Я нашёл эти курсы на Ютубе! 😱🙀🤠

    youtube.com/watch?v=jj2TXJ…

    6:28

    С программированием было прям совсем худо.

    Гугл не особо помогал, потому что я ещё не умел нормально гуглить вопр… twitter.com/i/web/status/1…

    6:28

    Первый значительный скачок произошёл году в 2010, на первом большом проекте. Писали на пару с чуваком из, кажется,… twitter.com/i/web/status/1…

    6:28

    Я тогда узнал про Ноду, прокачался во взаимодействии между сервером и браузером, анимации поднатаскал, даже какое-т… twitter.com/i/web/status/1…

    6:28

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

    Забавно, что всё это… twitter.com/i/web/status/1…

    6:28

    Второй скачок был в команде, где я написал CRM
    bespoyasov.ru/projects/reque…

    Там познакомился с Реактом, написал первый… twitter.com/i/web/status/1…

    6:28

    Там и поуправлять другими разработчиками получилось немного, и блог переосмыслить (хотя и к тому времени пока что н… twitter.com/i/web/status/1…

    6:28

    Третий скачок был в D2. Тут техдир открыл мне дорогу в «настоящее программирование™» 😅

    Я пописал на шарпе и .net,… twitter.com/i/web/status/1…

    6:28

    Ну и сейчас я вот занимаюсь R&D проектами всякого около-ML толка. Учусь реализовывать алгоритмы, которые нахожу в р… twitter.com/i/web/status/1…

    6:28

    Надо было, чтобы кто-то разжевал что с чем складывать, чтобы оно работало.

    К некоторым книгам я возвращаюсь время… twitter.com/i/web/status/1…

    6:28

    Университет, пожалуй, был самым малополезным из всех перечисленных пунктов.

    Ну то есть, там были попытки привить… twitter.com/i/web/status/1…

    6:30

    Хотя не, помню!

    Сети с администрированием полезными оказались и плюсы немножко.

    Мне, правда, было больше по кайф… twitter.com/i/web/status/1…

    6:30

    И вот сейчас смотря на это всё я думаю, что «ментор на работе» — это прям самое эффективное сочетание для роста 😃

    А что думаете вы?

    6:30
    Доброе утро четверга! ^_^

    Чем ближе конце недели, тем больше мы уходим от хард-скилов 😃

    Сегодня поговорим о том,… twitter.com/i/web/status/1…

    Четверг: как расти разработчикам, как расти эффективнее.

    Доброе утро четверга! ^_^

    Чем ближе конце недели, тем больше мы уходим от хард-скилов 😃

    Сегодня поговорим о том,… twitter.com/i/web/status/1…

    6:31

    Сейчас я доберусь до завтрака и поговорим о плюсах и минусах каждого из пунктов 🙂

    6:33
    @jsunderhood Да. Но это очень редко происходит. Тут надо чтобы звёзды совпали: попался хороший ментор, пока ты джун.

    По моему опыту хороший ментор мне нужен не только, когда я был джуном.

    Проблема в том, что чем выше я уже вырос, т… twitter.com/i/web/status/1…

    @jsunderhood Да. Но это очень редко происходит. Тут надо чтобы звёзды совпали: попался хороший ментор, пока ты джун.

    7:18

    Мне ещё очень нравится вот эта заметка о росте, не могу не поделиться:

    github.com/bobuk/addmeto.…

    7:38

    Мне сейчас повезло: я попал в команду, откуда можно опыт тоннами выкачивать — чем и занимаюсь 😃

    7:40

    Давайте начнём с университета ¯\_(ツ)_/¯

    Я понимаю, что не мне с моим дипломом Уфимского технического говорить об у… twitter.com/i/web/status/1…

    7:47

    Из плюсов я сейчас вижу, пожалуй, нетворкинг. Это именно то, чем я не занимался в университете 😅

    Университет — это… twitter.com/i/web/status/1…

    7:47

    Ещё один плюс — могут научить действительно полезным вещам, если попасть в правильный ВУЗ и на правильную специальн… twitter.com/i/web/status/1…

    7:47

    Ещё плюс: отсрочка и военная кафедра ¯\_(ツ)_/¯

    Я при поступлении уже работал, знал, где хочу развиваться и куда р… twitter.com/i/web/status/1…

    7:47

    Из минусов — образовательные программы по большей части не успевают за рынком.

    У нас в программе нейронные сети сч… twitter.com/i/web/status/1…

    7:52

    Офлайн-лекции.

    Мне нравилось ходить только на лекции по матану — преподаватель делал из лекции шоу.

    Он всегда чи… twitter.com/i/web/status/1…

    7:52

    Одна единственная специальность.

    В 17 лет мне надо выбрать то, чем я буду заниматься ближайшие 5 лет, а то и всю ж… twitter.com/i/web/status/1…

    7:52

    Преподаватели, которым не хочется учить / хочется утвердиться.

    Таких я не помню, чтобы встречал, но слышал рассказ… twitter.com/i/web/status/1…

    7:55

    В общем, всё сильно зависит от ВУЗа, но я больше склоняюсь ко мнению, что мне он оказался почти бесполезен.

    Исключ… twitter.com/i/web/status/1…

    7:58

    Курсы! 😃
    Я проходил какие-то курсы на Udemy и где-то ещё.

    Тут могу сказать, что любые новые знания с курсов надо… twitter.com/i/web/status/1…

    8:05

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

    Потому что учиться надо на ошибках,… twitter.com/i/web/status/1…

    8:05

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

    8:05

    +: курсов огромное количество.
    –: а чёрт поймёт, какого они качества 😃

    +: можно (хоть и трудно) найти качественную… twitter.com/i/web/status/1…

    8:05

    Идём к самому интересному 😃

    Давайте следующим пунктом выберем боевую разработку.

    8:10

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

    Да, даже если это была га… twitter.com/i/web/status/1…

    8:11

    Новичкам в боевой разработке трудно определить, они в хорошую компанию вот попали или нет? То, как устроены процесс… twitter.com/i/web/status/1…

    8:11

    Другой плюс боевой разработки: нет романтического флёра IT, который иногда продают курсы. Просто ещё одно ремесло.… twitter.com/i/web/status/1…

    8:17

    Минус — это может отпугнуть, если попасть не туда 😞

    8:17
    @jsunderhood Если бы в вузе можно было бы купить изучение одного предмета как курс, было бы топ

    Да! Я бы «сети» как раз и купил 😅

    @jsunderhood Если бы в вузе можно было бы купить изучение одного предмета как курс, было бы топ

    8:23

    Ещё один плюс боевой разработки: она помогает бороться с перфекционизмом.

    Он мне постоянно мешает, особенно в пет-… twitter.com/i/web/status/1…

    8:25

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

    8:25

    Что в боевой разработке было для меня сложным: бывали моменты, когда я занимался одним и тем же, не развиваясь вооб… twitter.com/i/web/status/1…

    8:49

    Особенно отчётливо это было на фрилансе и на галере 😃

    Нужно было много работать, чтобы были деньги, но делать прих… twitter.com/i/web/status/1…

    8:49

    Зато я научился многое автоматизировать.
    Придумал себе, кхм, «веб-компоненты» 😅
    bespoyasov.ru/blog/templates/

    8:49

    Это были такие папки с «компонентами». Каждый компонент состоял из HTML-шаблона, каких-то скелетных стилей и скрипт… twitter.com/i/web/status/1…

    8:49

    Я их подключал, конечно, не одним импортом, а тремя (разметка, стили и скрипты), но работали они независимо друг от друга и от контекста 😃

    8:49

    Там же пришлось научиться и «прогрессивному джипегу» в вёрстке:
    bespoyasov.ru/blog/time/

    Типа страница готова в люб… twitter.com/i/web/status/1…

    8:49

    А вот work-life баланс найти на фрилансе трудно. Для этого, кажется, нужна культура и команда.

    8:49

    Чуть позже поговорим о менторстве 🙂

    8:50
    @jsunderhood Идеально иметь такое комбо:

    боевая разработка + ментор в том же контексте (старший коллега, которому… twitter.com/i/web/status/1…

    Да, если ментор где-то «на стороне», много контекста задачи может потеряться при коммуникации.

    Окружение и команда… twitter.com/i/web/status/1…

    @jsunderhood Идеально иметь такое комбо:

    боевая разработка + ментор в том же контексте (старший коллега, которому… twitter.com/i/web/status/1…

    10:23
    @jsunderhood Можно прийти к состоянию, когда работа превращается в профессиональный спорт. А это ещё хуже.

    Но само… twitter.com/i/web/status/1…

    ❗️

    @jsunderhood Можно прийти к состоянию, когда работа превращается в профессиональный спорт. А это ещё хуже.

    Но само… twitter.com/i/web/status/1…

    10:31

    Продолжим!

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

    10:44

    Ментор, как мне кажется, — это не учитель.

    Возможно, у меня искажение, но при слове «учитель» я сразу представляю… twitter.com/i/web/status/1…

    10:44

    Для меня ментор — это как кто-то кто переехал в другую страну до меня, насобирал шишек и теперь может предупредить… twitter.com/i/web/status/1…

    10:44

    Причём, _хорошие_ менторы в состоянии определить, о каких ошибках они могут предупредить меня заранее, а какие — мн… twitter.com/i/web/status/1…

    10:44

    Объясню: очень сложно передать какой-то опыт словами.

    Слова — это код, модель. (Карта, если хотите.) Они не могут… twitter.com/i/web/status/1…

    10:44

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

    10:44

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

    Мидлы и сеньоры могут сталкиваться… twitter.com/i/web/status/1…

    10:44

    Такие задачи ставят в ступор и могут привести к параличу анализа, когда принять решение вообще не получается:
    ru.wikipedia.org/wiki/Аналитиче…

    10:45

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

    Прекрасно — если они уже… twitter.com/i/web/status/1…

    10:45

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

    10:45

    Особенно это полезно, когда мы подходим к более философским задачам:

    10:50

  • ...Как управлять по-настоящему большими кодовыми базами?
  • Как управлять людьми, как делить нагрузку, на что обра… twitter.com/i/web/status/1…
  • 10:50

    Мне кажется, на более поздних этапах менторы уже скорее идейные вдохновители что ли. Сложно сформулировать 🤔

    Они… twitter.com/i/web/status/1…

    10:50

    Для джунов, как по мне, ментор — это вообще обязательно.

    Я вот жалею, что у меня было мало возможностей учиться на… twitter.com/i/web/status/1…

    10:53

    Кстати! Как вы считаете, какими навыками должен обладать хороший ментор?

    Понятно, что уметь разжёвывать сложное пр… twitter.com/i/web/status/1…

    10:53

    Можем подвести предварительный итог ^_^

    Нужны:

    12:32

    Скоро закончу с задачами на работе и вернусь, чтобы обсудить опен-сорс 😃

    12:33

    Ну теперь давайте поговорим и об опен-сорсе!

    У меня опыта в трушном™ опен-сорсе нет. Весь мой Гитхаб — это пара не… twitter.com/i/web/status/1…

    14:43

    И я, если честно, не очень понимаю, как эффективно расти через опен-сорс, особенно если я новичок.

    Я когда был джу… twitter.com/i/web/status/1…

    14:43

    Просить объяснить я не могу, потому что просто так буду отнимать у людей время — они же занимаются опен-сорсом в св… twitter.com/i/web/status/1…

    14:43

    Просто присылать пул-реквесты — тоже нутакое.

    Мейнтейнерам придётся не только отвлечься, но ещё и накатать какой-… twitter.com/i/web/status/1…

    14:43

    Остаётся — делать какие-то библиотечки и пакетики, которые будут кому-то полезны.

    Первым у меня был `groontograf`… twitter.com/i/web/status/1…

    14:43

    Было ещё приложеньице для конвертации дат в таймштампы и обратно. Кому-то вроде даже было полезно.

    Но опять-таки,… twitter.com/i/web/status/1…

    14:43

    Из каких-то более полезных вещей:

    Букмарк, скриптик для навигации по странице

    Прокрутчи… twitter.com/i/web/status/1…

    14:43

    Собственно вопрос: в чём секрет роста через опен-сорс?

    Как это делать?
    Как это делать этично, чтобы никому не дос… twitter.com/i/web/status/1…

    14:43
    Давайте начнём с университета ¯\_(ツ)_/¯

    Я понимаю, что не мне с моим дипломом Уфимского технического говорить об у… twitter.com/i/web/status/1…

    Плюсы и минусы университета:

    Давайте начнём с университета ¯\_(ツ)_/¯

    Я понимаю, что не мне с моим дипломом Уфимского технического говорить об у… twitter.com/i/web/status/1…

    15:25
    Курсы! 😃
    Я проходил какие-то курсы на Udemy и где-то ещё.

    Тут могу сказать, что любые новые знания с курсов надо… twitter.com/i/web/status/1…

    О курсах программирования:

    Курсы! 😃
    Я проходил какие-то курсы на Udemy и где-то ещё.

    Тут могу сказать, что любые новые знания с курсов надо… twitter.com/i/web/status/1…

    15:25
    Идём к самому интересному 😃

    Давайте следующим пунктом выберем боевую разработку.

    Боевая разработка — помогает расти:

    Идём к самому интересному 😃

    Давайте следующим пунктом выберем боевую разработку.

    15:25
    Продолжим!

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

    Зачем нужны менторы и не только джунам:

    Продолжим!

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

    15:25
    Ну теперь давайте поговорим и об опен-сорсе!

    У меня опыта в трушном™ опен-сорсе нет. Весь мой Гитхаб — это пара не… twitter.com/i/web/status/1…

    Как расти через опен-сорс?

    Ну теперь давайте поговорим и об опен-сорсе!

    У меня опыта в трушном™ опен-сорсе нет. Весь мой Гитхаб — это пара не… twitter.com/i/web/status/1…

    15:25
    @jsunderhood Как вариант, пробовать как-то контрибьютить тут cultofmartians.com
    16:58

    Завтра утром подведём итоги сегодняшнего опроса из начала треда и начнём говорить о технических блогах ^_^

    17:09

    Это первый тред, который не сломался за день ни в одном месте 😅

    17:10

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

    Итак, самое большое влияние оказала боевая разработка. Ментор на втором месте, университет и курсы — на третьем. pic.twitter.com/A86m0Oji9b

    6:31

    Давайте под конец рабочей недели поговорим о ведении технического (и не только) блога!

    6:39

    Расскажите, ведёте ли вы свой блог?
    как начинали?
    что подтолкнуло?
    что для вас самое сложное?
    какие плюшки вы от блога получаете?

    6:39

    Я пока начну и расскажу о своём блоге:
    bespoyasov.ru/blog/

    Начал я его вести примерно тогда же, когда начал ра… twitter.com/i/web/status/1…

    6:42

  • Блог помогает бороться с внутренним самозванцем.
  • 7:09

    Бывает, правда, кажется, будто писать не о чем.
    «Все обо всём уже давно написали, и смысла повторяться нет.»

    Пиши… twitter.com/i/web/status/1…

    7:09

  • ...Ссылайтесь на других, чтобы читатели поняли тему ещё лучше.
  • 7:09

  • Использовать блог, как записную книжку.
  • 7:09

    ...Если нет, то это повод перечитать книгу и дополнить конспект.

    Потом я подумал, чего б не делать конспекты хорош… twitter.com/i/web/status/1…

    7:09

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

    Например, вот пост-снип… twitter.com/i/web/status/1…

    7:09

  • Стандартный ответ на вопрос.
  • 7:09

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

    О шаблонах и инсайдах я пот… twitter.com/i/web/status/1…

    7:09

    Позже я стал отвечать на вопросы людей из почты и сотрудников. Когда я заметил, что они тоже повторяются, начал пос… twitter.com/i/web/status/1…

    7:09

    Из таких стандартных ответов могу вот привести:

  • Это работает почти как Гитхаб!
  • 7:16

  • Это хороший тренажёр для формулировки мыслей.
  • 7:16

    Это, правда, почти не повлияло на мою устную речь. Этот навык надо, видимо, отдельно развивать 😅

    7:16

  • Поле для дискуссий.
  • 7:18
    @jsunderhood ЖЖ -> Wordpress.com -> Standalone WP -> ЭГЕЯ -> 11ty.

    Самое сложное: вести и не забывать.… twitter.com/i/web/status/1…

    Офферы — жизненно!

    У меня тоже большая часть офферов из блога:
    twitter.com/jsunderhood/st…

    @jsunderhood ЖЖ -> Wordpress.com -> Standalone WP -> ЭГЕЯ -> 11ty.

    Самое сложное: вести и не забывать.… twitter.com/i/web/status/1…

    7:19
    @jsunderhood Я такой: о. Вот это надо написать. Открываю ношн, сажусь писать, отвлекаюсь, возвращаюсь, читаю, нудят… twitter.com/i/web/status/1…

    О том, как не отвлекаться, сегодня тогда тоже поговорим :–)

    @jsunderhood Я такой: о. Вот это надо написать. Открываю ношн, сажусь писать, отвлекаюсь, возвращаюсь, читаю, нудят… twitter.com/i/web/status/1…

    7:20

    А сейчас поговорим о том, как вытащить из себя статью.

    7:23

    Итак, у меня есть идея для статьи. Я сажусь её писать, и...

    То чаю захотелось, то в Твитере что-то интересное пишу… twitter.com/i/web/status/1…

    7:36

    Есть три принципа, которыми я пользуюсь, чтобы избегать ступора, прокрастинации и разочарования:

    7:36

    Я замечал за собой, что прокрастинирую я те задачи, которые кажутся большими, объёмными и _непонятными_.

    Новый пос… twitter.com/i/web/status/1…

    7:36

    Все эти вопросы так или иначе возникают при написании статьи.

    Просто мы можем не отдавать себе отчёт, что они ест… twitter.com/i/web/status/1…

    7:36

    Первый принцип «Есть слона по частям» старается разбить большую непонятную задачу на маленькие куски.

    Такие малень… twitter.com/i/web/status/1…

    7:36

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

    Я не пишу сразу огромную портянку на 40 тысяч с… twitter.com/i/web/status/1…

    7:36

    Причём

    7:36
    @jsunderhood давно хочу писать тех блог, но торможу, кажется, ну что нового я могу еще сказать? хотела писать про с… twitter.com/i/web/status/1…

    Муки при обучении — вообще топ-тема, и вот почему:

    1. Учителя прокляты знаниями
      ru.wikipedia.org/wiki/Проклятие…

    Они иногд… twitter.com/i/web/status/1…

    @jsunderhood давно хочу писать тех блог, но торможу, кажется, ну что нового я могу еще сказать? хотела писать про с… twitter.com/i/web/status/1…

    7:41

    Статьи из разряда, «мы столкнулись с такими проблемами» помогают открыть глаза на эти вещи.

    7:41

    Оказалось — это один из самых читаемых постов вообще.

    1. Отразить процесс обучения, чтобы отрефлексировать его.

    П… twitter.com/i/web/status/1…

    7:41
    @jsunderhood Ну, получается, хорошее время для анонса — я завел блог. Пишу про фронтенды, JS и архитектуру.… twitter.com/i/web/status/1…

    ^_^

    @jsunderhood Ну, получается, хорошее время для анонса — я завел блог. Пишу про фронтенды, JS и архитектуру.… twitter.com/i/web/status/1…

    7:42
    А сейчас поговорим о том, как вытащить из себя статью.

    Разворачиваю тему в основном треде 🧵

    А сейчас поговорим о том, как вытащить из себя статью.

    7:43

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

    7:47

    И тут наступает проблема «белого листа» — С Ч Е Г О Н А Ч А Т Ь ? 😃

    Используйте второй принцип: «ну блин коро… twitter.com/i/web/status/1…

    7:47

    Пишите просто сплошняком, без абзацев, без разбиения на предложения. Строчите из буквомёта, пока идёт.

    Не беспокой… twitter.com/i/web/status/1…

    7:47

    Старайтесь разделять сессии написания и редактирования.

    Это разные задачи, их решать надо тоже по-разному. При ре… twitter.com/i/web/status/1…

    7:47

    Всё это встаёт в прямое противоречие с «написанием».

    Можно сравнить написание с брейм-штормом, а редактирование — с анализом результатов.

    7:47

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

    Как так? Неужел… twitter.com/i/web/status/1…

    7:53

    Важно: во время перерыва я не смотрю на то, что написал. Вообще.

    Если я отдыхаю от текста, то не вспоминаю о нём д… twitter.com/i/web/status/1…

    7:53

    В следующий раз, когда я сяду за текст, я буду отдохнувшим от него (что позволит найти ошибки и нелогичное повество… twitter.com/i/web/status/1…

    7:53

    Забавно, но именно во время мытья посуды или прогулки я придумываю хорошие доводы и сравнения для своих статей ¯\_(ツ)_/¯

    7:53

    Хорошо, вот за несколько подходов мы наполнили структуру из заголовков каким-то текстом.

    Там нет абзацев, иногда н… twitter.com/i/web/status/1…

    7:56

    Я обычно сперва проверяю логику повествования:

    7:56

    На этом этапе можно переделывать структуру всего текста, как захочется, потому что сил потрачено ещё не очень много… twitter.com/i/web/status/1…

    7:56

    Когда с логикой всё хорошо, можно углубляться в сам текст:

    7:58

    После того, как текст становится монолитом, где ни убрать, ни добавить, можно приступать к пунктуации, орфографии и грамматике.

    7:58
    @kumma_kirill @jsunderhood Я вот мигрировал с Медиума на свой сайт ☺️

    Поддерживаю собственные сайты!
    (Об этом тоже будет тред 😃)

    @kumma_kirill @jsunderhood Я вот мигрировал с Медиума на свой сайт ☺️

    7:58

    Если есть роскошь дать кому-то почитать — обязательно дайте.

    Чей-то информационный пузырь, который отличается от… twitter.com/i/web/status/1…

    8:00

    Днём поговорим о том, что выбрать:

    8:01
    @jsunderhood 1. Личный бренд.
    9:29

    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    9:31

    Я топлю и всегда топил за селф-хост.

    У платформ я вижу только одно преимущество — можно сразу писать на какую-то а… twitter.com/i/web/status/1…

    9:44

  • Контент — не мой;
  • Площадка может на мне наживаться и вообще вести себя по-скотски (привет, Медиум!);
  • Если пло… twitter.com/i/web/status/1…
  • 9:44

    Я писал немного на newline и сейчас пробую dev.to в рамках эксперимента, чтобы выйти на зарубежную… twitter.com/i/web/status/1…

    9:44

    В селф-хосте мне нравится, что контент всегда остаётся у меня и в одном месте.

    Я могу переехать со своими заметкам… twitter.com/i/web/status/1…

    9:44

    — Но для селф-хоста нужен дизайн!

    Не-а 😃
    Можно наверстать сайт на чистом HTML без стилей. Если есть, что написать… twitter.com/i/web/status/1…

    9:44

    — Но для селф-хоста нужен домен и хостинг, и TLS, и деньги!

    Да, но не очень много:

    9:44

    — Но селф-хост надо промоутить!

    Сарафанное радио работает не хуже, чем блого-платформы.

    (Говорю по опыту:

    9:48

    Кстати, насчёт сарафанного радио.

    У Веб-стандартов недавно появился список с инди-блогами о фронтенде ;–)

    9:50

    — Но что, если я не буду писать?

    Всегда можно сделать архив с заметками и опубликовать их в тех же gist на Гитхабе… twitter.com/i/web/status/1…

    9:51

    — Но я не хочу кодить, я хочу просто писать!

    Если не хочется _много_ кодить, то можно посмотреть на генераторы тип… twitter.com/i/web/status/1…

    9:53

    Окей, а что с языком? 😃
    На каком языке писать: русском или английском.

    Мне гораздо проще писать на русском и потом… twitter.com/i/web/status/1…

    10:01

    Контрпродуктивно, потому что хороший пост с английского и так переведут на русский, а я делаю двойную работу 😃

    Ну,… twitter.com/i/web/status/1…

    10:01

    Англоязычная аудитория по умолчанию шире. Охват будет больше, фидбека будет тоже больше.

    Если вы заводите трактор,… twitter.com/i/web/status/1…

    10:01
    @jsunderhood dskr.dev
    RSS пока не написал, статьи писать лениво да и выходит кажется не очень(

    Дизайн-имитация редактора кода — огонь! 🔥

    @jsunderhood dskr.dev
    RSS пока не написал, статьи писать лениво да и выходит кажется не очень(

    10:07

    Чтобы писать на английском, я использую:

    10:08

    Если вы пишете на платформу, где используется Markdown, то вот читщит по нему:

    (У карти… twitter.com/i/web/status/1…

    10:12

    В общем, не повторяйте моих ошибок, пишите сразу на английском 😃

    10:13

    Отправляюсь работать.

    После поговорим об RSS (надо / не надо) и как вставлять примеры кода (нужна ли подсветка, с… twitter.com/i/web/status/1…

    10:14
    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    Развернул тему в основном треде 🧶

    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    11:58

    Продолжим!

    RSS — надо или нет. До сих пор считаю, что ничего лучше для подписки на блог не придумали 😃

    А когда п… twitter.com/i/web/status/1…

    12:30

    Не у всех платформ RSS есть, и в селф-хосте добавить его тоже бывает сложно.

    Мне вот пришлось писать собственный с… twitter.com/i/web/status/1…

    12:30

    Но RSS для меня — единственное место, где блоги читать _удобно_.

    Почта — для работы, я сейчас наоборот чищу почту… twitter.com/i/web/status/1…

    12:30

    Поэтому для меня ответ однозначный — да, RSS нужен.

    *Старческое кряхтение.*

    12:30

    А теперь о примерах кода 😃

    Вот мы пишем статью о какой-то технологии или случае из разработки. Там будет код.

    Как его правильно оформить?

    12:49

    Нам же одновременно надо решить почти противоречащие задачи:

    12:49

  • Код должен быть не слишком сложен и специфичен, чтобы пример был проще для понимания.
  • Но код должен быть достат… twitter.com/i/web/status/1…
  • 12:49

    Начнём с простого.
    — Добавлять ли простые и маленькие примеры?

    Да, лучше добавить. Это как в кино, лучше показат… twitter.com/i/web/status/1…

    12:49

    — Писать объяснения до примера, после или внутри?

    Расположение не имеет значения, но последовательность — имеет. Л… twitter.com/i/web/status/1…

    12:49

    Хорошо, потому что объяснение находится прямо в том месте, которое объясняет.

    Лучше написать комментарий перед стр… twitter.com/i/web/status/1…

    12:49

    Мне ещё кажется, это более привычно для читателей, потому что они сами видят комментарии именно в таком виде на работе.

    12:49

    — Как выбрать, какой код добавлять в статью?

    Я стараюсь добавлять код, который относится _непосредственно_ к теме… twitter.com/i/web/status/1…

    12:49

    — Что делать с примерами, которые не делятся?

    В первую очередь подумать, можно ли это отрефакторить.

    Затем подум… twitter.com/i/web/status/1…

    12:49

    Теперь самое сложное:

    — Как выбрать, какой именно код и сколько код приводить в примерах?

    Откусывайте от кода мал… twitter.com/i/web/status/1…

    13:49

    Если пример кода содержит две идеи, его лучше распилить. Если в примере есть детали не по теме, из лучше убрать.

    О… twitter.com/i/web/status/1…

    13:49

    Акцентируйте внимание на развитии примера сквозь статью.

    Давайте на примере моего поста о DI:

    13:49

    Показываем предпосылку к идее на простом примере кода:

    (Зависимости — это как аргументы.) pic.twitter.com/HVnUYm0Gpq

    13:49

    Обращаем внимание на детали, которые помогут вникнуть в идею позже:

    (Кроме аргументов мы используем глобальный объ… twitter.com/i/web/status/1…

    13:49

    Приводим читателей за руку в собственно идею:

    (Такие зависимости тоже можно передавать явно.

    Обратите внимание,… twitter.com/i/web/status/1…

    13:49

    Этот же кусок кода мы дальше используем, как опорную точку для развития идеи:

    (Важно описать поведение, не важно,… twitter.com/i/web/status/1…

    13:49

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

    Знакомый код даёт ощущение… twitter.com/i/web/status/1…

    13:52
    Давайте под конец рабочей недели поговорим о ведении технического (и не только) блога!

    Пятница; говорим о технических блогах, зачем вести, как, что это даёт:

    Давайте под конец рабочей недели поговорим о ведении технического (и не только) блога!

    14:03
    Я пока начну и расскажу о своём блоге:
    bespoyasov.ru/blog/

    Начал я его вести примерно тогда же, когда начал ра… twitter.com/i/web/status/1…

    6 причин, для чего вести:

    Я пока начну и расскажу о своём блоге:
    bespoyasov.ru/blog/

    Начал я его вести примерно тогда же, когда начал ра… twitter.com/i/web/status/1…

    14:03
    А сейчас поговорим о том, как вытащить из себя статью.

    Как помочь себе начать писать и довести статью до конца:

    А сейчас поговорим о том, как вытащить из себя статью.

    14:03
    И тут наступает проблема «белого листа» — С Ч Е Г О Н А Ч А Т Ь ? 😃

    Используйте второй принцип: «ну блин коро… twitter.com/i/web/status/1…

    Проблема белого листа
    :

    И тут наступает проблема «белого листа» — С Ч Е Г О Н А Ч А Т Ь ? 😃

    Используйте второй принцип: «ну блин коро… twitter.com/i/web/status/1…

    14:03
    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    Self-hosted блог или блого-платформа:

    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    14:03
    Окей, а что с языком? 😃
    На каком языке писать: русском или английском.

    Мне гораздо проще писать на русском и потом… twitter.com/i/web/status/1…

    Какой выбрать язык:

    Окей, а что с языком? 😃
    На каком языке писать: русском или английском.

    Мне гораздо проще писать на русском и потом… twitter.com/i/web/status/1…

    14:03
    А теперь о примерах кода 😃

    Вот мы пишем статью о какой-то технологии или случае из разработки. Там будет код.

    Как его правильно оформить?

    Как добавлять примеры кода:

    А теперь о примерах кода 😃

    Вот мы пишем статью о какой-то технологии или случае из разработки. Там будет код.

    Как его правильно оформить?

    14:03
    @jsunderhood 1. Веду defront.ru

    Блог — может стать основной работой! 🔥
    Кстати, спасибо на defront — огнище огненное ^_^

    @jsunderhood 1. Веду defront.ru

    16:37
    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    Подъехали результаты опроса: большая часть тоже топит на селф-хост! pic.twitter.com/wZV07YR4qH

    Продолжим 🙂
    Давайте ещё один опрос!

    Self-hosted блог или чья-то платформа?

    16:39

    Ну и предлагаю сегодня закончить пораньше — пятница всё-таки 😃

    16:46
    @jsunderhood Написать хорошую нехеловордную статью - это нифиговая работа.
    А статью про хеловорды и так напишут люб… twitter.com/i/web/status/1…

    Хорошая статья не обязана быть большой.

    Можно писать небольшие заметки о деталях разработки, о которых не все зна… twitter.com/i/web/status/1…

    @jsunderhood Написать хорошую нехеловордную статью - это нифиговая работа.
    А статью про хеловорды и так напишут люб… twitter.com/i/web/status/1…

    17:02

    Ещё мне не нравится идея равнять возможности всех людей под какой-то «стандарт».

    Можно писать хорошие статьи раз в… twitter.com/i/web/status/1…

    17:04

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

    17:05
    @jsunderhood Давно хотел, недавно собрался и запилил на Gatsby + vercel: blog.beraliv.dev

    Пишу про TypeScri… twitter.com/i/web/status/1…

    Шрифт кайфовый!
    За TypeScript — жирнейший плюс ^_^

    @jsunderhood Давно хотел, недавно собрался и запилил на Gatsby + vercel: blog.beraliv.dev

    Пишу про TypeScri… twitter.com/i/web/status/1…

    20:28

    # Суббота 46 твитов

    @jsunderhood Сейчас работаю над сборником решений для type-challenges

    ghaiklor.github.io/type-challenge…

    О, ещё TS!

    @jsunderhood Сейчас работаю над сборником решений для type-challenges

    ghaiklor.github.io/type-challenge…

    6:40
    @jsunderhood Статьи: habhub.hyoo.ru
    Видео: youtube.com/channel/UCwRUy…

    Про инверсию зависимостей на голом TS интересно:

    @jsunderhood Статьи: habhub.hyoo.ru
    Видео: youtube.com/channel/UCwRUy…

    6:43
    @jsunderhood Вопрос о комментариях. Своеобразная обратная связь в блоге, кто то использует «сообщить об ошибке», кт… twitter.com/i/web/status/1…

    Мне очень лень пркручивать комменты к блогу, хотя надо бы :–/

    Антон Жиянов недавно писал об относительно просто с… twitter.com/i/web/status/1…

    @jsunderhood Вопрос о комментариях. Своеобразная обратная связь в блоге, кто то использует «сообщить об ошибке», кт… twitter.com/i/web/status/1…

    6:46

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

    6:46
    @jsunderhood Как только стал активно менторить необходимость в повторении материала на разных людей выросла и стало… twitter.com/i/web/status/1…

    Да, я стал регулярно писать, именно когда стало нужно ссылаться на ответы о чём-то.

    @jsunderhood Как только стал активно менторить необходимость в повторении материала на разных людей выросла и стало… twitter.com/i/web/status/1…

    6:48
    @jsunderhood Выкладываю публичные заметки на гитхаб

    github.com/antonk52/webde…

    Тоже вариант!

    Из них потом при желании можно вырастить какой-нибудь бложек.

    @jsunderhood Выкладываю публичные заметки на гитхаб

    github.com/antonk52/webde…

    6:48

    Доброе утро субботы! ^_^

    Давайте сегодня поболтаем о пет-проектах?

    6:53

    Сейчас я постараюсь проснуться и начну 😅

    6:53
    @jsunderhood Вот последний пет проект: qrcard.ml
    В этот раз даже лендинг пейдж доделал 😅

    🤖🦾

    @jsunderhood Вот последний пет проект: qrcard.ml
    В этот раз даже лендинг пейдж доделал 😅

    7:22
    @jsunderhood Пет проекты — это хорошо. Знаю компании, которые ищут себе сотрудников только по пет-проектам.

    А что вы думаете о такой практике?

    Мне кажется, это несколько завышенные требования от разработчиков. Объясню в т… twitter.com/i/web/status/1…

    @jsunderhood Пет проекты — это хорошо. Знаю компании, которые ищут себе сотрудников только по пет-проектам.

    7:26

    Я иногда задумываюсь, а не становятся ли пет-проекты и опен-сорс обязательным (и завышенным) требованием при найме?… twitter.com/i/web/status/1…

    7:26

    Пет-проекты — это с одной стороны, способ улучшить свои навыки. А если сойдутся звёзды — то и разбогатеть на мега-с… twitter.com/i/web/status/1…

    7:26

    Одно дело, когда я _горю идеей_ что-то сделать и попробовать; и совсем другое — когда от меня этого _требует_ вакансия.

    7:26

    Тем более что не во всех компаниях выделяют время на опен-сорс или пет-проекты.

    Так вроде только в Гугле делали (… twitter.com/i/web/status/1…

    7:26

    У меня из пет-проектов самый долгий (и известный) — это Тяжеловато:

    7:31

    Мы его делали с @Yumadilov, когда нам не на что было выживать 😃

    Оттуда и название и дефолтный лимит в один прожиточный минимум 😅

    7:31

    Разработку вели открыто.

    Прямо перед началом объявили, что сделаем приложение за две недели и начали об этом писат… twitter.com/i/web/status/1…

    7:31

    Примерно тогда же я начал тыкать в электрон и в курс доллара и сделал Курсовик 😅

    Я его… twitter.com/i/web/status/1…

    7:40

    А затем я вообще использовал идею курсовика как основу для воркшопа о тестировании реакт-приложений:

    -… twitter.com/i/web/status/1…

    7:40

    Пробовал делать инструменты для разработчиков. Один из тех, которыми пользуюсь сам — Тмстмп:

    -… twitter.com/i/web/status/1…

    7:40

    Один из тех, которым пользуюсь не только я, — Прокрутчик:

    Скрипт для прокрутки контента… twitter.com/i/web/status/1…

    7:40
    @jsunderhood Не особо, все продвигается оч медленно pic.twitter.com/pOqvT0wBP3

    Оно живое! 🤖

    @jsunderhood Не особо, все продвигается оч медленно pic.twitter.com/pOqvT0wBP3

    7:41

    А дальше меня как-то переключило на книги ¯\_(ツ)_/¯

    Первым таким пет-проектом-книгой стало «Фронтенд — это не бол… twitter.com/i/web/status/1…

    7:45

    Изначально я хотел сделать доклад, но потом понял, что не хватило бы времени на всё.

    Так вместо презентации появи… twitter.com/i/web/status/1…

    7:45

    ...Пофильтровали его, подчистили.

    На новогодних каникулах я всё сверстал и насобирал мемов для иллюстраций.

    В ко… twitter.com/i/web/status/1…

    7:45

    Недолго после этого я проходил какой-то курс о тестировании, где затрагивали тему TDD.

    Затрагивали очень поверхнос… twitter.com/i/web/status/1…

    7:49

    Я стащил идею расположения текста и кода отсюда:

    (Сейчас кажется, что ещё неплохо было… twitter.com/i/web/status/1…

    7:49

    Когда я начал заниматься проектированием и чуть чаще работать с ООП, я понял, что не понимаю принципов SOLID.

    Тогд… twitter.com/i/web/status/1…

    7:51

    Мы решили не просто рассказать о принципах, но ещё и показать их действие на примерах в коде, в жизни и в паттернах… twitter.com/i/web/status/1…

    7:51

    Всё остальное либо не дожило до наших дней, либо не развивается и не поддерживается 😅

    7:53

    С опен-сорсом проще: иногда работа внутри компании позволяет релизнуть что-то в опен-сорс.

    А вот с пет-проектами н… twitter.com/i/web/status/1…

    7:58
    @jsunderhood просто пишу на всякие темы по js, которые кажутся интересными

    howtojs.ru

    8:02
    @UntrueMe @jsunderhood Не так прикольно как с роботом гексаподом выглядит, но это мой пет. Это система автоматизаци… twitter.com/i/web/status/1…

    Воу! 🤩

    @UntrueMe @jsunderhood Не так прикольно как с роботом гексаподом выглядит, но это мой пет. Это система автоматизаци… twitter.com/i/web/status/1…

    9:06
    @jsunderhood Требовать - нет. Но наличие интересного пет проекта позволяет говорить с кандидатом не на стандартные… twitter.com/i/web/status/1…
    9:07
    @jsunderhood На собеседованиях я всегда интересуюсь, занимается ли разрабочик своими пет проектами, и есть ли чем п… twitter.com/i/web/status/1…

    А почему заниматься ремеслом ради выгоды — плохо?

    Ведь можно вкладываться и делать хорошо одно дело, на работе, в… twitter.com/i/web/status/1…

    @jsunderhood На собеседованиях я всегда интересуюсь, занимается ли разрабочик своими пет проектами, и есть ли чем п… twitter.com/i/web/status/1…

    9:11

    Я не стараюсь набросить, а скорее разобраться, что побуждает смотреть при найме не только на результаты _работы_, н… twitter.com/i/web/status/1…

    9:13
    @jsunderhood О, моя любимая тема

    marat.to/posts/2021-01-…

    10! 😅

    @jsunderhood О, моя любимая тема

    marat.to/posts/2021-01-…

    9:14

    Мне понятная мотивация компаний, которые ищут трудоголиков, чтобы те работали по 240 часов в сутки.

    Мне понятна м… twitter.com/i/web/status/1…

    9:19
    @YouSysAdmin @jsunderhood 2/2
    Что мешает выпускнику переписать его на React или Vue, которые он прошел позднее? Выд… twitter.com/i/web/status/1…

    Идея использовать пет-проект, как площадку для оттачивания навыков, которые студент _приобретает во время обучения_… twitter.com/i/web/status/1…

    @YouSysAdmin @jsunderhood 2/2
    Что мешает выпускнику переписать его на React или Vue, которые он прошел позднее? Выд… twitter.com/i/web/status/1…

    9:33
    @jsunderhood Я постоянно какие-то пишу, только жалко, что часто забрасываю. Но вообще, часто бывает, что пет проект… twitter.com/i/web/status/1…

    Заметил, кстати, что часто упоминают, будто пет-проекты интереснее основной работы 🤔

    Нужно ли с этим бороться?
    Как?

    @jsunderhood Я постоянно какие-то пишу, только жалко, что часто забрасываю. Но вообще, часто бывает, что пет проект… twitter.com/i/web/status/1…

    9:41

    У меня возникает мысль «найти работу интереснее», но это не всегда возможно.

    Отчасти как раз потому, что не всегд… twitter.com/i/web/status/1…

    9:43
    @jsunderhood Раньше вёл блоги про веб, про кино, про игры. Всё кануло в Лету. Остался только Твиттер. И, с недавних… twitter.com/i/web/status/1…

    Видео-блоги — тоже блоги 😎

    @jsunderhood Раньше вёл блоги про веб, про кино, про игры. Всё кануло в Лету. Остался только Твиттер. И, с недавних… twitter.com/i/web/status/1…

    9:49
    @jsunderhood Завел блог примерно в то время когда устроился работать программистом.
    Начал с того что записывал для… twitter.com/i/web/status/1…
    11:04
    @jsunderhood github.com/unger1984/dia - вебсервер на dart. Решил закодить когда захотелось аналога из ноды
    13:34
    Доброе утро субботы! ^_^

    Давайте сегодня поболтаем о пет-проектах?

    Суббота — пет-проекты и всё рядом:

    Доброе утро субботы! ^_^

    Давайте сегодня поболтаем о пет-проектах?

    16:39

    # Воскресенье 16 твитов

    @denis_f_l @jsunderhood inoreader.com же :) Он и обычные сайты умеет парсить и создавать из них RSS ленты.
    7:19
    В @jsunderhood затронули тему личных блогов. Блог это классно, вот только где тот самый гугл ридер, в котором собир… twitter.com/i/web/status/1…

    Я обычно RSS с телефона читаю, а для него есть великолепный Reeder:

    В @jsunderhood затронули тему личных блогов. Блог это классно, вот только где тот самый гугл ридер, в котором собир… twitter.com/i/web/status/1…

    7:20
    @jsunderhood По-моему формат с телеграм каналом, в котором собраны заголовки и ссылки, самый удобный (для читателя)

    Вполне вероятно.

    Хотя я пробовал вести канал в Телеграме, показалось неудобным писать туда 🤔

    (А ещё когда я блог… twitter.com/i/web/status/1…

    @jsunderhood По-моему формат с телеграм каналом, в котором собраны заголовки и ссылки, самый удобный (для читателя)

    7:31
    @not_a_reptiloid @jsunderhood Телеграм — это пуш, РСС — это пул.

    Пуш вызывает FOMO и нервирует, пул позволяет потр… twitter.com/i/web/status/1…

    7:37

    Сегодня воскресенье, давайте подводить итоги недели!

    8:04
    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    Понедельник начали с обсуждения архитектуры и DDD.

    Обговорили, нужная ли чистая архитектура на фронте и как делать… twitter.com/i/web/status/1…

    Теперь немного о собственно проектировании.

    Допустим, мы знаем, что нашему проекту _нужна_ суровая масштабируемос… twitter.com/i/web/status/1…

    8:04
    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    Во вторник обсудили ООП.

    ООП и фронтенд — хорошие друзья или заклятые враги. Как ООП помогает проектировать архит… twitter.com/i/web/status/1…

    Доброе утро! Сегодня вторник, а значит поговорим об ООП на фронте.

    Пока я заливаю в себя кофе, давайте проведём оп… twitter.com/i/web/status/1…

    8:05
    А сегодня поговорим о том, как сделать код читаемым и тестируемым ^_^

    Расскажите о своих приёмах, как вы улучшаете… twitter.com/i/web/status/1…

    В среду поделились рецептами, как делать код читаемым и тестируемым.

    TDD, работа с легаси, принципы и эвристики.

    А сегодня поговорим о том, как сделать код читаемым и тестируемым ^_^

    Расскажите о своих приёмах, как вы улучшаете… twitter.com/i/web/status/1…

    8:06
    Доброе утро четверга! ^_^

    Чем ближе конце недели, тем больше мы уходим от хард-скилов 😃

    Сегодня поговорим о том,… twitter.com/i/web/status/1…

    В четверг поговорили о том, как в разработке эффективнее всего расти:

    Доброе утро четверга! ^_^

    Чем ближе конце недели, тем больше мы уходим от хард-скилов 😃

    Сегодня поговорим о том,… twitter.com/i/web/status/1…

    8:07
    Давайте под конец рабочей недели поговорим о ведении технического (и не только) блога!

    В пятницу обсудили, как и зачем вести технический блог:

    Давайте под конец рабочей недели поговорим о ведении технического (и не только) блога!

    8:08
    Привет!
    На этой неделе у микрофона Саша @bespoyasov.

    Работаю в DRIVE2. Пришёл туда как фронтендер, потом писал б… twitter.com/i/web/status/1…

    Навигацию по подтемам и аспектам я оставил в основном треде 🧵

    Привет!
    На этой неделе у микрофона Саша @bespoyasov.

    Работаю в DRIVE2. Пришёл туда как фронтендер, потом писал б… twitter.com/i/web/status/1…

    8:09

    Спасибо всем, кто читал, отвечал и участвовал! Вы все классные.

    8:11
    @jsunderhood @kumma_kirill Нужно учиться работать достаточно эффективно когда работа скучна.

    Для этого нужны хобб… twitter.com/i/web/status/1…

    Мне помогает относиться ко скучным задачам как к таким типа «мета-задачам», как сделать работу нескучной.

    Писал о… twitter.com/i/web/status/1…

    @jsunderhood @kumma_kirill Нужно учиться работать достаточно эффективно когда работа скучна.

    Для этого нужны хобб… twitter.com/i/web/status/1…

    9:29

    Ну или относиться к работе, как к ремеслу, если первое не срабатывает.

    (Только главное к себе прислушиваться, вдру… twitter.com/i/web/status/1…

    9:29
    @jsunderhood Проект вырос из рабочей потребности парсить бб коды и делать манипуляции с ними. Вместо текущих регуля… twitter.com/i/web/status/1…
    10:06
    В общем, тред про блоги в @jsunderhood и ссылки на ридеры меня так вдохновили, что я засел с блокнотом, чтобы набро… twitter.com/i/web/status/1…

    Огонь!
    Пусть всё получится! 🙌

    В общем, тред про блоги в @jsunderhood и ссылки на ридеры меня так вдохновили, что я засел с блокнотом, чтобы набро… twitter.com/i/web/status/1…

    10:36

    github.com

    ru.wikipedia.org

    bespoyasov.ru

    other