Дивовижний світ веброзробки
Товариство, сьогодні уже вівторок, і до суботи лишилося усього нічого! Тому нагадаю вам про те, що саме цієї суботи у Львові ви маєте нагоду стати глядачами технічної співбесіди наживо! Вперше цей формат переміститься з ютубу на справжню сцену, зі справжньою…
Товариство, а тим часом ми додали кілька квиточків на завтрашню зустріч у Львові. Тому якщо ще сумнівалися чи брати — не сумнівайтесь, беріть.
Буде круто, незвично, цікаво й корисно. Словом, чекатиму на вас завтра!
https://secure.wayforpay.com/payment/lampa_senior_fe
Буде круто, незвично, цікаво й корисно. Словом, чекатиму на вас завтра!
https://secure.wayforpay.com/payment/lampa_senior_fe
Wayforpay
Лампова співбесіда: Senior Frontend
Хотіли побачити, як виглядає справжня технічна співбесіда зсередини? Маєте нагоду це зробити наживо — на сцені, разом з іншими глядачами. Уперше наш формат сходить з екранів та відбувається офлайн! Учасник проходитиме майже справжню співбесіду перед живою…
🔥15
Якщо ви запитаєте, як пройшли мої вихідні, я просто покажу ці світлини. Бо ці вихідні вийшли, певно, найнасиченішими за останні років 5.
Спершу я побував на IT Arena. І вперше — в якості спікера головного дня. Колись давно я вже виступав на недільному мітапі, але погодьтесь, до третього дня будь якої конференції доживають лише відчайдухи та тверезі.
А тут — головний день. Вже по факту можу стверджувати — я дав 100% і стільки ж отримав назад. Люди заповнили залу вщент — таке враження, що було рази в два більше глядачів, аніж планувалось.
А говорив я просто про те, як змінюються співбесіди в епоху ШІ. На мою особисту, глибоко субʼєктивну думку. Однак ця тема виявилася настільки близькою відвідувачам, що вже після доповіді я ще більше години проповідував уже на вулиці, поки тривав виступ наступного спікера, зібракши крепко більше 12 апостолів навколо.
Вже згодом я прикинув, що я не стуляв писок години три від початку доповіді, тож не дивно, що мене просто вимкнуло вдома о девʼятій годині.
…і підняло опів на пʼяту наступного ранку. Та я не жалівся, бо якраз встиг попрацювати над планом для "Співбесіди на сцені" — дуже експериментальної події, ідею якої я носив уже більш як пів року.
І що ви думаєте? У нас все вийшло. Звичайно, я буду робити роботу над помилками, насамперед в структурі та підході до питань, бо формат наживо дещо відрізняється від ютубу. Але мені сподобалося надзвичайно. Особливого шарму та атмосфери додавав прямий інтерактив з глядачами, чого мені суттєво бракує на стримах.
Ну і, звичайно, я дуже дякую Мирославу за роль кандидата, бо далеко не в останню чергу саме завдяки його безпосередньості та невимушеності вдалося зробити формат дійсно цікавим, корисним та захопливим. До речі, з усіма перервами подія тривала під три години, проте глядачі й не думали роходитися. Тому наступного разу раджу не вагатися, а спробувати таки відвідати цей формат, тим паче зала невелика.
А вчора я сів в машину вартістю у кілька мільйонів та поїхав на студію записувати подкаст з Артемом Биковцем. Про запис справжнього подкасту, не по "зуму" я теж мріяв уже дуже давно, але це задоволення коштує грубих грошей ) Тож без спонсорів тут ніяк, шо поробиш.
Але нарешті це сталося, і ми з Артемом без підготовки, з коліс записали півтори години чудової розмови про те, яким буде інженер майбутнього, чому потрібно рухатися та розвиватися, скільки гребе баксів Бабіч за консалтинг зі співбесідами, і чому кожен розробник має хоча б вмочити ногу в BA, дизайн, тестування, product та інші суміжні галузі.
Наша зустріч хоч і вийшла короткою, бо Артем мав суворі часові рамки, але настільки насиченою, що фраза "…але це тема для окремої розмови" звучала далеко не один раз.
Втомлений та задоволений я поїхав додому, знову на транспорті за кілька мільйонів, ще й перебираючи, в який саме я вмощу свою дупу.
Однак саме додому я потрапив теж не одразу, адже мав ще заскочити на Нову Пошту та забрати дещо. В принципі, це дещо ви бачите на останній світлині, і воно допоможе мені створити нове відео, яке вийде вже або цього тижня, або максимум на початку наступного.
Тож, якщо коротко, за ці вихідні справдилися щонайменше три мої мрії. А ще зʼявилося нове натхнення на новий розділ моєї, скажімо так, творчості.
І так, нових етерів зі співбесідами поки не буде. А може вони ніколи й не повернуться. А якщо й повернуться, то перероджені у щось інше. А поки я маю великий запал спробувати нові формати та нові напрямки, і маю щодо цього наполеонівські плани.
Але ці плани нічого не вартуватимуть без вашої підтримки, на яку я дуже й дуже розраховую.
Ось такі були мої довгі вихідні. А як справи у вас?
@babichdev
Спершу я побував на IT Arena. І вперше — в якості спікера головного дня. Колись давно я вже виступав на недільному мітапі, але погодьтесь, до третього дня будь якої конференції доживають лише відчайдухи та тверезі.
А тут — головний день. Вже по факту можу стверджувати — я дав 100% і стільки ж отримав назад. Люди заповнили залу вщент — таке враження, що було рази в два більше глядачів, аніж планувалось.
А говорив я просто про те, як змінюються співбесіди в епоху ШІ. На мою особисту, глибоко субʼєктивну думку. Однак ця тема виявилася настільки близькою відвідувачам, що вже після доповіді я ще більше години проповідував уже на вулиці, поки тривав виступ наступного спікера, зібракши крепко більше 12 апостолів навколо.
Вже згодом я прикинув, що я не стуляв писок години три від початку доповіді, тож не дивно, що мене просто вимкнуло вдома о девʼятій годині.
…і підняло опів на пʼяту наступного ранку. Та я не жалівся, бо якраз встиг попрацювати над планом для "Співбесіди на сцені" — дуже експериментальної події, ідею якої я носив уже більш як пів року.
І що ви думаєте? У нас все вийшло. Звичайно, я буду робити роботу над помилками, насамперед в структурі та підході до питань, бо формат наживо дещо відрізняється від ютубу. Але мені сподобалося надзвичайно. Особливого шарму та атмосфери додавав прямий інтерактив з глядачами, чого мені суттєво бракує на стримах.
Ну і, звичайно, я дуже дякую Мирославу за роль кандидата, бо далеко не в останню чергу саме завдяки його безпосередньості та невимушеності вдалося зробити формат дійсно цікавим, корисним та захопливим. До речі, з усіма перервами подія тривала під три години, проте глядачі й не думали роходитися. Тому наступного разу раджу не вагатися, а спробувати таки відвідати цей формат, тим паче зала невелика.
А вчора я сів в машину вартістю у кілька мільйонів та поїхав на студію записувати подкаст з Артемом Биковцем. Про запис справжнього подкасту, не по "зуму" я теж мріяв уже дуже давно, але це задоволення коштує грубих грошей ) Тож без спонсорів тут ніяк, шо поробиш.
Але нарешті це сталося, і ми з Артемом без підготовки, з коліс записали півтори години чудової розмови про те, яким буде інженер майбутнього, чому потрібно рухатися та розвиватися, скільки гребе баксів Бабіч за консалтинг зі співбесідами, і чому кожен розробник має хоча б вмочити ногу в BA, дизайн, тестування, product та інші суміжні галузі.
Наша зустріч хоч і вийшла короткою, бо Артем мав суворі часові рамки, але настільки насиченою, що фраза "…але це тема для окремої розмови" звучала далеко не один раз.
Втомлений та задоволений я поїхав додому, знову на транспорті за кілька мільйонів, ще й перебираючи, в який саме я вмощу свою дупу.
Однак саме додому я потрапив теж не одразу, адже мав ще заскочити на Нову Пошту та забрати дещо. В принципі, це дещо ви бачите на останній світлині, і воно допоможе мені створити нове відео, яке вийде вже або цього тижня, або максимум на початку наступного.
Тож, якщо коротко, за ці вихідні справдилися щонайменше три мої мрії. А ще зʼявилося нове натхнення на новий розділ моєї, скажімо так, творчості.
І так, нових етерів зі співбесідами поки не буде. А може вони ніколи й не повернуться. А якщо й повернуться, то перероджені у щось інше. А поки я маю великий запал спробувати нові формати та нові напрямки, і маю щодо цього наполеонівські плани.
Але ці плани нічого не вартуватимуть без вашої підтримки, на яку я дуже й дуже розраховую.
Ось такі були мої довгі вихідні. А як справи у вас?
@babichdev
❤65🔥27👍4
Що для вас "тестове завдання"? А то мені тут запропонували приділити вісім (!) годин, а вимоги до завдання як до нормального такого PoC.
Хоча завдання саме прикольне, вимагає активне використання ШІ, тобто й сам процес буде цікавим. Але 8 годин? Це повноцінний стресовий насичений робочий день після якого зазвичай беруть довгі вихідні.
Ще й не оплачуване.
І це при тому, що я прямо й чітко заявив, що зараз не шукаю роботу, а спілкуюсь суто з інтересу шо там в світі коїться. А куди приткнути вільних 8 годин я знайду. Наприклад, завтра буду активно займатись новим відео.
А от ви скільки часу готові приділяти тестовим?
Хоча завдання саме прикольне, вимагає активне використання ШІ, тобто й сам процес буде цікавим. Але 8 годин? Це повноцінний стресовий насичений робочий день після якого зазвичай беруть довгі вихідні.
Ще й не оплачуване.
І це при тому, що я прямо й чітко заявив, що зараз не шукаю роботу, а спілкуюсь суто з інтересу шо там в світі коїться. А куди приткнути вільних 8 годин я знайду. Наприклад, завтра буду активно займатись новим відео.
А от ви скільки часу готові приділяти тестовим?
❤48😁9👍1
Записати "говорящу голову" — година.
Почати записувати демки коду і зрозуміти, що вони хєрня собача — дві години.
Сісти фіксити демки і сценарій під них, захопитися і повністю все переробити — три години.
І тепер знову з нуля треба писати демки (
Отакі вони суворі будні ютубної сєлєби.
Почати записувати демки коду і зрозуміти, що вони хєрня собача — дві години.
Сісти фіксити демки і сценарій під них, захопитися і повністю все переробити — три години.
І тепер знову з нуля треба писати демки (
Отакі вони суворі будні ютубної сєлєби.
😁53🔥12❤2👏1
Прикликаю адмінресурс!
У мене шось на сайті прийдешньої конференції React+ fwdays'25 ну прямо замало вподобайочок.
Це, знаєте, геть не додає мотивації зробити класнючу, цікавенну, неймовірно захопливу доповідь про те, коли хуки не потрібні та як писати простіший та зрозуміліший код без зайвих use*.
Тому заходьте, тикайте пальцем або курсором в мою задоволену мармизу і княпайте "ХОЧУ ПОСЛУХАТИ".
Вам несложно, мені пріятно, як то кажуть.
https://fwdays.com/event/react-fwdays-2025
У мене шось на сайті прийдешньої конференції React+ fwdays'25 ну прямо замало вподобайочок.
Це, знаєте, геть не додає мотивації зробити класнючу, цікавенну, неймовірно захопливу доповідь про те, коли хуки не потрібні та як писати простіший та зрозуміліший код без зайвих use*.
Тому заходьте, тикайте пальцем або курсором в мою задоволену мармизу і княпайте "ХОЧУ ПОСЛУХАТИ".
Вам несложно, мені пріятно, як то кажуть.
https://fwdays.com/event/react-fwdays-2025
Fwdays
React+ fwdays’25 - практична конференція про React та сучасний JavaScript
👍23❤10🔥9😁2
#js_in_action
Загальновідомо, що JS може працювати лише в одному потоці, тобто усі дії та обчислення ставляться в чергу. І коли вони виконуються, будь-які інші дії "блокуються", тобто мусять дочекатися, доки завершиться поточний обрахунок.
Це призводить до різних незручностей, зокрема "зависання" інтерфейсу при ресурсоємних обчисленнях. Звичайно, мій уважний читач одразу зазначить, що це проблема архітектури. Але якщо у нас відсутня можливість запускати такі обрахунки в паралелі, то у нас просто немає виходу.
Чи є? Уже тривалий час ми маємо доступ до так званих воркерів — можливості запускати окремі ізольовані контексти виконання, зблекджеком власним потоком та чергою виконання. Це не фіча самого JS, а саме середовища виконання.
Перший драфт, до речі, зʼявився ще 2009 року. І того ж року його підтримку додали в Firefox 3.5 та Chrome 4. З тих пір можливості цього стандарту тільки зростали, як і поширення його запровадження в бравзерах. А з 2019 року стабільна підтримка воркерів зʼявилася і в NodeJS.
Важливо памʼятати — воркер не має доступу до "зовнішнього світу", тобто глобального оточення, з якого його запустили. Це значить — ніякого прямого доступу до DOM, window чи document. Вважайте їх за таку собі "пісочницю".
Але ж який в них тоді сенс, спитаєте ви? Ну, не такі вони вже й ізольовані. Існує спеціальний інтерфейс спілкування з воркерами, який підтримує метод
Наразі існує декілька видів воркерів, кожен з яких має своє призначення.
Почнемо з Dedicated Worker. Він належить тільки тій сторінці, яка його створила і закінчує своє існування разом з нею. Це якраз класичний приклад додаткового процесу, який обмежений однією вкладкою. Але якщо нам треба воркер, який вміє спілкуватися з кількома вкладками?
Для цього існує SharedWorker. Він поводиться рівно так само, як і звичайний, але при цьому до нього можуть підключатися різні вкладки з нашим застосунком. І "живе" він теж до останнього підключення.
А коли нам потрібно, аби воркер жив та існував незалежно від того, чи відкрита хоч одна вкладка, ба більше, незалежно від того, чи запущено бравзер взагалі (ну, тут перебільшення, має бути запущено фоновий процес бравзера, але це вже глибокі деталі), ми можемо використати ServiceWorker.
Це свого роду наш кишеньковий сервер, який вміє працювати з фоновими завданнями, має доступ до великої кількості API, таких як Cache, Background Sync, Push та багатьох інших. Його основне завдання — виступати посередником між нашим застосунком, локальним кешем та мережею. Саме на ньому базується можливість створення offline-first застосунків.
Якщо підсумувати, то кожен воркер має свою сферу відповідальности: уявіть, що Worker — це комірник одного магазину, SharedWorker обслуговує кілька відділень, а ServiceWorker вже виступає як регіональний менеджер, і займається вже не нагальними справами, а, радше, забезпечує функціонування торговельної мережі навіть у позаробочі години.
Воркери вирішують проблему однопоточности JavaScript, хай і в дещо неочевидний спосіб. Вони дозволяють перебрати з основного потоку усі важкі та ресурсозатратні обрахунки, залишаючи йому лише займатися оновленням UI.
Що почитати:
📖 MDN: Web Workers API
📖 MDN: SharedWorker
📖 MDN: Service Worker
Що почитати душнілам:
📖 WHATWG: Web Workers Standard
📖 W3C / WHATWG: Service Workers
Підписуйтесь: @babichdev
Загальновідомо, що JS може працювати лише в одному потоці, тобто усі дії та обчислення ставляться в чергу. І коли вони виконуються, будь-які інші дії "блокуються", тобто мусять дочекатися, доки завершиться поточний обрахунок.
Це призводить до різних незручностей, зокрема "зависання" інтерфейсу при ресурсоємних обчисленнях. Звичайно, мій уважний читач одразу зазначить, що це проблема архітектури. Але якщо у нас відсутня можливість запускати такі обрахунки в паралелі, то у нас просто немає виходу.
Чи є? Уже тривалий час ми маємо доступ до так званих воркерів — можливості запускати окремі ізольовані контексти виконання, з
Перший драфт, до речі, зʼявився ще 2009 року. І того ж року його підтримку додали в Firefox 3.5 та Chrome 4. З тих пір можливості цього стандарту тільки зростали, як і поширення його запровадження в бравзерах. А з 2019 року стабільна підтримка воркерів зʼявилася і в NodeJS.
Важливо памʼятати — воркер не має доступу до "зовнішнього світу", тобто глобального оточення, з якого його запустили. Це значить — ніякого прямого доступу до DOM, window чи document. Вважайте їх за таку собі "пісочницю".
Але ж який в них тоді сенс, спитаєте ви? Ну, не такі вони вже й ізольовані. Існує спеціальний інтерфейс спілкування з воркерами, який підтримує метод
postMessage для надсилання повідомлень і onmessage для їх обробки. Це викликає в голові мою улюблену аналогію з печерою, коли воркер весь час сидить в ній і виконує свою задачу, а ми в той час займаємось своїми справами. Коли нам треба щось — ми кидаємо в печеру записку із завданням, а через якийсь час воркер викидає з неї результат.// main.js
const worker = new Worker('worker.js');
worker.postMessage('Зроби шось!');
worker.onmessage = e => {
console.log(e.data);
}
// worker.js
onmessage = e => {
postMessage(
'Зробив шось, забирай'
);
});
Наразі існує декілька видів воркерів, кожен з яких має своє призначення.
Почнемо з Dedicated Worker. Він належить тільки тій сторінці, яка його створила і закінчує своє існування разом з нею. Це якраз класичний приклад додаткового процесу, який обмежений однією вкладкою. Але якщо нам треба воркер, який вміє спілкуватися з кількома вкладками?
Для цього існує SharedWorker. Він поводиться рівно так само, як і звичайний, але при цьому до нього можуть підключатися різні вкладки з нашим застосунком. І "живе" він теж до останнього підключення.
А коли нам потрібно, аби воркер жив та існував незалежно від того, чи відкрита хоч одна вкладка, ба більше, незалежно від того, чи запущено бравзер взагалі (ну, тут перебільшення, має бути запущено фоновий процес бравзера, але це вже глибокі деталі), ми можемо використати ServiceWorker.
Це свого роду наш кишеньковий сервер, який вміє працювати з фоновими завданнями, має доступ до великої кількості API, таких як Cache, Background Sync, Push та багатьох інших. Його основне завдання — виступати посередником між нашим застосунком, локальним кешем та мережею. Саме на ньому базується можливість створення offline-first застосунків.
Якщо підсумувати, то кожен воркер має свою сферу відповідальности: уявіть, що Worker — це комірник одного магазину, SharedWorker обслуговує кілька відділень, а ServiceWorker вже виступає як регіональний менеджер, і займається вже не нагальними справами, а, радше, забезпечує функціонування торговельної мережі навіть у позаробочі години.
Воркери вирішують проблему однопоточности JavaScript, хай і в дещо неочевидний спосіб. Вони дозволяють перебрати з основного потоку усі важкі та ресурсозатратні обрахунки, залишаючи йому лише займатися оновленням UI.
Що почитати:
📖 MDN: Web Workers API
📖 MDN: SharedWorker
📖 MDN: Service Worker
Що почитати душнілам:
📖 WHATWG: Web Workers Standard
📖 W3C / WHATWG: Service Workers
Підписуйтесь: @babichdev
❤75🔥23👍5
Товариство, сьогодні хочу нарешті відзвітувати за минулі збори. Нагадаю, що ми разом з вами придбали РЕБ для 109 окремого гірсько-штурмового батальйону, а згодом — комплект навчальних гранат для Житомирського військового інституту.
Прикладаю відеоподяку від бійців та світлини з тренувань.
І приєднуюсь до подяки. Саме завдяки вам я маю сенс в існуванні цього каналу, бо той факт, що я можу ще й допомагати разом з вами ЗСУ, надзвичайно мене мотивує.
Дякую вам!
P.S. Бійці дали дозвіл на публікацію відео з обличчями, якшо шо
Прикладаю відеоподяку від бійців та світлини з тренувань.
І приєднуюсь до подяки. Саме завдяки вам я маю сенс в існуванні цього каналу, бо той факт, що я можу ще й допомагати разом з вами ЗСУ, надзвичайно мене мотивує.
Дякую вам!
P.S. Бійці дали дозвіл на публікацію відео з обличчями, якшо шо
🔥36❤6
This media is not supported in your browser
VIEW IN TELEGRAM
І ще навздогін — також ми з вами збирали й придбали Mavic для 183 навчального центру!
Цей Mavic допомагає бійцям вчитися тікати від ворожих скидів, тож лише задумайтесь, скільки вберегли життя й здоровʼя ті, здавалось би, невеличкі 20 гривень вашого донату.
А на ділі — кожна, кожна гривня критично важлива.
Дякую вам, товариство!
Цей Mavic допомагає бійцям вчитися тікати від ворожих скидів, тож лише задумайтесь, скільки вберегли життя й здоровʼя ті, здавалось би, невеличкі 20 гривень вашого донату.
А на ділі — кожна, кожна гривня критично важлива.
Дякую вам, товариство!
🔥24❤6👍2
— …так, ну шо, цей тест нарешті пофіксив, тепер треба про всяк випадок інші запустить…
— …
— …
— СССССУКА!
(з польових нотаток)
— …
— …
— СССССУКА!
(з польових нотаток)
😁81❤10
#мислення_розробника
Тести, тести, тести… Вони стали частиною моєї практики доволі нещодавно. На початку моєї карʼєри про них і не знали, а далі зазвичай все зводилося до класичного "у нас немає часу і ресурсів".
А потім вони зненацька увійщли в моє життя, як то кажуть — "увірвалися з ноги". Ми мали підтримувати 95% покриття тестами на UI, що призводило до доволі очікуваного результату — покривалися рядки коду, а не логіка чи поведінка. Відповідно, і якість таких тестів була передбачуваною.
Моє ж ставлення до девелоперського тестування суттєво змінилося після переходу до DataRobot. Тут теж вимагається додавати тести до функціоналу, але з однією суттєвою відмінністю — вони мають бути доцільні.
Питання юніт та інтеграційних тестів на фронтенді доволі неоднозначне. Що тестувати? Як? Наскільки ретельно? Трактування може відрізнятися від команди до команди, від ліда до ліда. Але є дуже проста рамка, яка дозволяє мені лишатися в межах здорового ґлузду.
Почнемо з юнітів. Ними я покриваю саме логіку. Не поведінку. Для цього дуже зручно користуватися підходом "one hook to rule them all", бо в такому випадку я можу перевірити основні сценарії, не покладаючись на розмітку і
Але, якщо подумати, то це вже й не юніт, а, по суті, інтеграційний тест. Бо в такому випадку я перевіряю якраз правильність роботи різних функцій та розрахунків разом. А от справжні юніт-тести — це вже рівент окремих функцій та, вимушено, кастомних хуків, які виконують щось одне.
І покриваю я зазвичай далеко не усі кейси. Мені достатньо перевірити так званий happy-path, потім пусті дані і нарешті невалідні. Якісь супер екзотичні комбінації ми залишаємо на випадок, якщо воно дійсно потім десь вилізе багом, а до того приймаємо, що система може надати нам лише очікуваний набір параметрів.
Чому я не перевіряю екзотику? Бо якщо таке трапляється, то це, швидше за все, баг в іншому компоненті системи, і виправляти треба саме його. Тести моїх модулів перевіряють рамки, очікувані саме для них. Я не повинен передбачати якісь чудернацькі сценарії поза межами відповідальности мого функціоналу.
Тож таке просте правило — якщо на умовному проді в мою систему прийшли неочікувані дані, то першим припущенням буде, що некоректно працює саме модуль, який їх надає. Це дозволяє мені залишати власні тести сфокусованими і не перевіряти чужі помилки.
Щодо інтеграційних UI тестів. Тут дещо складніше скласти ту рамку, бо не завжди зрозуміла межа відповідальності. Ще менш зрозуміла межа між тим, де це ще інтеграційний тест кількох UI компонент, а де вже повноцінний end-to-end.
Якщо користуватися підходом з єдиним state-hook в компоненті, то мені не треба перевіряти UI-flow, аби дізнатися, чи змінює натискання кнопки видимість якогось елемента. Для цього є типу інтеграційний тест для цього хука, де я змінюю один набір даних і перевіряю, чи змінився стан потрібним мені чином.
І переконатися, що UI реагує правильно, дуже просто. Якщо тест, в якому ми перевірили зміну стану, працює правильно, то для перевірки UI нам достаньо просто замокати різні зліпки цього стану і дивитися, чи вірно відбувається рендер HTML. Це позбавляє мене необхідності емулювати e2e-тести.
Покриття усіх сценаріїв тут теж стає не обовʼязковим. Якщо у нас правильно протестовані попередні шари: функції, хуки, стейт, то нам достатньо перевірити кілька ключових комбінацій даних для відображення UI.
А ще у нас є золоте правило — додавати тест на баг-фікси. Це треба в тому випадку, якщо ми усе-таки не передбачили якийсь валідний інпут, і таки існує якась комбінація вхідних параметрів, яка може зламати логіку. Але якщо використовувати ось такий шаровий підхід до тестів, то це означатиме, що такий випадок доволі рідкісний і стосується саме edge-cases. А едж-кейси на те й едж, що їх важко передбачити.
Ну якось так. Пишіть тести, вчіть теорію тестування — ви собі потім подякуєте. А за нагоди поговоримо про тести та AI.
@babichdev
P.S. Росія — кончена країна кончених людей. Головне ж для нас — триматися купки. Обіймаю усіх.
Тести, тести, тести… Вони стали частиною моєї практики доволі нещодавно. На початку моєї карʼєри про них і не знали, а далі зазвичай все зводилося до класичного "у нас немає часу і ресурсів".
А потім вони зненацька увійщли в моє життя, як то кажуть — "увірвалися з ноги". Ми мали підтримувати 95% покриття тестами на UI, що призводило до доволі очікуваного результату — покривалися рядки коду, а не логіка чи поведінка. Відповідно, і якість таких тестів була передбачуваною.
Моє ж ставлення до девелоперського тестування суттєво змінилося після переходу до DataRobot. Тут теж вимагається додавати тести до функціоналу, але з однією суттєвою відмінністю — вони мають бути доцільні.
Питання юніт та інтеграційних тестів на фронтенді доволі неоднозначне. Що тестувати? Як? Наскільки ретельно? Трактування може відрізнятися від команди до команди, від ліда до ліда. Але є дуже проста рамка, яка дозволяє мені лишатися в межах здорового ґлузду.
Почнемо з юнітів. Ними я покриваю саме логіку. Не поведінку. Для цього дуже зручно користуватися підходом "one hook to rule them all", бо в такому випадку я можу перевірити основні сценарії, не покладаючись на розмітку і
.toBeInTheDocument, якщо мене цікавить, чи правильна комбінація даних на виході.Але, якщо подумати, то це вже й не юніт, а, по суті, інтеграційний тест. Бо в такому випадку я перевіряю якраз правильність роботи різних функцій та розрахунків разом. А от справжні юніт-тести — це вже рівент окремих функцій та, вимушено, кастомних хуків, які виконують щось одне.
І покриваю я зазвичай далеко не усі кейси. Мені достатньо перевірити так званий happy-path, потім пусті дані і нарешті невалідні. Якісь супер екзотичні комбінації ми залишаємо на випадок, якщо воно дійсно потім десь вилізе багом, а до того приймаємо, що система може надати нам лише очікуваний набір параметрів.
Чому я не перевіряю екзотику? Бо якщо таке трапляється, то це, швидше за все, баг в іншому компоненті системи, і виправляти треба саме його. Тести моїх модулів перевіряють рамки, очікувані саме для них. Я не повинен передбачати якісь чудернацькі сценарії поза межами відповідальности мого функціоналу.
Тож таке просте правило — якщо на умовному проді в мою систему прийшли неочікувані дані, то першим припущенням буде, що некоректно працює саме модуль, який їх надає. Це дозволяє мені залишати власні тести сфокусованими і не перевіряти чужі помилки.
Щодо інтеграційних UI тестів. Тут дещо складніше скласти ту рамку, бо не завжди зрозуміла межа відповідальності. Ще менш зрозуміла межа між тим, де це ще інтеграційний тест кількох UI компонент, а де вже повноцінний end-to-end.
Якщо користуватися підходом з єдиним state-hook в компоненті, то мені не треба перевіряти UI-flow, аби дізнатися, чи змінює натискання кнопки видимість якогось елемента. Для цього є типу інтеграційний тест для цього хука, де я змінюю один набір даних і перевіряю, чи змінився стан потрібним мені чином.
І переконатися, що UI реагує правильно, дуже просто. Якщо тест, в якому ми перевірили зміну стану, працює правильно, то для перевірки UI нам достаньо просто замокати різні зліпки цього стану і дивитися, чи вірно відбувається рендер HTML. Це позбавляє мене необхідності емулювати e2e-тести.
Покриття усіх сценаріїв тут теж стає не обовʼязковим. Якщо у нас правильно протестовані попередні шари: функції, хуки, стейт, то нам достатньо перевірити кілька ключових комбінацій даних для відображення UI.
А ще у нас є золоте правило — додавати тест на баг-фікси. Це треба в тому випадку, якщо ми усе-таки не передбачили якийсь валідний інпут, і таки існує якась комбінація вхідних параметрів, яка може зламати логіку. Але якщо використовувати ось такий шаровий підхід до тестів, то це означатиме, що такий випадок доволі рідкісний і стосується саме edge-cases. А едж-кейси на те й едж, що їх важко передбачити.
Ну якось так. Пишіть тести, вчіть теорію тестування — ви собі потім подякуєте. А за нагоди поговоримо про тести та AI.
@babichdev
P.S. Росія — кончена країна кончених людей. Головне ж для нас — триматися купки. Обіймаю усіх.
❤53🔥11👍6
#css_in_action
Коли я вперше побачив ефект розмиття тла на сторінці, коли відкриваєш якесь модальне вікно, моєму захвату й здивуванню не було меж. Здавалося, ми вступали до нової ери користувацьких інтерфейсів — футуристичних, майже фізичних, осяжних.
Але тоді я навіть не здогадувався, яких зусиль коштував це ефект розробникам. В кращому випадку — noscript-фільтр, у гіршому — скриншот тла через canvas та розмиття вручну. Мені здається, я маю дякувати богам веброзробки, що свого часу мене оминула доля додавати розмиття на сторінку.
Проте час не стоїть на місці і, як багато інших поширених проблем, цю задачу тепер можна виршіти одним рядком CSS. Багато хто з вас уже знайомий з властивістю
Якщо не поставили вподобайку — далі читати не дозволяю.
Ця властивість відразу спростила код навколо наших модальних вікон (а
А дарма. У
Ба більше, синтаксис дозволяє компонувати різні фільтри, тож можна отримувати дійсно неймовірні та неочікувані результати:
Варто памʼятати, що аби ефект запрацював, елемент, у якого є
А ще надзвичайно важливо мати на увазі те, що
Це не означає, що ваш ноутбук згорить, щойно ви відобразите анімацію з фільтром (радше клієнтський), але зважати на це теж варто. Не у всіх же МакБуки з М4.
MDN: backdrop-filter
Маленьке демо: https://jsfiddle.net/b0Lry2jm/3
***
@babichdev
Коли я вперше побачив ефект розмиття тла на сторінці, коли відкриваєш якесь модальне вікно, моєму захвату й здивуванню не було меж. Здавалося, ми вступали до нової ери користувацьких інтерфейсів — футуристичних, майже фізичних, осяжних.
Але тоді я навіть не здогадувався, яких зусиль коштував це ефект розробникам. В кращому випадку — noscript-фільтр, у гіршому — скриншот тла через canvas та розмиття вручну. Мені здається, я маю дякувати богам веброзробки, що свого часу мене оминула доля додавати розмиття на сторінку.
Проте час не стоїть на місці і, як багато інших поширених проблем, цю задачу тепер можна виршіти одним рядком CSS. Багато хто з вас уже знайомий з властивістю
backdrop-filter, головною відмінністю якої від просто filter є те, що розмиття вмісту відбувається не всередині елементу, а поза ним.Ця властивість відразу спростила код навколо наших модальних вікон (а
dialog спрощує ще більше, але про це — іншим разом). Однак, як часто трапляється, далі цього конкретного використання справа не заходить.А дарма. У
backdrop-filter є й інші можливості, наприклад, зміна яскравості чи контрасту, обернення кольорів, маніпуляції з насиченістю та навіть поворот відтінку на колірному колі.… {
backdrop-filter: blur(10px);
backdrop-filter: brightness(150%);
backdrop-filter: contrast(150%);
backdrop-filter: grayscale(150%);
backdrop-filter: invert(150%);
backdrop-filter: opacity(0.6);
backdrop-filter: saturate(200%);
backdrop-filter: sepia(150%);
backdrop-filter: hue-rotate(50deg);
}Ба більше, синтаксис дозволяє компонувати різні фільтри, тож можна отримувати дійсно неймовірні та неочікувані результати:
backdrop-filter:
contrast(150%)
grayscale(150%)
invert(150%);
Варто памʼятати, що аби ефект запрацював, елемент, у якого є
backdrop-filter, не повинен мати суцільного тла. Якщо важливо явно відділити його від елементів поза ним, і при цьому застосувати якийсь цікавий фільтр, дещиця прозорості фону не завадить. А найкраще ефект від фільтрів видно саме при повністю прозорому тлі.А ще надзвичайно важливо мати на увазі те, що
backdrop-filter обчислюється в реальному часі на GPU, і може потребувати значний обʼєм ресурсів. Зокрема, якщо фільтр накладено на велику площу (так, той самий бекдроп під модалкою). Ситуація може поігршитись, якщо на тлі відбувається анімація, тоді бравзер змушений постійно оновлювати зображення позаду елемента, щоб відповідати цій анімації. Ну й трошки навантаження може додати тінь на цьому ж елементі — чим вона більша, тим більше ресурсів жує бравзер.Це не означає, що ваш ноутбук згорить, щойно ви відобразите анімацію з фільтром (радше клієнтський), але зважати на це теж варто. Не у всіх же МакБуки з М4.
MDN: backdrop-filter
Маленьке демо: https://jsfiddle.net/b0Lry2jm/3
***
@babichdev
❤113👍44🔥1
#коштозбір
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це 49 400 гривень, будем брати по мірі накопичення коштів.
Буду вдячним за кожну гривню, товариство!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це 49 400 гривень, будем брати по мірі накопичення коштів.
Буду вдячним за кожну гривню, товариство!
🔗Посилання на банку
https://send.monobank.ua/jar/AeXQ6YRf2X
💳Номер картки банки
5375411202918178
❤14
#нове_відео
Товариство, вирішив оживити один зі старих дописів про aspect-ratio, і створив коротеньке відео. Запрошую до перегляду!
https://youtu.be/TxqfBsvJlC8
Там 4 хвилини всього, подивіться зараз, не відкладайте)
***
На детектори дронів зібрано 2 236 грн з 49 400 грн. Долучайтесь!
Товариство, вирішив оживити один зі старих дописів про aspect-ratio, і створив коротеньке відео. Запрошую до перегляду!
https://youtu.be/TxqfBsvJlC8
Там 4 хвилини всього, подивіться зараз, не відкладайте)
***
На детектори дронів зібрано 2 236 грн з 49 400 грн. Долучайтесь!
❤26🔥19👍1
Якщо monobank після сьогоднішнього дня не зробить доповідь на Highload Fwdays, то я навіть не знаю, нашо це все було.
До речі, один з лимонів можна знайти, відкривши чиюсь банку. Можна і цю. Бо збір на детектори дронів для 115-ї бригади шось засмутивсь і стоїть.
https://send.monobank.ua/jar/AeXQ6YRf2X
До речі, один з лимонів можна знайти, відкривши чиюсь банку. Можна і цю. Бо збір на детектори дронів для 115-ї бригади шось засмутивсь і стоїть.
https://send.monobank.ua/jar/AeXQ6YRf2X
Telegram
Дивовижний світ веброзробки
#коштозбір
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це…
Товариство, маємо новий запит від військових.
Для роти матеріально-технічного забезпечення 115 бригади потрібно два детектори дронів "Чуйка".
Детектори треба для бензовозів, які заправляють тяжку техніку на Покровському напрямку.
Наразі це…
❤35😁16