Кодовая база
1.3K subscribers
23 photos
1 video
50 links
База во фронтенд разработке.

Написать в личку: https://t.me/devmargooo
Download Telegram
В субботу была на Я 💛 фронтенд. Было много разных стендов с играми на любой вкус и цвет, мне пришлась по душе system design секция и сегодня я принесла вам с нее задачу.

📌 Дано: онлайн редактор таблиц (аля гугл таблицы). Пользователь может выделять ячейки как по одной, так и “оптом”, выделив сразу большой прямоугольник. А после этого он может удалить часть ячеек из выделенной зоны. В этом случае исходное выделение может разбиться на несколько поменьше, потому что любое выделение может быть строго прямоугольным — букву Г выделить не получится.

Представим, что пользователь выделил квадрат 3х3 из ячеек, а затем убрал из выделения центральную ячейку. Выделение должно разбиться на 4: две горизонтальные полосы и еще два квадратика по бокам (см. рисунок). Как это вычислить на фронтенде?

✔️ Мое решение в лоб:

Поскольку нам нужно вычислять связанные ячейки, то необходимо пройтись по соседям в области исходного выделения => используем dfs
Т.к. нам нужно маркировать только прямоугольные области, модифицируем алгоритм таким образом, чтобы двигаться всегда вправо => таким образом, получим все выделенные зоны.

Мне засчитали секцию и дали мерч, однако это примитивное решение в лоб является далеко не самым оптимальным. Предлагаю вам немного подумать и написать ваши варианты в комментарии, ну а затем я напишу решение, которое нравится мне 😏
Please open Telegram to view this post
VIEW IN TELEGRAM
112🔥6👎5💩5🤡5👍4
Еще одна задача с Я 💛 фронтенд..

У нас есть интерактивная таблица, вроде google tables, ячейки которой могут ссылаться друг на друга. У нас есть следующие правила:
A1 = B1 + 4
B1 = C1 - 8
C1 = A1 + С2

Можно заметить, что ссылки циклические. Как будем вычислять значения ячеек? Допустим, пользователь ввел в ячейку C2 значение 10. Чему будут равны A1, B1, C1?

P.S. Кстати, chat gpt не осилил задачу 🤷‍♀️
1👎76👍6🤮5💩5🔥3
Ребят, обратите внимание, с точки зрения математики задача действительно нерешаемая. В этом-то и прелесть этой задачи.

Напомню, что программирование — это не совсем математика. Именно поэтому мы можем создавать инструкции типа x = x + 6.
🔥54👍4
Forwarded from Denis Chernov
A1 = B1 + 4
B1 = C1 - 8
C1 = A1 + 10

A1 = C1 - 8 + 4
B1 = C1 - 8
C1 = A1 + 10

A1 = A1 + 10 - 8 + 4
B1 = C1 - 8
C1 = A1 + 10

A1 = A1 + 10 - 8 + 4
B1 = C1 - 8
C1 = A1 + 10

0 = 10 - 8 + 4
Чтобы решить задачу выше, давайте отойдем от логики равенства и используем логику присваивания значения, как в языках программирования, а пустые ячейки используем как 0.
A1 = B1 + 4  // B1 не инициализировано => 0 + 4  = 4
B1 = C1 - 8 // 0 - 8 ‎ =  -8, затем перевычисляем A1 = -8 + 4  = -4
C1 = A1 + С2 // -4 + 0 = -4
C2 =10 // C1 ‎ =  -4 + 10 => 6, B1 = 6 -8 = -2, A1 = -2 + 4  = 2.

Можно продолжить этот процесс итеративно, определив количество итераций, или остановиться после первой.

За решение этой задачи я получила от команды Яндекс Документов вот такую солнечную панамку. Сами понимаете, без панамки блоггеру в наше время никак нельзя.
12💩7👍6👎6🤮6🔥5🤔2
Сложность не в коде

Вчера вечером один из моих учеников столкнулся с проблемой.

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

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

Однако React тут не при чем, как и код в целом. Сложность практически всегда заключается не в коде, а в понимании того, что именно должно происходить с данными. Я часто вижу, что когда не получается написать код, дело не в знании фреймворка или языка, а в том, что программист плохо понимает, как должна работать его система. В данном случае ученика сбило с толку, что сами-то данные обновляются в каждой пачке и ему было сложно принять мысль, что в данном случае нам нужно один раз за сессию записать данные и больше их не обновлять. Технически это можно сделать как угодно: session storage, поле в стейт менеджере, да и просто переменная, в конце концов. Главный принцип, который нужно понять — это когда записать данные, когда прочитать, когда инвалидировать. Если вы разберетесь с флоу данных в вашем приложении, найти подходящий метод в фреймворке/библиотеке/языке будет не так-то сложно.

Как говориться, в программировании есть только две проблемы — наименование переменных, инвалидация кеша и ошибка на единицу.
13❤‍🔥8🔥5💩5👎4😁4🤮3👍1
Рефлексия о фронтенде в России за последние 10 лет

Когда я начинала свою карьеру в айти 10 лет назад, фронтенд переживал период бурного роста. Вышел es6 и мы мы массово переходили с библиотечных промисов на нативные и распутывали callback hell.Набирали популярность реактивные фреймворки, мы спорили о сортах реактивности и переписывали старые сайты с jQuery на SPA. Всем срочно понадобились мобильные версии. Всем стала срочно нужна мобильная версия.

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

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

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

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

Именно поэтому приобрели популярность всякие “конкретные достижения” в резюме. Что толку с того, что вы отрефакторили огромный легаси, если это никому не было нужно? Напишите, насколько быстрее фичи стали катиться. Зачем вы покрыли все тестами, это реально помогло снизить количество багов? Если нет — то ваши тесты бесполезны.

Мало знать технологию, нужно понимать, как именно ее приложить к реальности.

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

Я часто встречаюсь с позицией, что разработчик не должен думать о бизнесе — его задача сделать то, что принес менеджер. Эта модель устарела. Сегодня бизнес не готов давать шанс продуктам, которые плохо монетизируются. А значит, понимание бизнеса становится частью профессии разработчика.
129👍13🔥6🤮5👎4💩3💯1
Говорила про это еще год назад. Сейчас про цифровой след говорят все больше. Когда жизнь каждого из нас оцифрована в виде постов в соцсетях, а фио можно просто погуглить, нанимающие будут использовать этот способ для валидации кандидатов как дешевый и достаточно эффективный. Понятно, что не все кандидаты гуглятся, но со временем таких будет больше и цифровой след будет серьезно увеличивать ваши шансы попасть на работу.

Как говорится, запомните этот твит.
👎7🤮5💩5🔥42👍2😘1
Forwarded from CSS Боль
Цифровой профессиональный след

Яркая новинка HR-сезона 2026 — понятие цифрового профессионального следа. Я начал встречать его упоминания в феврале в HR-каналах и в вакансиях. В чём суть явления?

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

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

Идеальный пример ЦПС — это доклад на конференции. Описание доклада висит на сайте конференции, и кандидат не может его изменить. По докладу можно понять уровень докладчика, сколько у него лет опыта, где он работал.

Вроде бы идея с цифровым следом здравая. Но есть проблема — хороших источников цифрового следа мало. Что ещё можно исползовать как цифровой след? Накидайте вариантов.

И ещё одна проблема. Теперь каждому разработчику с самого начала карьеры надо вести дневничок и собирать портфолио наград и грамот, как в школе? Вы готовы к этому, дети? Да, капитан!
🤮7👎65💩5👍4🔥4🌚1
Намедни меня упрекнули в том, что на канале слишком много информации о поиске работы и карьере.
Я пришла к выводу, что это звучит справедливо, и подумываю создать отдельный канал про карьеру и поиск работы — в этом останется только про разработку. Но не уверена, что стоит плодить каналы.
Вы как считаете?
10💩6🤮5🤡4👍2👎1💯1👻1
Сделать отдельный канал про карьеру?
Anonymous Poll
31%
Да
69%
Нет
🤡13🤮7💩51🍾1
Накрутка опыта и шантаж

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

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

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

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

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

