вторник, 8 сентября 2015 г.

[prog.thoughts] Есть ли место C++ в современных условиях?

Что-то в последнее время попадаются на глаза удивленные возгласы вида "Как, вы используете C++? Но зачем?" Причем, как я понимаю, задают их те, кто на C++ никогда ничего толком не писал, не внедрял и не сопровождал. А может и вообще не видел.

Поэтому, как мне кажется, от незнания предмета возникает неверное восприятие реальности. Откуда и происходит непонимание и подобные удивленные возгласы. Попробую высказать свое мнение о том, когда C++ является нормальным выбором в качестве основного языка разработки.

Случай первый. Унаследованный код. Полагаю, комментировать тут особо нечего. Язык старый, серьезный софт на нем начали разрабатывать еще тогда, когда модных нынче альтернатив еще не было, либо же они были в настолько зачаточном состоянии, что для промышленного применения были слабо пригодны.

Случай второй. Специфическое окружение. Например, совсем слабенький процессор, мало памяти на борту, специализированная ОС и т.д. Языки C и C++ там себя будут чувствовать вполне нормально. Может быть даже какая-нибудь Java окажется в наличии. Но вот будет ли там Erlang, JavaScript или Pyhthon/Ruby -- вопрос. Еще больший вопрос, с какой скоростью они там будут работать, даже если их туда впихнуть.

Случай третий. Высокие требования к производительности. Вычисления, обработка изображений/звука/видео, игры, http-сервера, сервера СУБД, MQ-шные сервисы и т.д. и т.п. Сюда же, пожалуй, можно отнести и системы реального времени, где нужно гарантировать времена отклика.

Случай четвертый. Десктопный GUI-софт. Web-браузеры, офисные пакеты, разнообразные CAD-ы, софт для работы с фото/видео/звуком (вроде Lightroom/Photoshop/CaptureOne/Apperture) и т.д., и т.п.

Ну и случай пятый, который сейчас становится более актуальным, чем лет десять назад. Кроссплатформенность. Если нужно сделать что-то, что должно работать на дестктопе (Windows, MacOS, может быть и Linux), на мобилках (Android, iOS), планшетах (Android, iOS) и приставках, то C и C++ могут оказаться более удобным и менее проблемным вариантом, чем та же Java.

Специальное пояснение для C++хейтеров: я ничуть не утверждаю, что во всех этих случаях (за исключением, пожалуй, ситуации с унаследованным кодом) C++ является наилучшим выбором. И что на других языках, вроде C, Haskell, OCaml, Eiffel, Go, D, Rust или еще чего-нибудь, нельзя будет достичь таких же, а то и лучших результатов.

Можно достичь. И некоторые таки достигают.

Я лишь акцентирую внимание на другом: в перечисленных случаях выбор вариантов будет совсем небольшим и C++ среди имеющихся альтернатив будет выглядеть далеко не так плохо, как может показаться, если верить форумным страшилкам.

Ну и, например, если потребуется выжать максимум производительности из слабенького железа, то выбор языка С++ в качестве языка реализации у меня лично будет вызывать гораздо меньше вопросов, чем выбор языка C. И уж тем более, такого экзотического варианта, как разработка на Haskell-е с генерацией C-шного кода. Хотя бы из чисто менеджерских соображений в плане снижения рисков.


Отдельно можно сказать о том, что нужно для того, чтобы начатый на C++ проект успешно развивался и не превратился в хронический глюкодром. Это мое личное мнение, на объективность которого нисколько не претендую. И никому не навязываю. Но сам стараюсь следовать этому простому рецепту.

Для успешной реализации проекта на С++ нужна небольшая команда из хороших профессионалов.

Язык C++ не прощает посредственности. А программисты, к сожалению, делятся на два типа: те, кто понимает указатели и адресную арифметику и на всех остальных. Представителей первой группы было мало и 20 лет назад, когда языки со сборкой мусора были распространены не так сильно, как сейчас. Сейчас, имхо, их становится еще меньше (в процентном отношении, по крайней мере).

Те, кто понимает, что такое указатели, в конце-концов начинают нормально писать на C++. Даже если адресной арифметикой им пользоваться и не придется. А вот с остальным печальнее. Поэтому, лучше держать в своей команде 2-4 человек, которые просто понимают, почему нельзя возвращать из функции указатель на временный объект. Чем постоянно ревьювить код 15 разработчиков, которым следовало бы работать на Java или C#, а не на C++.

Уж простите мне такой шовинизм, но разработка софта сейчас, особенно в наших палестинах, -- это слишком высокооплачиваемое занятие. Которое привлекает множество людей, не имеющих достаточных способностей к решению сложных задач (а программирование на C++ сложнее, чем программирование на более безопасных языках и это объективно). Это перемножается еще и на постоянно снижающийся уровень преподавания. Из-за которого даже разработчики с хорошим потенциалом оказываются не слишком хорошо обученными. Что уж тут говорить про всех остальных.

Поэтому, если вам пришлось заниматься разработкой софта на C++, то отнеситесь к подбору людей с повышенным тщанием и требовательностью. С тремя хорошими C++никами у вас намного больше шансов успешно завершить проект, чем с десятком середнячков.

Комментариев нет: