Як ми за допомогою PHP та Laravel запустили стартап за три місяці

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Привіт, мене звати Володимир Гуц. Обіймаю посаду Head of Development у стартапі Brighterly від венчур-білдера SKELAR. Ми створюємо онлайн-школу з вивчення математики для дітей від 6 до 17 років на ринку США. За 2+ роки роботи над платформою вдалось досягнути класних показників — у нас стали навчатись понад 2 тис. дітей.

У статті хочу поділитись дієвими практиками зі швидкого запуску стартапу, яким я навчився, будуючи Brighterly. Ми розглянемо:

  • архітектурні підходи та лайфхаки з побудови Back-end;
  • інтеграцію Back-end з Front-end;
  • те, як швидко та якісно побудувати деплой у продакшн;
  • готові рішення, які можуть бути корисними.

Вимоги

Спочатку визначимо, що є важливими саме на першому етапі побудови стартапу.

Міфи у побудові стартапу

Коли інженеру ставлять задачу запустити стартап, то зазвичай на думку спадає наступне:

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

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

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

Реальність у побудові стартапу

Реальність полягає у тому, що на старті важливими є інші речі:

Виживання. Якщо ми не встигнемо швидко побудувати MVP, то стартап просто не виживе, не зможе вийти з «долини смерті» (турбулентний період розвитку, коли проєкт запустився, але ще не почав отримувати прибуток) та не доживе до трафіку, навантаження тощо.

На нас очікує багато кардинальних змін. Те, що ми закладаємо у продукт на старті, може відрізнятись на 90% від того, що врешті побудуємо.

Гнучкість. Треба бути готовим до будь-яких викликів, тому краще сфокусуватись на простоті.

Time to market. Виживання залежить від того, наскільки швидко ми зможемо доставляти наш код у Production. Цього можна досягти, якщо все побудовано дуже просто. Ми у Brighterly боролись за секунди деплою, тож навіть 4 хвилини для нас було занадто довго.

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

Усі речі, які я назвав «міфами», матимуть сенс трохи згодом, коли нам вдасться пройти цю «долину смерті».

Tech Stack

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

  • PHP 8.1
  • Laravel 9
  • MySQL 8
  • VueJS 3

Чому PHP? Ця мова програмування не може похвалитись класними показниками за performance, він не має багатопоточності з коробки та не є асинхронною мовою, але на старті все це й не потрібно (памʼятаємо про міфи та реальність).

То що ж корисного є у PHP та заради чого ми його взяли:

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

Чому взяли Laravel:

  • ТОП-1 framework у світі PHP;
  • на ньому теж можна швидко стартанути;
  • багато функціоналу Laravel має з коробки (черги тощо);
  • команда мала відповідний досвід.

Архітектура

У нашому продукті досить непроста архітектура. Ми одразу розуміли, що треба будувати три окремих продукти:

  • Customer Area — зона для батьків і дітей.
  • Tutor Cabinet — зона, де працюватимуть викладачі.
  • Admin Area — адмінська зона, де працюватимуть Support engineers.

Тут перше, що спало б на думку — одразу все ділити на мікросервіси.

Ми ж вирішили, що все буде в одному застосунку. Розподілення зробили всередині застосунку за допомогою роутінгу:

Production

Development

Client Space

app.brighterly.com

app.brighterly-dev.xyz

Admin

app.brighterly.com/admin

app.brighterly-dev.xyz/admin

Tutor

app.brighterly.com/tutor

app.brighterly-dev.xyz/tutor

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

Production

Test environment

Client Area

prod-host/

test-host/

Admin Area

prod-host/admin

test-host/admin

Tutor Area

prod-host/tutor

test-host/tutor

Чому не мікросервіси

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

З мого досвіду:

  • Більшість проєктів, які стартували на мікросервісах, постраждали саме через них та не вижили.
  • Більшість успішних історій про мікросервіси починались з моноліту, який став великим та був розділений.

Back-end tips and tricks

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

  • Arch Approach: Back-end Layers
  • Extended Query Builder
  • Repositories
  • Events & Listeners

Arch Approach: Back-end Layers

На Back-end ми взяли шарову архітектуру. А саме чотири шари:

  1. Presentation Layer — шар інтерфейсу.
  2. Business Logic Layer — шар бізнес-логіки.
  3. Service Layer — сервісний шар.
  4. Data Layer — шар роботи з даними.

Використали головні концепції з книжки (перші два з наступного списку), а ще додали третю, власну концепцію:

  1. Шар вищого рівня користується послугами шару нижчого рівня.
  2. Шар нижчого рівня не знає про шар вищого рівня.
  3. Для спрощення вищий шар може пропускати середній та звертатись до нижчого.

Це допомогло нам уникнути технічного боргу, а з іншого боку — сильно не заморочуватись із побудовою правильної академічної архітектури.

Extended Query Builder

Цей патерн допомагає елегантно та міцно вибирати дані з бази. Ідея полягає у тому, щоб взяти стандартний QueryBuilder та розширити його власними методами, які потрібні для конкретної сутності.

Покажу на прикладі сутності Booking (у нашому продукті це урок).

Ось так відбувається обʼявлення в моделі:

class Booking extends Model
{
   /**
    * @return BookingQueryBuilder
    */
   public function newEloquentBuilder($query)
   {
       return new BookingQueryBuilder($query);
   }

Як ви бачите, взагалі нічого складного.

Сам білдер теж виглядає дуже просто:

class BookingQueryBuilder extends Builder implements Searchable
{
   public function type(BookingType $type): self
   {
       return $this->where('type', $type);
   }

   public function demo(): self
   {
       return $this->whereIn('type', BookingType::demo());
   }

   public function withFeedback(): self
   {
       return $this->whereNotNull('tutor_feedback');
   }

Наявність такого білдера дуже класно спрощує клієнтський код. Ось приклад саме клієнтського коду:

return Booking::query()
   ->tutorId($tutor->id)
   ->paid()
   ->notFinishedForCustomer()
   ->ongoing(now()->addMinutes($shiftMinutes))
   ->oldestFirst()
   ->first();

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

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

Спробуємо прочитати той код, який побачили. «Беремо уроки конкретного викладача, тільки платні, ще не закінчені для клієнта, які наближаються та почнуться через +5 хвилин від зараз, беремо найстаріший перший урок».

Це я прочитав код та переклав з PHP на українську.

Repositories

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

Ми першочергово використовуємо репозиторії для оновлення даних. Тому моделі відіграють у нас роль сутностей (Entities), а зміна та збереження відбуваються через репозиторій. Отже, ми трошки виправляємо проблему того, що модель Eloquent порушує принцип Single Responsibility з SOLID. А додатково отримуємо важливу можливість мати івенти у системі та будувати складну логіку завдяки ним (про це трішки згодом).

Як в нас виглядає метод update в репозиторії:

class SubscriptionsRepository
{
   public function update(Subscription $subscription, array $data): Subscription
   {
       $subscription->fill($data);

       $this->calculateTotal($subscription);

       $originalData = $subscription->getOriginal();
       $changedData = $subscription->getDirty();
       $subscription->save();

       event(new SubscriptionUpdatedEvent($subscription, $originalData, $changedData, true));

       return $subscription;
   }

Як ми бачимо, репозиторій є обгорткою моделі, але крім самого збереження він робить додаткову роботу (у цьому разі калькулює totals у підписці) та кидає івент (SubscriptionUpdatedEvent), на який потім можна завʼязати будь-яку іншу бізнес-логіку.

Event & Listeners

Якщо ми вже маємо репозиторії та кастомні івенти, логічним продовженням є використання слухачів цих івентів.

Але спочатку невеликий відступ... У будь-якому продукті буде певна непроста бізнес-логіка та інтеграція між різними частинами системи. Зазвичай цю інтеграцію роблять «у лоба», тому код стає схожим на спагеті-код. Я пропоную підхід, де завдяки Events та Listeners можна розвʼязувати складну інтеграцію між частинами системи. Так ми можемо робити складну логіку, але водночас код залишиться простим та зрозумілим.

Головне у цьому підході — щоб івенти були привʼязані до сутностей, з якими подія відбувається:

Тут важливим є те, що івент CustomerUpdatedEvent розташовано у неймспейсі Customer. Заходячи у цей неймспейс, ми можемо побачити всі івенти, які є у цій сутності.

А ось слухачі вже мають бути згруповані у бізнес-фічі. Наприклад:

Бачимо, що в нас є фіча Autoassign (у ній ми автоматично вибираємо демо-користувачу вчителя). Усіх слухачів, потрібних для цієї фічі, ми «поклали» в один спільний неймспейс «Autoassign». Але слухати ці слухачі можуть уже що завгодно. У цьому разі ми слухаємо івенти «BookingActivityUpdated» та «TutorCheckIn».

Якщо відкрити слухача, він теж виглядає дуже просто:

class BookingActivityUpdatedListener
{
   public function handle(BookingUpdatedByCustomerEvent $event): void
   {
       if (
           $event->booking->activity_status === BookingActivityStatus::WAITING
           && $event->booking->tutor_id === null
       ) {
           dispatch(new AssignTutorToBookingJob($event->booking));
       }
   }

Є перевірка вхідних параметрів та запуск фічі. Саму фічу в нашому випадку ми винесли в окрему Job.

Отже, завдяки правильному використанню Events & Listeners ми можемо звʼязувати будь-які частини системи, будувати складну бізнес-логіку і робити це просто! І наш код буде виглядати адекватно, його буде легко підтримувати й нескладно розібратись, як воно працює.

Хочу навести приклади фічей у нашому продукті, що реалізовані завдяки Event & Listeners:

