Як ми проєкт для ЗСУ писали і що з цього вийшло

Хто я?
Розпочнемо з того, хто я. Звати мене Віктор. Працюю я Node.js (MERN) розробником на одного з найбільших автодиллерів Північної Америки. Займаюсь програмуванням з 2018го року та зараз обіймаю посаду старшого розробника. Свою карєру розпочнав як Java розробик, але волею випадку перейшов на JS та опинився у Північній Америці.
Свою роботу я люблю, та ходжу на неї із задоволенням. Останні роки не відчуваю, що на роботі, так як команда та клієнт мене цінують і від цього зажди є стимул приходити в офіс. А я в свою чергу ціную їх.

Як все починалось?
Почалося все з того, що знайомий мого знайомого який несе службу у ЗСУ звернувся до нас з проханням написати для одного з підрозділів сайт, через який можна зробити збори у гарній обкладинці та мати всі збори бригади в одному місці, а не так, як воно було до цього, що кожен збирає у інстаграмі для свого чоловіка/брата/однокласника.

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

Одного дня нас всіх зібрали на дзвінок з «замовником». Чоловік нам все детально пояснив на словах і задача здавалась зрозумілою. Хтось з бригади, або довірені люди (адміни) можуть зробити проект, додати опис, фоточку та лінки на соціалки. Питання оплати відпало само собою, так як у нас є чудовий функціонал банок від Монобанку. До збору просто додавалось посилання на банку і на тому питання оплати закривалось. Людина може зайти на сайт, вибрати збір, який їй подобається, перейти на банку і кинути свої чесно зароблені 10грн.
Звучить максимально просто. Пригода на 20хв, зайшли, вийшли


Команда
Команда складался з 5ти людей, двоє з яких були замовниками додатку, які нарізали нам задачі, та троє безпосередніх розробників.

Я, на стороні бекенду разом з Р, який є джуніор розробником та студентом одного з вузів. Він також пише на Node.js та використовує фрейморк Nest на своєму проекті.
Є молодим, енергійним, амбітним. Напевно, як і ми всі у 19 років, чи не так?
Досвід: 1рік.

На стороні фронтенду був дуже досвідчений Ю, який займає посаду архітекта на одній з команій, яка входить до «великої пятірки» українського ІТ. Надзвичайно розумний, досвідчений та стриманий. Знає, здається, всі фреймворки, які придумав світ.
Досвід: 10+ років



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

Покумекали, що проект доволі простий, дедлайн у нас майже 2 місяці, а отже можна взяти те, з чим ми хотіли попрацювати, але на основних проектах цього немає.
Обрали ми Nest.js на базі Postrge з ORM Sequalize.

З Nest особисто я працював лиш на відео з ютубу, а з PostgreSQL останній раз мав справу близько 5 років тому. Ідеальний початок, чи не так?
Накидавши базову струкутуру проекту на PostgreSQL і працюючи над документацією для фронтенд розробника, нам порадили перейти на круту нову модну ORM від українських розробників під назвою Drizzle. «Це ж прекрасна ідея. Підтримаємо наших!», подумали ми і вирішили переписати вже готові наші 5 табличок зі всіма звязками на нову ORM. Це зайняло нам доволі багато часу, так як уявлення про Drizzle ніхто з нас не мав, а документація там доволі посередня, як на мене (хай вибачать мене розробники даного проекту).

Після того у нас був ще один кол з замовником, який вирішив побрейнштормити нас ідеями, які йому накидали його колеги. Там уже почали зявлятися перші паростки думок, що ми не вкладемося в 1,5 місяці, які залишились, так як зявилися команди, статистика та ще деякі речі, які звучать «А було б круто мати ****», але реалізувати це не так просто, як сказати. На слова, що це не так просто і швидко, як можна здатися, клієнт казав шось типу «Так отут кнопку нажав і воно показало». Іноді ми проводили майже по 2 години в спробі пояснити, що це трошки не так працює, за що я дякую пану Ю. з його сталевою витримкою.

