• Структуры данных и алгоритмы, которыми я пользовался, работая в технологических компаниях

    • Translation
    Пользуетесь ли вы структурами данных и алгоритмами в повседневной работе? Я обратил внимание на то, что всё больше и больше людей считает алгоритмы чем-то таким, чем, без особой связи с реальностью, технические компании, лишь по собственной прихоти, интересуются на собеседованиях. Многие жалуются на то, что задачи на алгоритмы — это нечто из области теории, имеющей слабое отношение к настоящей работе. Такой взгляд на вещи, определённо, распространился после того, как Макс Хауэлл, автор Homebrew, опубликовал твит о том, что произошло с ним на собеседовании в Google:

    Google: 90% наших инженеров пользуются программой, которую вы написали (Homebrew), но вы не можете инвертировать бинарное дерево на доске, поэтому — прощайте.

    Хотя и у меня никогда не возникало нужды в инверсии бинарного дерева, я сталкивался с примерами реального использования структур данных и алгоритмов в повседневной работе, когда трудился в Skype/Microsoft, Skyscanner и Uber. Сюда входило написание кода и принятие решений, основанное на особенностях структур данных и алгоритмов. Но соответствующие знания я, по большей части, использовал для того чтобы понять то, как созданы некие системы, и то, почему они созданы именно так. Знание соответствующих концепций упрощает понимание архитектуры и реализации систем, в которых эти концепции используются.



    В эту статью я включил рассказы о ситуациях, в которых структуры данных, вроде деревьев и графов, а так же различные алгоритмы, были использованы в реальных проектах. Здесь я надеюсь показать читателю то, что базовые знания структур данных и алгоритмов — это не бесполезная теория, нужная только для собеседований, а что-то такое, что, весьма вероятно, по-настоящему понадобится тому, кто работает в быстрорастущих инновационных технологических компаниях.
    Читать дальше →
  • IntelliJ IDEA: Structural Search and Replace

    • Translation
    • Tutorial

    Modern IDEs are very powerful tools that can help developers in all kinds of situations. Unfortunately, much of this power is often lost because many functions remain unknown to developers, hiding in the shadows.


    Simple example of the one of the such functions

    Did you know that when you press F2 in IntelliJ IDEA, the cursor will jump to the nearest error in the file? And in the absence of an error – to the nearest warning? It seems that this is a secret only a few people know about.


    Structural search and replace is one such pair of features. They can be extremely useful in situations where a whole variety of other functions can’t quite get the job done.


    In this post, I will present some of these situations and go beyond artificial cases by demonstrating examples of real code from two projects:


    1. 3D-engine for game development, jMonkeyEngine, which is an example of a big, interesting project.
    2. My own pet project, plantuml-native-image, where I experiment with compiling PlantUML into native executable code using GraalVM Native Image.

    In fact, it is this second project that encouraged me to write this post but I’m getting ahead of myself. First things first...

    Read more →
  • IntelliJ IDEA: Structural Search & Replace


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


    Простой пример одной такой функции

    А вы знаете, что, если в IDEA нажать F2, курсор перескочит к ближайшей ошибке в файле? А если нет ошибки, то к замечанию? Как-то так получается, что об этом знают далеко не все.


    Одной такой функцией является Structural Search & Replace (SSR). Она может быть невероятно полезна в тех ситуациях, когда пасует всё богатое разнообразие других функций.


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


    1. 3D-движка для создания игр jMonkeyEngine, как пример большого проекта, в котором всегда можно найти что-то интересненькое.
    2. моего собственного проекта plantuml-native-image, в котором я провожу эксперименты по компиляции PlantUML в нативный исполняемый код с помощью GraalVM native-image.

    Собственно, случай во втором проекте и побудил меня к написанию статьи. Но обо всём по порядку...

    Читать дальше →
  • Клиентский мониторинг производительности

    Клиентский мониторинг производительности


    Привет, Хабр! Меня зовут Влад, я лид направления Web Performance в Тинькофф.


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


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


    Ведущие игроки IT-индустрии продолжают обращать внимание на важность производительности, проводят масштабные исследования и эксперименты, разрабатывают новые концепции, инструменты и API. А в ближайшем будущем Google и вовсе будет учитывать основные показатели производительности в поисковой выдаче.


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

    Читать дальше →
  • Вещи, которые мне надо было знать прежде, чем создавать систему с очередью

      Фото очереди в мавзолей Мао Цзэдуна —  BrokenSphere / Wikimedia Commons

      В проекте, над которым я сейчас работаю, применяется распределённая система обработки данных: сначала несколько десятков машин одновременно производят некоторые сообщения, затем эти сообщения отправляются в очередь, из очереди три потока извлекают сообщения и после финальной обработки выкладывают данные в базу Redis. При этом имеется требование: от «зарождения» события в машине, производящей сообщение, до выкладывания обработанных данных в базу должно проходить не более четырёх секунд в 90% случаев.

      В какой-то момент стало очевидно, что мы это требование не выполняем, несмотря на затрачиваемые усилия. Несколько произведённых измерений и маленький экскурс в теорию очередей привели меня к выводам, которые я бы хотел донести до себя самого несколько месяцев назад, когда проект только начинался. Отправить письмо в прошлое я не могу, но могу написать заметку, которая, возможно, избавит от неприятностей тех, кто только задумывается над тем, чтобы применять очереди в собственной системе.
      Читать дальше →
    • Заменить Object на var: что может пойти не так?

        Недавно я столкнулся с ситуацией, что замена Object на var в программе на Java 10 приводит к исключению в процессе выполнения. Мне стало интересно, много ли разных способов добиться такого эффекта, и я обратился с этим вопросом к сообществу:



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

        Читать дальше →
      • Запускаем инспекции IntelliJ IDEA на Jenkins

        • Tutorial

        IntelliJ IDEA на сегодня обладает наиболее продвинутым статическим анализатором кода Java, по своим возможностям оставившим далеко позади таких «ветеранов», как Checkstyle и Spotbugs. Её многочисленные «инспекции» проверяют код в различных аспектах, от стиля кодирования до характерных багов.


        Однако пока результаты анализа отображаются лишь в локальном интерфейсе IDE разработчика, от них мало пользы для процесса разработки. Статический анализ необходимо выполнять в качестве первого шага конвейера сборки, его результаты должны определять quality gates, а сборка должна фейлиться, если quality gates не пройдены. Известно, что TeamCity CI интегрирован с IDEA. Но даже если вы не используете TeamCity, вы вполне можете попробовать запускать инспекции IDEA в любом другом CI-сервере. Предлагаю посмотреть, как это можно сделать, используя IDEA Community Edition, Jenkins и Warnings NG plugin.

        Читать дальше →
      • Как проходят алгоритмические секции на собеседованиях в Яндекс

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


          Так что мы подготовили для вас следующие материалы:


          • Специальный контест, содержащий задачи, похожие на те, что мы даём на интервью.
          • Этот пост. В нём рассказывается, почему нужно проводить такие секции, а также разбираются все задачи контеста.
          • Два видео, в которых разбираются задачи из контеста: в первом — задача попроще, во втором — две задачи посложнее. Из этих видео вы узнаете о типичных ошибках, допускаемых и при прохождении алгоритмических секций, и при написании продакшен-кода.


          Читать дальше →
        • Откуда растут ноги у Java Memory Model

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

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

          Но все уже осознали, ведь жить с этим как-то надо. А Java программисты даже неплохо живут. Потому что в Java есть модель памяти — Java Memory Model (JMM), которая предоставляет достаточно простые правила для написания корректного многопоточного кода.

          И правил этих достаточно для большинства программ. Если вы их не знаете, но пишите или хотите писать многопоточные программы на Java, то лучше как можно скорее ознакомиться с ними. А если знаете, но вам не хватает контекста или интересно узнать откуда растут ноги у JMM, тогда статья может вам помочь.
          Читать дальше →
        • English notes #1: Заканчивай с этим «very»

            Прим. ред.: Этой статьёй мы начинаем цикл публикаций, посвящённых английскому языку и подготовленных нашим штатным учителем для инженеров компании (в данном случае — на основе видеоурока engVid, JamesESL English Lessons). С одной стороны — нам нужно изучать язык, с другой — нравится это делать, а с третьей — почему бы не разбавить технические материалы своего блога? Ваши отзывы очень приветствуются!

            Слово «very» очень популярно в английском языке, да и не только. Однако, употребляя его слишком часто, вы можете прослыть косноязычным или попросту Эллочкой-людоедочкой.



            Как известно, в великом романе-эпопее «Война и Мир» Лев Николаевич не совершает повторов на протяжении каждых трех страниц(!). Не это ли искусство? Однако, не будем долго мечтать — let's get down to business.
            Читать дальше →
          • Антон Архипов про эффективную работу с IntelliJ IDEA и TeamCity на jug.msk.ru

              1 ноября 2018 года на встрече сообщества московских Java-разработчиков jug.msk.ru выступил Антон Архипов, рассказав о приёмах использования и новых возможностях продуктов компании JetBrainsIntelliJ IDEA и TeamCity.


              Читать дальше →
              • +10
              • 4.8k
              • 4
            • Рецепт полезного код-ревью от разработчика из Яндекса



                Привет. Меня зовут Сергей, последние пять лет я работаю в Яндексе. За это время участвовал в разработке одиннадцати проектов. Писал код на JavaScript, Python и C++. Некоторые проекты делал в одиночку, другие разрабатывал в группе из восьми человек. Но в каждой команде, на всех проектах, вне зависимости от языка программирования я использовал код-ревью.


                С помощью код-ревью я постоянно узнаю что-то новое. Иногда, глядя на чужой код, хочется воскликнуть: "А что, так тоже можно?". В чужом коде я нахожу интересные приёмы и беру их себе на вооружение. Много новых знаний черпаю из комментариев к моему коду. Для меня стало открытием, что люди любят делиться своим опытом. Даже когда я разрабатываю проект в одиночку, то прошу ребят из другой команды посмотреть мои пулреквесты. Это мотивирует писать красивый и понятный код.


                Но так было не всегда. Когда-то ревью было для меня наказанием. Я мог неделю с вдохновением писать код, вкладывая в него все силы. Отправлял пулреквест, трижды пинговал ревьювера, а в ответ получал сухое "вроде ок" или, что ещё хуже, десятки комментариев не по существу.


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


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

                Читать дальше →
              • Сравнение JS-фреймворков: React, Vue и Hyperapp

                • Translation
                Автор материала, перевод которого мы сегодня публикуем, полагает, что Hyperapp — это заслуживающая внимания альтернатива таким веб-фреймворкам, как React или Vue. Он говорит, что причиной такого утверждения стало то, что он выяснил, что Hyperapp легче в освоении, чем эти два фреймворка. Его идея подверглась критике, так как кажется, что основана она исключительно на его мнении, а такой подход попросту не даёт другим фреймворкам возможности показать их сильные стороны. Эта статья направлена на объективный анализ Hyperapp, React и Vue, проведённый на основе простых примеров, демонстрирующих их возможности, и на основе результатов их испытаний.


                Читать дальше →
              • RabbitMQ против Kafka: два разных подхода к обмену сообщениями

                  В прошлых двух статьях мы рассказывали об IIoT — индустриальном интернете вещей — строили архитектуру, чтобы принимать данные от сенсоров, паяли сами сенсоры. Краеугольным камнем архитектур IIoT да и вообще любых архитектур работающих с BigData является потоковая обработка данных. В ее основе лежит концепция передачи сообщений и очередей. Стандартом работы с рассылкой сообщений сейчас стала Apache Kafka. Однако, для того, чтобы разобраться в ее преимуществах (и понять ее недостатки) было бы хорошо разобраться в основах работы систем очередей в целом, механизмах их работы, шаблонах использования и основной функциональности.



                  Мы нашли отличную серию статей, которая сравнивает функциональность Apache Kafka и другого (незаслуженно игнорируемого) гиганта среди систем очередей — RabbitMQ. Эту серию статей мы перевели, снабдили своими комментариями и дополнили. Хотя серия и написана в декабре 2017 года, мир систем обмена сообщениями (и особенно Apache Kafka) меняется так быстро, что уже к лету 2018-го года некоторые вещи изменились.

                  Читать дальше →
                • TeamCity 2018.1: новый Kotlin DSL, режим High Availability, улучшенная Docker интеграция и Amazon S3 из коробки

                    Привет, Хабр! Недавно мы выпустили новую версию TeamCity – 2018.1. Это первый крупный релиз нашего СI/CD сервера в этом году. И в нем есть, на что посмотреть.

                    Полный список изменений, как всегда, внушительный. Но здесь мы остановимся на четырех главных фичах релиза. Поехали!


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



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

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

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

                      Читать дальше →
                    • TeamCity 2017.2: 100 бесплатных билд конфигураций, Docker, .NET CLI, композитные билды и улучшения в Kotlin DSL

                        Привет, Хабр! На прошлой неделе мы выпустили новую версию нашего CI и CD сервера: TeamCity 2017.2! Как вы, наверняка, поняли из заголовка, она полна не только новой функциональностью, но и преподнесет приятный сюрприз тем, кто пользуется бесплатной (Professional) версией. Но обо всем по порядку.

                        Прежде всего, список всех улучшений, как всегда, очень внушительный – ознакомьтесь с ним после прочтения этого поста, если захотите подробностей. Здесь же мы остановимся на самых “вкусных” фичах последнего релиза.

                        TeamCity 2017.2 released

                        100 билд конфигураций


                        После обновления до версии 2017.2 все пользователи TeamCity Professional будут приятно удивлены — вместо стандартных 20 билд-конфигураций TeamCity теперь предоставляет 100! Это доступно абсолютно бесплатно каждому пользователю версии 2017.2. Никаких подводных камней. Для не знакомых с терминологией, билд-конфигурация (build configuration) в TeamCity – это то же самое, что и job в терминах Jenkins.
                        Читать дальше →
                      • Git снизу вверх

                        • Translation
                        У этого перевода не совсем обычная история. Системы контроля версий далеки от моих профессиональных интересов. Для рабочих проектов они мне требовались нечасто, причем, разные, так что, каждый раз, когда возникала такая необходимость, я заново вспоминала, как в них делается та или иная операция. А для личных проектов мне хватало возможностей Dropbox, хранящей историю версий файлов.


                        Изображение из твиттера @girlie_mac

                        Но вот однажды я на три незабываемых дня попала в роддом — это иногда случается с женщинами. Из развлечений у меня были новорожденная дочь и телефон с большим экраном. Дочь поначалу развлекала плохо (дома она быстро исправилась), а на телефоне помимо книг и фильмов обнаружился текст «Git from the bottom up», который оказался более чем годным… С тех пор прошло почти 3 года, подросшей дочке уже пора самой начинать использовать Git Git стал мейнстримом, если не сказать стандартом в современной разработке, а я с удивлением обнаружила, что перевода на русский этого чуда, полезного не только начинающим, но и продвинутым пользователям Git, до сих пор нет. Исправляю эту ситуацию.
                        Читать дальше →
                      • Инстанцируем java.lang.Class


                          Конструктор java.lang.Class является одной из самых охраняемых сущностей в языке Java. В спецификации чётко сказано, что объекты типа Class может создавать только сама JVM и что нам тут делать нечего, но так ли это на самом деле?


                          Предлагаю погрузиться в глубины Reflection API (и не только) и выяснить, как там всё устроено и насколько трудно будет обойти имеющиеся ограничения.

                          Читать дальше →
                        • Перформанс: что в имени тебе моём? — Алексей Шипилёв об оптимизации в крупных проектах

                            Оптимизация производительности издавна не даёт покоя разработчикам, представляясь своеобразным «золотым ключиком» к интересным решениям и хорошему послужном списку. Большую обзорную экскурсию по ключевым вехам оптимизации больших проектов  – от общих принципов до ловушек и противоречий —  на прошедшем JPoint 2017 провёл Алексей Шипилёв, эксперт по производительности.



                            Под катом — расшифровка его доклада.
                            Читать дальше →