В комментариях к оригинальному посту проскальзывали советы сослаться на дипфейк, а то и вовсе подделать такие же “доказательства” для коллег, чтобы имитировать массовую рассылку. Не занимайтесь подставами, не закапывайте себя еще глубже. Как минимум, это будет подозрительно, а как максимум, кто-нибудь из сообразительных коллег шустро накидает на вас досудебку за клевету, но будет готов отказаться от претензий, разумеется, не за спасибо. Тогда неприятным разговором вы не отделаетесь.
💯2817💩11🤡11🤮7🔥4🤔1
Forwarded from CSS Боль
От резюме к доказательному найму

Рынок найма сломан двумя кризисами: экономическим и кризисом доверия. Они наложились друг на друга и бьют даже по сильным специалистам.

Новый дефолт рынка — нулевое доверие к кандидатам. И это надолго.

Резко выросла ценность цифрового профессионального следа — пруфов, которые подтверждают опыт и уровень навыков. Рынок движется к доказательному найму.

У большинства разработчиков таких доказательств нет. А нарабатывать их долго и дорого.

Поэтому появляются форматы, которые дают достоверное подтверждение уровня, сопоставимое по силе с докладом на технической конференции.

Один из таких форматов — чемпионат по вёрстке для мидлов от @htmlacademy. Он изначально строился как доказательный формат и включает:

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

Старт — 30 марта. Если у вас есть коммерческий опыт в разработке, это способ получить публичный пруф своего уровня.

Записаться на чемпионат
🤡17💩10🔥5🤮51
Применение теории на практике

Иногда ко мне приходят ребята, которые сталкиваются с проблемами в коде. Буквально: “не знаю, как сделать эту фичу”, “мой код не работает, но я не знаю, почему”. Это обычно называют практикой, но, на мой взгляд, это всё ещё теория — человек не освоил инструмент и не понимает, как получить нужный результат.

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

Чем вообще отличается теория от практики? Я считаю, теория включает в себя освоение принципов работы какого-нибудь инструмента или подхода. Вы изучаете его возможности, логику и принципы. А практика — это приложение этих знаний к реальному бизнес-процессу. Практика обязательно включает в себя выбор инструмента, а для того, чтобы выбрать, надо знать свойства разных подходов. Если у вас есть завод и вы хотите, скажем, понять, делать вам фрезы из стали или из карбида, вам же нужно понимать свойства обоих сплавов? Вот и здесь также: чтобы выбрать инструмент и подход, нужно знать свойства каждого.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
Критерий выбора — целесообразность.
〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

Это означает, что у вас есть:

1️⃣ Цель (бизнес-задача)
2️⃣Набор инструментов с известными свойствами
3️⃣ Выбор инструмента, соответствующего цели.


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

В ближайших постах разберу популярные тезисы вида «X лучше Y» и покажу, в каких условиях выигрывает каждый вариант.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️
P.S. Внимательные читатели наверняка помнят, что я писала отдельный пост о связи теории и практики, и,вероятно, запутала всех терминологией. Хотела бы уточнить, что в в этих двух постах я использовала термины по-разному: в прошлый раз под “практикой” я подразумевала написание кода, а сегодня — исключительно решение бизнес задач и в дальнейшем планирую придерживаться такой терминологии. Таким образом, если вы пишете туду лист на курсах -- то этот проект корректнее назвать теорией, потому что он не решает реальную бизнес потребность. Наверное, рано или поздно надо будет делать словарь, как в DDD.
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍7🔥4🤮4💩3👎2
Женя Кучерявый написал гайд, как программировать без интернета. Эта статья вызывала у меня широкий спектр эмоций, начиная от смеха со слезами и заканчивая ностальгией по университетским годам, когда быстрый интернет в корпусе был скорее исключением, чем правилом (что, впрочем, нас не останавливало). Поскольку сегодня среда, мои чюваки, не могу лишить вас возможности насладиться гайдом!

https://kucheriavyi.ru/articles/coding-without-internet

P.S. Этот пост не предназначен для того, чтобы его восприняли слишком серьезно. Он здесь шутки ради.
1😁105🔥5🤮5🤡4👎3👍1🌚1
Forwarded from zede code
Ситуация в найме ахтунг. Все и так все понимают.

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

НИЧЕГО не ставьте на комп связанное с работой до последнего.

- ни для тестового задания!
- ни для интервью!
- ни для работы в первый день (если работаете неофициально)!

Ни приложения, ни установки "пакетов содержащих апи" НИ ЧЕ ГО.

Если вас вынуждают, то используйте:
- дев окружения: CodeSandbox, Stackblitz и тп
- если все же нужно со своего и хоть какое-то доверие есть, то используйте Dev Container или как самый минимум просто докер
- для выхода на новой работе тоже лучше соблюсти меры предосторожности, особенно если никаких реальных документов вы не заключали. Докер, в идеале отдельная система и отдельный пользователь, чтобы даже в случае проблемы вы не потеряли доступ к устройству и данным.

Также рассказали о новом виде скама с логином в iCloud. Со своего ПК не лезьте и не логиньтесь никуда. Если дают какой-то сервис, то лучше зайти с инкогнито + сгенерировать рандомный пароль (понимаю, что это базовая сейчас рекомендация по безопасности, но пароли многие все еще пишут руками по паттерну).
👍188🔥3👎2🤮2💩2🤡1
Век живи — век учись. Сегодня я узнала, что ts инферит переменную со значением null к any.
🤔19👍6🤡6🔥2💩21👎1🤮1💅1
Начала писать для вас стопку технических постов и пока все лежит в драфтах. Чтобы вы сильно не скучали, приношу вам плейлист стримов где мы с ребятами из @moscowqa обсуждаем #typescript. Я рассказываю про базовую и продвинутую типизацию, немного потрогали загадочный тип never, а также ковариантность и контрвариантность. Все вопросы можете написать прямо сюда, я постараюсь как можно детальнее на все ответить.
15🔥6👍4💩2👎1🤮1
А вы тоже иногда путаетесь в куче логов в консоли?

Чтобы облегчить себе жизнь, логи можно раскрашивать. Например, вот так:


console.log('%cSESSION_START', 'background-color: red; color: white; padding: 10px 30px');

console.log('%c[User] Get data...', 'color: yellow');

console.log('%c[Products] Я точно не пропущу этот лог', 'font-size: 25px;');

console.log('%cSESSION_END', 'background-color: red; color: black; padding: 10px 30px');
20👍11🔥4🤮4🤡3💩2👎1
Императивное vs декларативное программирование

Это — две разные парадигмы программирования. Разберемся, чем они отличаются и когда удобно использовать первую, а когда вторую.

😊Императивное программирование — это пошаговое описание алгоритма, который должен выполнить компьютер:

const input = process.argv[2];
const x = Number(input);
if (!isNaN(x)) {
const y = x * x;
console.log(y);
}

В этом нехитром фрагменте кода описан императивный алгоритм получения и вывода в консоль квадрата числа:

1️⃣Возьми пользовательский ввод
2️⃣Приведи к числу
3️⃣Если число валидное, вычисли квадрат и выведи в лог.

😊Декларативное программирование — это описание желаемого результата. Язык/фреймворк/движок должен сам определить, как его достичь. Например:

const Panel = () => {
useEffect(() => console.log("Panel rendered"), []);

return (
<form action="/login.php" method="POST">
<label htmlFor="user">Username:</label>
<input type="text" id="user" name="username"/>
<button type="submit">Login</button>
</form>
)
}


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

⚠️Важно понимать, что под капотом любое декларативное обязательно превращается в императивные инструкции. React код, например, превращается в императивный вызов React.createElement(…). Низкоуровнево компьютер вообще не умеет работать с декларативностью, под капотом всегда императивный процесс. Данные и операции сохраняются в виде последовательности битов в памяти, затем компьютер вычисляет (compute) результат операции и записывает данные в соответствующий регистр. Чтобы запустить вычислительный процесс, необходим набор конкретных инструкций. Именно поэтому декларативный код в конце концов превращается в императивный.

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

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

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

🤩🤩🤩🤩🤩
Подведем итоги.

📌 Императивное программирование удобно, когда вы хотите получить жесткий контроль над процессом выполнения программы.

📌 Декларативное программирование удобно, когда вы хотите снизить сложность участка программы за счет передачи управления в другой модуль/библиотеку/фреймворк/программу.
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍6🤮5🔥3💩3👎2