Connect with us

Программирование

Конец программирования в том виде, в котором мы его знаем

Это не конец программирования. Это начало его нового переизобретения.

Опубликовано

/

     
     

Тим О’Рейли написал эссе о программировании и искусственном интеллекте.

В медиа много говорят о том, что разработчики программного обеспечения скоро потеряют работу из-за искусственного интеллекта. Я в это не верю.

Это не конец программирования. Это конец программирования в том виде, в котором мы его знаем сегодня. В этом нет ничего нового. Первые программисты соединяли физические цепи для выполнения каждого вычисления. Их сменили программисты, писавшие машинные инструкции в виде двоичного кода, который вводился по одному биту за раз путем переключения переключателей на передней панели компьютера. Программирование на языке ассемблера положило этому конец. Оно позволяет программисту использовать человекоподобный язык, чтобы указать компьютеру, как перемещать данные в ячейки памяти и выполнять с ними вычисления. Затем развитие компилируемых языков более высокого уровня, таких как Fortran, COBOL и их преемников C, C++ и Java, привело к тому, что большинство программистов перестали писать ассемблерный код. Вместо этого они могли выражать свои пожелания компьютеру с помощью абстракций более высокого уровня.

Конец программирования в том виде, в котором мы его знаем

В конце концов, интерпретируемые языки, которые гораздо легче отлаживать, стали нормой.

BASIC, один из первых таких языков, получивших широкое распространение, поначалу воспринимался как игрушка, но вскоре оказался предвестником будущего. Программирование стало доступным для детей и “гаражных” предпринимателей, а не только для офисного священства в крупных компаниях и правительственных учреждениях.

Потребительские операционные системы также сыграли важную роль в этой истории. На заре становления персональных компьютеров каждому производителю требовались инженеры-программисты, которые могли бы написать низкоуровневые драйверы, выполняющие чтение и запись данных на платы памяти, жесткие диски и периферийные устройства, такие как модемы и принтеры. Windows положила этому конец. Она добилась успеха не только благодаря графическому пользовательскому интерфейсу, который значительно упростил работу с компьютером для неподготовленных людей. Она также предоставила то, что Марк Андреессен, чья компания Netscape вот-вот должна была быть поглощена Microsoft, пренебрежительно (и ошибочно) назвал «просто пакетом драйверов». Этот пакет драйверов, представленный Win32 API, означал, что программистам больше не нужно писать низкоуровневый код для управления машиной. Эта работа была эффективно инкапсулирована в операционной системе. Windows и macOS, а для мобильных устройств — iOS и Android, означают, что сегодня большинству программистов больше не нужно знать многое из того, что знали предыдущие поколения программистов.

Программистов стало больше, а не меньше

Однако это был далеко не конец программирования. Программистов стало больше, чем когда-либо. Плодами их творчества пользовались сотни миллионов пользователей. Классическая демонстрация эластичности спроса: по мере того как создавать программное обеспечение становилось все проще, его цена падала, позволяя разработчикам создавать решения, за которые готовы были платить все больше людей.

Веб стал еще одним «концом программирования». Внезапно пользовательский интерфейс стал состоять из человекочитаемых документов, отображаемых в браузере со ссылками, которые, в свою очередь, могли вызывать программы на удаленных серверах. Любой мог создать простое «приложение» с минимальными навыками программирования. Словосочетание «no code» стало нарицательным. Вскоре каждому понадобился веб-сайт. Такие инструменты, как WordPress, позволили непрограммистам создавать такие сайты без кода. Однако по мере развития технологий успешные сайты становились все сложнее и сложнее. Все большее в программировании происходило разделение между «фронтендом» и «бэкендом». Стали доминировать новые интерпретируемые языки программирования, такие как Python и JavaScript. Мобильные устройства добавили новый, вездесущий фронт-энд, требующий новых навыков. И снова сложность была скрыта за фреймворками, функциональными библиотеками и API, которые ограждали программистов от необходимости разбираться в низкоуровневой функциональности, которую они должны были изучить всего за несколько лет до этого.

Большие данные, веб-сервисы и облачные вычисления создали своего рода «операционную систему интернета». Такие сервисы, как Apple Pay, Google Pay и Stripe, позволили выполнять ранее сложные и ответственные корпоративные задачи, такие как прием платежей, с минимальными знаниями в области программирования. Всевозможные глубокие и мощные функции стали доступны через простые API. Однако этот взрыв интернет-сайтов и соединяющих их сетевых протоколов и API в итоге привел к росту потребности в программистах.

Программисты больше не создавали статичные программные артефакты, обновляемые каждые пару лет, а постоянно разрабатывали, интегрировали и поддерживали долгоживущие сервисы. Что еще более важно, большая часть работы в этих огромных сервисах, таких как Google Search, Google Maps, Gmail, Amazon, Facebook* и Twitter, была автоматизирована в огромных масштабах. Программы разрабатывались и создавались людьми, а не ИИ, но большую часть работы выполняли специализированные предшественники сегодняшних ИИ общего назначения. Работники, выполняющие основную часть тяжелой работы в этих компаниях, уже являются программами. Люди-программисты — это их менеджеры. В настоящее время сотни тысяч программистов выполняют подобную работу по руководству. Они уже живут в мире, где их работа заключается в создании и управлении цифровыми коллегами.

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

Может ли этот раз быть другим?

Неожиданно, но, похоже, для непрограммиста стало возможным просто поговорить с LLM или специализированным программным агентом на простом английском (или человеческом языке по вашему выбору) и получить в ответ полезный прототип на Python (или языке программирования по вашему выбору). Для этого даже появилось новое «buzz» слово: CHOP, или «программирование, ориентированное на чат» (chat-oriented programming). С развитием передовых рассуждающих моделей начинают появляться ИИ, способные генерировать даже сложные программы с помощью высокоуровневой подсказки, объясняющей, какую задачу нужно решить. В результате многие люди говорят, что «в этот раз все по-другому», что ИИ полностью заменит большинство программистов-людей, да и вообще большинство работников сферы знаний. Они говорят, что нас ждет волна повсеместной человеческой безработицы.

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

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

Обучение на практике

ИИ не заменит программистов, но изменит их работу. В конце концов, многое из того, что делают программисты сегодня, может устареть (для всех, кроме программистов встраиваемых систем), как и старый навык отладки с помощью осциллографа. Мастер программирования и прозорливый технический обозреватель Стив Йегге отмечает, что заменят не junior или middle программистов, а тех, кто цепляется за прошлое, кто не принимает новые инструменты и парадигмы программирования. Те, кто приобретает или изобретает новые навыки, будут пользоваться большим спросом. Младшие разработчики, овладевшие ИИ-инструментами, смогут превзойти старших программистов, не владеющих ими. Йегге называет это «смертью упрямого разработчика».

Мои идеи сформированы не только моим собственным 40-летним опытом работы в компьютерной индустрии и наблюдениями таких разработчиков, как Йегге, но и работой историка экономики Джеймса Бессена, который изучал, как первая промышленная революция разворачивалась на текстильных фабриках Лоуэлла, штат Массачусетс, в начале 1800-х годов. По мере того как квалифицированных мастеров заменяли машины, управляемые «неквалифицированным» трудом, заработная плата людей действительно падала. Но Бессен заметил одну особенность, сравнив данные о зарплате рабочих на новых промышленных фабриках с данными бывших ремесленников-надомников. Ученику ремесленника требовалось примерно столько же времени, чтобы достичь полной зарплаты квалифицированного подмастерья, сколько одному из новых неквалифицированных фабричных рабочих начального уровня, чтобы достичь полной зарплаты и производительности. Рабочие в обоих режимах на самом деле были квалифицированными работниками. Но у них были разные виды навыков.

По мнению Бессена, есть две важные причины, по которым заработная плата оставалась ровной или пониженной на протяжении большей части первых 50 лет промышленной революции, прежде чем взлететь и привести к повсеместному росту благосостояния. Первая причина заключалась в том, что владельцы фабрик утаивали выгоды от новой производительности, а не делились ими с рабочими. Вторая причина заключалась в том, что наибольший рост производительности занял десятилетия, потому что знания о том, как лучше использовать новые технологии, еще не были широко распространены. Потребовались десятилетия, чтобы изобретатели сделали машины более надежными, чтобы те, кто их использует, придумали новые виды рабочих процессов для повышения их эффективности, чтобы создать новые виды продукции, которую можно было бы производить с их помощью, чтобы более широкий круг предприятий освоил новые технологии, а работники приобрели необходимые навыки, чтобы воспользоваться ими. Рабочие нуждались в новых навыках не только для того, чтобы использовать машины, но и для того, чтобы ремонтировать их, улучшать, изобретать будущее, которое они предполагали, но еще не сделали полностью возможным. Все это происходит в процессе, который Бессен называет «обучением на практике».

