paint-brush
Разумны праграмістпа@themachine94
Новая гісторыя

Разумны праграміст

па theMachine9410m2024/10/26
Read on Terminal Reader

Занадта доўга; Чытаць

Гісторыя пра тое, як студэнт апошняга курса з высокімі паўнамоцтвамі далучыўся да нашай маленькай каманды.
featured image - Разумны праграміст
theMachine94 HackerNoon profile picture

Я жыў і працаваў у невялікім горадзе на паўночным захадзе Германіі да пандэміі COVID. Я працаваў у невялікім стартапе. Я быў адным з 7 інжынераў кампаніі. Нягледзячы на тое, што мы вельмі невялікая каманда, мае калегі былі аднымі з самых разумных людзей, з якімі я калі-небудзь працаваў. Мы стварылі ўласнае настольнае прыкладанне, якое выкарыстоўваецца інжынерамі-механікамі для распрацоўкі дэталяў. Такія дэталі ішлі ў машыны, самалёты і да таго падобнае. Гэта была праграма 3D-мадэлявання (CAD), таму, натуральна, кожны раз, калі мы наймалі новага інжынера або прымалі стажора, мы аддавалі перавагу людзям, якія добра разбіраліся ў матэматыцы, геаметрыі, пішуць нізкаўзроўневы высокапрадукцыйны код і г. д. Калі мы апытвалі кандыдатаў, мне давалі адказнасць за правядзенне тэхнічнага інтэрв'ю. Я падрыхтаваў некалькі заданняў па праграмаванні, якія адлюстроўваюць навыкі, якія мы жадаем мець ад кандыдата. Я б папрасіў кандыдата вырашыць праблему і абмеркаваць іх працэс мыслення. Нават калі яны не скончаць рашэнне за 45 хвілін, гэта быў карысны спосаб даведацца, што яны ведаюць і як думаюць. Іншыя члены маёй каманды бралі інтэрв'ю ў кандыдатаў па іншых крытэрыях, такіх як асоба і г. д. Гэта спрацавала вельмі добра, і мы нанялі некалькі сапраўды таленавітых і матываваных інжынераў. Мы ўсе былі добрыя ў тым, што рабілі, і паважалі адзін аднаго.


У пачатку 2020 года да нас звярнуўся студэнт апошняга курса мясцовага ўніверсітэта з просьбай аб практыцы. Я ўзяў так неабходны адпачынак і паехаў у Берлін на пару тыдняў. Так што мяне не было побач, каб правесці тэхнічнае інтэрв'ю. Мой кіраўнік і астатняя каманда былі вельмі ўражаны студэнтам падчас інтэрв'ю, і яго рэзюмэ было выключным. Раней у нас не было стажора. Мой кіраўнік палічыў, што тэхнічнае інтэрв'ю можа быць непатрэбным для стажора. Таму ён вырашыў, каб ён пачаў працаваць з намі без тэхнічнага інтэрв'ю. Я вярнуўся з водпуску і мне сказалі пра новага стажора, які павінен быў паступіць на наступны тыдзень. Я павінен быў кантраляваць працу гэтага стажора. Па сутнасці, пераканайцеся, што ён разумее, што трэба зрабіць, адкажыце на любыя пытанні, разблакіруйце яго ў любым выпадку. Мы ўжо выклалі набор праблем, над якімі хацеў працаваць стажор. З гэтага часу я буду называць стажора Стэфанам. Прыблізна ў гэты час было шмат размоў пра распаўсюджванне каранавіруса ў Германіі. Гэта было ўсюды ў навінах. Мы былі невялікай камандай, і мы прывыклі працаваць побач, задаваць адзін аднаму пытанні, праводзіць мазгавыя штурмы на белых дошках і г.д. Але, нажаль, роўна за дзень да таго, як да нас далучыўся Стэфан, Германія цалкам спынілася. Мы ўсе пачалі працаваць выдалена з дому. Першыя некалькі тыдняў мы змагаліся з выдаленай працай. Будучы кіраўніком праекта Стэфана, я сказаў яму, што ён можа звярнуцца да мяне з усім, што яму спатрэбіцца для працы. У выпадку, калі я быў у ад'ездзе або заняты, іншыя члены каманды былі рады ўскочыць і дапамагчы Стэфану.


Наша база кода была сумессю C# і C++. Усе нашы карыстальнікі выкарыстоўвалі Windows, таму мы напісалі інтэрфейс і ўсё астатняе, што не было крытычным для прадукцыйнасці, на C#. Усе нашы лікавыя алгарытмы, 3D-рэндэрынг і ўсё, што важна для прадукцыйнасці, было напісана на C++. Большасць членаў нашай каманды добра валодалі абедзвюма мовамі, некаторыя спецыялізаваліся на адной або другой. Стэфан сцвярджаў, што вельмі дасведчаны ў C# і C++. У яго першы дзень я некалькі гадзін размаўляў са Стэфанам, тлумачачы яму нашу кодавую базу, наладжваючы ўсё на яго лакальнай машыне, каб ён мог пачаць. Стэфан крыху нерваваўся і сказаў, што ён даўно не пісаў C++ і не карыстаўся Windows. Стэфан штодня ездзіў на машыне Linux. Здавалася, што яму цяжка было напісаць C++. Я падумаў, што ён крыху збянтэжаны працы ў новым асяроддзі, новай кодавай базе, і вырашыў дапамагаць яму, пакуль ён не пачне працаваць. Такім чынам, мы запраграмавалі пару на наступныя пару гадзін. Яму трэба было, каб я дапамог яму напісаць код па радку. Ён працягваў рабіць дурныя памылкі ў сваім кодзе, і яму трэба было, каб я выправіў іх і паказаў яму правільны спосаб рабіць рэчы. Я падумаў, што гэта крыху дзіўна, але ўсё роўна вырашыў даць яму шанец. Я спадзяваўся, што да канца нашай размовы Стэфан ведаў дастаткова, каб працягваць працаваць самастойна.


Да маёй радасці, на наступны дзень я не пачуў ад Стэфана. Я напісаў яму паведамленне, і ён сказаў, што робіць поспехі і яму нічога ад мяне не трэба. Я быў рады гэта пачуць. Я мог засяродзіцца на ўласнай працы. Але на наступны дзень Стэфан зноў звярнуўся да мяне з просьбай аб дапамозе. Каб унесці свой уклад у нашу заяўку, Стэфану прыйшлося напісаць C# і C++. Яму прыйшлося напісаць лікавую частку алгарытму на C++, злучыць яго з інтэрфейсам і зрабіць некалькі іншых рэчаў на C#. Калі Стэфан звярнуўся да мяне на трэці дзень, ён не дасягнуў ніякага прагрэсу са сваім кодам C++. Гэта было ў асноўным там, дзе мы спыніліся ў канцы першага дня. Але ён значна прасунуўся са сваім кодам C#. Ён атакаваў задачу з абодвух бакоў адначасова. Стэфан з гонарам паказаў мне рэчы, якія ён напісаў на C# на другі дзень без маёй дапамогі. Я прачытаў код і быў ім уражаны. Код быў сапраўды высокай якасці. Гэта было лаканічна, элегантна і эфектна. Я падумаў, што Стэфан сапраўды таленавіты. Магчыма, ён сапраўды быў трохі заржавелы з сінтаксісам C++ і дэталямі мовы, але яго код C# паказаў, што ў цэлым ён быў добрым праграмістам. Я палічыў, што гэта добры знак і што ён, хутчэй за ўсё, вельмі хутка палепшыць свой код C++. Гэта заахвоціла мяне дапамагчы яму з C++. Я зноў правёў некалькі гадзін у дзень 3, спалучаючыся са Стэфанам, дапамагаючы яму з кодам C++. Гэты цыкл паўтарыўся яшчэ раз. Стэфан пайшоў самастойна і напісаў код на C# на 4-ы дзень, і вярнуўся да мяне з просьбай аб дапамозе з C++ на 5-ы дзень. У гэты момант я пачаў станавіцца падазроным. Узровень, на якім яму патрэбна была дапамога з кодам C++, не адпавядаў высокай якасці кода C#, які ён напісаў. Здавалася, што ў C++ ён змагаецца з асноўнымі паняццямі, як працуюць камп'ютары, як працуе памяць і г.д. Відавочна, што C# - гэта мова для збору смецця, і вам не трэба ведаць кіраванне памяццю, але нешта мне падалося не так, і я не мог паклаў палец на гэта.


Прайшоў цэлы тыдзень. Як каманда, якая прывыкла працаваць у офісе, мы ўсе ненавідзелі працаваць выдалена. У гэты час падчас блакіроўкі нам дазвалялася збірацца групамі па 7 чалавек ці менш. Калега, назавем яго Дэвід, запрасіў мяне і яшчэ пару калег да сябе дадому на шашлык на выходных. Ён жыў не так далёка ад мяне, і мы рабілі падобныя рэчы раней. Надвор'е было добрае, мы тусаваліся ў двары Дэвіда з яго жонкай і 3-гадовай дачкой. Мы смажылі на грылі, елі мяса і гародніну, выпілі некалькі куфляў піва, і настрой быў вельмі прыемны. 3-гадовая дачка Дэвіда падавала нам бруд у маленькіх пластыкавых шкляначках, робячы выгляд, што гэта марожанае. Што і казаць, я не паддаўся. Дэвід падняў тэму Стэфана, і размова пайшла прыкладна так:


