Pull to refresh
1
0
Send message

Стажёр Вася и его истории об идемпотентности API

Reading time11 min
Views239K

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


Меня зовут Денис Исаев, и я руковожу одной из бэкенд групп в Яндекс.Такси. Сегодня я поделюсь с читателями Хабра описанием проблем, которые могут возникнуть, если не учитывать идемпотентность распределенных систем в своем проекте. Для этого я выбрал формат вымышленных историй о стажёре Васе, который только-только учится работать с API. Так будет нагляднее и полезнее. Поехали.


image

Читать дальше →
Total votes 219: ↑216 and ↓3+213
Comments163

Приглашая опытного разработчика, вы не покупаете, а продаёте

Reading time7 min
Views58K
Несомненно, нанять опытного программиста сложно. Но я не верю, что рынок полностью иссяк. На протяжении карьеры я работал со многими командами, которые делятся на две категории: те, которые никак не могут нанять опытных разработчиков, и те, которые привлекают их с лёгкостью. На самом деле у второй категории вообще не было проблем с наймом.

Есть много причин, почему некоторым не удаётся привлечь талантов. Однако все команды, которые делали это с лёгкостью, поняли один простой факт о текущей ситуации на рынке:

При найме сеньоров не компания выбирает кандидата, а кандидат выбирает компанию.

Проще говоря:

Приглашая опытного разработчика, вы не покупаете, а продаёте.
Читать дальше →
Total votes 146: ↑144 and ↓2+142
Comments186

Все, что вы хотели знать об обработке запросов, но стеснялись спросить

Reading time12 min
Views19K

Что такое сетевой сервис? Это программа, которая принимает входящие запросы по сети и обрабатывает их, возможно, возвращая ответы.


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


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


В статье рассмотрены такие подходы как пул процессов/потоков, событийно-ориентированная обработка, half sync/half async паттерн и многие другие. Приводятся многочисленные примеры, рассматриваются плюсы и минусы подходов, их особенности и области применения.

Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments5

Текстовый редактор — это вам не высшая математика, тут думать надо

Reading time17 min
Views97K
Современные текстовые редакторы умеют не только бибикать и не давать выйти из программы. Оказывается, внутри них кипит очень сложный метаболизм. Хотите узнать, какие ухищрения предпринимаются для быстрого пересчета координат, как к тексту приделываются стили, фолдинги и софтврапы и как это всё обновляется, при чем тут функциональные структуры данных и очереди с приоритетами, а также как обманывать пользователя — добро пожаловать под кат!



В основе статьи — доклад Алексея Кудрявцева с Joker 2017. Алексей уже лет 10 пишет Intellij IDEA в JetBrains. Под катом вы найдете видео и текстовую расшифровку доклада.
Читать дальше →
Total votes 208: ↑206 and ↓2+204
Comments189

Ура! Это была не паранойя

Reading time3 min
Views100K

В прошлом посте про розницу кое-кому было жутко от того, что можно целить рекламу средств от насморка в тех, кто обычно ходил в офис, а вот уже 10 минут как взял и не пошёл. В общем, последние пару лет я счастлив, что, например, всю сознательную жизнь не верил карточкам и расплачивался ими только в крайних случаях.

Сейчас расскажу пару примеров. Кое-где юрист посоветовал мне формулировки помягче, поэтому дальше вся история — моё личное мнение, возможно, мало связанное с реальным миром. Многое мне вообще приснилось.

Итак, как я уже рассказывал, что в моём сне можно таргетировать людей по состоянию счёта и покупкам. Например, таргет: «есть дети 6 лет» может выглядеть как «вот по этому списку терминалов сетей делал частые покупки 5 лет назад». Таргет «живёт в этом районе и имеет больше 100 тысяч рублей на счету» — по точкам, где часто покупает, и если таких кластеров два — ближе к окраине.
Читать дальше →
Total votes 169: ↑158 and ↓11+147
Comments380

Вы — не Google

Reading time7 min
Views103K
Мы, программисты, иногда почему-то сходим с ума. Причём по каким-то совершенно нелепым причинам. Нам нравится думать о себе, как о супер-рациональных людях, но когда дело доходит до выбора ключевой технологии нового продукта, мы погружаемся в какое-то безумие. Вдруг оказывается, что кто-то слышал что-то об одной классной вещи, а его коллега читал комментарий о другой на Хабре, а третий человек видел пост в блоге о ещё чём-то похожем… и вот мы уже пребываем в полнейшем ступоре, беспомощно барахтаясь в попытках выбора между совершенно противоположными по своей сути системами, уже и забыв, что мы вообще пытаемся выбрать и почему.

