Pull to refresh

Comments 21

Нет, он включен, но все равно файлы используются. Попробовал выключить, количество файлов увеличилось на целых 6, но появились ошибки.

Посмотрите esbuild. Написан на Rust, мой проект билдит за секунду, в то время как tsc секунд 40.

UFO just landed and posted this here

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

Swc написан на Rust. А esbuild написан на Go (https://esbuild.github.io/faq/#why-is-esbuild-fast)

Потребление памяти-то вы снизили. Но теперь ответственность за правильные типы библиотек - на вас. Изменится зависимость, а вы не поправите свою обертку с типами - что-нибудь упадет.

Кстати, такой способ импорта не очень совместим с ES Modules. Если в зависимости прописаны точки входа exports в package.json , то импортировать можно только из этих точек входа. https://nodejs.org/api/packages.html#package-entry-points

У нас зафиксированы версии в package.json, обновляем редко и при большой нужде, даже changelog смотрим.

Про es modules Вы правы, там еще импорт директории запрещен, нужно указывать index.js. Но для этого хотя бы можно написать plugin, а с прописанными exports я даже не знаю, что и делать.

Ох и горе-программисты же пошли… Во всех книгах типа «10 способов выстрелить себе в ногу» пишут, что это один из способов.

Вы вообще знаете, что такое инкапсуляция и зачем она нужна? Я бы у себя на проектах за такое заставил бы перечитывать все эти книги. Вот оно, поколение JS, люди, которые, не работали ни с C/C++ ни с ассемблером…

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

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

Вы залезли во внутренние типы библиотек и если библиотека решит полностью поменять «внутрянку» с сохранением публичного интерфейса то у вас все сломается. Инкапсуляция как раз про то, чтобы таким образом не стрелять себе в ногу.

В общем, уровень начинающего джуна по моему опыту.

Лет 7 назад я тоже верил в китов ООП, SOLID, и ругался, когда находил в БД ненормализованные таблички.

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

Можно представить это как адаптер и инверсию зависимостей. Если hubspot изменит свое api, нужно будет поменять адаптер - hubspot.js, hubspot.d.ts и реализовать старые методы через новый апи, а не шерудить по всему проекту.

Конечно, нужно было бы просто выкинуть @redis/client и взять более подходящую библиотеку, уверен в npm есть что-то годное. Но, скорей всего, в проекте уже есть зависимости на определенные особенности этой библиотеки (абстракции протекают) и они сломаются при переходе на другую библиотеку. Может память немного протечь, может гонка начнется. Это может произойти и при переходе на новую версию, поэтому мы фиксируем версии зависимостей и переходим только если ооочень надо.
Добавлю в код комменты для других разрабов, возможно оно действительно неочевидно, зачем.

Переход на личности весьма неприятен, и не обоснован, я намног больше воспитан C#, чем js, с ассемблером, слава богу, не работал, а вот с C/C++ довелось, и не думаю, что это хороший язык для воспитания хорошего вкуса у программиста, слишком много на нем очень плохого кода.

7 лет назад у меня уже был общий опыт программирования 22 года :)

ООП и SOLID это скорее «идеалы» к которым нужно стремиться, но которыми можно пожертвовать ради - ради чего? Производительности - только если итоговая выгода для ПОЛЬЗОВАТЕЛЕЙ продукта существенна и других способов сделать то же самое не нашлось, удобства - возможно, но очень осторожно, ведь что удобно одному неудобно другому.

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

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

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

Каждый раз когда вы чем-то жертвуете в проекте вы должны чётко понимать - ради чего? В данном посте автор приносит огромные жертвы ради… ускорения сборки проекта и решения проблем с нехваткой памяти. Что первое что второе можно решить заменив ПК и ноутбук на более производительные, либо использовать другие компиляторы типа того же esbuild. Неразумно.

Кстати, нормализация таблиц это тоже идеал, но к реальном продакшене очень мало чисто нормальных схем баз данных. Как минимум, например, потому что даже 1NF требует словарь для таких данных как имя пользователя/клиента/игрока и всё запросы превращаются в гигантские конструкции из десятков JOIN-ов.

Даже если у вас количество повторяющихся данных в кортежах 0.01%, то БД уже не будет соответствовать 1NF, поэтому нормализируют БД не с целью «соответствовать нормальным формам», а как раз с целью повысить эффективность, уменьшить потенциальные ошибки, упростить поддержку схемы и логики приложения.

С точки зрения теории я с Вами согласен, все так и есть.
С одной стороны возрастающая сложность, с другой удобство пользователей. (У сервиса компиляции пользователи - программисты)
А на практике, в конкретном случае, вы действительно считаете, что это приведет к большим проблемам? Мне кажется, вероятность мала, а проблемы незначительны. Оценка, конечно, субъективна и зависит от проекта.

Я не только считаю, я с этим сталкивался очень много раз. С позиции руководителя и лида особенно. Люди меняются и новички на проекте потом приходят ко мне с вопросами "А это зачем?". Я на 100% согласен про удобство ПОЛЬЗОВАТЕЛЕЙ, но тут достигается не удобство пользователей, а удобство одного конкретного человека со слабым ноутбуком :) Всё же все решения должны быть подчинены эффективности бизнеса, а не чего бы то ни было.

Хорошо написанный комментарий решит проблему?
Ноутбук не слабый, i7 10 серии, 16Гб. Но криво написанные библиотеки (а в случае redis это именно что криво и слишком вычурно) иногда непомерно тратят ресурсы.
Бизнес это в том числе про скорость багфиксов и выкатки фич, в том числе про удовлетворенность процессом разработчиков.

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

Программирование - не магия следования AbstractBuilderFactoryAdapter, а инженерная/архитектурная практика. Например, если проект собирается 10 минут (ангуляр проект какой-нибудь), а после - 5, вы можете сами себе посчитать импакт на T2L.

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

Более того, как уже было много раз сказано даже тут - есть более "правильные" способы достичь этой же цели.

P.S.: NF это, грубо говоря, набор принципов. И они, по сути, могут применяться к чему угодно, ко всему, что подходит к определению модель данных, это верно. Но в обсуждении конкретно тут и в принципе используется уже какая-то "материальная" сущность модели данных. Иначе это будет обсуждение абстрактных единорогов в вакууме :)

И вообще :) Согласно методологии SMART желательно всегда оперировать измеримыми (и остальные SART) метриками, это тоже верно как то, что земля не плоская :)

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

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

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

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

На мой взгляд опыт программистов по уровню можно разделить на части:
1. Знание синтаксиса языка
2. Знание возможностей языка и стандартной библиотеки
3. Знание паттернов программирования
4. Использование различных библиотек вместо своего кода
5. Знание внутренней реализации популярных контейнеров и алгоритмов
6. Понимание бизнес-логики и бизнес-потребностей
7. Умение обучать других программистов
8. Наличие своей философии программирования

Написал это всё не очень точно, я сейчас пью пиво :)

Опыт программирования 29 лет и сокрытие = инкапсуляция. Ну ну... Каким боком тут инкапсуляция? :/

Инкапсуляция - сокрытие реализации если говорить простыми словами. А у вас какое понимание?

Самый простой способ ускорения компиляции TypeScript'а - сразу кодировать на JavaScript'е ;)

Sign up to leave a comment.

Articles