Что такое программирование? Что на самом деле происходит под капотом? Когда я впервые начал учиться программировать, я использовал встроенный редактор кода на веб-сайте и там видел результаты. Однако я не совсем понимал магию, которая творилась за кулисами.Я начал проводить небольшое исследование, и вот некоторые из терминов, которые я вбивал в поиск: «Что такое компьютерное программирование? Что такое программное обеспечение?» В Google более 600 миллионов результатов поиска по запросу «Что такое компьютерное программирование?» Это похоже на спуск в кроличью нору - сложно и утомительно.
Я хочу составить исчерпывающее введение в то, что такое компьютерное программирование и разработка программного обеспечения для начинающих. Начну с компьютерного программирования, а затем перейду к языкам компьютерного программирования. Затем я расскажу о программном обеспечении и разработке программного обеспечения. Наконец, перейду к текущим тенденциям и будущему компьютерного программирования.
Если вы думаете о переходе в мир программирования или просто хотите научиться программировать, то это даст вам общий обзор без (большого количества!) технического жаргона.
Есть одно замечание: вы можете использовать слова «Разработчик» и «Программист» для обозначения того, кто пишет код.
Что такое компьютерное программирование?

В Википедии определение «компьютерного программирования» таково:
«Компьютерное программирование - это процесс проектирования и создания исполняемой компьютерной программы для достижения определенного результата вычислений».
Но что это значит?
Сам по себе компьютер не умный. Да, они мощные и могут выполнять задачи намного быстрее, чем человек. Но компьютерам нужен человек, который пишет инструкции и говорит им, что делать.
Следовательно, программирование - это процесс написания этих инструкций. Для этого мы используем язык программирования. Эти инструкции переводятся в читаемый формат, понятный компьютеру. Затем инструкции выполняются компьютером.
Программирование - это как заварить чашку чая

Возьмем, к примеру, заваривание чашки чая. Если бы вы дали инструкции, как заварить чашку чая, это выглядело бы следующим образом:
- Вскипятить воду
- Налить горячую воду в чашку с чайным пакетиком
- Дать чаю настояться
- Удалить чайный пакетик
- Добавить молоко и/или сахар (по желанию)
Все просто, правда?
Что мы считаем само собой разумеющимся, так это то, что общение с человеком отличается от общения с компьютером. У человека есть предварительные знания и жизненный опыт - он может знать, где найти чай. Мы предполагаем, что он знает, что молоко хранится в холодильнике.
У людей также есть интуиция. Если вы не можете найти чашку, можно поискать в шкафах. Также существует возможность считывать невербальные сигналы людей, например язык тела.
Когда дело доходит до программирования, нужно быть очень конкретным. Продолжая рассказывать о том, как заварить чашку чая, вы можете написать такие инструкции в псевдокоде:
- Идти на кухню
- Найти чайник
- Открыть крышку чайника
- Наполнить чайник водой
- Включить чайник
- Подождать, пока он закипит до 100 градусов Цельсия
- Найти чашку
И так далее.
Что делать, если инструкций, подобных приведенным выше, недостаточно? Возможно, вам потребуется добавить некоторую логику для учета всех сценариев. Например: 2) Найти чайник. Это электрический чайник или чайник, который ставится на плиту? Вам нужно будет добавить условие, что если это электрический чайник, то выполните xyz. В противном случае выполните xyz для чайника, который ставится на плиту.
Даже если вы думаете, что учли все возможные условия и дали очень конкретные инструкции, есть вещи, которые вы не можете предвидеть. Вы начинаете заваривать чай, и что-то идет не так. Чайник перестает работать после того, как вы его закипятили.
Что произошло? В вашем коде баг! Баг - это ошибка или недоработка в коде, которая может привести к неожиданным результатам. Чтобы исправить код нужно пройти процесс «отладки», на котором обнаружатся проблемы в коде и дальше нужно их исправить.
В этом случае в ваших инструкциях не было долития чайника до 0,8 литра, чтобы закрыть нагревательный элемент. Поэтому чайник выключился в качестве меры безопасности.
Чтобы предотвратить возникновение ошибок после запуска программы, разработчики проводят тестирование и модульное тестирование своих программ. Модульное тестирование - это когда вы пишете тесты для частей вашего кода. Тесты либо проходят, либо проваливаются.
Например, вы пишете функцию, которая складывает два числа: 1 + 1. Затем вы пишете модульный тест, где ожидаемый результат равен 2. Все ответы провалят тест, за исключением ответа 2.
Вы просматриваете свой код, пока все не запустится без каких-либо неожиданных проблем. Поэтому программирование - это детально ориентированный и повторяющийся процесс, в котором вы постоянно улучшаете то, что написали ранее.
Как компьютер понимает код?
То, что большинство программистов пишут как «код», является языком программирования высокого уровня. Это абстрактный дизайн. Абстракция в этом контексте означает, что мы все дальше уходим от машинного кода, а языки программирования становятся ближе к разговорным языкам.
Но компьютер не понимает текстовый код. Его нужно скомпилировать (перевести) в машинный код. Машинный код - это набор инструкций, которые могут быть поняты центральным процессором (ЦП) компьютера. Думайте о ЦП как о мозге компьютера. Машинный код состоит из нулей и единиц. Это называется двоичным кодом.
Например, вот как вы могли бы написать «Hello World» в двоичном формате:
01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100
Как видите, двоичный код не легко читается людьми, поэтому мы стараемся избегать программирования в машинном коде!
Что такое язык программирования?
Языки программирования относятся как к спектру языков низкого уровня, например ассемблер, так и к языкам программирования высокого уровня, например JavaScript.
Но что такое язык программирования? Лучшая аналогия, которую можно придумать - это разговорные языки, которые мы используем сегодня. Все языки выражают одну и ту же идею, но по-разному для каждого человека:
Английский: Hello
Французский: Bonjour
Испанский: Hola
Языки программирования - это разные способы выражения одной и той же идеи, но только для компьютера. Следующий код напечатает «Hello» на трех разных языках программирования:
JavaScript: alert(“Hello”);
Python: print(“Hello”)
Perl: print "Hello";
Каждый язык программирования имеет свой синтаксис. В русском языке есть грамматика. То же самое и с языками программирования - у каждого из них есть свой набор правил.
Как узнать, является ли язык программирования языком программирования?
Это может показаться странным вопросом. Весь код написан на каком-либо языке программирования? Технически нет. Например, существует неправильное представление о том, что HTML (язык разметки гипертекста) является языком программирования. На самом деле это «декларативный» язык, который, согласно Википедии:
«... стиль построения структуры и элементов компьютерных программ, который выражает логику вычислений без описания потока управления».
Другими словами, HTML обеспечивает структуру веб-страницы, но не контролирует поведение или функции веб-сайта.
Вы можете определить, является ли язык языком программирования, по тому, является ли он «полным по Тьюрингу». Машина Тьюринга - это гипотетическая машина, описанная Аланом Тьюрингом в 1936 году. Чтобы язык программирования был Тьюринг-полным, необходимо:
- Условное ветвление (о котором мы поговорим ниже).
- Возможность читать и писать на бесконечную бумажную ленту. По сути, это означает возможность хранить данные в памяти.
Каковы основы языка программирования?
Есть несколько основных элементов, которые обычно используются. Сюда входят переменные, циклы, условные операторы, структуры данных и алгоритмы. Это строительные блоки большинства языков программирования.
Что такое цикл for?
Циклы For полезны, если вам нужно многократно выполнять набор инструкций. Например, у вас послеобеденный чай и вам нужно приготовить для гостей пять чашек чая. Чтобы приготовить одну чашку чая, вы должны следовать набору инструкций, как в предыдущем примере.
Вместо того, чтобы писать инструкции пять раз, вы можете указать компьютеру выполнить те же инструкции пять раз. Это позволит вам масштабировать.
Ниже приведен пример базового цикла for:
for (let i = 0; i < 5; i++) {
console.log("Сделать чай!");
}
//Ожидаемый результат:
"Сделать чай!"
"Сделать чай!"
"Сделать чай!"
"Сделать чай!"
"Сделать чай!"
Что такое условное утверждение?
В JavaScript есть условные операторы if ... else. Они используются, когда вы хотите выполнить различные действия в зависимости от условия.
Возвращаясь к предыдущему примеру, вы спрашиваете пользователя, хочет ли он молока в чай. Если он хочет молока, добавьте молоко в чай, иначе ничего не делайте.
Вот пример оператора if ... else в JavaScript:
if(milk == true) {
// добавить молоко
} else {
// не добавлять молоко
}Что такое структуры данных?
«Структура данных - это способ организации данных таким образом, чтобы их можно было эффективно использовать ... Они являются важными составляющими в создании быстрых и мощных алгоритмов».
Общие структуры данных, которые можно найти во многих языках программирования - это массивы, объекты, кортежи и объединения. Возьмем в качестве примера массивы.
В JavaScript массив может хранить ряд данных, таких как числа и строки (текст). Я люблю печенье к чаю, поэтому собираюсь хранить его в своем массиве:
biscuits = [“shortbread”, “digestive”, “ginger nut”];
Эти бисквиты хранятся в памяти компьютера, и вы, как разработчик, можете получить доступ к определенному бисквиту, указав его индекс. Начинают считать индекс с 0. Индекс похож на положение печенья в банке для печенья. Ссылаются на него, используя квадратные скобки.
biscuits[0]; // “shortbread”
biscuits[1]; // “digestive”
biscuits[2]; // “ginger nut”
Если нам нужен digestive biscuit, то он доступен по индексу: biscuits[1].
Помните, что первым элементом массива является индекс 0. Поэтому, когда вы ссылаетесь на индекс 1, это фактически второй элемент массива.
Следовательно, структуры данных - это способ управления данными. Он включает в себя хранение и получение данных. Алгоритмы более эффективно выполнять, если данные организованы в структуру данных.
Что такое алгоритм?
Алгоритм - это особый набор инструкций, решающий проблему. Это абстрактное понятие.
Помните, мы раньше писали инструкции, как заварить чашку чая? По сути, это алгоритм: набор последовательных инструкций.
Когда я писал свою первую функцию на JavaScript, я фактически создал свой первый алгоритм, даже не зная, что это алгоритм! Функция - это реализация алгоритма.
Как и в реальной жизни, часто существует несколько решений проблемы кодирования. Например, вы собираетесь пойти в кафе, в котором никогда раньше не были. Есть несколько способов добраться до места назначения. Некоторые маршруты занимают больше времени, чем другие, но в конечном итоге все они приведут вас в одно и то же место. В идеале вы хотите выбрать самый быстрый, эффективный и простой маршрут.
Тот же принцип применим и к программированию. Обычно существует несколько способов решить проблему кодирования, и программисты стремятся найти наиболее элегантное и эффективное решение.
Разработчики часто не пишут идеальный код с первого раза! Так же, как я написал бы черновик статьи, то же самое и с кодированием. Я бы несколько раз переписывал статью, в которой можно было менять структуру, редактировать, переписывать разделы и вырезать ненужные предложения. В программировании мы проходим аналогичный процесс и называем это рефакторингом нашего кода.
Какие основные языки программирования используются сегодня? Сколько их?
Сейчас ведутся споры об общем количестве языков программирования в Интернете. Некоторые веб-сайты, такие как Википедия, перечисляют около 700 «всех известных» современных и исторических языков программирования. Другие сайты, такие как Tiobe, отслеживают и контролируют 250 из «самых популярных» языков.
На Github самым популярным языком программирования 2019 года был JavaScript:
Почему существует так много языков программирования? Как развивались языки программирования?
Разные языки программирования разработаны для удовлетворения разных потребностей. Это демонстрируется на протяжении всей истории языков программирования. Пожалуйста, обратитесь к диаграмме О’Рейли, на которой изображена история языков программирования с 1950-х по 2004 год.
В середине 1950-х годов был создан FORTRAN (перевод формул) для решения сложных математических, статистических и научных задач. COBOL («Общий бизнес-ориентированный язык») был создан в 1959 году, чтобы упростить использование кода предприятиями. Есть языки, которые больше подходят для статистического анализа, например R (1976).
Начиная с 1970-х годов наблюдается рост языков программирования общего назначения, таких как C, C ++, C # и Java. Как вы можете видеть на диаграмме выше, языки общего назначения доминируют в десятке самых популярных языков.
JavaScript, созданный в 1995 году, является популярным языком для Интернета. Он дает веб-сайтам интерактивность и жизнь.
Совсем недавно мы стали свидетелями рождения новых языков, таких как Go от Google, который был предназначен для более эффективного обслуживания больших программных систем. Вероятно, в будущем мы увидим еще больше языков программирования.
Компилируемые и интерпретируемые языки программирования

По мере того, как вы начнете больше знакомиться с языками программирования, вы столкнетесь с компилируемыми и интерпретируемыми языками программирования. В чем разница?
Что такое компилируемый язык?
В языках программирования, таких как C, C ++ и Java, есть процесс «сборки», в котором код компилируется в более читаемый формат (машинный язык) для компьютера.
Было бы проще представить двух людей, которые не говорят на одном языке, но им приходится работать вместе. Джон говорит по-английски, а Хлоя - по-французски. Хлоя пишет инструкции по приготовлению шоколадного суфле на французском языке, но Джон не может их понять. Им нужен переводчик, говорящий на английском и французском языках. Будет проще, если переводчик сможет перевести инструкции Хлои заранее, прежде чем они начнут готовить вместе.
Вместо этого разработчики «говорят» на таком языке программирования, как Java или Python. Им нужно, чтобы их код был скомпилирован (переведен) на машинный язык перед запуском программы, чтобы компьютер мог ее понять.
Программы, созданные на основе компилируемого языка, легче понять компьютеру и поэтому выполняются очень быстро.
Что такое интерпретируемый язык?
JavaScript, PHP и Python - примеры интерпретируемых языков программирования. Нет процесса сборки, и код не нужно компилировать. Код интерпретируется или читается строка за строкой по мере выполнения программы.
Вернемся к аналогии с Хлоей и Джоном. Джон записывает инструкции, как приготовить пирог. Переводчик не переводит инструкции Джона заранее, а вместо этого присоединяется к их готовке. По мере того, как Хлоя готовит, переводчик переводит каждую строчку инструкций Джона с английского на французский. Из-за этого Хлоя дольше готовит еду.
Следовательно, интерпретируемые языки медленнее, чем компилируемые языки. Их нужно переводить на лету, чтобы компьютер мог их понять.
Но с JIT-компиляторами интерпретируемые языки становятся быстрее и эффективнее.
Какой язык программирования лучше выбрать для изучения?
Языки программирования в значительной степени делают одно и то же, но это просто разные способы передачи одних и тех же инструкций компьютеру. После того, как вы усвоите концепции и основы одного языка программирования, кривая изучения другого языка будет не такой крутой.
Язык программирования, который вы должны выбрать для изучения в первую очередь, зависит от ряда факторов. Например, я хотел быть веб-разработчиком, поэтому я выбрал JavaScript в качестве основного языка программирования. Другие языки для веба, которые можно изучить - это PHP и Ruby on Rails.
Если вы хотите стать специалистом по данным, то вам может подойти Python. Python считается одним из лучших научных инструментов для анализа больших данных. Ранее я упоминал R, еще один язык, широко используемый специалистами по обработке данных и статистиками.
Python - это язык программирования общего назначения, который также полезен для изучения, если вы хотите заняться машинным обучением и искусственным интеллектом.
Если вы хотите стать инженером-программистом, как вариант - Java. Java - один из самых популярных и востребованных языков в мире. Это универсальный язык, который можно использовать для разработки программного обеспечения для малых и крупных предприятий.
Так что подумайте о том, какую роль в сфере технологий вы бы хотели получить и в каких компаниях вы хотите работать.
Выбор языка программирования также зависит от того, какое программное обеспечение вы пытаетесь создать. Это хорошо подводит нас к следующему разделу.
Что такое программное обеспечение?

Сколько раз в день вы взаимодействуете с программным обеспечением?
Программное обеспечение везде. Оно интегрировано как встроенная система в повседневные устройства, такие как микроволновая печь, стиральные машины, автомобили, телевизоры, детские игрушки и пульты дистанционного управления. Затем есть более очевидные устройства, связанные с компьютером, в которых есть приложения и/или системное программное обеспечение, например планшеты, смартфоны, ноутбуки, настольные компьютеры и домашние помощники, такие как Alexa.
Средний человек, вероятно, взаимодействует с программным обеспечением несколько десятков раз в день, если не больше. Это часть нашей повседневной жизни.
Все программное обеспечение создается разработчиком. Программное обеспечение по своей природе гибкое и может постоянно изменяться. Программное обеспечение и оборудование взаимосвязаны. Представьте свой телефон без приложений и операционной системы. Телефон по сути был бы дорогим кирпичом! Следовательно, программное обеспечение дает аппаратному обеспечению жизнь, а аппаратное обеспечение реагирует так, как мы взаимодействуем с программным обеспечением.
Большинство программного обеспечения, создаваемого программистами, написано на языке программирования высокого уровня.
Что такое разработка программного обеспечения?
Разработка программного обеспечения - это все, от идеи до разработки и внедрения. Этот процесс, от идеи до развертывания программного обеспечения, также известен как жизненный цикл программного обеспечения.
Жизненный цикл программного обеспечения состоит из нескольких этапов: поиск, проектирование, программирование/создание, тестирование и развертывание/выполнение. Он также включает все остальное в экосистеме разработки программного обеспечения, такое как обслуживание, документация и исправления ошибок.
Мы не будем углубляться, так как тема разработки программного обеспечения заслуживает отдельной статьи.
Современные тенденции в разработке программного обеспечения и компьютерном программировании
Искусственный интеллект и машинное обучение

В последние годы вы, вероятно, слышали такие термины, как искусственный интеллект и машинное обучение. Иногда они используются как синонимы, но одинаковы ли они?
Нет, это не совсем одно и то же. Машинное обучение - это когда машина учится на собственном опыте. В то время как искусственный интеллект - это более широкая идея, согласно которой машины могут выполнять задачи разумно. Машинное обучение - это разновидность искусственного интеллекта.
Что такое искусственный интеллект?
Мы уже знаем, как работают языки программирования - программист пишет набор инструкций для выполнения компьютером. Искусственный интеллект (ИИ) - это более широкая концепция, в которой компьютеры могут имитировать работу мозга. Это обучение машины «думать» как человек.
Большой вопрос: можно ли воспроизвести человеческий интеллект в машине? Можете ли вы имитировать то, как человек учится, рассуждает и воспринимает? Алан Тьюринг задал этот вопрос в своей статье 1950 года:
«Могут ли машины думать?»
В статье Тьюринга он предложил «тест Тьюринга», в котором машина будет классифицироваться как «умная», если человек не сможет отличить реакцию человека от реакции машины с искусственным интеллектом.
Спустя 70 лет разработчики ИИ, ученые, ученые и исследователи все еще пытаются ответить на этот вопрос и создать машину с искусственным интеллектом. Не думаю, что мы достигли этого. Вы пробовали поговорить с Siri или Alexa? Разговоры с этими двумя устройствами по-прежнему базовые. Однако я уверен, что улучшение технологий - это лишь вопрос времени.
Такие компании, как DeepMind, исследуют эту концепцию и выясняют, способны ли машины к интеллекту. Программа DeepMind AlphaGo попала в заголовки газет, когда победила профессионального игрока в Go. Это была огромная веха для ИИ.
Что такое машинное обучение?
Машинное обучение (МО) - это разновидность искусственного интеллекта. МО - это другой способ программирования. Идея заключается в том, что компьютер может учиться без явного программирования. Артур Самуэль впервые высказал идею машинного обучения в своей статье в 1959 году:
«Программирование компьютеров для обучения на собственном опыте должно в конечном итоге устранить необходимость в большей части этого детального программирования».
Когда мы учим ребенка узнавать кошку, мы показываем ему фотографии кошек. И мы делаем это неоднократно, пока он не сможет узнать кошку без подсказки.
Машинное обучение похоже на это. Вы даете своему компьютеру сотню изображений (ввод) кошек. Затем он изучает закономерности в данных и строит систему классификации путем повторения. Если вы предоставите компьютеру больше изображений кошек и других животных, он сможет определить, является ли животное на картинке кошкой или нет. По сути, он узнал, как должна выглядеть кошка.
МО предоставляет вашему компьютеру данные и примеры, а он, в свою очередь, может учиться самостоятельно, как младенцы и маленькие дети. Вместо того, чтобы разработчики давали инструкции компьютеру, компьютер создает свой собственный набор инструкций, которым нужно следовать - алгоритмы машинного обучения. Алгоритмы машинного обучения - это подмножество машинного обучения, концепции, известной как «глубокое обучение».
«ИИ - одна из самых важных вещей, над которыми мы работаем как человечество. Это сложнее, чем огонь или электричество ... "
(Сундар Пичаи, Всемирный экономический форум, январь 2020 г.)
Цитата Сундара Пичаи, генерального директора Alphabet Inc., резюмирует важность ИИ и машинного обучения.
Какое будущее у компьютерного программирования?
В этом заключительном разделе будут мои прогнозы о будущем компьютерного программирования.
Разработчики продолжат создавать новые языки программирования. Языки программирования станут более абстрактными и, следовательно, доступными для людей, обучающихся программированию.
Я считаю, что в учебных планах начальной и средней школы будет уделяться больше внимания программированию и разработке. Спрос на разработчиков и программистов будет только расти по мере того, как технологии и программное обеспечение станут все более интегрированными в нашу повседневную жизнь. Программирование станет повсеместным.
Мы увидим постоянный рост и популярность машинного обучения и искусственного интеллекта, которые помогут разработчикам в процессе разработки программного обеспечения. Это включает автоматизацию тестирования, а также обнаружение и предотвращение уязвимостей и ошибок.
ИИ произведет революцию во всех аспектах жизни нашего общества, а не только в программировании и разработке программного обеспечения. Например, мы уже добились больших успехов в области искусственного интеллекта и самоуправляемых автомобилей.
Одна из ведущих мировых компаний по разработке беспилотных автомобилей - Tesla, основанная Илоном Маском. Под контролем человека-водителя автомобиль Tesla теперь может автоматически менять полосу движения, автономно перемещаться по автострадам с ограниченным доступом, а владелец может вызывать автомобиль в гараж или на парковочное место и обратно. Цель Tesla - создать полностью автоматизированный, беспилотный автомобиль без какого-либо вмешательства человека.
По мере того, как машины становятся более разумными, мы можем прийти к тому моменту, когда машины превзойдут интеллект людей. Это называется сингулярностью. На данный момент это может показаться полной научной фантастикой! Но известные деятели, такие как Рэй Курцвейл, предсказывают, что машины с интеллектом человеческого уровня появятся в течение следующих 20 лет. Курцвейл известен своими точными прогнозами развития технологий. Он написал книгу об этом: «Век духовных машин».
Как изменится наше общество в результате появления сверхразумных машин?
Заключительные слова
Технологии влияют, и код затрагивает практически каждую часть нашей жизни. От нашего выбора развлечений (онлайн-игры, стримы) и того, как мы делаем покупки, до выбора того, что мы едим и даже того, как мы встречаемся! Код важен, и больше рабочих мест будет меняться, и от людей потребуется хотя бы некоторое базовое понимание программирования.
Тем не менее, согласно исследованию Global Developer Population and Demographic за 2019 год, в мире всего около 23,9 миллиона разработчиков. Для сравнения: только 0,3% населения мира умеет программировать. Наша зависимость от программного обеспечения и технологий растет. Спрос на инженеров-программистов вырастет , следовательно, нам необходимо увеличить количество разработчиков.
Если вы думаете о том, чтобы стать разработчиком, начните сегодня. Это невероятно захватывающее время для этого! В Интернете есть множество ресурсов для обучения программированию. Существуют платформы для самостоятельного обучения. Проведите небольшое исследование и выясните, какой ресурс подходит вашему стилю обучения.