Не знаю более эффективного способа уничтожить язык: почему C# умирает, и при чем здесь Microsoft
Многие из нас обожают C#. Моим первым настоящим программным проектом после университета стала игра, написанная на Unity. И я сразу влюбился в этот язык. Тогда он был чем-то похож на Java… Но с тех пор разработчики перешли на более быстрый цикл выпуска, потому все могло измениться.
Редакция Highload публикует перевод текста из блога разработчика Andrew Zuo на Medium.
Я продолжаю любить этот язык программирования. Он может быть не самым красивым, но с ним можно делать все, что угодно. Мне нравится многопоточность. Но последние несколько лет меня очень беспокоила судьба C#.
В чем суть?
Однажды в одном из комментариев я сказал:
«C# умирает, и Microsoft убивает его, потому что продолжает добавлять все новые функции, о которых никто не просил. Смерть из-за постоянного расширения и чрезмерного усложнения функций».
Я не знаю другого способа уничтожения языка программирования, который был бы более эффективным, чем Feature Creep — расширением и усложнением.
Эта цитата — парафраз из одного из эпизодов Freakonomics. Оригинальная цитата была несколько иной: «Если не считать бомбардировочных ударов, я не знаю, чем еще можно уничтожить город, кроме как контролем за арендной платой».
Что может быть эквивалентом бомбардировки для языка программирования? Конечно, можно разбомбить штаб-квартиру компании, но это не убьет язык, а только остановит его разработку.
Проблема с расширением функций затрудняет изучение и освоение языка программирования. В подтверждение своих слов рекомендую вам прочитать интервью с создателем языка программирования C++ Бьерном Страуструпом.
1 января 1998 года Бьерн Страуструп якобы дал интервью журналу IEEE Computer. Редакторы думали, что получат ретроспективный взгляд на семилетний опыт в объектно-ориентированном дизайне с использованием созданного им языка. Но к концу встречи интервьюер получил больше, чем ожидал. По легенде, редактор решил скрыть эту информацию «для блага индустрии», но произошла утечка.
Вот якобы полная стенограмма того, что было сказано:
Интервьюер (И): «Прошло несколько лет с тех пор, как вы изменили мир дизайна программного обеспечения, что можете сказать с оглядкой на прошлое?»
Страуструп (С): «Я думал об этом незадолго до вашего приезда. Помните, все писали на C и делали это отменно… Университеты выпускали новых специалистов. Они с феноменальной скоростью выдавали компетентных — я подчеркиваю слово “компетентных” — выпускников. Вот в чем проблема».
И: «Проблема?»
С: «Да, проблема. Помните, когда все писали на COBOL?»
И: «Конечно. Я тоже».
С: «Эти парни были как полубоги. Они получали огромные зарплаты, с ними обращались как с членами королевской семьи».
И: «Прекрасное было время, правда?»
С: «Конечно. Но что произошло дальше? IBM это надоело, и она инвестировала миллионы в обучение программистов, пока их не стало слишком много на рынке труда».
И: «По этой причине я и ушел из этой сферы. Заработная плата упала в течение года до такой минимальной отметки, что журналистам платили намного больше».
С: «Совершенно верно. То же самое произошло и с программистами С».
И: «Понятно, но в чем суть?»
С: «Однажды, сидя в своем офисе, я подумал: “Интересно, что бы произошло, если бы существовал язык настолько сложный для изучения, что никто никогда не смог бы заполонить рынок программистами?” Некоторые идеи я почерпнул из X10, вы должны знать, это X windows. Это была такая сложная фигня с графической системой, что работала она только на Sun 3/60… Там было все, что мне было нужно. Сложный синтаксис, непонятные функции и псевдо-объектно-ориентированная структура. Даже сейчас никто не пишет сырой код X-windows. Motif — единственный выход, если вы хотите сохранить рассудок».
И: «Вы шутите?»
С: «Отнюдь. Однако была другая проблема. Unix была написана на C, а это означало, что любой программист C мог очень легко стать системным программистом. Вспомните, сколько раньше зарабатывал системный программист мейнфреймов?»
И: «Вы правы, я так и делал».
С: «Значит новому языку нужно было отделиться от Unix, скрыв все системные данные, которые так хорошо их связывали. Это позволило бы парням, которые знали только DOS, тоже неплохо зарабатывать».
И: «Я не могу в это поверить…»
С: «Прошло достаточно времени, и я считаю, что большинство людей поняли, что C++ — пустая трата времени. Должен сказать, им потребовалось гораздо больше времени, чем я ожидал».
И: «Так как именно вы это сделали?»
С: «Это должно было быть шуткой, я и подумать не мог, что люди воспримут все всерьез. Любой, у кого есть хоть половина мозга, может понять, что объектно-ориентированное программирование противоречит интуиции, оно нелогично и неэффективно».
И: «Что?»
С: «А что касается «повторно используемого кода» — вы когда-нибудь слышали о компаниях, которые повторно используют свой код?»
И: «Ну, вообще-то, никогда, но…»
С: «Ну вот. Некоторые пытались это сделать почти сразу. Одна компания из Орегона — кажется, Mentor Graphics — отчаянно пыталась переписать все на C++ в ’90 или ’91. Мне было их очень жаль, но я думал, что люди будут учиться на своих ошибках…»
И: «Очевидно, нет?»
С: «Ни в малейшей степени. Проблема в том, что большинство компаний замалчивают свои крупные промахи, ведь объяснить акционерам убыток в $30 миллионов было бы непросто… Надо отдать им должное, в конце концов они заставили язык работать».
И: «Да? Тогда это доказывает, что объектно-ориентированное проектирование работает».
С: «Ну, почти. Исполняемый файл был настолько огромен, что его загрузка заняла пять минут на рабочей станции HP со 128 МБ ОЗУ. На самом деле, я думал, что это станет серьезным камнем преткновения и меня найдут в течение недели, но никого это не волновало. Sun и HP были только рады продать свои мощнейшие устройства и ресурсы для запуска самых обычных программ. Когда-то в AT&T мы создали первый компилятор C++, я скомпилировал “Hello World” и не мог поверить в размер исполняемого файла — 2,1 МБ».
И: «Ого… Но компиляторы прошли долгий путь развития».
С: «Думаете? Попробуйте компилятор в последней версии g++ — никакого толку с полмегабайта вы не получите. Есть еще несколько печальных примеров. У British Telecom случилась по этой причине катастрофа, к счастью, компании удалось все исправить. Ей повезло больше, чем Australian Telecom. Я слышал, что Siemens создает динозавра, и все больше и больше беспокоюсь о том, что оборудования становится все больше для хранения файлов. Разве множественное наследование не может не радовать?»
И: «Да, но C++ — это, по сути, язык звука».
С: «Вы действительно в это верите? Работали ли вы когда-нибудь над проектом на C++? Во-первых, я поставил достаточно ловушек и с первого раза смогут работать только самые тривиальные проекты. Перегрузка операторов. По завершении проекта они будут почти в каждом модуле. Это происходит обычно потому, что ребята думают, что должны делать именно так. Один и тот же оператор означает что-то совершенно разное в каждом модуле. Попробуйте собрать все это вместе, если у вас уже около сотни модулей. И насчет скрытия данных. Иногда я невольно хихикаю, когда слышу о проблемах, с которыми сталкиваются компании при попытках заставить свои модули взаимодействовать друг с другом. Я думаю, что слово “синергетический” было придумано специально, чтобы ввернуть нож в ребро менеджеру проекта».
И: «Должен сказать, что все вышесказанное наводит на меня ужас. Вы говорите, что сделали это для повышения зарплаты программистам?»
С: «Не совсем. У каждого есть выбор. Я не ожидал, что все выйдет из-под контроля. Однако сейчас C++ умирает, а программисты по-прежнему получают высокие зарплаты — особенно те, кому приходится поддерживать всю эту чушь. Знаете ли вы, что невозможно поддерживать большой программный модуль C++, если вы его не написали?»
И: «Как так?»
С: «Кажется, вы потеряли связь. Помните typedef?»
И: «Да, конечно».
С: «Помните, сколько времени требовалось для нахождения файлов хедера только для того, чтобы понять, что RoofRaised — это число двойной точности? Что ж, представьте, сколько времени потребуется, чтобы найти все неявные typedef во всех классах в большом проекте».
И: «Вы считаете, что добились успеха?»
С: «Знаете, сколько нужно времени на выполнение среднего проекта на C? Около шести месяцев. Не так продолжительно, чтобы парень с женой и детьми зарабатывал достаточно. Возьмите этот же проект, спроектируйте его на C++ и что вы получите? От одного до двух лет. Здорово, правда? И еще одно. В университетах давно не преподают С, мы ощущаем острую нехватку достойных программистов на С. Особенно тех, кто хоть что-нибудь знает о программировании Unix-систем. Сколько парней будет знать, что делать с malloc, если они все эти годы использовали слово new и ни разу не удосужились проверить код возврата. Большинство программистов на C++ фактически выбрасывают свои коды возврата. Что случилось со старым добрым -1? По крайней мере, вы знали, что у вас ошибка, не увязая во всей этой ерунде типа throw, catch, try».
И: «Наследование позволяет сэкономить много времени».
С: «Правда? Замечали ли вы разницу между планом проекта C и планом проекта C ++? Стадия планирования для C++ проекта в три раза длиннее. Именно по причине того наследования. Но ошибки все равно встречаются часто. Кто-нибудь слышал об утечках памяти в программе на C? Теперь их поиск — отдельная индустрия. Большинство компаний сдают продукт заказчику, зная о том, что он как решето. Они хотят избежать расходов на отслеживание всех этих утечек».
И: «Но есть же инструменты…»
С: «Большинство из них были написаны на C++».
И: «Если мы опубликуем это интервью, скорее всего, вас линчуют, вы это понимаете?»
С: «Сомневаюсь. Как я уже сказал, C++ уже прошел свой пик, и ни одна компания в здравом уме не станет начинать проект C++ без пилотного триала. Это путь к катастрофе. Я пытался убедить Денниса Ритчи переписать Unix на C++…»
И: «Боже мой. Что он сказал?»
С: «К счастью, у него хорошее чувство юмора. Думаю, и он, и Брайан с самого начала понимали, чем я занимаюсь, но помалкивали. Он сказал, что поможет мне написать версию DOS на C++, если мне будет это интересно».
И: «Вы сделали это?»
С: «Я написал DOS на C++, предоставлю вам демо, когда мы закончим. У меня он работает на Sparc 20. Работает как ракета на четырех процессорах и занимает всего 70 мегабайт на диске».
И: «На ПК?»
С: «Вы никогда не видели Windows 95? Я считаю это своим самым большим успехом».
И: «Знаете, идея с Unix++ заставила меня задуматься. Кто-то обязательно захотел бы попробовать».
С: «После того, как они прочтут это интервью?»
И: «Прошу прощения, но я не вижу смысла публиковать что-либо из этого».
С: «Но это же сенсация века. Я хочу, чтобы мои товарищи-программисты помнили меня и то, что я для них сделал. Вы знаете, сколько в наши дни может зарабатывать специалист по C++?»
И: «По моим последним данным от $70 до $80 в час».
С: «Держу пари, так и есть. Отслеживать все ошибки, которые я вложил в C++ — непростая задача. И, как я уже говорил, каждый программист на C++ чувствует себя обязанным использовать каждый элемент языка в каждом проекте. Это меня иногда очень раздражает. По прошествии всего этого времени я почти полюбил этот язык».
И: «Вы имеете в виду, что не любили его раньше?»
С: «Ненавидел. Это выглядит даже глупо, правда? Но когда начали поступать гонорары… Ну, вы понимаете».
И: «Минутку. А что насчет references? Согласитесь, вы улучшили указатели C».
С: «Хм. Меня всегда это интересовало. Первоначально я думал, что да. Однажды я обсуждал это с парнем, который с самого начала писал на C++. Он сказал, что не сможет вспомнить, были ли reference- или dereference-переменные, поэтому всегда использовал указатели».
И: «Обычно я говорю “большое спасибо” за интервью, но это вряд ли покажется сейчас адекватным».
С: «Пообещайте, что опубликуете это. Моя совесть в эти дни берет верх надо мной».
И: «Я дам вам знать, но думаю, что редактор на это не пойдет».
С: «Да и вряд ли кто поверит. Хотя, можете выслать мне копию нашего интервью?»
И: «Обязательно».
Очевидно, что это интервью — фейк. Или…? Нет, фейк.
Но оно стало вирусным. И не зря: оно могло быть и настоящим. Потому что все любят посмеяться над тем, какой C++ раздутый и беспорядочный язык. Именно по этой причине он уже не часто используется.
Если, конечно, вы не работаете над низкоуровневыми вещами. Хотя Rust становится все более популярным.
Когда вы в последний раз видели фреймворк высокого уровня, использующий C++?
Как усложняется C#
Я не хочу, чтобы та же участь постигла C#. Но, к сожалению, все к этому идет.
Я впервые начал об этом подозревать, когда увидел в C# 8 новые выражения switch
. Найти их можно даже в документации C# 8:
public static RGBColor FromRainbow(Rainbow colorBand) => colorBand switch { Rainbow.Red => new RGBColor(0xFF, 0x00, 0x00), Rainbow.Orange => new RGBColor(0xFF, 0x7F, 0x00), Rainbow.Yellow => new RGBColor(0xFF, 0xFF, 0x00), Rainbow.Green => new RGBColor(0x00, 0xFF, 0x00), Rainbow.Blue => new RGBColor(0x00, 0x00, 0xFF), Rainbow.Indigo => new RGBColor(0x4B, 0x00, 0x82), Rainbow.Violet => new RGBColor(0x94, 0x00, 0xD3), _ => throw new ArgumentException(message: "invalid enum value", paramName: nameof(colorBand)), };
Выглядит бредово. Что не так с обычным оператором switch
? Какое обоснование найти тому, почему это может быть в определенных обстоятельствах лучше? Тогда как насчет такого:
В C# 9 вы можете опустить тип, например:
private List<WeatherObservation> _observations = new();
Ключевое слово var
уже само по себе является достаточно спорным. Зачем нам второе?
Поздравляю! Вы сломали интернет
Или как в C# 10 создается свойство для свойства. Это называется C# Fields. Ну хорошо, это для автосвойств. Но я не знаю, почему нельзя просто использовать обычное свойство.
Предполагалось, что подобные свойства сделают нашу жизнь проще. Но никак не хуже.
Дальше только хуже
Потому что у C# каждый год должна быть новая версия. Я не знаю, почему все переходят на быстрые циклы выпуска. Я использовал бета-версию Firefox 4 в течение года и был полностью им доволен. А что сейчас? У нас Firefox 91. 91, Карл! Потому что браузер должен обновляться каждые четыре недели.
C# обновляется в соответствии с ежегодным циклом выпуска, а Java обновляется в соответствии с шестимесячным циклом. Я не знаю, почему так происходит. Языки программирования не так быстро устаревают.
Кажется, я понимаю, почему так происходит с Java. Подозреваю, что это связано с Open JDK. Старые версии Open JDK не получают никаких обновлений, поэтому, если вы хотите использовать версию Java пятилетней давности, что делает большинство компаний, вам нужно заплатить. Это гениально.
Пока C# не так уж и плох. Но подождите несколько лет. Совсем скоро нас завалят разнообразными фичами.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: