• Генеральный конструктор vs Скрам-мастер

      image

      «Каспийский монстр» — советский экраноплан, который весил 544 тонны, что делало его самым тяжелым летательным аппаратом в мире. Сделан с нуля за два года. Думай об этом, закачивая лэндинг по продаже трусов «всего» за полгода.

      Я бы хотел рассказать о некоторых приемах древнего(доскрамового периода) менеджмента, которые позволяли добиваться таких результатов. Поднять в воздух на новом принципе железную бандуру размером с хрущевку и разогнать ее до пятисот киломtnров в час, по мне — это более творческая и технически сложная задача, чем открытие очередного интернет магазина, поэтому возможно стоит перенять опыт предков.
      Читать дальше →
    • Ты добавил всего две строчки. Почему на это ушло два дня?

      • Перевод
      На первый взгляд вопрос кажется разумным, но он делает некоторые ужасные предположения:

      • строки кода = усилие
      • строки кода = значение
      • все строки кода равны

      Ничто из этого не является истинным.

      Почему исправление, которое кажется таким простым, заняло два дня?
      Читать дальше →
    • Парсите, а не валидируйте

      • Перевод

      Еще в декабре мне попалась одна совершенно замечательная статья на английском, посвящённая использованию системы типов языка для более широкого класса задач, для повышения надежности приложений и простоты рефакторинга. К сожалению, в тот момент я был слишком занят написанием статей по ФП, которые крайне важно было написать, пока свежи воспоминания. Но теперь, когда с этой задачей я справился, наконец дошли руки перевести эту замечательную заметку. Оригинальный язык примеров — Хаскель, но я решил переписать их на раст, для более широкого охвата аудитории. Однако язык тут совершенно неважен, советы этой статьи я применяю в ежедневной разработке на вполне себе "приземлённых" C# и TypeScript, так что если вы просто стараетесь писать надёжный и поддерживаемый код, то, вне зависимости от языка, статья вам будет в тему.


      Благодарю за вычитку и помощь в переводе Hirrolot, funkill и andreevlex


      Читать дальше →
    • Про фразовые глаголы

        Фразовые глаголы английского языка гораздо проще, чем кажутся. Они работают точно так же, как в русском языке приставки. Выдающийся советский актёр Зиновий Гердт, узнав однажды о недостойном поступке, совершённом знакомым ему писателем, сказал: «Разрешите с вами раззнакомиться». Думаю, мало кто слышал в живой речи глагол «раззнакомиться». Но интуитивно всё равно понятно, что это противоположность «ПО-знакомиться».

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

        Безответственные преподаватели рекомендуют значения фразовых глаголов «просто запоминать», не пытаясь понять их внутреннюю логику. Это порочная практика: фразовых глаголов только самых распространённых – тысячи. «Выучить» их принципиально невозможно. Вот, скажем, let – это «позволять, пускать». А фразовый глагол «let in on» означает «посвящать в тайну». Запомнить такое способен только человек, который понимает переносные значения частиц, образующих фразовые глаголы.

        Если правильно усвоить эти переносные значения, можно начать понимать даже такие фразовые глаголы, с которыми сталкиваешься впервые. Знание нескольких принципов освобождает от необходимости знания многих фактов.
        Читать дальше →
      • Что в Белизне тебе моей или Справочное пособие по гипохлориту натрия («хлорке»)

        • Tutorial
        Не передать, насколько мне приятно это писать. Данная статья полностью профинансирована подписчиками канала LAB66. Ни один производитель описанных в тексте средств -  своего участия не проявил, так что никакой скрытой рекламы, чиcтый альтруизм и потребительский интерес :)

        Сегодня читаем о самом простом, самом доступном и самом действенном антисептике — про гипохлорит натрия (он же «Белизна»). Совместимость с различными материалами, техника безопасности, свойства и эффективность не только против коронавируса, но и против страшной плесени и ее микотоксинов. В качестве «вишенки» — контрольная закупка магазинных отбеливателей и оценка их состава. Чтобы узнать как в эпоху пандемии нас дурят производители бытовой химии и прочий «менеджерский брат» — идем под кат. И обязательно закидываем в закладки. Эта информация пригодится еще не раз ;)


        Даешь нормальную Белизну!
      • Функциональное программирование — то, что вам (наверно) рассказывали. Если вы слушали

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

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

          Насколько это соответствует истине?
          Читать дальше →
        • Принцип единственной ответственности: глубокое погружение

            Про принцип единственной ответственности (The Single Responsibility Principle, SRP) уже было написано множество статей. В большинстве из них даётся лишь поверхностное его описание мало чем отличающееся от информации в википедии. А те немногие статьи что затрагивают ключевые особенности SRP делают это вскользь, не акцентируя на них внимания и не развивая тему дальше.

            Эта статья — попытка дать более глубокое объяснение принципу единственной ответственности, а также показать как его всё таки можно применять на практике. Кому интересно — добро пожаловать под кат.
            Читать дальше →
          • Умение видеть абстракции



              Моему сыну, как и многим мальчишкам, нравятся автомобили. Причём чем они больше и необычнее — тем больше нравятся. Когда мы идём по улице, а мимо проезжает эвакуатор или снегоуборочная машина, он неизменно дёргает меня за руку, указывает на заинтересовавший его объект и говорит: «Папа, б-р-р!». Говорит он так потому, что ему один год и вышеуказанные два слова составляют 40% его словарного запаса. Тем ни менее, в общем мысль понятна — обратить внимание на автомобиль. Давайте подумаем, каким образом ребёнок в возрасте 8-10 лет сказал бы своему сверстнику то же самое. Что-то вроде «Ух ты, смотри какая крутая тачка!», да? Мысль та же, но обратите внимание — уже шесть слов вместо двух. И, наконец, представьте, каким образом то же самое скажет человек лет в тридцать: «Эй, смотри, да это же Ferrari California 2008-го года выпуска с двигателем V8 мощностью в 454 лошадиных силы и 7-ми скоростной коробкой-автоматом! Она до сотни разгоняется за 3.9 секунды!». Да, здесь уже больше деталей, но, если вы не автомеханик или фанат Ferrari — они вам скорее всего не нужны и не важны. Основная же мысль — всё та же, что и в «Ух ты, смотри какая крутая тачка!» или «Папа, б-р-р!». Но выражена она уже в 30 слов.

              Вы заметили, как абстракция «интересный автомобиль» обросла деталями и нюансами, стала занимать существенно больше места в тексте и времени на понимание, анализ и ответ? То же самое происходит и с программным кодом.
              Читать дальше →
            • Алан Кэй, создатель ООП, про разработку, Лисп и ООП

              • Перевод
              image

              Если вы никогда не слышали про Алана Кэя, то как минимум слышали его знаменитые цитаты. Например, это высказывание 1971 года:
              The best way to predict the future is to invent it.
              Лучший способ предсказать будущее это изобрести его.


              У Алана очень яркая карьера в информатике. Он получил Премию Киото и Премию Тьюринга за работу над парадигмой объектно-ориентированного программирования. Он был одним из первопроходцев в области персональных компьютеров и графического интерфейса, он разработал Smalltalk — один из первых самых влиятельных языков программирования всех времен.

              У нас в Хекслете, особенно в чате, постоянно поднимается вопрос «что такое ООП» и «что имел ввиду Алан Кэй на самом деле». В этой заметке собраны интересные цитаты Алана о состоянии современной разработки, ООП и языке Лисп.
              Читать дальше →
            • Чистые тесты на PHP и PHPUnit

              • Перевод
              • Tutorial

              В экосистеме PHP существует много инструментов, обеспечивающих удобное тестирование на PHP. Одним из самых известных является PHPUnit, это почти синоним тестирования на этом языке. Однако о хороших методиках тестирования пишут не так много. Есть много вариантов, для чего и когда писать тесты, какого рода тесты, и так далее. Но, честно говоря, не имеет смысла писать тест, если позднее вы не сможете его прочесть.

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

              Если один тест не может выразить эту идею, то тест плохой.

              Я подготовил набор методик, которые станут подспорьем для PHP-разработчиков в написании хороших, удобочитаемых и полезных тестов.
              Читать дальше →
            • Зачем ограничивать наследование с помощью final?

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


              Гибкость – это конечно полезная черта дизайна. Однако при выборе архитектуры нас интересуют в первую очередь сопровождаемость, тестируемость, читабельность кода, повторное использование модулей. Так вот с этими критериями хорошего дизайна у наследования тоже проблемы. «И что же теперь, не использовать наследование вообще?» – спросите Вы.


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


              Проблема хрупкого базового класса


              Проблема хрупкого базового класса

              Читать дальше →
            • Моделирование работы реальной ТЭЦ для оптимизации режимов: пар и математика



                Есть большая ТЭЦ. Работает как обычно: жжёт газ, вырабатывает тепло для отопления домов и электричество для общей сети. Первая задача — отопление. Вторая — продать всё выработанное электричество на оптовом рынке. Иногда ещё в мороз при ясном небе появляется снег, но это побочный эффект работы градирен.

                Средняя ТЭЦ состоит из пары десятков турбин и котлов. Если точно известны необходимые объёмы выработки электроэнергии и тепла, то задача сводится к минимизации затрат на топливо. В этом случае расчёт сводится к выбору состава и процента загрузки турбин и котлов для достижения максимально высокого КПД работы оборудования. КПД турбин и котлов сильно зависит от типа оборудования, времени работы без ремонта, режима работы и много чего ещё. Есть и другая задача, когда при известных ценах на электричество и объёмах тепла нужно решить, сколько выработать и продать электроэнергии для того, чтобы получить максимальную прибыль от работы на оптовом рынке. Тогда фактор оптимизации — прибыль и КПД оборудования — имеет гораздо меньшее значение. Результатом может быть режим, когда оборудование работает абсолютно неэффективно, но весь выработанный объём электроэнергии можно продать с максимальной маржой.

                В теории всё это давно понятно и красиво звучит. Проблема — как это сделать на практике. Мы начали имитационное моделирование работы каждой единицы оборудования и всей станции в целом. Пришли на ТЭЦ и начали собирать параметры всех узлов, замеряя их реальные характеристики и оценивая работу в разных режимах. На их основе мы создавали точные модели для имитации работы каждой единицы оборудования и использовали их для оптимизационных расчётов. Забегая вперёд, скажу, что мы выиграли порядка 4 % реальной эффективности просто за счёт математики.
                Читать дальше →
              • Функциональное программирование — это не то, что нам рассказывают

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



                  Хотя люди обычно признают удобства ФП фич, ведь намного приятнее писать:


                  int Factorial(int n)
                  {
                      Log.Info($"Computing factorial of {n}");
                      return Enumerable.Range(1, n).Aggregate((x, y) => x * y);
                  }

                  чем ужасные императивные программы вроде


                  int Factorial(int n)
                  {
                      int result = 1;
                      for (int i = 2; i <= n; i++)
                      {
                          result *= i;
                      }
                      return result;
                  }

                  Так ведь? С одной стороны да. А с другой именно вторая программа в отличие от первой является функциональной.


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

                  Читать дальше →
                • Город без пробок

                    Ⅰ.Искусство разумно применять светофоры


                    Ⅱ.Искусство проектирования дорожных сетей




                    Глава первая.

                    Искусство разумно применять светофоры


                    Маленькое предисловие


                    Каждый день, оказываясь рядом с перекрестком, мы наблюдаем одну и ту же картину, как на зеленый свет машины мчатся вперед, а на красный — они скапливаются перед светофором в длинные очереди бесполезного ожидания. Но насколько привычное является одновременно необходимым и можно ли сделать так, чтобы в своем путешествии по городу автомобилистам почти не приходилось «стоять» на красный свет? Я думаю, многие из нас слышал о мифических «зеленых волнах». Попав в такую волну и поддерживая определенную скорость, автомобилист чудесным образом будет подъезжать к каждому перекрестку как раз в то время, когда светофор горит в его сторону зеленым светом. Довольно просто организовать распространение таких «волн» вдоль одной изолированной дороги, но совсем не очевидно, можно ли это сделать на дорогах всего города сразу.
                    Читать дальше →
                  • Моё разочарование в софте

                    • Перевод

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


                    Я занимаюсь программированием уже 15 лет. Но в последнее время при разработке не принято думать об эффективности, простоте и совершенстве: вплоть до того, что мне становится грустно за свою карьеру и за IT-отрасль в целом.

                    Для примера, современные автомобили работают, скажем, на 98% от того, что физически позволяет нынешняя конструкция двигателя. Современная архитектура использует точно рассчитанное количество материала, чтобы выполнять свою функцию и оставаться в безопасности в данных условиях. Все самолёты сошлись к оптимальному размеру/форме/нагрузке и в основном выглядят одинаково.

                    Только в программном обеспечении считается нормальным, если программа работает на уровне 1% или даже 0,01% от возможной производительности. Ни у кого вроде нет возражений.
                    Читать дальше →
                  • Вотериус: Передача показаний воды на телефон по Wi-Fi (4 года от батареек)



                    Однажды мне надоело снимать показания счётчиков воды. Можно было поселить рядом со счетчиком магнит и на этом успокоиться, но этот путь я счёл неспортивным.

                    Мой путь оказался непростым и витиеватым. Но в результате получилось устройство, передающее показания воды по Wi-Fi на телефон. Простое и понятное в использовании и настройке хоть школьнику, хоть гуманитарию пенсионеру. А знакомым со словом «Ардуино» — ещё и несложное для изготовления. Девайс способен работать от батареек четыре года (дольше, чем длились отношения с вашей бывшей). Это ещё и первый открытый проект с такими характеристиками. Заводские аналоги я выписал, их мало, да и ладно с ними.

                    Итак, у нас есть немного денег и большое, но честное желание упростить себе жизнь, не нарушая Уголовный Кодекс. И чтобы никаких этих ваших 220В, серверов и кучи кнопок! Показания смотрим на смартфоне в приложении Blynk или аналогичном сервисе.

                    Теперь устройтесь в кресле поудобнее, съешьте ещё этих мягких французских булочек да выпейте чаю. Смотрите красивые фотографии и слушайте мой рассказ о том, что надо учитывать при создании автономных устройств. Но сначала краткое описание Вотериуса.
                    Читать дальше →
                  • Рефакторинг программы на Go: ускорение в 23 раза

                    • Перевод


                    Привет! Меня зовут Марко, я работаю в Badoo в отделе «Платформы». У нас довольно много всего написано на Go, и зачастую это критичные к производительности системы. Именно поэтому сегодня я предлагаю вашему вниманию перевод статьи, которая мне очень понравилась и, я уверен, будет вам очень полезна. Автор пошагово показывает, как он подходил к проблемам производительности и как их решал. В том числе вы познакомитесь с богатым инструментарием, доступным в Go для такой работы. Приятного чтения!

                    Несколько недель назад я прочитал статью «Хороший код против плохого кода в Go», где автор шаг за шагом демонстрирует рефакторинг реального приложения, решающего реальные бизнес-задачи. Она сфокусирована на превращении «плохого кода» в «хороший код»: более идиоматичный, более понятный, полноценно использующий специфику языка Go. Но автор также заявлял о важности производительности рассматриваемого приложения. Во мне взыграло любопытство: давайте попробуем её ускорить!
                    Читать дальше →
                  • Как освоить иностранный язык без преподавателя. Часть 1. «Мой опыт»

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


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


                      таблица-вертушка неправильных глаголов


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

                      Читать дальше →
                    • Температура и давление фантастики — часть 1/3

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

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

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

                        Часть 1. pT-диаграмма

                        Читать дальше →
                      • Новогодние подарки, часть первая: Meltdown

                          Да, я знаю, что это уже третий материал на GT/HH по данной проблеме.

                          Однако, к сожалению, до сих пор я не встречал хорошего русскоязычного материала — да в общем и с англоязычными, чего уж тут греха таить, та же проблема, там тоже многих журналистов изнасиловали учёные — в котором внятно раскладывалось бы по полочкам, что именно произошло 3 января 2018 года, и как мы будем с этим жить дальше.

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

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

                          К счастью, подвержены они ей в разной степени. К несчастью, самый серьёзный удар пришёлся на самые распространённые процессоры — Intel, причём затронул он абсолютно все выпускающиеся и практически все эксплуатируемые (единственным исключением являются старые Atom, выпущенные до 2013 года) процессоры этой компании.
                          Читать дальше →