retran

1 февраля 2016, Worldwide

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

Всем привет! На этой неделе с вами @retran.

12:10

lead software developer в маленькой продуктовой компании, разрабатывающей коммерческий фреймворк для erp-систем.

12:12

Уже лет пять специализируюсь на энтерпрайзном бэкенде и разного рода API и сервисах.

12:12

Так что на этой неделе будем говорить про REST, RESTful, SOAP, проблемах интеграции систем, мобильных бэкендах, etc

12:14
@backendsecret о, давай: кто возвращает 200 вместо 4xx и 5xx, тот...?
12:21

Не могу придумать цензурное слово :) Аналогично - коды ошибок вместо SOAPFault

12:26

ИМХО, json не лучший выбор для rpc вообще. Можем поспорить :)

12:28
@backendsecret где можно почитать про бестпрактисы по структуре REST API
12:30

Чтиво про rest - infoq.com/minibooks/emag…

12:30

"@vassilevsky: @backendsecret подскажи единственно верный способ аутентификации в JSON API" OAuth 2.0

12:36

"@atnartur: @backendsecret каким инструментом для создания документации по API пользуетесь?" visualstudiomagazine.com/articles/2014/…

12:38
@backendsecret есть опыт внедрения HATEOAS? что думаешь?

Не внедрял. Где-то читал про него, сейчас почитал - выглядит красиво в теории. Но, интуицией чую кучу проблем. twitter.com/defly_self/sta…

13:03

По поводу json - его большая проблема в отсутствии распространенного стандарта для статической типизации и описания контрактов.

13:05

Когда вы делаете что-то для SPA или мобильного приложения - это не так важно.

13:05

Но когда вы делаете публично api или api для интеграции с другой компанией (да даже и другим отделом в компании)...

13:06

Лучше сделать так, чтобы само api "умело рассказать" о своем контракте и уменьшить издержки на boilerplate-код для парсинга и валидации.

13:07
.@OdinYury Всем рекомендую эту статью blog.2partsmagic.com/restful-uri-de… @backendsecret
13:08

Соответственно, если вы суровый энтерпрайз - вам нужен XML (или вообще SOAP). Если модный веб-стартап - например, protobuf.

13:09
@backendsecret protobuf давно уже сосет

Внедрение protobuf на первых этапах дороже, чем json. Но народ как обычно идет по пути наименьшего сопротивления. twitter.com/strangeqargo/s…

13:14

Кстати, если у вас XML - не забудьте проверить ваш фреймворк в целом и парсер конкретно на подверженность XXE.

13:18

XXE (owasp.org/index.php/XML_…) - одна из самых популярных дырок в XML-based сервисах.

13:18

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

13:20
@backendsecret если у вас xml - не забудьте не использовать его больше никогда.

Не понимаете зачем он нужен и почему он такой - да, лучше не используйте. twitter.com/mr_The/status/…

13:21

Мое больное место - непонимание кучи людей зачем в SOAP есть SOAPFault и как его использовать.

13:22

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

13:22
@backendsecret, можно поподробней: чем плох JSON? в чем преимущество XML?

Наличие статической типизации и стандартизированных схем типов. twitter.com/PZabolotniy/st…

13:24
@backendsecret, можно поподробней: чем плох JSON? в чем преимущество XML?

Что позволяет автоматически валидировать и десериализовывать сообщения сразу в строго типизованные объекты. twitter.com/PZabolotniy/st…

13:25
@backendsecret, можно поподробней: чем плох JSON? в чем преимущество XML?

При этом вы можете гарантировать, что ваш клиент использует ту же самую схему данных... twitter.com/PZabolotniy/st…

13:27
@backendsecret, можно поподробней: чем плох JSON? в чем преимущество XML?

А значит понимает и парсит (в идеальном мире) их точно также. twitter.com/PZabolotniy/st…

13:27
@backendsecret a json-schema.org ?

Да, есть такое (и не один вариант). Но кто их реально использует? twitter.com/Onotoly/status…

13:27

С другой стороны, однажды делал интеграцию с одной платежной системой. Дотнетовский парсер на их xml'е радостно падал.

13:30

Оказалось, что их бэкенд написан на некоем пхпшном фреймворке, содержащем баг.

13:31

Но так как их клиенты собирали soap-сообщения ручками и парсили тоже ручками, про этот баг никто не знал, пока не пришли мы :)

13:31
@backendsecret вот просто с ходу github.com/composer/compo…

Спасибо, сохранил себе как reallife пример использования. twitter.com/Onotoly/status…

13:33
@backendsecret можешь ввертеть aws.amazon.com/ru/api-gateway… для валидирования. Сейчас таких продуктов становится всё больше.
13:37
@backendsecret кстати, @flushdia самый крутой чувак по REST'у, которого я встречал. Рекомендую призывать его в самые холивары, если выйдет )

Отлично! twitter.com/Bubyakin/statu…

13:37
@backendsecret Что такое "описание контрактов"?

en.wikipedia.org/wiki/Standardi… twitter.com/lyxd9/status/6…

13:38
@backendsecret Прямо сейчас пишу проект такой. А ещё @SwaggerApi на них завязан

Круто. Поделитесь впечатлениями :) twitter.com/iamale_ru/stat…

13:39
@backendsecret так может проблема в кривых руках людей, а не в форматах данных для обмена?

Конечно! Но именно поэтому формат данных - это так важно. twitter.com/ivanenok/statu…

13:40
@backendsecret так может проблема в кривых руках людей, а не в форматах данных для обмена?

Чем меньше кода нужно для использования вашего api - тем меньше проблем и влияния кривых рук. twitter.com/ivanenok/statu…

13:40
@backendsecret эм, а как формат данных может предотвратить косяки фрэймворков?

В данном примере - если бы люди написали нормальные тесты вокруг собственного контракта - проблемы бы не было. twitter.com/ivanenok/statu…

13:44
@backendsecret эм, а как формат данных может предотвратить косяки фрэймворков?

А если у вас есть схема данных - это сделать СИЛЬНО проще, чем без схемы. twitter.com/ivanenok/statu…

13:45
@backendsecret ок, видимо пропустил основную мысль. вобщем идея в том что бахнули схему и всем щастье настало на ваалидации или что?

В целом, да. Но счастье настает не только на валидации. twitter.com/ivanenok/statu…

13:48
@backendsecret ну и здесь ты получаешь дргую проблему - версионность и расширение схемы, почему и появились гибкие форматы.

Версионности никак не мешает. twitter.com/ivanenok/statu…

13:49
@backendsecret ну и здесь ты получаешь дргую проблему - версионность и расширение схемы, почему и появились гибкие форматы.

А за манипуляции с контрактом без смены версии в публичном апи - надо больно бить по рукам независимо от формата. twitter.com/ivanenok/statu…

13:49
@backendsecret сам protobuf, есть более эффективные бинарные протоколы уже

Расскажите. Но вообще, если вы делаете публичное апи - иногда стоит проявить некоторый консерватизм. twitter.com/strangeqargo/s…

13:50
@mr_The @backendsecret он слишком деревянный в плане расширения и избыточен на больших объемах данных. на легаси всё это вылазит обычно.

Согласен про избыточность. Деревянность в расширении - это скорее хорошо. twitter.com/ivanenok/statu…

13:51
@backendsecret capnproto.org/index.html от создателя protobufs v2
14:03
@defly_self вот, что я хотел показать api.github.com
даже в точке вхождения в API есть мануал,и это круто @flushdia @backendsecret
14:20
@Bubyakin @flushdia @backendsecret был опыт внедрения, только не публичного API, отлично себя показал. Экономит время и бэкэндам и фронтам
14:26
@backendsecret protobuf есть же

