#Meeting room з Software Engineer: Оптимізація legacy систем – практики та підходи

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

Розкажи, який проєкт запам’ятався тобі найбільше, так би мовити загартував тебе? 🙂

– Це був проєкт для нашого великого замовника із США у бізнес домені FinTech, що працює з оподаткуванням для компаній у різних куточках світу. Саме там я вперше зустрівся із legacy системою.

Які перші виклики здавалися тобі найбільш серйозними?

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

Як щодо оптимізації продуктивності? Що було найскладнішим завданням?

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

Як ти підходив до міграції функціоналу з великого legacy-проєкту без достатньої документації? Що допомогло тобі впоратися з цим викликом?

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

Як ти обирав оптимальний підхід для забезпечення зворотної сумісності з legacy-системою?

– Оптимальний підхід до забезпечення зворотної сумісності залежить від ситуації, але в ідеалі я покладаюся на співпрацю з QA інженерами, які добре знають legacy-систему. Вони допомагають підготувати детальні тестові кейси, на основі яких можна порівнювати поведінку старої та нової систем. Якщо ж такої можливості немає, я беру цю відповідальність на себе: аналізую існуючий функціонал, створюю власні тести, а за можливості – автоматизую їх. Це дозволяє бути впевненим, що після міграції все працює коректно і нічого не зламалося.

Які найбільші труднощі виникали при роботі зі складними SQL-запитами та структурами бази даних, і як ти їх долав?

– Найбільші труднощі виникали тоді, коли один запит містив кілька JOINs, subqueries та операцій з даними, які робили його повільним. Я долав це, використовуючи інструменти для аналізу запитів, такі як execution plan в Oracle SQL, що дозволяв мені бачити, як база даних виконує запит. Часто я знаходив, що проблема була в неоптимізованих індексах, і, створивши їх, я міг прискорити запит у десятки разів.

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

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

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

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

Як ти налагоджуєш ефективну комунікацію з різними командами, особливо коли є розбіжності у вимогах?

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

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

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

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

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

Як ти знаходиш баланс між власними завданнями та допомогою команді?

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

Що для тебе означає “командний результат” і як ти допомагаєш його досягати?

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

Що ти вважаєш своїм головним внеском у розвиток команди чи проєкту?

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

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

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

Озираючись назад, що б ти порадив собі на початку роботи над цими викликами?

– Я б сказав: “Пробуй нове, не сумнівайся і не бійся помилятися”. Я б порадив собі більше цікавитися всім хоча б потроху. Також, дуже важливо черпати досвід більш досвідчених спеціалістів, адже це найшвидший шлях до професійного зростання.

Comments are closed