Як вибрати технологію для великого і не дуже великого веб-проекту


Розповідає Микита Семенов, CEO SECL Group


За роки роботи я часто чув питання про вибір технологій для того або іншого веб-проекту. Хтось запитує у нас, як у розробників, як правильно, а хтось приходить і просить зробити на якійсь конкретній технології.

Проблема в тому, що більшість вибирають технології з суб’єктивних причин і доки я не чув гідного і виразного міркування, яке дозволить вибрати технологію об’єктивно, грунтуючись на фактах, а не бажаннях. Навіть небагато IT- шники можуть правильно вибрати технологію, адже для цього треба: розуміти специфіку проекту, мати багаторічний досвід розробки на декількох мовах, знать, як влаштовані подібні проекти і так далі

Але перш, ніж щось вибирати, давайте подивимося, які технології бувають, чим вони відрізняються і в яких випадках яку технологію вибрати.

Як найчастіше вибирають технологію зараз:

1. Вона мені подобається
2. Знайомий порадив
3. Прочитав в Інтернеті
4. На цій технології зроблений аналогічний сайт

У чому тут проблема:

1. Подобається. Дуже суб’єктивно. А що, якщо за вимогами вона не підходить? Чи на ній дуже дорогі і рідкісні фахівці? Чи вона взагалі помирає?

2. Знайомий. Звичайно це той знайомий, який “трохи краще” розбирається в ИТ, ніж той, кому він радить. І навіть якщо він програміст з досвідом, він не може знати усіх рішень на усіх популярних мовах. Адже ніхто не запитує, за якими критеріями вибирав цей знайомий. Якщо цей знайомі не CTO Google, я б так просто не довіряв такій рекомендації.

3. Прочитав. Тут вже краще, можна знайти різні порівняння і аргументацію. Але знову ж таки, щоб розібратися в усіх рішеннях людині, нехай навіть з міцними знаннями в розробці, треба час. А без знань в розробці усі прочитані технічні огляди нічого не коштують.

4. Аналог. Більшість популярних сайтів написана на тих або інших технологіях тому, що так “історично склалося” . Якби Facebook зараз вибирав технологію для себе, я сумніваюся, що він узяв би за основу PHP. А ще може бути, що технологія вже застаріла, її продавили на основі минулих 3х пунктів, вибрали якусь розрекламовану технологію, а не дійсно ефективну і так далі. Ви навряд чи можете знати реальні причини вибір технологій в інших проектах. Оптимальні технології використовуються украй рідко в аналогічних проектах.

Таким чином, жоден з вищеперелічених методів вибору технологій розробки не відповідає критеріям об’єктивності. Тому варто спочатку визначити ці критерії, а вже потім підбирати по них технічну платформу. Нижче я спробую виділити дійсно важливі для проекту критерії, на яким ми і грунтуватимемося.

Важливі критерії при виборі технологій :

  1. Розмір і тип проекту
  2. Складність проекту
  3. Швидкість розробки
  4. Вартість фахівців
  5. Доступність фахівців
  6. Доступні інструменти розробки
  7. Наявність готових рішень
  8. Гнучкість рішення
  9. Наявність широкого співтовариства
  10. Відмовостійкість рішення
  11. Тренд його розвитку
  12. Наявність детальної документації
  13. Вартість підтримки
  14. Вимоги до навантажень
  15. Вимоги до безпеки
  16. Кроссплатформенность
  17. Можливості інтеграції з іншими рішеннями

Вибираючи технологію за такими критеріями ми зможемо добитися об’єктивного вибору і тим самим заощадити собі час і гроші.

Які бувають проекти

До технологій ми ще повернемося, а доки давайте розберемося, які бувають проекти. Часто тип проекту говорить сам за себе і можна відразу сказати, що підійде: або вже готове рішення, або хоч би в яку сторону треба рухатися.

Складність проекту

  1. Прості (візитки, лендинги, прості інтернет-магазини, прості застосування) – такі рішення зазвичай робляться на тематичних коробкових рішеннях, CMS або шаблонах.
  2. Середні (складні інтернет-магазини і маркетплейсы, портали національного масштабу, різноманітні сервіси, просунуті застосування) – такі рішення зазвичай робляться на фреимворках.
  3. Складні (величезні портали, соціальні мережі, інноваційні і нетипові рішення) – ядро таких проектів зазвичай розробляються на чистій (нативному) мові програмування.

