Pull to refresh
-2
0

Эникейщик

Send message

Делай нейминг как сеньор

Reading time 13 min
Views 114K

Это объект Pizza, там хранится инфа о латте, а заказали его в Restaurant или в Pizzeria? Неудобно? Максимально. Мы читаем код существенно больше, чем пишем. И хочется сразу понимать, что происходит, не играя в квесты «что имел в виду автор», «да как это работает» и «я снова ничего не понял». Без навыка давать хороший нейминг невозможно писать качественный и поддерживаемый код. Про нейминг говорят заодно, в рамках архитектуры и общих инженерных практик. В статье поговорим про него отдельно.

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

Читать далее
Total votes 186: ↑184 and ↓2 +182
Comments 221

Задача коммивояжера (TSP) точное решение — метод целочисленного линейного программирования (Integer programming)

Reading time 20 min
Views 22K

Дочитав эту статью до конца, вы сможете решать точно задачу коммивояжёра на сотню элементов за считанные секунды!

Заинтригованы? Тогда, добро пожаловать под кат.

Читать далее
Total votes 124: ↑124 and ↓0 +124
Comments 40

CLI инструменты, которые облегчат времяпровождение в терминале и сделают его приятнее

Reading time 6 min
Views 49K

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

В этом посте описан мой топ-25 обязательных инструментов CLI, на которые я привык полагаться. Если тут нет вашего любимого - дайте мне знать в комментариях :)

Читать далее
Total votes 114: ↑107 and ↓7 +100
Comments 83

Предварительный просмотр Stateful Вью в SwiftUI

Reading time 5 min
Views 1K

При создании пользовательского интерфейса в SwiftUI мы, как правило, создаем два типа компонентов пользовательского интерфейса: экраны и (переиспользуемые) вью. Обычно мы начинаем с создания прототипа экрана, что неизбежно приводит к Massive ContentView, далее который мы начинаем рефакторить в более мелкие, используемые повторно компоненты.

Читать далее
Total votes 1: ↑1 and ↓0 +1
Comments 0

Учим английский с умом: шкала CEFR, тесты IELTS и что всё это значит

Reading time 16 min
Views 25K

Привет, Хабр. Екатерина. Очень приятно.

Я обучаю английскому языку 17 лет, в основном как частный преподаватель, но были и несколько лет в СУНЦ МГУ, и групповые занятия в языковом центре. Диапазон обучающихся — дети от 8 лет до ЕГЭ, студенты и «молодые специалисты», топ-менеджеры и научные сотрудники. И у всех, конечно, разные цели и разные мотивации — включая уникальный случай just for fun, в котором взрослая ученица за восемь месяцев прошла от «забытого школьного» до сдачи FCE (Cambridge B2 First Exam) с присвоением уровня C1 в устной речи, и всё просто потому, что ей нравился процесс.

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

К сожалению, очень часто вопрос о цели или подменяется расплывчатыми нереалистичными обещаниями, или не ставится вовсе — причём везде, от статей об изучении иностранных языков здесь, на Хабре, до рекламок всевозможных языковых курсов.

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

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

Читать далее
Total votes 50: ↑48 and ↓2 +46
Comments 38

Анализируем bound checks в Go по CPU профилю

Reading time 9 min
Views 4.4K

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


Читать дальше →
Total votes 26: ↑23 and ↓3 +20
Comments 0

Курсы Computer Science клуба в 2021 году: верификация, фотограмметрия, статистика, логика, теория игр и другие

Reading time 2 min
Views 5.9K

Все курсы Computer Science клуба в 2021 году проходили в онлайн режиме. Мы собрали для вас подборку видеозаписей лекций, которые выложены на нашем youtube канале.

Читать далее
Total votes 14: ↑14 and ↓0 +14
Comments 0

Подготовка к собеседованиям в IT-гиганты: как я преодолела проклятье алгоритмического собеседования

Reading time 12 min
Views 203K

Дисклеймер:


Я не программирую с трёх лет, не знаю наизусть Кнута, не являюсь призёром олимпиад по информатике и чемпионатов по спортивному программированию, не училась в MIT. У меня за плечами образование по информатике и 6 лет опыта в коммерческой разработке. И до недавнего времени я не могла пройти дальше первого технического скрининга в IT-гиганты из FAANG (Facebook, Amazon, Apple, Netflix, Google и подобные), хотя предпринимала несколько попыток. 

Но теперь всё изменилось, я получила несколько офферов и хочу поделиться опытом, как можно к этому прийти. Речь пойдёт о позиции Software Engineer в европейских офисах перечисленных компаний.
Читать дальше →
Total votes 201: ↑196 and ↓5 +191
Comments 342

PostgreSQL Antipatterns: сказ об итеративной доработке поиска по названию, или «Оптимизация туда и обратно»

Reading time 7 min
Views 9.1K
Тысячи менеджеров из офисов продаж по всей стране фиксируют в нашей CRM-системе ежедневно десятки тысяч контактов — фактов общения с потенциальными или уже работающими с нами клиентами. А для этого клиента надо сначала найти, и желательно очень быстро. И происходит это чаще всего по названию.

Поэтому неудивительно, что, разбирая в очередной раз «тяжелые» запросы на одной из самых нагруженных баз — нашего собственного корпоративного аккаунта СБИС, я обнаружил «в топе» запрос для «быстрого» поиска по названию для карточек организаций.

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

0: чего же хотел пользователь


[КДПВ отсюда]

Что вообще обычно подразумевает пользователь, когда говорит про «быстрый» поиск по названию? Почти никогда это не оказывается «честный» поиск по подстроке типа ... LIKE '%роза%' — ведь тогда в результат попадают не только 'Розалия' и 'Магазин Роза', но и роза' и даже 'Дом Деда Мороза'.

Пользователь же подразумевает на бытовом уровне, что вы ему обеспечите поиск по началу слова в названии и покажете более релевантным то, что начинается на введенное. И сделаете это практически мгновенно — при подстрочном вводе.
Читать дальше →
Total votes 17: ↑17 and ↓0 +17
Comments 15

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

Reading time 10 min
Views 88K

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


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

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


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


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

Читать дальше →
Total votes 46: ↑38 and ↓8 +30
Comments 9

Как работают ИТ-специалисты. Андрей Волосюк, CTO Digital Society Laboratory в SocialKey Ads

Reading time 3 min
Views 5.1K
Мы продолжаем расспрашивать специалистов о режиме труда и отдыха, профессиональных привычках, об инструментарии, который они используют, и многом другом.

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

Сегодня наш гость — Андрей Волосюк, технический директор компании Digital Society Laboratory, проекта SocialKey Ads.

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


До DSL на фрилансе создавал и поддерживал сайты интернет-магазинов, успел поработать в Mail.Ru Group, Lamoda и «ВКонтакте».

Интересы: активный отдых, профессиональная и художественная литература.
Читать дальше →
Total votes 17: ↑14 and ↓3 +11
Comments 1

Почему Discord переходит с Go на Rust

Reading time 7 min
Views 79K


Rust становится первоклассным языком в самых разных областях. Мы в Discord успешно используем его и на серверной, и на клиентской стороне. Например, на стороне клиента в конвейере кодирования видео для Go Live, а на стороне сервера для функций Elixir NIF (Native Implemented Functions).

Недавно мы резко улучшили производительность одной службы, переписав её с Go на Rust. В этой статье объясним, почему для нас имело смысл переписать службу, как мы это сделали и насколько повысилась производительность.
Читать дальше →
Total votes 174: ↑170 and ↓4 +166
Comments 307

Как мы приучили коллег брать вещи без спроса

Reading time 6 min
Views 78K


В Яндексе сотрудники IT-поддержки получают 2500 заявок в неделю, из которых огромная часть рутина — выдача мышек, наушников и других аксессуаров. На эти операции тратится существенная часть рабочего времени сотрудников внутренней IT-поддержки. Заказчики также тратят время, потому что иногда приходится и в очереди постоять.


Кажется, что от этого не уйти, потому что техника есть техника: что-то ломается, теряется, портится… Но мы нашли неожиданное решение, как уменьшить нагрузку на хелпдеск и предельно сократить время ожидания нового аксессуара для сотрудников.


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


Читать дальше →
Total votes 209: ↑205 and ↓4 +201
Comments 265

Выбор MQ для высоконагруженного проекта

Reading time 5 min
Views 170K
Современные масштабируемые системы состоят из микросервисов, каждый из которых отвечает за свою ограниченную задачу. Такая архитектура позволяет не допускать чрезмерного разрастания исходного кода и контролировать технический долг.

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

Если микросервис перестает отвечать на запросы в результате аварии, его клиенты должны быть мгновенно перенаправлены на резервный. Для управления потоком запросов часто используют так называемые очереди сообщений (message queues).

Недавно используемая нами очередь перестала нас устраивать по параметрам отказоустойчивости и мы заменили ее. Ниже мы делимся нашим опытом выбора.
Читать дальше →
Total votes 46: ↑38 and ↓8 +30
Comments 57

Как реализуется отказоустойчивая веб-архитектура в платформе Mail.ru Cloud Solutions

Reading time 11 min
Views 19K


Привет, Хабр! Я Артем Карамышев, руководитель команды системного администрирования Mail.Ru Cloud Solutions (MCS). За последний год у нас было много запусков новых продуктов. Мы хотели добиться, чтобы API-сервисы легко масштабировались, были отказоустойчивыми и готовыми к быстрому росту пользовательской нагрузки. Наша платформа реализована на OpenStack, и я хочу рассказать, какие проблемы отказоустойчивости компонентов нам пришлось закрыть, чтобы получить отказоустойчивую систему. Я думаю, это будет любопытно тем, кто тоже развивает продукты на OpenStack.

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

Видеоверсию этой истории, первоисточником которой стал доклад на конференции Uptime day 4, организованной ITSumma, можно посмотреть на YouTube-канале Uptime Community.
Читать дальше →
Total votes 71: ↑66 and ↓5 +61
Comments 5

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

Reading time 14 min
Views 4.1K
Всем привет!

Меня зовут Денисов Александр. Я работаю в компании Naumen и отвечаю за документирование и локализацию программного продукта Naumen Contact Center (NCC).

В этой статье расскажу о тех проблемах, с которыми мы сталкивались при локализации NCC на английский и немецкий языки и о том, как мы решали эти проблемы. Конечно, на сегодняшний день мы решили далеко не все свои задачи и, скорее всего, этот процесс вообще бесконечен. В статье рассматривается видение всего процесса в целом и те принципы, которым мы стараемся придерживаться или которые начинаем пробовать применять. Материал будет полезен тем, кто только начинает проектировать ПО, планирует его локализацию или уже сталкивается с проблемами, но пока не знает как их решить.

image
Читать дальше →
Total votes 10: ↑9 and ↓1 +8
Comments 2

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

Reading time 45 min
Views 7.7K

У себя в компании я часто сталкиваюсь, что нужно поднять какой-то сервис, чтобы "общупать" его досконально. Хотя PCшники у нас довольно мощные, но большую часть ресурсов съедают PyCharm и Chrome, а на виртуалки с экспериментами очень часто остаётся совсем мало.


Поэтому мы завели у себя небольшую стойку с парой-тройкой серверов для экспериментов и локального Gitlab'а. Но что-то пошло не так и очень захотелось поиграться с чем-то новым.

Немного лирики и тех.подробностей
Total votes 6: ↑6 and ↓0 +6
Comments 5

Unit-тесты, пытаемся писать правильно, чтобы потом не было мучительно больно

Reading time 3 min
Views 57K
Большинство людей не умеют писать unit-тесты. И даже те, кто применяет модульные тесты в ежедневной разработке, зачастую признают, что получившиеся тесты иногда не очень эффективны по определенным причинам. К этой категории людей я могу отнести и себя. В первую очередь, такой «причиной» является некоторая появляющаяся «инертность» кода, заключающаяся в том, что если требуется немного изменить какой-то ключевой алгоритм, добавить пару строчек кода, то при этом «падают» ~100 модульных тестов и приходится тратить продолжительное время на то чтобы заставить их работать вновь. Итак, приступим к «хорошим рекомендациям» при написании автоматических модульных тестов. Нет, я не буду капитаном очевидностью, в очередной раз описывая популярный стиль написания тестов под названием AAA (Arange-Act-Assert). Зато попытаюсь объяснить, чем отличается Mock от Stub-а и что далеко не все тестовые объекты — «моки».
Читать дальше →
Total votes 61: ↑50 and ↓11 +39
Comments 22

Реальные сроки изучения слепой печати при низкой мотивации

Reading time 4 min
Views 72K
В статье я опишу свой сугубо субъективный пример того, сколько времени занимает обучение методу комфортной слепой печати. Это с учётом того, что мне данный навык не был критически важен, но иметь его давно хотелось.


Читать дальше →
Total votes 54: ↑49 and ↓5 +44
Comments 198

Поиск пути среди круглых препятствий

Reading time 9 min
Views 14K

Навигация по лесу


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


В оригинале статьи все изображения интерактивны.

Как один алгоритм решает обе эти задачи? Давайте начнём с краткого описания того, как работает A*.

Алгоритм A*


Алгоритм A* находит оптимальный путь из начальной в конечную точку, избегая по дороге препятствия. Он реализует это, постепенно расширяя множество частичных путей. Каждый частичный путь — это серия шагов от начальной точки до какой-то промежуточной точки на дороге к цели. В процессе работы A* частичные пути становятся всё ближе конечной точке. Алгоритм прекращает работу тогда, когда находит полный путь, который лучше оставшихся вариантов, и это можно доказать.

На каждом шаге алгоритма A* оценивает множество частичных путей и генерирует новые пути, расширяя наиболее многообещающий путь из множества. Для этого A* хранит частичные пути в очереди с приоритетами, отсортированном по приблизительной длине — истинной измеренной длине пути плюс примерное оставшееся расстояние до цели. Это приближение должно быть недооценкой; то есть приближение может быть меньше истинного расстояния, но не больше него. В большинстве задач поиска пути хорошей преуменьшенной оценкой является геометрическое расстояние по прямой от конца частичного пути до конечной точки. Истинный наилучший путь до цели от конца частичного пути может быть длиннее, чем это расстояние по прямой, но не может быть короче.
Читать дальше →
Total votes 46: ↑46 and ↓0 +46
Comments 15

Information

Rating
Does not participate
Registered
Activity