Вместо программиста — кнопка «Сделать хорошо»: может ли компьютер писать код и не поздно ли уже «идти в айти»
Технологии
Никита Логинов
Нейросеть AlphaCode выступила в конкурсах программирования на уровне человека. Но до полной автоматизации по-прежнему далеко — ИИ ещё долго не заменит разработчиков.
Демонстрация работы AlphaCode: слева — словесное описание задачи, справа — итог работы нейросети, изображение DeepMind
В начале февраля компания DeepMind представила нейросеть AlphaCode, которая смогла на равных участвовать в конкурсах по программированию и писать код неплохого качества. Главный научный сотрудник компании Ориол Виньялс заявил, что «сотрудники в восторге от потенциала» AlphaCode — от неё ждут способности помогать писать код и «создавать новые способы производства софта».
Новость об AlphaCode вызвала очередную волну обсуждений о том, что профессия разработчика вот-вот потеряет актуальность, потому что программистов заменят компьютеры. TJ разобрался в истории вопроса и попытался понять, насколько серьёзна конкуренция со стороны ИИ.
В идеале должна получиться компьютерная программа, которой можно словами описать желаемое приложение (или даже игру), нажать кнопку и через какое-то время получить готовый продукт: приложение или игру. То есть, это разработка софта без участия разработчиков — людей, которые пишут и поддерживают код программы.
Автоматизировать программирование первыми захотели сами программисты, причём почти сразу после создания компьютеров. Тогда инженерам приходилось писать программы прямо в машинных кодах, управляя отдельными электрическими сигналами в ячейках памяти и регистрах процессора. Работать с потоками нулей и единиц было крайне утомительно и скучно, так что инженеры принялись «учить» компьютер понимать и человеческий язык, а не только свой машинный.
В 1952 году американская учёная и коммодор флота Грейс Хоппер создала первый компилятор — программу-переводчик с «очеловеченного» машинного кода на обычный.
В этом языке ассемблера место многих машинных «слов» заняли более понятные mov (переместить) или add (сложить), что даже визуально сделало код проще. Язык ассемблера (он отличался для каждой модели компьютера) открыл вторую эпоху программирования — которая, впрочем, продлилась недолго.Язык ассемблера и машинный код, изображение Android Authority
Возможностей ассемблера быстро перестало хватать, так что уже с конца 1950-х годов начали появляться языки третьего поколения: Fortran, ALGOL, COBOL, Basic, Pascal, C и так далее. В них ещё больше машинных инструкций было обёрнуто в понятные слова вроде begin, end, if, else, return. Формировались новые методы программирования, больше похожие на человеческое мышление. С годами языки программирования становились всё ближе к людям и всё дальше уходили от машинного кода.
Сейчас программисты используют языки программирования третьего и четвёртого поколений (C++, C#, Python, PHP, Java, JavaScript). Понять код на таких языках даже без подготовки порой не труднее, чем средневековую поэзию, особенно если это Python или PHP.
За 70 лет с создания первого компилятора программисты неплохо автоматизировали свою работу: вместо сотен или тысяч строк на языке ассемблера теперь достаточно написать одну понятную строку на современном фреймворке. Благодаря такому упрощению программирование стало «второй грамотностью» в 21 веке, а вычислительные устройства, работающие под управлением программ, проникли во все сферы жизни.
Программы-компиляторы не просто переводят исходный код в машинный, но и хорошо оптимизируют его. Ещё 20-30 лет назад имело смысл писать особо «тяжёлые» участки программы на языке ассемблера, чтобы выжать максимум скорости. В начале века компиляторы начали генерировать код не хуже былых ассемблерных вставок, а сейчас отдельные программисты уже вряд ли смогут оптимизировать программу так же хорошо, как компиляторы GCC, LLVM/Clang, MSVC или ICC.
Современные компиляторы даже способны самостоятельно прогонять собранную программу по типовым сценариям использования, анализировать статистику её работы и переписывать код на более быстрый или компактный. Ручная оптимизация не исчезла полностью, но стала более высокоуровневой — то есть, программист обычно оптимизирует общую структуру программы.
Компиляторы сами генерируют новый код, подчас очень сложный. Но всё же они не пишут программы полностью с нуля, как в случае идеальной автоматизации. Первые попытки создать программы, которые пишут программы, начались на самой заре компьютерной эры и вылились в появление отдельной парадигмы — метапрограммирование.
Идея метапрограммирования проста: если обычные программы манипулируют данными (текстом, графикой, звуком и так далее), то в роли таких данных может выступать код другой программы. Тогда программы будут изучать и модифицировать другие программы или даже сами себя, в том числе и прямо во время работы.
Программист, например, может написать краткий шаблон, «заготовку» нужной ему программы, а компилятор развернёт его в полноценный работающий код. Это умеют делать многие популярные языки программирования — шаблоны и макросы в том или ином виде есть в C++, Rust, Haskell, Python, Lua и так далее.
Макрос всего в шесть строк добавляет в LISP оператор for, изображение Пола Грэма
Используя метапрограммирование, разработчик может даже написать шаблон нового языка, созданного под одну конкретную задачу. Компилятор сгенерирует этот язык программирования и впоследствии на нём напишет нужную программу. Такой подход с использованием узкоспециализированных предметно-ориентированных языков (DSL) особенно часто используют любители языка LISP.
Метапрограммирование позволяет человеку писать минимальное количество строк — по сути, программист в общих чертах «объясняет» компьютеру, как должна выглядеть итоговая программа, после чего компьютер делает всю остальную работу. Это уже куда ближе к идеалу автоматизации — программе, которая сама пишет программы.
Софт, работающий по принципам метапрограммирования, давно не редкость. Приложения создают отчёты и документацию, веб-фреймворки генерируют HTML-страницы, которые когда-то писали полностью вручную. Браузеры и другие программы используют самомодификацию кода в виде JIT — компиляции исходного кода в машинный прямо во время его выполнения.
Расплата за такую экономию времени и сил — сложность программирования и слабая предсказуемость работы сгенерированных программ. Этот подход требует очень высокой квалификации программиста. Для примера, есть простейшая задача метапрограммирования: написать код, который выводит на экран сам себя без чтения ввода или файлов. На Python такую программу можно уложить в одну короткую строку:
Блок code недоступен
Но чтобы прийти к ней, нужно совершить ряд нетривиальных умственных усилий, не сваливаясь при этом в бесконечную рекурсию. Ещё сложнее — отчётливо продумать, как будет выполняться метапрограмма, которая «рефлексирует» чужой или собственный код, и модифицирует его.
Этот подход скрывает в себе столько труднопредсказуемых ошибок и уязвимостей, что некоторые опытные программисты советуют его остерегаться, так как он редко оправдывает себя.
Да и в целом метапрограммирование не выглядит хорошим способом получить полностью автоматическую программу-разработчика. Зато таким способом выглядит искусственный интеллект.В середине 1950-х годов учёные и инженеры, видя успехи компьютеров, пришли к мысли, что искусственный интеллект вполне можно создать в рамках обычной компьютерной программы. Причём не ИИ узкого профиля, а «сильный искусственный интеллект», аналог человеческого. Эта мысль стала доминирующим подходом к созданию ИИ вплоть до середины 1990-х годов.
Явную формулировку идее символического ИИ придали учёные Ньюэлл и Саймон в 1976 году: они выдвинули гипотезу, что интеллект невозможен без вычислений с участием чисел, слов, выражений и прочих символов — а с другой стороны, таких вычислений достаточно для появления или создания интеллекта. Этот тип ИИ, работающий на основе символов, в 1980-х годах получил название «старого доброго искусственного интеллекта» (GOFAI).
Поначалу прогресс в этой области действительно впечатлял. Появились языки LISP и Prolog, хорошо подходящие для программирования ИИ. На них разработчики написали множество экспертных систем, способных самостоятельно рассуждать и делать выводы, а также просто мощных программ для науки, промышленности, здравоохранения, госсектора, финансовых структур. И эти языки используются до сих пор — например, на Prolog написан один из компонентов «ИИ-компьютера» IBM Watson.
В 2011 году IBM Watson даже без доступа к интернету обыграл лучших игроков в аналог «Своей игры», фото IBM
Мощь языка LISP продемонстрировала программа SHRDLU в 1968 году: на транзисторном компьютере PDP-6 с примерно 144 килобайтами памяти она «понимала» текстовые команды на обычном английском языке и давала вразумительные ответы, логически связанные с запросами.
Все эти успехи вызвали эйфорию в среде исследователей ИИ в 1960-х годах: казалось, что остаётся только выстроить правильные логические отношения между символами (предметами, явлениями, понятиями) — и вот он, полноценный искусственный разум. Разработку софта не ставили главной целью ИИ — считалось, что он легко справится с любой задачей, которая по силам человеку. В том числе, сможет сам писать программы.
Но уже в тех же 1960-х годах символический подход начали жёстко критиковать: например, философ Дрейфус пришёл к выводу, что «потолок» такого ИИ — решение игровых задач, которые не имеют практической ценности. В 1973 году математик Лайтхилл в своём знаковом отчёте повторил этот аргумент в более категоричной форме: он показал, что ни одна система ИИ не добилась ожидаемых успехов, и что символический подход в принципе неспособен привести к созданию искусственного интеллекта.
Дело в том, что разработка любого символического ИИ, оперирующего отдельными понятиями, рано или поздно сталкивается с комбинаторным взрывом. Пока программа занимается «игрушечной проблемой» — программистам по силам создать для неё обработчик входных данных (например, команд пользователя). Но при попытке масштабировать программу до универсального ИИ, количество комбинаций входных данных растёт взрывными темпами.
Проще говоря, можно создать символический ИИ для бесед с человеком или игры в шахматы, но невозможно создать такой ИИ, который мог бы усвоить любое человеческое знание или умение, или даже неограниченно обучаться в рамках одной задачи. На его создание уйдёт бесконечное количество времени и ресурсов компьютера.
Японская LISP-машина LIME, изображение IPSJ
Отчёт Лайтхилла повлёк за собой первую «зиму искусственного интеллекта» — интерес к созданию символического ИИ резко упал, власти и частные компании прекратили финансировать исследования. Ситуацию не спас и успех экспертных систем, под которые даже начали выпускать LISP-машины — компьютеры, аппаратно оптимизированные для выполнения программ на этом языке. Рынок LISP-машин потерпел крах в 1987 году, а к 1995 году стало очевидно: идея символического ИИ несостоятельна, нужен другой подход.
Исследователи искусственного интеллекта негласно приняли аргументы Дрейфуса, который указывал на немалую роль бессознательных процессов в человеческом мозге. Учёные решили «спуститься» с символьного представления знаний и попытаться создать субсимволический ИИ — например, в виде искусственной нейронной сети, компьютерную модель которой американские нейробиологи предложили ещё в 1943 году.
Если символический ИИ оперирует цельными смысловыми единицами (предметами, явлениями, понятиями, визуальными образами), то субсимволический — более мелкими единицами, которые сами по себе не имеют смысла. Например, отдельными буквами, слогами или пикселями картинки. Причём субсимволический ИИ соединяет единицы исключительно по статистике их соединений в прошлом, тогда как символический использует для этого логические операции.
Допустим, человек спрашивает у программы: «Как у тебя дела?». Символический ИИ, написанный на LISP, разбивает эту фразу на отдельные слова, делает вывод, что речь о нём самом, и что человек спрашивает не о конкретных делах, а хочет услышать некую интегральную оценку состояния. После чего смотрит, с какими вариантами такой вопрос связан по смыслу, возможно как-то оценивает своё текущее состояние, и отвечает: «У меня всё хорошо».
Минус такого подхода — в его малой гибкости. Программист может заложить десятки вариантов слов, которые динамически соединяются в разные по форме вопросы с одним смыслом: «Как дела?». Но первое же «Чё как?» вызовет ступор у символического ИИ, потому что такая форма вопроса не выводится логически из заложенных вариантов.
Нейросеть разбивает входные данные (в данном случае — изображение крестика) на «частицы» и прогоняет через несколько слоёв нейронов, изображение Cornell University Library
Субсимволический ИИ в лице нейросети разбивает фразу «Как у тебя дела?» на отдельные буквы и с помощью своеобразного многослойного «трафарета» оценивает, что могут означать именно такие буквы именно в такой последовательности, после чего создаёт подходящий ответ, так же собирая его по кусочкам через многослойный «фильтр».
Плюс этого подхода в том, что хорошо обученная нейросеть одинаково воспримет вопросы «Как дела?», «Как поживаешь?», «Чё как?» и так далее. Минус — в его «бессмысленности». Если символический ИИ в процессе работы логически рассуждает, что похоже на мышление, то нейросеть «рефлекторно» выдаёт ответы исключительно на основе статистики, выведенной из прошлого опыта — даже не осмысливая, о чём речь. Похожим образом работают бессознательные области мозга, порождая то, что называют интуицией.
В 1990-х годах субсимволический ИИ принялись исследовать на практике: появились первые рабочие образцы нейросетей для распознавания образов (1992 год) и управления автомобилем (1995 год). Но лишь в 2010-х годах нейросети стали массовым явлением, когда компьютерная индустрия смогла предложить подходящее оборудование.
Примерно так выглядит рабочая станция для работы с нейросетями — «топовый» процессор и несколько мощных видеокарт, фото Bizon Tech
Искусственная нейронная сеть, как и настоящая биологическая, основана на параллельной работе миллионов или миллиардов нейронов. Компьютеры 1990-х и 2000-х годов долгое время были малопоточными — даже видеокарты имели считанные десятки или сотни вычислительных ядер. Только когда на рынке стали появляться видеокарты с тысячами вычислительных ядер и гигабайтами видеопамяти — инженеры получили возможность массово делать достаточно мощные и функциональные нейросети.
Бум практического использования нейросетей начался примерно в середине 2010-х, и за эти годы субсимволический ИИ стал обыденным инструментом в руках учёных, частных компаний и даже госструктур.
В 2015 году появился и первый «нейропрограммист»: учёный-информатик Андрей Карпати обучил нейросеть Torch7 на 400 мегабайтах исходного кода Linux, после чего она за ночь создала более 38 тысяч строк нового кода. По словам Карпати, этот код выглядит так, будто его написал программист на языке С — правда, он не работает и даже не компилируется из-за массы ошибок и неточностей.
После этого исследователи представили ещё несколько нейросетей, которые писали или тестировали код, а летом 2021 года случилось, пожалуй, знаковое событие. Microsoft и Open AI запустили GitHub Copilot — ИИ-сервис, который дописывает за программистом участки кода сразу по пять-десять строк. Это «умное автодополнение» сразу стало популярным на практике — к середине осени Copilot генерировал уже 30% нового кода, который программисты всего мира добавляли на GitHub.
Пример работы GitHub Copilot, изображение GitHub
И вот теперь, в начале февраля, компания DeepMind представляет нейросеть AlphaCode, похожую на то, что инженеры и учёные пытались создать 70 лет — она принимает описание задачи на английском языке и выдаёт код, который собирается и работает. Основой «опыта» для AlphaCode послужили 715 гигабайт исходного кода различных проектов на GitHub, а Copilot обучали на нескольких терабайтах созданного кода.
Получается, ИИ уже пишет программы — и как помощник программиста, и как сам программист, причём с неплохой результативностью. Copilot понравился половине разработчиков, которые пробовали его в работе, а AlphaCode смог попасть в 54,3% лучших участников конкурсов программирования. Ещё важнее, что нейросети выдают полностью новый код, а не компиляцию кусков кода, который написали люди (хотя изредка у Copilot бывает и такое).
Всё указывает на то, что компьютер в принципе может писать программы вместо человека. Автоматизация программирования постепенно дошла от компиляторов и фреймворков до искусственного интеллекта. Однако профессия программиста не перестанет быть актуальной ещё несколько десятилетий, а возможно, что компьютеры не смогут полностью вытеснить людей из разработки софта в обозримое время.
- AlphaCode относительно неплохо работает в «тепличных» условиях конкурсного программирования, где задания подробно и точно описаны, но в реальной разработке софта нет таких условий. Нейросети, как и любые субсимволические ИИ, очень узкоспециализированы, их обучают для одной конкретной задачи. Задача AlphaCode — участвовать в конкурсах по программированию.
- Лучшие нейросети выдают всего по 10-20 строк работающего и нормально оформленного кода ценой огромного потребления энергии, тогда как типичное приложение или игра состоят из десятков тысяч строк кода. Причём даже такая небольшая производительность нейросети требует огромных массивов уже написанного кода для обучения. Чтобы AlphaCode смогла правильно написать 200 строк хотя бы в одной попытке из трёх — ей понадобится столько кода для обучения, сколько человечество ещё не создало. Сейчас нейросеть выдаёт меньше строк кода, чем содержится текста в её заданиях.
- Субсимволический ИИ неспособен «размышлять», оперируя логикой, он работает чисто статистически, отталкиваясь от прошлого опыта. Нейросеть не может намеренно создать новый алгоритм или метод программирования, а в работе с новыми языками программирования нейросети совершенно бесполезны — без тысяч или миллионов программ, написанных людьми, этот тип ИИ просто не сможет обучиться языку.
- Даже долгое и дорогое обучение на уже созданном коде не даёт высокой точности работы «ИИ-программистов». Нейросеть Codex от OpenAI умеет писать на 12 языках программирования, но её код запускается и работает без ошибок только в 37% случаев. Подсказки Copilot просто небезопасны — 40% генерируемого им кода содержит уязвимости. Пробуя нейросети в работе, разработчики обычно приходят к выводу, что до полной автоматизации их профессии ещё далеко.
- Нейросети работают по принципу «чёрного ящика» — весь процесс проходит в скрытых слоях искусственных нейронов непрозрачно для людей, так что нельзя сказать, почему нейросеть в каждом конкретном случае выдаёт определённый вариант. Такая неподотчётность может помешать полной автоматизации программирования — люди предпочтут держать под контролем хотя бы ключевые моменты разработки софта.
- Субсимволический ИИ неспособен осознанно придерживаться каких-либо принципов — например, программировать в едином стиле. Порой нейросети выдают очень странный код, который вряд ли написал бы живой разработчик — но тем не менее, он работает. По мере роста объёмов генерируемого кода количество таких участков будет увеличиваться, а это создаст массу проблем с поддержкой софта. Людям нужен человекочитаемый код, а не типично машинный фарш из символов — именно для этого изобретали компиляторы, фреймворки и прочие вещи.
Как и в предыдущие десятилетия, автоматизация программирования угрожает в первую очередь самой простой и рутинной работе. Компиляторы избавили человека от необходимости составлять вручную машинные коды, а метапрограммы стали генерировать несложные и тривиальные компоненты софта. Когда-то разработчики восхищались средой разработки, которая подсказывает программисту названия функций, а теперь ИИ успешно подсказывает целые фрагменты кода — но это очень простые фрагменты.
«Идти в айти» всё ещё имеет смысл и будет иметь многие десятилетия, однако будущим программистам стоит заранее обеспечить себе защиту от конкуренции со стороны ИИ. Прежде всего — стараться получить как можно более высокую квалификацию в программировании или занять ключевые позиции в разработке софта (архитектура ПО, менеджмент, и так далее). Или же занять ниши, где нейросети бесполезны из-за неспособности обучиться (новые и малопопулярные области программирования).
Пусть сейчас у программистов нет особых поводов для беспокойства, но ИИ вряд ли будет оставаться таким же «бестолковым» и зависящим от человека, как нынешние нейросети. Символический подход может взять реванш в виде гибридного ИИ, где «неосознанная интуитивность» нейросетей будет дополнена способностью к логическим рассуждениям, как у программ на LISP и Prolog. В таком случае автоматизация программирования вполне способна дойти до такого уровня, что потеснит даже сильнейших разработчиков.
#лонгриды #программирование #ии #нейросети #будущее #it
5 программ для автоматизации чего угодно на компьютере
Продолжаем рассказывать про автоматизацию рутины на компьютере. Вот что было в предыдущих частях:
- В некоторых программах есть возможность записать свои действия, чтобы потом повторять их сколько угодно раз. Такие действия называются скриптами и макросами.
- Это помогает в ежедневных ситуациях: обработать электронную таблицу, отформатировать документы, подготовить файлы и перевести их из одного формата в другой.
- Скрипты делают двумя способами: пишут команды на встроенном языке или делают всё мышкой и клавиатурой, а компьютер это запоминает.
Бывает так, что рутины много, а нужные программы не поддерживают макросы и у них нет своего языка для скриптов. В этом случае используют программы для автоматизации разных действий на компьютере.
В зависимости от возможностей такие программы делятся на автокликеры, программы поиска изображений и скриптовые автоматизаторы.
Автокликеры подойдут, если для выполнения нужных действий достаточно мышки. Работают так: включаете запись и выполняете мышкой всё, что нужно сделать. Программа запоминает координаты кликов и интервалы между ними, а потом имитирует их, как будто это делаете вы. Это самый простой и надёжный вариант, но у него есть большой минус: если поменяется интерфейс или размер окна, то программа об этом не узнает — она будет кликать по старым координатам и может что-то испортить.
Программы с поиском изображений работают иначе: вы делаете скриншот нужной области, вставляете его в программу и на внутреннем языке объясняете, что с этим делать. Например, можно нажать на найденную картинку (если это иконка сохранения), перетащить её в другое место, ввести туда текст и ещё много разного. Это более универсальное решение, чем автокликеры, но надо немного разбираться в программировании.
Автоматизаторы на скриптах. Это самый замороченный, но самый большой по возможностям способ что-то автоматизировать. Automator из macOS — это именно оно. Можно сделать что угодно в пределах того, что умеют приложения через свои API: как угодно стыковать разные приложения, передавать данные из одного в другое, работать с файловой системой и делать много других вещей. Но придётся прямо писать скрипт.
Action(s)
app.jbbres.com/actions/
Платформа: Windows, macOS.
Эту программу сделали 10 лет назад, и для macOS она уже сильно устарела, но в Windows всё отлично работает. Интерфейс создания скриптов может показаться сложным для новичков. Но если вам нужен полный контроль — она поможет.
Если нужна современная версия для macOS, посмотрите на встроенное приложение Automator. Из коробки он умеет не так много, но есть сторонние расширения.
AutoIT
autoitscript.com/site/autoit/
Платформа: Windows.
Если вам понравились возможности предыдущей программы, но вы хотите всё контролировать сами и писать свои скрипты, попробуйте AutoIT. В ней используется свой язык, похожий на Бейсик, но с глубоким погружением в системные команды операционной системы. При желании на ней можно запрограммировать даже имитацию работы за компьютером в течение дня — всё будет выглядеть так, как будто человек сидит перед монитором и что-то делает.
Код скрипта в AutoITSikuli
sikulix.com
Гитхаб оригинального проекта
Платформа: любая, где можно запустить виртуальную машину Java.
Что такое Java и зачем он нужен
Эта система понимает скрипты на Python, Ruby и JavaScript и поддерживает все языки программирования, связанные с Java (Jython, JRuby, Scala, Clojure и остальные).
Программа основана на распознавании изображений. Её можно обучить нужным иконкам, чтобы она нажимала на них в любой последовательности. Как только нужная картинка появляется на экране, программа её найдёт и выполнит указанные действия.
Например, её можно научить играть в «Весёлого фермера», чтобы она сама находила на экране морковку, собирала её, отправляла кур спать и поливала грядки.
Простой скрипт с картинками, который меняет настройки сетевого адаптера в Windows. Скриншот: 3dnews.ruAutoClickExtreme
autoclickextreme.com/ru/
Платформа: Windows.
Программа заточена на имитацию нажатий мыши и клавиатуры и делает это максимально точно. QA-инженеры иногда используют её для тестирования интерфейсов, чтобы не нажимать всё вручную.
Тестирование: зачем тыкать на 1 000 кнопок в секунду
Работает просто: она записывает то, что вы делаете, а потом повторяет. Есть режим обучения, когда программа смотрит за поведением пользователя, а потом выделяет шаблоны повторяющихся действий.
Macro Scheduler
www. mjtnet.com/macro-scheduler.htm
Платформа: Windows.
Самая дорогая программа в подборке, но оно того стоит:
- запись действий мыши и клавиатуры;
- прямая работа с базами данных, сетевыми протоколами и парсерами данных;
- распознавание текста на экране;
- запись макросов для браузеров;
- работа с любыми элементами ОС напрямую и через скриншоты;
- свой скриптовый язык;
- 300 готовых шаблонов автоматизации.
Текст:
Михаил Полянин
Редактор:
Максим Ильяхов
Художник:
Алексей Сухов
Корректор:
Ирина Михеева
Вёрстка:
Кирилл Климентьев
Соцсети:
Виталий Вебер
Четыре шага перед написанием компьютерной программы
Прежде чем приступить к написанию компьютерной программы, сначала выполните четыре важных шага для ее разработки. Поступая таким образом, вы не тратите время на написание компьютерной программы, которая не работает или решает не ту проблему и которую не стоит пытаться спасти впоследствии. Планируя, вы увеличиваете вероятность того, что ваша компьютерная программа действительно работает и выполняет нужную вам задачу.
Следующие четыре шага крайне важны при разработке любой программы:
- Определите проблему: Какую проблему решает ваша программа? Если вы не можете четко указать, что делает ваша программа, вы не будете знать, как ее спроектировать.
- Идентифицируйте пользователя: Кто будет использовать вашу программу?
- Определите целевой компьютер: Какой компьютер нужен людям для запуска вашей программы? Это компьютер с Windows, Macintosh, мейнфрейм, компьютер под управлением Linux, карманный компьютер Palm или Pocket PC или суперкомпьютер?
- Определите свои навыки программирования: Собираетесь ли вы написать все самостоятельно или обратитесь за помощью к другим? Если вы собираетесь попросить других помочь вам, какие части программы они напишут?
Компьютерное программирование: определите проблему
Каждая программа решает проблему. Программа налоговых деклараций решает проблему организации и подачи налогов. Текстовый процессор решает проблему написания, редактирования, форматирования и печати текста. Даже видеоигра решает проблему развлечения людей.
Программа полезна настолько, насколько проблема, которую она решает. Большинство программ упрощают и автоматизируют существующую проблему, например, программа управления денежными средствами, которая упрощает организацию и оплату счетов вместо использования бумаги и арифмометра. Цель любой программы — сделать конкретную задачу быстрее, проще и удобнее. Единственный способ достичь этой цели — определить, какую задачу ваша программа пытается решить в первую очередь.
Идентифицировать пользователей компьютерной программы
Если вы единственный человек, который будет использовать вашу программу, вы можете сделать так, чтобы ваша программа выглядела и действовала так, как вы хотите, до тех пор, пока вы знаете, как заставить ее работать. Но если вы планируете отдать или продать свою программу другим, вам необходимо знать, кто будет ее использовать.
Очень важно знать типичного пользователя вашей программы. Если пользователям по какой-либо причине не нравится ваша программа, вряд ли они будут ее использовать. Часто не имеет значения, работает ли программа на самом деле.
Разрабатывая свою программу с мыслью о пользователе, вы увеличиваете вероятность того, что люди воспользуются вашей программой и (вы надеетесь) купят себе копию.
Даже если вы напишете программу, которая отлично работает, пользователи все равно могут игнорировать ее, потому что им не нравится, как она выглядит, они не понимают, как отдавать ей команды, она работает не так, как старая программа которые они используют в настоящее время, цвета им не подходят и так далее. Цель состоит в том, чтобы заставить вашу программу удовлетворять потребности ваших пользователей, какими бы странными, причудливыми или нелогичными они ни казались (потребности, а не пользователи).
Определите целевой компьютер для вашей компьютерной программы
После того, как вы идентифицируете пользователя, вам необходимо знать, на каком типе компьютера пользователь собирается запускать программу. Тип компьютера, на котором работает ваша программа, может определить, какие компьютерные языки вы можете использовать, аппаратное обеспечение, которое ваша программа может найти, и даже максимальный размер вашей программы.
Если вы пишете программу для работы, например, на Macintosh, ваша программа может использовать звук, цветную графику, большой жесткий диск и много памяти. Однако вам может потребоваться радикально переписать ту же самую программу, чтобы запустить ее на смартфоне с его ограниченными звуковыми возможностями, гораздо более простой цветной графикой и ограниченным объемом памяти и места для хранения.
Если вы можете скопировать и запустить свою программу на другом компьютере с небольшими изменениями или без них, ваша программа считается переносимой. Язык программирования, который вы используете для написания программы, может определять ее переносимость. Вот почему так много людей используют C/C++ — программы на C и C++, как правило, более переносимы, чем на других языках программирования.
Определите свой навык программирования
При разработке любой программы учитывайте свои навыки программирования. У вас может возникнуть отличная идея для программы, но если вы новичок с небольшим опытом, написание вашей программы может занять много времени — если вы сначала не сдадитесь из-за разочарования.
Ваши навыки и опыт программирования также определяют выбор языка программирования. Опытные программисты могут не задумываться о написании целых программ на C или C++. Но новичкам, возможно, придется потратить много времени на изучение C и C++, прежде чем писать свои программы, или они могут выбрать более простой язык программирования, такой как BASIC.
Некоторые новички тратят время на изучение сложных языков, таких как C/C++, а затем берутся за написание своей программы. Другие используют более простой подход и выбирают более простой язык, такой как Visual Basic, чтобы они могли сразу же создавать (и продавать) свои программы. Не бойтесь работать с тяжелыми языками, такими как C/C++, но не бойтесь использовать и более простые языки, такие как Visual Basic. Важная цель состоит в том, чтобы закончить вашу программу, чтобы вы могли начать использовать ее и (возможно) начать продавать ее другим.
Многие программисты создают свои программы, используя такой язык, как Visual Basic, а затем нанимают более опытных программистов для переписывания своих программ на более сложном языке, таком как C/C++, который может сделать программу быстрее и эффективнее.
Процесс программирования
Все программирование предполагает создание чего-то, что решает проблему. Проблемы могут варьироваться от чего-то крупного научного или национального важности, вплоть до чего-то тривиального, например, избавления от личных скука! В этом разделе описан один из подходов к решению таких проблем — думайте об этом как о примерном руководстве к тому, что вы должны делать при входе страна программирования. В общих чертах это:
Из них только третий шаг обычно называют «программированием», но, как вы увидите позже, это, вероятно, наименее важный этап процесса. Определение проблемыНа самом деле, этот этап действительно должен называться , идентифицируя решение , потому что на самом деле вы пытаетесь связать именно то, что это то, что вы пытаетесь достичь. Существует два этапа поиска решения:
ТребованияПервый шаг — внимательно изучить проблему, чтобы попытаться определить, что можно считать решением. Единственная проблема может иметь много разных решений, но все они будут иметь что-то в общий. Итак, здесь вы пытаетесь выяснить, что именно программа будет требовал сделать.
СпецификацияВторой шаг — просмотреть список требований и чтобы точно решить, что должно делать ваше решение для их выполнения. В качестве мы упоминали выше, обычно существует множество различных решений для одна проблема; здесь ваша цель состоит в том, чтобы решить, какой из этих решения, которые вы хотите. Таким образом, вы пытаетесь указать , в довольно точным образом, именно то, что будет делать ваша окончательная программа.
К тому времени, как вы разработали спецификацию, вы должны иметь очень четкое представление о том, что будет делать ваша окончательная программа: ваша цель. Разработка решенияПосле того, как вы определили, что необходимо для решения вашей проблемы, и указали, какую форму примет ваше решение, следующим шагом будет работать только как вы собираетесь превратить эту спецификацию в рабочая программа. Обычно это самая сложная задача! Как упоминалось ранее, программа — это просто список шагов, описывающих компьютеру, что он должен делать. Дизайн — это просто более высокий уровень описание этих шагов. По сути, это программа, написанная так, как если бы компьютер был человеком. Таким образом, это не должно полностью заклинание на каждом шагу — потому что люди уже умеют делать много вещей и обладают большим здравым смыслом, а это означает, что они могут работать с простыми выходит для себя. Это также не должно быть написано в любом специальный язык программирования — английский подойдет (хотя люди часто используйте специальные обозначения, такие как псевдокод или блок-схемы, для большего удобства. сложные разделы). С другой стороны, программист должен уметь взять дизайн и написать программу по нему, не задумываясь слишком сложно. Это немного похоже на чертеж архитектора: он содержит все важные структуры, не показывая каждый бит кирпича и раствора. Разработка проекта для выполнения конкретной спецификации может быть сложно по нескольким причинам:
Мы вернемся к этим задачам немного позже.
Когда ваш дизайн будет готов, у вас должно быть очень четкое представление того, как компьютер будет соответствовать вашей спецификации, которая в свою очередь отвечает вашим требованиям, что, в свою очередь, должно решить ваши оригинальная проблема. ПрограммаПрограммирование — это задача описания вашего дизайна для компьютер: научить его вашему способу решения проблемы. Обычно написание программы состоит из трех этапов:
КодКодирование — это процесс перевода проекта в реальность. программа, написанная на том или ином языке программирования. Это шаг, на котором вам действительно нужно сесть за компьютер и тип! Программирование немного похоже на написание эссе (но не позволяйте что тебя оттолкнуло). В большинстве случаев вы пишете свою программу, используя что-то вроде текстового процессора. И, как сочинения, есть определенные вещи, которые вам всегда нужно включать в свой программы (что-то вроде заголовков, страниц содержания, введения, ссылки и др.). Но мы вернемся к ним позже. Когда вы закончите перевод вашего дизайна в программу (обычно заполняя множество деталей в процессе) вам нужно представить его на компьютер, чтобы увидеть, что он делает из него.
КомпиляцияКомпиляция — это фактически процесс превращения программы написано на каком-то языке программирования в инструкции состоит из 0 и 1, которым компьютер может следовать. Это необходимо, потому что чип, который делает ваш компьютер work понимает только двоичный машинный код — то, что большинству людей было бы очень трудно использовать его, поскольку выглядит примерно так: 01110110 01101101 10101111 00110000 00010101 Ранние программисты на самом деле писали свои программы на такой стиль — но, к счастью, они скоро научились создавать программы, которые могли бы взять что-то, написанное на более понятным языком и переведи его на эту тарабарщину гук. Эти программы называются компиляторами, и вы можете думать из них просто как переводчики, которые могут читать программы язык, переведите его и выпишите соответствующий автомат код. Однако компиляторы печально известны своей педантичностью. пишите очень правильные программы, они будут жаловаться. Думать о их как самого строгого учителя английского, который выбирает вас на каждую пропущенную запятую, неуместный апостроф и грамматическая ошибка. ОтладкаЗдесь впервые появляется отладка, поскольку как только компилятор просмотрит вашу программу, он, скорее всего, вернусь к вам со списком ошибок длиной с вашу руку. Не волнуйтесь, так как это совершенно нормально — даже большинство опытных программистов допускают грубые ошибки. Отладка — это просто задача просмотра оригинала программа, выявление ошибок, исправление кода и перекомпилировать его. Этот цикл кода -> компиляция -> отладка будет часто повторяться много-много раз, прежде чем компилятор доволен этим. К счастью, компилятор никогда не получает крест во время этого процесса — программист с другой стороны… Здесь также следует сказать, что на самом деле это не так. необходимо написать всю программу, прежде чем вы начнете компилировать и отлаживать его. В большинстве случаев лучше написать сначала небольшой фрагмент кода, заставьте его работать, а затем перейти к следующему этапу. Это уменьшает количество кода который необходимо каждый раз отлаживать и обычно создает хорошее чувство «добираться туда» по мере завершения каждого раздела. Наконец, компилятор представит вам программу что компьютер может работать: надеюсь, ваше решение! Решение!Последний шаг в великом процессе программирования — это тестирование вашего творения, чтобы убедиться, что оно делает то, что вы хотели это делать. Этот шаг, к сожалению, необходим, потому что хотя компилятор проверил правильность написания вашей программы, он не может проверить, действительно ли то, что вы написали, решает вашу оригинальная проблема. Это потому, что вполне можно написать предложение на любом языке, идеально сформированном в отношении язык, на котором он написан (синтаксически правильный), но в в то же время быть полнейшей ерундой (семантически неверной). За например, «Штаны-рыбки идут боком». отличное предложение — это получил заглавную букву и точку — но это мало что значит. Точно так же: «Поместите форму для льда в духовку». есть глаголы и существительные и так далее, но это довольно бесполезно, если вы хотите сделать кубики льда. Итак, ваша программа нуждается в тестировании, и это часто изначально сделано неофициально (или, возможно, случайно), запустив его и немного поиграл с ним, чтобы увидеть, работает ли он правильно. После этого также следует проверить более тщательно, подвергая его тщательно разработанному набору тесты, которые подвергают его своим шагам, и проверяют, что он соответствует требования и спецификация — но об этом мы поговорим подробнее позже в курсе. При выявлении ошибок речь идет о надевании Шляпа Шерлока Холмса и попытка выяснить, где в коде ошибка в том. После выявления проблема должна быть устранена изменение кода и перекомпиляция. При этом следует соблюдать осторожность обратите внимание, что это исправление не сломает что-то еще, так что будьте осторожны повторная проверка важна. Этот процесс также известен как отладка. После завершения всех испытаний и отладки вы должны быть уверены, что ваша программа работает в соответствии с вашим требования и вашу спецификацию, и поэтому вы должны, наконец, решение вашей проблемы! Легко, не правда ли?! Сводка
Хотя может показаться, что это требует больших усилий, чтобы построить простую программу, не беспокойтесь, так как через некоторое время она станет второй натурой, а для небольших программ большая часть этапы могут быть сделаны в вашей голове. |