• Как тестировать оптимизацию frontend?

    bingo347
    @bingo347
    Crazy on performance...
    796stwepspdbny_xqrwrrtvoor4.png
    Ответ написан
    Комментировать
  • Какой из двух типов обучения лучше?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Какой формат более эффективен с точки зрения обучения и образования? Что говорит ваш опыт по этому поводу?

    Никакой, так как программирование 1 час = это вообще ничто, бывает в сложном проекте 1 час просто дебажишь ошибку, из-за большого количества плохого кода, а у новичков процесс обучение + дебаг своего же = умножить на n.

    С английским так же - что бы выучить английский нужно,
    а) жить в стране носителя языка, что бы 24\7 общаться и ассимилироваться в нем, либо
    б)включить во все аспекты жизни английский язык - хобби, работу, просмотр\прослушивание музыки, фильма, книги и тд.

    Хотите стать мастером какого либо дела - 8-12 часов в день, и через какое-то время после тяжелого отрезка непонимания и отрицания = плоды будут, но вот только сколько лет вам понадобится на это, 1 год или 5, зависит от наследуемых свойств или задатков + вашего личного старания.
    Ответ написан
    Комментировать
  • Какая выгода компаниям "растить" джуниоров внутри себя?

    Maksclub
    @Maksclub Куратор тега Карьера в IT
    maksfedorov.ru
    Там, куда мидлы не пойдут:
    - говно-проекты
    - всякие битриксы
    - дикое легаси
    - низкие зп
    - там где на самом деле не очень сложные технологии и уровень джунов с парой месяцев вникания вполне годится, то есть компании могут утилизировать именно такой уровень
    - рыщут среди "джунов" тех, которые мидлы, просто этого не знают

    Не везде факторы работают осознанно (то есть это не заговор и не злодеи), а просто примерно в компании понимают, что эти джуны — то, что им почему-то и нужно или даже единственное доступное
    Ответ написан
    2 комментария
  • Какая выгода компаниям "растить" джуниоров внутри себя?

    opium
    @opium
    Просто люблю качественно работать
    На фоне недостатка кадров намного лучше когда у тебя есть работники чем когда их нет, это единственная причина
    Ответ написан
    Комментировать
  • Как в PUG/JADE указать несколько атрибутов для тега?

    @Lord_Dantes
    В скобочках как и обычные теги. link(tag="value" tag2="value")
    Ответ написан
    Комментировать
  • Какой вариант подключения шрифтов оптимален?

    @Steppp
    Качаешь шрифты откуда угодно,
    Конвертируешь в woff woff2
    Кидаешь в проекте в папку fonts
    И подключаешь их из папки

    Это самый оптимальный вариант!
    Ответ написан
    2 комментария
  • IT компании + судимость?

    opium
    @opium
    Просто люблю качественно работать
    да всем насрать , вы же не маньяк убийца.
    Ответ написан
    9 комментариев
  • IT компании + судимость?

    nykakdelishki
    @nykakdelishki
    Системный аналитик
    1. Потратьте этот год с условной судимостью, на изучение языков программирования.

    2. Когда погасите судимость устройтесь на работу(Примут там где нет СБ). Средним классом вы станете однозначно.

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

    Так что смелее
    Ответ написан
    Комментировать
  • Какие задания прокачивать для фриланса для веба?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Забавно, но опишу свой опыт.
    Никому не нужны ваши технологии А, Б, В

    Клиенту нужен продукт, с определенными условиями.

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

    alex4answ
    @alex4answ
    Почитайте основы react
    1. установить значение по-умолчанию: defaultValue="your value"
    2. в react односторонний биндинг, когда вы устанавливайте value у input ожидается что он будет обновляться в state, а затем уже у input
    Ответ написан
    Комментировать
  • Бизнес аналитик/Системный аналитик насколько перспективно?

    xez
    @xez
    TL Junior Roo
    Вполне перспективно.
    По з.п. - зависит от региона и ваших навыков. За выслугу лет, как правило, ничего вам не дадут.
    Можно дорасти до старшего аналитика - дальше уже менеджмент.
    можно ли устроиться на удаленный формат работы в Москву

    Можно.
    Ответ написан
    2 комментария
  • Устарел ли getElementsBy* и чем лучше querrySelector?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вот народ ушел в спор о производительности, но никто даже не попытался разобраться, а что под капотом... Производительность ведь искусственными бенчмарками меряют, ага...
    Что ж, времена сейчас такие
    многие на работу кодеров берут, которые даже интереса не имеют в глубь копать. Инженеров брать... - это устаревший подход, как выразился автор "популярного сайта", который прочел автор вопроса. Инженеры они дорогие, и найти их сложно, лучше кодер, пусть и не желающий на работе мозг включать, не говоря уж о желании в устройстве инструментов разбираться.

    Говорить о том, что некие фичи устарели - крайне глупо, если знать, что они ведут себя иначе, чем более модные альтернативы. Предлагаю немного разобраться и начать с того что на поверхности:
    - getElementById и querySelector возвращают конкретную ноду в единственном экземпляре
    - querySelectorAll и getElementsByName возвращает статичную коллекцию NodeList
    - getElementsByClassName, getElementsByTagName и getElementsByTagNameNS возвращают динамическую коллекцию HTMLCollection
    Как видим результат у разного апи различен, а значит и говорить, что некоторые из них устарели - глупо.
    Правда тут есть забавный момент
    в спеке HTMLCollection отмечен как "исторический артефакт", который не стоит использовать при проектировании нового апи. Но заметка эта не для веб-разработчиков, а для тех кто проектирует новое DOM апи.

    С устареванием вроде разобрались, но в вопросе еще есть часть "чем лучше". И тут есть теория, что getElementsBy* быстрее querySelector*. Чисто теоретически звучит логично, querySelector* должен делать полный поиск по дереву со сложностью O(n), а getElementsBy* могут использовать индексы на базе HashMap и получать данные со сложностью O(1), тут и особенности HTMLCollection будут кстати, так как можно не копировать коллекцию, а отдавать одну и ту же (и браузеры действительно так делают). Но без пруфов теория так и останется теорией.
    И бенчмарки - так себе пруф
    Хотя направлять инвесторов в нужную сторону - самое то. Проблема бенчмарков, что можно написать их так, что любая из сравниваемых сторон заметно обгонит другую. Дело техники. Например BubbleSort с O(n2) при определенных условиях в чистую уделывает MergeSort и QuickSort с их O(n×log2n), а именно при n=20 или меньше, 400 простых memswap в наглую рвут 87 рекурсивных операций с memcpy внутри
    Гораздо лучше тут выглядят исходники. И я выбрал исходники chromium, как самого распространенного:
    - getElementsBy* методы все как один обращаются к некой шаблонной функции EnsureCachedCollection, которая в свою очередь обращается к некоему NodeLists кэшу, устроенному внутри действительно как HashMap или что-то наподобие. Никакого поиска тут нет, просто берутся готовые значения, сложность у всего этого действительно константная O(1).
    - querySelector* используют абстракцию SelectorQuery, которая и в самом деле делает поиск по DOM. Но данный поиск неплохо оптимизирован и обвешан кэшами. Притом CSSOM использует абсолютно тот же алгоритм поиска DOM нод для каждого селектора в css.
    Для примера
    в подключенных на странице этого вопроса стилях более 1600 правил (некоторые из которых потенциально могут содержать несколько селекторов), полная обработка стилей из этого файла заняла на моей машине (Ryzen 3600 в стоке) чуть больше 9 мс. Если все это немного округлить, то понадобится 15000 querySelectorAll подряд, притом с разными селекторами, чтоб был промах кэша, дабы я ощутил заметную глазу задержку в ~100мс


    На этом спор думаю можно закрыть. querySelector* методы действительно могут быть медленнее, но чтоб убить ими производительность, нужно очень постараться. На фоне того, что пишут кривые ручки среднестатистического дешевого js-кодера это будет незначительной потерей измеряемой в наносекундах. Используйте то что удобнее в каждой конкретной ситуации.
    Ответ написан
    1 комментарий
  • Какое состояние у современного фриланса на конец 2020?

    @d-sem
    для начала карьеры лучше найти стабильный офис, постараться выбиться на удаленку
    Ответ написан
    Комментировать
  • Какое состояние у современного фриланса на конец 2020?

    opium
    @opium
    Просто люблю качественно работать
    Все так же
    Говнокодеры в жопе, профи в шоколаде
    Ответ написан
    4 комментария
  • Могу ли я в чистом javascript в асинхронной функции подождать возникновения события?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Первое что нужно понимать, что async/await - это всего лишь синтаксический сахар над промисами, а значит имеет все особенности работы с ними:
    Во-первых, промис может разрешится (или отклонится, но в этой задаче reject не нужен) только единожды. Это сильно отличает их от событий, которые могут происходить многократно.
    Во-вторых, промисы обрабатываются на особой фазе event loop называемой microtasks, что опять же отличается от событий, которые выполняются на другой фазе (tasks). Это означает, что обработка промиса (колбэк метода then, или сахар над ним в виде await оператора) всегда произойдет асинхронно от возникновения события. Это накладывает ряд ограничений, например не получится сделать preventDefault у объекта или не получится запустить действия требующие синхронной работы из trusted события (play не muted video/audio, вход в фулскрин и тд).

    В простом варианте можно слушать событие разово, для чего можно использовать параметр once. Так же для оптимизации можно использовать параметр passive, так как нам все равно поздно вызывать preventDefault, а в некоторых случаях это может дать нам оптимизацию. Ну и управлять параметром capture попросту бесполезно, так как обработка будет в любом случае после обеих фаз. В итоге для этого можно пользоваться такой функцией хелпером:
    function listenOnce(target, event) {
        return new Promise(resolve => {
            target.addEventListener(event, resolve, {
                once: true,
                passive: true
            });
        });
    }
    
    // использование
    const event = await listenOnce(document, 'DOMContentLoaded');
    console.log(event);


    Если же нужно слушать событие многократно, то разумно обернуть прослушивание события в асинхронный итератор. Здесь так же присутствуют все ограничения связанные с промисами, но за счет того, что у нас будет итератор по множеству промисов, мы сможем слушать событие многократно. так же тут нужно предусмотреть возможность отписаться от события. Хелпер для данного случая получится такой:
    function listen(target, event) {
        let currentResolve = () => {};
        const handler = event => currentResolve({value: event, done: false});
        return {
            [Symbol.asyncIterator]() {
                target.addEventListener(event, handler, {passive: true});
                return {next: () => new Promise(resolve => {
                    currentResolve = resolve;
                })};
            },
            stop() {
                target.removeEventListener(event, handler);
                currentResolve({done: true});
            }
        };
    }
    
    // использование
    for await(const event = listenOnce(window, 'scroll')) {
        console.log(event);
    }
    
    // с отпиской
    const eventIterator = listenOnce(window, 'scroll');
    let count = 10;
    for await(const event = eventIterator) {
        console.log(event);
        if(--i === 0) {
            eventIterator.stop();
        }
    }
    Ответ написан
    4 комментария
  • Как правильно оценить свой скилл в web программировании?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Устроиться на работу.
    Ответ написан
    Комментировать