В чем суть программирования
От Древнего Египта к расшифровке генома: что такое программирование на самом деле
Программирование в узком смысле — это написание программ, а в широком — создание инструкций для любой системы, способной их воспринять. Изучаем истоки.
Чтобы обучиться программированию компьютера, человек должен сначала понять основные принципы составления инструкций.
Например, вы дали ребенку список продуктов для покупки в магазине. Но поставили условие: если молока 1,5% нет, то купить 2,5%. Это оператор ветвления (условный оператор), обеспечивающий выполнение определенной команды только при условии истинности некоторого логического выражения. В данном случае истинным является выражение «молока 1,5% нет» — поэтому мозг «запрограммированного» ребенка переходит к выполнению инструкции «купить 2,5%».
Далее: на все покупки вы дали 200 рублей и сказали, что если денег не хватает, то купить только самое важное. Налицо более сложный алгоритм. Здесь присутствует цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций.
Ребенок должен сложить сумму всех покупок и сравнить ее с условием «меньше или равно 200 рублей». Если условие не соблюдается, то срабатывает оператор ветвления, в этом дереве инструкций выполняется команда «исключить наименее важный продукт из списка» — и цикл запускается заново. Примерно так же работают компьютерные программы.
Сколько существует программирование
Программирование окружающих людей существует столько же, сколько существует человеческое общество, ведь человек — сугубо социальное животное.
По определению программирование — это передача команд. Если кто-то получает власть над окружающими, то он раздает команды (инструкции) для исполнения. В более сложных системах список разрешенных или запрещенных инструкций, а также порядок их выполнения (то есть алгоритмы) объединяют в большой документ. Он может называться устав, кодекс, свод законов, конституция, библия и т.д.
Имена программистов — авторов инструкций и алгоритмов — почитают в веках, если история их сохранила.
Иногда случается, что люди не понимают глубинного смысла алгоритмов — и просто слепо подчиняются инструкциям, как поклонники карго-культа из Меланезии строили взлетно-посадочные полосы в лесу, надеясь вызвать самолет с грузом (карго).
Люди издревле поняли, что знание алгоритмов дает власть над окружающими. Чтобы добыть это знание, нужно созерцать окружающий мир — и отмечать закономерности, которые вытекают из фундаментальных законов, прописанных в коде программы. Например, жрецы Вавилона и Древнего Египта столетиями вели наблюдения за небесными телами и сохраняли записи. Они вычислили цикл Сароса (18 лет11 дней), когда взаимное положение Солнца и Луны почти точно повторяется на небе. Зная условия цикла, жрецы могли предсказывать положение системы на годы вперед — и свои предсказания они преподносили в виде пророчеств, которые с благоговением воспринимал народ.
Программирование в природе
Если долго наблюдать за окружающим миром, то становится понятно: вся окружающая действительность подчиняется инструкциям с прописанными фундаментальными постоянными. В программировании это — выполнение кода с жестко установленными константами. Мы называем эти алгоритмы законами природы, а константы — фундаментальными физическими постоянными.
Сейчас науке известно 19 констант из «природного кода»:
Пространство-время нашей Вселенной строго подчиняется прописанным алгоритмам и константам. То же относится к биологической жизни. Как показывает сегодня наука, код для управления любым живым организмом указан в его генетической программе — геноме. Большинство этих программ, в том числе геном человека, составлены из молекул ДНК, в которых информация и инструкции записываются цифровым кодом из четырех оснований ДНК (T, C, G, A). Исходный код человека расшифрован и опубликован в открытом доступе.
С точки зрения программиста, ДНК похожа скорее на байт-код для виртуальной машины под названием «ядро клетки». Полная программа человека составляет 3,1 млрд пар оснований. Это примерно3 гигабайта, которые можно сократить до750 мегабайт, если выбросить «мусор» (старые копии генов, результаты неудачных экспериментов и т.д.). Копии программы хранятся в каждой клетке. Поэтому каждая клетка организма теоретически может превратиться в любую другую клетку организма, если получит такую команду (плюрипотентность).
Хотя полноценные изменения ДНК в организме крайне редко происходят в пределах одного поколения, существенные поправки вносятся путем активации или деактивации частей нашего генома без изменения самого кода.
Интересно, что в коде человеческого генома есть даже комментарии (интроны), которые располагаются между участками функционального кода (экзонами). Промежуток ДНК с интронами и экзонами выглядит примерно так:
Смысл комментариев в коде генома пока не до конца понятен. Высказывается предположение, что это аналог MFM-кодирования, чтобы обеспечить надежное хранение данных на цифровом накопителе.
В последнее время специалисты по биоинформатике и синтетической биологии постепенно осваивают инструкции экзонов — и уже могут синтезировать простейшие организмы с запрограммированными свойствами. Изумительная гармония алгоритмов, программ и универсальных констант в окружающем мире навела ученых на мысль о том, что наша Вселенная является результатом компьютерной симуляции. Проводятся эксперименты, призванные доказать или опровергнуть эту теорию.
американский инженер и предприниматель, который организует колонизацию Марса
Вероятность того, что мы не живем в компьютерной симуляции, равна одному на миллиарды.
Косвенным свидетельством этого является бурный прогресс виртуальной и дополненной реальности. Если экстраполировать такой прогресс на миллионы лет — вывод напрашивается сам собой: через миллион лет игры будут неотличимы от реальности, а значит, вероятность того, что мы живем в одном из таких искусственных миров, созданном более развитой цивилизацией, очень высока, считает Илон Маск.
Для чего нужно программирование
Мы убедились, что вся окружающая реальность описывается четкими алгоритмами и программами. Согласно научному консенсусу, большинство этих программ в живых организмах создано в результате эволюции. Но это вовсе не значит, что мы — люди — не можем создавать копии этих программ или абсолютно новые программы, которых раньше не существовало в природе. Конечно можем.
Где применяется программирование? С каждым годом оно охватывает всё большие области человеческой деятельности. Человек осваивает программирование автоматов и машин, которые по инструкции делают все, что нам нужно. Ученые научились программировать живые организмы, вирусы. Мы программируем растения, чтобы увеличить урожайность и защитить их от вредителей. Близки к успеху опыты по изменению генома человеческих эмбрионов, чтобы вносить улучшения в людей на стадии зародыша (лечить наследственные заболевания, выбирать мальчиков вместо девочек и т.д.).
Биоинформатика вносит свой вклад в программирование систем искусственного интеллекта (ИИ), которые распознают человеческую речь, понимают смысл слов, определяют объекты на фотографиях и видео и т.д. Из этих маленьких «кирпичиков» в будущем планируется создать «сильный» ИИ. Если он сможет самостоятельно эволюционировать, обучаясь на собранной информации, то бесконечное самообучение может привести человечество к технологической сингулярности, настоящему апогею компьютерного программирования. В этом случае созданная программа будет самосовершенствоваться настолько быстро, что станет недоступна нашему пониманию.
Технологическая сингулярность соответствует третьему закону Кларка, который можно наблюдать повсюду и в наши дни: «Любая достаточно развитая технология неотличима от магии».
Чем интересно программирование
Освоив программирование, человек получает высокооплачиваемую работу. Но, что еще важнее, меняется его взгляд на мир. Человеку становятся лучше понятны скрытые законы и алгоритмы, лежащие в основе окружающих явлений. Более того, он сам может писать такие алгоритмы.
Важно!
Программист — самая перспективная профессия XXI века, которая переживет любые кризисы и любой уровень безработицы.
Компьютеры заменяют людей на рабочих местах, промышленные роботы становятся массовыми. А разработчиков нужно всё больше, чтобы создавать новый софт и программировать роботов. Требуются инженеры и техники, чтобы обслуживать компьютерную технику. Такая необходимость останется по крайней мере до момента технологической сингулярности, когда ИИ сможет обслуживать и улучшать сам себя.
Программа «Веб-разработчик» — практический годовой курс для тех, кто хочет стать профессиональным программистом сайтов, запустить свой интернет-проект и получить первые заказы на разработку.
Пишет про разработку в Skillbox. Работал главным редактором сайта «Хабрахабр», ведет корпоративные блоги.
Программирование — это сложно
Большинство новичков в программировании рано или поздно сталкивается с такой чарующей фразой: «Программирование — это просто, ему может научиться любой». Эта фраза сопровождается угрожающим сообщением о том, что людям, занимающимся гейткипингом, надо прекратить. Этой статьёй я хочу сказать, что это неправда. Программирование — это сложно, оно не для каждого, и хотя сейчас им может заняться каждый, большинству определённо не стоит писать код.
Программирование легкодоступно
Когда глупые люди говорят, что программировать просто, что им может заниматься каждый, они на самом деле имеют ввиду доступность сферы программирования. Если у вас есть простейшее средство доступа к Интернету, то достаточно легко получить доступ к ресурсам для изучения. Ни одна из наук не доступна настолько, как компьютерная наука, и большинство работ по ней выложено в открытый доступ — компьютерная наука процветает в Интернете, и хотя отдельные её ветви закрыты, большинство контента доступно свободно и процветает благодаря этой доступности. Вы можете скачивать компиляторы, редакторы, IDE, даже получить доступ к документации, обсуждать с другими людьми свои проблемы, и так далее. Это огромное сообщество, уровень гостеприимности и открытости которого несравним с любой другой наукой в истории человечества.
И в самом деле, вам не нужно знать много, некоторые программы можно написать буквально через полчаса знакомства с программированием. Программирование доступно настолько, насколько не доступна ни одна другая наука.
Но легкодоступность не означает простоту изучения. Если я могу смешать три ингредиента и сделать омлет, то это не делает меня шеф-поваром. Я могу готовить несколько блюд, но никогда не скажу, что готовка — это просто. Приготовление пищи — это сложная задача, требующая терпения и внимания к деталям, много знаний и опыта.
Программирование — это любопытное сочетание творчества и точных наук; но никто и никогда не говорил, что творчество — это «просто». Некоторые вещи легко осваиваются некоторыми людьми, другие сложны для понимания.
Некоторые аспекты программирования просты
Да, в этом можно не сомневаться: отдельные аспекты просты. Существуют вещи, которые вы можете сделать, в конечном итоге получив, например, скелет приложения для блога. Любой (под опытным руководством) может сделать профессионально выглядящую веб-страницу за первые часы изучения HTML. Можно легко задать вопрос и найти решение на StackOverflow, можно запросто скопипастить решение на свои веб-страницы.
Существует множество туториалов для начинающих, даже для абсолютных новичков, и некоторые из них созданы новичками. Программирование — в высшей степени гостеприимная к новичкам область.
Однако для разных людей простыми бывают разные вещи. То, что мне кажется невероятно сложным, другим кажется невероятно простым. То, что кажется простым, становится проблемой для других. Нет консенсуса о том, что для кого легко, но для всех есть простые вещи, зависящие от того, по какому пути обучения они шли. Тем не менее…
Большинство аспектов программирования сложно
Такова правда: если человек начинает делать нечто более сложное, чем простая веб-страница или простая демо-программа, всё становится сложным, и чем больше вещей соединяется воедино, тем более сложной и утомительной становится задача. И именно этого вам не скажет лжец, уверяющий, что «программирование — это просто». Решать программные головоломки сложно, особенно, когда они не задумывались как головоломки.
На самом деле, при правильном подходе большинство аспектов программирования сложно, даже если поначалу и кажется простым. Причина в том, что у вас есть сложные фрагменты, которые нужно объединить и заставить их работать. И сложнее всего, когда человеку приходится писать эти сложные фрагменты с нуля. Всё кажется простым, потому что мы видим людей с пяти-, десяти- и двадцатилетним опытом, делающих вещи, которые просты для них, потому что в процессе их создания они совершили все возможные мыслительные ошибки, обеспечив таким образом себе защиту от этих ловушек.
Самозванство и мошенническое позитивное мышление
Как часто вы слышали о синдроме самозванца? Если вы слушаете выступление на тему «программирование — это просто», то, вероятно, слышали о нём, и часто на эти темы говорят одни и те же люди. Синдром самозванца — это когда человек чувствует себя недостаточно компетентным для работы, за которую ему платят, и ощущает, что он не заслужил свой успех; но слышали ли вы о случаях, когда люди на самом деле сталкивались с кажущимся непродуктивным топтанием на месте, при котором им приходится исправлять или совершенствовать результаты собственной работы, или когда они не могут быстро найти ответ на Stack Overflow. Чаще всего я слышу о самозванцах в программировании, когда их терпение лопается, когда они больше не могут соответствовать нереалистичным стандартам, которые они создали для себя, когда они не могут двигаться вперёд со скоростью, к которой привыкли. (У меня есть собственные претензии к синдрому самозванца, но об этом в другой раз.)
Угар позитивности, мифологии «всё просто» не говорит вам ни слова о тех моментах, когда всё становится невероятно сложным, когда требуется прилежная работа и постоянные усилия. Когда вам не могут дать ответа другие люди, то остаётесь только вы и код других людей или, что хуже всего, ваш код. В такие моменты иногда приходится переосмысливать целые архитектуры, потому что некоторые аспекты не прошли проверку реальностью.
Я сказал, что сфера программирования плодородна для новичков, и это правда. Но то, что плодородно для злаков, плодородно и для сорняков, и для них особенно. Нам нужно говорить о таких людях, пользующихся преимуществами плодородной почвы. А поскольку в этой сфере множество новичков, то там есть множество людей, пользующихся ими.
Это происходит множеством различных способов; некоторые из таких людей даже не осознают, что делают это, они просто инстинктивные деляги, продающие свои навыки по слишком большой цене. Обычно они выглядят так: двухлетний опыт работы в сфере разработки ПО, пишут книги и раздают советы, иногда за приличную цену. Мы встречаем их на конференциях, их рекламируют в статьях или в других медиа, иногда они разыгрывают карту «культурного разнообразия» (diversity), иногда — карту успешного новичка, продвигая себя и пользуясь доверчивостью толп начинающих.
И чтобы создавать ложный имидж в этой сфере, даже не нужно быть абсолютным лжецом. Достаточно играть с чувствами людей. Например, говорить им нечто ошибочное, что люди хотят слышать. Нужно подобрать ключевые слова, которые будут льстить большинству аудитории; «программирование» — это одно из них, потому что программирование — крайне размытое понятие, а получить звание «программист» желают многие, так же, как и звание «сениор», к которому стремятся люди, мечтающие стать сениорами в свои двадцать с небольшим лет. Нужно найти ярлык, лестный вашей аудитории, и применить его к ней. Именно так мы получаем лозунг «программирование — это просто» (это не так), или «HTML — это язык программирования» (это не так), или «программирование — это мастерское пользование поиском в Google/StackOverflow».
Чтобы подчеркнуть своё утверждение, затем вы демонстрируете врага. «Не позволяйте никому говорить, что это неправда» — простой, но эффективный способ внушить аудитории образ мышления «вы против враждебного мира». Неплохо также использовать словечко «гейткиперы», ведь рассуждения о привилегиях и людях, охраняющих их от аудитории, привлекательны. Они не дают вам подняться, они несправедливы, они лгут о трудностях, они заставляют вас заниматься сложной, скучной работой. Такая методика применима не только к программированию, это простая техника манипуляции толпой — если есть враги, то это простой способ сплотить аудиторию против них. Но какой бы ни была эта методика, основная задача манипулятора — размытость содержимого сообщения, чтобы было сложно его опровергнуть.
Давайте обсудим мои примеры. На объяснение лозунга «программирование — это просто» мне уже понадобилось 1385 слов, а статья ещё не закончена. Объяснить «HTML — это язык программирования» в чём-то сложнее из-за нечёткого значения термина «программирование». Строго говоря, HTML не является реальным программированием, это язык представления разметки. Он является неполным описанием того, как выглядит и что содержит веб-страница. HTML — обязательный для любого связанного с вебом проекта инструмент, но он не используется изолированно, программирование происходит не на нём. Но если кто-то говорит вам, что HTML — это язык программирования, то обычно защищает своё заявление тем, что гейткиперы ограничивают значение слова «программирование». При этом говорящие это редко заинтересованы в изучении истинного значения собственных слов. Как я говорил, «программист» — это звание, и подобно другим почётным званиям, оно заставляет людей, особенно некомпетентных, защищать его.
Иллюзия «я могу сделать то же, что и ты»
С заявлением «программирование — это мастерское пользование поиском в Google/StackOverflow» всё сложнее. Потому что это и правда, и ложь одновременно. Мастерское владение поиском в вебе — очень важный навык современного разработчика. Я учился в мире, где этого ещё не было, где не существовало Google, где человеку нужно было изучать документацию и иногда читать сотни страниц, чтобы понять, как всё работает. И это если документация была; в противном случае приходилось только пробовать, терпеть неудачу и пробовать снова. Однако сегодня пробовать не нужно, существуют готовые тулкиты, библиотеки или языки программирования (и даже их коммерческие версии), чётко заточенные на поиск ответа. Документация теперь предназначается не для чтения пользователями, а для индексации поисковыми движками и для того, чтобы люди работали с ней при помощи поисковых движков. Однако больше всего современные инструменты полагаются на сайт ответов Stack Overflow.
На самом деле, зависимость людей от Stack Overflow — это, вероятно, самое пугающее, что произошло с сообществом программистов за последние 10 лет. Stack Overflow — это мощный костыль, мешающий вам двигаться самостоятельно, потому что слишком легко искать ответы на нём. А когда люди перестают мыслить самостоятельно, то начинают писать неразумные вещи.
Если вы, как новичок, смотрите, что делают опытные разработчики, то это выглядит простым. Кажется, то, что делают они, может сделать каждый. Это выглядит совершенно посредственно. Существует миф о суперпрограммистах, делающих всё по-своему. Голливуд представляет их как людей, вводящих код со скоростью света, потому что единственный способ продемонстрировать высокий навык персонажа в своём деле — показать, что он справляется с работой быстрее, чем кто-либо другой (Голливуд показал бы человека, лучше всего отсчитывающего десять секунд, как того, кто справляется за пять). Смысл в том, что это выглядит просто, но на самом деле это не так. Потому что опыту новичка не хватает кругозора, сосредоточенности на действительно важном. Новичку научиться считать до десяти мешает только незнание синтаксиса цикла, для опытного разработчика синтаксис — это то, что замедляет его реализацию выполнения операций с коллекцией отфильтрованных данных.
Утверждение «программирование — это просто» не даёт людям развиваться
Этот пост возник благодаря представленному ниже твиту (и этой статье на румынском, но я остановлюсь на англоязычном твите.
— Когда я говорю кому-то, что я программист, то меня сразу начинают считать суперумной. Ребята, можем ли мы как-то вместе попробовать объяснить людям, что кодить не так сложно. В первую очередь, это в буквальном смысле гугление и устранение сделанных нами ошибок. Писать код может каждый.
— Я понимаю задачу этого поста и знаю, что он был написан не из злого умысла, однако учиться кодить сложно и это утверждение «писать код может каждый»/«кодинг — это не так уж сложно» заставляло меня чувствовать себя тупой, когда я была новичком.
Люди чувствуют себя глупыми, когда им приходится разбираться с собственным творением и пытаться его исправить, заставить работать на сценариях реального мира, которые они не всегда предусматривают, когда впервые пишут код. Позитивность не поможет тебе, когда помощь нужна на самом деле. Единственное, что ты можешь использовать — свою смелость, но что делать с необоснованной смелостью? Как быстро положительный настрой и необоснованные запросы падут перед мрачными реалиями работы программистом?
Автор первого твита сказала что-то в духе «люди считают меня умной, потому что я программист» и «главное в гуглении и исправлении своих ошибок». Но на самом деле программирование не об этом, и такой преувеличенный, ограниченный взгляд говорит мне, что её опыт в разработке ПО достаточно мал. И знаете, что пугает? Она работает над сайтом под названием «thecodinginterview.com», то есть является популярным источником советов для начинающих. И я даже не хочу начинать тему того, насколько аморально это мошенничество с «coding interview».
Позитивное мышление безотказно, потому что позитивность никогда не подвергают проверкам; и она полностью пропадает, когда ситуация действительно становится серьёзной. Все ошибки — ваша вина, потому что «кодить может каждый» и «кодинг не так сложен». Когда ты вынужден столкнуться со своими ошибками, ты остаёшься в одиночестве, потому что никакая чушь о позитивном мышлении не может их устранить.
Установка «программирование — это сложно» не должна быть пугающей
Кое-кто утверждает, что если врать новичкам о том, насколько на самом деле сложно программирование, то это их отпугнёт. Не уверен, что людей когда-нибудь останавливал тот факт, что выбранное ими занятие сложно. В конце концов, бОльшая часть нашей поп-культуры посвящена героям, выполняющим сложные задачи. Мне кажется, что именно эта культура изнежила мозги людей, считающих, что если результат не будет мгновенным, то он не стоит усилий. Но когда я начинал программировать, никто не говорил мне, что программировать легко. Я ожидал, что оно будет сложным.
Я знаю, что у многих есть одержимость «достигаторством», они хотят овладеть программированием, стать сениором в 22 года. Я удержался от преследования столь глупой затеи. Я знал, что программирование сложно и что достижение моей цели может быть невозможным. В каком-то смысле, так и есть: я изучал программирование, чтобы уметь писать собственные игры, и спустя более полувека я так и не создал ни одной. Но это дало мне чёткое понимание масштаба моего дела.
Я говорю это не для того, чтобы демотивировать начинающих. Статья всего лишь должна подготовить их к тому, что ждёт их впереди. Так что если вы хотите сказать что-то новичку, то скажите следующее: «В программировании есть простые и сложные вещи. Если ты будешь достаточно терпелив, то со временем сложные вещи станут интересными, а простые станут сложнее».
Но не говорите ему, что программирование — это просто. Это не так.
На правах рекламы
Заказать у нас сервер очень просто! Воплощайте любые идеи и проекты с помощью наших VDS с мгновенной активацией на Linux или Windows. Сервер готов к работе через минуту после оплаты!