• Два раза в одну реку или (Не)много о профессиональном выгорании

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

      — Саш, очевидно, работа не приносит тебе удовольствия, — Слава проговаривал бесспорные вещи. Четвертую неделю вместо работы я мчался на очередной детский турнир по футболу. Когда у тебя трое детей, можно 120% своего времени занять их увлечениями. — У меня есть к тебе предложение. Давай отправим тебя в отпуск на год? Я за это время закрою собой бизнес. Доходы, по-прежнему, пополам. Потом ты вернешься с новыми силами, и, может быть, я на год в отпуск схожу.

      Честно говоря, я недолго думал над этим предложением. От работы реально подташнивало, и перспектива на год избавиться от этого источника тошноты манила как никогда раньше. Мы ударили по рукам.
      Читать дальше →
    • DevConf: переход Uber с PostgreSQL на MySQL

        18 мая 2018 года в Digital October состоится DevConf 2018. И мы решили пересказать некоторые интересные доклады с прошлогодней конференции. Там был доклад с несколько холиварным заголовком: "О чём молчит политрук: к дискуссии о переходе Uber с PostgreSQL на MySQL". В нем разработчик MySQL Алексей Копытов рассмотрел различия InnoDb и PostgreSQL на самом низком уровне, включая организацию данных, памяти и репликаций. Предлагаем вашему вниманию краткий пересказ доклада.


        История вопроса


        Uber перешел с MySQL на Postgres в 2013 году и причины, которые они перечисляют, были во-первых: PostGIS — это геоинформационное расширение для PostgreSQL и хайп. То есть, у PostgreSQL есть некий ореол серьезный, солидная СУБД, совершенный, без недостатков. По крайней мере, если сравнивать с MySQL. Они мало что знали о PostgreSQL, но повелись на весь этот хайп и перешли, а через 3 года пришлось переезжать обратно. И основные причины, если просуммировать их доклад — это плохие эксплуатационные характеристики при эксплуатации в production.
        Читать дальше →
      • Pygest #18. Релизы, статьи, интересные проекты, пакеты и библиотеки из мира Python [5 ноября 2017 — 15 ноября 2017]

          image Всем привет! Это уже восемнадцатый выпуск дайджеста на Хабрахабр о новостях из мира Python.

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

          Итак, поехали!



          Читать дальше →
          • +16
          • 9,4k
          • 4
        • Эти токсичные, токсичные собеседования



            Всё началось, когда автор Ruby on Rails признался миру:

            Читать дальше →
          • Никогда не пишите длинных if-ов

              Ошибок в условиях допускается великое множество. Можно взять для примера любой пост из блога PVS-studio, в каждом есть ошибки, связанные с невнимательным обращением с условиями. И правда, нелегко разглядеть ошибку в условии, если код выглядит так (пример из этого поста):

              static int ParseNumber(const char* tx)
              {
                ....
                else if (strlen(tx) >= 4 && (strncmp(tx, "%eps", 4) == 0
                  || strncmp(tx, "+%pi", 4) == 0 || strncmp(tx, "-%pi", 4) == 0
                  || strncmp(tx, "+Inf", 4) == 0 || strncmp(tx, "-Inf", 4) == 0
                  || strncmp(tx, "+Nan", 4) == 0 || strncmp(tx, "-Nan", 4) == 0
                  || strncmp(tx, "%nan", 4) == 0 || strncmp(tx, "%inf", 4) == 0
                        ))
                {
                    return 4;
                }
                else if (strlen(tx) >= 3
                  && (strncmp(tx, "+%e", 3) == 0
                   || strncmp(tx, "-%e", 3) == 0
                   || strncmp(tx, "%pi", 3) == 0   // <=
                   || strncmp(tx, "Nan", 3) == 0
                   || strncmp(tx, "Inf", 3) == 0
                   || strncmp(tx, "%pi", 3) == 0)) // <=
                {
                    return 3;
                }
                ....
              }
              Читать дальше →
            • Индексы в PostgreSQL — 1

                Предисловие


                В этой серии статей речь пойдет об индексах в PostgreSQL.

                Любой вопрос можно рассматривать с разных точек зрения. Мы будем говорить о том, что должно интересовать прикладного разработчика, использующего СУБД: какие индексы существуют, почему в PostgreSQL их так много разных, и как их использовать для ускорения запросов. Пожалуй, тему можно было бы раскрыть и меньшим числом слов, но мы втайне надеемся на любознательного разработчика, которому также интересны и подробности внутреннего устройства, тем более, что понимание таких подробностей позволяет не только прислушиваться к чужому мнению, но и делать собственные выводы.

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

                В этой части мы поговорим про разделение сфер ответственности между общим механизмом индексирования, относящимся к ядру СУБД, и отдельными методами индексного доступа, которые в PostgreSQL можно добавлять как расширения. В следующей части мы рассмотрим интерфейс метода доступа и такие важные понятия, как классы и семейства операторов. После такого длинного, но необходимого введения мы подробно рассмотрим устройство и применение различных типов индексов: Hash, B-tree, GiST, SP-GiST, GIN и RUM, BRIN и Bloom.

                Индексы


                Индексы в PostgreSQL — специальные объекты базы данных, предназначенные в основном для ускорения доступа к данным. Это вспомогательные структуры: любой индекс можно удалить и восстановить заново по информации в таблице. Иногда приходится слышать, что СУБД может работать и без индексов, просто медленно. Однако это не так, ведь индексы служат также для поддержки некоторых ограничений целостности.
                Читать дальше →
              • Лучшие практики Go, шесть лет в деле

                • Перевод
                В 2014 году я выступил на открытии конференции GopherCon с докладом под названием «Go: Best Practices for Production Environments». В SoundCloud мы были одними из первых пользователей Go и к тому времени уже два года писали на нём и поддерживали Go в бою в той или иной форме. За это время мы кое-чему научились, и я попытался поделиться частью этого опыта.

                С тех пор я продолжал программировать на Go в течение всего рабочего дня, сначала в командах SoundCloud, отвечающих за операционную деятельность и инфраструктуру, а теперь работаю в компании Weaveworks над Weave Scope и Weave Mesh. Также я усердно трудился над Go kit, набором инструментов для микросервисов с открытым исходным кодом. И всё это время я принимал активное участие в развитии сообщества Go-программистов, встречался со многими разработчиками на митапах и конференциях по всей Европе и в США, коллекционируя их истории успехов и провалов.

                В ноябре 2015-го, на шестую годовщину релиза Go, я вспоминал то своё первое выступление. Какие из лучших практик прошли проверку временем? Какие из них устарели или стали неэффективными? Появились ли какие-то новые методики? В марте мне представилась возможность выступить на конференции QCon London, где я рассказал о лучших практиках 2014 года и дальнейшем развитии Go до 2016 года. В этом посте представлена выжимка из моего выступления.

                Ключевые положения я выделил в тексте в виде Top Tips — лучших советов.

                А вот и cодержание:

                1. Среда разработки
                2. Структура репозитория
                3. Форматирование и стиль
                4. Конфигурация
                5. Разработка программы
                6. Логирование и метрики
                7. Тестирование
                8. Управление зависимостями
                9. Сборка и развёртывание
                10. Заключение
                Читать дальше →
              • Создание архитектуры программы или как проектировать табуретку

                Взявшись за написание небольшого, но реального и растущего проекта, мы «на собственной шкуре» убедились, насколько важно то, чтобы программа не только хорошо работала, но и была хорошо организована. Не верьте, что продуманная архитектура нужна только большим проектам (просто для больших проектов «смертельность» отсутствия архитектуры очевидна). Сложность, как правило, растет гораздо быстрее размеров программы. И если не позаботиться об этом заранее, то довольно быстро наступает момент, когда ты перестаешь ее контролировать. Правильная архитектура экономит очень много сил, времени и денег. А нередко вообще определяет то, выживет ваш проект или нет. И даже если речь идет всего лишь о «построении табуретки» все равно вначале очень полезно ее спроектировать.

                К моему удивлению оказалось, что на вроде бы актуальный вопрос: «Как построить хорошую/красивую архитектуру ПО?» — не так легко найти ответ. Не смотря на то, что есть много книг и статей, посвященных и шаблонам проектирования и принципам проектирования, например, принципам SOLID (кратко описаны тут, подробно и с примерами можно посмотреть тут, тут и тут) и тому, как правильно оформлять код, все равно оставалось чувство, что чего-то важного не хватает. Это было похоже на то, как если бы вам дали множество замечательных и полезных инструментов, но забыли главное — объяснить, а как же «проектировать табуретку».

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

                Данная статья является попыткой ответить на эти вопросы хотя бы в первом приближении.
                Читать дальше →
              • Я хочу, чтобы сайты открывались мгновенно

                  Здравствуйте, меня зовут Александр Зеленин и я веб-разработчик. Я расскажу, как сделать так, чтобы ваш сайт открывался быстро. Очень быстро.


                  Я хочу, чтобы мой сайт открывался быстро
                • Постулаты Go

                    В игре Go очень простые правила, но стать мастером в ней непросто, нужно научиться думать паттернами, территориями и прочими стратегическими концепциями. Язык Go не совсем случайно назван аналогично названию этой игры. В своем выступлении на недавнем митапе в Сан-Франциско, Роб Пайк упомянул книгу «Постулаты Go» (Go Proverbs), которые описывают сложные стратегии простыми поэтичными фразами. Эти постулаты несут глубинный смысл для тех, кто знаком с игрой Go, и могут казаться пустыми фразами тем, кто не знаком. И в этом нетехническом докладе он предложил придумать аналогичным способом «постулаты» и для языка Go.

                    Вот некоторые из них:
                    • Don't communicate by sharing memory, share memory by communicating.
                    • Concurrency is not parallelism.
                    • Channels orchestrate; mutexes serialize.
                    • The bigger the interface, the weaker the abstraction.
                    • interface{} says nothing.
                    • Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.
                    • A little copying is better than a little dependency.
                    • Cgo is not Go.
                    • Clear is better than clever.
                    • Reflection is never clear.
                    • Errors are values.


                    Это чем-то похоже на Zen of Python. Вы можете не соглашаться с ними, но эти постулаты отражают идиоматичность и подход в Go. Давайте разберем подробнее каждый из них по мотивам доклада (видео в конце поста).
                    Читать дальше →
                  • 400 потрясающих бесплатных сервисов

                    • Перевод

                    Рад представить дополнение оригинального списка из 300 потрясающих бесплатных сервисов. Автор оригинальной статьи Ali Mese добавил ещё +100 новых сервисов, которые помогут найти все — от источников вдохновения и редакторов фотографий до создания опросов и бесплатных иконок.

                    И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



                    A. Бесплатные веб-сайты

                    • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
                    • Bootswatch: Бесплатные темы для Bootstrap.
                    • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
                    • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
                    • Strikingly: Конструктор веб-сайтов.
                    • Layers: Создание сайтов на WordPress (new).
                    • Bootstrap Zero: Самая большая коллекция бесплатных шаблонов Bootstrap (new).
                    • Landing Harbor:  Продвижение мобильного приложения c помощью бесплатного лендинга (new).
                    Читать дальше →
                  • Подборка бесплатных инструментов для разработчиков

                    • Перевод
                    Сегодня мы представляем вашему вниманию адаптированную подборку инструментов (в том числе облачных) для разработчиков, которые позволяют создавать по-настоящему качественные проекты. Здесь представлены исключительно SaaS, PaaS и IaaS сервисы, предоставляющие бесплатные пакеты для разработчиков инфраструктурного ПО.

                    Читать дальше →
                  • Лайфхаки для веб-разработчика

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

                      Использование ** в zsh


                      Таким образом я ищу файлы в папке по расширению рекурсивно:
                      ls **/*.json
                      

                      файлы с размером выше чем 1 мегабайт:
                      ls -lh **/*(Lm+1)
                      

                      Быстро и уверенно удаляем мусор из репозитория в python проекте и судорожно правим. gitignore:
                      git rm --cached **/*.pyc
                      


                      Читать дальше →
                    • Делаем вебсокеты на PHP с нуля

                      Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

                      Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

                      Так я решил написать необходимый для меня функционал с нуля.

                      Получившийся код и ссылка на демонстрационный чат в конце статьи.
                      Читать дальше →