39% — это количество уникальных функций в папке node_modules в дефолтном Angular проекте, созданном командой ng new my-app. Мне было интересно посмотреть, сколько похожих функций существует в node_modules. Ведь наверняка же разработчики открытых библиотек решают проблемы одинаковыми способами, так же изучают одни и те же алгоритмы, ну и, чего кривить душой, копируют одни и те же решения со StackOverflow.   Если вы захотите сравнить пару функци в javascript, то сделать это проще простого, после пребразования их в строковый вид: Нужно привести их к одному виду при помощи библиотеки Uglifyjs, которая минимизирует функцию, удалит лишнее, сделает простейщие вычисления. Для этого я воспользовался библиотекой Esprima. То есть парсим файл и обходим AST дерево. Думаю что можно было бы обойтись только Uglifyjs, но что-то у меня сходу не завелось, а разбираться было лень. Код javascript файла, и которого будем извлекать функции: Обратите внимание, что некоторые выражения в извлеченных функциях вычислены, что поможет сравнению функций. Список извлеченных функций: Полный скрипт можно найти тут Итак, создаём проект при помощи @angular/cli: ng new my-app, запускаем скрипт на парсинг node_modules и оставляем его на ночь. Полный package-lock.json тут В папке node_modules 26982 *.js файлов: А в них найдено 338230 функций: Из которых 130886 уникальных: То есть 130886/338230 * 100% =39% функций действительно уникальны, а остальные — это дубликаты уже существующих. Скачать csv файл для самостоятельной проверки можно тут. То есть функции с самым большим количеством дубликатов. 285d00ca29fcc46aa113c7aefc63827d, 2730 идентичных cf6a0564f1128496d1e4706f302787d6, 1871 идентичных, названия функций одинаковые: __export 12f746f2689073d5c949998e0216f68a, 1174 идентичных, названия функций: _interopRequireDefault и __importDefault 7d1e7aad635be0f7382696c4f846beae, 772 идентичных, у всех у них было примерно 300 уникальных названий  c2da306af9b041ba213e3b189699d45c, 699 идентичных c41eb44114860f3aa1e9fa79c779e02f, 697 идентичных, имя __ 5911b29c89fa44f28ce030aa5e433327, 691 идентичная 05c2b9b254be7e4b8460274c1353b5ad, 653 идентичных fcaede1b9e574664c893e75ee7dc1d8b, 652 идентичных e743dd760a03449be792c00e65154a48, 635 идентичных 777c390d3cc4663f8ebe4933e5c33e9d, 441 идентичная, имена функций различные, чаще всего: Rule, AsapScheduler, ComplexOuterSubscriber и другие 27628ad740cff22386b0ff029e844e85, 385 идентичных, имена функций чаще разные, чаще всего identity, forwardResolution и тд f6822db5c8812f4b09ab142afe908cda, 375 идентичных d98a03a472615305b012eceb3e9947d5, 330 идентичных 4728096fca2b3575800dafbdebf4276a, 324 идентичных 7b769d3e4ba438fc53b42ad8bece86ba, 289 идентичных, все имена plural 7d6f69751712ef9fa94238b38120adc6, 255 идентичных b7081aad7510b0993fcb57bfb95c5c2c, 250 идентичных d665499155e104f749bf3a67caed576a, 250 идентичных 99fa7dfce87269a564fc848a7f7515b9, 255 идентичных На самом деле, ничего интересного. Сборшики работают эффективно. Из 1282 используемых функций, 95% уникальны. Привожу пятерку функций, которые имеют дубликаты: Я так же проверил и React. Сравнение я вынес в таблицу ниже: Скачать csv файл для самостоятельной проверки можно тут. Я использовал create-react-app. Файлы package.json и yarn.lock можно найти тут. 12f746f2689073d5c949998e0216f68a, 1377 идентичных, названия функций обычно: _interopRequireDefault 285d00ca29fcc46aa113c7aefc63827d, 1243 идентичных 3f993321f73e83f277c20c178e5587b9, 989 идентичных 54782ec6cef850906484808b86946b33, 299 идентичных 7d1e7aad635be0f7382696c4f846beae, 278 идентичных, имена функций чаще всего emptyFunction, Generator d11004e998280b565ad084b0ad5ca214, 239 идентичных a02c66d8928b3353552e4804c6714326, 237 идентичных, имя функции _getRequireWildcardCache 79e9bd3cdf15cf0af97f73ccaed50fa0, 231 идентичных, имя функции _interopRequireWildcard 7d6f69751712ef9fa94238b38120adc6, 189 идентичных b8dd34af96b042c23a4be7f82c881fe4, 176 идентичных 863a48e36413feba8bb299623dbc9b20, 174 идентичных 2482d2afd404031c67adb9cbc012768b, 174 идентичных 4728096fca2b3575800dafbdebf4276a, 170 идентичных bf8b05684375b26205e50fa27317057e, 157 идентичных fd114ee6b71ee06738b5b547b00e8102, 156 идентичных df1c43e5a72e92d11bdefcead13a5e14, 156 идентичных 094afc30995ff28993ec5326e8b3c4d4, 156 идентичных 042490db7093660e74a762447f64f950, 156 идентичных 5c5979ec3533f13b22153de05ffc64d5, 154 идентичных 50645492c50621c0847c4ebd1fdd65cd, 154 идентичных Список длинный Возможно это небольшое исследование кого-нибудь натолкнет на мысли какие-нибудь мысли о рефакторинге. Или изменении подхода к программированию. Хорошо, что люди используют для программирования некоторые общие подходы и паттерны. Плохо что очень много копипасты. Разработчик