З тематики: інтернет-магазини, дошки оголошень, соціальні мережі і так далі. Для більшості популярних тематичних рішень вже давно є коробкові продукти і, якщо ми не намагаємося зробити якогось монстра, то правильніше буде вибрати саме їх. Рішень дуже багато, все в одній статті описати неможливо.

Мови програмування

У технологіях я б виділив 3 рівні абстракції :

  1. Чиста мова – це матеріал, з якого можна зробити все, що завгодно. Обмежують нас тільки можливості мови. На чистій мові зроблені усі найбільші сайти світу з відвідуваністю в сотні мільйонів і мільярди користувачів, такі як: Instagram, YouTube, Pinterest, Tumblr, Dropbox, Twitter, Facebook, Amazon, Digg, LinkedIn і інші. Більше того, найбільші проекти у світі навіть створюють нові технології для себе, оскільки вже існуючі їх не влаштовують.
  2. Фреимворк – це деяке середовище розробки для програміста з готовими правилами і інструментами. Фреимворк з одного боку допомагає і прискорює розробку, а з іншою накладає певні обмеження. На фреимворках робляться проекти середньої складності з відвідуваністю в мільйони.
  3. CMS – це вже готове рішення, конструктор, в якому ми по частинах збираємо потрібний проект. Його швидше не програмують, а настроюють. Обмежень тут величезна кількість, вийти за межі коробки складно і неефективно. На CMS робляться прості сайти з відвідуваністю до мільйона користувачів в місяць.

Частіше всього один рівень абстракції базується на іншому. Тобто на чистій мові роблять фреимворки, а на фреимворках роблять CMS. Для кожної популярної мови є багато різних фреимворков і CMS, але про це пізніше.

Сьогодні є величезна кількість різних мов програмування, на яких роблять сайти. І, більше того, на усіх популярних мовах є приклади величезних сайтів. Якщо 10 років тому, говорячи про технології великих сайтів, усі говорили переважно про Java, то сьогодні це може бути майже будь-яку мову і затверджувати, що сайти робляться на якійсь конкретній мові – стереотип. Цей пов’язаний з розвитком самих мов, за останнє десятиліття багато хто сильно просунувся в розвитку і отримав широкі можливості. Звичайно, кожна мова чимось відрізняється і вибираючи ми знову ж таки повинні керуватися об’єктивними критеріями з оглядкою на завдання проекту.

Чим більше проекту, тим більше стек технологій, який в нім використовується. У величезних порталах може використовуватися відразу декілька мов програмування. Знову ж таки, ми приходимо до об’єктивних критеріїв вибору технологій. Часто одна мова може добре робити одне завдання, а інший – іншу. Такі проекти можуть бути на стільки величезними, що його частини можуть працювати на різних серверах, з різними доменами (піддоменами) і різними технологіями. Не слідує бояться вінегрету технологій у великому проекті, хоча і допускати його треба тільки коли це дійсно необхідно, а також пам’ятати, що далеко не усі технології сумісні. Найяскравіший приклад використання різних технологій – Google. Він на стільки великій, що різні його частини написані на C/C++, Java, Python, JS і інших мовах. Більше того, Google активно створює нові технології, як, наприклад, популярний нині AngularJS.

Спробую дати коротку характеристику кожній з популярних мов :

  1. PHP – його використовують в основному для простих і середніх проектів. Дуже багато коробкових рішень. Відносно дешеві програмісти. Антитренд останніх років, хоча з виходом останньої версії мови під номером 7, він отримав дійсно потужні можливості.
  2. Python – сучасна мова, розробка на нім швидка і якісна. Використовують його для середніх і великих проектів. Програмістів знайти проблематично і коштують вони не дешево.
  3. Ruby – сучасна мова, розробка на нім так само швидка. Його використовують в основному для розробки простих і середніх проектів, часто розробляють стартапы. Програмістів також мало і вони дорогі.
  4. Java – розробка на нім дуже довга і дорога. Його використовують в основному для великих проектів із специфічними вимогами. Проте є найпопулярнішою мовою програмування у рейтингу TIOBE за станом на березень 2016.
  5. C# – аналог Java, також використовують для великих проектів, частина у сфері FinTech.
  6. JavaScript – дуже швидко розвивається, тренд останніх років і найпопулярніша мова програмування у рейтингу Redmonk за станом на червень 2016. Величезна кількість напрацювань і можна писати все, що завгодно, навіть ігри. Його використовують для середніх і великих проектів, але дійсно потужні можливості ця мова отримає нещодавно, тому прикладів великих проектів доки мало, фахівці найдорожчі і знайти їх найскладніше.

