Какъв трябва да е съвременният програмист – тесен експерт или човек с широки познания?

11 септември
Юрий Юрченко, организационен проектен мениджър
Какъв трябва да е съвременният програмист – тесен експерт или човек с широки познания?
През 2020 година празнуваме Деня на програмиста на 12 септември. Този ден се отбелязва в редица страни по света, сред които и България, на 256-тия ден от годината. Числото 256 (256 = 28) е избрано, защото това е максималният брой стойности, които може да се кодират с един байт (8 бита). 

По случай Деня на програмиста DataArt ви представя едно доста нестандартно интервю, в което нашият колега Юрий Юрченко, организационен проектен мениджър, реши да зададе някои въпроси към самия себе си. Ето и неговите размисли относно това какъв следва да бъде съвременният програмист, трябва ли да е фокусиран върху конкретно направление или пък е добре да има широк спектър от познания:

Работя в ИТ сектора от 35 години, като повече от 20 от тях се занимавам с разработването на софтуер, главно като мениджър. През този период съм се бил ангажиран с почти всякакъв вид дейности: от информационна сигурност до внедряване на бизнес процеси за различни клиенти, с преподаване, менторство, обучение и семинари. И най-важното - участвах в създаването на екипи, които могат да правят почти всичко и да се чувстват удовлетворени от постигнатото.

Докато подготвях тази статия, си спомних, че мина доста време от последното ми интервю. А говоренето е интересен процес: той стимулира невроните и в същото време е полезен за самочувствието. Затова си помислих: защо да не се самоинтервюирам? Това е удобно, безопасно, забавно и достатъчно странно начинание.  И така, седейки удобно вкъщи, си зададох следните въпроси.

- Въз основа на вашия опит, универсалните специалисти ли са тенденцията през последните години?

- Това е доста комплексен въпрос. Когато говорим за разликите между хората и животните, например, умението за боравене с инструменти е първото нещо, което ни идва наум. Нашият далечен прародител откри пръчката и определи бъдещето на цялата планета. След време именно тази пръчка се превърна в универсален инструмент: тя вече можеше да се използва като бастун, да свали плод от дърво, да измери дълбочината на локва, да разрови мравуняк и дори да се използва за самозащита срещу врага.

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

В историята на ИТ в началото езиците за програмиране бяха като тази пръчка на първобитния човек. С помощта на кодове и асемблери беше възможно да се демонстрира всичко, което може да направи машина за електронна обработка на данни. Работата с тях обаче отне много време и беше доста неудобна за разработчика. Следователно езиците на високо ниво като PL, REXX и Fortran се появиха доста бързо. В същото време не трябва да се забравя, че езикът за програмиране е език за комуникация като всеки друг. Това просто ни позволява да общуваме не само помежду си, но и с машини. Това означава, че разширява кръга от контакти, правейки нашите комуникационни умения по-универсални.

- Смятате ли, че идеята за универсалност е тясно свързана с професията на програмиста?

- Има програмисти с богат опит, които се насочват към определени сфери с перспектива да продължат дълги години в същия сектор, например - банковото дело. В тези случаи са налице програми, които могат да останат непроменени дълго време, защото са пригодени за всеки, който влиза в пряк контакт с тях. В такава ниша е относително лесно да се пише код, докато достигнете пенсионна възраст. Но, от една страна, броят на този вид работа е ограничен, а от друга, тази дейност става доста скучна след време. Дори ако човек не се притеснява от скуката и е по-мотивиран от доброто заплащане, готов ли е да поеме риска да не трупа нови познания и да е по-малко конкурентен на пазара на труда? 

Всички останали програмисти работят при различни условия: те трябва да продължат да учат непрекъснато: или като трупат познания в избраната от тях конкретна технология, чиито инструменти се променят драстично (пример: C, C ++, C #, Golang) или като добавят нови технологии в портфолиото си. А най-добре и двете.

След като разберем как работи бизнесът на клиента и защо разработваме нова система, ще бъде много по-лесно да открием логически несъответствия и да предложим начини за подобряване на изходния продукт. Хората, които са добри в това, ще бъдат търсени за всеки проект, особено ако използвате усъвършенствани инструменти.

Сега самите технологии се развиват в посока пресичане и дори частично сливане на различни аспекти. Да вземем например MLOps - комбинация от технологии за машинно обучение и подходи за внедряване на разработени модели в бизнес процеси. Много е важно тази нова специфична област да търси начин за организиране на сътрудничество между представители на бизнеса, математици, специалисти по ML и ИТ специалисти. Това не би било възможно, ако всички говорят на различен език, тоест - не владеят терминологията, свързани с основното им направление. Според мен съвременният софтуерен специалистът трябва да е добър поне в три програмни технологии и да е в състояние да разбира терминологията им. Интересно ли е да работите по MLOps проект? Не мисля, че много хора биха отназали тази възможност. Ще бъде ли нает някой, който не е готов да разшири уменията си? Малко вероятно е, дори ако този човек отдавна е брилянтен професионалист в своята тясна сфера.

- Вярно ли е, че „универсалността“ се свежда до това да разбираш колеги, работещи с други програмни технологии?

- Като цяло програмирането е много по-близо до лингвистиката, отколкото до класическите инженерни дисциплини. Това е много очевидно във взаимодействието между инженери и компании. Всички знаем, че клиентите не идват при нас, за да мигрират, да речем, своята система към нова технологична платформа. Вместо това искат да улесним операциите, да им помогнем да обработват повече заявки, да се съкрати времето за обслужвате на клиенти и т.н. Ако се заемете с чисто техническа задача, можете да създадете качествен продукт, от който клиентът изобщо не се нуждае.

Следователно, максимална ефективност се постига, когато всеки член на екипа разбира не само какво прави по проекта, но и защо го прави. Това означава, че от програмиста вече се изисква известна универсалност на знанията.

- Трябва ли един програмист да знае достатъчно за технологиите и бизнеса?

- Да кажем, че това не е задължително условие. Но при всички случаи, е изключително полезно при работа, комуникация с колеги и разбиране на случващото се на различни нива. Началото на специализацията бе дадено с разделянето на ролята на администраторите на бази данни. За първи път имахме нужда от хора, които притежават задълбочени познания за спецификата на скриптове и конфигуриране на DBMS от различни доставчици. Тази специализация обаче се провали. И веднага след като DBA се появи, много разработчици казаха, че могат да напишат кода както искат, защото администраторът ще дойде и ще оптимизира всичко. След това им омръзна да отговарят на въпроса "защо моята SQL заявка е толкова бавна?".

Тази странна ситуация беше разрешена по един прост начин: бекенд разработчикът трябва да разбира всички основни характеристики на базата данни, за които пише SQL заявки. 

Същото се случи при разделянето на разработката на интерфейсни и бекенд области. Специализацията винаги ви позволява да се задълбочите в дадена тема, но фокусирането върху една сфера си има висока цена: комуникацията с хора от други области става по-трудна. Една от водещите прояви на универсалност е пълният стак. Ако някой иска да разбере по-добре как работи архитектурата като цяло или как потребителят взаимодейства със системата, това вероятно ще му позволи да се справи без скъпи и неудобни „преводачи“, дори ако същият този специалист все още работи като разработчик на интерфейс или бекенд. Тук стигаме до жизненоважна точка: писането на код, който работи оптимално, е много по-забавно от писането на код, който работи нормално.

- Кой може да се нарече универсален специалист?

- Универсалният специалист не е човек, който е в конкретна, непозната за него технология. Напротив, той следва съвременните тенденции и постоянно е готов да инвестира време, внимание и енергия в научаването на нови неща. Винаги се е предполагало, че ако не сте просто програмист, а разработчик, ще трябва да познавате предметната област, както и да продължите развитието си в света на технологиите. Не става дума за познаване на два, три или пет програмни езика, подходи или методи. Универсалността е преди всичко способността да се учиш постоянно.

Например ние в DataArt имаме изследователска група, занимаващи се с изкуствен интелект. Това е отворена общност, в която хора от различни индустрии и професионални среди обсъждат как да приложат AI на работното място. Те идват и говорят, дори ако тяхната област няма нищо общо с AI в момента. Това разширяване на техните знания им позволява да мислят нестандартно в бъдеще.

Ако сте избрали посока и работите за голям проект, в който възнамерявате да инвестирате много време, струва си да разгледате технологиите, които могат да бъдат полезни. Но рано или късно всички проекти приключват и трябва да се запитате "какво искам да направя по-нататък?".

Например DataArt разработи специална таблица, за да улесни професионалистите в намирането на нови области на техническо развитие. Това им позволява да определят нивото на свързаност между новите технологии и технологиите, които вече познават, да направят оценка на времето, което ще трябва да отделят за изучаване на нова област, както и да видят препоръчителен набор от курсове.

Обучението не е загуба на време, а инвестиция в най-чист вид. Винаги съществува риск тази инвестиция да не се изплати, но си заслужава да опитате. Ето ви скорошен пример: един от нашите разработчици на интерфейси пое бекенда и след 3-4 месеца той бе поканен да се присъедини към проекта като full stack със значително увеличение на заплатата. Но тъй като той също инвестира време и усилия в екипната работа и натрупване на нови познания, шест месеца по-късно му беше предложено да стане ръководител на екипа.

Ясно е, че всеки човек има ограничени ресурси от време и енергия, така че трябва да се вслушате в себе си: готови ли сте да поемете допълнителната тежест и можете ли да учите редовно? Понякога ще трябва да признаете, че сте уморени и се нуждаете от почивка, поне за известно време. Обущар, който прави сандали, не е необходимо да бъде бояджия, но ако се научи да шие ботуши, ще бъде търсен през цялата година. 

Между другото, не харесвам термина „преквалификация“, който се използва често, сякаш старите знания са изчезнали, а новите ги заместват. Това е фундаментално неправилно: за специалистите от общ характер техният опит нараства непрекъснато и знанията, които се натрупват, служат за по-добро бъдеще. Затова е по-подходящо да се говори за „допълнително обучение“. В същото време нищо не ви пречи да задълбочите знанията си в рамките на основната специализация, тъй като ценните програмисти са признати експерти в своята област, но едновременно с това могат лесно да говорят с колеги от други специалности.

- Възможно ли е да тествате собствената си гъвкавост за усвояване на нови познания?

- Преди всичко, за да се усвои дадена нова технология, е необходимо да се реши някакъв реален проблем с нея. Това може да бъде проект под наблюдението на специалист, страничен проект или дори практическа задача в рамките на курс. Що се отнася до обхвата на интересите, просто погледнете какво сте научили наскоро, какви книги и статии сте прочели.

Универсалните специалисти се интересуват от пазара и се стремят да изберат най-подходящ проект, който да им помогне в развитието. Това отваря широки възможности за усъвършенстване и следователно този тип експерти ще са в състояние да се съсредоточат върху нова област, в която да трупат знания и умения.