C# глазами Java
Версия 2.0
Я являюсь координатором Java User Group, но уже больше года разрабатываю на C# приложения в области Quantitative Finance. В этой статье я попытаюсь поделиться своими мыслями и ощущениями, ни в коем случае не претендуя на истину в последней инстанции.
Есть два подхода к сравнению языков программирования:
религиозная война и «a нам всё равно». Я постараюсь
втиснуться между ними и начну с общего. Ключевой особенностью
и Java, и C# является автоматическое управление
памятью. Оба языка
- остаётся меньше возможностей для memory leak;
- не надо писать код для освобождения памяти;
- можно написать f(g(x)) и не думать
об освобождении памяти от
результата g(x).
Конечно, бывают другие подходы: например, языки с динамической типизацией, да и старый добрый C++ не стоит на месте, но сейчас Java и .NET получили наибольшее распространение.
Битва гигантов
В .NET есть такой язык — J#. Он до такой степени похож на Java, что на нём можно писать код, из которого будут получаться сразу два практически одинаковых приложения: одно для .NET, а другое — для Java. Такой подход иногда применяется на практике, но не даёт использовать в полной мере возможности ни той, ни другой платформы. Однако, большинство инвесторов хотят добиться как можно более хорошего результата, поэтому им приходится выбирать.
И Microsoft, и Sun Microsystems стремятся всеми правдами и неправдами привлечь потенциальных клиентов на свою сторону и это хорошая основа для взаимовыгодного партнёрства. Но какая главная цель у больших корпораций? Правильно, они хотят заработать побольше денег. Поэтому нельзя принимать за чистую монету всё, что говорят их маркетологи.
Арифметика получается довольно простая: чтобы получить поддержку со стороны миллионов программистов, гиганты вкладывают миллиарды долларов в разработку технологий, создание ресурсов для разработчиков, проведение конференций и другие мероприятия. Конечно, всё это помогает в работе, но, чтобы добиться существенных профессиональных успехов, недостаточно просто влиться в общий поток, необходимо вкладывать собственный труд, знания и способности.
Целевая аудитория
Если вы разрабатываете на .NET, то ваше приложение будет запускаться под Windows и пользователи будут ждать от вас интеграции с Outlook, Word и Excel, причём, возможно, делать это нужно будет через COM. Ваши клиенты будут находиться под очень сильным влиянием Microsoft, поэтому с Microsoft вы будете стараться дружить по полной программе.
Но если .NET развивается на авторитете Microsoft, то Sun Microsystems благодаря Java сводит концы с концами, поэтому Java-разработчики от Sun Microsystems практически не зависят. Условно рынок Java можно разделить на четыре части: веб-приложения (преимущественно использующие Tomcat), кроссплатформенные desktop-приложения для Windows/Linux/Mac, игры для мобильных телефонов и кластерные решения (в основном для финансовой индустрии). В первых двух случаях можно полностью сконцентрироваться на предметной области — какая у клиента операционная система особого значения не имеет. Для разработчиков мобильных приложений очень важны хорошие отношения с операторами и издателями, но все они имеют дело с одним и тем же парком сотовых телефонов.
Большие системы для онлайновой торговли технически весьма сложны и для решения таких задач вполне оправданы многопроцессорные сервера от Sun Microsystems и дорогие EJB-контейнеры от BEA, Borland и других компаний. Отличительная особенность этого сегмента — влияние Microsoft на него крайне незначительно.
Различия в языках
Сразу отметим, что C# совсем не скопирован с Java — между этими языками есть множество принципиальных различий. Пожалуй, самое главное — отсутствие в С# checked exceptions. Подробное объяснение этому даёт Anders Hejlsberg. Обе точки зрения по этому вопросу имеют свои аргументы, но спорить не имеет смысла, решение давно принято: в Java checked exceptions есть, в C# — нет. Я только хочу заметить, что грамотная обработка ошибок — одно из существенных отличий качественного программного обеспечения от школьного домашнего задания.
После Java в C# не хватает анонимных классов,
которые довольно часто используются при написании GUI-приложений. Зато
в C# есть delegate
и event
, которые
позволяют решать аналогичные задачи с меньшим количеством кода.
Но лично мне кажется более предпочтительным объектно-ориентированный
подход - без ссылок на методы.
Многие ключевые слова в C# кажутся мне лишними.
Например, мне трудно представить мотивы реализации поддержки
goto
, во всяком случае я не думаю, что это
нужно кому-то из программистов Microsoft. Также, когда я пишу
на C#, я не использую перегрузку операторов и ключевые
слова ref
и out
. Слова virtual
и override
я, конечно, использую, но по-моему опыт
Java наглядно показал, что можно жить и без них.
Однако, языки программирования не стоят на месте: например, Java 5 с типизированными коллекциями уже есть, а .NET 2.0 пока нет. Но перечислимые типы в .NET были с самого начала, а на Java 5 многие перейдут ещё очень не скоро. Какое влияние окажут на индустрию аттрибуты в .NET и аннотации в Java лично я просто не берусь предсказать.
Средства разработки
Джентльменский набор разработчика приложений для .NET можно описать очень кратко: это полный комплект продуктов Microsoft. Конечно, кто-то использует ReSharper и другие плагины к Visual Studio, кого-то категорически не устраивает Visual SourceSafe и он использует другую систему контроля версий, а кому-то Oracle нравится больше чем MS SQL. Из особенностей .NET я бы выделил поддержку визуального проектирования GUI, широко известного со времён Delphi, и язык VB.NET.
В Java принято делать код независимым от используемых инструментов, для сборки проектов повсеместно используется Apache Ant. Для Java есть множество самых разных средств разработки и они постоянно совершенствуются.
Разработка веб-приложений
Паттёрны разработки веб-приложений одинаковы для всех, более того - они легко реализуются на любой платформе. Но если взять исходный код произвольного корпоративного сайта, то скорее всего мы увидим внутри макароны разной степени ужасности. Можно сделать вывод, что разработка веб-приложений — не самый интересный бизнес с точки зрения программирования.
Заключение
Безусловно, индустрии нужны массовые платформы и люди, которые их продвигают и поддерживают. Но использование даже самых современных технологий не гарантирует успеха конкретного проекта. Но, если вы способны грамотно поставить задачу, написать ясный код и сделать работающее решение — вы сможете овладеть любым языком программирования.
Благодарности
Огромное спасибо Дмитрию Жемерову за помощь в написании первой версии этой статьи, компании JetBrains за средства разработки и компании DataArt за возможность работать программистом.
Ссылки
1. The C# Programming Language for Java Developers
http://msdn.microsoft.com/vstudio/java/gettingstarted/csharpforjava/
2. J2EE fundamentals for .NET developers
http://www-106.ibm.com/developerworks/java/library/j-roadmap1/
Автор:
Яков Сироткин
июль-август 2004 года, май 2005