Как стать автором
Поиск
Написать публикацию
Обновить

Программисты и Техножрецы: где заканчивается миф и начинается инженерия

Уровень сложностиПростой
Время на прочтение17 мин
Количество просмотров1.6K

На работе разгорелась жаркая дискуссия по поводу того, является ли сегодня программирование профессией, и кто такие вообще - программисты. Коллеги утверждали, что весь этот научный флёр вокруг программирования - полный бред.  Не более, чем скилл, умение, ремесленный навык, но не реальная инженерная профессия. По их мнению, программирование не может сравниться с чем-то более реальным - работой архитектора, строителя, механика и.т.д.             И от этих слов, мне… стало чертовски обидно. Что, по сути, 20 лет постижения мною данной сферы сведены к простому: ловкости рук и никаких “тяжелых” знаний внутри. 

Программирование не является профессией

Сейчас любой может ворваться в данную профессию, вокруг сотни готовых курсов и учебных материалов. В программирование даже переходят люди за 60 лет. Несколько месяцев обучения: сидишь в кресле, копируешь и вставляешь код из поисковика, просиживаешь на созвонах - просто рай! А в результате - деньги, и возможность с умным видом преподносить себя как программиста, как что-то очень крутое. 

Это стало настолько распространенным, что уже при знакомстве, когда говоришь, что ты - программист, все машут рукой - ничего интересного. И когда пытаешься кому-то рассказать, какая эта увлекательная профессия, и как много скрывается за этими словами - программировать, в ответ получаешь лишь смех. Ага, еще расскажи, что вы ракеты запускаете) Всё это ваше программирование - фуфло, воздушный пузырь 21-го века, где люди лишь изображают занятие действительно полезной и трудной работой. Тебе всего лишь повезло. Временно. Но скоро уже всё кончится. Скоро вас всех заменят роботы и станете вы все никому не нужны. Ибо нет ничего сложного в программировании. 

При этом, на работе эту позицию отстаивали люди, которые пришли сюда из других профессий. Вот там, в этих сферах, в строительстве, электрике, заводах и школах, на Дальнем Севере, там - настоящая жизнь, Великое Дело!  А тут - просто пустышка, игрушка для взрослых детей. И, если бы не деньги, никого бы эти программисты не интересовали. Когда-то ваше программирование было реально сложным, а теперь - любой ребенок уже программист. Ваши знания - блеф.

На всём этом фоне, у нескольких моих знакомых разработчиков разворачивалась драма, у каждого своя:

Один мой товарищ, сеньор фронтендер React, уже давно работающий в стартап сфере, недавно перегорел, причем серьезно. Ушедшая от него девушка сказала, что все программисты - дети, которые только и красят кнопки сегодня в красный, а завтра в зеленый цвет. И действительно, работая вместе с дизайнерами над UI внутреннего приложения компании, цвету кнопок уделяли много внимания. 

Второй - Системный программист. На год выпал из профессии после того, как на конференции какой-то чудак сказал, что всего его попытки впихнуть в несколько тысяч байт очередный код для выполнения на микроконтроллере никому не нужны. Хотя он работал в аэро-сфере, и был ответственным за сжатие и компоновку кода для запуска на микроконтроллерах. 

Третья - знакомая Бэкендщица. Со всех сторон отличная девушка, есть парень, всё вроде в жизни складывается удачно. Пишет на TS микросервисы для возврата данных для админки сайта.   Ушла в запой, натуральный такой запой, когда ее отец сказал, что всё что она делает не идет ни в какое сравнение с ее братом, вкалывающим на оборонном заводе.

Я не сдержался и решил написать статью про свою позицию. Почему я считаю, что программист — это не Техножрец из Вархаммера, который поклоняется машинному богу и лишь умеет что-то подстраивать в машине своими ритуалами. Что программирование - не магия, где в нужный момент двигаешь руками и вуаля - на экране нужный результат. Почему мы - всё-таки инженеры, а не фокусники, получающие деньги ни за что? Где начинается и заканчивается мистика? 

Adeptus Mechanicus. Art by Baklaher 

Программирование - магия?