Недостаточно, чтобы несколько человек опережали других в освоении новых навыков. Бессен объясняет, что «для предприятия, отрасли и общества в целом важно не то, сколько времени уйдет на обучение отдельного работника, а то, сколько потребуется для создания стабильной, обученной рабочей силы» (Learning by Doing, 36). Сегодня каждая компания, которой коснется эта революция (а это значит, что каждая компания), должна приложить свои усилия. Нам нужна грамотная в области ИИ рабочая сила. В конце концов, что такое программирование, как не способ, которым люди заставляют компьютеры выполнять наши команды? Тот факт, что «программирование» становится все ближе и ближе к человеческому языку, что наши машины могут понимать нас, а не только их родной язык 0 и 1 или специализированный язык программирования, должен быть поводом для радости.

Люди будут создавать, использовать и совершенствовать больше программ, а новые отрасли будут рождаться для управления и развития тем, что мы создаем. Уроки истории говорят нам, что, когда автоматизация удешевляет и упрощает доставку нужных людям продуктов, увеличение спроса часто приводит к росту занятости. Только когда спрос удовлетворен, занятость начинает падать. Мы еще далеки от этого момента, когда речь идет о программировании.

Неудивительно, что профессор Уортонской школы и евангелист ИИ Итан Моллик также является поклонником работы Бессена. Именно поэтому он так убедительно доказывает, что нужно «всегда использовать ИИ», вовлекать его в каждый аспект своей работы и исследовать то, что работает, а что нет. Именно поэтому он также призывает компании использовать ИИ для расширения возможностей своих работников, а не для их замены. Нам еще предстоит многое узнать о том, как применять новые технологии. Лучший источник прикладных исследований и разработок для компаний — это исследования ваших сотрудников, которые используют ИИ для решения своих проблем и поиска новых возможностей.

Изменится то, что такое программирование

Сэм Шиллас, один из заместителей технического директора Microsoft, согласился с моим мнением. В недавнем разговоре он сказал мне: «Мы находимся в середине процесса изобретения новой парадигмы программирования вокруг систем искусственного интеллекта. Когда мы перешли от настольных компьютеров к эпохе Интернета, все в стеке изменилось, хотя все уровни стека остались прежними. У нас все еще есть языки, но они перешли от компилируемых к интерпретируемым. У нас все еще есть команды разработки, но они перешли от водопада к Agile и CI/CD. У нас все еще есть базы данных, но они перешли от ACID к NoSQL. Мы перешли от одного пользователя, одного приложения, одного потока к многократному распределению. То же самое мы сейчас делаем с ИИ».

Вот некоторые из технологий, которые собираются в новый ИИ-стек. И это даже не считая множества моделей ИИ, их API и облачной инфраструктуры. И это уже устарело!

Конец программирования в том виде, в котором мы его знаем

Но взрыв новых инструментов, фреймворков и практик — это только начало того, как меняется программирование. Одна из проблем, отмечает Шиллас, заключается в том, что у моделей нет памяти, как у людей. Даже с большими контекстными окнами они с трудом справляются с тем, что он называет «метапознанием». В результате он считает, что люди должны по-прежнему обеспечивать значительную часть контекста, в котором работают их ИИ со-разработчики.

Шиллас развил эту идею в недавнем посте. «Большие языковые модели (LLM) и другие системы ИИ пытаются автоматизировать мышление», — написал он. «Параллели с автоматизацией движения во время промышленной революции поразительны. Сегодня автоматизация все еще груба: мы выполняем когнитивный эквивалент откачки воды и забивания молотком — такие базовые задачи, как обобщение, распознавание образов и генерация текста. Мы еще не придумали, как создать надежные двигатели для этого нового источника энергии — мы еще даже не на стадии локомотива ИИ».

Даже стадия локомотива была в значительной степени расширением грубой силы, которую люди могли применить при перемещении физических объектов. Следующим важным прорывом было увеличение средств контроля над этой силой. Шиллас спрашивает: «Что, если традиционная программная инженерия здесь не совсем уместна? Что если создание ИИ требует принципиально иных методов и систем управления? Мы пытаемся создать новые виды мышления (наш аналог движения): высокоуровневые, метакогнитивные, адаптивные системы, которые могут делать больше, чем просто повторять заранее разработанные шаблоны. Чтобы использовать их эффективно, нам придется изобрести совершенно новые методы работы, новые дисциплины. Подобно тому, как проблемы ранней паровой энергетики привели к появлению металлургии, проблемы ИИ приведут к возникновению новых наук о познании, надежности и масштабируемости — областей, которые еще даже не существуют в полной мере».

Проблема внедрения технологий искусственного интеллекта в бизнесе

Брет Тейлор, бывший исполнительный директор Salesforce, одно время главный технический директор Meta*, а в далеком прошлом — руководитель команды, создавшей Google Maps, сейчас является генеральным директором компании Sierra, разработчика ИИ-агентов, занимающейся разработкой и внедрением ИИ-технологий в бизнесе. В недавнем разговоре Брет сказал мне, что, по его мнению, ИИ-агент компании станет ее основным цифровым интерфейсом, таким же значимым, как веб-сайт, таким же значимым, как мобильное приложение, а возможно, даже более значимым. ИИ-агент компании должен будет кодировать все ее ключевые бизнес-политики и процессы. Возможно, со временем ИИ сможет сделать это самостоятельно, но сегодня Sierra вынуждена выделять каждому из своих клиентов команду инженеров для помощи в реализации.

«Последнюю милю — взять классную платформу и кучу бизнес-процессов и создать агента — на самом деле сделать довольно сложно», — объясняет Брет. «Сейчас появилась новая роль, которую мы называем агентный инженер — это разработчик программного обеспечения, который немного похож на фронтенд-веб-разработчика. Это архетип, который наиболее распространен в программном обеспечении. Если вы разработчик React, вы можете научиться создавать ИИ-агентов. Прекрасный способ переквалифицироваться и сделать свои навыки актуальными».

Кому захочется продираться сквозь телефоны службы поддержки клиентов, когда он может поговорить с ИИ-агентом, который действительно сможет решить его проблему? Но создать таких агентов будет очень непросто. Сложность заключается не в программировании. Это глубокое понимание бизнес-процессов и продумывание того, как новая способность может их преобразовать, чтобы воспользоваться новыми возможностями. Агент, который просто воспроизводит существующие бизнес-процессы, будет так же неудобен, как веб-страница или мобильное приложение, которое просто воссоздает бумажную форму. (И да, они все еще существуют!).

Адди Османи, руководитель отдела пользовательского опыта Google Chrome, называет это проблемой 70%: «В то время как инженеры сообщают о значительном повышении производительности с помощью ИИ, реальное программное обеспечение, которое мы используем ежедневно, не кажется заметно лучше». Он отмечает, что непрограммисты, работающие с инструментами генерации кода, могут получить отличную демонстрацию или решить простую задачу, но они застревают на последних 30% сложной программы, потому что не знают достаточно, чтобы отладить код и направить ИИ к правильному решению.

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

В этой связи Чип Хуйен, автор новой книги «ИИ инженерия», в своем электронном письме ко мне сделал интересное наблюдение:

Я не думаю, что ИИ вводит новый тип мышления. Он показывает, что на самом деле требует мышления.

Независимо от того, насколько вручную, если задача может быть выполнена только горсткой наиболее образованных людей, она считается интеллектуальной. Один из примеров — письмо, физический акт копирования слов на бумагу. В прошлом, когда лишь небольшая часть населения была грамотной, письмо считалось интеллектуальным занятием. Люди даже гордились своей каллиграфией. В наши дни слово «письмо» больше не относится к этому физическому действию, а является более высокой абстракцией, связанной с оформлением идей в удобочитаемый формат.

Точно так же, как только физический акт кодирования можно будет автоматизировать, значение слова «программирование» изменится и будет относиться к акту организации идей в исполняемые программы.

Мехран Сахами, заведующий кафедрой CS в Стэнфорде, сказал об этом просто: «Информатика — это систематическое мышление, а не написание кода».

Когда агенты ИИ начинают разговаривать с агентами…

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

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

“Существующие инструменты в значительной степени недостаточны, поскольку они не предназначены для определения того, как агенты взаимодействуют с существующими институтами (например, правовыми и экономическими системами) или участниками (например, поставщиками цифровых услуг, людьми, другими агентами ИИ). Например, методы согласования по своей природе не гарантируют контрагентам, что какой-то человек будет привлечен к ответственности, если пользователь даст агенту указание выполнить незаконное действие. Чтобы заполнить этот пробел, мы предлагаем концепцию инфраструктуры агентов: технических систем и общих протоколов, внешних по отношению к агентам, которые призваны опосредовать и влиять на их взаимодействие с окружающей средой и воздействием на нее. Инфраструктура агентов включает в себя как новые инструменты, так и реконфигурации или расширения существующих. Например, для облегчения подотчетности протоколы, связывающие пользователей с агентами, могут основываться на существующих системах аутентификации пользователей, таких как OpenID. Подобно тому, как Интернет опирается на инфраструктуру вроде HTTPS, мы утверждаем, что инфраструктура агентов будет столь же незаменима для экосистем агентов. Мы выделяем три функции инфраструктуры агентов: 1) приписывание действий, свойств и другой информации конкретным агентам, их пользователям или другим участникам; 2) формирование взаимодействия агентов; и 3) обнаружение и устранение вредных действий агентов.

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

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

Мы находимся на начальном этапе создания будущего

Нам предстоит узнать и сделать еще так много нового. Так что да, давайте смело предположим, что ИИ-помощники сделают программистов в десять раз продуктивнее (число  может быть разным, в зависимости от того, насколько охотно ваши разработчики осваивают новые навыки). Но давайте также предположим, что, как только это произойдет, параллельно вырастет «площадь программируемой поверхности» бизнеса, науки, нашей инфраструктуры. Если количество возможностей для изменения ситуации с помощью программирования увеличится в 20 раз, нам все равно понадобится в два раза больше этих новых 10x программистов!

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

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

Возьмите урок из другой области, где возможности резко возросли. На рендеринг одного кадра современного фильма о супергероях Marvel может уйти столько же времени, сколько на рендеринг всего первого фильма Pixar, несмотря на то что цена и производительность CPU/GPU выросли благодаря закону Мура. Оказывается, киноиндустрия не довольствовалась тем, что быстрее и дешевле создавала грубую анимацию в низком разрешении. Дополнительные циклы пошли на тысячи крошечных улучшений в реалистичном мехе, воде, облаках, отражениях и многих-многих других пикселях разрешения. Технологические усовершенствования привели к повышению качества, а не просто к удешевлению/быстрой доставке. Существуют отрасли, которые стали возможны  благодаря дешевле/быстрее, а не качественнее (вспомните взрыв пользовательского видео в Интернете), поэтому не будет “или”. Но качество будет иметь свое место на рынке. Оно всегда занимает свое место.

Представьте себе десятки миллионов начинающих программистов, работающих с ИИ-инструментами вроде Replit и Devin или корпоративными решениями вроде тех, что предлагают Salesforce, Palantir или Sierra. Какова вероятность того, что они наткнутся на сценарии использования, которые понравятся миллионам? Некоторые из них станут предпринимателями нового поколения программного обеспечения, созданного в партнерстве с ИИ. Но многие из их идей будут приняты, доработаны и масштабированы существующими профессиональными разработчиками.

Путь от прототипа к производству

В корпоративном секторе ИИ сделает так, что решения будут создаваться теми, кто ближе всего к любой проблеме. Но лучшие из этих решений все равно должны будут пройти остаток пути, который Шьям Санкар, технический директор Palantir, назвал «путешествием от прототипа к производству». Санкар отметил, что ценность ИИ для предприятия заключается «в автоматизации, в автономности предприятия». Но, как он также отметил, «автоматизация ограничена крайними случаями». Он напомнил об уроках Stanley, самоуправляемого автомобиля, победившего в конкурсе DARPA Grand Challenge в 2005 году: он был способен на выдающиеся достижения, но ему потребовалось еще 20 лет разработки, чтобы в полной мере справиться с такими крайними случаями, как вождение в городе.

«Рабочий процесс по-прежнему имеет значение», — утверждает Санкар, и работа программиста будет заключаться в том, чтобы понять, что может быть сделано традиционным программным обеспечением, что может быть сделано искусственным интеллектом, что по-прежнему должно быть сделано людьми, и как вы соедините вещи вместе, чтобы действительно выполнить задачу. Он отмечает, что «выиграет та цепочка инструментов, которая позволяет вам улавливать обратную связь и изучать крайние случаи, чтобы добраться до них как можно быстрее». В мире, который представляет себе Санкар, ИИ «фактически освободит разработчиков, чтобы они могли больше внедряться в бизнес и иметь гораздо больше рычагов воздействия». Тем временем высококлассные профильные специалисты станут программистами с помощью ИИ-помощников. Не программисты останутся без работы. Без работы останутся люди всех профессий, которые не станут программистами с помощью ИИ.

Это не конец программирования. Это начало его нового переизобретения.

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Telegram

Популярное

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: