В каких ситуациях есть смысл:
- Улучшить свои знания. Допустим самому попробовать реализовать какие-то алгоритмы, чтобы лучше понимать как работает поиск, сортировка, обход древовидных структур и так далее;
- Специфичные требования. Например вам нужна высокая производительность, ваш основной стек на Back-end - это Node.js. Так вышло, что вам не хватает производительности и поэтому вы берёте и переписываете нужный NPM пакет на на c++;
- Раз коснулись темы NPM, то другой пример. В NPM миллионы пакетов на любой случай жизни и так бывает, что нецелесообразно тянуть зависимость ради пару десятков строчек кода.
Когда НЕ стоит изобретать велосипед:
- Проверенные алгоритмы. Например не стоит в продакшене самому писать библиотеки для работы с шифрованием, если конечно у вас не стоит такая задача. Самописная криптография грозит тем, что вы можете допустить ошибку в шифровании и получить уязвимость, а аудит вашего кода скорее всего не будут проводить десятки экспертов.
- Придумывать новые фреймворки. Тут просто без должного опыта ничего хорошего не получится.
- Ограниченные ресурсы и время. Программисты чаще всего работают на кого-то и им выделяются конкретные ресурсы и время на проект. Создание/проектирование новых библиотек, фреймворков и компонентов занимает достаточное большое количество времени. И таким образом вы просто не выполните поставленные задачи, если будете придумывать велосипеды.
В своих проектах можно придумывать всё самостоятельно, но я бы для начала посоветовал научиться работать с готовыми библиотеками, чтобы преждевременно не перегрузить себя работой, которую выполнить хорошо на начальном этапе будет очень сложно.