Как стать автором
Обновить
14
0

Пользователь

Отправить сообщение

Профилирование и оптимизация программ на Go

Время на прочтение25 мин
Количество просмотров84K

Введение


В этой статье я расскажу, как профилировать и оптимизировать приложения на языке Go с использованием встроенных и общих инструментов, доступных в ОС Linux.

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

Я привел такое определение, чтобы сразу отсечь вопросы некорректной работы приложения. В этой статье мы не будем говорить о проблемах мультитредового программирования, о дата-рейсах (англ. data race), о поиске ошибок (англ. debugging). Для всего этого в Go есть свои утилиты и подходы, но оставим эту тему на будущее.



Читать дальше →
Всего голосов 47: ↑45 и ↓2+43
Комментарии18

Ограничение скорости обработки запросов, или как не устроить DDoS-атаку на своего клиента

Время на прочтение10 мин
Количество просмотров31K

Иногда при разработке highload-продукта возникает ситуация, когда надо обработать не максимально большое количество запросов, а наоборот — ограничить количество запросов в единицу времени. В нашем случае это количество отправляемых push-уведомлений конечным пользователям. Подробнее об алгоритмах rate limiting, их плюсах и минусах — под катом.


Читать дальше →
Всего голосов 16: ↑16 и ↓0+16
Комментарии4

Планирование в Go: Часть II — Планировщик Go

Время на прочтение11 мин
Количество просмотров33K
Привет, Хабр! Это второй пост в серии из трех частей, которая даст представление о механике и семантике работы планировщика в Go. Этот пост посвящен планировщику Go.

В первой части этого цикла я объяснил аспекты планировщика операционной системы, которые, на мой взгляд, важны для понимания и оценки семантики планировщика Go. В этом посте я объясню на семантическом уровне, как работает планировщик Go. Планировщик Go — сложная система, и мелкие механические детали не важны. Важно иметь хорошую модель того, как все работает и ведет себя. Это позволит вам принимать лучшие инженерные решения.
Читать дальше →
Всего голосов 13: ↑12 и ↓1+11
Комментарии4

50 оттенков Go: ловушки, подводные камни и распространённые ошибки новичков

Время на прочтение44 мин
Количество просмотров212K


Go — простой и забавный язык. Но в нём, как и в любых других языках, есть свои подводные камни. И во многих из них сам Go не виноват. Одни — это естественное следствие прихода программистов из других языков, другие возникают из-за ложных представлений и нехватки подробностей. Если вы найдёте время и почитаете официальные спецификации, вики, почтовые рассылки, публикации в блогах и исходный код, то многие из подводных камней станут для вас очевидны. Но далеко не каждый так начинает, и это нормально. Если вы новичок в Go, статья поможет сэкономить немало часов, которые вы бы потратили на отладку кода. Мы будем рассматривать версии Go 1.5 и ниже.
Читать дальше →
Всего голосов 80: ↑76 и ↓4+72
Комментарии270

Оптимизация микросервиса на Go на живом примере

Время на прочтение17 мин
Количество просмотров20K

Всем привет. Меня зовут Нещадин Иван, и я расскажу про оптимизацию одного из микросервисов Авито на Go. История построена вокруг различных инструментов, которые доступны в языке, и пойдёт от простых примеров к более сложным.


Читать дальше →
Всего голосов 41: ↑37 и ↓4+33
Комментарии41

Как мы TLS Fingerprint обходили…

Время на прочтение6 мин
Количество просмотров28K

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

Видимо сайт добавил наш прокси в blacklist, но в нашем пуле около 100к проксей, все прокси попали в blacklist?

Попробовав запустить парсер на другом сервере, HTTP запросы возвращали корректные данные. Спустя неделю, ситуация повторилась.

Мы также попробовали отправить запрос на локальной машине с "забанненым" прокси, на удивление, данные пришли корректные, но отправив запрос с этим же прокси на сервере, получили фейковые. Отсюда вытекает вопрос: как сайт определяет, что запросы посылаются с одной машины, если используются прокси?

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

Читать далее
Всего голосов 40: ↑36 и ↓4+32
Комментарии37

Текстовая версия доклада «Actors vs CSP vs Tasks...» с C++ CoreHard Autumn 2018

