Оптические иллюзии
Очки с двумя японскими линзами стоят столько же, сколько не менее японский объектив SIGMA с четырнадцатью асферическими линзами, многослойным просветлением, переменным фокусным расстоянием и ультразвуковым мотором фокусировки.
Тег «жизнь»
Очки с двумя японскими линзами стоят столько же, сколько не менее японский объектив SIGMA с четырнадцатью асферическими линзами, многослойным просветлением, переменным фокусным расстоянием и ультразвуковым мотором фокусировки.
Меня всегда удивляет, когда люди тратят на что-то массу усилий и средств, но забывают подумать об одном небольшом, но очень важном аспекте, который может обесценить все затраты. Ну или значительную часть.
Ярчайший пример такого подхода (сначала потратить кучу денег, потом подумать) я каждый день наблюдаю по пути на работу. На станциях электричек и метро стоят турникеты. Казалось бы, простая задача с единственным условием: не пропускать человека, у которого нет билета.
Проблема в том, что современные турникеты не выполняют основную свою функцию. Экономный народ массово преодолевает такие смешные для русского человека препятствия, не обращая даже внимания на дежурную тетеньку (смысл ее работы остается для меня загадкой). Без билета типичные турникеты с дверками можно преодолеть аж двумя способами.
Когда первый способ прохода стал очевидным для железнодорожников, появились турникеты-триподы, с тремя трубами на одной оси (как в московских автобусах).
О да, они не позволяют пройти гуськом (разве что двоим очень тощим). Зато с перепрыгиванием дело стало обстоять гораздо проще: преодолеть нужно всего лишь одну горизонтальную трубу. Но и это еще не все! Под таким турникетом легко подлезть! Какой удар для конструктора!
Потратили, стало быть, кучу денег, а толку? Не беда — денег еще много! И у турникетов появились крепкие ребята в камуфляже. Народ насторожился. Не каждый теперь рискнет проскочить зайцем — шанс получить по почкам от правоохранителей перевешивал стоимость билета. Но хитрость скоро раскрылась. Крепкие ребята в камуфляже оказались просто крепкими ребятами в камуфляже. При попытке безбилетно преодолеть турникет они лишь устало бубнят: «По одному проходим, по одному». Все вернулось на круги своя. Средства потрачены, безработица среди крепких парней, тетенек и конструкторов турникетов стремительно упала, народ продолжает экономить. Все довольны.
А ведь достаточно было подумать пару минут, чтобы устранить перечисленные выше «сравнительно законные способы» прохождения без билета. Например, при двух парах дверок не давать передней паре открываться, пока не закроется задняя (тут остается возможность перепрыгивания). Или вообще сделать как в Нью-Йоркском метро, «вертушку» высотой в человеческий рост. Конечно, у нас в стране порой задача «сделать правильно» как таковая не ставится, главное чтобы за эту работу можно было освоить деньги. Но это уже совсем другая история.
Вопрос, как устранить возможность генерации фальшивых билетов на электричку, оставляется читателям в качестве несложной разминки для ума.
Надеюсь, вы не подумали, что этот пост про электрички и турникеты.
Ехал сегодня на работу и слышал по радио (кажется, это было «Эхо Москвы») презабавнейшую дискуссию. Суть ее в том, что предлагалось в связи с кризисом как-то помочь родителям, оплачивающим обучение детей. Ну там, беспроцентные кредиты и подобная ерунда. Высказывалось даже такое радикальное мнение, как запретить брать деньги со студентов вообще. По этому поводу у меня возникли некоторые мысли, которыми я не могу не поделиться.
Многие ВУЗы сейчас живут большей частью на деньги, которые стригут с сердобольных родителей. Более того, даже зарплаты преподавателей (по неподтвержденным данным) напрямую зависят от того, скольких они обучают платников. Сделать все образование бесплатным — значит обречь на вымирание добрую половину российских институтов, заодно с преподавателями. Разумеется, так не будет. Не то чтобы я верю в здравый смысл наших властей. Я верю в силу откатов. И поэтому платное образование никуда не денется.
Идеи о субсидировании малоимущих родителей платников я даже и рассматривать не буду. Образование — такой же товар, как и все остальное. Если у меня денег на машину не хватает, мне тоже государство подкинет?
Ну и теперь самое главное: в чем высший смысл платного образования? Ну например, приходят два студента — Вася и Петя — поступать в машиностроительный институт. Вася блестяще сдает экзамены, поступает на бюджетную форму обучения. Петя экзамены благополучно заваливает, но щедрый Петин родитель говорит: «Фигня вопрос, да неужто я позволю сыну в армию пойти?!» В результате Петя учится с Васей в одной группе, но если Вася старательно грызет гранит науки, и защищает красный диплом, то Петя на учебу кладет все что может, и в результате едва вытягивает на диплом, получив трояк с минусом. Платник ведь, нельзя заваливать. Вася затем едет в Штаты и работает в Chrysler, а Петя устраивается на ВАЗ. Дальнейшая импликация, думаю, понятна.
Ситуация становится еще более пикантной, если рассмотреть подруг Васи и Пети, которые поступали в медицинский по тому же сценарию…
Единственное вменяемое решение этой проблемы, на мой взгляд — делать одни специальности исключительно платными, а другие — исключительно бесплатными. Ну, например, развелось у нас слишком много экономистов — сделать экономическое образование платным. А если вдруг, наоборот, коварный вирус выкосил всех юристов, юридическое образование оплачивать из бюджета. Возможен еще вариант делать платными «прибыльные» специальности, типа финансистов или стоматологов. Как бы то ни было, нельзя мешать платное с бесплатным на одной специальности. Или так, или этак.
Но самое главное: ни в коем случае нельзя к платникам относиться как к людям, покупающим диплом в рассрочку! К ним должны предъявляться те же требования на вступительных экзаменах, и их точно так же нужно гнать из ВУЗа, если завалят сессию. Иначе страна так и останется в том месте организма, в котором она обитает уже почти 20 лет. Жаль только, что в действительности все идет как раз по худшему сценарию, и с каждым годом мы углубляемся все выше в сторону желудка.
Все без исключения мужики, которые умеют водить машину, убеждены до глубины души — гены, отвечающие за пол и цвет волос, непосредственным образом связаны со способностью адекватно вести себя на дороге. Говоря проще, блондинки просто физиологически не способны научиться нормально водить (хотя к некоторым немкам это, видимо, не относится). Не могу ничего определенного сказать по этому поводу, поскольку мастерство единственной знакомой блондинки-водителя еще не успел оценить. Зато с удивлением недавно понял, что природная склонность совершенно необходима для занятия программированием!
Не стоит сразу меня обвинять в мракобесии и развешивать ярлыки. Как ни удивительно, проблема склонности к программированию существует, и люди даже пишут по этому поводу серьезные статьи. В статье заявляется с известной долей недоумения, что, оказывается, существует способ сказать до начала обучения, сумеет ли человек осилить программирование или лучше сразу на рудники. Нехило так, а? Приходит студент поступать на программерскую кафедру, а его просят ответить на три простых вопроса, после чего (голосом магистра Йоды): «Тебя обучать не будем мы! Силы в тебе увидеть не можем!..»
Я бы, наверное, принял все это за шутку, если бы сам не столкнулся с живым подтверждением. Однажды я попробовал в порядке развлечения научить азам программирования двух людей. Один из них не смог понять, как работает присваивание значений переменным. То есть, натурально, пришлось минут 20 объяснять, что означает запись a = 1. Другой человек воспринял концепцию присваивания легко и непринужденно, хотя никогда до этого не программировал, да и желания такого не имел. Каково же было мое удивление, когда я наткнулся на пост Джеффа Этвуда, откуда и узнал про существование исследования в этой области. И вопрос на понимание присваивания у них первый в списке!
В общем, как ни крути, существует разница между людьми. Одни могут в уме строить и выполнять модели дискретных структур, а другие — не могут. Одни люди потенциально могут стать программистами, а другие — нет. Конечно, есть масса людей, зарабатывающих деньги программированием, но неспособные понять рекурсию, косвенную адресацию или функциональную парадигму. Но это другое — такие люди не строят ментальные модели программ, они просто действуют по аналогии или используют упрощенные способы формализации (строительство SQL-запросов мышкой в Access), и хакеров из них не получится ни при каком раскладе.
Ну и самое главное — список понятий, которые настоящий программист должен понимать. Причем не умом, а подсознанием, интуитивно — словами ведь всякий может рассказать, что такое рекурсия, если ему достаточно долго это повторять. Итак, необходимо понимать:
Я несколько расширил список, приведенный в вышеупомянутом исследовании, добавив косвенность и «чувство правильной вещи«. Под последним подразумевается нечто вроде программистского здравого смысла, способность выбрать из нескольких способов реализации одного и того же самый «правильный» и «красивый» вариант. Причем не формулируя критерии, по которым сделан выбор.
Попробуйте испытать своих некомпьютерных знакомых и убедитесь, что ген программизма таки существует. Ну а не убедитесь — бросайте в меня камень, чего уж там.
Хотя у меня пока, учитывая возраст блога, есть некоторое ощущение «разговора с пустотой», все же я не могу не поздравить всех немногочисленных моих посетителей с 0×100-ым днем в году. Это тот самый день когда нужно или не работать совсем, или сворачивать горы. У меня получилось второе: напланировал кучу дел, приехал на работу и через полтора часа уже все сделал. Остается только пожелать всем побольше таких ошибок в планировании. Или это все же сакральное влияние даты?
О серьезных вещах сегодня писать — кощунство, поэтому буду писать о полусерьезных.
В далекие-далекие годы, когда еще только-только стали появляться компьютеры на полупроводниках, а в лесах можно было встретить динозавров, появился UNIX. Дорог он нам не только фактом своего существования, но главным образом сложившейся вокруг него культурой. Ну, знаете, там были такие волосатые очкарики, которые все свое время просиживали за терминалом (при наличии такового), пили колу и разговаривали друг с другом на языке инопланетян. Эти ненормальные идентифицировали себя «хакерами», все время писали какой-то код и ни во что не ставили интеллектуальную собственность. Кстати, все ли знают, что UNIX изначально создавался Томпсоном как средство запуска игры Space Travel на компьютере PDP-7?
Но нужно отдать должное этим нечесаным парням: в их развлечениях родилось много полезных штук, и, в частности, язык Си. Создали его изначально не для развлечений (хотя кто-то пытается это опровергать), а для тотального переписывания Юникса. Но хакеров ведь хлебом не корми — дай любую попавшую в руки сущность разобрать, понять как работает, перекроить и раздать друзьям. Поэтому, учитывая специфику C, нетрудно было догадаться, что мерилом профессионализма, наряду с длиной волос и диоптриями близорукости, станет способность написать самую необычную, изящную, умопомрачительную и непонятную простым смертным программу. Например, такую:
typedef struct n{int a:3, b:29;struct n*c;}t;t* f();r(){}m(u)t*u;{t*w,*z; z=u->c,q(z),u->b=z->b*10, w=u->c=f(),w->a=1,w->c=z-> c;}t*k;g(u)t*u;{t*z,*v,*p, *x;z=u->c,q(z),u->b=z->b,v =z->c,z->a=2,x=z->c=f(),x ->a=3,x->b=2,p=x->c=f(),p ->c=f(),p->c->a=1,p->c->c= v;}int i;h(u)t*u;{t*z,*v,* w;int c,e;z=u->c,v=z->c,q( v),c=u->b,e=v->b,u->b=z->b ,z->a=3,z->b=c+1,e+9>=c&&( q(z),e=z->b,u->b+=e/c,w=f( ),w->b=e%c,w->c=z->c,u->c= w);}int(*y[4])()={r,m,g,h}; char *sbrk();main(){t*e,*p,*o; o=f(),o->c=o,o->b=1,e=f(), e->a=2,p=e->c=f(),p->b=2, p->c=o,q(e),e=e->c,(void)write (1,"2.",2);for(;;e=e->c){q(e), e->b=write(1,&e->b["0123456789"], 1);}}t*f(){return i||(i=1000, k=(t*)sbrk(i*sizeof(t))),k+--i; }q(p)t*p;{(*y[p->a])(p);}
Эта программа, например, вычисляет и выводит на stdout значение числа e с неограниченной точностью (точнее, ограниченной размером стека или терпением пользователя). Понятно, что нанимателям таких программистов очень не нравился подобный стиль. История умалчивает, сколько хакеров было уволено, пока, наконец, в 1984 году не был организован IOCCC, или, по-нашенски, Международный Конкурс На Самую Запутанную Программу На C. Это было настоящей отдушиной для недосамовыраженных профессионалов, и работодатели снова могли спать спокойно.
Среди победителей IOCCC оказалось немало известных в компьютерном мире людей. Например, Дэвид Корн (создатель оболочки ksh) в 1987 году стал одним из победителей с такой программой:
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Основная интрига в том, что должно появиться на экране. Ничего сложно здесь нет, если помнить о том, что следующие две строки с точки зрения C идентичны:
a = b[1]; a = 1[b];
Плюс еще нужно знать, что unix — предопределенный символ, эквивалентный 1, если использовать gcc. В этом можно убедиться с помощью следующей команды:
$ touch foo.h; cpp -dM foo.h ... #define unix 1 ...
Если сложить два и два, получится, что программа выводит строку «unix».
Одна из моих любимых программ-чемпионов, написанная Марком Биггаром, выглядит так:
P;Вот оно, настоящее Дао! Эта программа, в отличие от всех остальных победителей, умеет делать все. Ее нужно просто правильно скомпилировать. Например, можно заставить ее вывести «Hello, world»:
$ cc -DP="main() { printf(\"Hello, world\\n\"); }" -o beggar beggar.c
$ ./beggar
Hello, worldНетрудно придумать, как научить программу делать и любые другие действия.
Кстати, на этом же соревновании засветился и Ларри Уолл, написавший некую линвистическую чуду-юду. Теперь понятно, откуда у Perl ноги растут. Оказывается, Уолл просто сделал язык, на котором непонятные программы писать гораздо проще, чем на C.
Пожалуй, на этом праздничный пост пора завершать. На досуге можете посмотреть исходники других победителей IOCCC, гарантированно получите массу удовольствия.
Хотя всякие программерские хитрости и тонкости — безусловно штука полезная, но в вакууме, как известно, работают только сферические программисты (те самые, что пишут программы длиной в один байт). Реальные же люди вынуждены терпеть существование вокруг них всего остального мира в виде назойливых людей, телефонных звонков, развлекательных сайтов и хорошей погоды как раз тогда, когда на работе завал. Я даже не возьмусь сказать, что больше определяет производительность программиста: профессиональный уровень или способность абстрагироваться от внешних раздражителей.
Долгое время я страдал от такой вредной привычки. Когда в работе наступал ступор, например, окончание небольшого этапа или просто необходимость крепко подумать, я машинально открывал почту, потом RSS-ленту, потом новости, потом еще какой-то сайт, потом находил какую-то интересную статью… А когда возвращался к работе, оказывалась, что можно, в общем-то, уже не начинать, потому что скоро обед / конец рабочего дня / whatever. Короче говоря, продуктивность моя сильно от этого дела страдала.
Общие методы тайм-менеджмента вроде GTD работают замечательно только в теории. На практике очень многое зависит от личных предпочтений и того, насколько человек может управлять своей волей. Тотальному лентяю не поможет никакая супер-система продуктивности или дорогущий софт для планирования времени, а волевому человеку не нужны никакие костыли, чтобы переть напролом к поставленным целям. Выходит, все методики и инструменты личной эффективности выполняют две (основные) функции:
Не претендуя на звание гуру в этой области, попробую все же дать несколько советов, которые могут оказаться полезными, в частности, для разработчиков ПО. Обращаю внимание, что я описываю именно свою систему личной эффективности, которую бесполезно применять к себе дословно. Просто воспримите общие идеи.
Эти нехитрые правила, хотя и отдают банальщиной, оказались на удивление эффективными. Конечно, это не система фундаментальных правил — при желании можно таких советов написать еще пару десятков, я просто указал, на мой взгляд, самое основное.
Что касается башорга (в нарицательном смысле), то я избавился от привычки посещения не относящихся к делу сайтов очень просто: каждый день дописывал себе в todo-list задачу «Не ходить на развлекательные сайты». Через неделю я избавился от этой привычки полностью.