Представляю вашему вниманию перевод очень ёмкой, и в то же время достаточно краткой (для такого масштаба проблемы) статьи Карла Чео. Я решил, что очень хочу сделать её перевод практически сразу, как только начал читать, и очень рад, что в итоге сделал это.
Для того, чтобы сделать обучение более веселым и интересным, представляю вам перечень важных теорий и концепций информатики, объяснённых с помощью аналогий с минимальным количеством технических деталей. Это будет похоже на очень быстрый курс информатики для всех с целью просто дать вам общее представление об основных концепциях.

Важные замечания:
  • Пункты с неуказанным источником написаны мной самостоятельно. Поправьте меня, если вы заметите какие-то неточности. Предложите лучшую аналогию, если это возможно.
  • Заголовки ссылаются на соответствующие им статьи в Wikipedia. Пожалуйста, читайте эти статьи для более серьезных и детальных объяснений.
  • Аналогии — отличный способ объяснить материал, но они не идеальны. Если вы хотите по-настоящему понять перечисленные концепции, вам следует начать с фундаментальных азов и рассуждать, исходя из них.

Также зацените эту инфографику (вариант на русском), если вы просто начинающий программист.

Ключевые концепции #1 — Алгоритмы и структуры данных


1.1 Нотация “О-большое” (на русском)


Допустим вы заказываете полную коллекцию серии фильмов о Гарри Поттере из 8 частей на Amazon и скачиваете ту же самую коллекцию в то же время. Вы хотите проверить, какой метод быстрее. Магазин доставил коллекцию почти через день, а скачивание завершилось всего на 30 минут раньше этого. Класс! Это была близкая гонка.
Но что если я закажу несколько Blu-ray фильмов, например Властелин Колец, Сумерки, трилогию о Тёмном Рыцаре и тому подобное, и в то же время буду пытаться скачать все эти фильмы? Доставка всё равно займёт день, но скачивание в сети продлится на этот раз 3 дня.
При покупках в интернете количество покупаемых вещей (входные данные) никак не влияет на время, за которое они будут доставлены. Выходные данные константны. Мы называем это О(1).
Но при скачивании в сети время скачивания прямо пропорционально размеру скачиваемых фильмов (входные данные). Мы называем это O(n). Из этих экспериментов мы понимаем, что покупки в интернете лучше масштабируются, чем загрузка файлов из сети. Очень важно понимать “О-большое”-нотацию, так как это поможет вам анализировать эффективность и масштабируемость алгоритмов.
Замечание: нотация “О-большое” служит для оценки эффективности в худшем случае для алгоритма. Давайте согласимся, что О(1) и О(n) — худшие сценарии для приведённого примера.
Больше информации: Big O Notations (video), Plain English explanation of Big O, A Beginner’s Guide to Big O Notation

1.2 Алгоритмы сортировки (на русском)



Больше информации: Sorting Algorithm Animations, Beautiful and configurable visualizations of sorting algorithm

1.3 Рекурсия (на русском)

Кто-то в кино спрашивает вас, на каком ряду вы сидите. Вы слишком ленивы, чтобы посчитать, так что вы спрашиваете человека, сидящего перед вами. Вы просто будете должны добавить 1 к его ответу, чтобы получить номер своего ряда. Отличная идея, не так ли? Однако, человек перед вами сделает то же самое, и так дальше. В конце концов вопрос доберётся до первого ряда и человек на первом ряду ответит “Я в ряду номер 1!”. С этого момента правильное сообщение (увеличиваемое на 1 за каждый ряд) пройдёт весь свой путь обратно к тому, что изначально спросил.
Aaron Krolik/Quora

Есть ещё один пример, известный как эффект Дросте (на русском).
Медсестра несет поднос с пачкой какао и чашкой, на которой нарисовано уменьшенное изображение её, держащей всё то же самое, которое в свою очередь содержит ещё более маленькое изображение той же картинки, и так далее.
Тут вы можете найти ещё больше примеров эффекта Дросте, если хотите, чтобы вам стало сонливо.



Если вы ещё не до конца поняли рекурсию, попробуйте посмотреть тут… Ну а если поняли — продолжайте читать.

1.4 Big Data (на русском)

Давайте представим, что у вас течет труба в саду. Вы берете ведро и немного уплотнителя, чтобы починить её. Через некоторое время вы видите, что течь стало ещё больше и вам уже нужен водопроводчик с нормальными инструментами. В то же время, вы всё ещё используете ведро, чтобы как-то справляться с водой. Ещё через какое-то время вы замечаете, что открылся огромный подземный поток. Вам уже нужно как-то справляться с галлонами воды в секунду!
Вёдра больше не помогут. Вам нужен совершенно новый подход для решения проблемы, так как количество и скорость поступления воды увеличилась. Чтобы спасти город от наводнения, вам может понадобиться помощь правительства, чтобы построить дамбу, что требует огромного количества инженерных знаний и тщательно проработанной системы контроля.
Balaji Viswanathan/Quora

Термин “большие данные” описывает наборы данных на столько большие и сложные, что с ними невозможно работать с помощью обычных инструментов обработки данных.
Больше информации: Big Data by TED-Ed (video), What is Big Data and Hadoop (video)

1.5 Структуры данных (на русском)


Каждый специалист в области информатики и программист должен знать как минимум следующие структуры данных:

Ключевые концепции #2 — Искусственный интеллект


2.1 Жадный алгоритм (на русском)



Представьте, что вы решили прогуляться, и ваша цель — добраться до самого высокого места. У вас есть карта, но на карте тысячи возможных путей. Вы слишком ленивы и у вас просто нет времени, чтобы попробовать каждый из них. Так что к черту карту! Вы просто идете вперёд с простой стратегией — быть жадным и близоруким. Вы просто выберете пути, которые как можно более наклонены вверх.
После того, как ваше путешествие завершилось и ваше тело стало измученным и уставшим, вы посмотрели на карту местности впервые. О боже мой! Вот грязная речка, через которую я должен был переправиться вместо того, чтобы идти вверх!
Жадный алгоритм делает лучший выбор в текущий момент времени и никогда не пересматривает своих решений.

2.2 Восхождение к вершине (на русском)



На этот раз вы забираетесь на другую гору. Вы решили найти путь, который приведет вас на самую высокую точку. Однако у вас нет никакой карты и вокруг очень туманно. Для того, чтобы сделать вашу задачу проще, вы скачали мобильное приложение, которое отслеживает путь, который вы преодолели и измеряет вашу текущую высоту над уровнем моря.
Вы забираетесь на гору ещё раз и ещё раз. Каждый раз вы выбираете точно такой же путь, который привел вас к самой высокой точке, которую вы записали до этого, но где-то в середине вашего пути вы выбираете немного другой маршрут. Вы так же можете случайно выбирать различные точки старта, такой алгоритм называется восхождением к вершине со случайным стартом. Таким образом вы не привязываетесь к одной области и уменьшаете вероятность того, что вы застрянете. Алгоритм восхождения к вершине старается найти лучшее решение с помощью генерации соседствующих решений. Каждое такое решение генерируется на основе лучше решения на текущий момент, но с одним измененным элементом.

2.3 Алгоритм имитации отжига (на русском)



Это — гора Эверест, самый крупный вызов, с которым вы сталкивались. Ваша задача — добраться до вершины, но это очень непрактично забираться на Эверест помногу раз. У вас есть только один шанс. И вы стали куда более предусмотрительнее, чем раньше. Вместо того, чтобы всегда взбираться наверх, вы изредка двигаетесь вниз и находите новые пути, чтобы уменьшить риск пойти по неправильному пути. Чем выше вы забираетесь, тем меньше вероятность того, что вы пойдёте вниз.

2.4 Динамическое программирование (на русском)

Отец: *Пишет “1+1+1+1+1+1+1+1 =” на куске бумаги*
Отец: Чему это равно?
Ребенок: *Считает и тремя секундами спустя* Восемь!
Отец: *Дописывает ещё “+1”*
Отец: А теперь?
Ребенок: *Сразу же* Девять!
Отец: Ого, как ты посчитал так быстро?
Ребенок: Ты просто добавил ещё один!
Отец: Ты понял, что тебе не нужно пересчитывать, потому что ты запомнил, что это было восемь до этого. Отлично!
Jonathan Paulson / Quora

Пример выше описывает мемоизацию (на русском) (да, мемоизация — это не запоминание), подход к динамическому программированию сверху вниз, при котором результаты предыдущих рассчетов сохраняются для дальнейшего использования.
Больше информации: Dynamic Programming – From Novice to Advanced (TopCoder), Tutorial for Dynamic Programming (CodeChef)

2.5 Машинное обучение (на русском)


Парат Шах привел прекрасную аналогию тут, но она слишком длинная, чтобы включать её в эту статью.

2.6 Равенство классов P и NP (на русском)


Равенство классов P и NP задач — одна из наиболее популярных и важных неразрешенных проблем в информатике.
Допустим, у нас есть следующая задача:
Задача 1: 7 x 17 = p
Ответ — 119.
Это было легко, не так ли? Но что если у нас противоположная задача:
Задача 2: p x q = 119 (p и q не могут быть 1 и 119)
Для того, чтобы решить вторую задачу, предполагая, что вы не видели первую, вам нужно пройтись по всем возможным числам от 2 до 118. Существует хороший алгоритм, позволяющий просто раскладывать числа на множители (на русском).
Что если я спрошу: может ли p быть 7? Вы сможете очень просто ответить, просто разделив 119 на 7.
Умножение — это просто. Разложение на множители числа — сложно.
В итоге, задача 1 — P (полиномиальная), так как её просто решить. Компьютер отлично справляется с умножением двух огромных чисел, не тратя существенно больше времени, чем умножая два небольших числа.
Задача 2 — это NP (недетерминированная полиномиальная), потому что её легко проверить, но сложно решить. Разложение на множители числа 119 — все ещё не очень сложная задача для компьютера, но что на счёт числа, состоящего из 500 знаков? Это невозможно ни для одного компьютера в наши дни.
И тут начинается важная часть: являются ли NP-задачи (например, разложение на множители) также и P-задачами (как умножение), а мы просто ещё не обнаружили эффективного способа решения NP-задач? Действительно ли NP-зачадачи сложны или нам просто нужен момент просветления какого-нибудь хорошего ученого (может быть вас?), который придумает эффективный алгоритм? Или может быть люди слишком глупы? Представьте, что существует машина или жизнь, обладающая куда большим интелектом, чем человек. Мы для них, как муравьи для нас. Наш уровень интеллекта для них совершенно несущественен. Решение данной проблемы для них как 1+1.
Так или иначе, почему же задача равенства классов P и NP задач так важна? Если мы сможем доказать, что P=NP, это означает, что все NP-задачи могут быть решены за разумное компьютерное время. Мы сможем вылечить рак (укладка белка, на русском), взламывать пароли (RSA, на русском) и тому подобное. Это изменит мир.
Проблема равенства классов P- и NP-полных задач является одной из семи в списке проблем тысячелетия от математического института Клэя. Наградой за первое верное решение является $1 000 000.
Больше информации: P vs. NP and the Computational Complexity Zoo (video), Simple Wikipedia

Ключевые концепции #3 — Архитектура компьютера и инженерия


3.1 Как работают компьютеры



Компьютеры работают, добавляя сложность поверх сложности (Computers work by adding complexity on top of complexity). Для того, чтобы вести машину, не обязательно понимать, как работает её двигатель. Сложные детали скрыты.
Так как же компьютер превращают бинарный код, нолики и единички в программы? Вот превосходное видео, в котором с помощью домино визуализируется, как компьютеры осуществляют бинарные вычисления на самом базовом, фундаментальном уровне:


Больше информации: Interactive explanation on how computer works

3.2 Проблема остановки (на русском)



Больше информации: The Freeze App Analogy, Simple Wikipedia

Архитектура компьютера (на русском) и инженерия (на русском) -- огромные темы, включающие в себя такие разделы, как операционные системы (на русском), компиляторы (на русском) и другое.

Ключевые концепции #4 — Параллелизм (на русском)


Предположим, вы работаете секретарём в компании А. Вы должны отвечать на звонки, планировать встречи, набирать документы и всё в таком духе. Вы всегда должны переключаться между этим задачами в соответствии с приоритетами. Каждый раз, когда звонит телефон, вы должны остановиться, что бы вы ни делали, и ответить.

Параллелизм (параллельное выполнение) — это свойство программ и систем, которое позволяет задачам выполняться в перекрывающихся периодах времени.

4.1 Параллельные вычисления (на русском)


В конце концов, вы уже не можете выполнять свою работу из-за огромного количества задач, связанных с вводом данных. Вы жалуетесь своему начальнику, и он радостно нанимает специально обученного человека, чтобы он занялся задачами ввода данных.

Параллелизм позволяет двум или более задачам запускаться одновременно при наличии у машины возможности использовать многопроцессорную обработку данных (на русском).

Однако, реализация концепций параллельного выполнения так же приносят и многие потенциальные проблемы, такие как состояние гонки.

4.2 Состояние гонки (на русском)


Вот, что произойдет, если вы допустите выполнение параллельных транзакций в системе банкинга, а состояние гонки не будет обрабатываться:

  • У вас есть $1000 на вашем счету
  • Кто-то переводит вам $500, а вы снимаете $300 в банкомате
  • Представьте, что обе транзакции происходят одновременно — обе транзакции будут считать. что ваш текущий баланс равен $1000
  • Теперь, транзакция А добавляет $500 на ваш счёт и ваш текущий баланс становится равным $1500. Однако, транзакция B так же считала, что ваш текущий баланс равен $1000, и она, допустим, завершится на одну миллисекунду позже, чем транзакция А. Она вычтет $300 из $1000 и сделает ваш текущий баланс равным $700
  • Теперь у вас есть $700 вместо $1200, так как транзакция В перезаписала действия транзакции А
  • Это произошло, так как банковская система не принимала в расчет текущих происходящих транзакций

Итак, что вы можете сделать, чтобы справиться с такой ситуацией? Одним простым способом является взаимное исключение.

4.3 Взаимное исключение (Mutex, на русском)


Теперь, вне зависимости от того, какие транзакции проходят, система будет лочить [жаргонизм, самое близкое по смыслу определение на русском — блокировать от действий других транзакций, прим. пер.] счета, принимающие участие в транзакции.

На этот раз, в тот момент, когда совершается транзакция А, ваш счет заблокируется. Вы не сможете снять деньги в банкомате. Он будет разблокирован, как только транзакция А завершится.

Таким образом, взаимное исключение решает проблему, не так ли? Да, но никто не хочет, чтобы банкомат отвергал все запросы каждый раз, когда происходит какая-нибудь транзакция.

Давайте немного изменим наше решение.

4.4 Семафор (на русском)


4.4.1 Бинарный семафор


Теперь давайте установим разные уровни приоритетов для разных типов транзакций. Скажем, запрос снятия наличных имеет более высокий приоритет, чем банковский перевод. Когда вы снимаете деньги в банкомате, транзакция А (которая про перевод денег между счетами) остановится, позволяя транзакции В обрабатываться первой, так как она имеет более высокий приоритет. Транзакция А продолжит выполняться, как только транзакция В завершится.

4.4.2 Семафор с подсчётом


Двоичный семафор прост. 1 = продолжить транзакцию. 0 = ждать. С другой стороны, подсчитывающий семафор позволяет более одному процессу выполняться одновременно.

Предположим, вы менеджер камеры хранения в спа-салоне и у вас есть 30 камер. Вам нужно отслеживать количество ключей, которое у вас есть, каждый раз, когда вы получаете или даёте кому-то ключ, хотя вы можете и не знать этого кого-то. Если все камеры заняты, люди должны вставать в очередь за ними. В тот момент, когда кто-нибудь закончит, он передаст свой ключ первому человеку в этой очереди.

4.5 Deadlock (на русском)


Взаимная блокировка — это еще одна стандартная проблема с параллельными вычислениями.

Давайте используем похожу аналогию с банковской системой, но с другим сценарием. На всякий случай напомню, что доступ к банковскому счету блокируется, если происходит какая-то транзакция.
  • Питер переводит вам $1000 (транзакция А), а вы переводите ему $500 в то же самое время (транзакция В)
  • Транзакция А блокирует счет Питера и снимает $1000 с его счета
  • Транзакция В блокирует ваш счет и снимает $500 с вашего счета
  • Теперь, транзакция А пытается получить доступ к вашему аккаунту, чтобы добавить на него $1000 от Питера
  • В то же время, транзакция В так же пытается добавить ваши $500 на счет Питера

Однако, так как обе транзакции не завершены, ни одна из них не может получить доступа к заблокированному счету. Обе ждут завершения друг друга. Взаимная блокировка.

А вот пример из реальной жизни:
Парень: пусть она первая подойдёт
Девушка: пусть он первый подойдёт
Так и умерла многообещающая любовная история
Padmakar Kalghatgi/Quora

Ключевые концепции #5 — Компьютерная безопасность (на русском)


5.1 Компьютерное хакерство [взлом]


Хакерство похоже на взлом дома. Ниже приведены некоторые популярные хакерские техники:


5.1.1 Атака полным перебором (или атака методом грубой силы) (на русском)


Попробуйте сотни или тысячи различных ключей. Опытный грабитель сначала попробует самые часто используемые ключи.

Атака полным перебором пробует каждый возможный пароль, и обычно начинает угадывать с самых распространенных паролей, таких как «123456», «йцукен» и т.п.

5.1.2 Социальная инженерия (на русском)


Пара только что въехала в соседнюю квартиру. Они выглядят очень милыми и дружелюбными, часто приглашают вас на ужин. Однажды вы упоминаете, что вы скоро уезжаете в двух-недельный отпуск. Они радостно предлагают вам позаботиться о вашей собаке. Вы оставляете им свой запасной ключ. С тех пор вы о них ничего не слышите.

Социальная инженерия — это попытка обмана людей с целью заставить их раскрыть их личную информацию.

5.1.3 Брешь в безопасности (эксплойт) (на русском)


Взломщик проверяет каждый возможный вход с целю найти наиболее простой способ попасть внутрь. Кто знает, может быть кто-нибудь оставил открытым окно на втором этаже?

5.1.4 Троян (на русском)


Взломщик прикидывается водопроводчиком, и вы сами открываете ему дверь. Он чинит вашу текущую трубу и все выглядит отлично. Но после его ухода вы обнаруживаете, что ваши украшения пропали.

Троян — вредоносная программа, которая притворяется полезной, запуская вредоносный код в фоне.

5.1.5 Руткит (на русском)


Ваш замок заклинило и вы вызвали слесаря. Он починил ваш замок и тайно сделал себе дубликат ключа.

Руткит получает права администратора на компьютере каким-нибудь образом (например, используя социальную инженерию), после чего специальным образом маскирует необходимые файлы так, что его сложно обнаружить антивирусным ПО.

5.1.6 Распределенная атака типа «Отказ в обслуживании» (DDoS, на русском)


Приведем аналогию с книжным магазином.

Представьте, что 100 человек приходят в ваш маленький книжный магазин в одно время. Ваш книжный магазин весь забит и больше никто не может войти. Вы не можете попросить их уйти, потому что не похоже, чтобы они приходили группами. Они может быть и не знают друг друга вовсе. Многие из них кажутся реально заинтересовавшимися вашими книгами. Некоторые даже спрашивают вас, где находятся книжные полки. Кто-то на кассе пытается расплатиться копейками.

Люди приходят и уходят часами. Все они выглядят абсолютно нормально. К концу дня вы понимаете, что продали всего одну книгу. Помните парня, который расплачивался копейками?

DDoS пытается вывести из строя ваш сайт или сервис, просто затапливая, переполняя его посетителями.

Ссылка на оригинальную визуализацию

5.2 Криптография (на русском)


5.2.1 Симметричная криптография (на русском)


Допустим, Элис и Боб хотят отправлять что-то друг другу. Чтобы убедиться, что никто не сможет увидеть, что они друг другу отправляют, они запирают это в коробке. Они делают 2 идентичных (симметричных) ключа для замка и встречаются, чтобы обменяться этими ключами.

5.2.2 Асимметричная криптография (на русском)


Обмен одинаковыми ключами сносно работает для двух людей. Что если Элис хочет обмениваться вещами с другим парнем по имени Карл, и Элис так же не хочет, чтобы кто-то видел эти вещи. Элис не может использовать тот же замок и ключ, которые они использовали с Бобом, так как Боб сможет открыть коробку своим ключом.

Конечно Элис может обменяться совершенно новым и соответственно другим ключом и замком с Карлом, но что если Элис хочет обмениваться вещами с 10 различными людьми? Ей придется владеть 10 различными ключами!

Так что Элис приходит в голову отличная идея. Она делает один ключ (приватный ключ). Она так же раздаёт одинаковые замочки (публичный ключ) её друзьям. Любой может запереть замок (зашифровать), но только она сможет открывать коробки (расшифровывать). Теперь, любой может отправлять Элис вещи, используя замки, которые она раздала, так что Элис больше не нужно иметь различные ключи для разных людей.

Если Элис захочет послать что-нибудь Карлу, она попросит у Карла замок (публичный ключ), с помощью которого она сможет запереть (зашифровать) её вещи и отправить Карлу.

Базовый принцип таков: каждый имеет его собственный приватный ключ для расшифровки сообщений и снабжает отправителей публичными ключами для зашифровки сообщений.

Больше информации: Public Key Cryptography: Diffie-Hellman Key Exchange (video)

Ключевые концепции #6 Методологии разработки программного обеспечения (на русском)

6.1 Водопад (на русском)


Вы выясняете всё, что нужно сделать, и записываете требования. Это как водопад: тут нет пути назад, пока вы не начнете с самого начала. Вы перемещаетесь к следующей фазе только когда текущая фаза завершена.


6.2 Гибкая разработка (на русском)


Вы понимаете некоторые вещи, которые вы должны сделать в первую очередь. Затем последовательно улучшаете, эволюционируете, адаптируете ПО в процессе разработки.

Приведу некоторые популярные реализации гибкой методологии разработки:

6.3 Разработка ПО в реальном мире


Итак, вы научились программировать. Вы пишите хороший и красивый код (надеюсь), и всё прекрасно. Дайте мне представить вам ковбойское программирование — методологию разработки, которую не преподают в колледже.

Ещё вы удивляетесь, почему вы застряли с оценкой времени разработки:


И методологии часто неправильно используют:

Dilbert

Dilbert

Ну вот и всё. Информатика в двух словах.

Пожалуйста советуйте добавить любые другие теории и концепции информатики, те, что вы считаете важными и запутанными.

Стандартные вопросы новичка


Вопрос 1: В чем разница между ученым-информатиком и программистом

Специалист в информатике (computer scientist) это как физик, а программист — это как инженер.
HerbN/Stack Overflow

Вопрос 2: что такое программирование?


Написание очень подробных инструкций для тупой, но послушной машины.

Что это значит? Представьте, что вы должны научить ребенка ходить в душ. Ребенок знает только как следовать вашим инструкциям. Так что вы говорите ребенку:

  1. Зайти в ванну
  2. Включить душ
  3. Встать под душ
  4. Взять мыло
  5. И так далее...

О, черт, ребёнок не снял свою одежду перед тем, как встать под душ!

Вот как работает компьютер. Вы должны сообщать компьютеру, что именно ему нужно сделать. Он не знает, как предполагать и никогда не подумает о последствиях.

Вопрос 3: почему вы не должны отвлекать программиста, когда он сосредоточен?

Процесс сосредоточения похож на засыпание. Представьте, что вы будете человека, который близок к тому, чтобы уснуть в ближайшие несколько секунд. Теперь ему придется потратить больше времени, чтобы уснуть!
EpsilonVector/Programmers Stack Exchange

Вопрос 4: В чем разница между Java и JavaScript?


Они никак не связаны.
Java и JavaScript похожи примерно так же, как корова и караван (или как Ленин и Ленинград?)
Greg Hewgill/Stack Overflow

Вопрос 5: В чем разница между JavaScript и JQuery?


JQuery — это библиотека, сделанная с помощью JavaScript.
JavaScript — это страшненький задрот, а JQuery — это волшебник, который превращает его в привлекательного игрока футбольной команды.
Совет от Will Sargent

Вопрос 6: В чем разница между фреймворком (каркасом) и библиотекой?


Ваш код вызывает библиотеку. Фреймворк вызывает ваш код.
Ian Boyd/Stack Overflow
Библиотека — это инструмент. Фреймворк — это образ жизни.
James Curran/Stack Overflow

Вопрос 7: Как много строк кода средний разработчик пишет в день?


Невозможно ответить на этот вопрос. Это количество может быть отрицательным, когда разработчик разбирается с техническим долгом (на русском).
Измерение продуктивности в программировании количеством строк кода — это как измерять прогресс постройки самолёта по его весу.
Bill Gates

Вопрос 8: Что такое объектно-ориентированное программирование?


Объекты — это существительные, методы — глаголы.
k rey/Programmers Stack Exchange
Объекты как люди. Они живут тем, что делают то, о чем у них есть какие-то внутренние знания. И у них есть память, так что они могут что-то запоминать. И вместо того, чтобы взаимодействовать с ними на низком уровне, вы взаимодействуете с ними на высоком уровне абстракций, прямо как мы сейчас.

Вот пример: если я ваш объект «прачечная», вы можете дать мне вашу грязную одежду и отправить мне сообщение, в котором сказать «Пожалуйста, постирайте мои вещи». Я знаю лучшую прачечную в Сан Франциско. Я говорю по-английски и у меня есть деньги. Так что я выхожу, сажусь в такси и говорю водителю отвезти меня туда. Я получаю ваши постиранные вещи, снова сажусь в такси и возвращаюсь обратно. Я отдаю вам ваши чистые вещи со словами «Вот ваши чистые вещи».

У вас нет ни малейшего представления о том, как я это сделал. Вы не знаете этой прачечной. Может быть, вы говорите по-французски, и вы даже не можете вызвать такси (допустим, вы не можете заплатить, у вас нет денег). Но я знаю, как всё это сделать. И вам не нужно это всё знать. Вся сложность скрыта внутри меня, и мы можем взаимодействовать на высоком уровне абстракции. Вот что такое объекты. Они скрывают сложность, и предоставляют высокоуровневые интерфейсы к этой сложности.
Steve Jobs/Rolling Stone Interview

Вопрос 9: Что такое API (интерфейс прикладного программирования)


В ресторане вы заказываете еду (вызываете API) из меню (набор методов API). Как только ваша еда готова (готов ответ от API), официант принесет вам еду.

Базовая идея такова: попросите то, что вам нужно, и система вернет вам результат, не раскрывая того, как именно она это сделала.

Вопрос 10: В чем разница между SQL и NoSQL базами данных



NoSQL базы данных хранят информацию, как вы бы хранили в книге рецептов. Когда вам нужно узнать, как приготовить торт, вы открываете книгу рецептов, и вся информация о том, как приготовить торт (ингредиенты, подготовка, замеска теста, запекание и всё в таком духе) находится на одной странице.

SQL похож на покупку ингредиентов для рецепта. Для того, чтобы положить все нужные ингредиенты в корзину, вы должны подойти ко множеству разных мест, чтобы взять нужный ингредиент. В конце концов, ваша корзина будет наполнена ингредиентами, которые вы собирали до этого по магазину.

Не было бы лучше, если бы магазин был бы организован по рецептам, так что вы могли бы просто придти в одно конкретное место в магазине и взять всё, что вам нужно? Вы бы находили одинаковые ингредиенты (например, яйца) в 50 различных местах, чего было бы сложно добиться мерчандайзерам магазина, но со стороны покупателя было бы на много проще и быстрее найти то, что он искал, при такой организации.
mgoffin/Stack Overflow

Комментарии (37)


  1. Bogdan92
    03.10.2015 14:42
    +9

    Спасибо огромное за то, что собрали столько полезной информации в одном посте.


  1. vlreshet
    03.10.2015 19:21
    +4

    В закладки, однозначно. Читать — не перечитать. Спасибо большое за пост


  1. Ununtrium
    03.10.2015 19:46
    +4

    Основы программирования и CS для самых маленьких. Нахрен универ, нахрен обучение, почитал аналогий про апельсины и рецепты и пошел кодить. Разработка это ведь, *****, так просто, прямо как продукты в магазине покупать.


    1. timramone
      03.10.2015 19:55
      +9

      Хм, возможно я сейчас ведусь на какой-то толстый троллинг, но мне кажется, что вы немного неправильно поняли смысл статьи. Автор довольно четко обозначил свою позицию еще в самом начале: аналогии дырявы и нужны только для того, чтобы дать общее представление. Если вы хотите более глубокого понимания — учитесь! Автор написал эту статью, как я понимаю, для того, чтобы заинтересовать, прежде всего, дать первый толчок в правильном направлении


      1. Ununtrium
        03.10.2015 23:10
        -9

        Комментатор высказал то, что я думаю более понятно — неясно на кого расчитан материал, на гуманитариев? Технарей такие неточные аналогии сбивают с толку.

        Эти аналогии по факту вредны, так как дают неправильное представление, и вообщем-то в большинстве случаев ошибочны. Потому что реляционные базы данных — это теория множеств, а не апельсины в магазине.


        1. timramone
          03.10.2015 23:18
          +1

          На не технических специалистов прежде всего. А так же на тех, кто ещё не определился, с целью рассказать им что-то о мире программирования и информатики. Если перейти по ссылкам на цитаты из оригинальной статьи (которые я для того и оставил, чтобы по ним переходить), то можно увидеть, как называются вопросы, цитаты из ответов на которые приводит автор:
          SQL and NoSQL Analogy for the Non-Technical
          How to explain a layperson why a developer should not be interrupted while neck-deep in coding
          How do you explain Machine Learning and Data Mining to non Computer Science people? (ненавижу этот quora, если честно)
          How to explain OOP concepts to a non technical person?


          1. grossws
            04.10.2015 00:05

            NoSQL базы данных хранят информацию, как вы бы хранили в книге рецептов. Когда вам нужно узнать, как приготовить торт, вы открываете книгу рецептов, и вся информация о том, как приготовить торт (ингредиенты, подготовка, замеска теста, запекание и всё в таком духе) находится на одной странице.
            Это обычно называется aggregate-oriented database, NoSQL более широкий класс, включающий, например, графовые базы.


    1. abatyuk
      04.10.2015 03:57
      +1

      Дружище, разработка — это просто, когда у тебя есть:
      — лет хотя бы 10 опыта разработки, причем и для себя, и для кого-то (за деньги)
      — хотя бы пара разных компаний, лучше 5, чтоб взгляд был разнообразный
      — опыт наступания на грабли всех возможных конфигураций
      — IQ больше возраста твоей бабушки
      — самое главное — любознательность.

      И вот тогда ты готов стать junior разработчиком, а не кнопконажимателем.


      1. Ununtrium
        04.10.2015 04:13
        +3

        Хорошая история. Как все это связано со статьей?


  1. defuz
    03.10.2015 19:53
    +4

    — Что такое объектно-ориентированное программирование?
    — Объекты – это существительные, методы – глаголы.
    Вот после таких чудо-объяснений и появляются армии горе-программистов. Я искренее надеюсь, что людей которые изучают программирование и computer science по подобным статьям будет мало или не будет вовсе, но что-то мне подсказывает, что я зря надеюсь. :(


    1. timramone
      03.10.2015 20:03
      -1

      А как вам аналогия на эту же тему от Стива Джобса? Которая вот сразу после той, что вы процитировали?


      1. baldr
        03.10.2015 20:32
        +3

        А что, если это сказал Стив Джобс — то сразу гениально?
        По мне — так очень многословно, пока читаешь — забываешь к чему он это говорит.

        Если эта статья была попыткой объяснить термины гуманитариям — мне кажется, что она провалится.
        Если технарям — то им такой язык не подойдет.


      1. Ununtrium
        03.10.2015 23:13
        +5

        Стив Джобс был программистом?


        1. timramone
          03.10.2015 23:22
          -7

          А разве не был? :) Даже в «Пиратах силиконовой долины» есть момент, где они с Возняком паяют платы для своего первого компьютера в гараже.


          1. icoz
            04.10.2015 11:52
            -1

            Не был.
            ru.m.wikipedia.org/wiki/Джобс,_Стив
            И поищите подкаст «брендятина», выпуск про apple.


  1. stavinsky
    03.10.2015 19:58
    -4

    Интересно, автор инфографики которая указана в начале поста пробовал хоть что-то серьезное сам писать?
    Я бы вот не сказал что питон такой уж простой язык. Очень хочется предложить автору вникнуть, да хоть бы, в asyncio в питоне и посмотреть что он после этого скажет про простоту.


    1. A1ien
      03.10.2015 22:29
      +3

      А с каких пор библиотечные модули относятся к языку? Язык — это конструкции при помощи которых составляются программы, библиотеки — это блоки составленные из этих конструкций которые могут реиспользоваться. Язык может быть простым или сложным, но это ни как не влияет на библиотеки написанные на этом языке. Например c++ в принципе не очень сложный язык, но boost — это монстр, порог вхождения в который не достижим для многих кто вполне себе пишет на плюсах используя Qt и в ус не дует.


      1. stavinsky
        04.10.2015 15:18
        -1

        Я конечно согласен что язык это не библиотеки. Но! Если я правильно помню начала большинства известных книг по Python, то там говорится что-то типа: python удобен тем что «в комплект входят батарейки». Прошу прощения точной цитаты не помню. Так вот сравнение boost и qt не является ничем общим с asyncio, так как в комплект c++ не входит boost.asio, или Qt sockets. Наверное тогда бы уж стоило в пример привести пример с STL, не правда ли(и то не все компиляторы в полной мере держат все что там написано)?

        Я согласен что Python этот тот язык на котором стоит учиться. Даже больше того я его сам порекомендую. Просто на мой взгляд в этой табличке создается впечатление что он примитивен. А это не так. Плюс, хорошо, возможно пример с asyncio был не совсем хорош, просто наболело. Но возьмем декораторы, генераторы, сопрограммы. Насколько легко вы это объясните новичку?


  1. kaatula
    03.10.2015 20:20
    -1

    Когда аналогия уже из первого пункта неверна — это как-то демотивирует читать дальше…


    1. stavinsky
      03.10.2015 20:21
      +1

      я сделал усилие, было интересно о чем речь и почему переводчику так понравилась статья


      1. kaatula
        04.10.2015 14:50
        -2

        Ну вот открыл снова, рандомно перемотал
        Попал на пункт 4, параллелизм
        И там опять неверная аналогия! :)


        1. stavinsky
          04.10.2015 15:24

          Наверное один плюс этой статьи все же есть. В ней упоминаются действительно вещи которые желательно бы знать человеку, связанному с IT. Есть отсылки на wiki и другие материалы. Думаю человеку, имеющему пытливый ум, будет интересно почитать про те технологии которые, возможно он не изучал ранее. А выводы из любого материала мы должны делать сами, и говорить о том что так уж ужасно что кто-то прочитает статью и станет плохим специалистом, не верно. Если человек сделает выводы основываясь на одной статье, он уже плохой специалист.


  1. stavinsky
    03.10.2015 20:21
    +3

    По поводу статьи: это был, безусловно, огромный труд. Как со стороны автора, так и переводчика. Но, блин, зачем? Автор пытался написать википедию? Не получилось, боюсь.


  1. TheTony
    03.10.2015 22:47
    +2

    Хм, а где же любимое: «Для того, чтобы понять рекурсию — надо понять рекурсию»? Или это слишком прямо ;-)


    1. PHmaster
      04.10.2015 11:29

      Для того, чтобы объяснить рекурсию, нужно сказать, что для того, чтобы понять рекурсию, нужно понять рекурсию.


  1. stargrave2
    04.10.2015 00:11
    +2

    В пункте 1.5 (возможно и других) ссылки на «Массив», «Дерево», итд ведут не напрямую на wikipedia.org, а на google.com?url=wikipedia.org. Думаю стоит их сделать сразу же прямыми — нет никакого смысла заставлять участвовать Google для того чтобы привести пользователя на wikipedia с habrahabr.


    1. timramone
      04.10.2015 09:50
      +1

      Ой. Поправил. Это наверняка из-за того, что я сначала писал перевод в гугл-доке.


      1. icoz
        04.10.2015 11:56
        +1

        проверьте все ссылки. У меня ни инфографика с начала статьи не открывается, ни статьи из п.1.5…


        1. timramone
          04.10.2015 19:37

          Ох… Чертов гугл :) Вроде все битые ссылки поправил!


  1. stargrave2
    04.10.2015 00:17
    +1

    Небольшая придирка по поводу пункта 2.6: если доказать что P=NP, то мы сможем «взламывать пароли (RSA...)» — думаю что лучше сказать «шифры» вместо паролей. Лично я даже не смогу с ходу назвать где есть взаимосвязь между RSA и паролями — они не пересекаются на практике, а вот шифры (пусть и не столь точно) всё же куда ближе.


    1. timramone
      04.10.2015 09:56

      Наверно имеется ввиду передача зашифрованного пароля по SSL.


  1. stranger777
    04.10.2015 14:43

    С рекурсией вышло мягко говоря не очень здорово, т.к. в аналогии описывается приращение цикла скорее, чем рекурсия. Да, любую рекурсию можно сделать циклом и наоборот. Но если уж автор описывает рекурсию, то наиболее просто её описать, представив себе два зеркала напротив друг друга. Комментарии здесь излишни, я думаю.
    А вот тут очень хорошо показана разница между циклом и рекурсией: https://www.ibm.com/developerworks/ru/library/wes-1307_col_paskin/, посему, мне кажется, этот пункт, с рекурсией, остро нуждается в том, чтобы его переписали.
    Также сколь проста, столь и кошмарна аналогия «Объект — существительное, метод — глагол». Она подходит лишь для тех, кто даже не собирается заниматься программированием, а так, любопытствует, хочет хапнуть с поверхности. Ничего, что конструктор объекта — это метод? ничего, что деструктор — тоже метод? их можно назвать глаголами, в том смысле, что «создать — уничтожить», но такая аналогия создаёт кривое представление о сути.
    Что касается объекта, я бы привёл аналогию с аптечкой, а ещё лучше аналогию со строгим учётом наркотических препаратов в больницах. Память — это полки с препаратами. Объект — сами препараты. Наш набор данных. Из этого набора берётся тот или иной препарат и применяется тем или иным образом. Это методы. Тут хорошо, кстати, раскрывается понятие полиморфизма: один и тот же препарат можно использовать и как лекарство, и как средство достижения удовольствия.
    Когда заказанный препарат приходит в больницу, оказываясь на полке — это можно назвать конструированием объекта в памяти. Когда мы используем препарат с той или иной целью — это методы, причём каждый препарат — это одно свойство, а каждый способ применения — это метод.
    Когда же срок годности препарата заканчивается, либо заканчивается он сам, либо необходимость в нём, что мы делаем? правильно: утилизируем препараты, метод утилизации препарата — это деструктор.
    И такая аналогия не совсем точна, учитывая сообщения объектов, но она, по крайней мере, полнее отражает понятие.


    1. grossws
      04.10.2015 15:11
      +1

      Да, любую рекурсию можно сделать циклом и наоборот.
      Доказать сможете?


      1. stranger777
        04.10.2015 15:49

        Формально, к сожалению, нет: я самоучка, а математический язык (теория множеств, конечных автоматов, машина Тьюринга и т.п.) уж слишком абстрактны для моих мозгов; в этом смысле я похож на человека, который кое-как понимает язык (математики), но говорить на нём не может. Увы. Мозгами обделён в этом смысле. Это доказанный до меня общеизвестный факт наподобие треугольника со сторонами 3, 4 и 5 единиц измерения (теорема Пифагора имеется в виду).
        Можно, конечно, выковырять доказательство гуглом (отдельный привет ресурсу arXiv.org) и привести его тут, но это не будет «моим доказательством».


    1. timramone
      05.10.2015 09:26

      А мне наоборот очень понравилась аналогия с рекурсией. Я не вижу тут цикла. Есть функция, которая принимает человека в зале, возвращает номер его ряда. Она определена через себя саму же и через константу 1 для тех, кто сидит в первом ряду. По-моему, это классическая рекурсия, и, на мой взгляд, одна из лучших аналогий в статье.
      Мне кажется, не нужно хотеть от аналогии многого — на то она и аналогия, чтобы не соответствовать на 100% :)


  1. Litiy
    06.10.2015 13:57
    +3

    Отличная статья. Бородатые программисты пытаются самоутвердиться за счёт неточностей любой аналогии. Но при этом для новичка данные аналогии необходимы для быстрого понимания и вхождения в сферу. Дальше картину мира можно уточнять и детализировать, тогда аналогия уйдет на второй план.
    Не люблю профессоров, которые не могут себе позволить аналогии, геймификацию, юмор для обучения, в силу их неточности. Например, преподавание формальных систем, лямбда-исчисления, формальной логики может быть веселым и понятным за несколько дней, после чего их можно уточнить детальными спецификациями, а можно сразу навалить математики на голову неподготовленного человека. Ставлю на то, что метод с аналогиями будет работать быстрее.


  1. Artiomtb
    06.10.2015 17:44

    Девушка: пусть он первая подойдёт

    Исправьте ошибку