Помню, что, когда я входил в профессию, программирование и правда представлялось как некое магическое знание. Пишешь заклинания на секретном языке, а шумящая коробочка под столом творит чудо. Всё это завершилось, когда по совету товарища я удалил папку system32 в Windows 95. У меня не было денег, интернета и добрых друзей, кто бы знал, что делать. Достав книгу из общественной библиотеки, я начал пытаться понять проблему. Заодно штудируя лихорадочно английский, так как она была на этом тоже не сильно понятном для меня языке. Хаотически и очень грозно произнося всякие могущественные заклинания из книги, я старался снять приворот с моего системного блока. Что я только не делал: особым образом раскладывал файлы на жестком, разжигал определенным способом биты в памяти жесткого, щелкал строчки голубоватого Bios и, наконец, холодная батарейка на микросхеме - магия не срабатывала. Я не прошел проверку и был вычеркнут из ряда волшебников. Школа Хогвартс не пришлет сову за мной. Мне не стать программистом-магом. Конец.

С тех пор я считаю, что программирование — это инженерный процесс, требующий к себе научного подхода и отношения. Да, конечно, есть ситуации похожие на магию:  Мышь, замыкающая хвостом контакты на короткий момент, достаточные для того, чтобы процессор пропустил пару инструкций; Single Event Upset (SEU) - когда высокоэнергетические космические лучи могут привести к изменению регистров процессора(реальная вещь, с которой сталкивался); Залитый водой маршрутизатор, кидающий назло трафик на еле живую ноду со старыми данными; Вредный девопсер, настроивший рандомный дроп твоих пакетов и смеющийся в углу - часть из этого была со мной, часть я слышал, но это максимум, что здесь - магия.

Я не думаю, что программирование, чем‑то тут отличается от многих других профессий. И мифы здесь схожие. Миф — это когда вы стучите по огромной плазме, помня, что в детстве также стучал ваш дед по телевизору. Когда человек вытаскивает и вставляет провод в новый маршрутизатор, помня, что когда‑то это помогало вылечить старенький Acer свитч. Когда человек заполняет файлы простынями с вывода ChatGpt, даже не думая, а что они делают. Миф — в сотый раз чистить node_modules и думать, что это поможет. Реальная жизнь — не волшебная страна, в которой почему‑то именно в сотый раз это сработает. У нас есть свои законы и есть конкретные условия под них. И на этом мифы и магия исчезают.

Когда программист начинает задаваться вопросом - а почему это работает, а при каких условиях это могло работать…. Когда мы уходим из плоскости - как бы так замутить, чтобы оно сработало - в сферу - я разработаю это так, чтобы оно работало при данных условиях… Тогда вся туманная завесь мистики срывается окончательно. А если этого не сделать, то проект утонет в багах. Магии место только в одиночных проектах.

К чему весь этот разговор про магию? А к тому, что меня бесят люди, которые просто верят в код - и поверьте за последнее время я встречал таких не раз. Нет другого бессознательного за происходящим на экране. Код работает или не работает, именно, потому что мы его так написали, спроектировали и сделали. В коде всему есть объяснение. Мы - главные авторы нашего кода, создатели всего, что произойдет, и ответственные за его последствия.  

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

Pasqal Haneumann Art by Owlcat Games

За вводом “{color: red; }” скрывается многое: как сбилдить получившийся результат, как он будет выглядеть в получившемся коде, как его найти потом, почему мы уверены, что в разных браузерах это отработает… это и есть ра-бо-та. Найти, обосновать, защитить, воплотить.  Мы не тыкаемся рандомно в разные места для того, чтобы пофиксить - мы инженируем, пытаясь найти максимально полное в данных условиях решение. В условиях нехватки ресурсов изловчиться и ввернуться тем самым верблюдом в игольное ушко. И научно доказать, что все другие варианты в данных условиях не подходят. 

Это всегда сложно. Но интересно. Это то, что держит меня в профессии. Где еще вы будете радоваться митингу, где после жарких споров побитый аргументами здесь и сейчас вы уяснили, что сагу можно использовать еще и между микропроцессорами в GPU. Где бал правит научно обоснованная практика, почему это решение - лучше. Не кто сильнее, умнее, у кого выше авторитет, а кто доказал свой выбор лучшими доводами. Программирование абсолютно не магия, но эта профессия привлекательнее мне любых взмахов палочки.

1960s Computer.  Image: https://www.flickr.com/photos/ucdaviscoe/6303642446

Программист - это техножрец или инженер?

Маленькая история. После университета я работал в ЖКХ. Таким на все руки мастером: принеси‑подай, и швец, и жнец и на дуде игрец. Системный администратор, настраиватель АТС, программист и грузчик. И была там огромная 1С база данных, которую кто‑то настроил на Microsoft Active Directory с общим сетевым диском. Раз в неделю эта база валилась. И на системном блоке, где находился сервер Microsoft Server 2003 была наклеена бумажка — перезагружать все компьютеры сначала справа налево, а потом слева направо. Если это не поможет, то включать компьютеры через одного, потом через два, потом через три. И это, на удивление, помогало. «Магия!», — сказал мне передающий дела старый дядька, отличный программист 1С. Работает, не трожь. Волшебные слова любых сисадминов.

Те самые волшебные слова — работает, не трожь… Однако я убежден, что это правило надо применять очень дозированно и только, когда все понимают почему это не надо трогать. А в той ситуации я начал осквернять магию — начал разбираться, почему так работает. Копался в SMB — протоколе сетевого взаимодействия на Windows, копался в логах Active Directory и отдельных компьютерах…. С утра бухгалтеры ругались на меня, что ничего до сих пор не работает и я, вместо того чтобы запустить магический ритуал, занимаюсь бредом. Всё включили по старинке…. А потом я нашел причину. Дело в том, что всё работало по схеме «один — мастер, остальные — слейвы». Как только заканчивался срок аренды мастера, происходили перевыборы, но три компьютера в этом случае всегда объявляли себя мастерами без выборов и слали бешено пакеты по сети из‑за сбоя в реестре и убивали всю систему выборов. Если же по каким‑то причинам именно они включались долго, то выборы происходили нормально. Я удалил на третий день плохие записи, перенастроил на правильные выборы — и проблема была решена навсегда. А потом вообще убрал ненужную конструкцию с ActiveDirectory и там был просто сетевой диск без всех премудростей.

Знаете, что самое смешное? Бумажка, та самая магическая бумажка, продолжала висеть. А вдруг пригодится — говорил тот самый старичок, программист 1С. Что, почему, зачем?! Наверное, там до сих пор при любых проблемах, сначала включают компьютеры справа налево, а потом слева направо. Потому что это работало когда‑то.

К чему это? Да, во многих случаях действительно достаточно просто скопировать код, вставлять по наитию магические строки, прописывать в докер файле непонятные вещи и утыкивать код Rust эльфийскими знаками Pin и &mut, ну просто потому, что работает. Только у этого есть одна проблема. Это будет работать до первого столба. До первой крупной проблемы. И если это будет проблема с автомобилем или с телевизором, мы вызовем мастера, который нам всё починит. Но кто починит наш код? Stackoverflow, google, ChatGpt, наш коллега, у которого мы сперли код?

Так можно писать код, не погружаясь в пучины. И этот код будет даже приносить кому‑то деньги, а вы будете получать заслуженные барыши за свое волшебство. И я ничего не имею против. Я ничего не имею против в целом, что вчерашние строители, учителя, художники пришли в эту профессию и зарабатывают достаточно денег, не рискуя здоровьем, нервами и свободой. Это прекрасно, что мы, как человечество, можем восполнить нехватку кадров упрощением процесса входа в профессию и, тем самым, увеличить количество программного обеспечения. Это здорово и с точки зрения тех, кто вошел в профессию, и с точки зрения бизнеса, что таким образом решил свои задачи.

Но мое мнение таково. Независимо от того, кто и как пришел в профессию, если человек пишет код бездумно, потому что так надо, значит, он — не программист. Когда баловался хакингом, знал, что хакеры делили всех на два типа — скрипт‑кидди и хакеры. Скрипт‑кидди — люди, которые просто используют готовые скрипты, для того чтобы играться и творить всякие гадости. Хакеры — это люди, познающие систему и способные через знания, как она работает, достигать своих целей — хороших и плохих. Для одних цель — почудить, для других — разобраться в системе. В этом плане долго для меня образцом был Крис Касперски (здесь изображение из журнала «Хакер»), на книгах которого про операционные системы и язык C когда‑то я изучал глубины. Именно через его советы я в том числе постигал магию программирования.

Крис Касперски. Image: https://xakep.ru/2017/03/07/kris‑kasperski‑rip/

И потому программистов мы тоже делим на две категории. Первые — это кодеры, те кто просто использует разные скрипты, найденные в интернете, взятые с вывода ChatGpt, скопированные с книг, которые они заучили и умело применяют. Они не вдаются в понимание того, что происходит. Просто балансируют на умении своих рук и магических навыков как‑то заставить это работать. Хороший пример, как у нас один верстальщик использовал <br> и <table> для всех случаев жизни, не особо понимая, а почему так. Или как человек пришедший на Go с Java всюду вставлял заученные классы и иерархию через неподходящие структуры и интерфейсы. Просто потому, что привык и не хочет разбираться.

Вторая категория — это программисты. Они схожи с хакерами относительно того, что они действительно понимают свою систему, свой проект, свой инструмент с разных сторон. Они пытаются постоянно разобраться в этом ещё сильнее. В первую очередь программист — инженер. Он проектирует систему, разбираясь в том, что от него требуется, в каких условиях и что у него есть в наличии. Далее разработанную специально систему под конкретные условия он воплощает в жизнь. Он тоже может и зачастую использует чужой код, ChatGpt, и много что другое. Разница в том, что не эти строки его результат работы. Работающий проект, выполняющий конкретные цели в конкретных условиях — вот это его результат. Для этого инженер, копирующий строки, всегда будет разбираться: а почему этот код работает, как он работает, в каких условиях он не будет работать, и как это связано с остальными частями.

Кодеры вообще не программисты. И здесь без разницы, кто и как пришел в профессию. Если человек просто пишет код, он — кодер. Если разрабатывает — программист. И только вторые, в моем понимании, способны произвести программное обеспечение, выдающее надежный результат в заданных условиях. Они и есть то, на плечах которых в том числе держится современный прогресс.

Как переквалифицироваться из техножрецов в программисты?

Несмотря на то, что названий профессии «программист» огромное количество, я придерживаюсь принципа, что есть только две профессии — программист и кодер. Кодер по мне — это техножрец. И быть им очень скучно. Магия?! Что может быть обыденнее? Со временем все волшебные умения превращаются в просто заученные одни и те же команды, которые мы можем с бешеной скоростью повторять в новом коде. Мозг отдыхает, нет никакой головомойки, всё понятно.

И это одна из причин, почему так много людей выгорают. Люди мечтали быть инженерами, а на деле их роль превратилась в прислужника машины. Сколько раз я слышал это — мне не дают развиваться, не дают настоящих проектов, всё одно и то же.... То о чём ты говоришь — это про абстрактных программистов в Гугл, Наса, РосКосмос, а у нас тут — скучная реальность кодера.

A selfie taken by NASA's Curiosity on Mars rover, credit: NASA/JPL‑Caltech

Как же быть?

  1. Развейте в себе любознательность. Это самое необходимое чувство для жизни, а уж для инженера крайне. Настоящий инженер увидит катающийся по полу робот‑пылесос и тут же залезет в интернет почитать: а что у него внутри, а как там работает программное обеспечение, как его можно настроить, как можно запрограммировать его выполнять другие команды. А потом сломает его, пытаясь воткнуть шлейф в разъемы. Фронтендер так долго изучал внутренности системы тестирования Selenium, что ушел с обычного сайта теперь туда работать.

Интересуйтесь тем, что вы программируете, для чего, на чём вы это пишете, на чем это будет выполняться и так далее. Поверьте, даже в самых простых задачах огромный необъятный мир сложностей, непонятных законов и идей. И он прекрасен. Он доступен вам, он ждёт вашего прихода. Погружайтесь в него, не оставляйте закрытых дверей и пустых пространств для себя — изучайте мир девайсов, языков, инфраструктуры. Там чёрная дыра, которая вас уже никогда не отпустит.

Adeptus Administratum. Art by Stefan Ristić (StoryKillinger)

  1. Перестаньте кодить. Очень легко попасть в ловушку, когда копируешь один и тот же код повсюду. Или вообще писать руками по памяти одни и те же синтаксические конструкты. Ну мы же — инженеры?! Мы же можем запрограммировать‑то свою работу, сесть и спроектировать для себя способ не повторять одни и те же рутинные действия сто раз. Есть куча паттернов и способов проектирования, которые избегают это — от скриптовой автоматизации до мета‑программирования.

Если постоянно пишите один и тот же код — начните искать способы перестать это делать. О, один мой знакомый, просто провалился в эту стезю и теперь у него в 18–00 включается скрипт на zsh, который подогревает чашку кофе, переключает компьютер дома в ночной режим, процесс мониторинга переводится в более быстрый режим, а деплои автоматически лишаются статуса готово до завтра. А у другого есть велосипед, который при коммите автоматически сам выбирает следующую задачу, выбирает по описанию задачи шаблон для старта, создает тесты по описанию и тебе остается лишь начать думать, как их пройти. Автоматизировать можно практически всё. Но…. не забывайте ловить себя на мысли, что всему должно быть мера. И всё же если вы только кодите — перестаньте, это путь в никуда.

  1. Постигайте сложность мира инженерными способами. Мир, а конкретно то, что нас окружает во время процесса программирования — сложно. Браузер — довольно сложное программное обеспечение. Операционная система — архи‑сложное программное обеспечение. Телефон — непонятная штука внутри. А уж все эти — как сбилдить ядро linux под freebsd, уложить параллельную работу над одним участком памяти в несколько указателей в одном байте... Всё сложно и чем больше ты погружаешься, тем больше работает эффект wikipedia — когда от одной ссылки ты скатываешься к другой и так до бесконечности. И от этого очень быстро возникает боязнь, разочарование. Ничего не понятно и чем дальше, тем сложнее и сложнее… Нет смысла. Работает — и не трожь.

Но мы же инженеры!) Мы знаем тысячу и один способ управлять сложностью. Так давайте и мир постигать инженерными способами, например используя декомпозицию и абстрагирование. Выделяйте одну сущность и старайтесь ее изучать в изоляции от других. Делите на маленькие участки и собирайте большую картину. Или итеративное изучение. Когда сначала изучаешь крайне простую вещь, а потом добавляешь сложности. Или изучение в формате TDD. Когда описал один пример, поигрался с ним, потом проверил другой. Главное — не бойтесь сложности того, что вы изучаете. Мы, как люди, способны это изучить.

  1. Отбросьте непомерную жажду всегда быть первым во всём.

Я не знаю, как в других сферах, но тут мне постоянно встречались люди, которые хотели быть богатыми, как Билл Гейтс, писать постоянно сложные системы, как Линус Торвальдс, разрабатывать искусственный интеллект, подобно Суцкеверу и.т.д… И мучаться от того, что приходится в очередной раз обыденно чистить датасет от стандартных выбросов. Там люди ракеты запускают, а я?! Стремиться к лучшему надо, но хуже всего постоянно съедать себя этой мыслью — что кто‑то лучше меня. Сколько моих коллег было уничтожено этой непонятной гонкой ради гонки.

Расслабьтесь) Вы работаете в одной из лучших профессий на рынке, в которой даже на вашем месте можно проектировать такие штуки, от которых сердце захватывает) Оставьте миру право быть лучше вас, а вы развивайтесь в своем направлении, ищите то, что вам интересно и программируйте, не смотря на других. В этой профессии нет ничего интереснее, чем работать и нет ничего тяжелее, чем завидовать другим. Потому что тут всё развивается так быстро, что всегда кто‑то будет лучше, быстрее, умнее и моложе тебя. Не будьте в этой профессии только из‑за денег — программируйте, потому что вам это нравится.

  1. Полюбите то, что вы делаете. Возможно, есть люди, которым не нравится быть программистами. Но я не понимаю это, хоть и признаю. Но как может не нравится копаться в алгоритмах, изучать очередную статью о выходящем фреймворке, и копаться во внутренностях python, изучая как он вызывает библиотеку из C. Как это же увлекательно и крайне интересно разобраться в теме, найти все аналогии к данной проблеме, выбрать наиболее подходящее решение и увидеть, что оно работает ровно так, как ты задумал. А алгоритмы? А вы пытались в очередной раз пытаться воплотить все эти красно‑черные деревья и искать, где эти внутренние повороты работают неправильно?

Программирование бездонная бочка интересных приключений. Пишете себе в блокнотик всё, с чем столкнулись. Потом ищете книги, статьи, которые это решают и разбирайтесь. А что из этого вы могли применить на практике, а что можно было бы сделать по‑другому, а как это могло бы работать на HTTP/3 и как это можно было бы настроить и запустить. Познаваемый мир машинного кода и всего, что с этим связано, — прекрасен. А ещё тут всё можно щупать и трогать руками. Пусть мы — не Джеффри Хинтон и не откроем завтра настоящий искусственный интеллект, зато нам нравится то, что делаем мы именно здесь и сейчас. А что может быть лучше?

  1. Решайте конкретные задачи, а не стройте воздушные системы.

Не забывайте про овер‑инжиниринг. Наша цель — быть полезными конкретному бизнесу. А для этого выполнять те задачи, которые перед нами стоят, и имеют определенные условия и границы. Нам не нужно строить систему с тройной защитой, как написано в книжке про самолеты, если мы проектируем велосипед. Нам не нужно 50 микросервисов, если у нас задача сохранять временно в кэш данные заказчика и записать их в базу по таймауту. Всё имеет свой контекст, в рамках которого оно только способно быть полезным. Ваш опыт, как инженера, — в способности определять как в этих условиях наиболее эффективно решить вот эту задачу, а не в том, чтобы применять все возможные паттерны проектирования.

Вам крайне хочется запустить в параллельных потоках на гриде в CUDA ваш сверхмодный алгоритм? Но бизнесу нужна простая сортировка по цене? Так поймите, что это тоже прекрасная задача: как сделать эту сортировку, не потратив кучу денег, как сделать её надежной, понятной и легкой в таких реалиях. Любая задача крайне привлекательна своей уникальной спецификой, а не воздушными архитектурами.

  1. Знайте себе цену.

Люди не видят всё ту сложность, всю ту работу, что вы делаете. Для них вы — маг, волшебник, техножрец. Но это ничего не меняет для вас самих. Ведь на работе вы постоянно изучаете что‑то новое, разбирайтесь в огромной сложности проекта, умеете применять научный и инженерный подход и действительно любите свою работу, которая еще и приносит деньги. Так ли важно, что кто‑то опять скажет, что ваша работа не идет ни в какой счет с работой конструктора ракет?

Ведь им невдомек, что конструктор ракет пользуется программным обеспечением, в котором для его удобства вы раскрасили кнопку красным цветом, потому что знали, как это сделать, зачем это делать и как это будет работать. Знали, а не просто выполняли магические заклинания. Вы это спроектировали и доставили, а потому конструктор ракет может более эффективно разрабатывать аппараты. Благодаря вам. А если вас на работе вообще никак не ценят — меняйте ее. Программирование ещё хорошо тем, что сменить работу можно.

Хочется сказать вам, что всё чушь. Все эти наезды на нашу специальность. Да, дорога в программисты‑инженеры сложна и терниста, и, наверное, бесконечна и у неё нет конца, и тут, как из «Алиса в стране чудес» надо постоянно бежать, чтобы просто стоять на месте. Но зато эта профессия вам принесет незабываемые приключения и события. Просто полюбите ее. Я ни разу за больше, чем 20 лет не сомневался в выборе профессии. Хотя от моих багов страдали люди, всё же большая часть людей с помощью моего программного обеспечения решала проблемы. Я горжусь тем, что я программист в 21-м веке. Я не боюсь конкуренции с AI и повседневной скуки в профессии. Потому что на мой век увлекательной работы ещё хватит.

Теги:
Хабы:
+9
Комментарии3

Публикации

Ближайшие события