Вчера же, гостя у мамы, слушал за завтраком йеху москвы. Там какой-то безальтернативно одáренный вещал о том, как противные российские власти не дают защитить детей от агрессии и насилия, к которым те приучаются в компьютерных играх.
Каюсь, сам грешен. Придя вечером домой, я осознал, насколько безрассудным и безответственным было моё недавнее решение продемонстрировать своему малолетнему сыну то, к чему его детское сознание было не вполне готово.
Женька уже
месяца три как активно подсел на программирование каких-то довольно странных прилад с использованием Python и Tkinter. Прилады сильно пересекаются с его увлечением орнитологией и фотографированием птиц - он ведёт какой-то странный учёт и строит графики не пойми чего. От использования Экселя отказывается, потому что очевидно охота покодить.
Когда Жека только начинал осваивать Tkinter, первое, что он захотел сделать, были идущие на экране часы со стрелками. Код, рисующий циферблат и стрелки, он родил довольно быстро, но с обновлением возникли сложности. Tkinter был первым в жизни Жеки asynchronous message-driven GUI framework, да при этом в рамках Tkinter отсутствовало понятие таймера, на который можно бы было вешать callbacks. Тут-то я и сделал ключевую ошибку - я показал невинному одиннадцатилетнему мальчику, как запускать threads. Я при этом даже попытался поговорить с сыном как мужчина с мужчиной, объяснить все неприятности, к которым может привести необдуманная параллелизация, и убедить его в необходимости предохранения и правильной синхронизации. Но скорее всего я не смог донести до ребёнка всю опасность открывшейся перед ним части взрослого мира.
Часы счастливо пошли, а прилады для классификации птиц поначалу вполне обходились стандартными средствами Tkinter. Жека, ещё 18 мая успешно сдавший экзамены в тридцатку и с тех пор забивший вообще на всё, постепенно усложнял свои произведения и в конце концов дошёл до того, что код валидации самой толстой формы стал занимать у него более двух экранов однообразных проверок стапиццот атрибутов птицы. Я тем временем погряз в работе и дома обходился в основном end user level demos и бесстыдно забивал на code reviews.
Вчера вечером, когда я пришёл домой, Жека с радостью сообщил мне, что он решил проблему скучного вызывания стапиццот однообразных методов. Я поинтересовался, как же он это сделал. Легко, сказал Жека, я просто создал список имён методов и теперь иду по ним и вызываю из второго thread'а eval'ом. Молодец, сказал я с лёгкой гордостью за сына, самостоятельно дошедшего до data-driven metaprogramming, а нафига второй thread?
Ну как же, сказал мне сын, я перечисляю в цикле методы из списка, запускаю для каждого thread и жду, пока он выполнится.
Зачем?!!! - изумился я, начиная подозревать нехорошее.
Ну как ты не понимаешь, с разочарованием в моих умственных способностях сказал ребёнок, пока второй thread вызывает метод, первый может делать что-нибудь полезное!
Что например? - поинтересовался я. Что он у тебя сейчас делает?
Сейчас ничего, раздражённым голосом сказал Жека, но, если понадобится, он может!
Пришлось открыть его ноутбук и посмотреть. Ребёнок действительно разрезал тело достаточно простого цикла на две части и вторую из них зачем-то выполнял в отдельном thread'е. Само собой, синхронизации там не было никакой - помогая ему написать часы, я сам специально нашёл и поставил thread-safe версию Tkinter, а мои пустые увещевания остались для него чем-то, не имеющим отношения к реальной жизни.
Я, полный стремлением загладить свою вину перед ребёнком, начал с того, как сильно мне нравится его идея со списком методов. Но, сказал я, идея со thread'ом, как бы это сказать тебе, не очень хороша. Она излишне всё усложняет. You ain't gonna need it.
Мне кажется, он не поверил.
Так необдуманное и беспечное поведение родителей может завести маленького ребёнка на неверный путь и привить ему привычки, которые принесут ему много боли и страдания в будущей взрослой жизни.