Мое первое знакомство с Пикабу
Здравствуйте, мои маленькие любители Пикабу. Я бы хотел обсудить одну значительную часть этой платформы, а именно вопрос, связанный с людьми, которые ею пользуются. Я недавно присоединился к этой платформе с намерением делиться своими записями о алгоритмах и программировании в общем.
Существует мнение, что на платформе Пикабу новые пользователи могут столкнуться с давлением со стороны более опытных участников сообщества, особенно в случаях, когда их взгляды расходятся. Это явление можно сравнить с "дедовщиной" в военных коллективах, где старшие по службе могут оказывать давление на новобранцев.
Вы можете сказать: "Если вам что-то не по душе, возможно, стоит поискать место, которое будет вам более удобно". В ответ на это можно сказать: "Не вижу смысла покидать место, которое мне нравится, из-за несогласия с некоторыми людьми." Проблема состоит в том, что многие люди здесь демонстрируют токсичное поведение, негативное отношение и противоречивость. Например, они могут безосновательно критиковать вашу публикацию и высказываться в ваш адрес оскорбительно (пример можете посмотреть на мои предыдущие посты)
Система рейтинга на Пикабу может вызывать недовольство, поскольку она позволяет более опытным пользователям блокировать новичков, если их мнения расходятся, что происходит при понижении рейтинга до отрицательных значений. Я считаю, что система рейтинга может быть излишней, так как она порой создаёт трудности не только для отдельных лиц, но и для тех, кто выражает собственное мнение.
К тому же, вызывает улыбку ситуация с рекламой телеграм-аккаунтов: хотя на Пикабу разрешено продвигать личные социальные сети, некоторые пользователи по-прежнему воспринимают это отрицательно. Большие рекламные баннеры и рекламные акции курсов на Пикабу, кажется, не вызывают возражений, в то время как небольшие ссылки на Телеграм могут стать причиной недовольства и протестов среди старых пользователей Пикабу.
Пикабу - это платформа с большим трафиком, что является её несомненным преимуществом. Однако, если существует риск быть забаненным без нарушения правил, только за выражение своего мнения или стремление извлечь выгоду из своих усилий, то ценность этого трафика может быть под вопросом.
Важно уважать время и труд каждого, а также поддерживать конструктивный диалог. Если пост вызывает негативную реакцию, всегда можно просто пропустить его, вместо того чтобы оставлять негативные комментарии. До новых встреч.
Только посмотрите на него! К скольким сайтам он руку приложил!
Платформы для онлайн-обучения: что вы о них думаете? Поделитесь мнением!
Онлайн-курсов становится все больше, и нам интересно собрать статистику. Пожалуйста, пройдите небольшой опрос и поделитесь своим мнением!
Алгоритмы: Открытие тайн кода
Здравствуйте, мои маленькие любители алгоритмов. Я покажу вам основные принципы, которые демонстрируют необходимость алгоритмов, обучу вас решению элементарных задач и введу вас в понятие O-нотации. Статья предназначена для тех, кто только начинает свой путь в программировании, так что профессионалам она может показаться менее интересной.
Что такое алгоритм?
Алгоритм — это последовательность шагов, предназначенных для решения определённой проблемы. В общем смысле, любой код, который решает задачу, может быть охарактеризован как алгоритм. Понимание того, какой алгоритм лучше всего подходит для определённых условий, может существенно повлиять на эффективность вашего программного решения. Первоначальный этап создания алгоритма заключается в осмыслении проблемы, для решения которой он предназначен.
Пример задачи бинарного поиска
Начнем с примера задачи бинарного поиска. Допустим, вам нужно отыскать фамилию в телефонном справочнике, который начинается на букву “К”. Вместо того чтобы листать с начала, вы быстрее найдёте нужную страницу, открыв справочник посередине, так как “К” вероятно будет ближе к центру. Такой же подход удобен при поиске слова на букву “О” в словаре - начинать стоит с середины. Бинарный поиск — это универсальный алгоритм, применимый для решения многих задач поиска. Он работает с предварительно отсортированным массивом элементов. Если искомый элемент содержится в массиве, бинарный поиск указывает его позицию. В случае отсутствия элемента алгоритм возвращает значение null. В дальнейшем я объясню, почему важна сортировка массива перед началом поиска.
Как работает метод бинарного поиска
Давайте рассмотрим, как работает метод бинарного поиска на примере игры. Представьте, что я загадал число от 1 до 100, и ваша задача — угадать его, используя минимальное количество попыток. После каждой вашей догадки я буду отвечать: “слишком мало”, “слишком много” или “верно”. Если начать угадывать последовательно, начиная с 1, это будет неэффективно. Например, если я загадал число 99, вам потребуется 99 попыток, чтобы добраться до него. Теперь представим более эффективный метод — бинарный поиск. Начнем с середины диапазона, то есть с 50. Если я скажу, что это “слишком мало”, вы тут же исключите все числа от 1 до 50. Затем попробуйте число 75. Если я скажу “слишком много”, вы исключите числа от 76 до 100. Таким образом, каждый раз вы сокращаете количество возможных вариантов вдвое. Следующая попытка будет 63, что находится посередине между 50 и 75.
Бинарный поиск эффективен, потому что с каждой попыткой вы исключаете половину оставшихся чисел. Независимо от того, какое число я загадал, вы сможете угадать его за 7 или меньше попыток. Это показывает мощь алгоритмов и как они могут упростить решение задач. В среднем, бинарный поиск в списке из ( n ) элементов находит элемент за (log2n) шагов, в то время как линейный поиск потребует в среднем ( n ) шагов. Это делает бинарный поиск значительно быстрее, особенно для больших списков.
Реализация бинарного поиска на псевдокоде
Объяснение
Устанавливаем начальные границы поиска: Начало и Конец.
В цикле Пока проверяем, что начальная граница не превысила конечную.
Находим индекс Середина как среднее между Начало и Конец.
Сравниваем элемент в середине с искомым элементом:
Если они равны, возвращаем индекс Середина.
Если элемент в середине меньше искомого, сдвигаем начальную границу за середину.
Если элемент в середине больше искомого, сдвигаем конечную границу перед середину.
Если элемент не найден, возвращаем -1.
Реализация алгоритма бинарного поиска на c++
Анализ эффективности алгоритмов
Когда мы анализируем новый алгоритм, важно обсудить его эффективность. Обычно предпочтительнее использовать алгоритм, который оптимизирован по времени или памяти.
Бинарный поиск
Давайте рассмотрим бинарный поиск. Какое преимущество он предоставляет с точки зрения времени? В классическом подходе мы проверяем каждый элемент последовательно. Если у нас есть список из 100 элементов, нам может потребоваться до 100 проверок. В случае списка из 4 миллиардов элементов, число попыток может достигнуть 4 миллиардов. Время выполнения в таком случае растет пропорционально размеру списка, что является примером линейного времени выполнения.
С бинарным поиском ситуация иная. В списке из 100 элементов потребуется всего лишь 7 проверок. А для списка из 4 миллиардов элементов — не более 32 проверок. Довольно впечатляюще, не правда ли? Бинарный поиск работает за логарифмическое время, что делает его значительно более эффективным.
“Большое О”
“Большое О” - это специальная нотация, которая описывает скорость выполнения алгоритма. Это полезно знать, потому что время от времени вам может потребоваться использовать алгоритмы, разработанные другими людьми, и важно понимать, насколько быстро или медленно они работают.
Время выполнения алгоритмов увеличивается с разной скоростью. Например, Анна разрабатывает алгоритм сортировки для большой базы данных в библиотеке. Ее алгоритм будет работать, когда пользователь будет искать книгу, и поможет вычислить наиболее релевантные результаты.
Это один из примеров того, как время выполнения двух алгоритмов увеличивается с разной скоростью. Анна пытается выбрать между сортировкой пузырьком и быстрой сортировкой. Ее алгоритм должен работать быстро и правильно. С одной стороны, быстрая сортировка работает быстрее. У Анны есть всего 10 секунд, чтобы отсортировать данные; если она не успеет это сделать, то пользователь может уйти. С другой стороны, сортировка пузырьком проще в написании и вероятность ошибок в нем ниже. Конечно, Анна не хочет допустить ошибку в коде сортировки данных. И тогда, для большей уверенности, Анна решает измерить время выполнения обоих алгоритмов для списка из 100 элементов.
Предположим, проверка одного элемента занимает 1 миллисекунду (мс). При сортировке пузырьком Анне придется проверить 100 элементов, поэтому сортировка займет 100 мс. С другой стороны, при быстрой сортировке достаточно проверить всего 7 элементов (log2100log2100 равно примерно 7), и сортировка займет 7 мс. Но реальный список может содержать более миллиарда элементов. Сколько времени в таком случае потребуется для выполнения сортировки пузырьком? А при быстрой сортировке?
Анна проводит быструю сортировку с 1 миллиардом элементов, и на это уходит 30 мс (log21,000,000,000log21,000,000,000 равно примерно 30). “32 мс! - думает Анна. - Быстрая сортировка в 15 раз быстрее сортировки пузырьком, потому что сортировка пузырьком для 100 элементов заняла 100 мс, а быстрая сортировка заняла 7 мс. Значит, сортировка пузырьком займет 30 х 15 = 450 мс, верно? Гораздо меньше отведенных 10 секунд”. И Анна выбирает сортировку пузырьком. Верен ли ее выбор?
Нет, Анна ошибается. Глубоко ошибается. Время выполнения для сортировки пузырьком с 1 миллиардом элементов составит 1 миллиард миллисекунд, а это 11 дней! Проблема в том, что время выполнения для быстрой сортировки и сортировки пузырьком увеличивается с разной скоростью.
“Большое О” описывает, насколько быстро работает алгоритм. Предположим, имеется список размера n. Сортировка пузырьком должна проверить каждый элемент, поэтому ей придется выполнить n операций. Время выполнения “Большое О” имеет вид O(n).
А теперь другой пример. Для проверки списка размером n быстрой сортировке потребуется loglogn операций. Как будет выглядеть “Большое О”? O(loglogn).
В общем случае “Большое О” выглядет так: O(f(n)), где f(n) - это количество операций, которые придется выполнить алгоритму. Оно называется “Большое О”, потому что перед количеством операций ставится символ “О” (а большое - потому что в верхнем регистре).
Примеры “Большого О”
Вот пять типичных примеров “О-большого”, которые часто встречаются в алгоритмах и структурах данных. Они представлены в порядке от самого быстрого к самому медленному:
O(loglogn), или логарифмическое время. Это время, которое обычно требуется для выполнения бинарного поиска.
O(n), или линейное время. Это время, которое обычно требуется для выполнения простого поиска.
O(n loglogn). Это время, которое обычно требуется для выполнения эффективных алгоритмов сортировки, таких как быстрая сортировка.
O(2n2). Это время, которое обычно требуется для выполнения медленных алгоритмов сортировки, таких как сортировка выбором.
O(n!). Это время, которое обычно требуется для выполнения очень медленных алгоритмов, таких как решение задачи о коммивояжере.
Эффективность алгоритмов определяется не по времени выполнения в секундах
Алгоритмы с временем выполнения O(log n) работают быстрее, чем алгоритмы с временем выполнения O(n). И чем больше размер списка, по которому производится поиск, тем заметнее становится эта разница.
Эффективный алгоритм может быть не сразу очевиден, и в зависимости от специфики данных, операционной среды (например, возможности использования параллелизма) и конкретных целей, наилучшим решением может стать один из множества различных алгоритмов.
Это краткое введение — лишь небольшая часть огромного мира алгоритмов. Надеемся, что оно вдохновит вас на дальнейшее изучение различных алгоритмических подходов и алгоритмов, которые мы рассмотрели.
Реализация алгоритмов
Все рассмотренные здесь алгоритмы были реализованы и задокументированы с целью помочь вам лучше понять, как использовать эти алгоритмы и даже как реализовать их самостоятельно. Это знание будет полезно при чтении статей по алгоритмам и при их применении на практике.
Рекомендации по чтению
Вот несколько книг, которые я могу порекомендовать для изучения алгоритмов:
“Алгоритмы: построение и анализ” - Томас Х. Кормен, Чарльз Э. Лейзерсон, Рональд Л. Ривест и Клиффорд Штайн. Это классический учебник, который подробно описывает большинство важных алгоритмов.
“Алгоритмы на Python” - Майкл Т. Гудрич, Роберто Тамассиа и Майкл Голдвассер. Эта книга объясняет алгоритмы на языке Python, что может быть полезно для тех, кто хочет изучать алгоритмы на конкретном языке программирования.
“Структуры данных и алгоритмы в Java” - Майкл Т. Гудрич и Роберто Тамассиа. Это еще одна отличная книга для изучения алгоритмов, особенно если вы предпочитаете Java.
“Алгоритмы + структуры данных = программы” - Никлаус Вирт. Это классическая книга, которая объясняет, как алгоритмы и структуры данных работают вместе, чтобы создать эффективные программы.
Пожалуйста, учтите, что выбор книги зависит от вашего уровня знаний и опыта в программировании. Некоторые книги могут быть более сложными для понимания, чем другие. Поэтому рекомендуется начать с более простых книг, если вы только начинаете изучать алгоритмы.
Проверяем является ли дерево бинарным деревом поиска
Продолжаем цикл статей про деревья. Основной целью этого цикла является практика и подготовка к собеседованиям а не промышленные решения (о них я расскажу в следующих частях). В этой части мы еще раз воспользуемся рекурсией для решения одной популярной задачи.
Задача - проверить является ли дерево ли бинарным деревом поиска?
Для начала определимся что такое бинарное дерево поиска:
У дерева не более двух наследников (оно бинарное)
В левом подграфе значения всех узлов меньше, чем значение самого узла
В право подграфе значения всех узлов больше, чем значение самого узла
Такое дерево называется Бинарным Деревом Поиска (Binary Search Tree). Но не стоит путать его с балансированым бинарным деревом. Про сбалансированные бинарные деревья мы поговорим в следующих частях.
Посмотрим на примеры бинарных деревьев поиска:
В примерах ниже если вы возьмете любой узел и проверите значения его левого подграфа то все эти значения будут меньше чем сам узел. Аналогично справа все значения будут больше:
Теперь обратим внимание на деревья нарушающие требуемую логику:
В дереве слева есть следующие недостатки:
Значение 13 хоть и больше 10 но должно быть меньше 12
Значение 21 хоть больше 12 но должно быть меньше 19
В дереве справа
14 больше 11 но должно быть меньше 12
Давайте попробуем написать простейшее решение данной задачи:
Из требований складывается впечатление что мы должны:
Обойти все узлы и применить к ним единообразную логику (те написать функцию которая вызывает саму себя)
Проверить что левый наследник меньше текущего значения узла
Проверить что правый наследник больше текущего значения узла
Напишем решение для данного невалидного дерева:
И так код:
к сожалению это решение - лишь частично верное.
Чтобы код был более читаем я изобразил это графически:
node - это текущий узел где мы "находимся"
node.value это текущее значение узла, на картинке ниже значение текущего узла 18
node.left это ссылка на левого наследника.
К сожалению такое решение не является верным.
Данная рекурсия берет в учет лишь 3 переменных - значение текущего, левого и правого узлов. Поэтому ниже будет считаться правильным хотя узел 13 слева хоть и больше своего предка (10) но никак не учитывает что он должен быть меньше 12.
Решение задачи не так очевидно на первый взгляд.
Первая попытка никак не учитывает значения дальних предков (те узлов выше родительского). Поэтому наша рекурсия должна будет передавать какую то информацию "сверху". Но какую информацию?
Рассмотрим следующий граф:
Проанализируем какие есть ограничения на значения узлов:
Узел 12 может быть любым числом на него не ограничений, разве что если мы полагаем что каждый узел является целочисленным (integer) типом то он ограничен между Integer.MIN и Integer.MAX
Узел 10 (слева) должен быть меньше 12 но также он может быть больше чем Intger.MIN
Узел 11 - имеет все ограничения примение к 10 И он имеет новое ограничение - он должен быть больше 10.
Узел 7 имеет ограничения которые есть у узла 10 плюс и также он должен быть меньше 10.
Узел 6 имеет ограничения которые есть у узла 7 плюс он должен быть меньше 7
Визуализируя описанно мы получаем вот такую штуку:
под MIN, MAX подразумевается Integer.MIN, Integer.MAX - сделано чтобы уместить широкую картинку
Какие выводы мы можем сделать:
Рекурсия должна учитывать как минимум 2 значения приходящие "сверху" те левую и правую границы
Передаваемая влево минимальное значение является минимальным пришедшим сверху
Передаваемое влево максимальное значение является максимальным пришедшим сверху
Передаваемое влево максимальное - текущее
Передаваемое вправо минимальное - текущее
Давайте перепишем наш код согласно этой логике:
Код мог бы быть меньше но я написал его именно так с целью упрощения чтения и понимания.
Рассмотрим все пункты которые я отметил:
A - мы проверяем условие что значение каждого узла лежит в рамках передаваемых min/max значений
B - минимальное значение передаваемое левому наследнику копируется "сверх"
C - минимальное значиение передаваемое правому - текущее значение
D - максимальное значение передаваемое левому - текущее
F - максимлаьное передаваемое правому копируется "сверху"
Выводы
Задача успешно решается рекурсией
Задача явно не так очевидна и первое решение скорее всего займет больше 30 минут и поэтому не подходит для собеседований (хотя это моё личное мнение)
Это не единственный подход к решению этой задачи но сейчас мы практикуем именно простые рекурсии. Подобную задачу вы скорее всего встретите при собеседованиях в FAANG или подобные большие компании. Такое решение скорее всего будет зачтено интервьювером.
Всем кому интересно узнать про промышленную разработку приглашаю в мой котоджавовский телеграм канал.
Есть ли какие-нибудь книги, сайт, видеокурс и т.д., с помощью которых можно посмотреть на IT «сверху»?
Я уже являюсь разработчиком. Программирую, изучаю полезные для себя навыки по своему направлению и т.д.
Появилось желание разобраться в том, как работает IT сфера в общем.
К примеру, в таких вопросах, как:
Какие основные направления в ней есть (и, хотя бы поверхностно, покопаться в каждом из них)
На что они подразделяются
Как они связанны между собой
Почему одни направления развиваются, другие же приходят в упадок
Как IT рынок зависит от «реального сектора экономики» и т.д.
Безусловно, я смотрел видео в интернете на эти и похожие темы, но, по большей части, информация, которая там есть, весьма разрозненна и не даёт возможности начать ориентироваться в том, что происходит в IT секторе в целом и в закономерностях, которые в нём существуют.
Куда чаще это видео в стиле «топ 10 способов стать магом после 30-ти» и «почему искусственный интеллект заменит (или не заменит) гребцов через 10 лет».
Ответ на пост «Когда правильно расставил приоритеты»
Типичный тестировщик:
Ребята , не забывайте что баги мы ищем ради фана!
А за деньги мы ищем баги!
Ответ на пост «Чел разрушил цифровые мифы»
Автор этих рвущих жёппы тезисов просто решил забайтить народ за эти самые жопы.
На самом деле это довольно капитанские и бессмысленные в большинстве своём утверждения. Ну кроме тех, которые чушь.
По порядку:
"Без кода" - чей-то чужой код.
Так и есть. Но что автор тезиса хотел сказать этим? Дело в том, что чем меньше кода решают одну и ту же проблему, тем лучше. Код - это нагрузка. За ним нужно ухаживать как за грядкой. Если вы можете решить свои продовольственные вопросы получая всё с маленькой грядки, то это во всех смыслах лучше, чем ухаживать ха огромным огородом ради того же самого набора продуктов. В случае, если этот огород ещё и не ваш, а продукты вы получаете, то это вообще идеально! Все довольны.
"Облако" - чужие сервера
Тут то же самое, что и с пунктом выше. Держать свой датацентр и свои сервера - это тот ещё геморрой. Это удел параноиков (по долгу службы или по личным предпочтениям). Если вам нужны не сервера, а результат их работы, то зачастую лучше сконцентрироваться но собственных бизнес-задачах и не пытаться автономно обеспечить себя всем.
Представьте, если бы компании не останавливались на развертывании своих датацентров, а заморачивались еще и собственным производством микрочипов, чистого кремния, добычей и очисткой металлов, производством всего спектра оборудования для производства всего спектра оборудования... Если кто-то до сих пор держит свои датацентры, то это всего лишь вопрос недоработки. Например нет нужных стандартов, нездоровый рынок в плане монополии и т.д.
"Машинное обучение" - статистика на стероидах
Ага. Но так и что же? Вы так говорите, как будто это что-то плохое.
"Искусственный интеллект" - большой объём "условных операторов" "Что Если"
А вот тут как раз чушь для хайпа или от непонимания.
ИИ (в том виде, в котором этот термин употребляется сейчас в применении к нынешним технологиям) - это не куча "ифов". Это упрощенная модель мозга, которую именно что обучили на огромном массиве данных. Как уложились данные в этой модели мозга и как получается результат нам не сильно понятнее, чем как это присходит в голове крысы, решающей задачи поиска в лабиринте. Нынешние нейронные сети, если не впадать в бессмысленное утрирование, это продукт фазового перехода сложности и объёма данных. Разница между набором условий в классическом алгоритме и нейронной сетью как между инфузорией туфелькой и смышлёным камариком, который на своих нейронах умеет в навигацию, сенсоры, адаптивность и прочее...
Подите реализуйте такого же камарика на условиях. Не имитацию, а именно функциональный аналог. А потом будете говорить что нейросеть - это ифы.
"Блокчейн" - неэффективная база данных, безопасность которой обеспечена всеобщим недоверием.
Когда заходит речь об эффективности, нужно говорить и о критериях оценки оной. Эффективность - это понятие не простое. Вот пушка не эффективна для охоты на воробья, а по испанскому галеону прошлых веков она вполне годится стрелять. Эффективность нужно рассматривать в конкретном применении. Для того, для чего придумали Блокчейн, он очень эффективен. А именно он эффективен для хранения и верификации цепочек транзакций в среде без доверия. Просто нет альтернатив.
"Биг дата" огромный объём данных с которым никто не знает что делать.
Тоже, знаете ли... Если вы не знаете, то это не значит, что никто не знает. Да, постоянно находятся новые применения, и это везде так. Иногда бигдату имеет смысл собирать на будущее.
"Умный дом" - дом, который знает о твоей диете больше тебя.
Вообще бред какой-то. Правильно в наших реалиях так: Умный дом - это штука, которая создаёт проблем больше, чем решает, и вопреки предназначению постоянно раздражает пользователей неочевидным поведением в вопросах, в которых привычна простота.
Я тоже большой поклонник вот этой всей херни с умным домом, но это не значит, что рядом с такими энтузиастами как я приятно и комфортно жить. Особенно когда я в командировке без связи, а свет почему-то включается в спальне в 3 часа ночи каждые десять минут.
"Виртуальная реальность" - модный способ игнорировать окружающую действительность.
Это скорее про социальные сети. Виртуальная реальность - это как ИИ (до недавних пор). Мы сраные десятилятия "вот вот" придём к этой самой виртуальной реальности, а на деле получаем 3д-телевизоры на полтора раза поиграться, гугл-в-глас - очки о которых все забыли уже, тошнотворные задержки и невозможность нормально "ходить"=). Всё это впереди, но когда - это пока не понятно. Не наступил момент фазового перехода, как с нейросетями сейчас происходит.
Если с нейросетью уже можно пообщаться получив много пользы, то провести с пользой время в VR пока есть ГОРАЗДО меньше возможностей.
"Квантовые вычисления" - технология смысл которой даже разработчики полностью не понимают.
Ну да, но там всё не так сложно, если не лезть вглубь и не пытаться что-то с помощью этого сделать. =) Очередная научная свистоперделка для обывателей, которая выльется в реальные полезные технологии ещё когда-нибудь потом в будущем. А пока нужно иметь большую головчу и гору энтузиазма, чтобы копаться и разбираться вэ том. Жаль, что процент таких людей не велик.
"Интернет вещей" - способ сделать так, чтобы даже твой тостер можно было взломать через интернет.
Ну тут, если сцедить яд, то примерно так и есть=). Однако это тенденция и она есть. Со временем это выльется в красивую незаметную магию технологий будущего. Будущего, в котором вам не надо будет задумываться о связи, о настройках этой связи, о совместимости... Будет магическое мышление без особого понимания как оно там внутри устроено. Сейчас так многие ездят на машине не особо вдаваясь как там у нее работает трансмиссия и ДВС. Многие играют и работают на компьютерах не вникая как там алгоритмы перемалывают для этого гигабиты. В какой-то момент такая же магия придёт и в локальную бытовую автоматизацию рутинных вещей. Свет будет гореть там, где он нужен, а там где не нужен - не будет. И в 80% случаев этого будет достаточно, а для остальных 20% можно будет сделать магический пасс рукой в сторону лампочки, и она засветится. Может быть нужно будет ещё произнести "Люминос максима".
То же и про тостер. Тосты просто будут готовы когда они вам нужны, но если тостер не угадал пока, или не "привык" ещё к вам, то можно будет махнуть ему рукой в специфическом жесте, и он всё поймёт как надо.
Взломы всего этого тоже, кстати, обещают быть в будущем эпическими и интересными. Жду будущего всегда с интересом и нетерпением, но, надо сказать, что и вокруг нас уже полно этого самого "будущего". Надо уметь видеть.