• Моноиды, полугруппы и все-все-все

    • Перевод

    Если ты на практике используешь ООП, то хорошо разбираешься в таких вещах, как «паттерны проектирования». А знаешь ли ты, что есть множество полезных паттернов, которые не укладываются в этот стандартный список? К сожалению, многие из них связаны с «функциональным программированием», которое, согласно легенде, сложное и заумное. Если десять раз сказать слово «моноид», можно вызвать Дьявола.


    Mark Seeman расскажет о функциональном программировании просто и быстро. Для этого он начал писать цикл статей, посвященных связи между паттернами проектирования и теорией категорий. Любой ООПшник, у которого есть 15 минут свободного времени, сможет заполучить в свои руки принципиально новый набор идей и инсайтов, касающихся не только функциональщины, но и правильного объектно-ориентированного дизайна. Решающим фактором является то, что все примеры — это реальный код на C#, F# и Haskell. Этот хабрапост — перевод самого начала цикла, первых трех статей, слитых воедино для удобства понимания.


    Кроме того, с Марком можно пообщаться вживую, посетив конференцию DotNext 2017 Moscow, которая состоится 12-13 ноября 2017 г. в Москве, в «Славянская Рэдиссон». Марк прочитает доклад на тему «From dependency injection to dependency rejection». Билеты можно взять здесь.

    Читать дальше →
  • Как уволить сотрудника и остаться при этом человеком

      Многие боятся публичных выступлений. Говорят даже, что страх публичных выступлений – самый сильный страх человека. Наверное, они никогда не пробовали уволить человека. Для любого начинающего руководителя, да и для многих опытных, это то еще испытание.

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

      Скажу сразу, увольнение сотрудника почти всегда не вина сотрудника, а часто стечение обстоятельств: не тот проект, не те коллеги, не тот руководитель, который подходит сотруднику. Конечно, бывает и так, что сотрудник сам виноват, но, к счастью, с такими мне не приходилось встречаться.
      Читать дальше →
    • Ещё раз о неопределённом поведении или «почему не стоит забивать гвозди бензопилой»

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

        Хотя на самом-то деле, если вспомнить историю Си, всё достаточно очевидно и, главное, логично. А все жалобы людей, «обжёгшихся» на неопределённом поведении для людей не забывших что такое Си и зачем он вообще существует звучат примерно как: «я тут гвозди бензопилой забивал… забивал и забивал, всё было хорошо, а потом я дёрнул за ручку и у неё коготки как забегают, задёргаются, мне руку оттяпало и полноги… ну кто так строит?».

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

        Так какой же важный секрет люди упускают из виду?
      • «Ржавая» IP-камера: прошивка на Rust

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

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

          Грустная реальность в том, что очень часто этот софт написан далеко не лучшим образом. Достаточно сказать, что большинство камер, которые висят на улице очень страдают из-за большого расстояния до сервера, потому что авторы их прошивки освоили мастерство потерь данных по TCP.

          Мы решили исправить эту ситуацию своей прошивкой, причем сделав ставку на Rust.
          Читать дальше →
        • Пример решения типичной ООП задачи на языке Haskell

          • Tutorial
          Рассмотрим типичную задачу, из тех, что обычно считаются «ООП-эшными». Имеется список данных (объектов) имеющих не одинаковые структуры (по научному, гетерогенный список), при чём, над каждым нужно выполнять одинаковые действия – по простому, каждый можно передать в некую функцию.
          Читать дальше →
          • +22
          • 22,4k
          • 9
        • Haskell: об одном методе реализации функций с переменным числом параметров

          • Tutorial

          – А видела ты Черепаху «Как бы»?
          – Нет, – сказала Алиса. – Я даже не знаю, кто это такой.
          – Как же, – сказала Королева. – Это то, из чего делают «Как бы черепаший суп».

                            Льюис Кэрролл, 
                                     «Алиса в Стране чудес»

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

                           Джон Р. Р. Толкиен, 
                                    «Властелин Колец» — к слову о моём знании Haskell ;)


          Homines dum docent, discunt. (Объясни другим — сам поймёшь.)
                           народная латинская поговорка


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

          Казалось бы о каком переменном числе параметров может идти речь при таком раскладе? Однако поразмыслив, посмотрев исходники printf или просто почитав wiki.haskell становится очевидным, что как раз ФП даёт ключ к достаточно красивому, хотя и несколько «казуистическому» решению этой задачи.

          В настоящей публикации я рассмотрю один из способов реализации такого механизма на простых примерах, а также предложу некоторое обобщённое решение на базе Template Haskell, для превращения семейства обычных функций с последним параметром типа список в функцию с «как бы с переменным числом параметром» (далее по тексту просто «с переменным числом параметром»).
          Читать дальше →
        • Пиратство и четыре валюты

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


          Известный всем денежный доллар.

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

          Я предлагаю такие обозначения:

          1. ($Д) Денежные доллары
          2. ($В) Временные доллары
          3. ($Г) Доллары головной боли [в оригинале «Pain-in-the-butt-dollars»]
          4. ($Ч) Доллары честности

          Игрок делает выбор купить или спиратить игру на основании того, сколько «стоит» каждая услуга (а не продукт!) в этих четырёх валютах, а также в зависимости от ценности для игрока каждой из них.
          Читать дальше →
        • Подходы к версионированию изменений БД

          Намного лучше дисциплинарные ограничения убирать инструментарным расширением
          Автор статьи


          Введение


          При разработке информационной системы, то есть программы, нацеленной на хранение, работу с данными, обработку, анализ и визуализацию какой-то базы данных, одним из краеугольных камней стоит задача разработки БД. Когда я только начинал задаваться этим вопросом, казалось – что ни сделай, все равно будет криво.


          На протяжении 5 лет разработки нескольких корпоративных ИС, я ставил и пытался решать вопросы, как тот или иной аспект разработки БД сделать удобным. Искал инструменты, помогающие что-то делать с БД, методологии. На удивление в этой области мало наработок. И в каждом подходе сразу видно – вот это нельзя, вот тут будет неудобно, тут слишком много дисциплинарных правил (см эпиграф)… В этой статье я попытался собрать те походы, которые считаю наиболее эффективными, и один, в добавление к собранным, представлю как венец моих исканий, который считаю наиболее «бронебойным».

          Читать дальше →
        • Favicon сегодня: форматы, поддержка, автоматизация

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



          Читать дальше →
        • Как я пишу код

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

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

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

          Код, использующий неявное поведение, может быть основан на каком-нибудь недокументированном, но уже реализованном функционале. Например, в мире написана целая куча НЕВЕРНОГО кода, который полагается на то, что функция файловой системы, возвращающая список директорий, вернёт их в отсортированном по алфавиту порядке. Это и вправду часто работает именно так, но ровно до того момента, пока не ломается по «непонятным» причинам. А на самом деле просто никто никогда этой сортировки не гарантировал.
          Читать дальше →