Всем привет! Начну с небольшой предыстории. Заранее прошу прощения, если эта история вызовет у кого-то скуку или негатив. Здесь будет описываться опыт программирования человеком, который абсолютный ноль в этом. Надеюсь, кого-то это даже позабавит.
До определенного времени я работал инженером-проектировщиком систем пожаротушения, также успел немного (около года) поработать в крипте, по образованию — инженер систем водоснабжения и водоотведения. Но так сложилось, что интерес к тому, чтобы научиться «кодить», зародился, когда я работал в крипте; помимо всего прочего там я делал всякие таблицы, в которые нужно было регулярно заносить данные, и я старался сделать их более автоматизированными.
Позже я решил двигаться по карьере проектировщика, переехав в Москву. Мне часто приходилось выполнять гидравлический расчет систем пожаротушения (ПТ). Я в нем разбирался очень хорошо. Отчасти, наверное, сказалось влияние отца, который обожал точные науки и помнил всю свою обучающую программу вплоть до университета, и деду, который на тот момент был действующим доктором наук и заведующим трех кафедр. Хоть я и не любил учебу ни в школе, ни универе, у меня было чувство ответственности за те цифры, которые я прописываю, я должен быть уверен на 100% в правильности, иначе просто мне не было бы спокойно. Большинство коллег-проектировщиков, к моему сожалению, не вникали в расчет, так сильно как я. У меня была собственная табличка, в которой я мог по‑быстрому посчитать отдельные участки системы, это было иногда быстрее, чем через некоторые программы. К слову об этом, на моей памяти особой популярностью пользовались только две, и одна из них — это какой‑то прокачанный Excel буквально, а другая — громоздкая с абсолютно ужасным и недружелюбным интерфейсом из 90-х, хоть и с интересным функционалом, интегрированным в Autocad. Они мне совершенно не нравились, и не было достойных альтернатив, скорее всего потому, что мало людей с глубокими познаниями в программировании также имеют не менее глубокие познания в гидравлике и нормах пожаротушения. А в моей шпаргалке каждый раз считать новую систему было достаточно угнетающе, так как нужно было каждый раз перелопачивать всю таблицу, где сбивалось много формул и ссылок, так как количество оросителей на одном рядке и количество этих рядков почти всегда было разное.
В общем, как‑то раз мое любопытство взяло верх и знакомый кодер дал мне наводку на бесплатный курс «Основы программирования на Python» на Coursera. Я с энтузиазмом его проходил, и хоть там не говорили решать все практические задачи, а хотя бы половину, я закрывал всё на протяжении месяца, проходил самую базу и решал простые и сложные арифметические задачи: интересно было выдумывать циклы и алгоритмы для каких-то прикольных заданий. Потом ввиду каких‑то обстоятельств я забросил его. Но интерес оставался, и мне хотелось сделать собственный удобный инструмент для гидравлики, который, в целом, у меня получился в виде некоторой альфа‑версии приложения для расчета гидравлики ПТ и, собственно, вот как это было.
Первые шаги, разработка примитивной версии программы без UI
Поначалу я пробовал задать различные величины и формулы в интерпретаторе Python. Забивал константы, диаметры труб, пробовал играться с формулами расчетов, пытаясь перевести их из нормативов в код, и то, насколько это просто получалось и работало, меня поистине приводило в восторг. Тот факт, что стучишь по клавишам и потом получаешь какой‑то результат, для меня было сродни магии.
Для расчета рядка со спринклерами мне очень пригодился цикл For
и int(input())
, сперва я добился того, что в интерпретаторе мог забивать исходные данные для расчета, и он выдавал расчет рядка, но система состоит из множества рядков, и они могут быть несимметричными. Какое‑то время я не мог придумать, как мне заставить программу посчитать первый рядок, запомнить это и пойти дальше, причем там были различные ситуации, когда нужно было отделить условные «яблоки от персиков». Ко мне пришла прорывная идея, когда я сидел на унитазе — сделать цикл внутри цикла.
Где‑то за пару‑тройку дней я довел работу своей программы в плане точности расчета до приемлемого уровня, сверял с вручную забитыми данными в своей проверенной временем табличке и получал довольно точные результаты. При помощи библиотеки pandas можно даже загружать их в сухом виде в табличку Excel без структуры и оформления, но всё это было только в интерпретаторе, где программа через терминал спрашивала у меня различные данные и двигалась по расчету, что, согласитесь, не очень удобно: на моем рабочем месте нет интерпретатора. Есть, конечно, онлайн, но в любом случае это не совсем удобно.
Тогда я решил начать изучать различные варианты, как можно создать интерфейс пользователя и привязать к нему мою программу с расчетом, и здесь начались настоящие проблемы.
Я смотрел множество роликов на Ютубе, всяких блогеров-программистов, читал статьи, но даже для того, чтобы банально понять информацию, которую там давали, мне не хватало знаний. В частности по ООП. Тогда я решил сделать паузу, доработать свой код, прикрутил уже более осмысленную выгрузку в более-менее оформленную табличку Excel. И так как всё до этого я выполнял без знаний о классах, наследовании, SQL, СУБД и т.д, задача эта получилась не из легких: мой код уже насчитывал около 60 строк. Я искал подходящий под нужную мне структуру таблиц шаблон выгрузки данных в Pandas и формирования вот этого:
Если до этого решение возникающих передо мной задач приходило довольно быстро, в течение одного вечера или даже часа, то на решение этой у меня ушло порядка 3–4 вечеров с поисками различной информации, изучением разных библиотек, проб и ошибок, и когда у меня получилось, я ощутил мощную дозу дофамина, а также уверенность в себе и собственных силах. Мне пришлось перелопатить цикл так, чтобы для данного шаблона формировать словари, со словарями, внутри которых еще одни словари с расчетными данными из циклов при этом протаскивали какие‑то значения между циклами и использовали их в расчетах других. После чего я решил немного привести код в порядок, и у моей программы уже было примерно 130 строк. Всё это я делал в свободное от работы время.
После осознания того, что мне необходимо больше знаний, чтобы моя программа могла обрести интерфейс, я начал задумываться, стоит ли еще тратить на это свое время и пытаться дальше. Хоть мне и было очень интересно довести это до конца, но я понимал, что дальше идёт пропасть, которую мне на голом энтузиазме не перепрыгнуть. На работе я то и дело вспоминал про свой мини-проект, да и некоторые события, происходящие со мной в компании, да и вообще в отрасли, очень расстраивали. Не буду описывать, что именно, потому как правила гласят, что нельзя жаловаться на компании (не знаю, это про конкретные, или в принципе). Где‑то спустя неделю я почувствовал голод на те эмоции от решения задач и воплощения моих мыслей в нечто работающее и почти материальное. Тогда я решил купить курсы программирования на Python; поспрашивав, почитав отзывы, я получил рекомендации взять на Яндексе курс Backend-разработчика на Python, который я в итоге приобрел, но так и не закончил.
Про обучение, временные трудности и переезд в Казахстан
В течение месяца я проходил обучение, попутно стараясь применять полученные знания в своем проекте, стараясь приводить код в порядок по PEP, применяя что-то изученное для упрощения и упорядочивания каких-то функций и методов. А потом наступил тот день, когда очень многие мужчины неожиданно захотели попробовать пожить в СНГ.
В числе них был и я, конечно же, у нас на работе люди разбежались врассыпную. Я выбрал Казахстан, так как у меня не было загранпаспорта, и там была возможность работы. Перед этими событиями мне отказали в повышении ЗП на работе, я решил уволиться и вернуться в крипту. К этому моменту я уже познакомился с Git и перенес свои наработки на него, в крипте мне немного пригодились знания программирования, так как я написал себе простого бота-помощника для автоматизации некоторой рутинной работы. Находясь в Казахстане, по обучению я сильно отставал, и что более печально, у меня уже не было возможности изучать и применять язык программирования. Из-за смены работы и сферы деятельности мне не хватало на всё это времени, оставалось только нагонять как можно быстрее.
Спустя три месяца я вернулся обратно в Москву, уже был потрачен второй академотпуск на обучении, за это время я успел пройти 3 спринта, заканчивал 4-й, но тут столкнулся с такой штукой, как несоответствие личных ожиданий. Мне нравилось изучать ООП, решать сложные задачи, придумывать какие‑то алгоритмы, но я просто не мог вынести frontend, а его там было еще на следующие 2 спринта ого‑го. Для меня это было жуткой рутиной, и даже смотреть на HTML было сложно и вгоняло в сон — никого не хочу обидеть! Каждому своё.
В итоге я стал заниматься намного реже, мотивации почти не было, меня отчислили, я вернул часть средств.
Выбор инструмента для создания UI
Изучение работы и возможностей ChatGPT для написания кода было очень увлекательным. Что меня поразило: когда закинул весь код и попросил описать, что тут происходит, он точно объяснил, что делает моя программа и как! Я был в шоке! Даже подумал, что, может, зря я всем этим занимался и чат‑бот мог написать всё то же самое за один или несколько запросов. Но позже попробовал и убедился — нет, он не может.
Затем я закидывал в ChatGPT отдельные части кода, описывал задачу, которая мне нужна, и он выдавал свою версию решения, но я ничего не понимал, и, соответственно, не знал, как это встроить или применить. Тогда я просил бот расшифровать код построчно: что конкретно он изменил и зачем. Я просил его дописывать пояснения после каждого блока, чтобы понимать, за что этот код отвечает и что выполняет. Попросил его пересобрать мой код с циклами для интеграции в интерфейс с учетом принципов ООП — что‑то у него получалось с нескольких попыток, что‑то не получалось ни в какую. И я заметил, что намного эффективнее было закидывать весь код программы, просить проанализировать его, а затем уже описывать свой запрос. На самом деле я с ним столько общался, что мне выскакивал лимит на запросы в день.
В итоге подвижки начались тогда, когда я начал просить его написать простые шаблоны и примеры интерфейса для PyQt6 с какими‑то кнопками, заглушками, нажатие на которые выдавало бы что‑то вроде «Кнопка 1 нажата». Тыкал и изучал, как это всё работает, учился формировать правильные запросы и просил всё более сложные и более приближенные к моим задачам примеры, чтобы в итоге понять, где, что и как я должен подключить, какие сигналы и слоты, для того чтобы эта магия случилась. Чтобы я нажал кнопку на своем шаблоне, и он запустил код функции, который я задумал для нее. Было такое, что, на первый взгляд, всё правильно и должно уже работать, но почему‑то не работает. Перепробовав разные варианты, я спросил бот, на какой версии PyQT он пишет свои решения, и выяснилось, что не на той, на которой работаю я! Но круто то, что он знал ту версию, которую использовал я, и мог с ней работать. После этого я старался формировать запросы ChatGPT с учетом версии библиотеки, и после того как он откорректировал некоторые свои ответы, я таки смог запустить свою программу, но радоваться было пока рано.
Я много топтался на месте, получал различные ошибки на разных этапах выполнения работы расчета, но в интерфейсе уже что-то работало и запускалось. Пришлось пересмотреть структуру логики с учетом того, что я вообще хочу от интерфейса и какие опции надо туда добавить. Я закидывал в ChatGPT код целиком, тексты ошибки, и он помогал анализировать их: описывал, где и почему у меня возникает ошибка и даже предлагал исправленные варианты кода. Поначалу где-то это помогало, и я отметил, что он предоставляет еще и неплохие возможности для тестирования кода, но потом именно это меня и подвело. Не знаю почему, но в какой-то момент на определенную ошибку он выдавал одно решение, а при применении его версии код выдавал другую, в результате чего он советовал то, первое, решение.
Примерно через 2 часа я понял, что бот гоняет меня по кругу и, похоже, на этот раз такой подход не поможет. Тогда я начал сам проверять, где, что и как ломается, искать концы; в итоге нашел, и ошибка была странная — GhatGPT запутался. Где‑то он использовал функцию как метод или даже как переменную, забыв указать данные на вход. Где‑то он назвал переменную и функцию одним именем и сам запутался, где и что нужно использовать, а возможно, когда я пытался какие‑то блоки «копипастить», не заметил этого и запутал его. Хотя, учитывая объем символов, которые я ему скармливал, для меня было удивительно, что он вообще меня понимает и помогает мне. Могу, положив руку на сердце, сказать, что большую часть программы перелопатил ChatGPT (где‑то 80%) и помог её адаптировать, позволив прийти к тому, что я показал на первом изображении. Но еще круче то, что благодаря ChatGPT я начал и сам разбираться: приходилось искать зависимости, пытаться вникнуть в работу, искать ошибки и пробовать их устранять, а для достижения этой цели — глубже вникать в работу библиотеки.
Я почему‑то на 100% уверен, что всё равно наделал ошибок где‑то, прописал то, чего в принципе не нужно было, и, возможно, на данном этапе это пока ни с чем не конфликтует. Но так или иначе я доделал интерфейс, программа работает четко, и в итоге я даже прикрутил какие‑то новые функции, которых не было: автоматический подбор диаметров, предварительное табло расчета, кнопка переключения с автоматического расчета по данным ТД на оросителе на ручной ввод, где данные прописываешь сам.
Эта альфа-версия появилась спустя 4 или 5 дней после того, как я решил попробовать использовать себе в помощь ChatGPT. И целых 4 месяца я откладывал это дело, потому что сомневался в себе. Насколько бы много можно было сделать, если бы мы могли по желанию контролировать свою эффективность и отгородиться от лени и предрассудков? Я искренне белой завистью завидую тем, кто это умеет.
На самом деле немного даже страшно, насколько мощный инструмент этот ChatGPT. Это было в первой половине 2023 года, что будет, если он станет еще мощнее? А он точно станет; и сколько компетентных сотрудников-программистов он сможет заменить компаниям в будущем?
Планирую написать еще одну статью о том, что было дальше с моим проектом и со мной, надеюсь, не сильно утомил читателей, так как планирую продолжить эту историю.