Рациональные люди не принимают решения таким образом. Но именно так программисты часто решают использовать что-то вроде MapReduce.

Вот как комментировал этот выбор Joe Hellerstein своим студентам (на 54-той минуте):

Дело в том, что в мире сейчас есть где-то 5 компаний, обрабатывающие данные подобных объёмов. Все остальные гоняют все эти данные туда-сюда, добиваясь отказоустойчивости, которая им на самом деле не нужна. Люди страдают гигантоманией и гугломанией где-то с середины 2000-ых годов: «мы сделаем всё так, как делает Google, ведь мы же строим один из крупнейших (в будущем) сервисов по обработке данных в мире!»

image

Сколько этажей в вашем датацентре? Google сейчас строит четырёхэтажные, как вот этот в Оклахоме.
Читать дальше →
Total votes 252: ↑249 and ↓3+246
Comments197

Применение паттерна observer в Redux и Mobx

Reading time6 min
Views17K


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


class Observable {
  listeners = new Set();
  subscribe(listener){
    this.listeners.add(listener)
  }
  unsubscribe(listener){
    this.listeners.delete(listener)
  }
  notify(){
    for(const listener of this.listeners){
       listener();
    }
  }
}

В redux-е этот паттерн применяется без всяких изменений  — пакет "react-redux" предоставляет функцию connect которая оборачивает компонент и при вызове componentDidMount вызовет subscribe() метод у Observable, при вызове componentWillUnmount()  вызовет  unsubscribе() а dispatch() просто вызовет метод trigger() который в цикле вызовет всех слушателей где каждый в свою очередь вызовет mapStateToProps() и потом в зависимости от того изменилось ли значение  —  вызовет setState() на самом компоненте. Все очень просто, но платой за такую простоту реализации является необходимость работать с состоянием иммутабельно и нормализировать данные а при изменении отдельного объекта или даже одного свойства оповещать абсолютно всех подписчиков-компонентов даже если они никак не зависят от той измененной части состояния и при этом в компоненте-подписчике необходимо явно указывать от каких частей стора он зависит внутри mapStateToProps()

Читать дальше →
Total votes 12: ↑12 and ↓0+12
Comments0

Вопросы для собеседования бэкенд-разработчика

Reading time16 min
Views194K
Этот список появился как личная памятка по темам, которые я обсуждал с коллегами и друзьями и в которых хотел разобраться поглубже…

Я не большой любитель задавать технические вопросы на собеседованиях: по мне так лучше посидеть с кандидатом (или кандидаткой) за клавиатурой над каким-то реальным кодом, реальной проблемой — и целый день заниматься парным программированием, желательно поочерёдно с остальными членами команды. Но я считаю, что некоторые технические вопросы могут быть хорошей отправной точкой для начала увлекательного и приятного разговора и позволят глубже узнать друг друга.

В этом репозитории собран ряд вопросов, связанных с серверной частью, которые можно использовать при проверке потенциальных кандидатов. Ни в коем случае не рекомендуется задавать все вопросы одному кандидату: это займет несколько часов и вообще не имеет смысла, потому что они охватывают слишком широкий спектр тем. Никто не может знать всего. Выберите наиболее актуальный раздел и самые интересные вопросы, чтобы развернуть беседу.
Читать дальше →
Total votes 83: ↑61 and ↓22+39
Comments274

Хакинтош: разворачиваем macOS Sierra на Intel-PC подробно и понятно

Reading time13 min
Views1.1M
ПРОЧТИ МЕНЯ ПОЖАЛУСТО

Если вы НЕ МОЖЕТЕ распаковать файлы на флешку, пожалуйста, отойдите от кливиатуры и срочно прочитайте книгу «Компьютер для чайников: подробное пособие как пользоваться ПК»!!!



1. Все файлы залиты на МЕГУ. Кто испытывает с ней проблемы — в комментариях перезалили на торрент.
2. Пожалуйста, не спрашивайте меня про установку Мака на ноутбуки. Прошу вас. Пожалуйста. Это очень геморройный процесс. Поставьте себе убунту и подключите тему Мака. Тот же экспириенс получите
3. Я на хабре редко отвечаю, пишите в вк по всем вопросам.


Данный мануал/гайд/etc написан для тех, кому лень собирать по кускам ту или иную информацию об установке «мака» на PC, все понятно и по полочкам.
Читать дальше →
Total votes 68: ↑65 and ↓3+62
Comments146

Лекции Технополиса. Проектирование высоконагруженных систем (осень 2017)

Reading time5 min
Views51K


Мы начинаем публиковать курсы лекций Технополиса — образовательного проекта команды Одноклассников в Санкт-Петербургском Политехническом университете Петра Великого. Создание высоконагруженных приложений — это не только проектирование и написание кода, но и огромное количество других аспектов на всём протяжении жизненного цикла продукта. Мы пройдём по всему процессу создания и использования высоконагруженной системы. Особое внимание будет уделено особенностям эксплуатации, сетям, балансировке нагрузки, иерархии памяти, повседневным инструментам. Также поговорим о мониторинге, аудите и многом другом. Лекции курса читает команда экспертов под руководством ведущего разработчика в Одноклассниках Вадима Цесько.

Список лекций:

  1. Введение (Вадим Цесько incubos)
  2. Типовые архитектуры (Александр Христофоров)
  3. Эксплуатация (Илья Щаников)
  4. Сетевой стек (Дмитрий Самсонов dmitrysamsonov)
  5. Балансировка (Андрей Домась)
  6. Процессоры и память (Алексей Горбов)
  7. Хранилища данных (Сергей Егоричев)
  8. JVM (Андрей Паньгин apangin)
  9. Мониторинг (Сергей Шарапов Sharapoff)
  10. Облака (Леонид Талалаев)

Total votes 77: ↑75 and ↓2+73
Comments14

Технический долг и места его обитания

Reading time3 min
Views21K

Эта статья — вольный пересказ доклада, который я посетил на конференции GOTO Berlin 2017: A Crystal Ball to Prioritize Technical Debt.

Изображения из доклада и права на них принадлежат автору @AdamTornhill.

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

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

Если эти вопросы неоднократно у вас возникали, прошу под кат.
Читать дальше →
Total votes 35: ↑34 and ↓1+33
Comments22

Приватность: рождение и смерть. 3000 лет истории приватности в картинках

Reading time16 min
Views36K


В эпоху ИТ и быстрого развития технологий понятие «приватности» превратилось в фикцию. Глобальные информационные сети и множество сервисов незаметно собирают о пользователях терабайты данных, да и сами пользователи постоянно выкладывают свою жизнь на всеобщее обозрение в соцсетях. Но всё же многие из нас считают свои компьютеры, смартфоны и поведение в сети «приватными», или хотя бы стремятся к этому. А как вообще появилось понятие «приватности» в человеческой культуре?
Total votes 50: ↑46 and ↓4+42
Comments53

TeamLead — наше все: самые популярные доклады с HighLoad++ 2017. Часть 1

Reading time6 min
Views22K
На HighLoad++ 2017 было много интересных докладов, посвященных практически всем аспектам пути тимлида — от поиска того самого человека среди обычных разработчиков и до деталей работы и последующего движения к руководителю более высокого уровня вплоть до CTO.

Для этого обзора мы выбрали восемь наиболее популярных выступлений.


Total votes 34: ↑31 and ↓3+28
Comments2

Задачи планирования и программирование в ограничениях

Reading time8 min
Views25K
Когда у тебя в запасе много популярных инструментов вроде JAVA, Python, Ruby, PHP, C#, C++ и других, чувствуешь себя почти всемогущим. Стандартный подход в разработке рулит. Но только до тех пор, пока не столкнешься с определенным типом задач.

 
Подумайте, как правильно написать программу, которая оптимально…

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

image
Читать дальше →
Total votes 19: ↑19 and ↓0+19
Comments5

Node.js и переход с PHP на JavaScript

Reading time9 min
Views61K
Больше десяти лет я был PHP-разработчиком, но недавно перешёл на JavaScript, используя его серверные и клиентские возможности. До этого я уже был знаком с JS. Сначала работал с jQuery, потом освоил Angular, и, наконец, начал пользоваться React.

Когда я начинал писать на PHP, я встраивал его в HTML-файлы. Получался не код, а полный бардак. Поэтому, для того, чтобы привести мои разработки в приличный вид, я начал пользоваться фреймворками, в частности, ZF1 и ZF2. Через некоторое время подход, при использовании которого начинают разработку с API, привёл к тому, что у меня оказался сервер, состоящий из сгенерированных REST API и из нескольких сотен строк моего собственного кода.



Так как лишь небольшая и не самая важная часть наших проектов была написана на PHP, возник вопрос о том, можем ли мы от него избавиться. И, если можем, чего нам это будет стоить, и что мы от этого получим. В этом материале я поделюсь опытом с теми, кто, как и я, хочет, понимая, что и зачем он делает, уйти из мира PHP и встать под знамёна JavaScript во всех его проявлениях.

Сегодня я расскажу, в основном, о своём путешествии с серверной стороны PHP на серверную сторону JS в виде Node.js. Здесь я не буду рассказывать о Webpack, React и о других клиентских технологиях JS.
Читать дальше →
Total votes 65: ↑52 and ↓13+39
Comments115