Дэвід: Як справы са Стэфанам? За апошні тыдзень ён некалькі разоў звяртаўся да мяне з просьбай аб дапамозе.


Я: О, так, я таксама яму няшмат дапамог. Ён толькі пачынае, таму я не супраць дапамагчы яму. Што вы пра яго думаеце?


Дэвід: Так. Я быў вельмі ўражаны яго працай. Ён піша вельмі якасны код і, здаецца, ведае, што робіць на C++, але з цяжкасцю піша добры код на C#. Я дапамагаў яму пісаць код на C#.


Я спытаў Дэвіда: "Пачакай, ты маеш на ўвазе ўсё наадварот? Таму што я думаю, што яго C# вельмі добры, але ён адстой у C++". Як толькі я скончыў сказ, мы абодва зразумелі, што адбываецца. Я карміў з лыжкі код Стэфана C++, які ён паказаў Дэвіду як свой уласны. І праз дзень Дэвід карміў з лыжкі код Стэфана C#, які ён паказваў мне як свой. Я быў уражаны якасцю кода Дэвіда на C#, а Дэвід быў уражаны маім кодам на C++. З аднаго боку, у нас з Дэвідам быў цудоўны момант брата, як мы захапляліся кодам адзін аднаго. Але гэты момант быў азмрочаны тым фактам, што мы абодва былі падмануты Стэфанам. Гэта было проста з гісторыі, але адбывалася ў рэальным жыцці. Гэта было падобна да гісторыі пра таго хлопца, які не ведаў, як гуляць у шахматы, але здолеў згуляць унічыю з двума гросмайстрамі, гуляючы паміж імі. Стэфан рабіў гэта ў рэальным жыцці. Стэфан нічога не ведаў. Мы ненавідзелі сябе за тое, што спатрэбіўся тыдзень, каб зразумець гэта. Па праўдзе кажучы, калі б мы былі ў офісе, гэты фокус не спрацаваў бы. Мы ўпалі на гэта з-за таго, як дрэнна ўмелі размаўляць, працуючы дома.


Калі мы вярнуліся на працу ў наступны панядзелак, я сказаў Стэфану не турбаваць Дэвіда і прасіць толькі мяне аб дапамозе. Неўзабаве стала відавочна, што Стэфан не так шмат ведаў аб праграмаванні, матэматыцы або геаметрыі. Было відавочна, што яго рэзюмэ поўна хлусні. Аказалася, што ён вельмі спагадны гаварун і мае талент выказвацца так, быццам ведае шмат. Гэта ўменне дало яму працу, а нас падмануў цэлы тыдзень. Чым больш я працаваў са Стэфанам, чым больш я праглядаў яго код, тым больш некампетэнтным ён аказваўся. Нарэшце я ўбачыў, кім быў Стэфан насамрэч, яго сапраўдныя навыкі праграмавання. Я не ўпэўнены, што некампетэнтнасць - гэта правільнае слова. Стэфан напісаў дрэнны код, але ён быў дрэнны нейкім дзіўным чынам. Калі я спытаў яго пра гэта, ён даваў дзіўныя адказы. Вось прыклад, які сапраўды адбыўся. Аднойчы я сказаў Стэфану нешта накшталт: «… Такім чынам, вы хочаце атрымаць гэтае цэлае значэнне, і калі гэтае значэнне знаходзіцца паміж ніжняй і верхняй мяжой, вы павінны выклікаць іншую функцыю … Гэта зразумела?». Стэфан запэўніў мяне, што разумее, што трэба рабіць. Калі на наступны дзень я паглядзеў яго PR, я ўбачыў нешта накшталт гэтага:


 int value; // Assigned from somewhere. for (int i = lower_bound; i <= upper_bound; ++i) { if (value == i) { do_stuff(...); } }


Я быў уражаны. Гэта быў не проста дрэнны код, гэта было нешта іншае. Я памятаю, як быў малады і дрэнна ўмеў кадзіраваць, але мой дрэнны код ніколі не быў такім. Гэта было яшчэ адно вымярэнне дзівацтва. Нават будучы пачаткоўцам праграмістам, я б ніколі не падумаў напісаць такі код. Выбар цыклу па ўсіх цэлых ліках паміж межамі быў досыць дзіўным, але мяне сапраўды ўразіў той факт, што нават калі ён знаходзіць адпаведнасць і выклікае функцыю, ён ніколі не вырываецца з цыкла. Ён працягвае правяраць астатнія значэнні. як? Я спытаў Стэфана, чаму ён проста не зрабіў:


 if (value <= upper_bound && value >= lower_bound) { do_stuff(...); }


Атрымаўшы маю прапанову выкарыстоўваць простыя няроўнасці замест параўнання з кожным цэлым лікам у дыяпазоне, які можа быць даўжынёй у 10 ці нават 100 тысяч, Стэфан пахваліў мяне за такую добрую ідэю і прасунуў новыя змены ў PR. Кожны раз, калі Стэфану было цяжка зрабіць што-небудзь, мы давалі яму нешта лягчэйшае. Дзіўна, што ў яго таксама не атрымалася б. Гэта была кароткая стажыроўка, таму мы не надта напружваліся са Стэфанам. Праз некаторы час ён скончыў выконваць задачы, не звязаныя з праграмаваннем, кіруючы рэчамі ў электронных табліцах і іншымі адмысловымі задачамі, якія трэба было выканаць. Арыгінальныя праекты, над якімі ён узяўся працаваць, апынуліся далёка за межамі яго майстэрства. Нейкім чынам Стэфан скончыў 3-месячную аплачваную стажыроўку. Ён хацеў працягваць працаваць у нас праз лета. Ён прапанаваў новы даследчы праект, які быў бы карысны для нашай кампаніі. Калі мой кіраўнік спытаў мяне, ці хачу я працягваць працаваць са Стэфанам яшчэ 3 месяцы, я сказаў НЕ. Я нагадаў свайму кіраўніку, якой жахлівай была яго праца за апошнія тры месяцы. Але мой кіраўнік быў аптымістам. Ён меў веру ў людзей. Ён папрасіў мяне падумаць пра сябе, калі я ва ўзросце Стэфана, буду ў каледжы і буду вучыцца чамусьці ўпершыню.


Мой кіраўнік папрасіў мяне падумаць над гэтым і папрасіў даць Стэфану яшчэ адзін шанец. Шчыра кажучы, калі я быў ва ўзросце Стэфана, я пісаў 2D-гульні на JavaScript з выкарыстаннем новага (на той час) палатна HTML5. Стэфан быў сапраўды некампетэнтным, нават з папраўкай на яго ўзрост і вопыт. Але значна горш за яго некампетэнтнасць была яго несумленнасць. У любым выпадку, я не хацеў легкадумна ставіцца да гэтага рашэння. З аднаго боку, магчыма, Стэфан здольны вучыцца, але з іншага боку ён несумленны. Я прачытаў прапанову, якую ён напісаў для новага даследчага праекта. Ідэя была вельмі новай, і калі яна спрацуе, будзе вельмі карыснай для нашай кампаніі. Гэта было сапраўды ўражліва. Але потым у мяне быў момант яснасці, калі мой цынізм узяў верх над аптымізмам, які мой менеджэр спрабаваў усяліць у мяне. Я зацыкліўся на адным слове з даследчай прапановы Стэфана: «2-мнагастайнасці».


Працуючы з ім, я ведаў, наколькі Стэфан насамрэч некампетэнтны, і няма ніякага чортавага спосабу, каб ён ведаў, што азначае 2-разнастайнасць. Я скапіяваў даследчую прапанову Стэфана ў онлайн-сродак праверкі плагіяту. Гэта было шмат гадоў таму, і я забыўся, які гэта быў. Я толькі што шукаў у Google і выкарыстаў адзін з лепшых вынікаў. Праверка плагіяту выявіла 97% супадзенне з навуковай працай і дала спасылку на арыгінал. Стэфан скапіяваў усё. На наступную раніцу я гаварыў са Стэфанам аб яго прапанове даследавання. Як толькі ён загаварыў, стала зразумела, што ён не разумее, пра што гаворыць, і ўсё гэта проста слоіка. Ён зноў стаў шарлатанам. Я паведаміў свайму кіраўніку, і гэта канчаткова зламала яго веру ў Стэфана. Стэфан зноў у нас не працаваў.


Адзінае, у чым Стэфан быў добры, - гэта прадаваць сябе і ствараць уражанне, што ён ведае, пра што гаворыць. Я разумею, што ёсць прафесіі, у якіх гэтыя навыкі могуць прасунуцца даволі далёка, напрыклад, продажы. Але я падумаў, што незвычайна, калі хтосьці спрабуе прабівацца праз тэхнічную кар'еру, такую як распрацоўка праграмнага забеспячэння.