  • Коли замовлення сплачено, треба нарахувати баланс користувачу.
  • Після успішного закінчення уроку потрібно списати баланс з рахунку користувача.
  • Коли перенесли урок на іншу дату, треба оновити івент у Google-календарі клієнта.
  • Після успішного закінчення демо-уроку треба згенерувати сертифікат та відправити його клієнту.

Комунікація між Back-end і Front-end

Ще одна важлива частина швидкої побудови стартапу — правильно зроблена інтеграція між Back-end та Front-end.

Загальноприйнята практика така, що Front-end одразу відділяють від Back-end, кладуть усе в різні репозиторії, на Back-end будується API з Postman, а Front-end використовує це API. Насправді це гарний та правильний підхід.

Але в нього є своя ціна:

  • У вигляді оверхеду на інтеграцію Back-end з Front-end.
  • Та в можливому сепаруванні в команді на Back-end та Front-end. Усі знають приклади баталій та пінг-понг-ігор між Back-end та Front-end.

Ми у Brighterly пішли шляхом монолітного застосунку та вирішили досить просто зінтегрувати Front-end та Back-end у межах одного застосунку, але так, щоб спілкування відбувалось у json-форматі (як це було б з API).

В монолітному підході є свої проблеми:

  1. Front-end цвяхами прибитий до бекенду. Та перероблювати UI й не чіпати при цьому Backend-end — боляче.
  2. При масштабуванні команди стане важко підтримувати монолітний продукт.

На старті ми це розуміли, але все ж вирішили піти таким шляхом. Бо він дає дуже швидкий старт та не блокує можливість відокремити Front-end від Back-end в майбутньому.

Крута новина полягає у тому, що для Laravel вже є класне рішення, і це IntertiaJS.

Переваги Inertia:

  • Маємо повноцінний Front-end, написаний на Vue або React.
  • Водночас не треба інтегрувати Front-end-частину з Back-end.
  • Це дає швидку розробку.
  • Також маємо просте локальне оточення: потрібно встановити один застосунок, але не треба інтегрувати Back-end з Front-end тощо.

Хочу навести приклади з сайту Inertia. Ось так виглядає контролер (файл UsersController.php):

class UsersController
{
    public function index()
    {
        $users = User::active()
            ->orderByName()
            ->get(['id', 'name', 'email']);

        return Inertia::render('Users', [
            'users' => $users
        ]);
    }
}

А ось так виглядає в’юшка (файл Users.vue):

<script setup>
import Layout from './Layout'
import { Link, Head } from '@inertiajs/vue3'

defineProps({ users: Array })
</script>

<template>
  <Layout>
    <Head title="Users" />

    <div v-for="user in users" :key="user.id">
      <Link :href="`/users/${user.id}`">
        {{ user.name }}
      </Link>
      

<div>{{ user.email }}</div>

    </div>

  </Layout>
</template>

Як бачимо, з контролера просто повертаємо звичайний Json, але обгорнутий в Inertia::render(). У в’юшці отримуємо пропси.

Водночас Insertia робить усю брудну роботу під капотом: якщо це перше завантаження сторінки, то вона відрендерить HTML, а пропси закодує у data-атрибут.

Якщо ж сторінка провантажена, і ми переходимо з іншої сторінки за посиланням, тоді цей контролер просто поверне json з пропсами.

Що нам дає такий підхід:

  • На Front-end маємо повноцінний SPA (Single-Page Application), але будуємо його з окремих сторінок з окремими в’юшками.
  • Нам не треба будувати окреме API на Back-end.
  • Швидка розробка.
  • Зручно для невеликої команди.
  • Коли зʼявиться потреба, буде можливість легко відокремити Back-end від Front-end.

Deploy

Найпростіший спосіб побудувати деплой — це зробити локальне оточення таким самим, як production environment. Ми брали Docker та Docker Compose. Локальне оточення побудували на Docker, а для прода взяли звичайний сервер на Ubuntu, і там так само підняли проєкт на Docker Compose. Ось так приблизно виглядає наш docker-compose.yml:

services:

 php:
   build: ./infra/docker/php-fpm
   volumes:
     - .:/app
   working_dir: /app
   environment:
     PHP_IDE_CONFIG: serverName=localhost
     PHP_OPCACHE_ENABLE: 0

 php-worker:
   build: ./infra/docker/php-fpm
   deploy:
     replicas: 1
   volumes:
     - .:/app
   working_dir: /app
   command: php artisan queue:listen --tries=2

 nginx:
   build: ./infra/docker/nginx
   volumes:
     - .:/app
   working_dir: /app
   ports:
     - 8080:80

Я розумію, що у такого підходу є багато проблем, але на старті проєкту він працює відмінно:

  • Якщо щось трапилось, розробники зможуть дуже швидко все виправити, бо на проді вони не побачать нічого нового. Там буде все те саме, що й локально.
  • Вам не треба витрачати багато часу на побудову правильної інфраструктури на Kubernetes — лише ще раз розвернути локалку на віддаленому сервері.
  • Якщо сервер «помер», то ми можемо досить швидко підняти новий з докером, спулити туди репозиторій та запустити docker compose up -d. Більші складна інфраструктура на Kubernetes вміє сама автоматично хендлити подібні проблеми, але якщо щось пішло не так з самою інфраструктурою, виправляти таки проблеми вже набагато складніше.

Готові рішення

Іншим важливим моментом під час запуску стартапу є максимальне використання готових рішень. Хочу поділитись невеличким переліком того, що може одразу допомогти та спростити життя, бо у вас не буде необхідності будувати це власноруч:

UptimeRobot — сервіс, який коштує $8 на місяць, та «під ключ» закриває питання перевірки життєздатності вашого продукту. Дуже класно алертить у Slack, якщо щось впало. Просто, дешево, але ключову проблему алертингу вирішує.

Digitalocean — cloud. Недорогий та зручний Cloud, у якому можна швидко розібратись. Та з коробки будуть усі необхідні графіки, що допоможуть дивитись на те, що відбувається з Back-end. Ось приклад графіків:

Також DigitalOcean має алерти з коробки й вміє зручно писати про це у Slack. Приклад:

Sentry — збір логів та error traces в одному місці. Дуже легко інтегрується у Laravel та Vue, ви одразу закриваєте питання логів та помилок. Є можливість використовувати Performance-логіку, щоб дивитись, що відбувається під капотом на Back-end. А також встановити опенсорсну версію власноруч, щоб не витрачати гроші та не мати обмеження у кількості помилок. Sentry також може алертити у Slack, коли насипає багато помилок. Приклад:

Google Tag Manager. Будь-якому продукту потрібен маркетинг, а маркетингу потрібні івенти. Можна інтегрувати Google Tag Manager, дати доступ маркетологам, тож вони самі зможуть сетапити будь-які івенти та підлаштовувати маркетинг під них. А ви зможете не витрачати на це багато часу та зосередитись на розробці продукту.

Наступні кроки. Що далі

Kubernetes

Коли ми успішно пройдемо перший етап «виживання», зможемо сфокусуватись на побудові відмовостійкої інфраструктури. Тут нам допоможе Kubernetes. Щоб це було можливим, обовʼязково треба продумати логіку роботи з локальними файлами. Замість них треба використовувати зовнішнє сховище Redis/Memcached. Якщо ви будували застосунок на стандартних механізмах Laravel, варто замінити драйвери з files на redis.

Separate Front-end from Back-end

Коли команда стане більшою, логічним кроком буде відокремити Front-end в окремий репозиторій. На Back-end-частині для цього достатньо прибрати обгортку Inertia та повернути звичайний json.

Automation tests

Обовʼязковою частиною є написання автотестів для функціоналу, що вже працює.

Unit tests класно підходить те, що нам дає Laravel з коробки (тести на базі PHPUnit). Дуже раджу користуватись. Прогон автотестів налаштовуємо прямо в CI та тішимось цьому.

Для фронтових автотестів дуже класно підходить Playwright. Пишеться досить легко та дає змогу використовувати різні мови програмування: Python, Node. Досить неважко інтегрується в CI, при чому не обовʼязково підіймати окремий інструмент по типу Jenkins. Зараз воно запускається у нас безпосередньо в Gitlab CI.

Висновки

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

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

👍ПодобаєтьсяСподобалось27
До обраногоВ обраному14
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Більшість підходів абсолютно правильні, молодці!

А чому взагалі вирішили писати систему з нуля, а не будувати на готовій платформі для онлайн шкіл, хоча б на першому етапі?

Хороший код, але є невеличке дублювання в класі моделі

Дякую! Підкажіть, це ви про аннотацію? Щось передивився та не зрозумів про що ви.

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

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

як тестуальник, я думаю що доцільність існування цієї функції досить сумнівна

Дуже цікава реалізація
І такий момент. Я вже не вперше бачу спробу з Laravel зробити Symfony. Звісно такий підхід має право на життя, але в подальшому коли зміняться розробники, яким потрібно буде його підтримувати — будуть витрачати більше часу. Багато з задач, які вирішуються через розширення Query Builder, можна виконати за допомогою стандартних Scope-методів у моделях Eloquent, що є більш звичним підходом у Laravel. Відповідно, якщо був використаний в роботі більше Eloquent ORM — відпалаб додаткова потреба в використанні ше одного абстрактного шару репозиторіїв.

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

Те що від початку було впроваджено Events & Listeners — однозначно лайк. Це дуже виручає в подальшому.

А стосовно всіх, хто розробляє на Go, Java і так далі — Бізнесу пофіг на чому реалізовувати. Головне все зробити швидко і запустити в продакшн. Та умовна швидкість обробки запитів просто ніщо в порівнянні зі складністю/тривалістю/дороговизною реалізації. Навіть проєкти на Laravel можна гарно маштабувати.

Але реалізація однозначно класна, хоч я особисто для продукту MVP робив би простіше і тільки після підтвердження потипу його апдейтив, скоротивши час запуск ше на 3-4 тижні

99 процентов вообще всех проектов можно успешно делать на вашем стеке. А когда вырастите до продукта в миллиарды долларов, то пофиксите точечно кое где плюсами и можете дальше рубать капусту.

Володимире, дякую за статтю. Виніс для себе деякі інсайти.
Підкажи по таким питанням:
1. Як ви боретесь з автокомплітом в idea при таких викликах:
Booking::query()
адже по анотаціям метод повертає інший інстанс, не BookingQueryBuilder.
2. Чи є у вас обмеження по тому, які логіки мають бути в лісенерах? Чи не можуть вони продукувати інші події?

Вітаю, по першому питанню допоможе phpDoc

/**
 * @method static BookingQueryBuilder query()
 */
class Booking extends Model

п.1 Laravel Idea допомагає на 100%. Та можна викинути мусорні ПХП доки

Мені чомусь здається, що в

То що ж корисного є у PHP та заради чого ми його взяли: ...
Чому взяли Laravel: ...

пункт — команда мала відповідний досвід. має стояти на першому місці.

Супер стаття! Дякую!

Мікросервіси — це добре, але не на старті проєкту.

От прочитають дужни цю статтю і будуть потім пхати мікросервіси у всі свої проєкти. Не робіть так ))))))

А в загалі, стаття класна, і корисна. Без води. Хотів би звернути увагу що, МОЖЛИВО, livewire б ще більш спростив та пришвидшив розробку. Бо не завжди додаток повинен бути SPA. Але, тут я не знаю ж всіх вимог. Та і ваші майбутні плани на розділення додатку на API + SPA як раз через Inertia буде гарно робити.

Як поставили задачу, плюс який досвід у вас є, так ви і зробили. І в мене до цього зауважень або запитань немає. Бізнес працює, а ви як розробник бачите результат. Супер.

Трошки від себе.
Десь в іншій статті казав про репозиторії. Але бачу, що тренд додаткової абстракцій над моделлю це прям канон в Ларавель. Згоден що сам по собі Eloquent порушує SOLID, але ви ж самі сказали, що треба швидкий старт. Тому, як на мене це просто зайвий код. І знову ж таки топлю за Doctrine, бо там це вже є і це по суті і є швидкий старт. Плюс сам писав до цього майже 4 роки на Ларавелі і з часом і з різними проектами і їх складністю почав розуміти, що краще Symfony. Там ви точно зі старту збудуєте такий самий моноліт, можливо навіть набагато швидше. Плюс мені подобається документація Symfony, де навіть на ті ж варіанти кешування є багато адаптерів до будь чого і детальна документація. В Ларавелі ж натомість, якщо чогось немає, починається підбір або пошук dependencies, що займає час на імплементацію. Про кеш це як приклад і до статті відношення немає )

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

В розробці з 2009 го. Бачив багато різного. І скажу одне, що автор і так зазначив. Кінцевий продукт міняється дуже сильно від початкового, бо реальність у багатьох випадках відмінна від очікувань. Останні два роки роблю свої продукти. І перший продукт робив на здавалося ідеальній архітектурі з мікросервісами, оркестрами і spa. Проте роблю я їх сам, і часу пішов рік щоб запустити. Тому хто починає своє — використовуйте по максимуму готові рішення і максимально швидкі для прототипування. А вже потім коли проект почне хоч якийсь вихлоп давати — почнете концентруватись на технічних покращеннях. Головне маркетинг для стартапу. Бо конкурентів валом і всі подібні. Тому мій досвід каже, що не варто заморачуватись над ідеальною архітектурою, вона повинна просто бути конкурентною і все.

Дякую за статтю! Було б ще цікаво почитати про фінансову сторону питання.

Погано, дякую, що не мікросервіси, але все ще погано. Догортав до SubscriptionsRepository просто щоб це побачити.

1. Фреймвор Laravel
Я з ним працював десь у 2015-2016 роках. Багато всього, особливо фасадів і купа проектів, де команди перетворюють лару на симфоні, кожний по своєму. Я розумію, що програмістів, які пишуть на ларі куди простіше найняти за вчорашній хліб без масла, але враховуючи скільки є офиційних туторіалів для архітектури яка є офиційною у сімфоні, то куди простіше і дешевше буде найняти спеціалістів на сімфоні, ніж ларавелівців перенавчати на ваш велосипед і плодити свої костилі.

2. Дякую, що не мікросервіси
Дякую, але і по моноліту є питання. Перший рік це реально рік змін і якщо у вас дійсно немає великої кількості бізнеслогіки то я чарівні інструменти лоукоду, або серверлес, наприклад хасура, фаербейс чи сапабейс, якось він так називається. На моноліті вам їхати від 5 років до довічного, там і той самий моноліт вартує робити з урахванням довгострокової перспективи. Лоукоз ракриває багато кодових проблем і питання з інфраструктурою, зміни робити швидче. Дякую що не мікросервіси)

3. Мова PHP
Я той типовий пихарь, який з пхп перейшов на го. Жодного разу не жалкую.

3.1 Можу авторитетно заявити, що цей перехід в мене і в купи інших спеціалістів, на пхп або з інших мов, зайняв 1-2 тижні. І тут настає питання перше, вивчити основні інструменти го швидче ніж ПХП, саме тому я обрав го, бо в момент переходу мене і моєї команди це було критично.

3.2 Підтримка і оновлення, у 2015 мені випало за честь оновити 2 версії лари, які ми пропустили, це в мене на моноліті зайняло тиждень. Нещодавно довелось оновлювати 4 сервіси на го, старенькі сервиси, сервіси десь 2018 року, я тоді ще тільки починав працювати на го, це зайняло десь до 2-х днів. Безумовно це не було абсолютно безпроблемо, як це кажуть в рекламних презентаціях го, з стандартною бібліотекою го все зайшло супер добре, але з зовнішніми пакетами вже буле не так все гладко і це. Скільки часу в мене займе, щоб проект на пхп актуальної версії 2018 року перевести на пхп актуальної версії 2024 року?

3.3 Якщо можна трохи поекономити то чому би і ні? На скильки я зараз пямʼятаю то обробка одного запиту на пихе = задіяння одного веркера, а це в момент часу від 2мб, на го це одна горутина, від 2 кб, я можу помилятися, виправте мене, будь ласка, просто зараз лінь гуглити

Я з ним працював десь у 2015-2016 роках

Чувак, пройшло 8 років, ти реально думаєш що твій expirience ще валідний?

Так, валідний.
У 2018 році актуальною версією для пихі була 7.3, сьогодні 8.3
Я готовий взяти попкорн і подивитися скільки грошей замовника втратять прогамісти щоб перевести проект з 7.3 на 8.3.

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

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

Так, а причому тут 2018, якщо в оригіналі було написано

десь у 2015-2016 роках.

?

2016 — це php 7.1. Між 7.1 та сучасним 8.3 величезна різниця. І laravel за ці роки дуже еволюціонував

але для нормального бізнесу цей час ні про що, так на розігнатися.

Маячня. Проект на якому я працюю зародився менше 5 років тому. І саме на ларавелі. Зараз успішно заробляєм кілодоллари, при тому що в команді всього 4 девелопера

І за період роботи на upwork я бачив купу проектів які за 2-3 роки уже були profitable, приймали тисячі користувачів, і успішно працювали на PHP

Я зіштовкхнувся з цією проблемою на пхп у 2015-2016. У 2018 я вже позбувся пхп

2016 — це php 7.1. Між 7.1 та сучасним 8.3 величезна різниця. І laravel за ці роки дуже еволюціонував

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

Маячня. Проект на якому я працюю зародився менше 5 років тому. І саме на ларавелі. Зараз успішно заробляєм кілодоллари, при тому що в команді всього 4 девелопера

Що саме маячня? Яким боком мій комент не відповідає 2-3 роки уже були profitable? Якщо в проекті великі інвестиції і люди чекають девідентів і вихід на IPO, то це може тривати і 10 років і більше, яле якщо бізнес працює, то за 5 років він точно не закриється лише тому що став profitable, а буде і надалі розвиватися

4 девелопера

Я бачив проет, який живе 5 років на fierbase, має 3 лями користувачів і від початку до сьогоднішного дня його сапортила 1 людина, що далі? Як ваш випадок вирішує Backward compatibility? Здається коментар про

2016 — це php 7.1. Між 7.1 та сучасним 8.3 величезна різниця.

Лише підтверджує мої слова.
Я зараз працюю на проекті якому 8 років, тут близько 50 сервісів, всі вони мають актуально версію мови Go, хоча деяким сервісам вже більше 5 років

2016-2018 року до сучасної.

Я власними руками мігрував здоровенне легасі із 5.6 до 7.2, без даунтайму. Там там було гімно без фреймворків взагалі. І нічого, норм, за декілька місяців мігрував, так це я ще й мідлом був

Лару із 7.4 на 8.1 мігрували буквально в минулому році — все пройшло як по маслу

Тому я поняття не маю, про які такі нереальні проблеми Backward compatibility ви говорите. Це ж не JS, де кожної хвилини виходить новий фреймворк

А, і до речі. В світі PHP є PSR-и. Наприклад, є PSR по роботі з часом, по обробці з реквестами. Якщо ліба реалізує цей PSR — її можна взяти, і легко замінити. А що там в GO зі стандартизацією? Наскільки мені відомо, там навіть щоб JSON розпарсити нема єдино прийнятного варіанту, всі на велосипедах ганяють

декілька місяців мігрував

Я мігрував декілька сервісів версії го зразка 2018 до 2023 за пару днів, можу помилятися, але мені здається, що моя технологія ну трохи більше зекономила грошей замовнику ніж ваша)

Якщо ліба реалізує цей PSR — її можна взяти, і легко замінити

Ви погано знайомі з принципом інтерфейсів в го)

Наскільки мені відомо, там навіть щоб JSON розпарсити

Дуже погано відомо)

Я мігрував декілька сервісів версії го зразка 2018 до 2023 за пару днів, можу помилятися, але мені здається, що моя технологія ну трохи більше зекономила грошей замовнику ніж ваша)

Окей, проект на nodejs взагалі можна мігрувати за 5 хвилин, бо між версіями ноди не ламається backward compatibility. Чи є це показником гарної мови? Тягати legacy фігню з версії в версії, тільки задля зворотньої сумісності — таке собі

Наскільки мені відомо, там навіть щоб JSON розпарсити
Дуже погано відомо)

Окей, погоджуюсь, зараз загуглив — є пакет encoding/json для цього. Як згадаю з чим тоді зіткнувся, що дуже здивувався — скажу :) Але точно памʼятаю, що була якась фігня, яка в PHP є з коробки, а на Go — десятки пакетів сумнівної популярності

UPD. а, таки нє, знайшов отакий список: github.com/...​o?tab=readme-ov-file#json

наявність такої кількості бібліотек явно вказує на те, що з коробки з JSON-ом у Go щось дуже погано.

я вам пропоную уважно вивчати інформацию, тоді не доведеться зайви раз погоджуватись)

Особливо ту інформацию на яку ви посилаєтесь!

UPD. а, таки нє, знайшов отакий список: github.com/...​o?tab=readme-ov-file#json

Якщо подивитись цей список, то можна переконатися в тому, що це пакети які додають додаткову функціональність, ми жеж в ІТ всі знайомі з англійською, так?

Я не є професіоналом в nodejs, я з ним мало стикався, але коли робив дослідження на що вартує перейти з пихі, то nodejs був кандидатом, який відпав.

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

О, тільки поговорили, і із свіжого: на проекті є Go, здається працює на фреймворці Gin. І ця байда пише всі логи (і аксесс і еррор) в одну купу. І нормального, «з коробки» способа розділити їх — походу, нема. Вау, куди там тому PHP 😁

все є, просто треба ще зібрати ручки відповідної конфігурації)
А що означає пише логи в одну купу? А як ви збираєте логи і де зберігаєте?

Не думаю, що ви логи доступу пишете прямо з php ( скоріше за все їх пише якийсь nginx або traefik писаний доречі на Go). На рахунок Gin, це не сама продумана бібліотека, але 2хв почитавши код, вашу задачу можна вирішити використавши декілька міделвар логування з різними налаштуваннями скіпа ( що по факту з коробки).

або traefik писаний доречі на Go

А на чому воно має бути написане, на пхп?

Я тобі більше скажу, навіть така приблуда існує :)

frankenphp.dev

може бути що

прямо з php

тому я вирішив це перепитати)

Вибачте, але я не вірю в перехід з php на go за 1-2 тижні. Скоріше за все, ви писали той же php код тільки на go.

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

У PHP відсутня конкурентна модель, тоді як у Go це ключова фіча. Незважаючи на лаконічність Go, перехід від парадигми «у кінці запиту я помру» до «я житиму вічно» вимагає часу і відповідної практики. Я впевнений, що на початку ви зробили щонайменше 50 помилок із 100go.co.

Все так, але для того, щоб покрити функционал пихи достатньо 2-х тижнів і ви отримаєте додаток, на багато більш швидкісний додаток. Ще місяць на опанування і розуміння конкурентності)

Але це не відміняє того, що за тиждень — інший ви можете запускати свій рест сервер, в процесі опанувати всі інші фічі.

Можна більш детальніше про проблеми Ларавеля в порівнянні з Симфоні?

Я на пхп писав майже 10 років тому, але зараз також розглядаю саме Ларавель для невеличкого side hustle. Го (моя основна мова) навіть не розглядав, бо для прототипування і швидкої інтеграції з фронтом — це максимальний гемор. Дивився в сторону Джанго (пайтон — моя друга мова), але також не знайшов серйозних плюсів в порівнянні з пхп+лара. Проект на ларі можна так само швидко прототипувати, як на джанго, але там із коробки іде ще й крутенна інтеграція з реактом (судячи по документації). Плюс до лари я вже знайшов массу крутих плагінів, як наприклад платежі від Страйп, свій сдн для медіа і тд. Ну і банально проект на пхп можна запустити на будь-якому шейред хостингу, який зараз можна орендувати практично задаремно (якщо порівнювати з Хероку чи старшими калудами).

Я зайшов проглянути проект TC і не знайшов там нічого такого, чому б їм потрібно було не використовувати лару. 2к студентів за 2 роки — це не так і багато. Проект нішевий. Очікувати вибухового росту навантаження немає сенсу, а тому і паритися про те, що це моноліт на пхп поверх докер компоуза теж не бачу сенсу.

я давно не працюю з ларавелем, і пихою, але те що я бачив 5 років тому — це ларавель і його підходи активно перероблювали в концепти симфоні, використовуючи ризні сторонні библіотеки чи свої велосипеди, за 5 років оновлень і підримки з таким ніхто працювати не захоче, або сапорт буде коштувати дуже дорого. Сторонні пакети — це ок, якщо вони дійсно несуть щось корисне і суттєво зекономлять ваш час і краще щоб вони були на стільки «офіційними» на скільки це можливо.

По го я не дуже зрозумів які додткові интеграції вам принесе бекенд технологія на фронт? Я просто беру підхід API-first з яким небудь огеном і вперед. Якщо хочеться багато генерувати, ну додайте sqlc, візьміть бафало. Якщо хочеться писати тільки логіку, ну то завітайте до хасури)

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

Подивіться по пакетах в composer.json на чому базується Ларка. Там більшість core речей саме з Symfony взято. Все інше то суто кастомне від розробників ларавель. І проблема тут навіть не в перформенсах чи якихось лоу левел фічах які прикскорють інтерпритацію в байт код. То вже далеко заходимо.)

Наприклад бачив і працював з Symfony починаючи з версії 2.8(2016-2017 рік), якраз застав перехідну версію перед виходом Symfony 3. Там були такі штуки які називались bundles, за допомогою яких можна було проект бити на модулі в коді. Тобто той самий моноліт з різними точками входу. Так от зараз бачу, що є наприклад Laravel modules в якому по суті реалізована та сама концепція bundles 7-8 річної давнини. Цим просто хочу сказати, що в порівнянні з тих часів звичайно Ларка виросла до стану фреймворка на якому можна робити ентерпрайз проекти. Але архітектурно всі ідеї і core features родом з Symfony.

Там хіба шо конфігурація symfony для новачка це як китайська мова. Тому ларавель з парою класів це дійсно як велосипед.

Насправді в один коментар це не влізе. І ці речі більш абстрактні. Але для швидкого старту це абсолютно нормальний вибір.

Як на мене фундаментальна рiзниця мiж Laravel i Symfony це Doctrine i Eloquent, тож насправдi вибирайте мiж ними

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

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

якесь непонятно гоу
уже став стандартом для веб розробки

це багато чого говорить про вашу обізнаність)

Ну погуглив які зараз є фреймворки і там ті шо всі знають і вони 100 років на ринку. Laravel входить в 5-10. Гоу я там взагалі не побачив, або треба було листати на 10 сторінок вперед. Мабуть у гоу дуже потужні фреймворки які ніхто не знає. Навіщо в стандартному круд проекті використовувати якісь новомодні сирі фреймворки до яких нема ні ліб, ні комьюніті ні відповідей на стековерфлоу ?

У Go не прийнято використовувати фреймворки — натомість віддається перевага набору бібліотек, що підходять для конкретного проєкту. Це дозволяє використовувати весь функціонал залежностей без обмежень, які накладає абстракція. PHP-програмісту це може бути важко зрозуміти, адже в PHP так не прийнято. Деякі люди досі вірять, що в реальному проєкті можна змінити базу даних або брокер повідомлень, просто налаштувавши три рядки в конфігу, і тому продовжують підлаштовуватися під абстракцію, яку пропонує фреймворк.

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

З бібліотеками в го теж мяко кажучи не дуже теж
навіть від відомих компанія аля hoshicorp бува біда

купа бібліотек в го від китайців (хз чи це є загрозою — вам вирішувати)

тема певно окремої статі — але інфраструктурно/комюніті голенг це РНР десь в 2005 році +/-
коли всі робили свій клас бд/мейлера/роутінга (ітд) і носились з ним між проектами як з «іновацією»

безумовно golang має купу своїх плюсів
але використовувати його тре обдумано все таки

субективно для MVP SaaS-чику де якісь там данні/формочки/білінг і біз логіка GoLang в його стані зараз не дуже вибір

З бібліотеками в го теж мяко кажучи не дуже теж
купа бібліотек в го від китайців

це інформація 5-річной давнини, але так, вони більше за все зіштовхувалися з навантаженнями, тому кльопали бібліотеки першими

субективно для MVP SaaS-чику де якісь там данні/формочки/білінг і біз логіка GoLang в його стані зараз не дуже вибір

імхо, робити повноцінний моноліт — це не дуже для реального MVP, про що я вже згадував, але ну камон, ви будете в через 2-3 роки переписувати моноліт? Лоу код рішення, так, я буду переносити на моноліт, коли все стабілізується по функціоналу

Ок винесемо через 2-3 роки щось повільне в окремий сервіс на іншій мові(наприклад), але навіщо зайвий раз підвищувати гетерогенність?

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

Лоукод рішення як supabase або щось подібне звісно можуть допомогти і прискорити десь, але якщо то зовсім щось примітивне та просте. Ну щоб замість крудільні на Laravel за пару кліків мишою зробити крудільню на supabase. В статті ж ми вже бачимо і івенти, і певну бізнес логіку, якої 100% набагато більше ніж тут показано, і ось в таких випадках low-code рішення починають тягнути вниз. Звісно то все можна зробити, наприклад запхавши щось в процедури, або ще кудись, на щастя postgres все стерпить ))). Але це вже не так весело як клацяти мишкою і додає головняків та обмежень. Кастомний код дозволить як раз реагувати на будь які зміни і крутити додаток як то заманеться.

Тобто якщо підсумувати:
— low-code — швидко на старті, але потім, коли складність збільшується то швидкість розробки падає
— custom code — завжди стабільна швидкість, яка залежить лише від «сили» команди. Тобто це більш прогнозовано та передбачувано.

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

Вирішити швидкість проблему швидкості можна лише процесами з відповидним додаванням ресурсів

Бажаю вам довгострокової удачі з Laravel, вона вам знадобиться)

Та плюс мінус всюди однаково — є шось накшталт лямбда функцій чи чогось подібного.

Я згоден з тим що швидкість розробки з часом деградує, але на моєму досвіді в custom code рішеннях це більш прогнозована та стала величина. Просто на моєму досвіді якось всі більш менш не схожі на CRUD штуки на low-code починають походити на франкенштейнів коли люди намагаються реалізувати «крок ліворуч/праворуч» від того що та платформа вміє.

Я не захищаю ларавель, а лише кажу що low-code це частіше блокер аніж перевага.

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

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

1. Є офіційні рекомендації і є паради. Якщо ви берете Symfony, отримуєте відповідні рекомендації хорошої практики, якщо Laravel то mvc і eloquent, з можливими порадами хорошої практики. Якщо до мене на співбесіду приходить людина то я очікую що як минимум офіційні рекомендації вона знає, поради — опціонально, і якщо особливого вибору у вас не має, то парадам доведеться навчити самостійно.

2. Якщо ви мені скините посилання де я сказав, що всім треба переходити на Go, то за кожне таке посилання я скидаю 10к на ПЖ, якщо ви такого не знайдете, то скидає ви 100к на ПЖ, домовились?

пиха і рубі це мови одного цільового призначення — сервер, більше, здебільшого, на них нічого не роблять. Python, C# - чудові мови багатоцільового вжитку, js — не чудова мова багатоцільового вжитку.

То якщо є дуже багато параметрів за якими го перекриває пиху і рубі, то в чому сенс пихи і рубі?

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

Є офіційні рекомендації і є паради

— Так вони є, я не сперечаюсь, але й є поради по будуванню чистою архітектури яка не буде повністю залежати від таких змінних як фреймворк, бд і тд і

То якщо є дуже багато параметрів за якими го перекриває пиху і рубі, то в чому сенс пихи і рубі?

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

нагадую за

Якщо ви мені скините посилання де я сказав, що всім треба переходити на Go, то за кожне таке посилання я скидаю 10к на ПЖ, якщо ви такого не знайдете, то скидає ви 100к на ПЖ, домовились?

ти мені так і не скинув посилання про треба треба всім переходити на го.

Ми тут не про мікроскопи, читайте все уважно, якби автор сказав, що взяли js, бо він закриє всі популярні клієнти і сервер, від мене би не було ніяких претензій.

Швидкість опанування(в пихє треба опанувати і мову і фреймворк), простота підтримки у вигляді вічно нових версій, швидкодія(тут, маю надію, нічого коментувати не треба), можливості мови. — все це перекриває го по відношеню до пхп. Мікроскопи залишайте всебе в дома, тут стаття про технології для типового стартапу в ІТ галузі

ПС Чекаю посилання на квітанцію оплати в ПЖ, або місця де я вказав, що всим треба переходити на го.

Ну ми же не в дитячому садочку для оцих «а де ж я прям так казав?»
Ваші коментарі почитати, і це прям якась фанатичність Go, без розуміння прямого контексту)

P.S. а гроші на ПЖ можна і просто так скинути

нє, ми не в садочку, ти мені закинув, що я сказав, «всім треба переходити на го», я такого не казав, я доводжу, що мови пиха і рубі суттєво програють сучасним мовам, і для нових проектів їх краще не брати, доводжу я на прикладі го, бо маю з ним досвід. Я хочу подивитися на контексти, де мій приклад програє(php vs go), мені це цікаво з професійної точки зору.

Я розумію що є бажання вийти дортанʼяном і включити задню, але я просто пропоную варіант, де ти визнаєш що коменті прочитав через один, а свій перший комент написав щоб увійти як дортанʼян) або можемо продовжувати спір, бо в ньому народжується істина.

P.S. а гроші на ПЖ можна і просто так скинути

Можна, але в данному випадку я запропонував умови спору, бо впевниний, що я цього не казав, а якщо це десь пролетіло, то я готовий взяти свої слова назад і понести покарання відповідно спору, а ти як, готовий до відповіді, чи просто дартанʼян який включає задню?

То якщо є дуже багато параметрів за якими го перекриває пиху і рубі, то в чому сенс пихи і рубі?

в тих параметрах, в яких го не перекриває пиху та рубі?

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

а, тоді я невірно зрозумів комент, перепрошую.

3.1 Можу авторитетно заявити, що цей перехід в мене і в купи інших спеціалістів, на пхп або з інших мов, зайняв 1-2 тижні.

можна уточнити — це був «чистий» перехід на го всієї команди (всі сідають і читають, як все робиться на го), чи це була інтеграція в го проект (коли вже є стуктура, приклади реалізації типових моментів) ?
Я не приколупуюся, просто цікаво.

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

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

Якщо у вас є невелика команда, то щось краще, ніж Laravel + InertiaJS (/ LiveWire), сьогодні вкрай складно знайти, якщо не брати до уваги Rails + Hotwire.

Розробляю свій проєкт на Laravel + InertiaJS + Vue і з усією впевненністю можу сказати, що я би отримав на сьогодні хіба половину функціоналу, використай я щось інше.

ви погано прочитали мй комент, перечетайте ще раз.

дякую, що не мікросервіси

Я пару разів вказав, що дякую, що не мікросервіс, я вказав, що MVP краще робити на лоукод інструментах, до стабілізації функционалу. Я в коментах декілька разів вказував, що у проектів є всі шанси не вийти за ресурси моноліту і так ніколи і не побачити мікросервіси.

Я вас дуже прошу, скажіть що ви випадково відповіли саме на мій коментар.

Laravel + InertiaJS + Vue

Співчуваю, коли стукне рочків 5 проекту, напишіть, будь ласка, як у вас справи.

Якщо у вас є невелика команда, то щось краще, ніж Laravel + InertiaJS (/ LiveWire), сьогодні вкрай складно знайти, якщо не брати до уваги Rails + Hotwire.

Я думаю, що ви погано шукали, я би з цим погодився рочків 10 назад, зараз ну аж ніяк.
За InertiaJS нічого не можу сказати

Співчуваю, коли стукне рочків 5 проекту, напишіть, будь ласка, як у вас справи.

Чому співчувати? Що проєкт проживе більше 5 років? ;)

Я думаю, що ви погано шукали

То покажіть приклад. :)

Що проблеми з підримкою проектів на пихє з часом стає на багато більше ніж в деяких інших мовах

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

Ліл, чувачок, в нас вже 10 років версія пихи обновляється. Так що, хтось, реально пиз...ить ;)

який не здатний розібратися

Бугага, продовжуй, це вже стадія агресії? :)

ПС, доречі, остання версія пихи яка по факту була несумісна з попередньою, вийшла в 2004 році — це був пих 5. З того часу, — все чудово апгрейдиться.

свій код апгрейдиться чудово — пошукав пошуком та позаміняв.
А от з лібами так не вийде. з лібами будуть танці.

але хіба є мова, в якій є ліби і немає танців?

Ти колись чув про composer? Чи ти досі в нульових живеш?

вау, композер. нарешті щось вирішить ці проблеми!!!!11
ти відкрив мені очі, спасіба!

а скажи, композер поможе, коли якась ліба каже "require": {       "php": "^7.0", ? він же всьо сам зробить, да?

Прошу.
Ну по перше, всі репютабл репетиторії оновляються регулярно.
По друге — несподівано, проблема підтримки 3rd party lib, є в кожній мові. Вона залежить виключно від контрібютора а не від мови програмування. Різниця лише в тому, що на пих цих ліб

2.5 million public PHP packages available on Packagist.
150,000 public Go modules available on GitHub

ПС, конкретно твій випадок —

«require»: { «php»: «^7.0», ?

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

По друге — несподівано, проблема підтримки 3rd party lib, є в кожній мові.

так а хулі ти тоді з таким апломбом про композер задвигаєш мені?

так а хулі

Тому, що оновлення проекту і оновлення 3рд парті ліб, таки різні задачі. Не подоьаєтсья оновляти ліби — пишеш сам. Потім рахуєш шо швидше :)

овлення 3рд парті ліб, таки різні задачі.

тобто можна апнутись не трогаючи ліби? а ліби щось там якось композер сам підбере? чи ні, чи з лібами може виникнути необхідність погратися? (о, диво — я ж це ж і написав в тому коменті, на котрий почув новину про композер)

Якщо ти юзаєш ліби які регулярно оновлюються а не якогось Джона Сміта який в гітхаб раз в місяць заходить — то без проблем.

ну іноді цей джон сміт може вмерти. Або сказати «я всьо, використовуйте лібу від гугла». Або сказати «раз нова версія, то давайте поміняємо дефолтні параметри» абощо. Магічно воно нічого саме не робиться. І по трудозатратах синхронізувати бібліотеки може вийти чи не довше за оновити (чи радше просто протестувати) свій власний код.

Саме так. Ну тоді, ти підбираєш форк, або сам робиш форк. Або переписуєш з нуля. Але це виключення а не правило. В нашому комерційному проекті за 5 років я з таким не стикався.

Ліл, чувачок, в нас вже 10 років версія пихи обновляється. Так що, хтось, реально пиз...ить ;)

який не здатний розібратися

Бугага, продовжуй, це вже стадія агресії? :)

О, доречі, побачив що ти на Go пишеш. В нас був мікросервіс на Go, переписали на пих, бо на Go був геморой з підтримкою :)

дякую що підняв настрій, в жарти в тебе виходить не погано)

Прошу, ти на стадії заперечення зараз, так? :)

Співчуваю, коли стукне рочків 5 проекту, напишіть, будь ласка, як у вас справи

Чим поганий стек? Компанію яку я працював, з 10річним проектом недавно заакваїрили. Наш стек древніший набагато — PHP Symfoby, але без доктрін а з самописною ORM, angularJS. Наш проект, живіше всіх живих, а от власний аналогічний проект на джава + реакт — компанія згорнула.

Живішим всіх живих може бути проект і на коболі, питання лише в ціні підримки

Наш нет ревенью був більше 2.5млн $ на програміста. Можеш похвалитись схожими цифрами? :)

Що таке нет ревенью на програміста, у тебе програмісти займаються продажами? Краще похвались RPS і витратами на інфраструктуру. Я працював над проектами компанії які в лідерах на s&p 500, їх успіхи треба заносити в заслуги програмістів?

Що таке нет ревенью на програміста

Це нет ревенью компанії розділений на кількість програмістів. Кеп.

Яка ще метрика вартість підтримки коду відображає? :)

витратами на інфраструктуру

Витратами на інфраструктуру? В нас вони копійчані, якісь десятки тисяч на aws.

Краще похвались RPS

Чесно, не рахував :) а ти думаєш, що RPS залежать від мови програмування а не від бази даних, наприклад? :)

Про вартість підтримки — я так розумію, злився, ну ок :)

Я працював над проектами компанії

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

Яка ще метрика вартість підтримки коду відображає? :)

якщо я продаю алмази оптом і ПО написане на 1с, а інша компанія продає контестну рекламу з по написаному на го чи расті з навантаженням яке і не снилося алмазній компанії, але заробляє менше, то прогрпамісти 1с крутіші за раст чи го? Я тут беру лише цю метрику — навантаження, ну так виходить, сонечко, чи десь логика прострілила собі коліна?

а ти думаєш, що RPS залежать від мови програмування

В тому числі, особливо якщо доводиться обраховувати якісь складні структури

Це і є вартість підтримки/розробки

Маркетинг, підтримку продукці, логістику і обслуговування викидаємо?
Поняв, піду скажу компанії Тайота, що можуть нах закривати заводи, звільняти салони і маркетологів вигяняти, бо тут пиха лицар Andriy Kutsynyak, сказав, що

яке ревенью приносили ті проекти, скільки вас там було. Це і є вартість підтримки/розробки
в тому числі.

В тому числі, але вклад програмістів, не такий великий і значущій, щоб на це приміляти ревенью, або цим вимірювати ефективність програмістів, це просто смішно)