React Native: от простой анимации до интерактивной на скорости 60 FPS

Reading time15 min
Views21K

Необходимость в обмене данными между UI и JS процессами в React Native неизбежно сказывается на производительности препятствуя выполнению JavaScript анимации с высокой частотой кадров. Современные библиотеки, такие как Animated, решают эту проблему минимизацией количества сообщений, передаваемых через мост. Следующий шаг — это элементы управления, которые непрерывно реагируют на жесты пользователя. Как мы можем анимировать их со скоростью 60 кадров в секунду?

Осторожно, Траффик!
Total votes 13: ↑13 and ↓0+13
Comments2

Типичное использование Observable объектов в Angular 4

Reading time5 min
Views78K

Представляю вашему вниманию типичные варианты использования Observable объектов в компонентах и сервисах Angular 4.



Подписка на параметр роутера и мапинг на другой Observable


Задача: При открытии страницы example.com/#/users/42, по userId получить данные пользователя.


Решение: При инициализации компоненты UserDetailsComponent мы подписываемся на параметры роутера. То есть если userId будет меняться — будер срабатывать наша подписка. Используя полученный userId, мы из сервиса userService получаем Observable с данными пользователя.


// UserDetailsComponent

ngOnInit() {
  this.route.params
    .pluck('userId') // получаем userId из параметров
    .switchMap(userId => this.userService.getData(userId))
    .subscribe(user => this.user = user);
}

Читать дальше →
Total votes 21: ↑21 and ↓0+21
Comments12

Веб-камера, Node.js и OpenCV: делаем систему распознавания лиц

Reading time5 min
Views40K
Компьютерное зрение — это, в двух словах, набор технологий, в основу которых положены принципы человеческого зрения, которые позволяют компьютеру видеть и понимать то, что он видит. На первый взгляд вроде бы просто, но на самом деле это далеко не так.



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

Как говорится: «лучше один раз увидеть», в данном случае — увидеть, как Amazon использует эту технологию для создания торговых центров нового поколения. Потрясающе, правда?

Если вы хотите приобщиться к технологиям компьютерного зрения — предлагаю поговорить о том, как создать интерактивную систему распознавания лиц с использованием обычной веб-камеры, Node.js и OpenCV.
Читать дальше →
Total votes 27: ↑26 and ↓1+25
Comments6

11 вещей которые я узнал, читая спецификацию flexbox

Reading time8 min
Views101K

Я всегда считал, что с flexbox довольно легко работать — глоток свежего воздуха после стольких лет float'ов и clearfix'ов.


Правда недавно я обнаружил что борюсь с ним; что-то растягивалось, когда я не думал, что оно должно тянуться. Я поправил здесь, другой элемент сжался. Я починил это, что-то другое ушло за экран. Какого Джорджа Буша тут происходит?


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


Как бы там ни было, я решил что пора вести себя как взрослый разработчик и выучить flexbox должным образом. Но вместо того, чтобы прочитать 10 очередных блог-постов, я решил отправиться прямиком к исходнику и прочитать The CSS Flexible Box Layout Module Level 1 Spec


Вот хорошие отрывки.


Читать дальше →
Total votes 66: ↑62 and ↓4+58
Comments33

Формы и кастомные поля ввода в Angular 2+

Reading time10 min
Views28K
imageМеня зовут Павел, я фронтенд-разработчик Tinkoff.ru. Наша команда занимается разработкой интернет-банка для юридических лиц. Фронтенд наших проектов был реализован с применением AngularJS, с которого мы перешли, частично с использованием Angular Upgrade, на новый Angular (ранее позиционировался как Angular 2).

Наш продукт предназначен для юридических лиц. Такая тематика требует множества форм со сложным поведением. Поля ввода включают в себя не только стандартные, реализованные в браузерах, но и поля с масками (например, для ввода телефона), поля для работы с тегами, ползунки для ввода числовых данных, различные выпадающие списки.

В этой статье мы заглянем «под капот» реализации форм в Angular и разберёмся, как создавать кастомные поля ввода.

Предполагается, что читатель знаком с основами Angular, в частности, со связыванием данных и внедрением зависимостей (ссылки на официальные гайды на английском языке). На русском языке со связыванием данных и основами Angular в целом, включая работу с формами, можно познакомиться здесь. На Хабрахабре уже была статья про внедрение зависимостей в Angular, но нужно учитывать, что написана она была задолго до выхода релизной версии.
Читать дальше →
Total votes 15: ↑14 and ↓1+13
Comments14

Information

Rating
Does not participate
Registered
Activity