Да, я и его и предлагаю как одну из альтернатив. twitter.com/Anatolii_Pr/st…

14:30

Расскажите про самое кривое API с которым вам приходилось интегрироваться.

14:49

Мой случай - SOAP-сервис одной милой госслужбы, в котором все идентификаторы в контракте были заданы кириллицей. КИРИЛЛИЦЕЙ, Карл!

14:50
@backendsecret Самое кривое API, обычно, это то, которые ты ж год назад и написал.

Отлично! twitter.com/webholt/status…

14:51
@backendsecret круто! =) ну, я второй год работаю с шикарным немецким апи... в котором все параметры - сокращенные немецкие слова.. (
14:59
@ztaaz @backendsecret я вот сейчас читаю код на perl'e.. и на немецком (я пхпшник ваще). Да, у них это норма походу :( жизнь - боль
15:04

Приходилось ли вам когда-нибудь делать stateful api? Стыдно ли вам за это?

15:07
@backendsecret когда внешняя система должна работать с вашими транзакциями - выбора нет

Точно. twitter.com/mr_mig_by/stat…

15:08

А еще выбора нет, когда ваше api предоставляет клиенту какой-либо пошаговый бизнес-процесс (workflow, вот это все).

15:09
@ivanenok @mr_The @backendsecret смотрю иногда на передаваемые пакеты: тэги заменили на {} - вот и все отличия :)

XML без схемы - это не XML, и не дает никаких преимуществ по сравнению с более легковесным json. twitter.com/de_gis/status/…

15:09
@ivanenok @mr_The @backendsecret смотрю иногда на передаваемые пакеты: тэги заменили на {} - вот и все отличия :)

Так что, если "замена" все упростила - значит исходно был выбран не тот протокол. twitter.com/de_gis/status/…

15:10

Думаю с форматами и протоколами пока все. Предлагаю другую большую тему - SOA 2.0 и event driven services.

15:25

И близкую к ней - CQRS, event sourcing и даже набившие оскомину в последнее время микросервисы.

15:25
@backendsecret ты так говоришь, как будто микросервисы это что-то плохое

Микросервисы - это очень хорошо пока вы понимаете что делаете и контролируете инкапсуляцию. twitter.com/en_austin/stat…

15:32

Давайте определимся с терминами. Когда вы просто напрямую синхронно дергаете за некое api и синхронно получаете ответ - это SOA 1.0

15:38

В SOA 2.0 вы кладете ваше сообщение в service bus (или даже очередь) и спокойно про него "забываете".

15:40

А шина перенаправляет ваше сообщение сервису-подписчику (или он сам забирает его из очереди), который его уже процессит.

15:41

Удобно считать, что сообщение несет с собой информацию о некотором событии произошедшем в системе.

15:41
@backendsecret, SOAP с апдейтом ~10k сущностей в один запрос

ИМХО, иногда без batch update не обойтись. twitter.com/_kix/status/69…

15:43
@backendsecret, потом выяснилось, что это batch create с полным убийством существовавшей коллекции

Да, смешно :))) twitter.com/_kix/status/69…

15:53
@backendsecret а спросить данные у другого компонента? Как это правильно в SOA 2 решается? Про события и команды вопросов нет :-)

Отличный вопрос. Здесь в игру вступает CQRS - ваши компоненты отвечают либо за обработку команд-эвентов... twitter.com/unreal_michael…

15:56
@backendsecret а спросить данные у другого компонента? Как это правильно в SOA 2 решается? Про события и команды вопросов нет :-)

Либо за query, которые не изменяют никаких данных и которые поэтому можно спросить синхронно. twitter.com/unreal_michael…

15:56
@backendsecret а спросить данные у другого компонента? Как это правильно в SOA 2 решается? Про события и команды вопросов нет :-)

А если у вас еще и event sourcing, то вы даже storage для query- и command-компонентов можете разделить. twitter.com/unreal_michael…

15:57
@backendsecret понятно :) В качестве резюме --- синхронные запросы для получения данных в концепции SOA 2 никто не запрещает.
16:10

Неплохая презентация на тему - slideshare.net/chris.e.richar…

16:10

Еще одна хорошая связанная тема - actor model. Скалисты, где вы? :)

16:16

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

16:17
@backendsecret что сразу скалисты? почему не эрлангеры?

Мода пошла с появлением Akka. А так, даже в нашем дотнете есть - getakka.net twitter.com/unel86/status/…

16:22
@backendsecret @unel86 ну мейнстримом, наверное — да. хотя сама модель много где реализована

Появилась она еще в 70-е, кажется, на лиспе. Как и много другое, что сейчас "переоткрывают". twitter.com/43oN/status/69…

16:27
@backendsecret @unel86 давай, выкладывай про экторы :)

Что конкретно интересует? twitter.com/43oN/status/69…

16:44
@backendsecret @unel86 ну, я экторы только в скале плотно пощупал. И довольно быстро разочаровался. Когда проект разрастается, то сложно…
16:51
@backendsecret @unel86 …становится даже банально осознать флоу сообщений. А тулов для дебага нормального (по крайней мере на тот момент) нет
16:52
@backendsecret @unel86 ну и в итоге красота оборачивается в ад отладки. Были проекты, которые пытались формализовать правила, но были сырые
16:52

ИМХО, если сложно осознавать поток сообщений, то вы что-то не так делаете.

16:52
@backendsecret @unel86 в общем можно про границы применимости и подходы обсудить, например :)

ИМХО (можно обсуждать), модель акторов как раз про разделение системы на слабосвязанные модули (в очередной раз, да) twitter.com/43oN/status/69…

16:54

И если ваш актор имеет стейт и интересуется чем-то помимо конкретных приходящих в него событий или их порядком, то что-то не так.

16:55
@backendsecret @unel86 в общем можно про границы применимости и подходы обсудить, например :)

Давайте. twitter.com/43oN/status/69…

16:56
@backendsecret всякие сервисы email-рассылок местного розлива, "аналоги" MailChimp, типа pechkin-mail.ru. Стыд-то какой, господи.
17:19
@ivan0yu @backendsecret О, скотч! Хоть один человек понимают мою боль (:
17:25
New features in Acumatica 5.3 focus on performance, stability and mobility. --> acumati.ca/1KSbISu #AcumaticaSummit

На правах саморекламы и про мою работу. Мое там, собственно, mobile app и new web services. twitter.com/Acumatica/stat…

17:46

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

18:23
@backendsecret официальный кончился в шесть, неофициальный не имеет границ)
18:42
@backendsecret обычно ухожу с работы часов в 19-20)
18:44
@backendsecret нет официального окончания, о чем жалею иногда
18:50
@anton_davydov 00-24 это тяжко :) @backendsecret
18:50

Интересно, а остались еще разработчики, которые сидят на работе "от звонка до звонка"?

18:50
@backendsecret Это больше зависит не от человека а от политики компании, а вот компаний таких валом.

Например? Я знаю несколько непрофильных компаний с такой политикой, но там все равно все решается на уровне отдела. twitter.com/POS_troi/statu…

18:55
@backendsecret следом спрашивай о тех, кто вынужден высиживать время, а работать дома ночью :)
19:03
@backendsecret Ну если брать профильные или хотя-бы столичные то да. На отшибах всё меняется, ну это конечно мой вариант и локация )
19:03
@ivanenok @backendsecret да, часто умные мысли и решения приходили по пути домой. но обычно стараюсь разделять работу и всё остальное
19:04
@oleg_antonyan @backendsecret хм, у меня плохо получается разделять. хрен знает чем и как мысли останавливать :)

