Пост о том как не надо вести разработку фреймворков, и о том, почему жизненный цикл программного обеспечения это не пустые слова, особенно, если на вас полагаются миллионы разработчиков по всему миру. Далее следует критика подхода к разработке платформы .NET Core, и, тесно связанного с ним фреймворка, ASP.NET Core.
История версий .NET Core (шутка с просторов Интернета):
* Alpha
* Beta
* RC1
* 2RC 2Furious
* RC: Tokyo Drift
* RC4: The Big RC
* 7
* RC8
Предыстория
vNext — кодовое имя для нового поколения ASP.NET, которое использовалось довольно продолжительное время, пока фреймворк не получил порядковый номер и не стал называться ASP.NET 5 (позже известный как ASP.NET Core). Если до этого развитие ASP.NET шло планомерно, в основном, без проблем с обратной совместимостью, то новая версия стала настоящей революцией. По сути это новый фреймворк. Одной из целей тотального переписывания было достижение модульности, что, в том числе, позволило отвязать .NET от платформы Windows. Это потом послужило поводом для череды громких анонсов о поддержке Linux и OS X.
Надо сказать, что новый фреймворк получился очень приятным: канул в лету монструозный System.Web, а MVC и Web API части слились в одно целое. Кроме того, рантайм и библиотеки были разбиты на мелкие части (типичная инсталляция веб-приложения вместе со всеми зависимостями теперь занимала меньше 50 мегабайт, против прежних 500 МБ полной версии .NET Framework). Поддержка Linux — вообще отдельный разговор. Официальный образ для Docker, запуск приложений в два клика на серверах любого облачного
Но не всё было гладко. Новая платформа получилась несовместимой не только на уровне ASP.NET, изменился сам .NET Framework. По сути, появилось два независимых направления: CoreCLR и "старый" .NET версии 4.x. Портирование между этими фреймворками оказалось нетривиальной задачей для большого числа библиотек, авторы которых, естественно, стали выражать свое недовольство. Но, по большому счету, Microsoft тогда легко отделался — люди пошумели немного, и успокоились. В качестве тренировки воображения, можно представить себе реки крови, которые потекли бы в случае, если помимо основной версии Java появилась бы какая-нибудь несовместимая SuperDuperJava. В случае .NET же, разработчики скорее радовались новым возможностям, чем противились изменениям, хотя и недовольства тоже было много.
Super frustrated with .NET Core atm, been doing .NET dev since day 0, and I honestly have 0 idea how to make things work on .NET Core...
— Roger Johansson (@RogerAlsing) 27 марта 2016 г.
Как бы там не было, факт в том, что .NET теперь находится в ситуации, подобной той, что имела место быть с Python 2.x и 3.x. А еще ведь есть WinRT, Mono, Unity и Xamarin, которые тоже не отличаются стопроцентной совместимостью...
Release Candidate
Если вы нормальный человек, и не прибыли на Землю с одной из планет системы Альфа Центавра, то, скорее всего, после единицы у вас идут числа 2 и 3, после альфа версии идет бета, а после Release Candidate следует финальный релиз, ну или RTM.
Самые хипстерские конторы пишут на новом ASP.NET с первых альфа версий. Я лично успел поработать в двух командах, которые используют этот фреймворк. С ним вполне можно жить, если обновлять приложение по ходу выхода новых версий, без отставания от графика выпуска. Конечно, работа по обновлению приложений не самая интересная, но вкусности новой версии того стоят, если компания может себе это позволить.
В нормальном мире, когда проект подходит к стадии Release Candidate, сообщество ожидает стабильности. "Это слишком скучно" — наверное, так подумали в Microsoft. Оказалось, что самое интересное еще было впереди. Внезапно, самые большие изменения в истории нового фреймворка случились когда версия получила приставку RC. Первым признаком грядущего пожара стал project.json, а точнее его замена на старый добрый MSBuild. Если быть честным, то это изменение само по себе не является катастрофой. Однако, именно project.json был флагманом "нового" .NET. Посмотрите презентации с многочисленных конференций — пиар машина завлекала хипстеров из мира Go и, о боже, Node.js именно такими вещами. Кроме того, ужасный тайминг — как можно называть что-либо Release Candidate, когда впереди предстоит смена системы сборки для всего фреймворка?
OH: "I've got a talk on .NET Core in 2 weeks. I think I'll just get up on stage and cry for 50 minutes"
— Hadi Hariri (@hhariri) 27 мая 2016 г.
Дальше — больше. ASP.NET Community Standup — канал на YouTube, где разработчики в еженедельных выпусках рассказывают про новый ASP.NET и процесс его разработки. Стэндап, до этого стабильно выходивший раз в неделю, неожиданно замолкает на месяц. Последняя публикация называется "Do we have dates?", что очень символично. Разработчики фреймворка, до этого активные пользователи твиттера, начинают осторожничать, не ввязываются в дискуссии. Остальной же твиттер бурлит от негодования. Все теряются в догадках. Создается впечатление, что те, кто делал этот проект, теперь сами не в курсе о том, что происходит. Из догадок сообщества — пришли "взрослые ребята", которые дали нагоняй "наигравшимся вдоволь детишкам" и взяли всё под свой контроль.
Смешались в кучу кони, люди, WebAssembly
О том, какой раздрай творится в мире .NET можно судить по всплывшим в сети скриншотам обсуждения будущего платформы внутри Microsoft. В то время, как ASP.NET находится в подвешенном состоянии, разработчики обсуждают странные темы вроде поддержки компиляции в WebAssembly. Скорее всего, .NET Core, в его текущем виде неудобен некоторым отделам Microsoft (вроде Xamarin) из-за своей несовместимости. Одна часть Microsoft не совсем довольна тем, что сделала другая. Как Лебедь, Рак, и Щука, каждый тянет на себя. В результате — топтание на месте и странное молчание.
hurry up and bring .NET in the browser (again) pic.twitter.com/6VtwK8ctzp
— Jose Fajardo (@josefajardo) 26 мая 2016 г.
Что дальше? Можно сделать несколько предположений о будущем .NET исходя из обсуждений в официальном канале Slack: Mscorlib и AppDomains скорее всего возвращаются в своем первоначальном виде, что ставит под вопрос модульность всего фреймворка, и, вообще, необходимость первоначальной затеи. Взамен — некоторое подмножество API, доступное и совместимое на всех платформах начиная с ASP.NET и заканчивая Unity и Xamarin. Это достаточно большие изменения. По новым срокам — абсолютная неопределенность.
Вывод
Несмотря на блестящую работу, проделанную командой разработки, отсутствие полной картины в глазах менеджмента привело к тому, что большое количество разработчиков сделали ставку на платформу, которая никогда не будет выпущена в её текущем виде. Можно долго спорить на счет того, было ли правильным решение поделить платформу на две ветки, но думать на эту тему нужно было гораздо раньше. Разворот на 180 градусов в стадии RC это худшее из того, что можно было придумать. Release Candidate это, вполне себе, устоявшийся термин, который предполагает некие обязательства, которые неплохо было бы выполнять.
Автор: x2bool