понедельник, 11 декабря 2023 г.

[prog.work.flame] Много слов на тему ролика АйТиБорода "ИИ убивает программирование, и вот как"

На прошлой неделе урывками посмотрел откровенно кликбейтный ролик "ИИ убивает программирование, и вот как" от известного в узких кругах АйТиБорода.

Урывками потому, что по мере просмотра подгорало знатно, тот самый случай, когда огнеупорная сидушка была бы кстати :)

Кратко первые впечатления по горячим следам изложил в соцсетях (VK, LinkedIn). Сейчас же попробую развернуть мысль.

Но сразу оговорюсь: я вообще не в курсе того, что уже умеет делать ИИ и что он сможет делать в ближайшем или отдаленном будущем. Понятия не имею насколько ИИ угрожает профессии программиста и даже не буду пытаться оценивать то, являются озвученные в ролике прогнозы алармисткими или, напротив, реалистичными (на мой взгляд это вообще больше похоже на замануху "подписывайтесь на мой подкаст про AI").

Моя цель -- сосредоточится на трех тезисах АйТиБороды, которые я выделил из его получасового выступления. И эти тезисы касаются профессии "программист", а не влияния на эту профессию такого фактора, как ИИ. Причем не вообще профессии "программист" в целом мире, а феномена профессии "программист" (как частного случая явления "айтишник") на обломках бывшего СССР, т.к. у нас здесь своя специфика. А это важно, поскольку тот же АйТиБорода, как по мне, есть яркий пример следствия этой самой специфики.

Букв будет много, кому интересно, милости прошу под кат. Но сразу предупреждаю, что все нижеизложенное -- это мое сугубо субъективное и, вероятно, маргинальное мнение подвинутого на велосипедостроении старпера.


Итак, первый из услышанных мной тезисов: "Мы пришли в программирование для того, чтобы иметь денежную работу в комфортных условиях".

Тут разве что остается сказать "отучаемся говорить за всех".

Лично я пришел в программирование когда это была мало кому известная профессия с неизвестными перспективами. И если, по рассказам старожилов, в 1990-1991 годах программистам в околовоенных КБ еще очень прилично платили, то уже с года 1992-го началась такая жопа, которая мало кому из сегодняшних 25-30 летних ойтишников будет понятна.

Те программисты, которые остались в профессии на просторах СНГ в 1990-х, остались здесь не из-за денег и комфортных условий. Зачастую не было ни того, ни другого.

Большинство из увиденных мной тогда программистов были фанатиками своего дела, программирование было их призванием (за очень редким исключением, но исключениями были персонажи про которых можно разве что сказать "ни в ..., ни в Красную Армию").

И, что важно, еще в начале 2000-х в наших Палестинах в программисты шли лишь те, кто хотел связать свою жизнь именно с программированием, вне зависимости от того, сколько за это будут платить.

Но уже в начале нулевых на просторах СНГ (в РБ в частности) начал расцветать аутсорс и сложилась та ситуация, которую мы до сих пор наблюдаем: разработку из развитых стран переносили в страны третьего мира (вроде РБ, Украины, Армении, Грузии и т.д.) и платили здесь в разы (а в начале и на порядок) меньше, чем программистам в США, Франции или Германии. Но даже это было в разы (а то и на порядок) больше, чем зарплата рядового врача в поликлинике или токаря 6-го разряда на заводе.

А потом начался рост зарплат в аутсорсе. Связанный, как мне представляется, с борьбой за имеющиеся небольшие трудовые ресурсы. И aйтишники оказались просто в шоколаде.

Вот тогда-то и началось движение "войти-в-ойти", когда в программирование ломанулись все, кому не лень, просто ради высоких заплат, комфортных условий работы, возможности релокации на Запад или просто возможности попутешествовать по миру за счет работодателя (посредством командировок в США и Западную Европу).

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

Да, эти люди добросовестно работают свою работу. Более чем уверен, что в среднем эти "случайные люди" гораздо умнее меня, намного более ответственны и скрупулезны, с отличным знанием английского, развитыми soft skill-ами и лучшим пониманием бизнес-ценностей... Но, к сожалению, не имеют способностей именно к программированию. Что не лучшим образом сказывается на производимом ими коде :(

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


Следующий услышанный мной тезис: "программирование перестает быть стабильной сферой".

Когда я начинал программировать опытные 35-40-летние программисты как раз переучивались с больших ЭВМ на персоналки. И не сказать, что для всех это было просто. А тем, кто переучился на персоналки под MS-DOS, затем потребовалось переучиваться на персоналки и Windows. А затем многим пришлось переучиваться с десктоп-разработки для Windows на Web-разработку. А затем многим пришлось переучиваться на разработку под мобильные устройства. Например, пройти путь от STK-апплетов на Java ME через WinCE/WinMobile/WinPhone на iOS и/или Android.

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

А ведь можно еще и вспомнить про эволюцию подходов к разработке ПО, которая прошла от Waterfall-а к тотальному Agile, пережив при этом сумасшествия по поводу паттернов проектирования и Test Driven Development.

И это не говоря уже о глобальных факторах. Вроде того же распада СССР, когда тысячи бывших программистов из республик бывшего Союза остались без работы. Или краха доткомов в 2000-ом. Или кризиса 2008-го года...

Наверное, если ты пришел в ойтишечку в Минске лет 10 назад, сразу же сел на какой-нибудь .NET-овский или Java-стек и работал в условном ЕПАМе на крупного заказчика масштаба Sony или Samsung-а, то тебе могло казаться, что все ровно и стабильно: непыльная работа работается, хорошая зарплата регулярно на карточку падает, да еще и растет постоянно... Лепота.

Только вот это отдельно взятый локальный экстремум даже на относительно недолгой истории развития ИТ-индустрии. Не более того.


И еще один тезис, который я выделил. Это рекомендация концентрироваться на "базовых", фундаментальных знаниях.

Тут я, честно говоря, не понял о каких "базовых" знаниях говорит АйТиБорода.

Подразумевается знание алгоритмов сортировки, структур данных и способности рассуждать про О-большое? Возможность сходу написать реализацию B+ дерева или перечислить различия между Radix- и PATRICIA-деревьями? Умение отличать LL-грамматики от LR-грамматик?

Если речь именно об этом, то у меня плохие новости: 95% времени при решении обычных повседневных задач вам это все будет не нужно от слова совсем. Т.е., если вы в своей работе вынуждены регулярно вручную писать бинарный поиск, то, вероятно, вы что-то делаете не так.

А в тех редких 5% случаев, когда вам нужно выйти за рамки обыденной рутины, вам нужно будет уметь быстро погрузиться в какую-то специфическую тему. Вроде тех же вариантов Radix-tree. Чтобы понять что есть вообще, чем отличается, что именно подойдет для ваших условий и почему, что есть в виде готовых библиотек, насколько это применимо и что делать, если не применимо.

Т.е., грубо говоря, нужны не энциклопедические знания, а способность быстро осваивать новое. Так что я бы сказал, что нужно вкладываться не в банальную эрудицию, а в умение учиться. В конце-концов, мало кто из нас способен стать знатоком мастаба Анатолия Вассермана или Бориса Бурды, чтобы сходу выдать формулировку алгоритма Кнута-Морриса-Пратта. Но вот запомнить то, что существует несколько хороших алгоритмов поиска подстроки, и научиться находить их описания способны многие. У меня же как-то получилось.

Так что если под "базовыми знаниями" понимались именно базовые алгоритмы+структуры данных+О-большое, то зубрить это нужно разве что для попадания в FAANG и косплеящий их Yandex. Там да, на собеседованиях все это потребуется.

Но в разговор про "базовые знания" я считаю нужным добавить еще один момент: это прикладная специализация.

Говорю об "прикладной специализации" с белой завистью к тем, у кого такая специализация есть. Например, человек хорошо разбирается в computer vision, или же собаку съел на обработке аудио, или досконально разбирается в потрохах MariaDB и PostgresSQL...

У меня самого такой прикладной специализации нет. И это сказывается когда сталкиваешься с новыми задачами. Условно приходит к тебе заказчик с проектом из области обработки видео, а ты вообще не в курсе, что такое YUV422 и чем FFMPEG отличается от gstreamer. И когда начинаешь разбирается, то быстро осознаешь, насколько непросто въехать в новую тему и насколько же ты отстаешь от тех, кто уже обладает нужными знаниями.

Так что, ИМХО, глубокая экспертиза в какой-то прикладной области с небольшими навыками программирования может предоставить вам больше возможностей, чем способность с закрытыми глазами написать на доске балансировку red-black tree на пяти разных языках программирования.


Если говорить про меня, то я не столько боюсь пришествия в разработку ИИ, сколько глобальных экономических и военных кризисов. ИМХО, повторение великой депрессии, но в масштабе всего мира, способно сократить поголовье программистов значительно сильнее, чем ChatGPT с Copilot (особенно в странах третьего мира, зарабатывающего за счет демпинга на аутсорсе).

Продвинутый ИИ все равно останется лишь помощником у разработчиков, пусть даже сама разработка кардинально поменяется. Но эта разработка хотя бы останется.

А вот если кратно сократится товарное производство, то тупо отпадет надобность в самом программном обеспечении. И тогда программисты будут вообще не нужны, что с ИИ, что без.


Чтобы прогнозы из ролика АйТиБороды не выглядели очень уж катастрофическими, попробую сделать некую субъективную ретроспективу для тех молодых читателей, кто пришел в АйТи относительно недавно, не более 15 лет назад.

Сам я начал писать программки в 1989-ом на компьютере БК1001.01 и языке программирования Basic. Древнем Basic, который еще с номерами строк и goto во все поля, но уже хотя бы с gosub.

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

Так вот, при программировании на Basic-е на БК1001 не было текстового редактора в привычном нам сейчас смысле. Там нужно было вводить команды. Типа команды на удаление строки с каким-то номером. На ввод новой строки с каким-то номером. На перенумерацию строк и т.д., и т.п. Даже для того, чтобы просмотреть кусочек программы нужно было выдать команду list с диапазоном строк, которые ты хотел просмотреть.

Это, конечно же, был не такой хардкор, как в редакторе ed, но и до простого Windows-овского Notepad-а было как до Луны.

И вот после Basic на БК1001 я попадаю в Turbo Pascal 3.0 на Robotron 1715. В котором уже есть полноценный редактор, где текст редактируется именно как текст и можно листать его постранично вверх и вниз.

Сейчас это может звучать дико, но тогда это был как прыжок в другую историческую эпоху.

А вскоре после работы в Turbo Pascal 3.0 на Robotron 1715 довелось перебрался в Turbo Pascal 5.0 на MS-DOS на IBM PC (ну и вскоре на Turbo C 2.0 там же).

Оказалось, что в текстовых редакторах бывают менюшки, диалоговые окна (для выбора файла, например) и строка состояния. Да еще и цветные!

А программы можно отлаживать в такой штуке, как отладчик. Интегрированный в среду разработки.

Не прошло и года после написания первой собственной программы на БК1001, а я уже оказался в совсем другом мире. Просто фантастическом мире, если сравнивать с БК-шным Basic-ом.

Потом познакомился с первыми версиями редактора MultiEdit (в том числе и под названием Foton). Там уже была подсветка синтаксиса!

Сейчас все это кажется невероятным, но в 1992-ом редактор, в котором синтаксис языка подсвечивается, воспринимался как прорыв в другое измерение.

А еще в MultiEdit-е была система макросов и можно было настроить их так, чтобы ты набирал if( и макрос автоматически расширял бы набранный текст до if() {} или if() {} else {}, да еще и с нужными тебе отступами. После должной настройки оказывалось, что редактор автоматически пишет вместо тебя часть кода.

Редактор пишет вместо тебя!

Хотя еще два года назад, чтобы посмотреть кусочек программы нужно было вводить специальную команду list...

Еще через несколько лет в Visual Basic for Application столкнулся с автоматическим форматированием текста программы по мере ввода. Т.е. ты вводишь строчку кода не заморачиваясь на отступы и регистр ключевых слов, а сама среда разработки тут же переформатирует введенную тобой строчку добавляя отступы, пробелы и приводя ключевые слова к "стандартному" написанию.

А еще через несколько лет я знакомлюсь с IDE, в которых есть автокомплит и подсказки по параметрам функций/методов.

А в 2001-ом сталкиваюсь с IDE для Java, которые идут еще дальше. Включая набор рефакторингов, которые автоматически и безошибочно делают то, что раньше приходилось выполнять вручную и очень осторожно, чтобы по ошибке не затронуть лишнее.

Грубо говоря, ты выделяешь пять строчек, выбираешь рефакторинг "Вынести в новый метод" и эти пять строчек превращаются в отдельный метод со своей автоматически вычисленной сигнатурой, а в том месте, где эти пять строчек находились изначально, оказывается вызов этого метода с автоматически проставленными параметрами.

И все это за какие-то двенадцать лет.

Я это к тому, что если бы мне в 1989-ом году рассказали бы, что в 2001-ом IDE будет чуть ли не автоматически генерировать половину кода, я бы воспринял это так же, как сейчас воспринимают прогнозы про то, что ИИ будет писать работающий код.

Так что на моих глазах инструменты разработки и так продвинулись очень и очень далеко относительно момента, когда я увлекся программированием. И, по сравнению с 1989-ым годом программирование выглядит уже совершенно иначе.

Тем не менее, профессия программиста никуда не делась.

Просто потому, что менялись лишь вспомогательные инструменты, а суть оставалась той же самой: кто-то должен был придумать что и как делать, а потом этот "кто-то" должен был формально и непротиворечиво описать придуманное так, чтобы компьютер это описание смог выполнить.

Тридцать лет назад это делалось с помощью примитивных команд Basic-а. Сейчас это делается в IDE вроде IDEA или VisualStudio. Возможно, через 10 лет это будет делаться в процессе диалога с каким-нибудь Super-Puper-GPT 28.

Ну и в том, что компьютер будет генерировать код по каким-то описаниям так же нет ничего нового и необычного. Элементы этого уже давным давно применяются в повседневной практике.

Например, никого же не удивляет то, что для генерации лексеров и парсеров мы используем какие-нибудь flex/bison, ANTLR или ragel. На входе описание того, что нам нужно, на выходе автоматически сгенерированный код, который делает то, что нам нужно.

Да, на входе flex/bison/ANTLR/ragel весьма формальные описания на специализированном языке.

Но можно вспомнить всяческие Wizard-ы, которые были модны в IDE в 1990-х. Ты начинаешь новый проект, среда разработки задает тебе несколько наводящих вопросов и генерирует каркас приложения. Помнится, Borland C++ таким образом мог сгенерировать полноценный многооконный текстовый редактор, при этом сам программист не писал ни одной строчки кода.

Я это к тому, что программисты сами давным давно заставляют компьютеры генерировать код. Просто со временем все это выходит на новый уровень. Точно так же, как среды разработки эволюционировали от примитивного Basic-а до IDEA.

В общем, я к тому, что появление новых, более совершенных и мощных инструментов в арсенале программиста -- это нормальное явление. Это происходило с момента написания первой программы и будет происходить впредь.

Так что к этой эволюции инструментов нужно относиться спокойно, а не заламывать руки и кричать "Мы все умре^W отправимся на мороз!"

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

Но даже если программирование приобретет черты диалога с ИИ, все равно это будет программированием.

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


На правах саморекламы: изобретаю велосипеды для себя, могу изобретать и для вас.

2 комментария:

Stanislav Mischenko комментирует...

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

Yury Schkatula комментирует...

@Stanislav, когда-то для токаря были важны точный глазомер и твёрдость руки, затем на станках появились лимбы с делениями, которые вроде бы дали возможность "каждой домохозяйке (далее по тексту)" в соответствии с классом точности станка, затем появились ЧПУ-станки с постепенно нарастающей автоматизацией рутины - и снова легионы "домохозяек", казалось бы, должны были наводнить цеха...

Но они не пришли! Необходимость понимать возможности и ограничения материала, станка, технологического цикла предприятия никуда не делись. Умение читать чертежи и видеть в них "между строк". "Мы обязаны в каждой заготовке видеть деталь (ц)". И т.д. и т.п.

Нейросети изменят индустрию. Но они не изменят её суть и преследуемые цели.