# Понедельник 150 твитов
lead software developer в маленькой продуктовой компании, разрабатывающей коммерческий фреймворк для erp-систем.
12:12Уже лет пять специализируюсь на энтерпрайзном бэкенде и разного рода API и сервисах.
12:12Так что на этой неделе будем говорить про REST, RESTful, SOAP, проблемах интеграции систем, мобильных бэкендах, etc
12:14@backendsecret о, давай: кто возвращает 200 вместо 4xx и 5xx, тот...?12:21
Не могу придумать цензурное слово :) Аналогично - коды ошибок вместо SOAPFault
12:26@gvsmirnov @backendsecret jsonRpc?12:26
ИМХО, json не лучший выбор для rpc вообще. Можем поспорить :)
12:28@backendsecret где можно почитать про бестпрактисы по структуре REST API12: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… @backendsecret13:08
Соответственно, если вы суровый энтерпрайз - вам нужен XML (или вообще SOAP). Если модный веб-стартап - например, protobuf.
13:09@backendsecret protobuf давно уже сосет
Внедрение protobuf на первых этапах дороже, чем json. Но народ как обычно идет по пути наименьшего сопротивления. twitter.com/strangeqargo/s…
13:14Кстати, если у вас XML - не забудьте проверить ваш фреймворк в целом и парсер конкретно на подверженность XXE.
13:18XXE (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 v214:03
@defly_self вот, что я хотел показать api.github.com14:20
даже в точке вхождения в API есть мануал,и это круто @flushdia @backendsecret
@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 это тяжко :) @backendsecret18: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.com20: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 ммм... Вот создатели считают наоборот. Да и тайпед-экторы были костылём. А их ещё не выпилили разве? :320: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/public13:51
@backendsecret покажите мне тех людей, кто проголосовал за #1! Я хочу на них посмотреть14:20
@Bubyakin пусть лучше сами признаются :) @backendsecret14: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 попиарь плиз twitter.com/provorov/statu…16:57
@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 @unel8610:46
не совсем как раньше, см. scastie.org/14672
Утро доброе, твиттер!
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 ИЗВЕРГ16:13
@backendsecret Сейчас будет борьба NodeJS-истов с остальными.
Как-то тя нынче на холивары тянет :D
Середина недели же :) twitter.com/POS_troi/statu…
16:13@POS_troi JS не бэке не обязательно Node. Я компилил шаблоны с помощью V8. Чем не применение JS на бэке? ;) @backendsecret16:14
@dcromster Не я всё-же понимаю JS в бэке это работа в бэке, а твой вариант больше просто вспомогательная замутя для деплоя :) @backendsecret16:15
@dcromster @POS_troi @backendsecret фантом еще есть, но все же, когда говорят про js на бэке, речь про ноду16:15
@backendsecret серверный javascript - это как ЛГБТ, в принципе существует, но вообще не нужен16:15
@POS_troi нифига не для деплоя. После V8 оно шло на фронт. @backendsecret16: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/1PUtagQ16: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/nmkA5Tb2RR17: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 … денег18:07
@backendsecret Очень хочется узнать, если можно :318: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 ничего не попишешь.... но не мне жаловаться)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@anton_sunrise @backendsecret ты не один )21:10
@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 да я в принципе уже собрал. Результат - ничего особенного, все норкоманы чертовы :)21:52
@backendsecret а у кого что и как в мониторинге используется? Поделитесь секретами. Логи всякие, графики, etc22:05
@backendsecret у меня, например, все метрики в графит попадают, а логи - в эластик. И есть алерты, визуальные и СМС (и почта, наверное).22:06
@ponitozhekoni для эластика нужно делать нормальную аггрегацию данных, это не движок для логов, это search engine @backendsecret22:08
@backendsecret пытаюсь на @InfluxDB посмотреть, но всё никак времени не хватает22:08
@ponitozhekoni эластик на хайлоаде взорвется. точнее, ты из него не вытащишь данных @backendsecret22:08
@strangeqargo @backendsecret у каждого свой хайлоад, имхо. у меня пока справляется. цифры озвучишь?22:16
@ponitozhekoni понятное дело, что эластик+кибана это модно, но я буквально вчера видел, как оно взорвалось на высоком рпс @backendsecret22:16
@ponitozhekoni рекламная сеть, показы за день, эластик не вытащил по памяти. (я их предупреждал) @backendsecret22:16
@ponitozhekoni ну так-то да, про у каждого свой хайлоад - ты прав, но лучше использовать инструменты заранее правильно @backendsecret22:16
@strangeqargo @backendsecret кгм, извини, что неясно выразился. В эластик я валю логи, а потом ищу там то, что мне интересно22:16
@ponitozhekoni ну может быть. все, конечно от срезов данных нужных и объема зависит, наверное. но я бы не делал так. @backendsecret22:16
@strangeqargo @backendsecret так поделись - как правильно?22:16
@strangeqargo @backendsecret что-то я не пойму, как именно не нужно делать. Собирать логи в эластике и задавать ему вопросы? Это неправильн?22:16
@ponitozhekoni сырые gz-логи за нужный тебе период, подходящая бд-агреггация, сверху эластик. имхо. @backendsecret22:19
@ponitozhekoni ну т.е. если тебя взломали или клиент ломится с воплем "этого не было" ты идешь в gz, стату и красоту по ELK @backendsecret22:19
@ponitozhekoni сырые логи в хайлоаде в эластике имхо неправильно. @backendsecret22:19
@ponitozhekoni @backendsecret statsd -> graphite -> grafana для метрик22:26
@strangeqargo @backendsecret я понял. У нас цели немного разнятся. Я с помощью ELK сеть мониторю. И мне алерты сыпятся, если что-то не так22:26
@ponitozhekoni ну т.е. появятся запросы с группировками или условиями, по которым он не влезет, он не silverbullet @backendsecret22:26
@Nikitoz @backendsecret расскажи, плиз, зачем statsd в этой цепочке?22:26
@ponitozhekoni тогда да, спасибо за идею кстати @backendsecret22:27
@ponitozhekoni у нас на это заббиксы, но я в них не очень ) @backendsecret22: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 @backendsecret23:09
@ponitozhekoni @strangeqargo @backendsecret тут не актуально — тут ещё тысяча бойцов, которые винтовку подхватят.23:09
@SiliconBangalor @ponitozhekoni @backendsecret бгг да, инхаус не в смысле домашний23:09
@strangeqargo @SiliconBangalor @backendsecret а в каком смысле?23:09
@ponitozhekoni @backendsecret чтобы снизить нагрузку на graphite23:09
@Nikitoz @backendsecret а каким образом лишний демон снижает нагрузку на графит? пжлст23:09
@ponitozhekoni @backendsecret кроме того легко будет заменить graphite на influx например(при необходимости). Без изменения кода приложения23:09
@ponitozhekoni (если ты серьезно) in-house project - внутренняя корпоративная разработка @SiliconBangalor @backendsecret23:09
@strangeqargo @SiliconBangalor @backendsecret ну да, именно так, внутренняя корпоративная23:09
@Nikitoz @backendsecret расскажи, пожалуйста, про инфлюкс. подводные камни? что-то ещё? у меня руки до него не дошли23:09
@ponitozhekoni ну вот значит тысяча бойцов и есть. вон президент самсунга, кстати, нашелся уже или нет? @SiliconBangalor @backendsecret23:09
@SiliconBangalor @strangeqargo @backendsecret не, не подхватят, если доков нет23:09
@ponitozhekoni (беззлобно) И НЕ В ТАКОМ ГОВНЕ РАЗБИРАЛИСЬ @SiliconBangalor @backendsecret23:09
@ponitozhekoni надеюсь, ты свои задачи не на брэйнфаке пишешь, впрочем @SiliconBangalor @backendsecret23:09
@strangeqargo @SiliconBangalor @backendsecret обнимемся23:09
@ponitozhekoni @backendsecret аггрегирует метрики перед отправкой в graphite. Отсылает периодически, например раз в секунду(конфигурируемо)23:09
@strangeqargo @SiliconBangalor @backendsecret нет, не на брэйнфаке. Почему ты спрашиваешь?23:09
@Nikitoz @backendsecret спасибо. А можно числа какие-нибудь увидеть? Или графики23:09
@ponitozhekoni после ебли с issue tracking и кодом обычно можно любой код понять. без IT плохо @SiliconBangalor @backendsecret23:09
@Nikitoz @backendsecret Я считаю, что графит - это очень дорого по железу. Ищу варианты. Буду благодарен23:09
@backendsecret WZ210023:09
# Четверг 72 твита
@backendsecret хочется верить в это (ответил любитель фантастики)0:04
В ленту @backendsecret habr.ru/p/276539/10:23
@backendsecret вопрос про цикл разработки: фиксированный release с номером VS continuous delivery из trunk/master ?
Зависит от ваших задач. Для "коробки" интереснее первый вариант, для сервисов - второй. twitter.com/PZabolotniy/st…
11:13@backendsecret спасибо!11:49
Ждём дискуссию о СУБД!
Мы PostgreSQL используем =)
Вот вам два полярных тезиса.
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 правда, иногда бывают страдания из-за отсутствия встроенных джойнов, но это решается через DBRef12:17
Отлично, правильное ключевое слово - schemaless. Какие плюсы и минусы вы считаете важными?
12:18Для меня самый важный плюс schemaless - простота расширения и обновления существующей базы.
12:19И одновременно - это большой минус.
12:19«Я ничего не делал, не устанавливал никакую монгу, оно само! Это не моё, мне подбросили!» :: @backendsecret12: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.13:35
Нравится мне его тонкость :D pic.twitter.com/0GIsqUIA9k
@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Пацаны, добавьте знаний, а?20:20
# Пятница 10 твитов
В ленту @jsunderhood и @backendsecret ;) twitter.com/kalduzov/statu…0:29
@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Подписывайтесь на @retran, facebook.com/andrewvasilyev и ru.linkedin.com/in/andrew-vasi…
19:00@backendsecret Ого, посмотрите-ка, у него, видите ли, личная жизнь есть!
Все так :) twitter.com/webholt/status…
19:00# Ссылки
other
- http://www.infoq.com/minibooks/emag-03-2010-rest
- https://visualstudiomagazine.com/articles/2014/09/01/web-api-documentation-tools.aspx?m=1
- http://shop.oreilly.com/product/mobile/0636920021575.do
- http://blog.2partsmagic.com/restful-uri-design/
- https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
- https://aws.amazon.com/ru/api-gateway/faqs/
- https://en.wikipedia.org/wiki/Standardized_service_contract
- https://capnproto.org/index.html
- https://api.github.com/
- http://www.slideshare.net/chris.e.richardson/developing-eventdriven-microservices-with-event-sourcing-and-cqrs-phillyete
- http://getakka.net/
- https://pechkin-mail.ru/
- https://producteev.com/
- http://www.30daysofgettingresults.com/
- https://dev.twitter.com/rest/public
- https://goo.gl/9eACAz
- https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
- http://blog.langer.eu/2014/09/02/literature.html
- https://github.com/TomasTomecek/sen
- https://github.com/mr-mig/going-to-production
- http://cyclowiki.org/wiki/%D0%92%D1%80%D0%B0%D0%B6%D0%B4%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D1%82%D1%83%D0%BF%D0%BE%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8_%D0%B8_%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D0%B8%D0%BA%D0%B0%D0%BC%D0%B8
- https://youtu.be/p5NOI52MExU?t=28m55s
- http://scastie.org/14672
- http://www.nooooooooooooooo.com/
- http://bit.ly/1PUtdcm
- http://bit.ly/1PUtagQ
- http://bolknote.ru/2015/06/16/~4323#42
- https://speakerdeck.com/bbatsov/volt-ruby-web-devlopment-recharged-railsclub-2015
- http://iq.intel.com/can-playing-videogames-be-good-for-you/
- https://harbour.github.io/
- https://aphyr.com/posts/323-call-me-maybe-elasticsearch-1-5-0
- http://habr.ru/p/276539/
- https://habrahabr.ru/post/276539/
- https://www.facebook.com/andrewvasilyev
- https://ru.linkedin.com/in/andrew-vasilyev-b9a92721