Перед началом работы над любым проектом, будь то небольшое «отечественное» приложение или громкое Enterprise-решение, у людей, инициирующих начало разработки, возникает вопрос: «На каком языке мы будем писать?» . Ответ может показаться довольно простым, но не все знают, что первым вопросом должен быть «Что мы будем писать?».
Этот вопрос не праздный, так как ответ на него должен быть гораздо более конкретным, чем может показаться на первый взгляд. Часто бывает так, что решение о том, как начать разработку, на уровне средней компании, принимают люди, далекие от именно этой разработки. Конечно, чаще всего есть технический директор, который берет на себя всю тяжесть определения того или иного пути развития, но что делать, если такого человека нет? Внешний аудитор в лице опытного разработчика не будет читать на кофейной гуще, чтобы понять, что вы хотите получить в итоге. Вы получите либо отказ в помощи, либо неполный ответ, и ошибкой их не будет: как вопрос, так и ответ.
В этой статье мы обсудим основные моменты выбора технологий развития и ошибки, которые допускают руководители и менеджеры, а также почему не стоит следовать изменчивой моде.
Предположим, у вас уже есть четкое представление о проекте и его техническом задании. Теперь, чтобы не ошибиться при выборе технологий разработки, нужно иметь хотя бы базовое представление о разнице между языками программирования. Ответов на этот вопрос много, но сейчас мы говорим о принципиальных отличиях и областях применения. Только если вы понимаете эти различия, вы можете задать решающий вопрос: «Каковы плюсы и минусы языка программирования X?» и получите на него четкий ответ, который можно применить к требованиям вашего проекта.
Не будем пользоваться профессиональными терминами и делить языки на высокоуровневые, низкоуровневые, объектно-ориентированные и так далее. В нашем случае нужен шорт-лист из пяти пунктов, каждый из которых просто и прозрачно связан с каким-либо ТЗ:
1. Платформа (область применения языка)
2. Языковая гибкость
3. Время разработки и «жизнь» проекта.
4. Производительность
5. Языковое сообщество
Ответы на эти пять вопросов может дать любой квалифицированный специалист. Кроме того, они достаточно просты для понимания, прозрачны и, что более важно, наглядно показывают, можем ли мы использовать данный язык для разработки или нет.
Разные языки — разные области
Лучший способ определить язык программирования и основной вектор развития — использовать опыт сообщества. При этом не обязательно быть разработчиком, чтобы принять правильное решение — достаточно посмотреть, какие языки программирования популярны в нужной области, и пройтись по их характеристикам в соответствии с приложенным выше списком.
Каждый из языков программирования имеет свои преимущества и недостатки.
Возьмем в качестве примера Python. Этот язык программирования похож на швейцарский нож с еще одним маленьким швейцарским ножом внутри — в теории на нем можно написать что угодно, если у вас нет требований к потреблению памяти и скорости конечного продукта, конечно. Кроме того, у Python очень низкая кривая обучения, поэтому найти разработчиков Python (и даже обучить своих в процессе разработки проекта) не составит труда, а огромное количество открытых библиотек существенно упрощает жизнь программистам. Однако, как только вам нужно, чтобы приложение было не только простым, но и быстрым в работе, с жесткими ограничениями по потреблению системных ресурсов, про Python лучше забыть. То же самое, если вам нужно многопоточное приложение: реализация языка Python не поддерживает многопоточность.
Вернемся к нашему списку факторов и рассмотрим Python через него:
1. Область применения: почти все и везде
2. Гибкость: впечатляющая
3. Время разработки: быстрое
4. Производительность: доступна только при наличии значительных или неограниченных вычислительных мощностей.
5. Языковое сообщество: огромная армия разработчиков всех уровней.
Как видите, основная проблема Python, взятого за пример, — его прожорливость. Если мы делаем веб-приложение, которое будет крутиться где-то на серверах Google, то мы можем себе позволить разработку на этом языке. Но если речь идет о мобильном или даже десктопном приложении, когда целевое устройство может быть маломощным, забудьте о Python.
И самое главное: такие нюансы есть в любом языке программирования. Некоторые из них могут быть для вас не важны, а другие окажутся фатальными. А чтобы четко понимать, что повлияет на проект, а что нет, нужно знать, что именно вы получите после разработки, и кто этим будет пользоваться.
Давайте рассмотрим еще один язык, пусть это будет C++. Его кривая обучения выше, чем у Python, но у него есть ряд преимуществ, которых Python лишен. Например, C++ позволяет контролировать потребление ресурсов нашим программным обеспечением, что делает его отличным выбором для написания эффективных приложений, которые должны работать в ограниченной среде. Таким образом, C++ широко используется в игровой индустрии, где команде необходимо «встроить» весьма солидную по сложности и размеру логику в ограниченное пространство конечной пользовательской конфигурации, далекой от серверной с точки зрения сила. Сюда же можно отнести мобильные приложения и игры, которым приходится довольствоваться маломощными процессорами и весьма скромным объемом оперативной памяти, которую, помимо всего прочего, нужно будет делить с другими «жителями» устройства.
С другой стороны, нужно понимать, что C++ подобен мечу, полностью состоящему из лезвия, без рукояти. Опытный разработчик справится виртуозно, но слабая команда создаст приложение, которое мало чем будет отличаться от проекта на более прожорливом Python, но при этом будет медленнее собираться. Также в C++ нет управляемой среды разработки, которая есть в более «архитектурных» молодых языках, а значит сам процесс разработки ПО будет долгим и мучительным, а полученный на выходе результат может не радовать.
В итоге пройдемся по нашему списку факторов, теперь уже в приложении к C++:
1. Область применения: приложения, требующие высокой скорости и работающие в ограниченной среде.
2. Гибкость: низкая
3. Время разработки: больше среднего
4. Производительность: этот язык примерно эффективное использование каждого мегабайта памяти. Он используется для создания наиболее эффективных с точки зрения энергопотребления приложений.
5. Языковое сообщество: огромная армия разработчиков, но некоторые из них являются «вредителями», поскольку кривая изучения языка очень высока.
Приведенные выше примеры несколько преувеличены, но очень показательны, а главное, они отбрасывают ультимативные утверждения вроде «язык X — лучший» или «язык X годится для чего угодно». Как видите, универсального языка не существует. Каждый из них имеет ряд заметных отличий, которые либо сделают ваш проект бешено успешным, либо похоронят его под бесконечными циклами исправлений и улучшений.
Номодные языки программирования и их опасность
Помимо популярных языков программирования, которые у всех на слуху, есть и новомодные в прямом смысле этого слова. Чаще всего это какие-то новинки, которые предлагают расширенные функции, которых нет в других языках, или имеют какой-то специфический синтаксис. На самом деле это не так важно. Что действительно важно, так это то, что выбор новомодного языка программирования вместо просто популярного — это, скорее всего, прямой путь в пропасть.
У всех новомодных языков программирования есть одна общая черта: в их сообществах очень мало действительно опытных разработчиков и еще меньше руководств, документации и опыта.
Фактически это означает, что разработчики еще не нашли и не разработали оптимальных способов решения различных задач с помощью этого языка, а значит, экспериментируют. Но на отечественных проектах эксперименты допустимы, а когда дело доходит до коммерческих разработок, такие сюрпризы не к добру, ведь бизнес любит предсказуемость и конкретику.
Бывает и так, что у вас уже есть опытный разработчик какого-то новомодного языка, и по списку факторов он вас вполне устраивает, так почему бы не начать разработку?
Проблема в том, что наряду с разработкой часто требуется сопровождение приложения в течение достаточно длительного времени, а для этого требуются человеческие ресурсы. К счастью или нет, экзотические/новомодные языки программирования редко бывают настолько распространены, чтобы их сообщество разрослось до действительно заметных размеров. Это означает, что если вам нужен второй, третий или десятый разработчик в вашей команде, то вы будете пытаться закрыть вакансию месяцами, если вообще когда-либо. Чаще всего будущее проектов на новомодных языках либо в поддержке людей, освоивших этот самый язык прямо на рабочем месте, либо в переписывании на что-то более употребительное и понятное. Оба варианта стоят дополнительного времени, денег и нервных клеток лидеров.
Вот пример. Всего 3–4 года назад сотни компаний и проектов искали разработчиков Ruby, специально знакомых с фреймворком Ruby on Rails, а не разработчиков PHP или JavaScript. «Рельсы» были так популярны, а их разработчики так высокооплачиваемы, что представители этого сообщества позволяли себе заявления типа:
«Ruby on Rails и PHP похожи на Apple Macintosh и ПК. Нас мало, но мы элита. Ruby on Rails и PHP — это культура против хаоса. “
Казалось, за RoR будущее, но мода, замешанная на технической необходимости, прошла: для стабильно развивающегося JavaScript было выпущено несколько новых библиотек, закрывавших потребность в функционале Ruby on Rails в разработке, и началась популярность языка Ruby и его фреймворка. исчезать. Да, Ruby on Rails до сих пор используется на многих проектах, опытные RoR-разработчики востребованы на рынке, но количество вакансий меньше, чем несколько лет назад. Произошло это, в первую очередь, потому, что языки программирования, конкурирующие с Ruby on Rails, тоже не стояли на месте, и в связи с обновлениями, созданием новых фреймворков и библиотек острая потребность в RoR со временем отпала.
Раз в несколько лет какой-то язык или фреймворк «выстреливает», и вокруг него очень быстро выстраивается небольшое сообщество. Например, сейчас популярны Rust или Golang. И никто не знает, найдут ли эти языки пристанище или их заменят более устойчивые и созревшие «старожилы». Вообще говоря, лезть в разработку с опорой на новомодный язык или технологию очень рискованно, так как в будущем могут возникнуть серьезные проблемы с поддержкой, о которых мы подробно поговорим ниже.
Области применения, условия и поддержка
Очень важно понимать, в какой области разрабатывается проект, ведь универсальных языков программирования не существует — все они живут и развиваются в своих специализированных нишах. При этом языки и технологии сегментируются не только по области (веб, мобайл, десктоп и т. д.) разработки, но и по сфере применения. Например, ту же веб-разработку можно условно разделить на клиентский фронтенд и серверный бэкенд. И для обеих этих частей одного и того же веб-проекта языки и технологии будут разными. Это значит, что для создания веб-проекта недостаточно нанять команду JavaScript или PHP-разработчиков, которые сделают вам front-end часть: вам понадобятся еще и back-end специалисты. Этот очевидный нюанс часто ускользает от людей, далеких от программирования, что приводит в лучшем случае к расширению смет, а в худшем к потере времени и бюджета.
Еще один аспект, который часто игнорируется, — это жизненный цикл проекта. Часто заказчик строит исключительно из сроков разработки с момента получения ТЗ до сдачи рабочего проекта. Особенность dev-сферы в том, что после этапа активной разработки начинается менее интенсивный, но жизненно важный период поддержки. И эта дополнительная поддержка — то, на что натыкается большое количество компаний.
Классический сценарий таков: игнорируя необходимость будущей поддержки и консультаций специалистов, заказчик выбирает самый быстрый и дешевый вариант на самой неподходящей технологии. Неправильный выбор и сжатые сроки приводят к плохому качеству кода и работе по принципу «вставим сюда костыль, потому что не успеваем». В дальнейшем поддержка такого кода, внедрение новых функций и доработок будут стоить намного дороже. В то же время проект без хотя бы минимальной поддержки через год-два обречен на упадок и стагнацию: ИТ-сфера непрерывно развивается, предлагая все новые и новые решения старых проблем, мгновенно становящиеся стандартом. За примерами далеко ходить не надо — достаточно открыть любой сайт, который был запущен десять лет назад и с тех пор не поддерживался и не обновлялся, и посмотреть, какие решения для веб-разработки использовались в тот период. Как минимум они вызывают ироническую улыбку, а чаще — обиду и недовольство.
Этот простой и абсолютно прозрачный способ проверки, описанный нами, нужен для того, чтобы избежать ситуаций, когда вас уговаривают создать что-то на «удобном» для исполнителя или советника языке. Например, если кто-то уговаривает вас написать мобильную игру для Android на Python или убеждает вас, что вместо прозрачного и понятного JavaScript или PHP вам обязательно стоит внедрить немного устаревший Ruby on Rails, дорогой в плане зарплаты, или попробовать ныне модный язык.
К мнению экспертов и опытных разработчиков все же стоит прислушаться, так как это их территория, но простой перечень факторов «площадь, гибкость, время, производительность, комьюнити» поможет либо выявить попытку наглого читерства, либо предотвратить грубый ошибка, игнорируя мнение профессионалов.
Будь осторожен.
Первоначально опубликовано на https://www.coodingdessign.com 23 ноября 2020 г.