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


      Дисклеймер:


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

      Но теперь всё изменилось, я получила несколько офферов и хочу поделиться опытом, как можно к этому прийти. Речь пойдёт о позиции Software Engineer в европейских офисах перечисленных компаний.
      Читать дальше →
    • Основы нейросетей в 100 строках кода (часть 1)

      • Перевод

      В трёх частях этой статьи мы:


      • Напишем нейросеть с нуля на Python и обучим её алгоритмом градиентного спуска.
      • Применим её к датасету The Wisconsin Cancer Data-set и предскажем по 9 различным признакам, является ли опухоль доброкачественной или злокачественной.
      • Подробнее исследуем, как работает градиентный спуск и метод обратного распространения ошибки.
      • Рассмотрим основы и изучим более сложные идеи. В части 1 мы разберёмся с архитектурой нашей нейросети, в части 2 напишем её на Python и глубже посмотрим на обратное распространение и градиентный спуск, а в части 3 применим её к The Wisconsin Cancer Data-set.


      Читать дальше →
      • +7
      • 5,4k
      • 8
    • Мегафон продолжает вмешиваться в мой HTTP-трафик в 2020 году, отправлять рекламу, даже после получения запретов на это

        Недавний пост «Вы видели людей, которые пользуются мобильными контент-подписками?» опять всколыхнул внутреннее недовольство отношением Мегафона ко мне и я решил рассказать про свою «войну» с зелёно-фиолетовым оператором и попытками оградиться от рекламы и вмешивания в мой HTTP-трафик.

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

        Мотивация от оператора:
        При заключении между нами договора, в нём был пункт, что Вы согласны на получение рекламы при использовании наших услуг.
        Вместо выполнения Федерального Закона «О Рекламе», статья 18, п. 1, при обращениях к оператору с требованием прекратить распространять рекламу в мой адрес:
        Рекламораспространитель обязан немедленно прекратить распространение рекламы в адрес лица, обратившегося к нему с таким требованием.
        Мегафон подключает дополнительные услуги «отказа от рекламы» (у меня их с десяток), которые иногда не работают, и реклама продолжает приходить.



        Например, после скриншота выше, сегодня получил очередную зелёно-фиолетовую рекламу.
        Считаю что такого рода вещи должны предаваться гласности, так как дело не в том, что «проблема» решится (хотя до сих пор не решилась) для одного абонента, а в том что этот опыт поможет многим. Ведь по всем проблемным запросам смм Мегафона уводит клиента в личное общение и решений проблем не остаётся в паблике. Попробую это исправить.
        С подписками, как оказалось, разобраться проще всего. Расскажу под катом про свой опыт и с ними, и с вмешательством в HTTP-трафик:

        • почему вы видите сайты с подписками, даже если кликнули по объявлению в выдаче Google,
        • размышления, много ли мобильные подписки приносят денег оператору,
        • как Мегафон вмешивается в HTTP-трафик,
        • про рекламу, от которой вы не можете отказаться,
        • чеклист того что можно сделать, для минимизации рекламы, подписок и вмешательств в HTTP-трафик.
        Читать дальше →
      • Чистая архитектура на PHP. Как её измерять и контролировать?

        Предисловие


        Как ты уже понял из названия, говорить я тут собрался о самом, что ни на есть, “высоком” — Чистой архитектуре. А толчком к развитию всей этой истории послужила книга Роберта Мартина “Чистая архитектура”. Если еще не читал, осмелюсь порекомендовать! Автор раскрывает много важных тем, активно делится своим богатым жизненным опытом (из проф. области естественно) и сделанными на его основе выводами, эпизодически вплетает в главы истории о том, как виртуозно говнокодили (ну и не только, конечно же) наши отцы и деды в далёких 60-х, 70-х, 80-х и даже лихих 90-х, как по крупинкам собирали всеми любимые принципы SOLID и их аналоги в мире компонентов, и чему научились за прошедшие полвека. В процессе чтения книги хорошо прослеживается линия развития индустрии разработки ПО, типичные проблемы, с которыми пацанам приходилось сталкиваться, и способы их решения.

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

        Мне кажется, статья будет полезна всем. Те, кто с книгой уже знаком, смогут освежить в своей памяти некоторые ее моменты, или просто пропустить первую часть и сразу приступить к знакомству с инструментом. Те, кто ранее книгу не читал, возможно, и в первой части найдут для себя что-то новое.
        Читать дальше →
      • Лайфхаки разработчикам от рекрутера

        Недавно на Хабр вышел перевод статьи «Оцениваем рекрутеров по холодным письмам». Примечание переводчика и 120 комментариев показывают, что тема болезненна для русскоязычных разработчиков, а рынок рекрутинга в IT токсичен. С одной стороны страдают разработчики: завал писем на почте, звонки от рекрутеров, которые потом внезапно пропадают, нелепые вакансии с релокацией в Гватемалу, предложения сеньорам поработать в молодом стартапе джуном и собеседования с вопросами «почему люки круглые». С другой — сами рекрутеры страдают от некомпетентных коллег, которые выставляют их как спамеров не отличающих Java от JavaScript, и раскидывающихся вакансиями без разбора, будто они риэлторы на Авито.



        Меня зовут Светлана Петровичева, 10 лет работаю в IT-рекрутинге, основатель рекрутингового агентства и платформы для поиска работы в IT. У меня есть мечта избавить IT-рынок от токсичности. Поэтому сегодня я поделюсь своим опытом, поделюсь некоторыми полезными приемами и попробую описать, как работают рекрутеры. Вы узнаете как разработчикам оценивать вакансии и компании, как вас находят и оценивают рекрутеры, влияет ли «личный бренд» на зарплату и почему ее не пишут в вакансиях. Также дам несколько рекомендаций как подготовить резюме, чтобы вы зарабатывали чуть больше, как поймать вакансию раньше остальных, почему «справедливой» зарплаты не существует, а в конце опишу свое видение, как избавиться от токсичности на рынке найма в IT.
        Читать дальше →
      • Как я начал выступать на конференциях и не могу остановиться

          Современный мир разработки, по-своему, прекрасен. Хорошей практикой считается свободное распространение своих знаний и разработок. Стремление к знаниям создает спрос, а habr, toster (ныне qna), github, митапы, конференции и прочее являются отличным предложением. О митапах и конференциях я сегодня и хотел бы рассказать. Под катом история как я, будучи разработчиком и собственником IT-компании, начал выступать на IT конференциях.

          Читать дальше →
        • 4 крутых функции Numpy, которые я использую постоянно

          • Перевод

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


          Читать дальше →
          • +12
          • 5,7k
          • 1
        • Эволюционирующие клеточные автоматы



            Соединим клеточные автоматы с генетическим алгоритмом и посмотрим, что из этого получится.

            В статье присутствуют Gif (трафик!) и контрастные картинки. У эпилептиков может случиться эпилептический припадок.
            Читать дальше →
          • Мультиплеер в быстрых играх (Часть IV: Хэдшот! Путешествуем во времени)

            • Перевод

            1. Части I, II (синглплеер с авторитарным сервером)
            2. Часть III (Появление врага)
            3. Часть IV (Хэдшот!)

            Как повесить идеальный хэдшот если у тебя пинг 2 секунды? Вы узнаете в этой статье.

            Текущий алгоритм работы мультиплеера


            • Сервер получает команды с клиентов и времена их отправления
            • Сервер обновляет состояние мира
            • Сервер с некоторой частотой отправляет свое состояние всем клиентам
            • Клиент отправляет команды и локально воспроизводит их результат
            • Клиент получает обновленные состояния мира и:
              • Применяет состояние от сервера
              • Заново применяет все свои команды, которые сервер не успел применить.
              • Интерполирует предыдущие состояния других игроков
            • С точки зрения игрока, есть два серьезных последствия:
              • Игрок видит себя в настоящем
              • Игрок видит других в прошлом.

            Обычно это отлично работает, но это становится большой проблемой для событий, которым нужна высокая пространственно-временная точность. Например если хочется разнести врагу башку!
            Читать дальше →
          • Асинхронный PHP и история одного велосипеда

            После выхода PHP7 появилась возможность сравнительно небольшой ценой писать долгоживущие приложения. Для программистов стали доступны такие проекты, как prooph, broadway, tactician, messenger, авторы которых берут на себя решение наиболее частых проблем. Но что если сделать небольшой шаг вперёд, углубившись в вопрос?


            Попробуем разобрать судьбу ещё одного велосипеда, который позволяет реализовать Publish/Subscribe приложение.

            Читать дальше →
          • Обстоятельно о подсчёте единичных битов

            • Tutorial
            Я хотел бы подарить сообществу Хабра статью, в которой стараюсь дать достаточно полное описание подходов к алгоритмам подсчёта единичных битов в переменных размером от 8 до 64 битов. Эти алгоритмы относятся к разделу так называемой «битовой магии» или «битовой алхимии», которая завораживает своей красотой и неочевидностью многих программистов. Я хочу показать, что в основах этой алхимии нет ничего сложного, и вы даже сможете разработать собственные методы подсчёта единичных битов, познакомившись с фундаментальными приёмами, составляющими подобные алгоритмы.

            Читать дальше →
          • Ломаем паттерн проектирования — Singleton в PHP

            Одним прекрасным рабочим днём я писал unit-тесты для бизнес-логики на проекте, в котором работаю. Передо мною стояла задача инициализировать некоторые приватные свойства класса определёнными значениями.

            Читать дальше →
          • Массивы в РНР 7: хэш-таблицы

            • Перевод
            Хэш-таблицы используются везде, в каждой серьёзной С-программе. По сути, они позволяют программисту хранить значения в «массиве», индексируя его с помощью строк, в то время как в языке С допускаются только целочисленные ключи массива. В хэш-таблице строчные ключи сначала хэшируются, а затем уменьшаются до размеров таблицы. Здесь могут возникать коллизии, поэтому нужен алгоритм их разрешения. Существует несколько подобных алгоритмов, и в РНР используется стратегия связных списков (linked list).

            В Сети есть немало замечательных статей, подробно освещающих устройство хэш-таблиц и их реализации. Начать можно с http://preshing.com/. Но имейте в виду, вариантов структуры хэш-таблиц — несметное множество, и ни один из них не совершенен, в каждом есть компромиссы, несмотря на оптимизацию циклов процессора, использования памяти или хорошее масштабирование потокового окружения (threaded environment). Одни варианты лучше при добавлении данных, другие — при поиске и т. д. Выбирайте реализацию в зависимости от того, что для вас важнее.

            Хэш-таблицы в РНР 5 подробно рассмотрены в материале phpinternalsbook, который я написал вместе с Nikic, автором хорошей статьи про хэш-таблицы в РНР 7. Возможно, её вы тоже сочтёте интересной. Правда, она писалась до релиза, поэтому некоторые вещи в ней слегка отличаются.

            Здесь же мы подробно рассмотрим, как устроены хэш-таблицы в РНР 7, как с ними можно работать с точки зрения языка С и как ими управлять средствами РНР (используя структуры, называемые массивами). Исходный код в основном доступен в zend_hash.c. Не забывайте, что хэш-таблицы мы используем везде (обычно в роли словарей), следовательно, нужно проектировать их так, чтобы они быстро обрабатывались процессором и потребляли мало памяти. Эти структуры решающе влияют на общую производительность РНР, поскольку местные массивы не единственное место, где используются хэш-таблицы.
            Читать дальше →
          • Как мы сделали PHP 7 в два раза быстрее PHP 5. Часть 1: оптимизация структур данных

              В декабре 2015 вышел PHP 7.0. Компании, которые перешли на «семерку» отметили, что увеличилась производительность, а нагрузка на сервера — уменьшилась. Первыми перешли на семерку Vebia и Etsy, а у нас Badoo, Авито и OLX. Для Badoo переход на семёрку обошелся в 1 млн. долларов экономии на серверах. Благодаря PHP 7 в OLX средняя нагрузка на сервер снизилась в 3 раза, повысилась эффективность и экономия ресурсов.

              Дмитрий Стогов из Zend Technologies на HighLoad++ рассказал, благодаря чему повысилась производительность. В расшифровке: о внутреннем устройстве PHP, об идеях в основе версии 7.0, об изменениях в базовых структурах данных и алгоритмах, которые и определили успех.

              Disclaimer: На март 2019 года 80% сайтов работают на PHP, и 70% из них — на PHP 5, хотя с 1 января 2019 эта версия не поддерживается. Доклад Дмитрия от 2016 года про принципы, благодаря которым произошел двукратный скачок производительности между PHP 5 и 7, — актуален и в марте 2019. Для половины сайтов — точно.
              Читать дальше →
            • Coroutines :: опыт практического применения

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

                Статья подготовлена по материалам моего доклада на MBLT DEV 2018, в конце поста — линк на видеозапись.

                Последовательный стиль


                Читать дальше →
                • +27
                • 12,7k
                • 3
              • Создание Android приложения с использованием Anko Layouts и Anko Coroutines

                image


                Примерно год назад я начал использовать Kotlin в своих Android проектах. Мне хотелось попробовать что-то новое, что было бы интересно изучать. Тогда я и наткнулся на Anko. К тому времени писать UI на xml порядком осточертело. Мне всегда нравилось писать интерфейс руками, не прибегая к WYSIWYG и xml-разметке, используемой в Android Studio. Единственный минус заключается в том, что для проверки любого изменения придется перезапускать приложение. Можно использовать плагин, который показывает как будет выглядеть ui не запуская приложения, но мне он показался довольно странным. Так же у него есть крутая возможность конвертирования xml в Anko Layouts DSL.


                Самый большой недостаток библиотеки — практически полное отсутствие документации. Чтобы разобраться, как ее правильно использовать, приходилось часто заглядывать в исходники. В этой статье будет подробно разобрано создание приложения используя Anko Layouts и Anko Coroutines.

                Читать дальше →
              • Полёт свиньи, или Оптимизация интерпретаторов байт-кода


                  "No matter how hard you try, you can't make a racehorse out of a pig. You can, however, make a faster pig" (комментарий в исходном коде Емакса)

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


                  Во второй части серии статей об интерпретаторах байт-кодов я на примере небольшой стековой виртуальной машины ПВМ («Поросячья Виртуальная Машина») постараюсь показать, что не всё потеряно для трудолюбивых поросят с амбициями и что в рамках (в основном) стандартного C вполне возможно ускорить работу таких интерпретаторов по меньшей мере в полтора раза.

                  Читать дальше →
                • Функциональная обработка ошибок в Kotlin с помощью Arrow

                    image

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

                    Все любят runtime exceptions. Нет лучшего способа узнать о том, что что-то не было учтено при написании кода. Особенно — если исключения обваливают приложение у миллионов пользователей, и эта новость приходит паническим email'ом с портала аналитики. В субботу утром. Когда ты в загородной поездке.

                    После подобного всерьез задумываешься о обработке ошибок — и какие же возможности предоставляет нам Kotlin?

                    Первым на ум приходит try-catch. По мне — отличный вариант, но у него есть две проблемы:

                    1. Это как-никак лишний код (вынужденная обертка вокруг кода, не лучшим образом сказывается на читаемости).
                    2. Не всегда (особенно при использовании сторонних библиотек) из блока catch возможно получить информативное сообщение о том, что конкретно вызвало ошибку.

                    Давайте посмотрим во что try-catch превращает код при попытке решения вышеозвученных проблем.
                    Читать дальше →
                  • Немного о лексическом анализе



                      Давным-давно, когда небо было голубым, трава зеленее и по Земле бродили динозавры… Нет, забудьте про динозавров. Ну, в общем, когда-то тогда пришла в голову мысль отвлечься от стандартного web-программирования и заняться чем-то более безумным. Можно было, конечно, чем угодно, но выбор пал на написание своего интерпретатора. Что я могу сказать… Никогда не пишите свои языки программирования. Но некоторый опыт из всего этого я извлёк, так что вот и решил поделиться. Начнём с самой основы — лексера.
                      Читать дальше →
                    • Пишем собственную виртуальную машину

                      • Перевод
                      • Tutorial
                      В этом руководстве я расскажу, как написать собственную виртуальную машину (VM), способную запускать программы на ассемблере, такие как 2048 (моего друга) или Roguelike (моя). Если вы умеете программировать, но хотите лучше понять, что происходит внутри компьютера и как работают языки программирования, то этот проект для вас. Написание собственной виртуальной машины может показаться немного страшным, но я обещаю, что тема удивительно простая и поучительная.

                      Окончательный код составляет около 250 строк на C. Достаточно знать лишь основы C или C++, такие как двоичная арифметика. Для сборки и запуска подходит любая Unix-система (включая macOS). Несколько API Unix используются для настройки ввода и отображения консоли, но они не являются существенными для основного кода. (Реализация поддержки Windows приветствуется).

                      Примечание: эта VM — грамотная программа. То есть вы прямо сейчас уже читаете её исходный код! Каждый фрагмент кода будет показан и подробно объяснён, так что можете быть уверены: ничего не упущено. Окончательный код создан сплетением блоков кода. Репозиторий проекта тут.
                      Читать дальше →