Хочу быть программистом!
И я хотел. А зачем? Думаю, что вы, так же как и я, до печального момента получения диплома, свидетельствующего о присвоении мне квалификации по вожделенной специальности считали, что программист - это сверхчеловек, который численными методами и алгоритмическими мыслеобразами может повелевать Вселенной? Отчасти, так оно и есть. Например, мне не составляет труда спаять, отладить и запустить в космос цифровую скороварку, но объяснить человеку, что он зря повесился в туалете я уже не смогу. Вот они издержки. Но пока вы о них не знаете, и полны тех же светлых мыслей и благих идей, что и я в стародавнии времена, постараюсь циклом статей на тему "Хочу быть программистом" немного приокрыть дверь, за которой находятся алгоритмы, как ветвлённые, так и циклические, системные и библиотечные вызовы, страшные и не очень переменные, многомерные массивы и нейронные сети, приближающие нас к заведомо пройгрышной войне с машинами, обладающими искуственным интеллектом!
Я не буду писать заунывные howto и справочники по синтаксису Turbo Delphi, а постараюсь изложить суть, смысл и идеологию программизма... простите, программирования в форме житейских историй и поучительных рассказов, из которых, как правило, следует какая-либо мораль. Думаю, что первый вопрос, который может возникнуть у вас - это извечное "с чего начать?". Начать просто. Отправляетесь на радиорынок, покупаете за смешную сумму 166-ой пентиум на базе подобной древности железа, втыкаете туда чистый DOS, Windows 3.11, подходящий дистрибутив ОС Linux или что вам больше нравится, инсталлируете среду (!) в которой будете начинать, развивать и совершенствоваться и вы - без пяти минут повелитель Вселенной. Кстати, настоятельно рекомендую запастись средами для разработки программного обеспечения на все случаи жизни, ибо даже я сам не берусь с точностью утверждать, в какую степь меня понесёт завтра, и вместо ожидаемого примера программы "Hello world!" на всеми любимом Q-Basic'е вы не получите графопостоитель на PHP.
А теперь, собственно и "Hello world!". Графопостроитель на PHP предполагает... Думаете, издеваюсь? Вобщем-то так оно и есть. Забудем об этом =) Как вы знаете, любой программист начинал свою деятельность именно с написания этой величайшей программы на всех существующих языках. Не будем отходить от классики, но с той лишь разницей, что компьютер в общем и среда разработки в частности нам не потребуются. А потребуется нам понедельник, будильник, заведённый на 8:30, открытое окно и голосовые связки. Спрашиваете, что с этим джентельменским набором делать? Отвечаю: в понедельник... Этот день наиболее располагает к свершениям, потому что, во-первых, он самый тяжелый, а если вы сделаете что-то в тяжёлый день, то об успехи в остальные дни вы можете не беспокоиться, а, во-вторых, всякая новая жизнь начинается именно с понедельника, и ваша жизнь как жизнь программиста - не исключение. Итак, в понедельник проснувшись в 8:30 (для этого нам и нужен будильник, заведённый на вышеозначенное время) подойдите к открытом окну и, напрягши голосовые связки в полную силу выкрикните "Hello, world!", увернитесь, если потребуется от полетевших в вас с улици предметов и, с этого момента, можете считать себя полноправным членом дружной программистской семьи. Отныне вы можете в полной мере расчитывать на помощь коллег, опыт, накопленный за долгие коды кричания в окно сей сакраментальной фразы, а двоичные коды сами выстроятся по возрастанию, как только вы сядете за клавиатуру и чуткими пальцами начнёте настукивать различные многомудрые комбинации циклов, ветвлений и безусловных переходов. Польза от "Hello world" очевидна. Теперь вы - программист!
Вы скажете: "Неужели всё так просто?!". Да, просто! Ну, во всяком случае проще чем вы думали, когда только решили стать программистом. Теперь вы им стали, и перед вами открываются широчайшие возможности. Вы можете всё или почти всё! Вы - программист! Как? Вы не умеете программировать? Не важно, многим и этого не требуется, но мы с вами будет качественными программистами, поэтому мы должны научиться. С чего начать учиться? С основы основ. С алгоритмов. Если вы считали мою статью о сборке роботизированного пылесоса своими руками, вы обратили внимание на страшное, непонятное и заковыристое слово "алгоритм". На самом деле - не так страшен чёрт. Алгоритм - это упорядоченная последовательность действий, направленная на получение конечного результата. И всё! Простой пример: вам нужно разбить окно соседу, который мешает вам стуком по батарее и вызовами милиционеров слушать группу Pantera в три часа ночи. Это - конечная цель. Что же вы сделаете для того, чтобы претворить её в жизнь? Первое: вы выйдите на улицу. Второе: вы вычислите, какое именно окно принадлежит вашему соседу. Третье: вы найдёте кирпич. Четвёртое: вы кинете кирпич в заранее вычисленное окно. Пятое: окно разобьётся. Вот вам и четкая последовательность действий. То есть - алгоритм. И если вы пройдёте по этому алгоритму чётко и без ошибок, ваш сосед либо замерзнет зимой, либо будет сам вас просить поставить что-нибудь потяжелее в три часа ночи, лишь бы его окна впредь оставались целыми. Понятно? Едем дальше!
Алгоритмы, как и девушки, бывают разными, но не чёрными-белыми-красными, а линейными, ветвлёнными или циклическими. Страшно? Я тоже с трудом представляю себе ветвлённую девушку. Хотя, циклических видел... Вобщем, не бойтесь - профессиональный борец с людскими фобиями поможет вам и на этот раз. Не будем распыляться в повествовании и возьмём в качестве примера тот же самый алгоритм разбиения соседского окна. Абзацем выше мы увидели, что выполнив упорядоченную последовательность из четырёх действий, мы будем наслаждаться грохотом сабвуфера. И добились мы этого без всяких изысков и наворотов, а просто вышли на улицу, нашли окно, нашли кирпич, кинули кирпич в окно. Вот вам и линейный алгоритм. Обратите внимание, что перед тем как искать окно и кирпич, надо выйти на улицу, а перед тем как кинуть кирпич в окно, надо найти и окно и кирпич. Это называется упорядоченностью действий. В любом другом порядке, мы не достигли бы вожделенного результат, или достигли бы, но результат оказался бы иным. Алгоритм - это УПОРЯДОЧЕННАЯ последовательность действий.
Усложняем задачу. Наш линейный способ хорош, только когда вся улица усеяна кирпичами, и мы точно знает, что у нас будет сей предмет для последующего его применения. Но, представьте, что выходя на улицу мы не уверены, что найдёт орудие разбиение окна, и нам придётся уйти домой. Тогда алгоритм наших действий становится следующим. Выходим на улицу, смотрим, есть ли на улице кирпич. Если кирпич есть, то берём его, вычисляем окно соседа, и кидаем в него крипич. Если кирпича нет - уходим домой не солоно хлебавши. Вот вам и ветвлённый алгоритм, т.е. в зависимости от выполнения или невыполнения какого-либо условия, мы совершаем разные действия.
Примечание: обратили ли вы внимание, что мы сначала смотрим, есть ли на улице кирпич, и, если находим таковой, то вычисляем окно соседа. Можно ли сначала вычислить окно соседа, а потом уж проверять улицу на наличие крипичей? Можно. Но в том, случае, если кирпича мы не обнаружим, мы выполним действие, которое могли бы и не делать. А мы все ленивые, кому охота лишний раз напрягаться? Поэтому первый вариант нашего алгоритма является ОПТИМАЛЬНЫМ, то есть мы выполним ровно столько действий сколько нам необходимо. Вообще, оптимизация - это целая наука. Но мы - программсты, а не оптимизаторы, поэтому нас она интересует по стольку, по скольку.
Неизведанным остался только циклический подвид алгоритма. В контексте нашего повествования ситуацию, наиболее благоприятную для реализации циклического алгоритма действий можно представить следующим образом. Улица буквально завалена разным мусором: банки, бутылки, воздушные шары (бу-га-га), мёртвые кошки и собаки, элементы транзисторных процессоров, старые носки и прочее, прочее, прочее... И где-то среди всего этого непотребства находится вожделенный кирпич. Что мы делаем? Сначала, мы выходим на улицу. Смотрим на первый попавшийся предмет. Спрашиваем себя - это кирпич? Нет - убедительно отвечает внутренный голос. Выпинываем этот предмет куда подальше, чтобы не мешал. Опять смотрим на первый попавшийся предмет. Спрашиваем себя - это кирпич? Нет - убедительно отвечает внутренный голос. Выпинываем этот предмет куда подальше, чтобы не мешал. И так далее до... Спрашиваем себя - это кирпич? Да! - ликует внутренный голос. Берём кирпич. Вычисляем окно соседа, кидаем в него крипич и - Pantera Forever! Вот вам и цикл. Точнее кирпич мы искали путём перебора всего мусора, что обитал на улице. Или как говорят, те, кем мы с вами уже стали гаркнув на всю Малую Бронную "Hello, world!" - то есть программистами, кирпич мы ищем в цикле. Ещё одна формулировка... Хотя нет, обойдёмся без неё. А то обвинят в излишнем теоретизме и сожгут на костре. Кстати, если вы не поняли, что такое циклический алгоритм, перечитайте абзац заново. Даже рекомендую вам это сделать: заодно поймёте, что такое ветвлённо-циклический алгоритм =)
Чтож, кажется за время прочтения этого высокоинтеллектуального бреда мы перевыполнили все существующие нормы по становлению программистом. В следующей статье этого цикла клятвенно обещаю рассказать вам, как написать в домашних условиях злой вирус, который ослабит ядерный щит Соединённых штатов, и более того, как продать этот шедевр Российскому Министерству Обороны. Если, конечно, не забуду в понедельник утром оповестить весь World о том, что он Hello.