Більше проблем
Поскільки на початку ніхто нам таких задач не ставив ми зрозуміли, що та структура бази даних, яка у нас є зараз нам підходить мало, або не підходить майже зовсім. І почався процес перебудовування таблиць. Там забрати, там додати, там нова таблиця і так пройшло ще майже 2 тижні.
Тут в дію вступило правило розробки номер 2 — ніколи не слухай свого клієнта.
Ми, як розробники, які бачать картину глибше, та мають більше досвіду в розробці мали б передбачити, що не все так просто, як описує замовник і потрібно готувати архітектуру під умовний блокчейн з АІ інтегрований з Резерв+ і логіном через Дію, а не те, як зробили це ми.

За той час, поки ми розробляли нову структуру бази даних у нас ставало все більше і більше пролем з Drizzle і питання зміни ORM стало ребром. Як реалізувати деякі речі ми просто не могли знайти в документації. ORM постійно видала не зрозумілі помилки і відмовлялась робити деякі звязки або ж типи для TypeScript. В свою чергу люди, які трошки більше працювали з ним, з якими ми консультувалися відповідали просто «Та там десь має бути, пошукай».
У мене навіть були думки переписати це на Express та Mongo, з яким ми працюємо на основному проекті і за відносно короткий проміжок часу здати проект. Але від такої ідеї мене відмовив мій колега, пан Р.

Потім настав ще один дзвінок з клієнтом, на який ми прийшли майже не готові, так як по суті ми лише боролися з створеною нами самими проблемою з посередньою архітектурою, не готовою до такої кількості нових фіч та погано вибраною ORM в спарці з Nest.js.
Але замовник не розгубився і почав нам накидати нових фіч. Тепер там зявилися сповіщення в телеграмі і керуванням всім проектом через Excel замість панелі адміністратора на сайті.
Сказати, що це нас вбило — не сказати нічого.

І ми вирішили поміняти ORM ... знову.
На цей раз ми обрали просте і зрозуміле рішення, з яким мав справу мій юний колега, який дуже багато зробив на стороні бекенду в часи змін, за що йому подяка. Вибір наш припав на Prisma.
Дякую Р., який переписав все самостійно на нову ORM і знову переробив структуру бази даних. Цей етап нам дався не дуже складно.
До здачі проекту залишається 2 тижні, а у нас з готового лиш CRUD на проекти та юзерів від якого корситі не дуже багато, вроховуючи всі побажання нашого замовника.

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

Зрозумівши, що ми нічого не встигаємо нам клієнт сказав, аби ми зробили хоча б те, про що ми говорили з самого початку, аби мати хоча б щось.


Чим все закінчилось?
Ми здали проект майже вчасно повернувшись туди, звідки ми почали свій шлях.
Проект залишився на Prisma та Nest.js. Але база данних була перероблена ... знову

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

Проект зарелізився. Команда щаслива. Замовник теж. Люди донатять. Підрозділ має кращу фінансову підтримку і нищить ворогів.
Хіба не заради цього все задумувалось?

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

Я ні в якому разі не хочу відлякати людей від проектів для ЗСУ. Діджиталізація армії дуже важлива. Тільки вона допоможе нам еволіціонувати з Української Паперової Армії в справжню армію сучасності. Якби не даний проект, я б не познайомився з деякими класними людьми, не вивичив би Nest та не спробував би декілька нових, цікавих, або не дуже ORM. А ви б, в свою чергу, не прочитали цю статтю.

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

tylovyky.com/ua


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

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

Але куди ж без уроку для самого себе?
І найголовніше, що я виніс з цього проекту — «Make it work, then make it good» це золоте правило, яке наша команда притримується на проекті і до чого нас підштовхує замовник на основному моєму місці роботи. І звичайно, що ми його порушили на цьому проекті. Маючи в запасі величезний проміжок часу, ми вирішили поексперементувати з технологіями, які були нам зовсім не відомі. Через що ми втратили багато часу, на те, аби зробити найпростіші елементи. Спочатку було необхідно зробити проект на технологіях, які нам були відомі і тоді вже переписати на щось інше.

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

І останнє на сьогодні, третє праило — завжди розвивайся. Працюючи вже майже 5 років на одному проекті, де все доволі стало і нема кардинальних змін, розумієш, що почав «ржавіти» як розробник. Я ніби вийшов з кріо камери після 100 років без свідомості. Навколо стільки нового! Так багато нових фреймоврків, біблотек, обгорток, надбудов. І ти розумієш, що аби залишатися на ринку потрібно постійно розвиватися, вчитися, читати, писати код.
Навіть якщо у вас нема часу, енергії, сил на свій пет проект, то ви просто змушені вчитися і вирішувати задачі з прогармування в стилі CodeWars / LeetCode. В іншому випадку за 5 років будете відчувати себе як неандерталець в 21му столітті.

P.S
Хочу висловити подяку людям, які пройшли зі мною цей шлях.
— Нашому замовнику пану Б. та пані М. за чудову можливість попрацювати на проекті для однієї з найкращих бригад ЗСУ.
— Фронтенд розробнику Ю. за його неоціненний вклад в розробку проекту та пояснення нам не відомих до цього речей
— Бекенд розробнику Р. за те, що в часи, коли це було необхідно сидів до ранку та писав код та за продуктивну спільну роботу.



Сподіваюсь ця стаття допоможе вам не робити моїх помилок на ваших проектах.

👍ПодобаєтьсяСподобалось5
До обраногоВ обраному2
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

А навіщо декілька разів міняли СУБД (якщо я, вірно зрозумів).

Типу «я взяв pоstgreSQL, MySQL, Oracle... та будь, що з добре задокументованого, зробив там спершу 4-5 таблиць зі зв’язками, далі по ходу появи „нових ідей“, додаю таблиці та поля...» то є некошерно у теперішньому світі?
Обов’язково гратись з ORM моделями «моднима»....

Бо тоді все це більше нагадує не «Make it work.... Then good», a «Let’s make it fun for us, then somehow we’ll make it work....» 🤔

Ну от того що ОРМ і всліпу з гівна кулю ліпили

Нікого з розробників в окоп під Авдіївку не відправили, так що модна казати про happy end.

А чому? Можна якусь статтю про це прочитати? Був би вдячний за будь яку інфу в цьому напрямку

Проблема у тім що через прошарок ОРМ ти відірваний від бази та сервера. Ти оце тут щось написав і воно якимось магічним чином це перетворило на SQL і виконало.
А потім приходять DBA і показують тобі якусь незрозумілу хрінь і кажуть що оцей запит працює погано і тре його переробити ось так і ось так. І починається гра «вгадай С# код по SQL запиту» з продовженням у вигляді «як його змусити зробити те що просять DBA».
Але я не вважаю ОРМ цілковитим злом. У нескладних випадках (а таких переважна більшість) це цілком працездатна річь, навіть зручна, яку, менше з тим, тре окремо вивчати.

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

ОРМ дозволяє швидко накидати прототип з простою логікою чи круд.
Також легший і дешевший вхід для девелоперів.
Можна наприклад накидати ідею стартапу
Але машиабуватися може не так легко

Для складних випадків можна попросити DBA створити вьюху, для неї створити окремо entity, repository, а запити, якщо вони повертають постійно те саме, можна закешувати у кеші 2-го рівня.

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

Зроби всеодно проводяться в інстаграмі, фейсбуці та інших платформах.
Наша платформа стала своєрідним хабом, який акумулює в собі всі збори і дає можливість робити гарні сторіси та командні збори на якусь велику суму.
Якщо Ви перейдете на сайт, то побачите, що люди мають бекграунди з фотографією, назвою команди і таке інше. І часто це можна побачити в сторісах в інстаграмі, так як каринку, яку ви собі генеруєте на сайті можна скачати.
Якщо ви збираєте наприклад 1млн грн, то зібрати це самому майже нереально. І власне тут зявилась концепція «Команди», коли кожен збирає по 10 тисяч, наприклад, а потім перекидає на спільну велику банку на мільйон.

Чудова стаття!
Варта уваги та прочитання)

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