• Сага о DRY и зависимостях

    Предположим, в вашем проекте два модуля: project.foo и project.bar. В первый из них вы добавили служебную функцию, например поиск элемента по предикату. Через некоторое время то же самое понадобилось во втором модуле. Как вы поступите?

    Варианты:

    1. Вынесу функцию в третий модуль project.utils и подключу его к foo и bar.
    2. Скопирую функцию во второй модуль.

    Конечно, вы и так знаете, что правильный способ — первый. DRY (Don’t Repeat Yourself), не дублируй код. Держи одну точку входа, чтобы в случае ошибки править в одном месте. Копирование — наш враг и все такое. Я тоже тоже так думал раньше, и вот, в тридцать пять лет, поменял мнение.

    Read more →

  • Clojure Zippers

    Part 1. The Basics of Navigation

    In this article, we will discuss zippers in the Clojure language. These are an unusual way to work with collections. Using a zipper, you can traverse a data structure arbitrarily and modify its content as well as search in it. A zipper is a powerful abstraction that pays off over time. However, it is not as straightforward as regular tools and requires training to deal with.

    Let’s talk about a zipper in simple terms. It is a wrapper that offers a variety of data manipulations. Let’s list the main ones:

    • moving vertically: down to children or up to a parent;
    • moving horizontally: left or right among children;
    • traversal of the entire data structure;
    • adding, editing and deleting nodes.

    Read more →

  • Ссылки на выходные (выпуск 34)

    Советую посвятить выходные новому изданию “Кинжал”. Ребята пишут небольшие заметки о работе и жизни. Получается супер. Каждая заметка — острая и хлесткая, как настоящий кинжал. Никакой воды, только по сути. Эти вещи вы читали у других и у меня, но в “Кинжале” написано лучше.

    То, что зацепило:

    И так далее, на сайте еще.

    А вот Максим Ильяхов (он там редачит) рассказывает об издании.

  • Configuration in Clojure

    Clojure in Production

    In This Chapter

    Configuration

    In this chapter, we will discuss how to make a Clojure project easy to configure. We’ll take a look at the basics of config: file formats, environment variables, libraries, and their pros and cons.

    Formulation of the Problem

    In materials on Clojure, there are such examples:

    (def server
      (jetty/run-jetty app {:port 8080}))
    
    (def db {:dbtype   "postgres"
             :dbname   "test"
             :user     "ivan"
             :password "test"})
    

    These are the server on port 8080 and the parameters for connecting to the database. The examples are useful because you can execute them in the REPL and check their result: open a page in a browser or perform a SQL query.

    In practice, we should write code so that it does not carry concrete numbers and strings. Explicitly setting a port number to a server is considered bad practice. That is fine for documentation and examples, but not for the production launch.

    Port 8080 and other combinations of zeros and eights are popular with programmers. There is a good chance that the port is occupied by another server. This happens when instead of running one service, you start a bunch of them at once during development or testing.

    The code written by a programmer goes through several stages. These stages may differ between companies, but in general, they are development, testing, staging/pre-production, and production.

    At each stage, the application runs alongside other projects. The assumption that port 8080 is free anytime is fanciful. In developer slang, the situation is called “hardcode” or “nailed down.” If there are nailed-down values in the code, they introduce problems into its life cycle. You cannot run two projects in parallel which declare port 8080 in their code.

    The application does not need to know the server port – information about this comes from the outside. In a simple case, this source is the config file. The program reads the port from it and starts the server exactly as it needs to do on a specific machine.

    In more complex scenarios, the file is not compiled by a person but a special program – a configuration manager. The manager stores information about network topology, machine addresses, and database access parameters. On request, it generate a config file for a specific machine or network segment.

    The process of passing parameters to an application and accepting them is called configuration. This step in software development deserves close attention. When it is done well, the project easily goes through all the stages of production.

    Read more →

  • Можно ударить по голове

    Недавно я употребил в блоге фразу: если не выстрелит, ей можно ударить по голове (речь о втором издании книги). Это отсылка к фильму Snatch, в русском переводе “Большой куш”. Вспомнил, как мы с приятелем будучи подростками смотрели гоблинский перевод и ржали над матами. А ещё вспомнил, что даже тогда заметил одну деталь, связанную с этой фразой.

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

    Фраза звучит несколько раз, и очевидно, в какой-то момент она должна сыграть. Поскольку мы в комедии, нелепый тезис должен сработать при нелепых обстоятельствах. Другими словами, повторяя некую фразу, режиссер подводит зрителя к ситуации. И тут нас ждёт разочарование — в случае “не выстрелит” режиссер не уделил шутке внимания.

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

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

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

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

    Морали нет, просто наблюдение. Уже давно замечаю за собой, что после фильма обдумываю отдельные сцены, чтобы найти более удачные повороты сюжета, диалоги или черты персонажей. Эта заметка — попытка зафиксировать одну из таких идей.

  • Переназначение клавиш на Маке

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

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

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

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

    Типичные пациенты:

    На последней картинке – Microsoft Sculpt. Я пользовался ей полгода, но страшно заболела левая рука.

    Read more →

  • Что не так

    Один из самых дурацких вопросов — “что не так с X”. Примеры:

    • Мы в редакции не используем букву ё.
    • Что не так с ё?

    • Мы перешли с Node.js на Python.
    • Что не так с Нодой?

    • Новый ролик я монтировал в Final Cut, а не Premiere.
    • Что не так с Премьером?

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

    Но собеседник переложил работу на меня. Я понимаю, что он имел в виду, но тогда мой ответ звучит слабо. С буквой ё все в порядке, просто мы…, программа хорошая, но я… Получается ерунда.

    Заметил, что подобный вопросы задают тролли, которым нужна подобная интонация. Либо человек, которым движет вера. Что бы вы ни сказали, он будет гнуть свою линию. Отсюда эта лёгкая дерзость: во фразе “что не так с X” уже слышится претензия.

    Подобные вещи я либо игнорирую, либо прошу задать вопрос правильно. Что ты имеешь в виду? Я не говорил, что с X что-то не так. Объясни, чего хочешь.

    Кидайте эту заметку тем, кто злоупотребляет “что не так с X”.

    См. также Whataboutism.

  • Второе издание

    У меня большая радость — выпустил второе издание книги “Clojure на производстве”. Сел за него спустя полгода после первой публикации. Процесс занял четыре месяца, и вот — готово.

    Исправил опечатки и неточности, о которых сообщили читатели. Низкий поклон всем, кто их прислал.

    Некоторые разделы урезал, другие, наоборот, дополнил. Так, в главе про спеку мне показался слабым пример, где парсим конфигурацию через s/conform. Опыт подсказывает, что так не делают в проде, поэтому удалил эту часть. Заменил ее на парсинг структур данных — задачу, которую решал в либе Etaoin.

    То же самое относится к другим главам — нашлись смысловые неточности, которые пришлось проверить и допилить.

    Самое важное — в книге наконец-то шрифт нормального размера. Вы будете смеяться, но в первом издании на титульном листе был незакрытый тег \small, из-за которого остальной текст был на один пункт меньше. Глаз замылился, и я заметил это уже когда сдал макет в печать. Позже получил несколько писем о том, что шрифт маловат. Теперь это исправлено, но и книга потолстела — с 360 до 444 страниц, то есть на четверть.

    Купить книгу можно все теми же способами:

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

    Электронная версия на Gumroad. Если вы уже покупали, то сервис позволит вам скачать новые файлы бесплатно. Я обновляю их с каждой найденной опечаткой, которые, увы, все еще попадаются.

    Ну и самое важное — провел эксперимент. Отпечатал двадцать пробных книжек формата B5 в твердой обложке. Это нечто среднее между А5 и А4. После первого издания книга смотрится неприлично большой. Даже если не выстрелит, ей можно ударить по голове ©. Зато очень легко читать и листать.

    Несколько фотографий. В мягкой глянцевой обложке, обычный формат А5:

    Read more →

  • Помидор

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

    Помидор — это когда вы работаете интервалами по 20-25 минут с перерывами по пять минут. Отвлекаться на что-то, не связанное с задачей, нельзя. Сюда входит почта (вдруг что-то пришло), Телеграм (вдруг написали важное), Ютуб и левые сайты. После четырёх помидоров положен долгий отдых в 20 минут. Идеальный случай — сделать восемь помидоров за день.

    Сперва кажется, что это мало — всего-то 8 * 20 = 160 минут, или 2.5 часа. Это ошибка, которую допускают те, кто не пробовал. Два с половиной часа чистой, ничем не разбавленной работы — это офигеть как много. Учтите, что сюда не входят звонки, обед, походы в туалет и за чаем, офисные разговоры и Ютуб. Всё это занимает три часа и больше. Добавим сюда те якобы жалкие два часа работы, и вот он, ваш рабочий день.

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

    Так вот, помидор. Он сто раз описан в книгах, нет смысла повторяться. Перечислю то, что зашло лично мне.

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

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

    • Под мак нашлось настольное приложение pomidorko (см. картинку). Выше всяких похвал: минимальное, одна кнопка, пара опций. И плевать, что чего-то не умеет: лучше меньше, да лучше. Поддержите автора деньгами, в подвале сайта ссылки.

    • Цикл помидора выставляю на 20 минут. Сначала кажется, что это мало, и порой сигнал звучит в тот момент, когда только разогнался. Тут главное не посчитать себя суперменом и не выставить на 30 и больше, иначе выгоришь устанешь.

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

    • К помидору трудно привыкнуть. Начинается классическая ломка: хочу Ютуб, а нельзя. Хочу Телеграмчик, а тоже нельзя. Всё это заставляет задуматься: что же это за работа, если постоянно тянет отвлечься? Неужели так трудно хранить фокус двадцать минут? Но потом ломка проходит, и с каждым помидором испытываешь гордость за самоконтроль.

    • Если 20 минут для вас много — выставляйте на 15 или даже 10, никто не вправе вас за это стыдить. Главное — следовать основному правилу (не отвлекаться) и не обманывать себя. Других вы обманите запросто, а себя — нет.

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

  • Exceptions in Clojure

    Clojure in Production

    In This Chapter

    Exceptions

    This chapter considers exceptions in Clojure. How do they work and how do they differ from their Java counterparts? When is it better to throw and when to catch exceptions? What and how to write in logs to investigate an incident quickly?

    Somebody might find it strange to devote an entire chapter to exceptions. The topic, after all, is simple: exceptions can only be thrown, caught, and logged. Theoretically, this is enough to work on a project.

    Exceptions are technically simple, but they have rich semantics. When exactly should you throw and catch exceptions? What useful information do they carry? Where to write exceptions? Can we catch them with predicates? In practice, we are overwhelmed with countless specific cases.

    Newbies tend to follow the positive path. They write code such as there basically cannot be exceptions in their work. This is why it is so hard to troubleshoot errors afterwards. Why did the server respond with code 500? There are innumerable possible reasons why the request failed. However, the log entry provides too little information to understand what has happened.

    A good programmer pays close attention to errors. With experience, it becomes clear – refusing exceptions does not pay off. Without them, we will complete the task faster, and there will be less code – that is right. But later, you will have problems with detailing and fixing said errors.

    Exceptions in code are just as important as normal behavior. If you think this kind of problem will not happen to you, think again. If your project encounters trouble due to uncaught errors, then it is time to study the topic.

    Read more →

Страница 22 из 74