TGINSIGHT CHAT
Такты, стеки, два колеса
@clockstackwheels
ТехнологииО технологиях, научной фантастике, программировании и схемах. Навигация по каналу: https://t.me/clockstackwheels/3 Чат канала: https://t.me/joinchat/VNhNF1NF70dkFgUX
Последни публикации
Таг: #dev · 127 публикации
Публикувано 11.03
Попробовали на работе предметно-ориентированное проектирование (Domain Driven Design). Это такой способ построения архитектуры, когда ты (чаще всего с помощью системы типов и ООП) описываешь физическую суть вещей, которые представлены в твоей программе. Например, если в программе есть объект "Книга", то её нужно снабдить свойствами, которые бывают у книг в реальности: число страниц, автор, язык, тип обложки и т.д. При этом данные свойства должны быть такими, чтобы присвоить им нереалистичные значения было нельзя. Допустим, число страниц не может быть отрицательным (и скорее всего в реальном мире не может быть нулём). При попытке установить отрицательное число страниц программа должна выбросить исключение. А совсем в идеальном случае -- не дать этого сделать программисту на уровне статического анализа кода. Описав все свойства книги, вы снабжаете её операциями, которые над ней можно сделать. Например, из книги можно вырвать страницу, и при этом число страниц уменьшается. Нет такого случая, когда можно вырвать страницу без изменения числа страниц. Вы строго программируете эту зависимость, делаете у книги метод "Вырвать страницу", а он уже уменьшает число. Кстати, свойство "Число страниц" при этом нельзя переназначить в уже созданной книге. Можно только создать книгу, передав в её конструктор (так называется в программировании функция создания объектов) заданное число страниц. Но поменять число страниц можно только специальными методами "Вырвать страницу" и "Вклеить страницу". С помощью этого подхода вы гарантируете, что ваши объекты всегда находятся в валидном состоянии -- то есть таком, которое возможно в реальной жизни с объектом, представленным программой. Плюсы подхода очевидны: меньше число ошибок. Код описывает сам себя, и программист, если не лезет внутрь объекта "Книга", вообще не сможет сделать с книгой ничего недопустимого. Минусы, думаю, тоже понятны: изначально проектировать сложнее, нужно учесть много нюансов, писать тесты. Время разработки изрядно растёт. Изменение требований даётся дороже: например, если каким-то образом в ваш книжный магазин поступят книги со страницами из кевлара, которые невозможно вырвать :) Но первый проект с этим подходом мы сдали хорошо, без багов. Лучше, чем многие предыдущие. #dev
Hashtags
Публикувано 5.03
Лигатура — это символ в типографике, образованный слиянием двух (или более) других символов. Например, в скандинавских языках есть символ Æ — он хранится и печатается как один символ, неразрывно, но, очевидно, образован совмещением букв A и E. В программировании тоже есть лигатуры. Если у вас мощная среда разработки и подходящий шрифт, то вы, как правило, можете их включить. И тогда ваш текстовый редактор будет отображать некоторые парные и тройные символы, как один. Например, последовательность -> может превратиться в символ →. Это нужно только для отображения, на содержимое настоящего текстового файла настройка никак не влияет, потому что компилятор или интерпретатор языка ждёт именно ->. Я категорический сторонник использования лигатур в IDE. Если вы никогда не пробовали, рекомендую включить и поработать с ними несколько дней, а может даже недель. Посмотрите на две конструкции ниже. Символы => и <= очень похожи между собой визуально, но при этом их суть принципиально разная. Включение лигатур позволяет отразить эту суть и избежать некоторых возможных ошибок (например, путаницу между >= и =>). #dev
Hashtags
Публикувано 4.03
Посоветую вам YouTube-канал Stuff Made Here (в свете событий можно скачать все ролики с него и потом ностальгировать по ютубу вечерами). Пожалуй, это самый крутой инженерный видеоблог, который я встречал. У автора целый подвал роботизированных станков за миллионы баксов (просто несбыточная мечта гика). И он с их помощью городит электронно-механические конструкции, которые совмещают в себе сложное программирование и вполне очевидную практическую цель, как правило недостижимую или труднодостижимую без длительных тренировок. Вот я прикладываю видео, где он делает бильярдный стол и роботизированный кий, который позволяет не промахиваться. Продемонстрированы все стадии разработки: неудачные прототипы, подбор алгоритма, проверка гипотез. При этом подано всё в довольно понятном и динамичном стиле. с хорошим юмором. Ролик длиной 20-30 минут обычно содержит недели и месяцы разработки. Короче, очень круто. Если что-то и смотреть на ютубе напоследок, то вот примерно такого уровня контент, имхо. #dev#gadgets https://www.youtube.com/watch?v=vsTTXYxydOE
Публикувано 28.02
Сопоставление с образцом (pattern matching) — сильный механизм языков программирования, который, к сожалению, встречается не так часто. Причём, как в коде разработчиков, так и в поддержке со стороны самого языка. Разработчики на функциональных языках используют этот механизм довольно часто, потому что у них вообще многое определяется статически через правильный подход к системе типов. Разработчики же на императивных языках очень любят огромные многоуровневые ветвления. Есть даже такое понятие «Спагетти-код» — раньше его применяли к коду, перегруженному операторами перехода, но в современном виде это скорее об избытке операторов условия. Pattern matching позволяет накладывать на объекты некоторый трафарет и смотреть, попадают ли они под него. Это не только выглядит лаконичнее и короче, чем дерево условий, но ещё и понятнее с точки зрения восприятия человеком: вот у нас заказ содержит более 10 элементов и при этом стоит более 1000 долларов, значит делаем на него скидку 10 центов. При этом трафарет работает как сортировщик монеток: самая маленькая проваливается в первый паз, следующая по размеру в следующий итд, применение условий идёт сверху вниз. Есть и неявный плюс: такой подход автоматически провоцирует разработчиков проводить проверку на null. Ведь null не может подходить под трафарет «содержит более 10 товаров». К счастью, в C# этот механизм в последних версиях активно развивают и совершенствуют. И это одно из многочисленных преимуществ C# над Java. #dev
Hashtags
Публикувано 21.02
Попал в Программу Поощрения Авторов на Хабре. Если ваша карма 50 или более, то за статьи в профильных хабах (то есть, тематические узкоспециализированные) вы получаете деньги в зависимости от рейтинга статьи. Шкала ступенчатая. В целом, 5000 рублей за статью это почти максимум. Можно больше, но ненамного, вот как у меня. И ещё накинули 1000 за факт попадания в программу, впоследствии такой лафы не будет. Не стану скрывать — я специально метил в ППА после первой статьи полтора года назад. В итоге за три статьи попал. С одной стороны, писать по такой статье например раз в месяц — дело подъёмное. А 5000 рублей уже не совсем копейки, можно себе что-то приятное прикупить. С другой стороны — хорошая техническая статья это недели или даже месяцы предварительной работы, исследования материала. Я когда-то давно писал для научпоп-журнала, там давали 4000 рублей за статью, и подготовки требовалось значительно меньше, я мог за 2-3 вечера выдать подходящий текст. На Хабре соотношение денег к объёму работы меньше. Впрочем, тот журнал загнулся, видимо, слишком дорого обходились авторы, а Хабр живее всех живых :) Но я очень доволен. Есть мотивация писать чаще. Стоит ли говорить, что другим текстовым площадкам до такого уровня поддержки авторов, как до Луны? Думаю в течение недели-двух будет ещё статья. #dev#web
Публикувано 20.02
Допустим, вы разработчик, и вам от пользователя приходит строка user-agent с описанием того, каким браузером он пользуется. В этой строке будет что-то типа такого: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36 И вы хотите из неё узнать мажорную версию Chrome, то есть вытащить число 51. Что вы сделаете? Можно, конечно, написать свой парсер, но я уверен, многие воспользуются регулярными выражениями. Я бы воспользовался. Какое выражение сюда подходит? С виду кажется, что вот такое: /Chrome\/(\d\d)\./g Мы ищем слово Chrome и слэш, затем ловим в группу две цифры, после которых стоит точка. Так? По крайней мере, мышление достаточного количества разработчиков именно таково. Зачастую программистам не хватает умения отойти от техзадания на уровень вещественной сути того, с чем они работают. На самом деле число 51 это версия. Версия будет увеличиваться со временем. «Марти, где твоё четырёхмерное воображение?» Если уже прошло 50 версий, то и следующие 50 не за горами, число станет трёхзначным, регулярка или парсер, сделанные под двухзначные числа, перестанут работать. Трехзначная версия Chrome и Firefox приближается уже сейчас. И да, в них падает куча функций на сайтах, включая крупные корпорации: Yahoo, Bethesda, HBO и бог знает сколько сайтов поменьше. Чисто из-за цифры. Это уже назвали «Проблема сотой версии» по аналогии с «Проблемой 2000 года» (программисты записывали год двумя цифрами, 2000 стал неотличим от 1900). К чему это я? Полезно задумываться о физическом воплощении того, что вы представляете в своей программе. Ваш код должен описывать не столько требования заказчика, сколько законы, по которым существует этот объект в реальном мире. #dev
Hashtags
Публикувано 18.02
Увидел тут проект Doka Guide. Это такой ресурс, на котором авторы пытаются писать техническую документацию простым языком. В целом, идея не нова: "Объяснять что-то энциклопедичное человеческим языком, будто рассказываешь другу, а не читаешь лекцию". Это ещё Лурк использует — там многие вещи вполне себе содержат настоящие знания, но простыми словами. Пока есть вопросы к реализации, конечно. Например, я увидел в статье опечатку, но к системе не подключён никакой модуль исправлений (как на новостных сайтах — жмёшь Ctrl+Enter и отправляешь сразу ошибку редактору). То есть мне надо искать эту статью в репозитории, делать форк, оформлять пулреквест... Лениво. Структура местами странная. Статья о трёхслойной архитектуре в блоке JavaScript, хотя эта концепция не только не связана конкретно с JS, но он ещё и один из наименее удачных примеров её применения. Потому что вообще такие архитектурные паттерны для сложных энтерпрайз-разработок, как правило с сильной статической системой типов на каком-нибудь Java или C#. Осталось стойкое ощущение, что авторы знают только JS и фронтенд. Впрочем, я всё равно не понимаю, как с развитием проекта в одну кучу свалят документацию по всем популярным языкам. Тем не менее, инициатива отличная, и я желаю проекту хорошего будущего. Для начинающих фронтендеров там уже есть много ценного. Буду посматривать иногда, что там происходит. #dev
Hashtags
Публикувано 15.02
Какой язык программирования учить? У меня есть ответ. Каждый год один из крупнейших в мире порталов для разработчиков StackOverflow проводит опрос своих пользователей. В этом году его ещё не было, но я решил взять из результатов 2021 года два графика и объединить их. На графике расположены языки программирования в следующих координатах: - По горизонтали "Приятность". Мера того, как разработчики отзываются о своих чувствах по отношению к языку, сколько удовольствия он им доставляет, насколько им приятно на нём писать. Эта шкала в процентах, и опрос составлен так, что значение ниже 50% следует понимать как "язык скорее неприятный, чем приятный". - По вертикали "Популярность". Буквально, людей спрашивали, с какими технологиями они по факту работают в своих проектах. Чем больше голосов — тем чаще язык встречается. Здесь я провёл черту по матожиданию всей выборки, которое равно около 14%. Использовать в данном случае медиану мне кажется неправильным, потому что она сильно зависит от того, попал ли какой-то язык в опрос или нет. А очень много языков не попало. В целом субъективно я бы описал квадранты этого графика так: 1. Справа вверху популярные и приятные языки — можно смело брать и учить любой, и вообще они вверху списка на рассмотрение. Но следует понимать, что и другие люди могут хотеть в первую очередь выучить именно их, так что конкуренция на рынке труда будет высокой. 2. Слева вверху популярные, но менее приятные языки — в основном это устаревшие технологии, на которых очень много легаси. На мой взгляд, это надёжный вариант, чтобы найти высокооплачиваемую работу. Рынок не скоро сможет отказаться от них, а поддерживать кому-то надо. 3. Справа внизу приятные но менее популярные языки. Кажется, логично взять какой-то из них в качестве второго языка, на котором вы будете делать пет-проекты для личного удовольствия и саморазвития. Кстати, все функциональные языки попали сюда. И некоторые языки оттуда будут уходить наверх: например Go и Kotlin уже вырвались. Уверен, опрос текущего года покажет их подъём. 4. Ну и слева внизу Бездна Боли. У которой есть неожиданное дно: если язык не очень популярен, и люди его не любят, то вы, как специалист, будете чудовищно ценным в тех немногих местах, где язык всё-таки используют. Говорят, разработчики на COBOL получают фантастические деньги даже по меркам IT. Оба ещё живых разработчика на COBOL, да. Следует внести одну поправку: на графике отсутствует такой параметр, как "сложность". Она тоже, безусловно, влияет на выбор. Что более важно — она влияет и на положение языка по другим параметрам. Так, например, люди, которые попробовали относительно простые JavaScript и Python, могут на этом остановиться и не браться ни за какие другие языки. И такие люди будут отмечать JavaScript и Python как приятные, приносящие удовольствие. Я тоже когда-то любил JS. И даже любил PHP. Пока не попробовал Java. Потом я какое-то время был в восторге от неё, пока не попробовал C#, и сейчас считаю его лучшим языком. Вполне возможно, что через 5 лет я буду писать на Clojure и не понимать, как я мог так восторгаться ужасным C#. #dev
Hashtags
Публикувано 14.02
В этот романтический день поговорим о поэзии. Мне всегда нравилась теория стихосложения. Она приближала непонятный мне мир литературы к понятному мне миру математики. Эта любовь получила развитие и в программировании. Опубликовал вот статью об алгоритме вычисления силлабо-тонического стихотворного размера по строчке на русском языке. Задача интересная и не такая простая, как может показаться на первый взгляд. #dev https://habr.com/ru/post/651395/
Hashtags
Публикувано 11.02
В Твиттере айтишники иногда поднимают тему выгорания, но она для меня не до конца понятна. Много лет назад я взялся за написание очень масштабного проекта. У меня было куда меньше опыта программирования, чем сейчас. Используемые мной инструменты были несовершенны, а применял я их не всегда правильно. Стоит ли говорить, что проект, цикл разработки которого планировался года на полтора, занял все пять, и вышел в таком плохом техническом состоянии, что даже после двух переделок был закрыт. Это была онлайн-игра для ВК, кто очень давно меня читает, те могут даже что-то помнить. Это, пожалуй, самая сокрушительная история моего поражения, после которой были полгода единственной во всей моей жизни настоящей депрессии. Под конец разработки я испытывал сильнейшее эмоциональное истощение. Я просто видеть не мог этот проект. Я просыпался каждый день с мыслью о том, что мне снова нужно открывать IDE и вносить правки, добавлять фичи, и что конца этому нет, потому что сделать нужно столько, сколько я за сегодня в принципе смогу, пока не упаду замертво. Особенно после релиза, когда проявились проблемы, и когда стало ясно, что игра не «выстрелила», и я не стану миллионером, но принять решение бросить её это значило отказаться от надежд, которые питали меня последние 5 лет. В общем, по всем признакам похоже на выгорание. Разработчик вкладывает в работу так много сил и эмоций, что у него садится батарейка. И всё-таки. Я ведь сам виноват: истощал себя, потому что взял задачу не по силам, да ещё и создал вокруг неё завышенные ожидания. Мою энергию тратило моё же собственное упорство и нежелание признавать фиаско. Однако принято воспринимать и описывать выгорание, как внешний фактор. Стихию, которая тебе не особо подконтрольна. Разве что условно: ты мог добровольно выбрать не ехать в то место, где потом начался ураган. И вот тут я не особо согласен. Мне кажется, человек понимает, что именно он продолжает делать, чтобы выгорать. А ещё для выгорания нужно иметь возможность похандрить, вы уж простите. Так и представляю себе, как выгорает рабочий, который вагоны разгружает. Или кассирша в Пятёрочке. Что-то тяжело мне стало товары пробивать, уйду в саббатикал! Ну ладно, они, допустим, эмоции в работу не вкладывают (а программисты действительно вкладывают, об этом я как-нибудь ещё напишу). Но где у нас выгорание врачей, учителей? Пашут как проклятые же. Это мы, айтишники — неженки, чуть что, сразу психолога мне. Так что и к историям о выгорании я отношусь соответственно, хотя сам подобное проходил. Выгорел — значит, была возможность. Было окно в жизни, которое можно заполнить страданиями. Было достаточно денег, чтобы с работы уйти. Это не отменяет того факта, что субъективно человеку действительно очень плохо и тяжело. Но если я себе ногу отпилю — мне тоже будет очень плохо и тяжело. #dev#life
Публикувано 9.02
Традиционно программисты считают, что энтерпрайз разработка это переусложнённая и бюрократизированная вещь, где вместо интересных задач на алгоритмы люди просто перекладывают JSON'ы избыточным способом. В этом мнении есть доля истины, но я уже третий год работаю в энтерпрайзе, а до этого как раз занимался всякими стартап-стайл «интересными» алгоритмами. И хочу со своей стороны защитить энтерпрайз. Основная фишка в том, что одну программу разрабатывают много людей. И часть этих людей друг друга никогда не увидят. Поэтому обычно задача сделать работающий код дополняется двумя пунктами: 1. Другой человек, который первый раз видит ваш код, должен как можно быстрее понять, что этот код делает. 2. Другой человек, который будет дописывать ваш код, должен иметь как можно меньше шансов допустить ошибку и всё сломать. Окей, в реальной жизни есть ещё и третий пункт: 3. Вы ограничены в выборе инструментов и подходов к разработке, потому что легаси / корпоративная архитектура / секретность / отсутствие нужной лицензии / приказ начальства и так далее, нужное подчеркнуть. И это напоминает челленджи, которые геймеры себе придумывают для усложнения и повышения интереса. Пройти игру с одним пистолетом? Протащить через все уровни фигурку садового гнома из первой главы? Ни разу не получить ни одного повреждения? При этом вы ещё и в момент этого прохождения транслируете обучающий стрим, а другой игрок, загрузив ваши сейвы с любого места, должен быть способен пройти дальше, даже если он не про-геймер. Решать такие задачи на самом деле очень интересно. И отлично качает скилл в программировании, не хуже, чем эти ваши алгоритмы. Попробуй с первого раза сделай foolproof архитектуру, ещё и понятную. Есть о чём подумать. #dev
Hashtags
Публикувано 5.02
Побегал в технодемке Матрицы на PS5. Действительно впечатляет: с некоторых ракурсов вскользь даже похоже на кино. Кажется, это наиболее приближенная к фотореализму реалтайм графика, которая существует на сегодняшний день. Да, игр с подобными технологиями пока нет, и вряд ли в ближайший год стоит их ожидать — банально количество людей с PS5 слишком невелико, студиям не выгодно выпускать продукты, не работающие на предыдущем поколении. Но веха, на мой взгляд, важная и заметная. Иронично, что прогресс в создании виртуального мира, неотличимого от реальности, показан на примере вселенной, где люди заперты в виртуальном мире, неотличимом от реальности. Что может пойти не так? #dev#games