• С чего начать в 30 лет?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Фундаментальная проблема - в игрострой стоит очередь фанатов с горящими глазами. Людей, которые пишут игры, играют в игры, моддят игры, хакают игры..., начиная с возраста, когда они смогли дотянуться до клавиатуры (как ваш покорный слуга). При этом, у них столько мотивации, что они могут сами поставить себе задачу, сами нагуглить все, что нужно (Спасибо дяде Немнюгину за его учебник. Это все что нужно знать о DOS, чтобы закодить dOOm) и сами все напишут и нарисуют (работая над этим сутками. Не потому что над душей стоит босс с воплями о лишении премии, а потому что им это интересно).

    И вот теперь, Андрей, который уже устал хочет встать в очередь высоко мотивированных конкурентов и попросить себе оффер. Каковы его шансы на успех?

    В играх есть много специализаций программирования - хотите графику, придется учить одно (причем на 2d и 3d это одно будет разное), хотите игровую логику и скриптинг - это номер два, хотите системную часть и бэкенд - это будет третье.

    Для универсального развития, нужно начинать с простых фиговин вроде тетриса, арканоида, бильярда и прочего (в которых однако есть все столпы игростроя - графика + логика + системный движок, можно и добавить сеть, если подумать) и потом наращивать сложность - делать платформер или RTS.
    Ответ написан
    4 комментария
  • Когда применять arr.reduce?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Когда сочтёте нужным. Типа, подумали, и решили - здесь reduce нужен. Или не нужен. Да, подумали. Для этого у вас есть особый инструмент - голова называется.
    Ответ написан
    Комментировать
  • Почему в интерфейс не записывается тип boolean?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    В TypeScript есть литеральные типы ('some string', 1, 2, 3, true, false).
    Значение константы поменять нельзя, поэтому TypeScript выводит для них литеральный тип.
    Поэтому тип q будет не boolean, а true.
    Ответ написан
    4 комментария
  • Ревью на резюме?

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

    так писать резюме не рекомендуют
    лучше написать что то типа "работал над таким то проектом, сделал то то и то то, стек такой то"
    вот вы написали что разрабатывали клиентские приложения. Что это вообще значит? Мало ли что вы под этим подразумеваете. Нужно конкретно писать что делали. И не в о себе, а в опыте

    еще удобнее было бы ссылку на резюме дать, а не скрин. Так менее удобно смотреть, пришлось вручную гит вбивать
    это мелочи, но в гите лучше в ридме написать описание проекта и как стартануть. https://github.com/ArturMavlidov/currencies вот тут например я что то не понял, что в ридме делает инструкция как начать разработку на реакте. Если у вас последний проект посвящен установке фреймворка, это показывает вас ну очень джуновско и неопытным.

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

    Но вот зато через пару лет, все те кто меня игнорили уже сами мне в личку в телеге пишут)
    Ответ написан
    Комментировать
  • Задача на циклы в JavaScript?

    GavriKos
    @GavriKos
    Улучшать такой примитивный код да еще в отрыве от задачи - бесполезное занятие. Тем более на таком начальном уровне знаний.
    Поняли как работают циклы? Сможете применить на практике? Все, следующая задача.

    А то можно щас начать про потребление памяти при сложении строк, про var/let... Суть то задания не в этом
    Ответ написан
    3 комментария
  • Нужен ли babel, если используешь TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Typescript compiler - это инструмент проверки типов и компиляции typescript в javascript. Так же он умеет транспайлить конструкции новых стандартов js в более старые стандарты, но это не основная задача этого инструмента, и делает он это хуже целевых инструментов, в частности его можно настроить только на конкретный стандарт.

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

    В экосистеме babel есть preset-env нацеленный именно на транспиляцию более новых стандартов в более старые. Его особенностью является поддержка browserlist и подключения только тех плагинов, которые нужны для указанных браузеров. За счет этого получается более оптимальный js на выходе, так как многие фичи после транспайлинга работают медленнее чем нативные и занимают больше кода.

    Еще в экосистеме babel есть preset-typescript, который включает поддержку ts синтаксиса и транспиляцию ts в js. При этом, в отличии от tsc, он не делает проверку типов, а некоторые сущности может обрабатывать неправильно (как и большинство сторонних компиляторов ts, т.к. у ts нет строгой спеки и единственным источником правды является код tsc, который далек от идеального).

    Оптимальным по выходному результату (пусть и за счет времени сборки) будет вариант, когда сначала ts код обрабатывается через tsc без транспиляции в старые стандарты, а затем происходит транспиляция с помощью babel + preset-env + browserlist.
    Ответ написан
    3 комментария
  • Как переписать небольшой скрипт на чистый js?

    @n1ksON
    мидл
    Ответ написан
    Комментировать
  • Как указать типы данных в импортируемом json файле?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    https://www.typescriptlang.org/tsconfig#resolveJso...

    Ну или создайте рядом с db.json файл db.json.d.ts со следующим содержимым:
    declare const JSON: {
        id: number;
    }[];
    export default JSON;
    Ответ написан
    Комментировать
  • Говорят в России недостаток IT специалистов составил 1 млн, так ли это?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Да, не хватает миллиона программистов - профессионалов от мидлового уровня с опытом работы в коммерческих проектах не менее трёх лет. А начинающих, которые только хотят стать программистами, переизбыток.
    Ответ написан
    9 комментариев
  • Как определить, является ли число степенью двойки на javascript с помощью цикла while?

    Alexandroppolus
    @Alexandroppolus
    кодир
    для чисел до 2^31 можно и без цикла

    const isPower2 = n => (n & (n-1)) === 0

    вариант для длинной арифметики
    const isPower2b = n => (n & (n - 1n)) === 0n;
    
    alert(isPower2b(147573952589676412928n));
    Ответ написан
    Комментировать
  • Как правильно передавать пропсы в React-компонент используя TypeScript?

    KataevAS
    @KataevAS
    Предпочтительнее первый вариант.
    Почему: https://github.com/facebook/create-react-app/pull/8177
    Ответ написан
    Комментировать
  • Как понять что ты развиваешься и как найти знакомых?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Самый верный способ - устроиться на работу.
    Ответ написан
    5 комментариев
  • Как в JavaScript контролировать удаление объекта garbage collector-ом?

    Никак.
    Все что может быть собрано, будет собрано. Если у вас утечки, нужно искать источник.
    Ответ написан
    2 комментария
  • Что означает данное ниже определение в Typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Тип Record - это утилити тип из стандартной библиотеки TS, который описывает объект, у которого ключи - первый аргумент дженерика, а значения - второй.
    Тип string[] | Record<string, any>[] - это или массив строк или массив объектов (ключ - любая строка, значение любого типа). Данный тип не позволит смешивать строки и объекты в одном массиве, либо то либо другое.
    Как верно подметил WbICHA в комментарии к вопросу, для приведенных данных корректный тип - это (string | Record<string, any>)[] (массив из строк или объектов в перемешку).

    Ну и вместо any лучше использовать unknown, any - это тип без проверки типов, unknown - это тип который включает в себя все другие типы, в него как и в any тоже можно записать значение любого типа, но в отличии от any при использовании unknown нужно делать либо явное приведение типов, либо рантайм проверки типов.
    Ответ написан
    5 комментариев
  • Почему за просмотр резюме HR необходимо платить деньги, а на биржах фриланса наоборот?

    @spaceatmoon
    На бирже покупателем является исполнитель, а на сайтах по поиску работы является работодатель.

    Биржа не занимается поиском исполнителей. Это такие услуги по рекламе на максималках с кабальными условиями. Кто будет исполнителем вообще не важно, его личность должна быть скрыта, ведь только хозяин должен видеть его паспорт. Исполнители хозяина должны слушаться и говорить с гостем Биржи должны так, как говорит хозяин и держать голову ниц. За лишние слова хозяин наказывает, вплоть до выгона на мороз без права вернуться. При выполнении поручения от гостя исполнитель обязуется платить дань на доход. В некоторых биржах есть ещё оброк раз в месяц. Каждый хозяин ведёт учёт лучших исполнителей. Прикол в том, что эти звёздочки ничего не дают при выходе из этой биржи. Совершив Юрьев день, исполнителю придётся начинать всё сначала, ибо звать вас никак. Ведь внутри любой биржи, личности вашей нет.

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

    Свободные люди не зависят от работодателей и соответственно их внимание привлечь сложнее. Чтобы привлечь внимание такого человека, необходимо немного поделиться золотом. У кого больше золота, тот имеет больший выбор и может выбрать себе подходящего кандидата.
    Ответ написан
    1 комментарий
  • Как заменяються значения переменных с помощью деструктуризации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Абсолютно по тому же, что и в первый раз.
    Ответ написан
    Комментировать
  • Как отсортировать массив, имеющий текст с числами в JS?

    @GrayHorse
    const {compare} = new Intl.Collator(undefined, {
        numeric: true
    });
    const array = ["x32-Sar", "x2-Far", "x1-Tar", "x11-Har"];
    array.sort(compare); // ["x1-Tar", "x2-Far", "x11-Har", "x32-Sar"]
    Ответ написан
    Комментировать
  • Как правильно обрезать строку?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно регулярным выражением вытащить последнее число прямо перед закрывающей скобкой, которое непременно со знаком минус:
    const str = 'matrix(1, 0, 0, 1, 0, -47)'
    
    +str.match(/(-\d+)\)/).pop()  // -47
    Плюс перед выражением это унарный оператор, который переводит аргумент в тип число.
    Ответ написан
    5 комментариев
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Задача проверки последовательности на палиндром решается за O(n/2). Но для этого нужно иметь последовательный доступ к обоим концам последовательности за O(1).
    Если такой возможности нет и имеется доступ только к одному из концов последовательности, то придется обойти всю последовательность, а это уже O(n). Один из таких, достаточно оптимальных алгоритмов для цифр целого числа уже представил WbICHA.

    Чтоб решить эту задачу за O(n/2) нужно понять, как получить крайние цифры числа за O(1).
    Крайнюю справа цифру можно получить простым остатком от деления на основание системы счисления, то есть, в случае десятичной системы счисления, на 10.
    Для получения крайней справа цифры нужно знать ее порядок (считая справа начиная с 0). Это можно сделать взяв целую часть от логарифма по основанию системы счисления (10). На JS такая операция будет выглядеть так:
    Math.trunc(Math.log10(num))
    Целая часть от деления числа на 10 в степени порядка правой цифры даст саму эту цифру. На JS это выражается так:
    Math.trunc(num / 10 ** Math.trunc(Math.log10(num)))

    Так же алгоритм требует равномерного перемещения по последовательности от краев к центру.
    Для правой цифры опять все просто, можно брать целую часть от деления числа на основание (10).
    Для левой нужно умножить ее на основание в степени порядка и вычесть результат из самого числа, то есть:
    num - leftDigit * 10 ** Math.trunc(Math.log10(num))


    Осталось учесть пограничные условия:
    1. Если крайний левый и крайний правый элемент не равны, то последовательность не является палиндромом
    2. Последовательность из одного элемента (число из одной цифры) всегда палиндром.
    3. При равенстве крайних элементов последовательность будет палиндромом если палиндромом так же является подпоследовательность без этих элементов.

    Пункт 3 подразумевает рекурсию, но такая рекурсия легко разворачивается в цикл, что конечно же более оптимально.

    По итогу получим такую функцию:
    const isPalindrome = num => {
        let n = num;
        while (n >= 10) {
            const order = 10 ** Math.trunc(Math.log10(n));
            const leftDigit = Math.trunc(n / order);
            const rightDigit = n % 10;
            if (leftDigit !== rightDigit) return false;
            n -= leftDigit * order;
            n /= 10;
            n = Math.trunc(n);
        }
        return true;
    };


    P.S. варианты с приведением числа к строке, а тем более с последующим разбиением на массив чисел и разворотом его, просто отвратительны.
    Приведение числа к строке - это O(n) если не больше, так как в JS тип number - это по сути float64 и алгоритм приведения учитывает, что число может быть с дробной частью.
    Разбиение строки на массив символов (split) - O(n) и требует доп памяти под этот массив.
    Реверс массива - O(n/2)
    Склейка (join) - опять O(n)
    Сравнение строк - еще раз O(n)
    И хотя суммарная сложность останется O(n), количество проходов по цифрам числа будет в 5 раз больше, хотя даже на строках можно уложится в 1.5 обхода:
    const isPalindrome = num => {
        const s = String(num);
        for (let i = 0; i < s.length / 2; i++) {
            if (s[i] !== s[s.length - i - 1]) return false;
        }
        return true;
    };
    Ответ написан
    4 комментария
  • Что хранит в себе данная функция?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Комментировать