Я описав найпопулярніші мови, які сьогодні використовуються під веб. Є багато нових мов, які дуже швидко ростуть, зокрема Scala і деякі інші. Але доки вони досить молоді і сирі. Я б не порекомендував бігти за модою і писати на них, поки вони не розвинуться в щось більше.

Приклади великих сайтів :

  • PHP: Facebook, Вконтакте, Кінопошук
  • Python: Instagram, Pinterest, Reddit
  • Ruby: 500px, Groupon, Airbnb
  • Java: Ebay, Amazon, Alibaba
  • C#: Guru, Stack Overflow, Bank of America
  • JS: LinkedIn, Walmart, PayPal

Ці приклади відмінно показують, що великі сайти можуть бути написані на різних мовах, і це нормально. Знову ж таки, приходимо до того, що вибирати технологію треба під вимоги, керуючись об’єктивними причинами.

Фреймворки і платформи

Це деяке середовище розробки для програмістів, де є готова інфраструктура і ряд готових функцій із стандартними рішеннями типових завдань. Такий собі полуфабракат, з якого можна зробити цукерочку. На кожній мові є багато різних фреймворков. Є як загальні, які створювалися для розробки будь-яких рішень, так і спеціалізовані, під вузькі завдання. Наприклад, Sylius – спеціалізований E – commerce фреймворк на основі Symfony. Також є ті, на яких робляться великі і складні рішення, а інші для цього не призначені. Нижче я опишу популярні фреймворки для кожної з мов, на яких можна писати великі і складні рішення.

На фреймворках розробляються досить великі і складні сайти з унікальним функціоналом. Це значно швидше і дешевше, ніж на чистій мові, але при цьому таке рішення дозволяє розробляти дійсно складні речі і оптимізувати усе це під навантаження. Крім того, це майже завжди безпечніше, ніж будь-хто коробкова CMS.

Популярні фреймворки і платформи :

  1. PHP: Symfony, Laravel
  2. Python: Django
  3. Ruby: Ruby On Rails
  4. Java: Spring
  5. C#:.NET
  6. JS: Node.js, AngularJS

Найбільше фреймворков на PHP і на цій мові є, з чого вибирати, але дійсно функціональних не так багато. Менше на інших мовах, а на деяких дійсно якісних фреймворков взагалі всього один, як у мови Ruby. У Java взагалі дуже багато різних фреймворков для різних цілей, і не лише для сайтів. Все ці фреймворки щорічно розвиваються, виходять усі нові і нові версії, одні фреймворки обганяють інші. Наприклад, Laravel тільки в останні декілька років вийшов на перше місце за популярністю, хоча найскладніші сайти досі робляться на Symfony.

.NET і Node.js – це цілі самостійні платформи, які базуються на певних мовах, але мають дуже широкі можливості.

CMS і CMF

Це готове програмне забезпечення, яке треба тільки настроїти, рідше – дописати / переписати якусь з частин. Таких рішень дуже багато на будь-якій мові, але історично так склалося, що в основному все популярні CMS зроблені на PHP. Тут справа в розвиток мов, раніше прості сайти, для яких і створювалися CMS, писалися на PHP. Я ще застав ті часи, коли CMS майже не було, були скрипти – окремі готові частини різних сайтів. Пізніше ці скрипти збирали в коробковий продукт, який був покликаний вирішити потреби 90% простих сайтів. Так і вийшло, що основні CMS зроблені на PHP. Сьогодні CMS на інших мовах розвиваються слабо, тому, що вже є сильні конкуренти на PHP, а простому сайту мова не грає великої ролі, тому усі дивляться на можливості цих готових продуктів.

CMF – якщо говорити звичною мовою, це щось середнє між CMS і фреймворком по можливостях. Зазвичай CMF використовують для найскладніших сайтів з цієї категорії. Цей підхід дозволяє позбавиться від зайвих частин CMS, які не потрібні конкретному проекту.

CMS бувають різні за призначенням: загальні, для інтернет-магазинів, для блогів і так далі. Різні за умовами використання: платні і безкоштовні. Для кожної популярною CMS є купа різних платних і безкоштовних модулів, які легко підключати і використати.

Маленькі сайти, які в основному потрібні для малого бізнесу, майже завжди використовують CMS. Це дозволяє дуже сильно економити час на розробку. Крім того, для налаштування таких рішень не потрібні дорогі програмісти, зазвичай це можуть робити новачки в програмуванні, принаймні саме налаштування, якщо вже треба писати код, тут складніше.

Саме у роботі з CMS виникає найбільше нерозуміння серед кінцевих замовників таких рішень. Будь-яка CMS – це тонни готового програмного коду, на все випадку життя. У коробковому постачанні йдуть десятки і сотні модулів. Усе це дуже сильно обмежує фахівців. Такі рішення сильно ” гальмують”, вони абсолютно не гнучкі, їх дуже легко зламати, особливо безкоштовні CMS. Ще часто зламують CMS через модулі сторонніх розробників, в яких критичні уразливості, тому що ми ніколи не знаємо, якого рівня програміст писав той або інший модуль. Тобто будь-яка CMS НЕ розрахована для великого і складного сайту. Вона не можуть витримати великі навантаження. Це рішення не безпечне, щоб не говорили розробники конкретної CMS.

Я бачив рішення майже на усіх популярних CMS, з багатьма за більше, ніж 10 років роботи, довелося попрацювати особисто. Частина з них популярна в рунеті, а частину знають в основному на заході. На використовувані в них мови CMS розбивати немає сенсу, з причин, описаних вище. Краще сказати декілька слів про кожну популярну CMS:

  1. WordPress – колись блоговый движок, зараз на ній робляться майже будь-які сайти, включаючи магазини. Одна з найпопулярніших CMS у світі, є приклади досить відвідуваних сайтів. На ній часто роблять інформаційні сайти, у тому числі різні ЗМІ. Система безкоштовна.
  2. Joomla! – CMS загального призначення. Якістю особливо не відрізняється, на ній роблять дуже маленькі сайти і зазвичай дешевше за усі інші варіанти, оскільки саме з цією CMS починають вчитися багато початкуючих програмістів. Система безкоштовна.
  3. Drupal – це вже CMF для загального призначення, з недавнього часу поставляється зі вбудованих фреймворком Symfony. Досить потужна, на ній є відомі сайти, наприклад, офіційний сайт Білого Дому. Система безкоштовна.
  4. Magento – найпопулярніша система управління для інтернет-магазинів у світі. Досить потужна і складна. У рунеті використовується рідко, в основному на заході.
  5. PrestaShop – одна з найпопулярніших CMS для магазинів у світі. Теж досить потужна, використовують в основному на заході. Система безкоштовна.
  6. OpenCart – ще одна популярна система для інтернет-магазинів, але її, навпаки, більше використовують в рунеті, чим на заході. В основному для маленьких і нескладних магазинів. Система безкоштовна.
  7. 1С-Битрикс – дуже распиаренная CMS загального призначення, номер 1 в рунеті. Можливості дуже широкі. На ній часто намагаються робити великі і складні сайти, а після певного порогу у відвідуваності переписують їх на інших технологіях. Багато хто вважає, що тільки ця CMS може інтегруватися з 1С, що не є правдою, оскільки все перераховані CMS з цього списку можуть інтегруватися з 1С, для цього у усіх CMS є спеціальні модулі. Система платна.

З усіма перерахованими CMS я працював. В основному з боку розробника. Точно НЕ рекомендую – Joomla, з іншими можна працювати. Для магазинів краще вибирати спеціалізовані, а не загальні CMS. Окрім 1С-Битрикс в рунеті є ще аналогічні комерційні CMS, вони багато в чому схожі. У кожної з систем є свої особливості, але усі вони не призначені для великих і складних проектів, головне це не забувати.

Шаблони

У останні 5 років дуже активно розвивають шаблонні рішення. Це ще на одну сходинку вище, ніж CMS. Якщо CMS – це конструктор і його треба настроювати, то шаблони – це вже готові рішення під типові випадки. Наприклад, в кожному місті є свої ресторани, таксі, клініки і так далі. Для усіх цих типів малого бізнесу треба приблизно одно і теж. Тому, можна просто вибрати готовий тематичний шаблон, замінити в нім логотип, кольори і контент. За бажання такі шаблони можна допрацьовувати на розсуд власника.

Переваги таких рішень в тому, що вони дуже дешеві і їх можна запускати вмить. Але при цьому, такі рішення не враховують особливостей бізнесу і конверсія буде не дуже високою.

Є спеціальні каталоги шаблонів: TemplateMonster, ThemeForest та ін. Часто зустрічаються онлайн-конструктори, у тому числі тематичні: Wix, PageCloud та ін.

Мобільні застосування

У мобільних застосуваннях останнім часом використовується два підходи: нативна розробка і кроссплатформенные технології. Нативна ведеться на оригінальних мовах програмування, зокрема Swift (для iOS, раніше був Objective – C) і Java (для Android). Кроссплатформенных технологій зараз досить багато, вони є на базі різних мов програмування, зокрема: Apache Cordova, React Native та ін. Деякі краще, деякі гірше. У будь-якому випадку, складні застосування завжди пишуться на нативних технологіях. З кроссплатформой часто виникають проблеми, аж до того, що деякі функції просто не реалізовуються на тих або інших кроссплатформенных технологіях, сильно вантажиться оперативна пам’ять пристрою, швидко сідає батарея і так далі

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

Стек технологій у великих проектах

Вище я описав різні мови і фреймворки, які використовуються у великих проектах, проте, якщо придивитися до дійсно великих проектів, там можна знайти цілий комплекс мов і технологій. Майже все більші сайти використовуються в основі одна мова і ще декілька додаткових. Теж саме з базами даних: для одних завдань можуть використовуватися реляційні, а для інших нереляційні бази, і усе це органічно поєднується у рамках одного проекту.

Вибір технологій залежить від пропонованої архітектури проекту. Саме архітектор продумує основні блоки майбутнього сайту. Яка мова ляже до основу, чи буде він нативний або фреймворк, яку систему кешування вибрати, які бази даних, як усе це пов’язано і так далі

Для прикладу розглянемо технології Instagram (дані Insight IT) :

  • Ubuntu Server 14.04 LTS – основна серверна операційна система
  • Python – основна мова програмування серверної частини
  • Django – фреймворк
  • nginx – другий рівень балансування HTTP- запитів, що входять
  • gunicorn – WSGI- сервер
  • HAProxy – балансування навантаження усередині системи
  • PostgreSQL – основне сховище даних
  • postgis – підтримка гео-запросов
  • pgfouine – звіти на основі лігв
  • pgbouncer – створення пулу з’єднань
  • Redis – додаткове сховище даних
  • Memcached – кешування
  • Gearman – черга завдань
  • Solr – гео-поиск
  • munin, statsd, pingdom – моніторинг
  • Fabric – управління кластером
  • xfs – файлова система

І це цілком нормальний стек технологій. Сам Instagram не найбільший і складний сервіс у світі.

Вартість фахівців

Один з найважливіших чинників вибору технології являється вартість і доступність фахівців, тому що саме це сама витратна частина у будь-якому проекті. У рунеті є тільки одна пузомерка по зарплатах – я відфільтрував по Києву, рівень Senior, досвід 3-5 років. Порівняємо середні значення.

Зарплати:

  1. C# – 3072$
  2. Java – 3300$
  3. JS – 3500$
  4. PHP – 2780$
  5. Python – 3000$
  6. Ruby – 3000$
  7. Scala – 3900$

У США трохи інша картина:

Тепер перекладемо цифри людською мовою. Java хоч і не нова мова, але фахівці на ній завжди були одними їх найдорожчих. PHP завжди був найдешевшим, та і фахівців на ринку дуже багато. У порівняння я вніс ще і Scala як один з новітніх і трендовых мов, з цієї причини він дорожчий за усіх. Ще дорогий JS, цей пов’язаний з його бурхливим зростанням останніми роками і зростаючою популярністю Node.js, а також AngularJS.

Таким чином, якщо ми хочемо економити – те краще дивитися на PHP, фахівці дешеві, а ком’юніті велике. А якщо хочемо найякісніше – те дивимося на Scala, який називають майбутньому веб-розробки, але, правда, на ній знайти фахівців майже неможливо і напрацювань просто немає.

Ще важливим параметром буде швидкість розробки. Адже важлива не лише зарплата програмістів, але і швидкість розробки. Якщо не враховувати вже існуючі напрацювання, то одним з найшвидших в розробці буде Python і Ruby, а найповільніший – Java. До речі, з цієї причини за останні 10 років майже не вийшло нові мегапроекти на Java, зате вийшло багато проектів на Python, про що я розповім нижче.

Тренди

Вибираючи технологію, нам треба дивитися вперед. Особливо, якщо мова про великий проект. Усі технології дуже швидко розвиваються, виходять усі нові і нові версії. Мови сильно міняються кожні 5-7 років, фреймворки – кожні 2-3 роки, а CMS – кожні 1-2 роки. Важливо вибрати не просто хорошу технологію сьогодні, а передбачити тренди розвитку так, щоб залишитися на коні через декілька років. Інакше, кінець кінцем, доведеться переписувати проект, що завжди дуже проблематично.

Є всілякі дослідження, які нам можуть підказати деякі статистичні викладення. Наприклад, дослідження TIOBE Index показує цікаву статистику:

За результатами різних досліджень можна виділити явних лідерів по зростанню – це JS (версія ES6 і вище) і мультипарадигмальные мови, зокрема Scala. До речі, саме Scala вважається наступником мови Java і багато в чому на нього схожий. Також не погано себе показує Python.

Антитренди тримають ряд старих мов і PHP. Правда, нещодавно вийшла 7я версія PHP, в якій виправлені багато серйозних недоліків. Так що, я думаю, ми скоро побачимо новий виток розвитку PHP. Ще багато великих проектів переписуються з Ruby на інші мови, теж деякий антитренд.

Для ілюстрації подивимося, яких фахівців бракує в США:

Саме це можна вважати реальною картиною трендів, які ми бачимо і у нас.

На чому робилися великі проекти за останні 10 років?

  1. Airbnb – Ruby
  2. Instagram – Python
  3. Pinterest – Python
  4. Foursquare – Python
  5. Groupon – Ruby → JS
  6. Twitter – Ruby → Scala
  7. Uber – JS

Це вже не теоретична статистика, а реальна практика. Python і JS дуже добре себе показують.

Вартість підтримки

Безумовно, важливий критерій вибору технології – це вартість підтримки, про яку мало хто замислюється на початку розробки. Зазвичай усі мислять категоріями вартості години підтримки, що в корені неправильно. Нам важливі декілька параметрів: вартість години, кількість годин, офіційна підтримка технології, доступність фахівців, правильний підхід до розробки і деякі інші.

Також слід дивитися на версію мови, фреимворка, CMS. Треба завжди використати саму останню стабільну версію, щоб вона не застаріла до виходу проекту в продакшн. При появі нової версії, треба відразу розглядати можливість перекладу проекту на цю версію. Тому що, якщо пропустити декілька версій, потім будуть проблеми зробити різке оновлення.

Так що вибрати?

Підведемо підсумок. Для простих сайтів найчастіше чудово підходять коробкові рішення і шаблони. Складні сайти робляться тільки на фреимворках або навіть чистих мовах програмування. Робити можна на дуже різних мовах, мова вибирається під проект. Прості мобільні застосування можна робити на кроссплатформенных технологіях, а складні зазвичай робляться на рідних технологіях. Ну і, вибираючи платформу, завжди варто керуватися об’єктивними критеріями, які я описав в статті.

підтримувати.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *