четверг, января 11, 2007

Четыре зарубки

Это блок какого-то чушка. Мой был в идеальном состоянии, хоть я его и мучал года 2 или 3 подряд сутками. Даже телевизор родителям сжёг Точно не помню в каком, то ли в 10м, то ли в 11м классе, я участвовал в районной олимпиаде по, как это тогда называлось, информатике. Поскольку во всех районах были одни и те же задания, а мы все были более или менее знакомы друг с другом, то некоторые из заданий просочились "в прессу". Уклон всех задач был алгоритмическим, как, наверное, и надо. Одна из задач формулировалась так: посчитать количество счастливых билетов в диапазоне 500000-600000. Счастливым признавался билет, в котором 1я, 3я и 5я цифра в сумме давали то же число, что сумма 2й, 4й и 6й цифры. В то время я был юный монстр бейсика для Вектор-06ц и ассемблера для x86. Как жулик, узнав о задача накануне, я, после созвона с товарищами по команде стал думать, как это сделать. В голове крутились мысли одна другой краше, самая запавшая в голову и вот уже 16 лет там сидящая - вот (дело прошлое, сейчас уже не так стыдно): сформировать строку-эквивалент числа, Yamaha MSX-1разбирать его разрядам, проводить суммирование полученных цифр и пр. Трудоёмкость оценить не берусь, но как минимум она далека от требовавшейся (практически надо реализовывать это дело на Ямахах MSX-1, кто помнит).


Понятное дело, что работа со строками и на нынешних балалайках - не самое быстрое занятие, а тогда-то...
Короче, отводилось на всё мероприятие кажется 6 часов, по моим прикидкам программа написанная по этому прэлэстному алгоритму работала бы дня 2 как минимум. Не пойдёт? Не пойдёт.

Говоря честно, я сидел и предавался как Догилева в "Блондинке за углом" псисимизму - нет смысла связываться с такой реализацией, как вдруг... Мы же складываем цифры! Самоё число не интересует вообще. Нужно получить только 5 цифр для суммирования и вердикта. А это значит
for I = 0 to 9

for J = 0 to 9

for K = 0 to 9

for L = 0 to 9

for M = 0 to 9

if 5 + J + L = I + K + M ...
В момент, когда это сверкнуло, мне подумалось, что не может быть, чтобы так просто всё решалось. Это была, как говорил Анатолий Маркуша в своих "Чудесах на колёсах" (Царствие Небесное, великий был человек), первая зарубка.

Спустя несколько лет в той самой организации, в которой херачил на саксофоне аналитик-экономист в адских расцветок галстуке и завывал чёртов буддист-битломан, я присутствовал во время прохождения одной из первых мультимедийных игр "Седьмой гость". Сколько-то там было дисков много, не то 2, не то даже 3, это поражало воображение само по себе, плюс "там такая графика!". Я уж не помню, что там была за ерунда, но какая-то она была полулогическая, что ли. Типа, призраков валишь, а когда всех наказал, то для перехода дальше надо решить логическую задачу за ограниченное время. Запомнил только одну: сколько способов расстановки 8ми ферзей есть на стандартной шахматной доске? Бедняга, который играл, начал водить пальцем по экрану. По мне же так задача сама просилась на реализацию программкой. Как я её написал не помню. Помню, что там была рекурсия (аналогичная обходу дерева каталогов на диске), руки писали код сами и через 2 или 3 минуты запуск дал "96". 94й или 95й год, с интернетом некоторый туган (в нём я появился только в 97м), ответ проверить гуглом было нельзя, но игра приняла ответ и пустила дальше. Это была вторая зарубка.

Третью я получил во время написания программы к диссертации. Программа была дико сложная, Borland C++ 5.02 который, отказывался работать с таким количеством шаблонов и выпадал через компиляцию стабильно. Он так меня измучал, что вместо работы я сидел и часами пил кофе и всё думал, как бы довести работу до запуска. Объективно работы там было немного, но мне казалось, что не закончится никогда. Выкурив сигарету, решил всё же глянуть, что же надо сделать. Вся работа заняла 20 минут, BC++ схавал всё, что ему было предложено и выдал аккуратный каталог с библиотеками и исполняемым бинарём.

Последняя же, наверное, изменила мою жизнь больше всего прочего. Осень 97го, до сдачи проекта по программным средствам дистанционного образования оставалось около недели. По отдельности все компоненты работали. Работали ActiveX controls, браузер заданий, рабочее место препода. Работал даже самостоятельно реализованный на сокетах обмен данными в сетке, всё как положено: приоритеты, очереди, обработка ошибок. А вместе - не работало.

Надо сказать, что ничто меня не выматывает сильнее, чем проблемы на пустом месте, когда логическим путём дойти до их сути не можешь.
Терялись ответы и всё тут. Сокеты работали как часы, товарищ В.Ч. на них даже игру какую-то многопользовательскую сбацал. Не то Го, не то Реверси. Факт, что работало. Уверенность насчёт прочего была не меньшая. Что делать? Не сдавать нельзя. Что исправлять - непонятно. И я запаниковал. Внёс предложение переписать пару сомнительных с моей точки зрения фрагментов и проверить. Переписать и проверить. Был готов сделать это единолично и самостоятельно. Но более хладнокровные товарищи, товарищ, точнее, отказался: у нас всё работает. Мы не будем переписывать, пойдём сейчас поиграем в настольный теннис, а когда вернёмся, просмотрим весь код от начала до конца. ...Ошибка была в закладывании в буфер: закладывалось на 1 байт меньше, чем нужно, из-за этого пришедший на сервер пакет не распознавался как правильный, но он не был и неправильным с точки зрения передачи по сети. Сдались мы вовремя, всё было нормально. Уже больше 9ти лет я не кидаюсь переписывать то, что не работает и бью по рукам тех, кто лезет чинить то, что не ломалось и исправлять то, что не содержит никакого дефекта. Это был самый комплексный урок, наверное: не бояться, не паниковать, даже на пике общей суматохи не отступать от плана.
P.S. Оказывается, Анатолий Маркуша умер только в 2005 году и у меня были все шансы с ним познакомиться лично. Его "Чудеса на колёсах", 70го года издания, были у нас дома ещё до моего рождения и мне почему-то казалось, что к тому времени его уже не было. По-моему, это великая книга. Всё, о чём написал Брукс, о чём с нарастающей свирепостью пишет Макконнелл, - Анатолий Маркович написал до них. И куда как лучше. И куда как доступнее. Для детей и юношества. Чтобы парни и девчонки не терялись в жизни. Вот я благодаря Анатолию Марковичу - не потерялся. Если вы его в детстве не читали, мне вас очень жаль. Правда.

Комментариев нет: