Организованное программирование | Кирилл Мокевнин
11.1K subscribers
60 photos
230 links
Как из джуниора дойти до мидла, а потом и до синьора
Ютуб https://youtube.com/@mokevnin
Связь для предложений: @kirillpublic
Download Telegram
Пейджеры. Вы задумывались над тем, что за режим открывается когда мы делаем git log или git log -p? Этот режим используется для удобства чтения больших объёмов текста, позволяя вам листать их постранично, искать по ключевым словам и перемещаться без пролистывания всего содержимого сразу.

Многие не знают, но это не встроенная фича гита, гит, в данном случае, в соответствии с философией Unix, гит открывает другую программу, которая называется пейджер. Этот же пейджер открывается и во многих других ситуациях, например, когда вы просматриваете man-страницы или результаты git diff.

Всего существуют два основных пейджера: more и less. Это реальные программы, которые можно запускать прямо в терминале напрямую или перенаправлять в них вывод: ls | less.

Первый менее функциональный, поэтому в основном используется второй. Проверить то, какой у вас стоит в системе можно посмотрев переменную окружения PAGER. Если там more, то лучше поменять на less. Зачем?

Вчера я записывал подкаст с Алексеем Гладких, где мы проходились с ним по фичам вима и терминала. И мне хотелось показать одну прикольную штуку объединяющую пейджеры и вим. Дело в том, что навигация в пейджерах это, по сути, вимовская навигация. j - вниз, k - наверх, / - поиск (n - искать дальше, N - искать предыдущее), ctrl+d - вперед на полэкрана, ctrl+u - назад на пол экрана. И правильное навигирование в пейджере это большой шаг в сторону освоения вима. Но когда Леша открыл git log и попробовал все это сделать, выяснилось что у него на арче по дефолту стоял more, где навигация другая. Мы все это добро быстро поправили и теперь ему проще поддерживать нужный уровень владения инструментом без постоянной активной практики (а у него был такой запрос).

В общем если еще не, то попробуйте

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

https://ru.hexlet.io/programs/cli-basics
5🔥86👍4616🤝3🤡2👀1
Рефлексия после собесов (окружение). По горячим следам от последних собесов. Быстро напомню, что сейчас мой собес это вот репа, клонируем и пилим микрофичу в стиле добавить сортировку в таблицу или поправить перевод. Пользоваться в процессе можно вообще всем чем угодно, лишь бы помогало.

Пока только с одним кандидатом мы дошли до точки "получилось развернуть проект, пилим фичу". Остальные споткнулись на его разворачивании. Здесь мы тратили от получаса до часа (весь собес), после чего заканчивали. Какие проблемы возникали?

Сразу дисклеймер. Все это было всегда так, поэтому для меня без сюрпризов. Что 15 лет назад, что сейчас. Технологии двигаются вперед, но люди остаются людьми. Собственно поэтому я когда-то и присоединился к Хекслету, чтобы исправлять ситуацию.

Знание терминала и основ Linux

По действиям людей и их конфигам, видно, что, в основном, его использование сводилось к копированию команд, которые просят ввести: дока утилит, вывод пакетного менеджера, что-то со стековерфлоу и ИИ. Часто утыкались в то, что неправильно настроена PATH, но человек не знающий как это вообще работает, двигался просто не в ту сторону решая не существующие проблемы. В другом случае в запущенном zsh вводились команды bash. И chatgpt в таких ситуациях не только не помогал, но и путал, потому что его пускали по ложному следу.

Ридми проекта

Наверное самый удивительный пункт, но вот как это работало. Многие либо поверхностно смотрели в ридми, либо вообще его не открывали, а сразу пытались запустить проект, набирая стандартные команды rails. Был пример, где пытались собрать ручками образ докера, хотя в этом проекте докер только в продакшене, а не в разработке. В итоге очень много потерянного времени на этом.

Обучение (документация и ИИ)

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

Использование ИИ

Тут тоже немного удивился, потому что ИИ используют многие, но он никому не помог из тех кого я собесил. А причина такая, его используют неправильно. Например терминал что-то выводит и показывает ошибку. Если сходу непонятно что это, то имеет смысл сразу закинуть в ИИ и команду и вывод. Почему-то никто этого не делал. Вместо этого было много попыток догадаться что не так и они были неуспешные. Было один раз, когда не работал докер, но там прямо было написано, что докер не запущен. А в местах где не очевидно, такое не делали.

Ну и последнее. Никто не использует как менеджеры версий mise или хотя бы asdf. Если вы еще не, то уже пора. Забудьте про rbenv, rvm и упаси господи про прямую установку.

Ссылки: Телеграм | Youtube | VK
👍62🔥2620🤔3👌1👀1
Вим-сессия с Алексеем Гладких

Уже среда, а я до сих пор не написал что вышел подкаст с Лешей Гладких на тему использования вима и немного командной строки. С другой стороны, за это время накидали разных комментов, которые я бы хотел выделить и дополнить или просто показать прикольные штуки. https://youtube.com/watch?v=Ip89ylyOSdg

home row mods

Я узнал про https://precondition.github.io/home-row-mods Крайне рекомендую ознакомиться и попробовать применить, если вас подбешивает тянуться за управляющими клавишами (либо поменяйте caps lock как мы там обсуждали)

CapsLock

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

Смена буферов

Я там говорил про комбо для смены между двумя последними активными буферами и многие начали писать что вот мол есть комбо проще и еще встроенные в сам вим. Это правда, комбо такое есть (ctrl + ^), но тянуться до ^ далеко (при такой частоте использования это далеко) и что еще крайне важно, это комбо работает только для свича двух буферов, а для переключения на другие надо использовать что-то еще. В моем же подходе (стандартный в lazyvim) это единое комбо для переключения по любым буферам (с фази) включая быстрый свитч по последним двум

% при замене в %s/replace/to/

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

Git в редакторе

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

Ссылки: Телеграм | Youtube | VK

p.s. В этот раз в аудио не выгружали, без видео тут бесмысленно
🔥41👍2413🥱9👀1
Почему одни транспилируемые языки выживают, а другие — исчезают.

TypeScript, Kotlin, Scala, ClojureScript, Elm, CoffeeScript, Elixir — все эти языки работают внутри чужих платформ: JavaScript, JVM или BEAM (виртуальная машина Erlang). Одни из них становятся массовыми и вытесняют оригинальные языки. Другие — остаются нишевыми или вымирают.

🔑 Один из ключевых факторов успеха — прозрачность интеропа. Важно не просто “можно ли вызывать код другой платформы”, а насколько это естественно:

- Совпадают ли типы данных
- Совпадают ли структуры: массивы, строки, объекты
- Совпадает ли модель исполнения: async, исключения, мутабельность

🟢 Когда интероп прозрачный, код из другого мира ощущается как “свой”, без лишнего контекста.
🔴 Когда интероп чужеродный, ты всё время чувствуешь стык: пишешь обёртки, преобразуешь данные, думаешь как бы “переехать” между языками.

Как только интероп становится непрозрачным — возникают обёртки: адаптеры поверх JS-библиотек (в ClojureScript, Elm, Scala.js), shim-функции и преобразователи структур, вспомогательные типы и интерфейсы. Это ведёт к дополнительной сложности, ошибкам и постоянной ментальной перегрузке.

📎 Пример: Elm → JavaScript

Даже чтобы вызвать console.log, нужна отдельная конструкция:


-- Elm
port module Main exposing (..)

port logToConsole : String -> Cmd msg

update msg model =
case msg of
TriggerLog ->
(model, logToConsole "Hello from Elm!")



// JavaScript
const app = Elm.Main.init()

app.ports.logToConsole.subscribe((msg) => {
console.log(msg)
})


Для любого взаимодействия с внешним миром (HTTP, localStorage, DOM) придётся городить такие конструкции.

📌 Примеры:

TypeScript — бесшовный интероп с JS. Код можно смешивать без усилий. Поэтому стал стандартом.
Kotlin — отлично встраивается в JVM и Java-проекты. Небольшие различия, но высокая совместимость.
Scala — технически совместим, но требует усилий: система типов сложнее, код не всегда читаем из Java. Интероп чувствуется.
ClojureScript — сильно отличается по структурам данных и синтаксису. Использовать JS-библиотеки можно, но неудобно.
Elm — намеренно изолирован от JS. Интероп возможен только через порты. Это безопасно, но очень ограниченно.
CoffeeScript — хорошо совпадал с JS. Был популярен, пока не появился TypeScript с типами и без сюрпризов.
Elixir — работает на BEAM и отлично сочетается с Erlang: одни структуры, общая модель исполнения. Пример максимально прозрачного интеропа.

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

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

Ссылки: Телеграм | Youtube | VK
👍271👎3721🔥3🤡3💩2
Почему многие программисты не станут синьорами никогда

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

Запоминайте паттерн решения любого затыка в кодинге:

1. 5-10 минут пробуем применить какие-то быстрые догадки и метод тыка
2. 10-20 минут тратим на поиск готовых решений в ИИ и на reddit (стековерфлоу прости, ты больше не нужен)
3. И примерно спустя 30 минут тыкания останавливаемся. На этом этапе мы должны перейти в режим, а что это вообще за проблема? Начинаем читать по теме пытаясь понять как в целом работает эта штука, которая сломалась, что за ней стоит, какая теория подходы и все в этом духе. Разбираемся за час-два и фиксим
4. Если не помогло, тут уже надо с кем-то поговорить. Нельзя висеть на одной задаче без движения больше 2 часов.

Вы делаете все правильно, если спустя час отладки можете остановится и рассказать про новые вещи, которые вы узнали, как что-то работает и почему вообще возникла проблема.

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

На практике так происходит очень часто. Человек тыкается не 5 минут, а часами никак не разбираясь в том, что он делает.

Сейчас ситуация еще хуже из-за ИИ, который позволяет входить в цикл "спросил-попробовал" на полдня без ощущения делания какой-то херни. Полдня общаться с ИИ нужно и можно, но только если вы тратите это время на попытку разобраться в вопросе, а не "поправь/вот ошибка", когда вы находитесь в цикле отладки.

Видео на эту тему одно из первых у меня на канале: https://www.youtube.com/watch?v=9iwYRcw3A8A

Ссылки: Телеграм | Youtube | VK
124👍107🔥18🤡14👎3🤔31👌1👀1🙈1🤝1
Почему надо знать про супервизоры

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

Почему порт занят, что это значит? Значит что на этом порту уже запущена какая-то программа. Почти наверняка это постгрес, который был установлен прямо в систему.

Первым делом стоит проверить, а не запущен ли уже контейнер с базой, возможно для другого проекта: docker ps. Если в выводе есть: 0.0.0.0:5432->5432/tcp, то отладка прошла, можно стопать и запускать нужный конейтенер. А если нет?

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


lsof -i :5432

NAME
localhost:postgresql->localhost:60378 (FIN_WAIT_2)
localhost:60378->localhost:postgresql (CLOSE_WAIT)


Для простоты я оставил здесь только NAME, но сам вывод показывает и команду и пид и пользователя. В общем достаточно информативно.

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


sudo kill -9 <pid>


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

Вот тут остановитесь и подумайте. А что собственно говоря происходит?

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

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

Локально все работает точно так же, даже если вы этого явно не видите. Постгрес стартует в вашей системе не сам по себе, его запускает супервизор и управлять им нужно через супервизор. В Ubuntu это systemd, в MacOS launchd. В каждой из этих систем предоставляется высокоуровневый интерфейс для работы. Вот как это выглядит для тех кто использует brew:


brew install postgresql@14
brew services start postgresql@14

brew services list

Name Status User File
postgresql@14 started kirill ~/Library/LaunchAgents/homebrew.mxcl.postgresql@14.plist
php none
caddy none

brew services stop postgresql@14


Плюс минус тоже самое во всех остальных операционках.

Ссылки: Телеграм | Youtube | VK
👍14322🔥13👎4👀3
В этом выпуске мы поговорили с Владимиром Алиповым — нейробиологом и популяризатором науки, о том, действительно ли «математический склад ума» врождён, как работают IQ-тесты и почему поменять профессию в 40 лет — реальный шанс, а не приговор. Обсудили роль интереса против генетики, разобрали мифы о способностях программистов и поделились приёмами сохранения «свежего» мозга.

А так же:

- Как «g-фактор» помогает в любой умной работе, а не только в высшей математике.
- Почему интерес к алгоритмам важнее любви к формулам, если мечтаете о коде.
- Что общего у хоккеистов и айтишников, и при чём тут месяц рождения.
- Как правильно читать результаты IQ-тестов, чтобы не сломать мотивацию.
- Какие привычки сохраняют мозг острым после сорока и кто такие супер-эйджеры.

https://youtube.com/watch?v=_tj5way-6hQ

Альтернативные ссылки: Аудио | vk
4👍55🔥176🤮5🤔3👎2🤯1👀1
Инкапсуляция не работает

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

Только если в теории. На практике поменять почти все что угодно не составляет никакого труда. Предположим что у нас есть пользователь и у него должна быть установлена хотя бы одна роль и это проверяется где-то внутри пользователя (тут не показано) при изменении списка ролей.


class User {
private final List<Role> roles = new ArrayList<>();

public List<Role> getRoles() {
return roles;
}
}


Но нам никто не машет сделать так:


user.getRoles().clear(); // теперь ролей нет
// Можно добавить дубль
user.getRoles().add(new Role("admin"));
user.getRoles().add(new Role("admin"));


Даже если геттеров нет, рефлексия пробивает любую «защиту»:


var field = User.class.getDeclaredField("roles");
field.setAccessible(true);
@SuppressWarnings("unchecked")
var roles = (List<Role>) field.get(user);
roles.clear();


Мое мнение о механизме private/protected/public со временем сильно поменялось, когда я пописал на языках где этого нет, но есть ООП. По большому счету этот механизм является в первую очередь защитой от дурака и он вообще не влияет на архитектуру. Если взять любой проект и поменять там все на public, то проект продолжит работать как ни в чем не бывало (если конечно код не завязан на рефлексию с этими).

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

p.s. Какие еще способы вы знаете как обойти private?
👍53👎399🤔3🤡2🤝2🔥1👀1
Программисты не верят в инструкции

За последний месяц я провел на собесе лайвкодинг порядка 15 человек и у меня остались смешанные чувства по тому как происходит сетап проекта с нуля. Практически все ребята, либо не следуют инструкции , либо следуют выборочно, по пути выполняя какие-то ручные действия, на базе своих представлений "как правильно", а не как надо в этом проекте. В итоге теряют время и впадают в цикл отладки из-за своих рукопашных действий.

Напоминание: мой собес это берем продакшен проект (опенсорсный), в котором классические rails. Человек его разворачивает на свой машине и делает несколько простых фиксов. Только вот до фич доходят единицы, в основном мы зависаем на сетапе. И вот почему. Ниже пара примеров.

Клонируют проект, видят, что есть .env.что-тотам и ручками создают пустой .env с комментарием "точно должен быть". И когда они доходят до команды, которая сама все правильно делает (в инструкции), то эта команда пропускает уже созданный .env файл (это осознанная идемпотентность для разворачивания), который в итоге пустой, а не наполнен базовыми ключами. Дальше естественно проект не работает и человек какое-то время не вдупляет, а когда вдуплил, начинает ручками эти переменные вставлять ориентируясь на ошибки вывода.

В другом случае человек увидел Dockerfile и даже не заглянув в README.md проекта начал его собирать. А в этом проекте запуск в деве идет не через него. Кстати, проект так и не запустился.

Еще один пример, это когда видят что в описании указан веб-сервер Caddy, сразу начинают его ставить (хотя команды сетапа сами это делают) и запускать. В итоге при старте проекта, Caddy проекта пишет что порт уже занят, потому что его стартанули отдельно от проекта. Потом десятки минут тратится на то, чтобы понять что не так.

Ну и последний пример. Видят домен .localhost и все равно идут добавлять его в hosts, хотя в инструкции нет такой установки (потому что и так работает)