якщо я продаю алмази оптом

Ліл чувак, ти навіть не можеш сформувати визначення продукту :) ти точно програміст? :)

десь логика прострілила собі коліна

..

В тому числі, особливо якщо доводиться обраховувати якісь складні структури

Прзкажи нам, які складні структури ти обраховуєш, що тобі ці мікросекунди дають профіт? :)

на це приміляти ревенью

Ну, кожен по собі міняє.
Розумієш, Тойота продає авто а не ІТ продукт. А Тесла — швидше навпаки. ;)
Коли ми робимо ревенью на програміста вдвічі більше ніж наш будь який конкурент — це має значення ;)

Прзкажи нам, які складні структури ти обраховуєш, що тобі ці мікросекунди

Хочаб 10 000 тисяч записів з деревами, я розумію що для пихаря цю структура в новинку, але, обійди їх в паралелі і обрахуй значення, яке є на різних рівнях. Хто це зможе зробити швидче, скрипт пихи чи будь яка інша мова яка вміє в реальну паралельність?

Розумієш, Тойота продає авто а не ІТ продукт

То виходить що я не можу порівнювати тебе і програміста з Тойота? Мене не цікавить на скільки ефективний твій продажник, чи маркетолог. Коли я візьму резюме програміста з твоєї компанії і з Тойоти, то мені буде все одно яке там «ревенью» надув йому в ухо твій СЕО, мене цикавить які інженерні виклики були в програміста, а свої

2.5млн $ на програміста

ти можеш залишити для своєї мами, впевнений, вона тобою буде пишатися)

але, обійди їх в паралелі і обрахуй значення, яке є на різних рівнях

І для якого кейсу це ти робиш, чи це потеоретизувати?

ти можеш залишити для своєї мами

Хочеш сказати що твій продукт ніхтотне купує? Спробуй додати дерев ;)

все з тобою ясно, «спеціаліст»

Ой всьо , lol

Це вже торг, чи ми перескочили прямо до депресії? :)

Якщо у вас є невелика команда, то щось краще, ніж Laravel + InertiaJS (/ LiveWire

API Platform

Щось краще для розробки продукту, а не для розробки API.

М, пан точно знає що таке апі платформ?

Це движок, в який з коробки входить:
Сетап докера з трьох контейнерів:
База даних, бек енд — симфоні або Ларавел на вибір. Фронт енд — кілька js фреймворків на вибір. Це все, з коробки має купу фіч, типу налаштованого рест апі і graphQL, Mercury, адмін панелі, swagger, і автогенерації ендпоінтів і веб сторінок.

Уже легче авс взять чем очередную сомнительную сборку. такого гавна можно найти дофига вопрос зачем оно надо.
Там будет больше е6ли с кастомизацией чем пользы от него. Лучше по человечески самому собрать как нужно.

Що значить

сомнительную сборку

Це опен сорс, створений досить відомим чуваком, github.com/dunglas

сборку

Це не збірка, а фреймворк, я б навіть сказав, — мегафреймоюворк

Fabien Potencier, the creator of Symfony, called API Platform «the most advanced API platform, in any framework or language».

Там будет больше е6ли с кастомизацией

Ну тобі видніше, ти ж мб, на тому вже багато всього написав :)

авс

Мається наувазі AWS? А що тобі заважає задеплоїти докер контейнери на AWS? Там навіть інструкція є ;)

М, пан точно знає що таке апі платформ?

Тепер можу дати відповідь: так, точно знаю і моє бачення співпадає із вашим.

От тільки...

Мені не треба мати купу фіч з коробки, типу налаштованого рест і graphQL. Мені взагалі не хочеться писати API там, де він не потрібен. InertiaJS дозволяє це робити та сфокусуватись на продукті, а не на програмних інтерфейсах.

Звісно, існують проекти, яким не потрібен АРІ, але останні 10-15 років, таких проектів все менше.
По суті, весь SaaS, чи будь який проект який проект, який передбачає можливість доступу з кількох типів клієнтів — виграє від АРІ, власне, тому, це і стало стандартом розробки по факту.
А аплікації яким це не треба, на пхп писали ще 20 років тому, юзаючи Smarty (це не камінь в город таких аплікацій, насправді, для пхп це досить нативний спосіб роботи з даними, просто, імхо, там не багато новизни)

Тепер моя черга питати: ви точно знаєте, що таке InertiaJS? ;)

Я використовую сучасний VueJS, отримую швидкий SPA та не написав ще жодного API ендпоїнту та пишу як у старі добрі часи — контролер збирає дані, Vue — відображає, зберігаючи купу сил, часу та маючи надзвичайну гнучкість у розробці продукту.

Щойно мені знадобиться API — я просто допишу документацію та виставлю мої Laravel Actions як HTTP ендпоїнти. :)

що таке InertiaJS

Так я про це і пишу

старі добрі часи
допишу документацію та виставлю мої Laravel Actions як HTTP ендпоїнти

Імхо, тут не так просто, з декількох причин:
1. Доведеться таки писати док, сваггер може це зробити сам.
2. Апі буде не стандартизоване, це може не бути рест, тому, що контролер може працювати з більш ніж одним об’єктом, і очевидно це не буде графКюЛ.
3. З часом, АРІ може відрізнятись від того з чим працює ваш фронт енд, тобто, можливо доведеться підтримувати 2 формата.
4. Як нарахунок стейтдесс?

В тому і перевага API platform, зо воно дозволяє написати АРІ практично не витрачаючи часу на саме написанн АРІ. Весь бойлрерплейт — це анотації, в більшості достатньо просто описати модель, а контролер- в принципі і непотрібен

1. Доведеться таки писати док, сваггер може це зробити сам.

Повірю у вивід типів, проте всеодно ж доведеться писати реальну документацію до методів. Не бачу різниці робити це у скоупі API Platform чи підключивши OpenAPI самостійно.

2. Апі буде не стандартизоване, це може не бути рест, тому, що контролер може працювати з більш ніж одним об’єктом

Ужос, буде не REST і всесвіт вибухне. :))

Як наче API Platform заборонить працювати більше, ніж з однією сутністю та гарантуватиме саме REST, а не JSON-Over-HTTP API.

очевидно це не буде графКюЛ.

А нащо воно, якщо REST-like API достатньо гнучкий, простий в налаштуванні та секуріті і виконуватиме все, що від нього вимагатимуть?

3. З часом, АРІ може відрізнятись від того з чим працює ваш фронт енд, тобто, можливо доведеться підтримувати 2 формата.

Так це ж нормально. Проєкти розвиваються, еволюціонують та адаптуються під нові умови. Так то і сам API теж буде змінюватись.

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

4. Як нарахунок стейтдесс?

Тут, напевне, питання було щодо stateless. А що з ним не так? :)

PHP так то за замовчуванням stateless, бо все вмирає після кожного запиту.

В тому і перевага API platform, зо воно дозволяє написати АРІ практично не витрачаючи часу на саме написанн АРІ.

практично. В моєму кейсі я взагалі не витрачаю на це часу.

Весь бойлрерплейт — це анотації, в більшості достатньо просто описати модель

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

Чому ж вам так складно прийняти те, що можна розробляти сучасні SPA без написання жодного рядку API? :)

гарантуватиме саме REST

Тут штука в тому, що в скоупі апі платформ доведеться напрягтись щоб писати Джон овер АРІ, а в іншому випадку — навпаки. Ідемо шляхом найменшого спротиву.

А нащо воно

Корисно, для деяких видів операцій, саме для кейсі Джейсон овер АРІ. Дозволяє ізолювати ці два типи АРІ.

А що з ним не так

Ну, наскільки я розумію, в старону доброму підході — стандарт — це сесії, тоді, як для СааС — стандарт це ключі. Чи у вашому випадку ви таки використовуєте ключі за замовчуванням?

практично

Якщо потрібен круд — то він автогегерується. Якщо потрібно щось більше, навішуються нормалізатори. У вас же, є екшени, теж писати треба, а тут можна без екшенів:)

Чому ж вам так складно прийняти те, що можна розробляти сучасні SPA без написання жодного рядку API

Це легко, з АРІ платформ :) реально, можна написати простенька АРІ, без жодного рядка коду саме для АРІ :)

Ідемо шляхом найменшого спротиву.

Отож. Щоби не мати проблем із кривим API — я просто не маю API. :)

Корисно, для деяких видів операцій, саме для кейсі Джейсон овер АРІ. Дозволяє ізолювати ці два типи АРІ.

Омг. Нащо створювати собі ще купу проблем із ще одним видом API, якщо REST вирішує всі проблеми в більшості проєктів не Facebook масштабу? GraphQL тягне за собою купу додаткових питань: від безпеки до перформансу, це ж інший самостійний всесвіт.

Чи у вашому випадку ви таки використовуєте ключі за замовчуванням?

Підійшли до ключового: в мене немає окремого API для фронтенду. Немає. Тому немає ключів. Тому немає проблем із документацією API. Тому немає проблем із «обоже, там же кілька ресурсів контролер задіює!11». Тому немає проблем із авторизацією.

Це легко, з АРІ платформ :) реально, можна написати простенька АРІ, без жодного рядка коду саме для АРІ :)

Мені не треба API. В мене, на сьогодні, кілька системних точок доступа JSON-over-HTTP і один публічний ендпоїнт.

Як потрібно буде більше — підключу OpenAPI, так само, опишу методи-сутності і, так само, автоматично згенерую все інше.

А на даному етапі продуктивніше взагалі не думати про API. Ну нащо, якщо навіть невідомо, чи доживе проєкт до моменту, коли там буде кілька різних клієнтів працювати із даними?

---

Що ж так тяжко? Як потрібен буде API — Laravel Actions публікуються так само легко, як і у випадку використання API Platform (що, по суті, є лише «збіркою» ліб).

Ми тут з вами не домовимось, бо ви занадто сильно фокусуєетесь на технічних аспектах, а я — на продукті. І моєму продукту, на даний момент, не потрібен самостійний API, бо в мене найближчі кілька місяців (півроку, рік), буде лише SPA.

А от як знадобиться повонцінний API, то навіть далеко і не факт, що він буде писатись із Laravel.

Омг. Нащо створювати собі ще купу проблем із ще одним видом API, якщо REST вирішує всі проблеми в більшості проєктів

Виключно для оптимізації перформансу.

Підійшли до ключового: в мене немає окремого API для фронтенду. Немає. Тому немає ключів

Я і пишу, що коли/якщо треба буде писати АРІ — це не буде так просто.

А на даному етапі продуктивніше взагалі не думати про API

Вдало прийняті рішення на старті проекту, сильно спрощують роботу з ним в майбутньому. Наприклад, я б хотів зараз замінити ORM, але при поточному об’ємі коду — це таск на тижні. А при поточній базі юзерів — це ще й ризиковано що ппц. Бізнес просто на таке не піде. І буде легасі костиль...

що, по суті, є лише «збіркою» ліб

Я б не сказав що це просто збірка. Це повноцінний фреймворк, як і Ларавел тільки на вищому рівні. Він має свою структуру і всі елементи взаємодіють між собою за певною схемою.

Виключно для оптимізації перформансу.

GraphQL і перформанс то таке собі. Складно оптимізувати динамічні запити.

Я і пишу, що коли/якщо треба буде писати АРІ — це не буде так просто.

Чому?

Вдало прийняті рішення на старті проекту, сильно спрощують роботу з ним в майбутньому

Саме тому Inertia і Laravel Actions. :)

Наприклад, я б хотів зараз замінити ORM

А нащо? :)

GraphQL і перформанс то таке собі. Складно оптимізувати динамічні запити

Дуже важко, але, можна зменшити пейлоад якщо він занадто великий. Плюс якщо просунутий фільтр на фронт енді, то його легше реалізувати за допомогою ГрафКюЛ ніж засобами РЕСТу

Чому

Ну ми вище це обговорили, його треьа буде окремо писати.

Саме тому Inertia і Laravel Actions

Залежить від проекту. Для деяких — можливо, для більшості зараз- АРІ це стандарт.

А нащо

Щоб спростити процес написання коду, особливо генерації специфічних запитів і джойнів. Ми в результаті додали підтримку Doctrine/Dbal щоб закрити гапи в ОRM. Але, Dbal, звісно не має стільки цукру як Doctrine ORM.

можна зменшити пейлоад якщо він занадто великий.

Так і з REST те ж саме. Я використовував ?include/exclude ще задовго до того, як Facebook придумав та популяризував GraphQL.

Плюс якщо просунутий фільтр на фронт енді, то його легше реалізувати

Дуже спірне твердження, за рахунок тієї ж самої суті надзвичайно динамічного запиту, де

Дуже важко

все оптимізувати.

Ну ми вище це обговорили, його треьа буде окремо писати.

Ви точно знаєте, що таке Laravel Actions? ;)

Воно експозиться як звичайний invokable контролер і лишається написати все той же самий OpenAPI definition, як і у випадку із API Platform.

для більшості зараз- АРІ це стандарт.

«Стандарт» це тому, що всі бездумно (/ або за відсутності Hotwire/LiveView/Inertia/younameit) роблять API, бо «завтра буде більше одного клієнта» чи тому, що дійсно більшість проєктів має більше одного клієнта вже від самого початку?

Щоб спростити процес написання коду, особливо генерації специфічних запитів і джойнів

А що саме воно такого робить, чого не вміє Eloquent?

include/exclude

Ну, власне, в тому і фішка, що його придумали як покращення

Воно експозиться як звичайний invokable контролер і лишається написати все той же самий

Як нарахунок ендпоінтів, вони теж генеруються автоматично?

От вище в тексті постійно проскакує, «мені не потрібно думати про АРІ». З АРІ платформ — не потрібно думати не те що про апі, а навіть про контролери:)

вже від самого початку

Це не актуальна умова, тому, що проекти робляться з врахуванням масштабування.

А що саме воно такого робить, чого не вміє Eloquent

В нас, нажаль, навіть не Елоквент, а самописна актів рекорд орм. Елоквент в цілому — хороша штука. Не настільки потужна як доктрина (ну принципи зовсім інші) але, власне, якби у нас був Елоквент, я би був щасливий:)

PHP_OPCACHE_ENABLE: 0

а это зачем? оно проверяет по-умолчанию время изменения файлов и само сбрасывает кэш, а с отключенным кэшем оно будет тормозить и заставлять перекомплировать при каждом запросе всю огромную кодовую базу

бажано відразу його гарно розділити на мікросервіси;
Тут перше, що спало б на думку — одразу все ділити на мікросервіси.

У вас какая-то предубежденность насчет всерешаемости микросервисами, это отдельный мир со своими болячками

Більшість успішних історій про мікросервіси починались з моноліту, який став великим та був розділений.

ну так некоторые так разделили что получили distributed монолит, какие-то проблемы ушли а добавилась груда новых

PHP_OPCACHE_ENABLE: 0

відповідь у тексті статті

Якщо щось трапилось, розробники зможуть дуже швидко все виправити, бо на проді вони не побачать нічого нового. Там буде все те саме, що й локально.

а ну если устраивает тратить впустую 50% cpu на перекомпиляцию всего кода фреймворка на проде на каждом риквесте то ок

Я це не толерую :). Страждатимуть не тільки CPU, але й диск, ОЗУ, швидкість відповіді. Сюди ж можна додати проблеми з неконсистентністю файлової системи під час доставки змін (нових файлів). Взагалі, Reproducible Docker Builds — це не те, на чому варто економити.

В локальній розрозбці важливіше щоб точно усі зміни підхопились, незважаючи на ресурси. Це конфіг чисто під локальну розробку. А на проді в нас просто цього рядочку не було. docker-compose.yml в нас був трішки кастомізований під енвайромент.

Насправді, така конфігурація в нас була тільки на локальному оточенні. На продакшені Opcache ми не вимикали по зрозумілим причинам. Якщо вимкнути, то окрім ресурсів банально швидкість відповіді стає вдвічі більшою, що нас не влаштовувало.

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

Laravel чудовий вибір!
Особливо на початковому єтапі.

Байдуже загалом на чому круд в MVP крутити. Вибирати виконавців треба.
Адепти ларавеля можуть як хутенько ракету побудувати, так і натягти всілякого опенсорс лайна яке ніхто не сапортить і доведеться його потім випалювати або сапортити самому.
Ларка в часи своєї юності була сирим *уяк-*уяк фреймворком — мініклоном рельс на пиху. Вся описана вище біда з міграцією між мажорками — через розвиток пиха, який відмовився вмерти на 5.6 і «прогресивності» ідейного натхненника фреймворку який загалом бив болт на зворотню сумісність і вважає що всім нема чим займатись — тільки як регулярно оновлювати фреймворк. Зараз ларка відносно зрілий *уяк-*уяк фреймворк (rapid development framework). Забабахати сайтєц, і через 2 максимум 3 роки звалити з проекту/злити клієнта, або розгрібати наслідки штампування мажорок фреймворку щороку.

якщо ваш підхід

і через 2 максимум 3 роки звалити з проекту/злити клієнта

то повністю погоджуюсь

у вас свій досвід у когось свій =)

Підписатись на коментарі