Вот смотрите. Windows Server — это комбайн размером в десятки гигов. В его стандартную поставку включено обширное множество компонентов, которые разработчик приложения может использовать. В том числе те, которые особо не нужны на сервере, например, GUI. Linux же не имеет чётко обозначенного набора обязательных компонентов (библиотек, служб, консольных утилит), не считая POSIX, который достаточно минималистичен.
В результате разработчик приложения для Linux, если он пишет не для себя, должен чётко обозначить зависимости своего приложения, чтобы это приложение могли запустить на других системах. В Windows же достаточно сказать: «Приложение работает под Windows Server 2012» и максимум что нужно — это накатить обновления. С одной стороны это удобно. Но с другой стороны не знаешь, какие именно компоненты API задействовал разработчик, особенно если приложение проприетарное. И разработчика ничто не ограничивает в этом.
Как мне кажется, это всё в своё время сыграло на руку Linux, когда на серверах стало стильно, модно, молодёжно использовать виртуализацию и контейнеризацию и для каждой задачи заводить виртуалку или контейнер. Там уже в каждый контейнер неудобно тащить все десятки гигабайт винды, и крутить многочисленные демоны, которые могут понадобиться, а могут и нет. А в случае с Linux есть возможность добавить в контейнер только нужные данному приложению библиотеки и службы и крутить только нужные демоны.
Как вы думаете? Может то, за что ругали Linux, сыграло ему на руку?