• Что почитать №10

    Сегодня в номере:

  • Мода

    В интернете полно ЭКСПЕТРОВ, которые знают все вокруг: почему умирает Яндекс, что купит Гугл завтра и сколько заработал Закерберг на ИПО. Я согласен смириться с такой осведомленностью. В конце концов, есть у тебя время на чтение желтизны вроде Тех-Кранча, Хабра, Вайред – читай, повышай ЧСВ.

    Хуже, ЭКСПЕРТЫ делают ПРОГНОЗЫ: что будет популярно в грядущем году, что востребовано на рынке. И каждый раз из их бородатых ртов льется такая чушь, что нет сил терпеть.

    – Ну, э-э, конечно нейросети, и Джаваскрипт, куда без него.

    – Я бы посоветовал обратить внимание на мобильные устройства и Питон или Руби.

    – Будущее за новым вреймворком на Node.js, мы уже отбили триллион инвестиций.

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

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

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

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

    Поэтому следование моде – это отказ от собстенных желаний. Никто вам в этом не признается, но каждый кто выбирает очередной тренд, мысленно взвешивает: будет ли это перспективно? Буду ли я иметь вес, примкнув именно к этой сфере? Что скажут парни в курилке, если не взлетит?

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

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

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

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

    Есть пафосная фраза: не следуй трендам, а создавай их. Ее обычно пишут на картинках со Стивом Джобсом или Биллом Гейтсом. Если отбросить пафос и взять выжимку, это значит: имей свое мнение, исследуй, сомневайся. Не отказывайся от убеждений только потому, что в интернете тебя обосрали в чатах.

    Фактически, выбрав самые модные технологии, человек тем самым ставит себя в хвост прогресса. Потому что мода очень переменчива. Шесть лет назад весь интернет визжал какая классная Нода. Ее всерьез называли венцом индустрии, да. Но почему-то вышло так, что львиная доля пакетов под нее – модули типа isArray на 11 строк, где манифест длинней кода. А потом какой-то клоун удаляет такой пакет и Фейсбук не может собрать Реакт.

    Еще раньше бушевали Руби-оргии. Что имеем сегодня? Тормозной, глючный, нелогичный, напичканный сахаром язык, ориентированный на молодых людей без опыта в ай-ти. Довольны?

    У каждого ценителя моды на его профиле в Линкед-ине можно проследить закономерность. Человек в индустрии, скажем, 7 лет, знает 8 языков. Си, Джаву, Руби, Питон, Джаваскрипт и так далее. Если банально разделить, получится в лучшем случае год на одну технологическую платформу.

    Если вас это не смущает, год – очень мало. Пользование не тождественно знанию. Истиное знание технологии подразумевает три и более лет активной работы, чтение исходного кода, создание своих библиотек или вклад в существующие.

    Берите пример со Столлмана. В одном из интервью на вопрос, сколько он знает языков, он ответил два – Си и Лисп. К Питону, с его слов, он только прочел документацию, но ни разу не использовал. Столько всего сделал человек только двумя языками. А другие ставят Руби, Рельсы, Ноду, Бавер, Реакт, Веб-компонент, Бейбл и миллион другого говна, но не могут вовремя запустить свой горе-стартап по продаже футболок. Почувствуйте разницу.

    Теперь я выскажу свой прогноз относительного того, что будет востребовано на ай-ти рынке. Он будет действовать весь 2017 год, 2018, до 2150 и дальше. Ориентируясь на этот прогноз, вы пойдете вверх по карьерной лестнице, найдете достойную работу и все в таком духе.

    Будут востребованны алгоритмы. Напрасно вы думали, что сдали сортировки и указатели в университете, а теперь можно спокойно клепать сайты. Как были нужны азы, так всегда и будут. Вместо очередного модного фреймворка садитесь читать SICP или How To Design Programs. Да, тяжело, это не утренний Хабр под кофе и шоколадку.

    Будут востребованны протоколы и БД. Вы должны понимать, как работает сеть. Вы должны знать, как выглядит HTTP-запрос: где в нем заголовки, где тело. Вы обязаны писать SQL без поминутного гугления и вашей няшной ORM. Все это не завязано на конкретный язык и пригодится везде.

    Будет востребована самоорганизация. Не смотрите смешные картинки утром – это самое продуктивное время. За три часа до созвона с заказчиком можно горы свернуть и предстать Д’Артаньяном в белых перчатках.

    Будет востребована ответственность. Общество активно поощрает людей, которым окружающий мир интересен хоть на каплю больше, чем другим. Читайте книги по переговорам и общению. Займитесь решением конфликтов. При случае берите ответственность, иначе ее заберет кто-то другой.

    Будет востребовано самообучение. Из университета вы выйдете будучи совершенно не готовым к реальным проблемам. Читайте, смотрите курсы и уроки, занимайтесь после работы. Не перекашивайте мозг в одну сторону. Если много занимаетесь императивными языками, попробуйте функциональный.

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

    Следовать моде или нет – дело каждого. Я стараюсь ее не видеть и не слышать.

  • Что почитать №9

    Сегодня в номере:

    • Node.js is Cancer

      Обратите внимение: пост написан 6 лет назад, когда все визжали кипятком по поводу Ноды. А Тед уже тогда все понял.

    • The 3 Basic Tools of Systems Engineering

      У того же автора: три важных принципа разработки.

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

    О вечном:

  • Что почитать на выходных №8

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

  • Тринадцатая встреча

    Провели тринадцатую встречу.

    Максим Поправко рассказал о трудностях с нереляционными базами:

    Слайды

    Станислав Мехоношин выступил на тему деплоя и Докера:

    Слайды

    Ищем докладчиков на следующую встречу. Хотите выступить – пишите в личку или чат Телеграма.

  • Что почитать на праздниках №7

    Выкладываю чуть побольше, чтобы хватило на всю неделю.

    Осторожно, Невзоров!

  • Итоги 2016 года

    Подвожу итоги уходящего года: что сделал, что осталось в планах.

    1. Блог. За 2016 год я написал 96 постов (включая этот). Если в году 53 недели, получается почти по 2 поста в неделю. Неплохо держусь.

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

      В середине лета снял клевый офис: светлый, одна из стен сплошное окно, диванчик, кофе-машина. Всегда рад гостям. Сидим впятером, думаем над расширением площади.

    3. Путешествия. Об увольнении я узнал будучи в Тунисе. Первый раз в жизни побывал на африканском континенте.

    4. Встречи. За год мы провели 12 встреч Глубокого Рефакторинга. Каждый месяц, без срывов, переносов. Сколько было митапов в вашей фирме? Один? Два? А у нас тринадцать.

    5. Волонтерство. Проводил слаконары для образовательного проекта Хекслет на тему удаленной работы и Емакса. Слаконар – это долгое выступление в Слаке на заданную тему с последующими вопросами читателей. По архивам Слаки я воссоздал два поста: про удаленную работу и про Емакс.

    6. Опен-сорц. Летом, в перерывах между поисками работы, написал библиотечку f для программирования в функциональном стиле на Питоне. Фактически это порт базовых возможностей Кложи. У библиотеки 100 звезд на Гитхабе и ей никто не пользуется. Мне было важно пройти весь путь от замысла до пакета на Pypi. Говоря иначе, просто довести дело до конца. Ссылки: исходники, статья, пакет.

    7. Гитхаб. Я стараюсь хранить данные в виде обычного текста, поэтому вынес всякое барахло на Гитхаб. В связи с этим график заметно позеленел:

      gh-chart

    8. ФП. Глубже увлекся функциональным программированием. Написал заметки о макросах, преимуществах Кложи, мультиметодах. Решил тестовое задание на Хаскеле.

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

    10. Книги. Прочитал далеко не все, что планировал: книги начинают скапливаться на полках. Осилил всего-то четыре: Atomic Scala, Цель, Бизнес как игра и ClojureScript Unraveled.

      Начал вести рубрику “Что почитать на выходных”. Идею стырил у Бирмана. Сделал 5 выпусков без сбоев, планирую продолжать.

      SICP так и остался недочитанным. Аналогично с альманахом Р. Душкина о программировании на Хаскеле. Надеюсь добить в 2017.

    Вот как я провел 2016 год. Спасибо всем, кто заходит на эту страничку. С праздником, увидимся в 2017 году!

  • Покупка авто

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

    Критерии обмана

    1. В объявлении указана заниженная цена, раза в 1.5-2 ниже рыночной. Продавец аргументирует тем, что срочно нужны деньги. Не верьте: хорошие машины, как правило, покупают очень быстро. Автомобилю в исправном состоянии не нужна такая скидка.

    2. При малейших разговорах о предоплате и залоге прекращайте разговор. Деньги – самый последний этап сделки. Разговорчики о том, что у продавца толпа покупателей, готовых купить хоть сейчас – лишь способ выжать из вас нужду.

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

      Возможно, когда продавец говорит, что у него много покупателей, он действительно в это верит! Охладите его пыл: из ста позвонивших назначат встечу пять, из этих пяти лишь один дойдет до этапа диагностики, и по ее результатам, он, ВОЗМОЖНО, подумает, покупать или нет.

    3. Продавец отказывается предоставить ПТС. Тут важно следующее: объясните, что не нужно привозить с собой оригинал, достаточно скинуть по почте или через любой мессаджер качественный скан или фото документа с обеих сторон. Нет ПТС – нет дальнейшего сотрудничества, вежливо отказывайтесь.

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

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

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

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

    7. В объявлении нет комментария продавца. Хороший продавец обязательно напишет текстовое сопровождение к автомобилю. Пусть там будут тупые ошибки, вагон смайликов – так даже лучше. Тот, кто действительно ездил на машине и заботился о ней, не может не добавить слова от себя.

    8. При звонке продавец уточняет, насчет какой машины вы звоните. Этим грешат агенты и перекупы, у которых по 3-4 авто в работе. Логично, что частник, у которого одна машина, не будет уточнять марку. По этой же причине вы не называете ее, когда звоните. Просто “я звоню по объявлению”.

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

    Порядок покупки

    1. Позвоните и расспросите все об автомобиле. Не соглашайтесь на отговорки “в объявлении все написано”. Хороший частник всегда любит почесать языком о собственном авто. В разговоре часто проскакивают детали, которых не было в объявлении: царапина здесь, скол там. Вы не перебиваете, пусть говорит пока не устанет. Бывало, что из откровенного разговора становилось ясно, что машина – не мой вариант, даже если объявление смотрелось идеально.

    2. Если из разговора все норм, попросите скинуть скан ПТС. Желательно должен быть один владелец не считая автосалона. ПТС не должен быть копией. Да, всякое бывает: потерял, промочил, жена постирала. Но чаще это означает прохладные схемы с автомобилем.

      ВИН-номер должен быть четко виден. Этот номер вы пробиваете на сайте ГИБДД. Не должно быть ДТП, автокредитов, угонов, розысков. В нижней части страницы находятся ссылки на страховые компании, где по номеру автомобиля можно пробить схожие данные: кредиты и тд.

    3. Если ПТС и ГИБДД не выявили проблем, договаривайтесь о встрече сначала просто посмотреть, а потом в диагностическом центре. Это не должно быть тем местом, которое предлагает продавец: у него могут быть связи. Некоторые думают, что диагностика – это обязательно загон на яму. Вовсе не обязательно: достаточно много подвохов можно выявить внимательным осмотром.

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

      Все это должен делать, конечно, специально обученный человек, а не вы. Но ближе к концу я тоже стал кое-что понимать.

    4. Если и первичный осмотр не выявил проблем, садите специалиста в машину и едете 200-300 метров. Не должно ничего стучать. Если после проезда нет претензий, ставить авто на яму уже не обязательно: серьезные трудности должны были быть выявлены заранее. Но можно и загнать, если есть время.

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

    6. Неопытный продавец может думать, что диагностика – это быстро. Предупредите, что потребуется 2-3 часа его времени, так что лучше отпроситься с работы. Так, с одним продавцом пришлось расстаться, так как он тупо ныл, что не успевает.

    7. Если и диагностика прошла ок, оформляете на нейтральной территории три договора купли-продажи авто. Это не должна быть фирма-однодневка или приятели продавца. Это не должен быть какой-то левый бланк, стыренный из интернета. Договор стоит 1 т.р, расходы пополам. В моем случае договор составили прямо на диагностике. В договорах ставят печати, но расписываться нигде не нужно! Сделаете это в момент передачи денег.

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

    Ну вот вы и купили авто, поздравляю! Дальнейшие шаги типа регистрации в ГАИ описывать не буду, потому что статья скорее о покупке и всему, что ей предшествует.

    Хоть я неопытный водитель и брал подержанную машину, описанное выше пригодится и при покупке нового авто. Потому что никто не застрахован от случайностей. Директор фирмы, где я проходил диагностику, рассказывал, как осматривал новую машину. Болты на боковой стойке были скручены. Оказалось, при разгрузке с поезда помяли дверь и оперативно поменяли на новую с выставочного образца. Так что в салон тоже нужно брать обученного человека.

    Почему-то некоторые думают, что обманывают только лохов и неудачников, а с ними, такими крутыми и прошаренными, ничего не случится. Но вот что: мой дальний родственник купил спорткар за миллион, а он угнанный. Изъяли прямо в ГАИ, продавца не нашли. Недавно ехал в такси, водитель трепался по телефону о том, как поедет в ночь в Москву покупать родственникам машину. Что он там купит ночью после 6 часов за рулем?

    Может показаться, что пост – сплошное капитанство. Я не ставлю цель кого-то поучать, всего лишь делюсь полученным опытом. Перечисленные советы я собирал по отдельности из интернета и практики. Буду рад мнениям из комментариев.

    С наступающим!

  • Мультиметоды в Кложе

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

    Не скажу, чтобы это плохо: язык должен быть простым. Чем меньше правил и бест-практик нужно помнить, тем легче на нем писать. Однако, есть в Кложе классные штуки, точечное применение которых сэкономит время и объем кода.

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

    Мы знаем, что ООП базируется на инкапсуляции, наследовании и полиморфизме. Рассмотрим последний. Полиморфизм – это когда у метода может быть несколько реализаций. Конкретная реализация выбирается в зависимости от типов параметров.

    В классическом ООП нам бы привели такой пример. У класса Geometry есть метод square для вычисления фигур. На вход могут подать окружность, квадрат и треугольник. Запишу на каком-то выдуманном языке:

    class Geometry:
    
        real square(Circle c):
            return Math.PI * c.radius * c.radius;
    
        real square(Rectangle rect):
            return rect.a * rect.b;
    
        real square(Triangle tri):
            real p = (tri.a + tri.b + tri.c) / 2;
            return Math.sqrt(p * (p - tri.a) * (p - tri.b) * (p - tri.c))
    

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

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

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

    Рассмотрим Хаскель. То, что выше я записал на выдуманном языке, в Хаскеле будет так:

    data Circle = Circle Float
    data Rectangle = Rectangle Float Float
    data Triangle = Triangle Float Float Float
    
    square :: Circle -> Float
    square (Circle r) = 3.1415 * r * r
    
    square :: Rectangle -> Float
    square (Rectangle a b) = a * b
    
    square :: Triangle -> Float
    square (Triangle a b c) = sqrt $ p * (p - a) * (p - b) * (p - c)
    where
      p = (a + b + c) / 2
    

    Видно, что функция square работает с типами окружность, прямоугольник, треугольник. В любой момент мы можем дополнить ее новой фигурой.

    Есть мультиметоды и в классических диалектах Лиспа. Вот, например, копипаста из Википедии, взятая из кода Астероидов:

    (defmethod collide-with ((x asteroid) (y asteroid))
       ;; deal with asteroid hitting asteroid
       )
     (defmethod collide-with ((x asteroid) (y spaceship))
       ;; deal with asteroid hitting spaceship
       )
     (defmethod collide-with ((x spaceship) (y asteroid))
       ;; deal with spaceship hitting asteroid
       )
     (defmethod collide-with ((x spaceship) (y spaceship))
       ;; deal with spaceship hitting spaceship
       )
    

    Особенность примера с Лиспом в том, что второй параметр в каждой паре ведет себя как предикат. В данном случае тип spaceship срабатывает как проверка того, что x – экземпляр космического корабля. Однако, вместо spaceship можно передать другие проверки: integer?, string?, even?, словом, любой унарный предикат.

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

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

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

    (defmulti foo class)
    

    Данное определение говорит: прежде чем искать реализацию, метод получит класс аргумента.

    Следующее определение расширяет мульти-метод реализацией для Long: если передано длинное целое, получим строку "an integer".

    > (defmethod foo Long [x] "an integer")
    #multifn[foo 0x478c7d41]
    > (foo 42)
    "an integer"
    

    Добавим для строки:

    > (defmethod foo String [x] (format "%s is a string" x))
    #multifn[foo 0x478c7d41]
    > (foo "test")
    "test is a string"
    

    Если ни одно соответствие не подошло, будет ошибка:

    > (foo nil)
    IllegalArgumentException No method in multimethod 'foo' for dispatch value: null
    clojure.lang.MultiFn.getFn (MultiFn.java:156)
    

    Не страшно, добавим реализацию по умолчанию:

    > (defmethod foo :default [x] (format "you passed %s" x))
    > (foo nil)
    "you passed null"
    

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

    (defmulti square (fn [& args] (mapv class args)))
    
    ;; rectangle
    (defmethod square [Long Long] [a b] (* a b))
    (square 2 3) ;; 6
    
    ;; circle
    (defmethod square [Double] [r] (* Math/PI r r))
    (square 1.1) ;; 3.8013271108436504
    
    ;; triangle
    (defmethod square [Long Long Long]
                   [a b c]
                   (let [p (/ (+ a b c) 2)]
                     (Math/sqrt (* p (- p a) (- p b) (- p c)))))
    (square 2 2 2) ;; 1.7320508075688772
    

    Замечу, что на самом деле Кложа проверяет значения диспатча и образца не простым сравнением, а функцией isa?, что подразумевает иерархию. Так, чтобы проверку проходили типы PersistentArrayMap и PersistentHashMap, достаточно указать базовый класс clojure.lang.APersistentMap.

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

    Каждый мультиметод может вызвать внутри другой, тогда процесс диспатча начнется заново.

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

    Напомню ситуацию с примерами на Джаве и Хаскеле выше. Пусть фукция square и класс Geometry находятся в чужих библиотеах. Тогда вы никак не сможете изменить их! В лучшем случае вы унаследуете класс Geometry, добавите свой метод для ромба. Но если есть еще одна библиотека, которая работает с Geometry, вы никак не сможете на это повлиять.

    Напротив, идея расширения чужих определений работает в Кложе просто убийственно. Я нигде не видел ничего подобного.

    В Кложе мультиметоды используют когда трудно предугадать, какие типы данных будут поступать на вход. Это прекрасное решение для абстракций вроде работы с БД, парсингом данных, декораторов и тд.

    Мультиметоды в Лиспах – мощнейшей инструмент, порой в корне меняющий принцип мышления и разработки.

  • Что почитать на выходных №6

    С опозданием, но все же:

    И конечно:

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

Страница 68 из 95