Время на прочтение23 мин
Количество просмотров9.7K
В начале ноября в Минске прошла очередная посвященная языку C++ конференция C++ CoreHard Autumn 2018. На ней был сделан капитанский доклад «Actors vs CSP vs Tasks...», где речь шла о том, как может выглядеть в C++ применение более высокоуровневых, чем «голая многопоточность», моделей конкурентного программирования. Под катом преобразованная в статью версия этого доклада. Причесанная, местами подправленная, местами дополненная.

Пользуясь случаем хочется выразить благодарность сообществу CoreHard за организацию очередной большой конференции в Минске и за предоставленную возможность выступить. А также за оперативную публикацию видеозаписей докладов на YouTube.

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

Примечание: в оригинальной презентации к докладу были обнаружены ошибки и опечатки, поэтому в статье будут использованы слайды из обновленной и отредактированной версии, которую можно найти в Google Slides или на SlideShare.

«Голая многопоточноть» — это зло!


Начать нужно с многократно повторенной банальности, которая, тем не менее, все еще остается актуальной:
Многопоточное программирование на C++ посредством голых нитей, mutex-ов и condition variables – это пот, боль и кровь.
Читать дальше →
Всего голосов 22: ↑20 и ↓2+18
Комментарии61

Как не наступать на грабли в Go

Время на прочтение10 мин
Количество просмотров89K

Этот пост является версией моей же англоязычной статьи "How to avoid gotchas in Go", но слово gotcha не переводится на русский, поэтому я буду использовать это слово как без перевода, так и немного непрямой вариант — "наступать на грабли".


Gotcha — корректная конструкция системы, программы или языка программирования, которая работает, как описано, но, при этом, контринтуитивна и является причиной ошибок, поскольку её легко использовать неверно.

В языке Go есть несколько таких gotchas и есть немало хороших статей, которые их подробно описывают и разъясняют. Я считаю, что эти статьи очень важны, особенно для новичков в Go, поскольку регулярно вижу людей, попадающихся на те же грабли.


Но один вопрос меня мучал долгое время — почему я сам никогда не делал этих ошибок? Серьезно, самые популярные из них, вроде путаницы с nil-интерфейсом или непонятного результата при append()-е слайса — в моей практике никогда не были проблемой. Каким-то образом мне повезло обойти эти подводные камни с первых дней своей работы с Go. Что же мне помогло?


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

Читать дальше →
Всего голосов 46: ↑38 и ↓8+30
Комментарии9

Исповедь CTO: путь развития технического директора в стартапе

Время на прочтение9 мин
Количество просмотров4.6K
image

О важности саморазвития основателей в быстрорастущих стартапах написано немало. Как правило, тексты подобной тематики посвящены роли CEO. Общие советы по лидерству могут быть полезны и для других ролей, но мне не удалось найти материалов, которые могли бы помочь основателям-технарям. После прочтения кучи форм S-1 стало ясно, что очень трудно найти CTO с нуля прошедших путь от MVP до IPO (при этом с основателями-CEO ситуация прямо противоположная). Мне этот факт показался интригующим – я решил копнуть глубже. Мне хотелось докопаться до сути и причин такого положения дел. Также меня это немного напрягает: а что я если я не способен расти быстро? Мне стоит разобраться, пока не возникли реальные проблемы! Я хочу быть тем CTO, который сделает RevenueCat публичной компанией! (1)

Неужели основателям, не занимающим должность генерального директора, сложнее быстро развиваться? Может быть, дело в том, что у CEO обычно есть значительная поддержка? Как бы то ни было, всему есть свои причины. Возможно, я просто неправильно ставил вопрос. После разговоров со многими основателями-CTO стало ясно: стандартного определения технического директора не существует. Обязанности человека на этой должности могут полностью меняться в зависимости от компании и этапа ее развития. Вероятно, поначалу технический директор привносит заметный личный вклад, но вскоре все может поменяться. Опыт разных людей может значительно отличаться. К сожалению, у меня нет ответов для основателей, не являющихся CEO. Возможно, у меня нет ответов и для тех, кто стал CTO впервые. Как бы то ни было, я подумал, что будет полезно поразмышлять над тем, что я узнал, и как изменились мои обязанности за 3 года работы в RevenueCat.
Читать дальше →
Всего голосов 21: ↑17 и ↓4+13
Комментарии1

Разработка приложения для обработки видео: на что обратить внимание и при чем тут зумеры

Время на прочтение7 мин
Количество просмотров2.7K

Привет, Хабр!

Меня зовут Алексей Жуков. Более 10 лет вместе с командой разработчиков я занимаюсь созданием и дизайном приложений и интернет-платформ. В статье хочу поделиться своим видением трендов на рынке видеоконтента. Разберемся в том, что будет после пандемии и что учесть при создании приложения для зумеров.

Читать далее
Всего голосов 9: ↑6 и ↓3+3
Комментарии0

Что делать с неэффективным сотрудником, который считает, что он отлично справляется

Время на прочтение4 мин
Количество просмотров21K
image


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

Почти все руководители оказывались в неловком положении, когда в их команде работал человек, который считал, что он справляется прекрасно, хотя на самом деле его работа была просто нормальной (а может даже и хуже). Я занимаюсь консалтингом уже 30 лет, и эта проблема встречается наиболее часто (а также она истощает сильнее любых других).

Что же вызывает несоответствие между реальной производительностью сотрудников и тем, как они воспринимают свои успехи? Порой члены команды не получают ресурсы и обратную связь, необходимые им для развития и повышения продуктивности. Другие же просто не могут признать тот факт, что они едва справляются. Какой бы ни была причина, если руководители не смогут исправить положение дел, работа отстающего сотрудника не улучшится, а команда потеряет ценного члена, который мог бы процветать, если бы ему была оказана нужная поддержка. Существует риск того, что руководитель будет мириться с некачественной работой, а компетентные сотрудники просто потеряют мотивацию и уйдут. Если вам удастся выяснить причину того, почему у неэффективного сотрудника столь завышенные представления о своей работе, эти пять советов помогут вам решить эту проблему (или понять можно ли ее решить в принципе).
Читать дальше →
Всего голосов 37: ↑22 и ↓15+7
Комментарии52

Как кандидату (разработчику) и HR с Team lead находить друг-друга

Время на прочтение19 мин
Количество просмотров3.6K

Привет, Хабр!

Это моя первая статья!

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

Думаю, мои наблюдения могут быть применены к любой сфере подбора персонала.

Статья будет интересна следующим лицам: программистам,HR, Teamleads, директорам HR, IT. 

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

Предлагаю принять во внимание следующее...

Читать далее
Всего голосов 13: ↑13 и ↓0+13
Комментарии11

Почему не стоит пытаться ускорять разработку при помощи метрик

Время на прочтение9 мин
Количество просмотров6.7K


Если вам приходилось руководить разработкой программного продукта, вы наверняка задумывались — как помочь команде двигаться быстрее? И как вообще понять, насколько быстро вы движетесь?
Читать дальше →
Всего голосов 29: ↑23 и ↓6+17
Комментарии46

Монады как паттерн переиспользования кода

Время на прочтение24 мин
Количество просмотров68K


В предыдущей статье мы обсуждали, почему функциональное программирование это совсем не то, что распиарено, и что оно совершенно не противоречит ООП, так, что даже сам "Дядя Боб" пишет про хороший ФП дизайн порождающий хороший ООП дизайн программы (и наоборот).


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


Но ведь в интернете буквально сотни статей про ФП и монады, зачем писать еще одну?


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


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


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

Читать дальше →
Всего голосов 108: ↑104 и ↓4+100
Комментарии256

Создание минимального Docker-контейнера для Go-приложений

Время на прочтение4 мин
Количество просмотров46K
Привет, Хабр! Предлагаю вашему вниманию перевод статьи основателя сервиса Meetspaceapp Nick Gauthier «Building Minimal Docker Containers for Go Applications».

Время чтения: 6 минут

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

Часть 1: Наше «приложение»


Для тестирования нам потребуется какое-нибудь маленькое приложение. Давайте будем фетчить google.com и выводить размер HTML.

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "os"
)

func main() {
    resp, err := http.Get("https://google.com")
    check(err)
    body, err := ioutil.ReadAll(resp.Body)
    check(err)
    fmt.Println(len(body))
}

func check(err error) {
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}

Если мы запустимся, то получим только какое-то число. У меня вышло около 17К. Я целенаправленно решил использовать SSL, но причину объясню позднее.
Читать дальше →
Всего голосов 23: ↑20 и ↓3+17
Комментарии10

Мягкие ссылки на страже доступной памяти или как экономить память правильно

Время на прочтение13 мин
Количество просмотров159K
image
Все java-разработчики, рано или поздно, встречаются с пресловутой ошибкой OutOfMemoryError. 
После этой встречи мы начинаем более бережно относится к используемой памяти, экономить ее. Начиная с версии 1.2 в Java появился пакет java.lang.ref.* с классами SoftReference, WeakReference, PhantomReference. Далее я расскажу вам о том, как помогут эти классы в борьбе с OutOfMemoryError. И что более интересно, приведу реальные примеры их использования. Начнем.
Читать дальше →
Всего голосов 67: ↑62 и ↓5+57
Комментарии23

Логика у HR проста — обучать ИИ на «прижившихся»

Время на прочтение7 мин
Количество просмотров5.9K
На секунду у меня в голове возникла картина: сыщик дает собаке понюхать предмет, принадлежащий разыскиваемому лицу, и та мгновенно берет след. Аналогия не точна, но и не противоречива. А речь идет о сервисе GoRecruit, который с помощью методов машинного обучения выбирает из сотен кандидатов тех, кто с большей вероятностью приживется на должности, и формирует своеобразный рейтинг, который уже изучают кадровики.


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

О том, как работает сервис и какова тут логика кадровиков, нам рассказал Александр Барабаш. Формально он директор GoRecruit, но при этом имеет прямое отношение к разработке.
Читать дальше →
Всего голосов 28: ↑22 и ↓6+16
Комментарии22

Анатомия каналов в Go

Время на прочтение34 мин
Количество просмотров157K

Привет, Хабр! Представляю вашему вниманию перевод статьи "Anatomy of Channels in Go" автора Uday Hiwarale.


Что такое каналы?


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


Создание канала


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

Читать дальше →
Всего голосов 22: ↑22 и ↓0+22
Комментарии7

Является ли Go языком ООП?

Время на прочтение9 мин
Количество просмотров69K
Object-oriented design is the roman numerals of computing.
— Rob Pike, автор Go.

image

Предлагаю вашему вниманию вольный перевод заметки «Is Go An Object Oriented Language?» за авторством Steve Francia, в которой автор наглядно рассказывает об особенностях использования парадигмы ООП в Go. Сразу предупреждаю, что из-за свойств оригинального материала большую часть текста пришлось переформулировать полностью, где-то добавить своего. Флажок перевода убирать не стал.
Читать дальше →
Всего голосов 59: ↑49 и ↓10+39
Комментарии27

Что происходит в «Пиковой даме» Пушкина и во что они играют?

Время на прочтение16 мин
Количество просмотров75K


Если коротко — Пушкин открыл жанр «киберспортивной фантастики». Только до появления фантастики и киберспорта. Его одно из самых известных произведений — «Пиковая дама» — это рассказ про мегапопулярную в свете игру в карты с элементами философских вопросов. Попадание в тогдашнюю аудиторию стопроцентное благодаря невероятно простому порогу входа (31 страница текста итого), очень узнаваемым персонажам, невероятной куче пасхалок, сарказму и актуальной теме.

А предыстория такая. Пока мы со школьными группами осенью ездили по Пскову, зарулили в театр. Он во Пскове неожиданно крутой. Ставили как раз Пушкина. Проблема в том, что дети не поняли сюжет и ещё минут 15 обсуждали после спектакля, что же это такое было и кто выиграл или проиграл. Вроде, очевидно, что Германна где-то прокатили, но вот где и как?

Поэтому мы сейчас поговорим про пасхалки «Пиковой дамы», как Пушкин вьехал сапогом в зубы понтёру и немного про математику. Кстати, Александр Сергеевич был тем ещё кутилой, что не совсем вяжется с образом, который дают на литературе в школе. И поскольку вы сейчас, скорее всего, дома, предлагаю прикоснуться к прекрасному.
Читать дальше →
Всего голосов 219: ↑215 и ↓4+211
Комментарии69

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность