Представляю вашему вниманию перевод очень ёмкой, и в то же время достаточно краткой (для такого масштаба проблемы) статьи Карла Чео. Я решил, что очень хочу сделать её перевод практически сразу, как только начал читать, и очень рад, что в итоге сделал это.
Для того, чтобы сделать обучение более
веселым и
интересным, представляю вам перечень важных теорий и концепций информатики, объяснённых с помощью аналогий с минимальным количеством технических деталей. Это будет похоже на очень быстрый курс информатики для всех с целью просто дать вам общее представление об основных концепциях.
Важные замечания:
- Пункты с неуказанным источником написаны мной самостоятельно. Поправьте меня, если вы заметите какие-то неточности. Предложите лучшую аналогию, если это возможно.
- Заголовки ссылаются на соответствующие им статьи в Wikipedia. Пожалуйста, читайте эти статьи для более серьезных и детальных объяснений.
- Аналогии — отличный способ объяснить материал, но они не идеальны. Если вы хотите по-настоящему понять перечисленные концепции, вам следует начать с фундаментальных азов и рассуждать, исходя из них.
Также зацените
эту инфографику (
вариант на русском), если вы просто начинающий программист.
Допустим вы заказываете
полную коллекцию серии фильмов о Гарри Поттере из 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
Больше информации: Sorting Algorithm Animations,
Beautiful and configurable visualizations of sorting algorithm
Кто-то в кино спрашивает вас, на каком ряду вы сидите. Вы слишком ленивы, чтобы посчитать, так что вы спрашиваете человека, сидящего перед вами. Вы просто будете должны добавить 1 к его ответу, чтобы получить номер своего ряда. Отличная идея, не так ли? Однако, человек перед вами сделает то же самое, и так дальше. В конце концов вопрос доберётся до первого ряда и человек на первом ряду ответит “Я в ряду номер 1!”. С этого момента правильное сообщение (увеличиваемое на 1 за каждый ряд) пройдёт весь свой путь обратно к тому, что изначально спросил.
Aaron Krolik/Quora
Есть ещё один пример, известный как эффект Дросте (на русском).
Медсестра несет поднос с пачкой какао и чашкой, на которой нарисовано уменьшенное изображение её, держащей всё то же самое, которое в свою очередь содержит ещё более маленькое изображение той же картинки, и так далее.
Тут вы можете найти ещё больше примеров эффекта Дросте, если хотите, чтобы вам стало сонливо.
Если вы ещё не до конца поняли рекурсию, попробуйте посмотреть тут… Ну а если поняли — продолжайте читать.
Давайте представим, что у вас течет труба в саду. Вы берете ведро и немного уплотнителя, чтобы починить её. Через некоторое время вы видите, что течь стало ещё больше и вам уже нужен водопроводчик с нормальными инструментами. В то же время, вы всё ещё используете ведро, чтобы как-то справляться с водой. Ещё через какое-то время вы замечаете, что открылся огромный подземный поток. Вам уже нужно как-то справляться с галлонами воды в секунду!
Вёдра больше не помогут. Вам нужен совершенно новый подход для решения проблемы, так как количество и скорость поступления воды увеличилась. Чтобы спасти город от наводнения, вам может понадобиться помощь правительства, чтобы построить дамбу, что требует огромного количества инженерных знаний и тщательно проработанной системы контроля.
Balaji Viswanathan/Quora
Термин “большие данные” описывает наборы данных на столько большие и сложные, что с ними невозможно работать с помощью обычных инструментов обработки данных.
Больше информации: Big Data by TED-Ed (video), What is Big Data and Hadoop (video)
Каждый специалист в области информатики и программист должен знать как минимум следующие структуры данных:
Представьте, что вы решили прогуляться, и ваша цель — добраться до самого высокого места. У вас есть карта, но на карте тысячи возможных путей. Вы слишком ленивы и у вас просто нет времени, чтобы попробовать каждый из них. Так что к черту карту! Вы просто идете вперёд с простой стратегией — быть жадным и близоруким. Вы просто выберете пути, которые как можно более наклонены вверх.
После того, как ваше путешествие завершилось и ваше тело стало измученным и уставшим, вы посмотрели на карту местности впервые. О боже мой! Вот грязная речка, через которую я должен был переправиться вместо того, чтобы идти вверх!
Жадный алгоритм делает лучший выбор в текущий момент времени и никогда не пересматривает своих решений.
На этот раз вы забираетесь на другую гору. Вы решили найти путь, который приведет вас на самую высокую точку. Однако у вас нет никакой карты и вокруг очень туманно. Для того, чтобы сделать вашу задачу проще, вы скачали мобильное приложение, которое отслеживает путь, который вы преодолели и измеряет вашу текущую высоту над уровнем моря.
Вы забираетесь на гору ещё раз и ещё раз. Каждый раз вы выбираете точно такой же путь, который привел вас к самой высокой точке, которую вы записали до этого, но где-то в середине вашего пути вы выбираете немного другой маршрут. Вы так же можете случайно выбирать различные точки старта, такой алгоритм называется восхождением к вершине со случайным стартом. Таким образом вы не привязываетесь к одной области и уменьшаете вероятность того, что вы застрянете. Алгоритм восхождения к вершине старается найти лучшее решение с помощью генерации соседствующих решений. Каждое такое решение генерируется на основе лучше решения на текущий момент, но с одним измененным элементом.
Это — гора Эверест, самый крупный вызов, с которым вы сталкивались. Ваша задача — добраться до вершины, но это очень непрактично забираться на Эверест помногу раз. У вас есть только один шанс. И вы стали куда более предусмотрительнее, чем раньше. Вместо того, чтобы всегда взбираться наверх, вы изредка двигаетесь вниз и находите новые пути, чтобы уменьшить риск пойти по неправильному пути. Чем выше вы забираетесь, тем меньше вероятность того, что вы пойдёте вниз.
Отец: *Пишет “1+1+1+1+1+1+1+1 =” на куске бумаги*
Отец: Чему это равно?
Ребенок: *Считает и тремя секундами спустя* Восемь!
Отец: *Дописывает ещё “+1”*
Отец: А теперь?
Ребенок: *Сразу же* Девять!
Отец: Ого, как ты посчитал так быстро?
Ребенок: Ты просто добавил ещё один!
Отец: Ты понял, что тебе не нужно пересчитывать, потому что ты запомнил, что это было восемь до этого. Отлично!
Jonathan Paulson / Quora
Пример выше описывает мемоизацию (на русском) (да, мемоизация — это не запоминание), подход к динамическому программированию сверху вниз, при котором результаты предыдущих рассчетов сохраняются для дальнейшего использования.
Больше информации: Dynamic Programming – From Novice to Advanced (TopCoder), Tutorial for Dynamic Programming (CodeChef)
Парат Шах привел прекрасную аналогию
тут, но она слишком длинная, чтобы включать её в эту статью.
Равенство классов 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.1 Как работают компьютеры
Компьютеры работают, добавляя сложность поверх сложности (
Computers work by adding complexity on top of complexity). Для того, чтобы вести машину, не обязательно понимать, как работает её двигатель. Сложные детали скрыты.
Так как же компьютер превращают бинарный код, нолики и единички в программы? Вот превосходное видео, в котором с помощью домино визуализируется, как компьютеры осуществляют бинарные вычисления на самом базовом, фундаментальном уровне:
Больше информации: Interactive explanation on how computer works
Больше информации:
The Freeze App Analogy,
Simple Wikipedia
Архитектура компьютера (на русском) и инженерия (на русском) -- огромные темы, включающие в себя такие разделы, как операционные системы (на русском), компиляторы (на русском) и другое.
Предположим, вы работаете секретарём в компании А. Вы должны отвечать на звонки, планировать встречи, набирать документы и всё в таком духе. Вы всегда должны переключаться между этим задачами в соответствии с приоритетами. Каждый раз, когда звонит телефон, вы должны остановиться, что бы вы ни делали, и ответить.
Параллелизм (параллельное выполнение) — это свойство программ и систем, которое позволяет задачам выполняться в перекрывающихся периодах времени.
В конце концов, вы уже не можете выполнять свою работу из-за огромного количества задач, связанных с вводом данных. Вы жалуетесь своему начальнику, и он радостно нанимает специально обученного человека, чтобы он занялся задачами ввода данных.
Параллелизм позволяет двум или более задачам запускаться одновременно при наличии у машины возможности использовать многопроцессорную обработку данных (на русском).
Однако, реализация концепций параллельного выполнения так же приносят и многие потенциальные проблемы, такие как состояние гонки.
Вот, что произойдет, если вы допустите выполнение параллельных транзакций в системе банкинга, а состояние гонки не будет обрабатываться:
- У вас есть $1000 на вашем счету
- Кто-то переводит вам $500, а вы снимаете $300 в банкомате
- Представьте, что обе транзакции происходят одновременно — обе транзакции будут считать. что ваш текущий баланс равен $1000
- Теперь, транзакция А добавляет $500 на ваш счёт и ваш текущий баланс становится равным $1500. Однако, транзакция B так же считала, что ваш текущий баланс равен $1000, и она, допустим, завершится на одну миллисекунду позже, чем транзакция А. Она вычтет $300 из $1000 и сделает ваш текущий баланс равным $700
- Теперь у вас есть $700 вместо $1200, так как транзакция В перезаписала действия транзакции А
- Это произошло, так как банковская система не принимала в расчет текущих происходящих транзакций
Итак, что вы можете сделать, чтобы справиться с такой ситуацией? Одним простым способом является взаимное исключение.
Теперь, вне зависимости от того, какие транзакции проходят, система будет
лочить [жаргонизм, самое близкое по смыслу определение на русском — блокировать от действий других транзакций,
прим. пер.] счета, принимающие участие в транзакции.
На этот раз, в тот момент, когда совершается транзакция А, ваш счет заблокируется. Вы не сможете снять деньги в банкомате. Он будет разблокирован, как только транзакция А завершится.
Таким образом, взаимное исключение решает проблему, не так ли? Да, но никто не хочет, чтобы банкомат отвергал все запросы каждый раз, когда происходит какая-нибудь транзакция.
Давайте немного изменим наше решение.
4.4.1 Бинарный семафор
Теперь давайте установим разные уровни приоритетов для разных типов транзакций. Скажем, запрос снятия наличных имеет более высокий приоритет, чем банковский перевод. Когда вы снимаете деньги в банкомате, транзакция А (которая про перевод денег между счетами) остановится, позволяя транзакции В обрабатываться первой, так как она имеет более высокий приоритет. Транзакция А продолжит выполняться, как только транзакция В завершится.
4.4.2 Семафор с подсчётом
Двоичный семафор прост. 1 = продолжить транзакцию. 0 = ждать. С другой стороны, подсчитывающий семафор позволяет более одному процессу выполняться одновременно.
Предположим, вы менеджер камеры хранения в спа-салоне и у вас есть 30 камер. Вам нужно отслеживать количество ключей, которое у вас есть, каждый раз, когда вы получаете или даёте кому-то ключ, хотя вы можете и не знать этого кого-то. Если все камеры заняты, люди должны вставать в очередь за ними. В тот момент, когда кто-нибудь закончит, он передаст свой ключ первому человеку в этой очереди.
Взаимная блокировка — это еще одна стандартная проблема с параллельными вычислениями.
Давайте используем похожу аналогию с банковской системой, но с другим сценарием. На всякий случай напомню, что доступ к банковскому счету блокируется, если происходит какая-то транзакция.
- Питер переводит вам $1000 (транзакция А), а вы переводите ему $500 в то же самое время (транзакция В)
- Транзакция А блокирует счет Питера и снимает $1000 с его счета
- Транзакция В блокирует ваш счет и снимает $500 с вашего счета
- Теперь, транзакция А пытается получить доступ к вашему аккаунту, чтобы добавить на него $1000 от Питера
- В то же время, транзакция В так же пытается добавить ваши $500 на счет Питера
Однако, так как обе транзакции не завершены, ни одна из них не может получить доступа к заблокированному счету. Обе ждут завершения друг друга. Взаимная блокировка.
А вот пример из реальной жизни:
Парень: пусть она первая подойдёт
Девушка: пусть он первая подойдёт
Так и умерла многообещающая любовная история
Padmakar Kalghatgi/Quora
5.1 Компьютерное хакерство [взлом]
Хакерство похоже на взлом дома. Ниже приведены некоторые популярные хакерские техники:
Попробуйте сотни или тысячи различных ключей. Опытный грабитель сначала попробует самые часто используемые ключи.
Атака полным перебором пробует каждый возможный пароль, и обычно начинает угадывать с самых распространенных паролей, таких как «123456», «йцукен» и т.п.
Пара только что въехала в соседнюю квартиру. Они выглядят очень милыми и дружелюбными, часто приглашают вас на ужин. Однажды вы упоминаете, что вы скоро уезжаете в двух-недельный отпуск. Они радостно предлагают вам позаботиться о вашей собаке. Вы оставляете им свой запасной ключ. С тех пор вы о них ничего не слышите.
Социальная инженерия — это попытка обмана людей с целью заставить их раскрыть их личную информацию.
Взломщик проверяет каждый возможный вход с целю найти наиболее простой способ попасть внутрь. Кто знает, может быть кто-нибудь оставил открытым окно на втором этаже?
Взломщик прикидывается водопроводчиком, и вы сами открываете ему дверь. Он чинит вашу текущую трубу и все выглядит отлично. Но после его ухода вы обнаруживаете, что ваши украшения пропали.
Троян — вредоносная программа, которая притворяется полезной, запуская вредоносный код в фоне.
Ваш замок заклинило и вы вызвали слесаря. Он починил ваш замок и тайно сделал себе дубликат ключа.
Руткит получает права администратора на компьютере каким-нибудь образом (например, используя социальную инженерию), после чего специальным образом маскирует необходимые файлы так, что его сложно обнаружить антивирусным ПО.
Приведем аналогию с книжным магазином.
Представьте, что 100 человек приходят в ваш маленький книжный магазин в одно время. Ваш книжный магазин весь забит и больше никто не может войти. Вы не можете попросить их уйти, потому что не похоже, чтобы они приходили группами. Они может быть и не знают друг друга вовсе. Многие из них кажутся реально заинтересовавшимися вашими книгами. Некоторые даже спрашивают вас, где находятся книжные полки. Кто-то на кассе пытается расплатиться копейками.
Люди приходят и уходят часами. Все они выглядят абсолютно нормально. К концу дня вы понимаете, что продали всего одну книгу. Помните парня, который расплачивался копейками?
DDoS пытается вывести из строя ваш сайт или сервис, просто затапливая, переполняя его посетителями.
Ссылка на оригинальную визуализацию
Допустим, Элис и Боб хотят отправлять что-то друг другу. Чтобы убедиться, что никто не сможет увидеть, что они друг другу отправляют, они запирают это в коробке. Они делают 2 идентичных (симметричных) ключа для замка и встречаются, чтобы обменяться этими ключами.
Обмен одинаковыми ключами сносно работает для двух людей. Что если Элис хочет обмениваться вещами с другим парнем по имени Карл, и Элис так же не хочет, чтобы кто-то видел эти вещи. Элис не может использовать тот же замок и ключ, которые они использовали с Бобом, так как Боб сможет открыть коробку своим ключом.
Конечно Элис может обменяться совершенно новым и соответственно другим ключом и замком с Карлом, но что если Элис хочет обмениваться вещами с 10 различными людьми? Ей придется владеть 10 различными ключами!
Так что Элис приходит в голову отличная идея. Она делает один ключ (приватный ключ). Она так же раздаёт одинаковые замочки (публичный ключ) её друзьям. Любой может запереть замок (зашифровать), но только она сможет открывать коробки (расшифровывать). Теперь, любой может отправлять Элис вещи, используя замки, которые она раздала, так что Элис больше не нужно иметь различные ключи для разных людей.
Если Элис захочет послать что-нибудь Карлу, она попросит у Карла замок (публичный ключ), с помощью которого она сможет запереть (зашифровать) её вещи и отправить Карлу.
Базовый принцип таков: каждый имеет его собственный приватный ключ для расшифровки сообщений и снабжает отправителей публичными ключами для зашифровки сообщений.
Больше информации: Public Key Cryptography: Diffie-Hellman Key Exchange (video)
Вы выясняете
всё, что нужно сделать, и записываете требования. Это как водопад: тут нет пути назад, пока вы не начнете с самого начала. Вы перемещаетесь к следующей фазе только когда текущая фаза завершена.
Вы понимаете некоторые вещи, которые вы должны сделать в первую очередь. Затем последовательно улучшаете, эволюционируете, адаптируете ПО в процессе разработки.
Приведу некоторые популярные реализации гибкой методологии разработки:
6.3 Разработка ПО в реальном мире
Итак, вы научились программировать. Вы пишите хороший и красивый код (надеюсь), и всё прекрасно. Дайте мне представить вам
ковбойское программирование — методологию разработки, которую не преподают в колледже.
Ещё вы удивляетесь, почему вы застряли с оценкой времени разработки:
И методологии часто неправильно используют:
Dilbert
Dilbert
Ну вот и всё. Информатика в двух словах.
Пожалуйста советуйте добавить любые другие теории и концепции информатики, те, что вы считаете важными и запутанными.
Вопрос 1: В чем разница между ученым-информатиком и программистом
Специалист в информатике (computer scientist) это как физик, а программист — это как инженер.
HerbN/Stack Overflow
Вопрос 2: что такое программирование?
Написание очень подробных инструкций для тупой, но послушной машины.
Что это значит? Представьте, что вы должны научить ребенка ходить в душ. Ребенок знает только как следовать вашим инструкциям. Так что вы говорите ребенку:
- Зайти в ванну
- Включить душ
- Встать под душ
- Взять мыло
- И так далее...
О, черт, ребёнок не снял свою одежду перед тем, как встать под душ!
Вот как работает компьютер. Вы должны сообщать компьютеру, что именно ему нужно сделать. Он не знает, как предполагать и никогда не подумает о последствиях.
Вопрос 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
В ресторане вы заказываете еду (вызываете API) из меню (набор методов API). Как только ваша еда готова (готов ответ от API), официант принесет вам еду.
Базовая идея такова: попросите то, что вам нужно, и система вернет вам результат, не раскрывая того, как именно она это сделала.
Вопрос 10: В чем разница между SQL и NoSQL базами данных
NoSQL базы данных хранят информацию, как вы бы хранили в книге рецептов. Когда вам нужно узнать, как приготовить торт, вы открываете книгу рецептов, и вся информация о том, как приготовить торт (ингредиенты, подготовка, замеска теста, запекание и всё в таком духе) находится на одной странице.
SQL похож на покупку ингредиентов для рецепта. Для того, чтобы положить все нужные ингредиенты в корзину, вы должны подойти ко множеству разных мест, чтобы взять нужный ингредиент. В конце концов, ваша корзина будет наполнена ингредиентами, которые вы собирали до этого по магазину.
Не было бы лучше, если бы магазин был бы организован по рецептам, так что вы могли бы просто придти в одно конкретное место в магазине и взять всё, что вам нужно? Вы бы находили одинаковые ингредиенты (например, яйца) в 50 различных местах, чего было бы сложно добиться мерчандайзерам магазина, но со стороны покупателя было бы на много проще и быстрее найти то, что он искал, при такой организации.
mgoffin/Stack Overflow
This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.