Та же фигня. Пока не зафлашу мысли в код - не могу успокоиться :( twitter.com/ivanenok/statu…

19:06
@backendsecret задачник/тудушка спасает, аля GTD, записал мысль == сбросил в своп, освободил озу

Кстати, да. А кто чем пользуется? twitter.com/oleg_antonyan/…

19:11

У меня очень хорошо взлетел emacs org-mode как раз потому что можно писать почти в свободной форме.

19:11
@backendsecret Фигня кто чем пользуется, мне вот больше интересно у кого реально получается и как он это блин делает :D

В течения дня записываю что делаю/что собираюсь делать. Без всяких GTD, просто подряд. twitter.com/POS_troi/statu…

19:14
@backendsecret Фигня кто чем пользуется, мне вот больше интересно у кого реально получается и как он это блин делает :D

Если сразу не сделал - проставляю тег и дату. Потом могу делать query по параметрам. twitter.com/POS_troi/statu…

19:14
@backendsecret с недавних пор producteev.com GTD реализовать можно, хотя и не удобно списки через теги, но пока лучше не нашёл
19:15
@backendsecret к сожалению, есть. Причём ещё и штрафы за любое опоздание на работу, с обеда или раньше уйти домой

А зачем там работать? twitter.com/_bublik_/statu…

19:15
@backendsecret а я там не работаю. Ходил собеседоваться на СТО. Убежал в ахуе :)

Вот. Думаю долго будут искать, а когда найдут - ничего хорошего им человек не сделает. twitter.com/_bublik_/statu…

19:17
@backendsecret У меня не получается, прихожу домой, читаю твиттор и вдруг оказывается что уже сижу в SSH и колупаю сервак :)

Заставляю себя отвлечься, для этого есть семья, игры, кино, художественная литература etc twitter.com/POS_troi/statu…

19:18

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

19:20
@backendsecret очень даже сделает. нахуй послать может несколько раз :)
19:28

На сегодня вас покину :( Завтра все-таки поговорим про actor model и подробнее про семантику и контракты сервисов.

19:30

Если есть интересные темы - предлагайте.

19:30

"@en_austin: @backendsecret PS4 vs XOne? ;-)" Оффтопик же

19:37
@backendsecret верно, но рабочий день закончился, можно и пооффтопить:)
19:42

"@en_austin: @backendsecret верно, но рабочий день закончился, можно и пооффтопить:)" может сразу IOS vs android?

19:42
@backendsecret agile results очень хорошо идет 30daysofgettingresults.com
20:09

"@webholt: @backendsecret Я так работаю." Зачем?

20:10

"@webholt: @backendsecret Вариант, что кого-то это может устраивать, не рассматривается вовсе?" Рассматривается.

20:15
@backendsecret @unel86 да, именно. Но с ростом актёров (модулей), кажется, всё становится излишне сложным.
20:16
@backendsecret @unel86 то же самое можно про микросервисы сказать, лол.
20:16

"@43oN: @backendsecret @unel86 а, да. я говорю про кейс с антайпед-экторами." У антайпед-подхода есть плюсы, но.... В общем, я не поклонник.

20:17
@backendsecret Вот. У нас в городе я вообще не слышал о сколько-нибудь серьезных конторах со свободным графиком.
20:17
@backendsecret А что касается меня, то после 7 лет фриланса я целенаправленно шёл в офис на фуллтайм.
20:17
@backendsecret @unel86 ммм... Вот создатели считают наоборот. Да и тайпед-экторы были костылём. А их ещё не выпилили разве? :3
20:21
@webholt @backendsecret поддерживаю. С ростом скилла, конечно скорость выполнения рутинных тасков увеличивается, но и их сложность растет.
20:21
@webholt @backendsecret сам работаю с относительно свободным графиком, но очень и очень распустился, мало успеваю и немного несу убытки :(
20:21
@strizhechenko @backendsecret С фиксированным графиком можно усилия на размышление и планирование направить в другое русло.
20:26
@strizhechenko @backendsecret «А если я просплю до обеда, успею ли я завершить таск и не выебет ли меня шеф?»
20:26

Обычно в качестве плюсов untyped-авторов приводят возможность "менять контракт" в зависимости от стейта. Но для меня это звучит странно.

20:27

Почему новый контракт не может быть типизованным?

20:33
@backendsecret нее. Untyped — это когда у эктора один метод receive, который принимает произволный мессдж, а далее паттерн-матчинг с понями
20:34
@backendsecret терминология такая терминология. Ну вот в общем typed-экторы хуже, т.к если метод возвращает значение, то вызов блокирующий
20:36
@backendsecret typed — когда ты пишешь обычный класс с блекджеком и методами и обращаешься как к обычному объекту. Вся магия от тебя скрыта
20:38

Опять же, как то что возвращает актор зависит от того как он парсит сообщения?

20:42

"@Fodoj: @backendsecret @en_austin микросервисы это buzz word" Согласен.

20:47
@backendsecret логично предположить, что есть. Но, честно, уже не помню/не знаю умеет ли
20:50
@backendsecret в акке был плох реализацией — не более. Статический роутинг прще дебажить.
20:53

"@Kukuruzovich: @backendsecret ровно никак" вот и я о том же

20:54
@backendsecret считается ли statefull service за API как statefull API? statefull service вполне годная вещь если применять с умом
20:58
@backendsecret кидал до этого когда вел этот твиттор ссылки на statefull сервисы, в gamedev это вообще only way по факту
21:00
@unreal_michael @backendsecret все так, даже больше - composite сервисы, они же API Gateway (edge services) это и делают по факту =)
21:12
@ivanenok @backendsecret так это было самое первое собеседование. Оно очень спонтанное было. Сидел в переговорке, ждал генерального, тыкал в
21:57
@ivanenok @backendsecret планшетик. И думаю "Дай отзывы посмотрю". Посмотрел. Охуел. Начал спрашивать "Так?" говорят - "Да". Ну я и ушел :)
21:57

"@Woundless: @backendsecret а ты сам по графику работаешь?" В офисе, но фактически свободный

22:13
@strizhechenko @webholt @backendsecret та же проблема... Еще и режим сбился после новогодних. Есть идеи как выбираться из этой ситуации?
22:13
@Woundless @webholt @backendsecret хз, я себе поставил минимальное ограничение в 2 больших фичи в неделю, а то пустой релиз выкатывать тухло
22:14

"@Woundless: @backendsecret т.е. в теории можешь прийти и уйти когда хочешь, но это не желательно?" Не нежелательно, а "надо предупредить".

22:40

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

Доброе утро, твиттер!

12:20
@backendsecret Пора делать великие дела и релизить новые фичи!
13:25

"/api/entities, но /api/entity/1" или "/api/entities и /api/entities/1"?

13:27
@backendsecret годный вопрос. чисто практически для билда урла из строки лучше второй вариант :)

Да, один из правильных аргументов :) twitter.com/ivanenok/statu…

13:32
@backendsecret Когда начинают менять URL то начинается путаница и главное что постоянно нужно держать в голове сей факт. Короч я за 2 :)
13:34
@backendsecret 2й лучше - уменьшается когнитивная нагрузка на пользователя твоего API (прогеру клиента проще без заморочек с формами слов)
13:35

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

13:37

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

13:37

Поклонники второго варианта обычно говорят, что так с АПИ проще работать (и они правы, имхо).

13:38

Иногда, еще говорят, что семантика такого варианта расшифровывается как "есть массив entities, мы получаем элемент массива entities[1]"

13:38

Что важнее? 1. Семантика бизнеса 2. Техническое удобство 3. Нужно искать компромисс, и это как раз этот случай.

13:40
@backendsecret Кстати логически всёравно второй вариант.
За /api/entities/[1..100500] всёравно множество.

Да, написал про это. Но это все равно техническая семантика, а не бизнесовая. twitter.com/POS_troi/statu…

13:41
@a_lithium ну вот все так думают но @backendsecret говорит что бизнесовая логика не приемлит и сопротивляется :)

Я пока рассказываю про варианты :) twitter.com/POS_troi/statu…

13:49
@backendsecret вот бизнесовое удобство у твиттора например :) каша, мёд, гавно и пчёлы :) dev.twitter.com/rest/public
13:51
@backendsecret покажите мне тех людей, кто проголосовал за #1! Я хочу на них посмотреть
14:20
@Bubyakin пусть лучше сами признаются :) @backendsecret
14:20
@backendsecret так оно семантических неправильно - там же директория всегда, а не название энтити.

GET /api/customer/Vasya - дай мне кастомера Васю. twitter.com/borovikov/stat…

14:23
@Bubyakin @backendsecret это тролли :)
14:23
@backendsecret <зануда> а версию API кто указывать будет? </зануда>

В заголовке X-API-Version ;p twitter.com/en_austin/stat…

14:25

История № 2, большая, поэтому гистом - goo.gl/9eACAz

14:27
@backendsecret проблема генерации урлов надумана, я за 1 вариант голосовал
14:29
@backendsecret семантически это дай кастомера с названием (идентификатором) Вася из директории кастомеров.

Не обязательно. Это можно читать как "ресурс типа кастомер с идентификатором Вася". twitter.com/borovikov/stat…

14:32
@backendsecret ты пятый пункт не забыл в опрос впилить? :)

Нет, твиттер не дает больше 4-х вариантов заполнить. Да и 5-й вариант такой, что хотелось бы сразу с комментариями. twitter.com/ivanenok/statu…

14:35
@backendsecret примерно, по тем же соображениям:
$ ls /tmp/foobar
ls: Нет такого файла или каталога
$ echo $?
2

Каталог ведь может быть просто пустым. Тогда ошибки не будет. twitter.com/PZabolotniy/st…

14:37
@__pewpew__ @backendsecret GET /api/entities → {entities: [{userId:1}, {userId:2}]}, GET /api/entities&userId=1 → {entities: [{userId:1}]}

Вот еще вариант предлагают. twitter.com/iloldhardly/st…

14:39
@backendsecret Это uri ресурса, никаких типов там нет, рест вообще ничего про это не говорит, это чистая выдумка.

Про коллекции рест тоже ничего не говорит :) twitter.com/borovikov/stat…

14:40
@backendsecret если тру REST, то без разницы, хоть10 раз в день можно менять
14:40

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

14:42
@backendsecret а я и не говорю про коллекции. Зато говорит про виртуальную ФС, в которой хранятся ресурсы.

Где там виртуальная ФС? Про uri-схемы ресурсов знаю, про ФС - нет :( twitter.com/borovikov/stat…

14:44

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

14:46

Да и расширять становится проще.

14:46

И самое интересное: что возвращать если нет элементов - null или пустую коллекцию?

14:46
@backendsecret Мне кажется вариант API императивных истеричек, не хватает еще варианта с исключением :)
14:49
@backendsecret null. Значит там ничего нет. А пустая коллекция - вроде как мусор присутствует, не?

Такое вот мнение. twitter.com/pinyslutty/sta…

14:50

Семантика null - это отсутствие значения. То есть нет его, вообще.

14:51

А в нашем случае, коллекция существует (хоть и пустая), а значит правильно вернуть именно коллекцию.

14:51

Заодно мы избавим клиента от лишних nullrefexception.

14:52

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

14:52

Тогда null - вполне валидное значение для ситуации "не заполнено".

14:53
@pinyslutty @backendsecret Но как? Ноль экземпляров и ноль []. Если какое-то абстрактное хранилище отключилось, тогда да, null

Все так. twitter.com/iloldhardly/st…

14:55
@backendsecret Идея в том, чтобы сообщать клиенту об ошибках в запросе с точки зрения данных. HTTP/REST =)

А где здесь ошибка? Или попытка запросить кастомеров в этом случае - ошибка в запросе? twitter.com/PZabolotniy/st…

14:57
@backendsecret а может коллекция ещё не создана, тогда null?

Ну в типовом апи стандартные коллекции сущностей уже созданы, например, по факту наличия соответствующих таблиц в бд twitter.com/chikiro_twi/st…

14:58

Кстати, мои личные варианты, на первый опрос - 2, так как нужен компромисс, второй опрос - 4.

15:01
@backendsecret ошибка не в запросе, ошибка в данных. В HTTP отсутствие данных описывается 404-ой ошибкой.

Нет. 4xx - это ошибки на стороне криента (неправильно сформировал запрос, запросил несуществующий ресурс, etc) twitter.com/PZabolotniy/st…

15:26
@backendsecret предлагаю обсудить - X-API-Version или /api/v1/.... ?

А давайте, как промежуточную тему. twitter.com/en_austin/stat…

15:26
@en_austin @backendsecret Ага, по уму надо заголовки. Ресурс от версии к версии не меняется, меняется репрезентация же

Согласен целиком и полностью. twitter.com/_kix/status/69…

15:26
@backendsecret И присылать 412 Precondition Failed, если хедера нет!
15:42
@en_austin @backendsecret, а последняя версия как sensible default как же?
15:42
@_kix @backendsecret explicit is better than implicit?
15:43
@en_austin @backendsecret Вопрос философии и специфики конкретного АПИ, и наверное сферы, из которой это АПИ происходит.
15:43
@backendsecret, вот еще интересно насчет локали. Есть Accept-Language, есть /resource?locale=ru, есть /ru/resource. Я за хедер.

Аналогично. В query должны быть только параметры вот этого конкретного запроса. twitter.com/_kix/status/69…

15:49

История №3, без опроса. Как бы вы в restful api выразили операцию "Approve Document"?

15:52
@backendsecret, «вот этот конкретный запрос локализуемый, а вот тут у нас вообще только циферки в ответе, нечего переводить, хватит квери»
15:52
@backendsecret, я-то понимаю, что это нехорошо, но вот как всех остальных убедить :)

Имхо, текущая локаль, это не параметр запроса, а параметр сессии/системная настройка. twitter.com/_kix/status/69…

15:53
@backendsecret, делал сложную фигню, где несколько раз approve/decline один документ можно, вынес в POST /docs/1/[approvals|denials]

Отличный вариант - рассматривать аппрув не как действие, а как сущность. twitter.com/_kix/status/69…

15:55
@backendsecret PUT /approvements/{documentId}, обратно DELETE. POST/PATCH отсутствует. Внутри у документа связь 1-to-1 с approvement.
15:59
@backendsecret например в стиле hateoas, в представлении ресурса будет поле "links": {"approve": "http://..."}, POST по этой ссылке

Вариант, но это уже не RESTful. twitter.com/defly_self/sta…

16:03
@backendsecret холиварно, но почему?)

RESTful оперирует только сущностями и набором стандартных действий над ними. Операций в таком виде там нет. twitter.com/defly_self/sta…

16:09
@backendsecret Конечно можно просто делать PATCH /document/1 { state: "approved" }. Почему-то кажется плохой идеей, но с чего? Кто знает?

Approval - более сложная операция. Нам как правило еще надо знать кто, когда и даже зачем заапрувил. twitter.com/iloldhardly/st…

16:09
@backendsecret Ок, для простоты лучше { state: { appropved: true } }

Хотя и это - тоже вариант. twitter.com/iloldhardly/st…

16:10
@backendsecret это на REST level 2, на REST level 3 очень даже ок martinfowler.com/articles/richa…

Да, читал. Я согласен, что это неплохая модель, но не готов спорить является ли она RESTful в общепринятом понимании twitter.com/defly_self/sta…

16:14
@backendsecret в общепринятом да, но есть ещё академический первоисточник ics.uci.edu/~fielding/pubs… считаю его очень актуальным
16:20
@backendsecret + может быть полезен такой пост roy.gbiv.com/untangled/2008… read it later

Спасибо. twitter.com/defly_self/sta…

16:20
@backendsecret @en_austin Для мажорных версий — УРЛ. Для минорных — хедер
16:58
@Kukuruzovich @backendsecret эти все мысли правильны и понятны! А скажите, есть где почитать в ширину об этом? Хочется целостности.

Вот тут неплохая подборка ссылок - blog.langer.eu/2014/09/02/lit… twitter.com/unreal_michael…

16:59
@backendsecret пустую коллекцию конечно, чтоб можно было единообразно обрабатывать ответы, типа response.map(...)
18:05
@backendsecret вот кстати, если кто докер юзает или хочет, но боится, полезное github.com/TomasTomecek/s…
22:08
@backendsecret забудте про нулл везде где только можно, жить станет проще
22:08

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

Всё что стоит знать о сегодняшних дебатах в @backendsecret за API cyclowiki.org/wiki/%D0%92%D1…
10:46
@43oN @backendsecret @unel86 Старая реализация тайпед-экторов в акке была не удачным экспериментом, но сейчас есть новая.
10:46
@43oN @backendsecret @unel86 Тут youtu.be/p5NOI52MExU?t=… говорят, что когда-нибудь тайпед-экторы будут в акке экторами по умолчанию.
10:46
@strobegen @backendsecret @unel86 пойду попробую :3 А поход-то тот же остался? Ну в смысле, что ты снаружи обращаешься к методам
10:46
@43oN @backendsecret @unel86
не совсем как раньше, см. scastie.org/14672
10:46

Утро доброе, твиттер!

10:50

Сегодня соберем немного статистики. Начнем с простого.

13:47
@backendsecret сегодня магнитные бури и вспышке на солнце? все с самого утра срутся на тему статической и динамической типизации!
14:23
@backendsecret имхо, статичная типизация для более-менее крупных систем, динамичная для скриптов
14:52

Немножко поинтереснее:

14:54
@redenergy0 @backendsecret т.е. большие системы на языке с динамической типизацией не написать либо сильно сложнее? По-моему уже срались.
14:57
@backendsecret а что насчет "инструмент для задачи, а не наоборот"?

Согласен, это очень правильная мысль. twitter.com/qwwdfsad/statu…

15:04

Множественное наследование?

15:09
@backendsecret Выбрать самый лучший язык

Тут нет ни одного лиспа :) twitter.com/OdinYury/statu…

15:14
@backendsecret И даже Pure Vanilla C нет. Так себе опрос.
15:18

Есть ли место JavaScript на бэкенде?

16:07
@backendsecret Сейчас будет борьба NodeJS-истов с остальными.
Как-то тя нынче на холивары тянет :D

Середина недели же :) twitter.com/POS_troi/statu…

16:13
@POS_troi JS не бэке не обязательно Node. Я компилил шаблоны с помощью V8. Чем не применение JS на бэке? ;) @backendsecret
16:14
@dcromster Не я всё-же понимаю JS в бэке это работа в бэке, а твой вариант больше просто вспомогательная замутя для деплоя :) @backendsecret
16:15
@dcromster @POS_troi @backendsecret фантом еще есть, но все же, когда говорят про js на бэке, речь про ноду
16:15
@backendsecret серверный javascript - это как ЛГБТ, в принципе существует, но вообще не нужен
16:15
@POS_troi нифига не для деплоя. После V8 оно шло на фронт. @backendsecret
16:15
@en_austin @backendsecret Смотрите, НОДОФОБ!
16:17
@backendsecret ну, пока там есть всякие python, php, ruby - вполне себе есть место и для js)
16:17
@POS_troi @dcromster @backendsecret ты так говоришь, будто упрекаешь меня за ответ номер 1. Но я тоже ткнул во второй=)
16:18
@backendsecret У nginx внутренние скриптовые языки — lua, perl и javascript. Что бы ты выбрал?

Зависит от задачи, но склоняюсь к lua. twitter.com/subzey/status/…

16:26
@backendsecret *Провокационно* Это то, где массив не отличить от дикта, нумерация с 1, а метатаблицы по эпичности дадут фору прототипам? :)

Это там где не сломана система типов :) twitter.com/subzey/status/…

16:31
Кричащие о том, как ужасен и не нужен Node.js, — латентные нодосексуалисты.
16:34
@backendsecret lua под nginx/openresty хорош. Сделал WAMP-роутер на его базе (bit.ly/1PUtdcm) и еще так: bit.ly/1PUtagQ
16:34
@backendsecret, как шаблонизатор/изоморфный рендер — почему нет.
16:34

Ок, поехали дальше. Есть ли в вашей компании Code of Conduct?

16:35
@webholt @backendsecret вы так говорите, как будто нодофобия это что-то плохое
16:36
@backendsecret «Не доеби ближнего своего»
16:40
@backendsecret Я, наверное, уже привык в JS, но мне кажется, что там типы сломаны не больше, чем в Пайтоне или Луа
16:42
@backendsecret ох зря ты это backendsecret.ru/authoring/ "Этикет"

Упс, сорри :) twitter.com/dcromster/stat…

17:00
@dcromster @backendsecret ну, это же нормальный вопрос, а не "сексистские шуточки"
17:04

Ок, тогда дальше. Как вы устроились на текущую работу?

17:10
@backendsecret не хватает пункта "пригласили/затащили/сами нашли"

Места не хватает :( twitter.com/dcromster/stat…

17:14
@backendsecret для тех кто выбирает последний пункт pic.twitter.com/nmkA5Tb2RR
17:14
@devmru @backendsecret Выбирающие последний пункт просто кодили, не вылезая из кровати. Вот их и позвали.
17:16

А в каком сегменте вы работаете?

17:21

Под продуктами я понимаю коробочные решения, а под сервисами - SaaS.

17:22

...никто не палится, что он из диджитала... :)))

17:30
@backendsecret А что есть диджитал?

агентства, делающие сайтики на заказ, или как они сами себя называют - "диджитал маркетинг" twitter.com/webholt/status…

17:33
@backendsecret @webholt всегда забавляло это немного пафосное "диджитал" по отношению к веб-студиям)

+1 twitter.com/_sashashakun/s…

17:37

Как часто вы, хм, рефакторите?

17:40

И в догонку:

17:43
@backendsecret Используя правило бойскаута (+ яростнее в C#, меньше в JS)

Это даже лучше, чем "каждый день" :) twitter.com/iloldhardly/st…

17:44

Прогоняете ли вы тесты перед мержом фичебранча в транк?

17:46
@backendsecret @webholt эволюция. Программисты->дизайн бюро->веб студия->диджитал агентство. А есть ещё фриланс и Лебедев.

И на этом их мирок обычно заканчивается. twitter.com/padna/status/6…

17:49

У вас нет тестов и...

17:51
@backendsecret Тесты? Какие тесты?
17:53
Астрологи объявили неделю голосований в @backendsecret

Так отписался же с утра - сегодня голосуем и собираем статистику :) twitter.com/carrot_jelly/s…

17:56
@backendsecret Что естественно, то не безобразно!
18:00
@backendsecret Очень хочется узнать, если можно :3
18:29

Вечер близко, сменим направление опросов.

18:32
@backendsecret постоянно, если натыкаюсь на любой ненравящийся код в процессе. Тестов хватает, чтобы быть уверенным, что ничего не сломается
18:33
@backendsecret Используете ли вы соглашение о стиле кода?
18:33

И раз уж такое дело:

18:35
@backendsecret а как выбрать сервисы для сурового энтерпрайза?

Просто сервисы. А мы просто продукт для энтерпрайза, например. twitter.com/de_gis/status/…

18:39

А эстеты с Wii U есть?

18:46
@backendsecret не обнаружил подходящих мне ответов в последних двух опросах. Со мной все будет хорошо?)

Можно написать текстом :) twitter.com/_sashashakun/s…

18:48
@backendsecret xbox live - RetranDeLarten, psn - RetranDeLarten, nintendo network - Retran, steam - retran_de_larten

Как-то кидал уже, пусть еще будет. Кидайте в ответ - ретвитну. twitter.com/retran/status/…

18:51
@backendsecret код без тестов == легаси.
Почти половина проголосовала за второй вариант, а потом жалуются в твиторах на ужасный код коллег
18:51
@backendsecret есть, но моя лежит в коробке из-за продолжительного ремонта (и неигранный splatoon с xenoblade x в той же коробке)

Ура, я не один такой :) twitter.com/chikiro_twi/st…

19:23
@backendsecret можно обменяться Nintendo ID 😊

Запостил чуть раньше. twitter.com/chikiro_twi/st…

19:36

Продолжим.

19:49

И например так

19:50

Стратегии 1

19:53

Стратегии 2

19:54

Тактика

19:56
@backendsecret сайтики((

диджитал значит :) twitter.com/Woundless/stat…

20:00
@backendsecret ничего не попишешь.... но не мне жаловаться)
20:14
@unel86 @backendsecret js можно использовать на бэк и на фронт. Но типичныe js-программисты, как правило, нe умeют в бэк. Это проблeма
20:22
@VovanR @backendsecret то есть "объект плюс список равно инт" вас не смущает?
20:22
@en_austin @backendsecret уже сто раз проходили. Вот у @bolknote популярно расписано: bolknote.ru/2015/06/16/~43…
20:32
@VovanR @en_austin @backendsecret спасибо, добавил в избранное, чтобы объяснять людям, почему я никогда не стану JS-разработчиком!
20:32
@hatarist @VovanR @backendsecret а вот пример каста выражения "+[]" в тип "number" подтверждает то, почему JS можно приравнять к мазохизму!
20:32
@VovanR @backendsecret спасибо, хорошее разъяснение, но это не отменяет того, что язык ужасно спроектирован!
20:37
@backendsecret народ дeлаeт фрeймворк бeз дeлeния на бэк и фронт speakerdeck.com/bbatsov/volt-r…
20:37
@VovanR @backendsecret ну зачем в языке нотация "пустой блок кода", серьезно?
20:37
@en_austin @backendsecret а зачем ее отсутствие?
20:37

На сегодня все, доброго вечера всем. Завтра поговорим о всем, что связано с базами данных.

20:45
@VovanR @backendsecret ок, давайте проще - где в реальном проекте может понадобиться обозначить блок кода, который ничего не делает?
20:52

"@anton_sunrise: @backendsecret lol, неужто я один играю EU4 и CK2?" Я играю, но статистика такая статистика.

20:56
@backendsecret вот простая шпаргалка twitter.com/nixcraft/statu…
21:32

Все-таки последний опрос (честно!) чтобы закончить тему.

21:33

Замечали ли вы, что хорошие разработчики чаще интересуются видеоиграми/настолками/фантастикой/etc?

21:34
@backendsecret Command & Conquer - one love!
21:39
@backendsecret а плохие спортом?

Логика подсказывает, что утверждение не включает и не исключает любые другие увлечения :) twitter.com/a_lithium/stat…

21:40
@backendsecret сомневаюсь в наличии корреляции здесь. :)

Компания intel, например, с вами не согласна - iq.intel.com/can-playing-vi… twitter.com/Radanisk/statu…

21:42
Представил, что веду твиттер @backendsecret и занимаюсь лишь сбором статистики по употреблению наркотиков и выявлению разных корреляций.

Записывайтесь следующим :) twitter.com/strizhechenko/…

21:47
@backendsecret нет времени играть, слишком много книг
21:47
@backendsecret да я в принципе уже собрал. Результат - ничего особенного, все норкоманы чертовы :)

twitter.com/strizhechenko/…

21:52
@backendsecret а у кого что и как в мониторинге используется? Поделитесь секретами. Логи всякие, графики, etc
22:05
@backendsecret у меня, например, все метрики в графит попадают, а логи - в эластик. И есть алерты, визуальные и СМС (и почта, наверное).
22:06
@ponitozhekoni для эластика нужно делать нормальную аггрегацию данных, это не движок для логов, это search engine @backendsecret
22:08
@backendsecret пытаюсь на @InfluxDB посмотреть, но всё никак времени не хватает
22:08
@ponitozhekoni эластик на хайлоаде взорвется. точнее, ты из него не вытащишь данных @backendsecret
22:08
@strangeqargo @backendsecret у каждого свой хайлоад, имхо. у меня пока справляется. цифры озвучишь?
22:16
@ponitozhekoni понятное дело, что эластик+кибана это модно, но я буквально вчера видел, как оно взорвалось на высоком рпс @backendsecret
22:16
@ponitozhekoni рекламная сеть, показы за день, эластик не вытащил по памяти. (я их предупреждал) @backendsecret
22:16
@ponitozhekoni ну так-то да, про у каждого свой хайлоад - ты прав, но лучше использовать инструменты заранее правильно @backendsecret
22:16
@strangeqargo @backendsecret кгм, извини, что неясно выразился. В эластик я валю логи, а потом ищу там то, что мне интересно
22:16
@ponitozhekoni ну может быть. все, конечно от срезов данных нужных и объема зависит, наверное. но я бы не делал так. @backendsecret
22:16
@strangeqargo @backendsecret так поделись - как правильно?
22:16
@strangeqargo @backendsecret что-то я не пойму, как именно не нужно делать. Собирать логи в эластике и задавать ему вопросы? Это неправильн?
22:16
@ponitozhekoni сырые gz-логи за нужный тебе период, подходящая бд-агреггация, сверху эластик. имхо. @backendsecret
22:19
@ponitozhekoni ну т.е. если тебя взломали или клиент ломится с воплем "этого не было" ты идешь в gz, стату и красоту по ELK @backendsecret
22:19
@ponitozhekoni сырые логи в хайлоаде в эластике имхо неправильно. @backendsecret
22:19
@ponitozhekoni @backendsecret statsd -> graphite -> grafana для метрик
22:26
@strangeqargo @backendsecret я понял. У нас цели немного разнятся. Я с помощью ELK сеть мониторю. И мне алерты сыпятся, если что-то не так
22:26
@ponitozhekoni ну т.е. появятся запросы с группировками или условиями, по которым он не влезет, он не silverbullet @backendsecret
22:26
@Nikitoz @backendsecret расскажи, плиз, зачем statsd в этой цепочке?
22:26
@ponitozhekoni тогда да, спасибо за идею кстати @backendsecret
22:27
@ponitozhekoni у нас на это заббиксы, но я в них не очень ) @backendsecret
22:27
@strangeqargo @backendsecret не, заббиксы не нужны
22:27
@strangeqargo @backendsecret сильвербуллета вообще в природе не существует. Потому я и задал свой вопрос
22:27
@backendsecret порнухой они интересуются в основном
22:27
@ponitozhekoni @strangeqargo @backendsecret это да, туда можно весь шлак сливать, но есть нюанс, оно с дикой силой заваливается иногда :)
22:28
@strangeqargo @backendsecret @ponitozhekoni эластик вообще говно, начнём с этого
22:32
@ivanenok @strangeqargo @backendsecret именно так я и делаю. А в шлаке порой бывает полезно покопаться
22:33
@ivanenok @strangeqargo @backendsecret а вот насчет "заваливается" - видимо я пока не дорос до таких масштабов. Нужны цифры? Озвучу
22:33
@SiliconBangalor @strangeqargo @backendsecret на этом и закончим. Предлагай своё решение
22:38
@SiliconBangalor @strangeqargo @backendsecret чуть выше написано "Поделитесь секретами". Видишь?
22:38
@SiliconBangalor @strangeqargo @backendsecret Что, кстати, предложишь вместо эластика?
22:38
@ponitozhekoni @strangeqargo @backendsecret у меня инхаус решение для этого, с разными хранилищами для оперативного мониторинга и анализа
22:38
@ponitozhekoni @strangeqargo @backendsecret но это серьезная инвестиция и не подходит всем
22:39
@backendsecret интересно, кто-нибудь на harbour.github.io работает?
23:03
@SiliconBangalor @strangeqargo @backendsecret у меня тоже есть инхаус-проект. Но что с ни будет, если я вдруг умру? Под машинупопаду, e.g.
23:09
@ponitozhekoni @strangeqargo @backendsecret вместо ничего не предложу, все говно, но вот это всё ещё актуально aphyr.com/posts/323-call…
23:09
@SiliconBangalor @strangeqargo @backendsecret у кого какие мысли? Давайте это обсудим
23:09
@SiliconBangalor это скорее правильная оптимизация, дешевле чем гиги памяти вкидывать в неправильный вариант@ponitozhekoni @backendsecret
23:09
@ponitozhekoni @strangeqargo @backendsecret тут не актуально — тут ещё тысяча бойцов, которые винтовку подхватят.
23:09
@SiliconBangalor @ponitozhekoni @backendsecret бгг да, инхаус не в смысле домашний
23:09
@ponitozhekoni @backendsecret чтобы снизить нагрузку на graphite
23:09
@Nikitoz @backendsecret а каким образом лишний демон снижает нагрузку на графит? пжлст
23:09
@ponitozhekoni @backendsecret кроме того легко будет заменить graphite на influx например(при необходимости). Без изменения кода приложения
23:09
@ponitozhekoni (если ты серьезно) in-house project - внутренняя корпоративная разработка @SiliconBangalor @backendsecret
23:09
@strangeqargo @SiliconBangalor @backendsecret ну да, именно так, внутренняя корпоративная
23:09
@Nikitoz @backendsecret расскажи, пожалуйста, про инфлюкс. подводные камни? что-то ещё? у меня руки до него не дошли
23:09
@ponitozhekoni ну вот значит тысяча бойцов и есть. вон президент самсунга, кстати, нашелся уже или нет? @SiliconBangalor @backendsecret
23:09
@SiliconBangalor @strangeqargo @backendsecret не, не подхватят, если доков нет
23:09
@ponitozhekoni (беззлобно) И НЕ В ТАКОМ ГОВНЕ РАЗБИРАЛИСЬ @SiliconBangalor @backendsecret
23:09
@ponitozhekoni надеюсь, ты свои задачи не на брэйнфаке пишешь, впрочем @SiliconBangalor @backendsecret
23:09
@ponitozhekoni @backendsecret аггрегирует метрики перед отправкой в graphite. Отсылает периодически, например раз в секунду(конфигурируемо)
23:09
@strangeqargo @SiliconBangalor @backendsecret нет, не на брэйнфаке. Почему ты спрашиваешь?
23:09
@Nikitoz @backendsecret спасибо. А можно числа какие-нибудь увидеть? Или графики
23:09
@ponitozhekoni после ебли с issue tracking и кодом обычно можно любой код понять. без IT плохо @SiliconBangalor @backendsecret
23:09
@Nikitoz @backendsecret Я считаю, что графит - это очень дорого по железу. Ищу варианты. Буду благодарен
23:09

# Четверг 72 твита

@backendsecret хочется верить в это (ответил любитель фантастики)
0:04
@backendsecret вопрос про цикл разработки: фиксированный release с номером VS continuous delivery из trunk/master ?

Зависит от ваших задач. Для "коробки" интереснее первый вариант, для сервисов - второй. twitter.com/PZabolotniy/st…

11:13
@backendsecret спасибо!
Ждём дискуссию о СУБД!
Мы PostgreSQL используем =)
11:49

Вот вам два полярных тезиса.

11:57

РСУБД - bloatware, слишком медленное, тяжелое, плохомасштабируемое и избыточное для большинства задач.

11:59

РСУБД - более-менее стандартизированное, проверенное на всех задачах и универсальное решение, знакомое многим разработчикам "из коробки".

12:02

Давайте представим, что мы выбираем хранилище для НОВОГО проекта и подискутируем.

12:04
@backendsecret слишком мало вводных о проекте, чтобы можно было делать выводы. Где-то и MongoDB будет хороша, а где-то Oracle не хватит)
12:09
@backendsecret 1. стоимость самого хранилища
12:12
@backendsecret На файлах всё. Чо бы нет?
12:12
@backendsecret => проверенные временем opensource проекты. Остается большой вопрос к скорости работы ...
12:12
@backendsecret Начнем с того что строим архитектуру так, что бы она минимально зависела от хранилища.
12:13

"@iloldhardly: @backendsecret Далее пишем 2-3 коннектора сразу к опенсорсным и популярным БД." Оверархитект же для типовой задачи.

12:14

Хотя мы в своем продукте умеем несколько субд и написали свой query-язык транслируемый в конкретный диалект SQL.

12:15
В чяте @backendsecret все вечно такие пиздатые архитекторы/проектировщики. А потом:
— Нахуя вы так делаете?
­— Нуу… Так вышло.
12:15
Мы проектировали в лучших традициях, как в чяте @backendsecret учили. А потом :: habrahabr.ru/post/276539/
12:16
@backendsecret Лично я взял монгу из-за schemaless концепции и удобных агрегатов + быстрота вхождения + удобный поиск по вложенным полям
12:17
@backendsecret ну и все вытекающие из хранения, считай, JSON документа как объекта
12:17
@backendsecret правда, иногда бывают страдания из-за отсутствия встроенных джойнов, но это решается через DBRef
12:17

Отлично, правильное ключевое слово - schemaless. Какие плюсы и минусы вы считаете важными?

12:18

Для меня самый важный плюс schemaless - простота расширения и обновления существующей базы.

12:19

И одновременно - это большой минус.

12:19
«Я ничего не делал, не устанавливал никакую монгу, оно само! Это не моё, мне подбросили!» :: @backendsecret
12:20
@backendsecret можно использовать гибридный подход. Mariadb поддерживает динамические колонки. И вместе с тем использовать стандартную схему
12:24

"@de_gis: @PZabolotniy @backendsecret мультимастер репликацию решали? Решили? Как?" Неа, не сталкивался :(

12:29
@backendsecret Берем Postgresql и когда нужно используем jsonb.
12:33
@backendsecret совсем без схемы не получится. Если ее нет в базе, то она будет у тебя в коде (и это сложнее поддерживать).

Согласен, что без схемы не получится. Не согласен совсем, что тяжелее поддерживать. twitter.com/stas_spiridono…

13:03

Не зря сейчас популярен code-first подход.

13:04

Тут есть мнение, что мы иногда слишком углубляемся в "хардкорный энтерпрайз" и это скучно. Стоит сменить тему или продолжим?

13:05
@backendsecret 50 оттенков CRUD.

Ну программирование в целом - это ж на кнопки давить. twitter.com/Onotoly/status…

13:07

Ок, вот вам немного "классики" - нужны или нет хранимые процедуры?

13:10
@strizhechenko @backendsecret Я о том, что вся логика на стороне БД. А всякие бэкэнды только запросы делают, получая готовые данные сразу.

ИМХО, не надо так. twitter.com/webholt/status…

13:28
@backendsecret если ты три раза менял/расширял структуру данных, то в коде нужно поддерживать три разных версии одновременно.

Зачем? twitter.com/stas_spiridono…

13:29
@backendsecret а как на счет хранимого тест-фреймворка для тестирования хранимых процедур? :)

Ну любители ХП говорят, что это не проблема. twitter.com/Onotoly/status…

13:30
@backendsecret нужны. Чтобы жизнь медом не казалась:)
13:30
@en_austin @backendsecret бля, бинго! в третью нормальную форму базу запихать и ебануть её в монгу ещё и профиль на write чисто запилить!
13:31
Троллинг или выпускник ПТУ? Не могу разобрать twitter.com/backendsecret/…

Всего лишь озвучиваю популярные мнения :) twitter.com/apoint/status/…

13:32
@backendsecret Но это лучше, чем однородную логику разносить по разным элементам.

Лучше. Но зачем если можно все положить на application server? twitter.com/webholt/status…

13:34
Подпишусь-ка я на @retran нынешнего @backendsecret.
Нравится мне его тонкость :D pic.twitter.com/0GIsqUIA9k
13:35
@backendsecret имхо, от ХП больше вреда, чем пользы.

Конечно! twitter.com/PZabolotniy/st…

13:36
@backendsecret я пошел в хранилище за объектом, но не знаю, какая структура мне вернется. Или как это должно быть разрулено по-нормальному?

Воо, мы плавно подходим к проблеме версионности схем :) twitter.com/stas_spiridono…

13:37

ИМХО, хранимые процедуры имеют право на существование, НО как механизм оптимизации отдельных боттлнеков.

13:38
@backendsecret прям респектую как ты выворачиваешь классические грабли и народ на диалог вполне идёт :)

Меня раскрыли :( twitter.com/ivanenok/statu…

13:43
@backendsecret я о том что это норм! нет вещания о космосе в котором не многие варятся, а по классическим граблям всегда бегать весело! :)

Я честно попытался про "космос" в понедельник, но... :( twitter.com/ivanenok/statu…

13:48

Итак, я знаю три варианта хранения схемы данных.

13:49

Первый - database first, схема уже в БД или в каких-то, часто вручную собираемых и обновляемых, DDL-скриптах.

13:51

Второй - schema-first, когда схема исходно формируется, например, в виде xml-ки (DTD, XSD, etc) и из нее уже генерируется код и скрипты.

13:53

Третий - code-first (model-first), когда схема задана классами с метаданными в коде и уже из них, часто рефлекшном в райнтайме...

13:55

...генерируется/обновляется база.

13:55

В случае со schema-less базами мы спокойно формируем схему в коде и не особо паримся обновлениями базы.

13:57

А вот в случае SQL-баз возникает вопрос - как правильно синхронизировать схему между кодом и непосредственно БД?

13:57
@backendsecret как так не паримся? Давай подробнее. Я про случай уже существующего продакшена, когда надо мигрировать данные…

Я тоже. twitter.com/stas_spiridono…

14:36
@backendsecret в девелопменте со схемалесс, конечно, проще
14:36
@ivanenok @backendsecret @en_austin погоди, так монгу же придумали троешники, неспособные в 3НФ базу свести, чтобы без всего этого :)
14:36
@de_gis @backendsecret @en_austin а используют отличники, которые не понимая сути и смысла, нормализуют данные ибо могут! :)
14:36
@backendsecret это должна делать процедура выкладки нового релиза!
14:36
@backendsecret так это же задача ORM и миграциий, разве нет?

Это именно задача миграций twitter.com/en_austin/stat…

14:36
@backendsecret скрипты обновления схемы БД и прочих справочников - неотъемлемая часть кода. БД такая же версионируемая как и ПО

Конечно. Вопрос в следующем - как гененировать эти самые скрипты? Руками? twitter.com/RinatGilmanov/…

14:37
@backendsecret и в какой момент обновляется БД, классы? при билде? имхо этот подход работает только когда у разработчика - собственная devБД

При деплое новой версии на продакшн, например. twitter.com/RinatGilmanov/…

14:37
@backendsecret при сложном шардировании слой доступа к данным можно на хранимках построить - pl/proxy например. Конечно bad practices это.
14:37
@backendsecret особенно они ценны своей переносимостью!
14:40

Мы например в инсталлере продукта сравниваем базу со схемой новой версии и на лету генерим апдейт-скрипт.

15:14
@backendsecret Не в инсталлере. В конфигурейшн виззарде.

Это уже наша внутренняя терминология. twitter.com/PaGrom/status/…

15:18

Сервисам проще - они могут например генерить скрипты в девелопмент-тайм, хранить их под версионником и накатывать при деплое.

15:21
@backendsecret это вроде бы работает когда столбцы добавляются, проблемы наступают когда их надо удалять, не тащить же все старые поля дальш

Конечно. twitter.com/Daemon_Freak/s…

16:19
@backendsecret а как быть с миграцией данных? Такие вещи только руками правильно можно делать

В теории можно придумать некоторый ограничительный набор правил (у нас так). Но на практике, да, надо руками делать. twitter.com/trytoheal/stat…

16:19
@backendsecret а что делаете в таких случаях? Накатываете тяжеловесный скрипт на прод базу или смиряетесь с неиспользуемыми полями в коде?

Пишем скрипт и включаем в дистрибутив. К счастью такое бывает ОЧЕНЬ редко. twitter.com/Daemon_Freak/s…

16:26
@backendsecret а сколько времени занимают такие скрипты? По моему опыту если база большая, то это может занимать приличное время

Ну мы продукт для SMB, поэтому базы не очень большие. twitter.com/Daemon_Freak/s…

16:32
@backendsecret некий инсталлятор приложения - ок. вопрос о разработке и про хранении схемы в xml-etc. Обновляем схему - генерится класс?

Да, именно так. twitter.com/RinatGilmanov/…

16:49
@backendsecret руками - другого решения не применял. но есть подход code first в EF и там миграции конфигурируются - почти скрипт руками

Опять же - это работает при определенных ограничениях на возможные изменения. twitter.com/RinatGilmanov/…

16:49
Пацаны, добавьте знаний, а?

github.com/mr-mig/going-t…

@backendsecret
@jsunderhood

20:20

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

@backendsecret ты наверное забыл указать, что вы храните в инсталлере миграции от версии 1 до версии N. Потому это и возможно, не?

Только для сложных случаев же. В 95% случаев - генерируем на месте. twitter.com/prosto_go/stat…

13:04

Добрый день, твиттер!

13:04
@prosto_go @backendsecret мы сравнивали не схему базы, а версию (хранили в таблице), и вели апгрейд-скрипты по версиям.
13:10
@backendsecret сложные случаи это что? Например, пусть будет строка в дату или адрес в координаты? Эти поисков оба сложные?

Когда сильно меняется схема хранения/типы данных/etc twitter.com/prosto_go/stat…

13:10
@backendsecret начнёт-ли дымиться php-разработчик, если его перекрестить?
18:59

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

18:59

Всем спасибо за приятную неделю!

18:59
@backendsecret Ого, посмотрите-ка, у него, видите ли, личная жизнь есть!

Все так :) twitter.com/webholt/status…

19:00

other