Стек — VB6, C
Опыт — 2 года
Работа — средняя школа
Разве учиться не весело?
Чтобы описать ситуацию, это было начало 2000-х годов в маленькой фермерской деревне. Да, у нас был интернет, но он был dial up, не было ни stack overflow, ни чего-то близкого, лучшее, на что вы могли надеяться, это сообщения на форуме.
Так как же мы учились? TL;DR — Книги и много книг…
Я помню, как ходил в библиотеку в поисках книг, обменивался с друзьями. Если вы покупали дорогие книги, вы даже получали CD (знаете, такая круглая штука с дыркой) с примерами кода и проектами уроков, не то чтобы CD когда-либо работал (или даже был там) из библиотеки. Никакого поиска в книге вашей проблемы или примера, никакого copy paste, ничего. Просто читаешь и надеешься, что потом вспомнишь, где ты видел что-то о проблеме, которая у тебя возникла.
Да, интернет существовал, но в нем было не так много руководств по программированию, учебников или даже примеров. Одним из самых полезных инструментов были IRC-каналы (для вас, дети, это очень старый чат). Честно говоря, я даже не помню, как я нашел канал, на который мне нужно было писать, но я помню, как разговаривал с людьми со всего мира о самых глупых вещах, о вещах, решение которых сегодня можно найти в Google.
Я знаю, что это странно, но вы можете учиться в школе
Когда я перешел в последний класс средней школы, я посещал технический класс. В этом классе мы изучали основы электротехники, механический дизайн и, конечно же, программирование. Главная проблема заключалась в том, что я сам учил себя большему, чем то, что преподаватель доносил до меня на уроках. Тем не менее, у меня появился отличный ресурс — мой учитель мог ответить на вопросы, направить меня в нужное русло.
Прежде всего, я хотел бы сказать, что не все учителя плохие (да, многие, но не все). К счастью для меня, наш школьный учитель технологии увидел мой потенциал (особенно после того, как я сломал школьную сеть). Мне было скучно на уроках, все изучали C и VB6 на уровне, который я давно прошел самостоятельно. Именно тогда учитель пришел мне на помощь.
Мой первый настоящий проект
Компьютерное зрение, знаете, когда компьютеры смотрят на изображение и пытаются понять, что там находится. На тот момент не было никаких моделей ИИ или чего-то подобного, все было чисто алгоритмическим. Моя миссия, если бы я решил принять ее (а не быть выгнанным из класса), заключалась в том, чтобы взять «новую» библиотеку, которая позволяла мне захватывать изображение с веб-камеры в VB6 и обрабатывать его (пиксель за пикселем), и попытаться определить форму на изображении, простые геометрические фигуры (круг, квадрат, треугольник).
Мы с моим лучшим другом решили эту задачу, она была настолько интересной, что мы ночами напролет пытались ее решить. Позвольте мне рассказать вам об основных принципах.
Пройдитесь по изображению по одному пикселю за раз, пытаясь найти место с большим изменением цвета (черная фигура на белой бумаге).
Когда я доберусь до него, пройдитесь по шаблону, чтобы найти его соседний пиксель, который также является пограничным.
Делайте это в цикле, пока я не смогу найти больше пограничных пикселей.
Это сработало (теоретически). Но всегда есть «но»… Все пошло прахом, когда мы столкнулись с этими крайними случаями, когда несколько пикселей не на своем месте.
Тогда-то меня и осенило: решение может быть очевидным для вас, но для меня оно не было очевидным. Оказывается, есть применение структуре данных «стек», которой нас учили. Мы помещаем все пиксели в стек, и каждый раз, когда мы натыкаемся на кирпичную стену, мы вытаскиваем пиксель и пробуем снова. Так продолжалось до тех пор, пока мы не вытащили их все и не вернулись к начальному пикселю.
Это оказалось очень эффективным и решило нашу самую большую проблему.
На самом деле мы нашли несколько решений для того, чтобы понять, какая это форма.
От тривиального — посмотреть, сколько «прямых» линий составляют фигуру, что довольно хорошо работает для простых фигур. До самого продвинутого решения, которым я горжусь до сих пор: вычислить площадь фигуры и периметр фигуры и посмотреть, какая константа лучше всего определяет отношение.
Мораль истории
Я рассказал вам всю эту историю, чтобы прийти к небольшой мысли, которая определила следующие несколько лет моей жизни разработчика. Структуры данных и паттерны проектирования существуют не просто так, и даже если это может быть неочевидно, вы спрашиваете себя «зачем мне это нужно». В какой-то момент вам это понадобится, и полезно держать их под рукой.
Если вы хотите проверить нашу библиотеку с открытым исходным кодом и оставить отзыв, мы будем вам очень признательны.