И знаете что самое интересное? В большинстве случаев, ребята начинают менять что-то в файлах самого проекта, хотя для меня это нонсенс. Проект, сетап которого требует в рукопашную менять внутренние файлы (при этом оно нигде не описано)? Чот я давно с таким не встречался.

Без проблем все проходило только у тех, кто просто выполнял команды по очереди как они даны в README.md.

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

Ссылки: Телеграм | Youtube | VK
👍7932🤔21😁8🤣7🔥5🤯4😢3💯3👀1
Одна мысль - один абзац

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

Иногда меня подмывает поделиться чем-то таким. Было даже дело, я вел курс школа авторов по тому, как создавать обучающие материалы технической направленности. Хотя говорят что он полезен всем кто этим интересуется. Вот тут есть ссылка: https://making.hexlet.io/

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

> Срезы — основной способ работы с коллекциями в Go. Чтобы обрабатывать такие структуры, чаще всего используются циклы. Go предлагает два подхода: классический цикл с индексом и удобный range, каждый из которых подходит под разные задачи.

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

Правда определить где одна мысль, а где несколько не всегда очевидно без опыта. У меня были ситуации, когда на созвонах это нужно было прямо проговаривать, потому что с точки зрения автора казалось что мы тут говорим об одном, но после объяснения он понимал и переписывал.

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

p.s. Ребят, если вам интересно про все это, поставьте лайк, если нет - дизлайк

Ссылки: Телеграм | Youtube | VK
3👍30028👎24🔥14🍌6🤮2👀1
Легаси != говнокод

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

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

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

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

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

Давайте об этом поговорим немного (или много). Как вы определяете говнокод? И допустимо ли так делать?

Ссылки: Телеграм | Youtube | VK
3👍6415🔥4🤮3👀1
Наткнулся на твит, где человек пишет: "вам не нужен ORM, если вы знаете SQL" — и прикладывает вот такой пример:


SELECT u.*, COUNT(c.id) as comment_count
FROM users u
LEFT JOIN comments c ON c.user_id = u.id
WHERE u.active = 1 AND c.created_at > NOW() - INTERVAL 30 DAY
GROUP BY u.id
HAVING comment_count > 5;


И его версию в Laravel:


User::select('users.*', DB::raw('COUNT(comments.id) as comment_count'))
->leftJoin('comments', 'comments.user_id', '=', 'users.id')
->where('users.active', 1)
->where('comments.created_at', '>', DB::raw('NOW() - INTERVAL 30 DAY'))
->groupBy('users.id')
->having('comment_count', '>', 5)
->get();


Я абсолютно согласен, что знать SQL для бекендера важно и нужно, но этим все не ограничивается, а еще:

- То что здесь описывается это не ORM, а Query Builder
- Конкретно тут показан Query Builder Laravel, который нельзя назвать эталоном среди QB
- Запросы с группировкой составляют доли процента от обычных запросах в типовых веб-проектах (Аналитические запросы не считаем их вообще делают во внешних системах)
- Сам запрос это еще полдела, в статически типизированных языках еще придется фигачить маппинг если не пользоваться никакими либами
- Чистый SQL это полное отсутствие типобезопасности
- В такой запрос невозможно нормально вставить условные конструкции, например если понадобится фильтрация. Мы сразу попадем либо в склеивание строк, либо в необходимость затаскивать Query Builder

А на картинке к посту пример на drizzle-orm, в котором обеспечивается 100% типобезопасность: проверка всех условий (включая возможность выполнить join), всех операций, всех имен (таблиц и полей). Естественно автокомплит и рефакторинг в наличии.

Естественно это отдельный язык (хотя и крайне близкий к sql), но в современном мире ИИ, подобные запросы могут генериться без проблем, особенно в drizzle-orm, с его описанием схемы.

Плюс хочется сказать, что active = 1 в исходном запросе я не могу рассматривать как не говнокод. Активность должна определяться не флагом, а нормальным статусом. Про флаговое программирование скоро пост в телеге, не пропустите

Ссылки: Телеграм | Youtube | VK
👍7122🔥6👎4😁4🤔1