Рубріки: Мнение

Не знаю более эффективного способа уничтожить язык: почему 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# не так уж и плох. Но подождите несколько лет. Совсем скоро нас завалят разнообразными фичами.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023