Sunday, December 21, 2008

Поцелуй

Кросс-пост с персонального блога...
---

Ночь опустилась над садом и луна, круглая и полная, взошла над городом, залив его своим холодным светом. Костерок догорает посреди импровизированного лагеря, и друзья, клятвенно обещавшие пободровстовать до утра, уже успешно задрыхли, закутавшись в теплые шерстяные плащи-одеяла...

Дым костра стелется по земле и придает всему вокруг теплый домашний запах. Траве, лагерю, деревьям, и даже туману, еще висящему в двух метрах над землей и еще не опустившемуся на землю. Дай время, и он спустится, и покроет землю, и траву, и спящих утренней росой...

Одного, врочем, не хватает. У него – особая участь. И как это случается, что когда дело доходит до полного дерьма, всегда можно надеяться только на самого лучшего, самого умного, самого талантливого... и самого верного. Безоговорочно верного. Верного до конца.

А и правда, на кого? Вон Сёма дрыхнет. Уж на что надежный мужик, даром что ли мы его Кремнем прозвали. Такой трижды споткнется, плюхнется мордой в грязь, а все равно, подымется и пойдет дальше. Камень, одно слово. Лучший из лучших. Не считая того, одного, конечно. Он бы и сделал, что нужно, да только как же без него остальные потом? Распадутся, растеряются... нужен он, нужен... чтобы всех вместе держать, когда меня с ними не будет.

А вон, Матвеюшка лежит. Мешок свой обнял как девушку и посапывает счастливо. Правильный мужик. Это для него главное – чтобы все правильно было. Думаете у него хлеб в мешке? Как же... записки! Из тех что «пусть рушится мир, но торжествует закон». Одна его предыдущая профессия чего стоит... Тут или полной сволочью надо быть, или свято верить, что так и надо. А ведь, как понял, что так не надо, ни секунды не колебался. Собранные деньги на дорогу бросил и за мной пошел. Что значит, «как надо». Но ему такую задачу не доверишь. Ему понять надо, почему так правильно. А вот с «понять» - у него непросто. Как поймет – тут его упряжкой быков с места не стронешь, настоящий человек, не торгует собой. Но ему нужно, чтоб мир был просто устроен. Понятно. А сложности – это не для него. Это и без него разберутся. А он лучше потом запишет, для грядущих поколений. И запишет, сомнений нет. И много добра этим сделает. Так что, пусть уж пишет.

А вон, Ваня, младшенький... Тоже гуманитарий. Этому лишь бы в книжках покопаться. Ну, или пописать свои книжки, в надежде, что кто-то через годы их читать будет. Книжник, одно слово. Хороший парень, кстати, молодец. Умница. Только молодой еще, умствующий. А как до практики... В общем, пусть уж тоже книжки пишет – так от него больше пользы.

Или вон, Зёма. Тоже хороший мужик, слов нет. И практичный. Знает, что делает. Только горячий, черт... Ему только намеки, он же такое устроит, потом ввек не отмоешься. Одно слово – зилот. Этому и предлагать такое без толку, все знают как он попов ненавидит. Они ему и не поверят. Все ему бы «взвейся да развейся». Дай ему волю, он «кишкой последнего попа последнего имперца удавит». И тут же расстелит мне плащ на троне Иудеи, залитом свежей кровью...

Как им обьянить, таким правильным? Мы уж больше недели в Вершалаиме, и все как будто так и надо. Казалось бы, после того, что мы в Храме устроили, всех должны были стражники схватить, а вот нет. Пришли, тупо поглядели по сторонам и ушли, как будто так и не увидели никого.

Зло, оно еще и столь бессильно, когда до дела доходит... Не всякого дела, конечно. То, на что стражники тренированы – там купца обобрать или избить кого попало – это пожалуйста. А чуть интеллект требуется, скажем конкретного небогатого человека найти, откуда ж у них интеллект при такой работе? Уж насколько попы меня ненавидят, а схватить не могут. Хотя вроде бы уж давно решили. Бред... Просто сомнабулы какие-то. Деградировали. Вообще ни на что не способны.

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

И сдаться им нельзя. Потому что, пример неправильный. Не должно добро сдаваться. А все равно, что суждено, тому быть... Вот только, кто сделает, что суждено? Нужен кто-то, кто злу не продался... Чтоб в нашем слое вселенной был.

Небо засветлело на востоке в предчувствии грядущей зари... Он уж небось поговорил с попами... Точно... вдали показалось движение. Группа. Один иудей и несколько стражников. Идут, не шумят... иудейские стражники не носят на себе металла как римляне. Те же самые обноски, как и на всех остальных, плюс шлем, щит и там копье, или меч, если повезет кому.

Подошли... Он идет ко мне. Подходит. Поднимает глаза.

«Учитель, я сделал как ты просил», – тихо шепчет он, чтоб никто не услышал, – «Но ты ведь шутил, ты уйдешь от них, правда?»

Несчастный. Бедный мой ученик. Лучший. Единственный, кто понял, что нужно... Как же ты после этого будешь?

Он смотрит на меня, раскрывает руки для обьятия. Бедный ребенок... Прижимается ко мне, дрожа, плача, потом поднимает глаза и целует в щеку... Прощальный поцелуй сына отцу... Я глажу его по волосам, прижав к груди, уже не пряча слезы. Бедняжка. Как случилось, что именно его я должен был отдать на заклание??? Лучшего... самого понятливого...

А он, теперь отстранившись, смотрит на меня молящим взором... безмолвным криком широко раскрытых отчаянных черных глаз...

«Боже! Ты же можешь! Пожалуйста! Тебе ведь только захотеть!

ДА МИНУЕТ ТЕБЯ ЧАША СИЯ!!!»

Thursday, December 18, 2008

Белое рождество

Сегодня пригороды Сиэттла завалило снегом. В общем, проехать было бы можно, но куча народу с удивлением обнаружила, что машина на снегу ведет себя иначе чем на асфальте. В общем, снег - не проблема, а вот застрявшие на дороге... К десяти утра на улице по которой большинство едет на главный кампус застрял автобус и перегородил ее. В общем, спасибо фирме, что можно работать из дому. Что я и делаю. У меня на столе кружка горячего чая, и здоровый C++ файл, который придется расширить сегодня раза в два из-за неожиданно изменившегося проекта стандарта...

А на улице красота... Уже сантиметров пятнадцать навалило, скоро будет больше:

Sammamish White Christmas

Sammamish White Christmas 

Из прочего, недавно пришла наклейка за service pack 1 Windows Home Server. Как говорится, мелочь - а приятно.

WHS SP1 Shit-It!

А еще, я недавно хихикал над табличками на стенку за патенты, а тут мне такая же пришла... Я ж говорил, что Майкрософт заказывает их централизованно для своих изобретателей.

 Template-driven XML signatures plaque

Это патент мы зафайлили еще в Webdata примерно в 2001-м году. Патентный оффис вот только-только закончил рассмотрение и выпустил патент. Скоро еще одна такая придет, тоже из тех дальних лет.

Еще вчера посмотрел документальный фильм "Кто убил электрический автомобиль?" Если вы не знали, в 1996-м General Motors выпустило ограниченную партию полностью электрических автомобилей и протестировало их в Калифорнии и Аризоне. Машина имела ограниченную дальность - порядка 100 миль (обычная машина проезжает миль 300 без заправки, а то и больше), но в остальном ее пользователи (именно пользователи, а не владельцы - машина была доступна только в долгосрочную аренду-лиз) были от нее в восторге. Тем не менее как только Калифорния отказалась от своего "Clean Air Act", все эти электрические машины были отозваны и в основном пущены под пресс. Увидел в фильме много интересного. Например, как вы думаете, кто купил технологию батарей для электрического автомобиля? Нет, не производители ноутбуков, не производители наладонников, не производители батареек и аккумуляторов. Угадайте еще раз? Шеврон!!! Ага, это, конечно, стратегически важная технология для нефтяной компании...

Кросс-пост с персонального сайта...

Sunday, December 14, 2008

Социальная система Соединенных Штатов на пальцах

Капитализм? Ага! Как же...

По хорошему и подробно я опишу это все позднее. Со ссылками на классиков и деталями теории. А пока версия для публики. Так сказать, "на пальцах", или там "for dummies". В общем, вот видео:

Ну, да, кросс-пост с персонального...

Для не владеющих SOAPBox, YouTube link http://www.youtube.com/watch?v=HsZCt3uopEU

Friday, December 12, 2008

Эта земля - их земля (обзор книги)

This Land is Your Their Land: Reports From a Divided Nation by Barbara Ehrenreich – Metropolitan Book, 2008, 235 p. ISBN 0-8050-8840-7

Кросс-пост с персонального блога...

Barbara Ehrenreich известна своей более ранней книгой Nickel and Dimed, в которой она описала жизнь американцев, живущих на минимальной зарплате – официантки в ресторане, клерка в универмаге, кассира на автозаправке. Причем описала она это на своем опыте, потратив изрядное время на сбор материала действительно работая на всех этих работах и пытаясь свести концы в с концами на нищенскую зарплату.

Не знаю, доступна ли ее новая книга где-нибудь на русском, но если есть возможность очень советую хотя бы пролистать ее в магазине. Книга весьма издевательски проходится по последним годам американской политической жизни и убедительно и на фактах подчеркивает все те проблемы американского общества, о которых я уже упоминал в своем блоге – резко расширяющийся разрыв между бедными и богатыми, бесчестное и эгоистичное поведение высшего корпоративного менеджмента, ускоряющийся процесс уничтожения среднего класса, концентрация капитала в руках немногих богатых, продажность политического процесса, создание фиктивных «горячих» тем для отвлечения населения от реальных проблем, деградация системы образования в систему, которая отттягивает молодежь со сжимающегося рынка рабочей силы и закабаляет их долгами еще до прихода в реальную экономику... В общем, кризис менеджмента и смещение ресурсов в пользу корпоративных паразитов в ущерб организму.

С другой стороны, если вы и так в курсе всего этого, вам может слегка затошнить от концентрации всего этого материала. И что самое противное, если посмотреть на Европу или Россию, то как говорил Иа-Иа, «Так и знал, с этой стороны ничуть не лучше...» Утешает лишь то, что эти победы паразитов случались в истории регулярно, начиная с Египта и – особенно – Вавилона, и каждый раз было плохо, но потом рано или поздно приходило оздоровление, за исключением случаев, когда уничтожалась страна в целом. Но последнее всегда требовало одного из двух условий:

  • Наличие внешнего врага, желающего завоевать страну, что становилось фатальным, когда влияние паразитов подрывало способность страны к обороне, часто предварительно сопровождавшееся военными авантюрами.
    Примеры: завоевание Египта персами в 525 до н.э., поражение Афин спартанцами в Пелопонесской войне (404 г. до н.э.), захват Рима визиготами в 410-м и вандалами в 455-м, более поздним примером является поражение Франции и захват ее Германией во Второй Мировой несмотря на преимущество в количестве и техническом вооружении войск, отступление СССР в первые два года Великой Отечетсвенной, которое хоть и не уничтожило страну, но привело к временной потере значительной территории)
  • Предательство верхушкой национальной элиты, зараженной паразитами: завоевание Египта Римом при Цезаре и Августе (Клеопатра), французские монархи после Наполеона, держащиеся на русских, австрийских и английских штыках, Февральская Революция в России в 1917-м приведшая к ликвидации монархии, ну, и, конечно, сладкая парочка Горби-ЕБН в СССР.

В США на данный момент отсутствует способный вторгнуться враг (Китай единственный обладает достаточной живой силой, но не имеет средств доставки, не говоря уж о том, что последние двадцать лет они успешно отделяли мух от компота, оставляя мух Америке, так что завоевание ее теряет для них всякий смысл), и несмотря на все что делал Буш последние восемь лет, прямое предательство верхушкой национальной элитой по-прежнему выглядит очень маловероятным. А проблемы в экономике приходят и уходят, и к ним действительно применимо высказывание Ницше: «Все, что не убивает нас, делает нас сильнее.» В общем, поживем – увидим.

Sunday, December 7, 2008

Как стать хорошим программистом (часть 4. Extra): влияние на межличностые контакты

Как я уже писал, описать все аспекты существования программиста практически невозможно, но в последнем посте я сознательно не затронул еще один очень важный аспект, о котором было бы просто недобросовестно не написать. А именно, как это влияет на ваши межличностные контакты, общение с другими людьми.

Конечно, опять же описать всю проблему невозможно, но я попробую просто привести несколько примеров.

Да-да, тоже с персонального блога...

Плотность информационного канала

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

Усвоив это в искуственных языках, сей принцип влияет на вашу личность и начинает просачиваться в естественные. Вы начинаете замечать, что большинство непрограммистов очень часто страдает тем, что я называю «словесный понос». Ну, если кто еще помнит – в стиле выступлений Горбачева, говорит, говорит, а о чем похоже и сам не знает. Воодушевленный менеджер может распинаться перед командой целый час так и не сказав что-либо полезное. В обыденном общении «легкие разговоры» часто становятся невыносимой мукой. Нет, вы с удовольствием готовы поболтать с собратьями-программистами (и отдельными представителями других инженерных профессий, владеющих человеческой речью) на любые темы от хобби и шоппинга до кулинарии и политики, но ваши нейронные цепи уже настроены на каналы с низким уровнем шума.

Чтоб далеко не ходить, приведу пример. В Америке в большинстве фирм регулярно происходят митинги, посвященные пеп-ток. Это такой американский вариант политинформаций с пропагандой компании или группы в которой ты работаешь, обычно посвященной мудрости менеджмента, осуществляющего очередное изменение оргструктуры и пересаживавние медведей и мартышек между музыкальными инструментами. Так вот, на таких митингах лично я обычно физически начинаю отключаться через 15-20 минут, через 10, если я пытаюсь слушать о чем они говорят... Нет, правда. Глаза начинают слипаться и появляется риск треснуться лбом об стол...

Другой пример: некоторые читатели говорят, что им здорово мешает обилие вводных, междометий и прочих неинформативных элементов в моих статьях. Так вот, я этому сознательно учился, и знаете почему? Если вы принадлежите к этой группе читателей, возьмите любую мою статью, которая вам нравится, и попробуйте убрать все эти вводные и неинформативные слова. Мой опыт показывает что у подавляющего большинства людей от подобного текста просто заклинивает каналы обработки информации. Знаете как иногда с компьютерами бывает – процессор утилизован на 100%, диск крутится как сумасшедший и ничего не происходит. Не шучу.

Это еще сильнее заметно в устном общении. Если вы не уделяете спецально внимания общению с обычными людьми, то обьяснить свою точку зрения и «продать идею» менеджменту часто оказывается практически невозможно. Их информационные каналы просто не рассчитаны на концентрацию, с которой изьясняетесь вы. Нужно ли обьяснять, насколько это осложняет вашу жизнь и карьеру? Лично мне пришлось в свое время потратить немало времени, чтобы научиться искусству оценки собеседника и выбора правильного уровня речи в презентации своих мыслей.

Вы можете сказать, что это очевидно, но это вам очевидно, после обьяснения выше. Большинству программистов, которых я знаю, это не очевидно. Впрочем большинству непрограммистов это может и очевидно, но они понятия не имеют как это делать. И в любом случае суть в том, что вам придется этому учиться и никакого отношения к программированию это иметь не будет.

Бартер лжи

«Fidelity to reality» - «верность истине», о которой я уже писал, имеет целый ряд отрицательных последствий для социальных контактов. К сожалению, целый ряд социальных взаимодействий основан на лжи или по крайней мере на приятии лжи. Любой пеп-ток, пропаганда всегда основаны на этом. Очень часто отношения людей включают в себя элемент лжи. Еще более часто способность вписаться в какую-нибудь очень полезную в плане карьеры или денег структуру вроде КПСС или американского корпоративного менеджмента основана на способности искренне и убежденно врать. Про более приземленные примеры вроде продажи витаминов, средств похудания или там новой информационной системы заказчику я уж и не говорю. Знаю-знаю, сейчас раздадутся возмущенные голоса. Да, вы часто и сами верите в то, о чем говорите, во многих случаях это требование. Вам действительно нужно верить в мудрость вашего сегодняшнего менеджера, иначе очень трудно глядеть на него восхищенными глазами молодой студентки, когда он лепит горбатого про бизнес-цели вашей организации. И это делает ситуацию еще хуже. Поскольку врать себе – еще хуже чем врать другим.

Я уже обьяснял, что программирование не терпит вранья. Если вы пытаетесь соврать компьютеру, вы получаете баг, вот все. Что приучает вас к тому, что это занятие не только бессмысленное, но и сугубо вредное. Но в человеческом общении сплошь и рядом случаются противоположные ситуации. Как неверие в коммунизм мешало в карьере в СССР, так неверие в великую миссию унитазов с компьютерным управлением помешает вашей карьере в американской фирме, производящей оные унитазы.

Причем, мне кажется, что трудности с верой в ложные утверждения у хорошего программиста даже глубже, чем реакция компьютеров на баги. Честно предупрежу – это лишь моя теория, но лично мне она кажется правдоподобной. Такое ощущение, что в некоторых науках, дизайне сложных систем и программировании человечество достигло пределов эксплуатации нейронных сетей человеческого мозга. Если нейронная сеть используется на 1%, как, например, в профессиях вроде уборки мусора, вы можете лгать и верить в чушь используя остальные 99% мозга и ваша способность убирать мусор от этого не страдает. Когда нейронная сеть используется на пределе, у вас нет этой роскоши. Как только вы перестаете отличать правду от лжи, вы перестаете отличать баг от фичи, потому что вы используете одни и те же нейронные цепи. Продолжая аналогию, если у вас в ящике с инструментами лежит микроскоп и молоток, то вы можете забить молотком гвоздь, и микроскоп по-прежнему будет работать. Если у вас весь ящик занят большим микроскопом, то забейте им гвоздь, и он станет бесполезен как микроскоп. Он просто сломается. Это то как ложь действует на человеческий мозг. Большинству хватает ломаного микроскопа в голове, программисту, если он хочет быть хорошим программистом – нет. Уверуйте в развевающееся знамя, программу партии, WMD в Ираке или мудрость корпоративного менеджмента, и ваш код станет хуже.

Опять же, это лишь моя теория.

«Надо»

Третий и последний пример, о котором я хотел бы написать, это слово «надо». В программировании нету отдельностоящего слова «надо», он всегда сопровождается дополнением отвечающим на вопросы «Зачем?», «Для чего?» или «Почему?»

Комментировать программу надо чтобы ее можно было понять. Когда это обьянение пропущено и непонято, получаются строчки кода вроде:

X = 5; // Присвоить переменной X значение 5

With надо использовать, чтобы гарантировать вызов Dispose().

Автопойнтеры полезно использовать, чтобы не было утечек памяти.

Если вы не понимаете зачем что-то «надо», вы скорее всего будете делать это неправильно. Когда вы это осваиваете, это тоже выплескивается в ваше общение с собратьями, если не по разуму, то по крайней мере по биологическому виду.

Дело в том, что к сожалению, большинство мемовирусов устроено так, что они активно используют слово «надо» и программируют свои носители на агрессию на вопрос «зачем?» Попробуйте спросить националиста с окраин бывшего СССР зачем ему его «маленькая но независимая». Попробуйте спросить новообращенного христианина зачем верить в Бога. Попробуйте спросить алкоголика зачем он пьет. Далеко не всегда мемовирусы вредны – некоторые из них являются симбиотами, которые помогают носителю. Здравый патриотизм обеспечивает поддержку и создание среды, в которой легче жить всем. Воздержание от «нечистой» свинины предотвращало отравления в жарких странах. Но в любом случае, «надо» без ответа на вопрос «зачем» плохо лезет в голову программиста, а вопрос «зачем» очень часто оканчивается агрессивной реакцией.

С одной стороны, в экстремальных случаях вроде приведенных выше, это свойство личности программиста защищает вас и только на пользу. Но в граничных, «размытых» случаях оно все равно приносит много проблем.

Например, если ваше дите требует новую видеокарту. Разумеется, это «надо»! Вы, разумеется, спрашиваете «зачем». Вы просто хотите услышать полную версию, вы не понимаете что такое «надо» без обьяснения зачем. Вам может даже вполне устроить ответ «потому что хочется!» или там, «у меня без нее игрушка не идет!» Более того, на второй ответ вы можете заставить ребенка разобраться точно, чего именно не хватает и что именно нужно – поскольку теперь понятна цель и понятен критерий. То есть вы могли бы продолжать и сделать то, что от вас хотят. Что непрограммист слышит в ответ – это то, что вы не хотите купить видеокарту. Дальше в зависимости от отношений в семье вместо ответа на ваш вопрос начинаются игры, чтобы вас уломать, что не только не отвечает на ваш вопрос, а вообще запутывает его до состояния когда вообще ничего не понять. А учитывая то, что непрограммисты не страдают fidelity to reality, то Роулинг отдыхает, дите обижается, а вы получаете лишнюю головную боль.

Вот такое вот вредное слово «надо»...

На этом я, пожалуй, закончу серию статей. Просто для тех, кто хочет стать программистом, я хотел описать некоторые моменты, которые их ждут по другую сторону. В принципе, ничего страшного.

Friday, December 5, 2008

Как стать хорошим программистом? (часть 3 из 3). Обратная сторона Луны

Кстати, если уж говорить о теме, то нужно затронуть и то, что вас ждет на другой стороне. Опять же, задача на самом деле неподъемная, но я по крайней мере могу описать некоторые сюрпризы, которые вас ожидают. Как обычно, не самые приятные.

Да-да, кросс-пост с персонального...

Писатель или литературовед?

Все, что я описал раньше, поможет вам писать хороший код, «любить это дело», да и знать его тоже. Вот только код уже давно не так много взаимодействует с внешним миром, будь то кнопки клавиатуры, движения мышки или взаимодействие со специализированными устройствами, сколько в кодом написанным другими программистами, в первую очередь, платформой и легаси вашей собственной фирмы.

Причем код платформы и легаси код вашей фирмы далеко не всегда написан хорошими программистами. Очень часто совсем наоборот. Более того, и там, и там, отдельные сорвавшиеся с поводка программисты, которые восприняли родную фирму как еще один компьютер, который надо запрограммировать, создают свои «платформы» направо и налево. А вам в этом добре разбираться.

Пример 1: Строки в С++. Строки бывают простые, широкие и мультибайтные. Но это еще ничего, поскольку можно в команде договориться использовать только широкие и тогда преобразования будут требоваться достаточно редко. Но есть еще несколько представлений строк. Есть стандартные С++ строки, кончающиеся нулем. Есть VB-style строки с длиной перед указателем на строку (и нулем в конце). Есть STL строки, которые работают как нормальный автоматический объект, хотя и со своими тараканами. И есть ATL строки, которые претендуют на то же, что и STL строки.

Каждая из них имеет свои проблемы. Кончающиеся нулем С++ строки считаются одной из двух главных причин всех багов в программах на С++ наравне с указателями и адресной арифметикой. VB строки были бы не так плохи, но их необходимо аллокировать одним и тем же способом, иначе вы запутаетесь как их освобождать. А в ряде случаев вы обязаны их аллокировать как глобальную память, то что вам всегда придется так делать. А размещение глобальной памяти – это очень дорогая операция. Особенно для такого популярного обьекта как строка. STL строки в общем не так и плохи, если не считать того, что они тянут за собой всю STL библиотеку. Что в ряде случаев нежелательно. А главное, как только ваш проект начинает ее использовать, незрелые умы в вашей группе тут же начинают использовать и другие обьекты из оной библиотеки – они и правда очень удобные. Что кончается тем, что вы обнаруживаете свой продукт в тестовой лаборатории завесившим всю машину и использующим 100% процессора. Есть такой таракан в  STL. Ну, а уж если вы вляпались в ATL...

Что в этой картине самое поганое, это то, что как только ваш продукт начинает взаимодействовать с платформой и другими компонентами, вы оказываетесь вынуждены использовать чуть ли не все четыре представления и конвертировать их из одного в другое направо и налево. Win32 использует в основном С++ строки с нулем в конце, COM и WMI часто требуют VB строк, а многочисленные левые компоненты, которые вы подобрали, чтобы не изобретать велосипед, запросто могут потребовать STL и ATL строк.

Пример 2: Media Foundation. Это такой новый фреймворк на нашей фирменной горной вершине дабы играть аудио и видео медиа. Выглядит как набор API, где все необходимые источники, парсеры, трубы, дешифровщики, размазыватели по стенкам (как правильно перевести «rendeder»?) соединяются вместе в полной гармонии и дружной работе по проигрыванию того или иного мультимедийного формата. Причем вы можете (теоретически) просто имплементировать еще одну компоненту, скажем, декодер или источник для определенного формата, и он должен магически начать работать. Ну, то есть буквально магически, поскольку вам еще придется поплясать вокруг костра с бубном – записать куда надо в регистр правильные ключи, правильно оформить DLL,... Один из наиболее впечатливших меня па в этом танце и соло на бубне является то, что вам придется писать в практически полной COM системе, имплементируя на каждом вашем объекте IUnknown со всеми причандалами для ref counting и правильного управвления циклом жизни этих объектов, но при этом сам COM не используется. То есть как бы, all pain, no gain. Просто мазохизм какой-то.

Поневоле вспоминается бородатый анекдот про водителя и феечку. Стоит на обочине дороги водитель и грустно смотри на свою машину, у которой отвалилось колесо. Пролетает мимо феечка: «Чего делаешь?» «Да, вот, с колесом #$%^&*!» «А хочешь по-настоящему?» Водитель взглянул на феечку, симпатичная... «Ну, хочу.» Взмахнула феечка волшебной палочкой, и у машины отвалились остальные три колеса. Такое вот «настоящее» программирование.

Так вот, это все – не то ради чего вы пришли в программирование. Это как если  вы стоите на лесной тропинке и брезгливо оттираете подошву кроссовки об опавшую листву, мысленно матеря на все лады любителей собак... или там, создателей платформ. К слову, если кто решит по этому поводу покритиковать Windows, рекомендую поглядеть на Java и Java 2 – тоже очень большой и очень популярный у любителей собак лес. Вы еще помните (оттирая подошву об опавшую листву) AWT? В общем, «учись сынок, а то так и будешь всю жизнь ключи подавать...»

Если вы не в курсе, имелся в виду анекдот про двух сантехников, мастера и помощника. Вызывали их на прочистку, весь подвал залит понятно чем, мастер ныряет, ученик сидит на лестнице, ждет. Через пару минут мастер выныривает и кричит «Ключ номер десять!» Ученик подает, мастер ныряет, еще через пару минут раздается бульканье и содержимое подвала уходит вниз в канализацию. Мастер подходит к ученику, стряхивая кусочки того, что только что плавало вокруг, и говорит: «Учись, сынок, а то так и будешь всю жизнь ключи подавать...»

И чем больше кода написано в мире вашими предшественниками, тем больше времени у вас занимает именно это, а отнюдь не написание нового кода, делающего что-то полезное.

Рынок труда

Вообще-то, в плане рынка труда программистам грех жаловаться. В кризисы, когда фирмы увольняют направо и налево, им все равно нужно чтобы работа делалась. Соответственно, ее перекладывают на компьютеры, что приводит к новым проектам и новым рабочим местам для программистов. В условиях нынешнего кризиса, начавшегося в октябре 2008-го, правительство Британии считает, что в следующем году им потребуется на 100,000+ больше программистов, чем в этом году (цифра приблизительная, точнее она выглядит ближе в 150 тысячам, но поскольку точно не помню, то и врать не буду). А когда кризис проходит, все это добро по-прежнему надо сопровождать, развивать, да еще и стратапы появляются.

В общем, я в курсе, что очень много программистов на Восточном побережье США, особенно бывших работников Citi, Wachovia, Washington Mutual со мной не согласятся, но все-таки по сравнению с другими профессиями мы в относительно хорошей форме. С одной стороны сборщикам машин на конвейрных линиях в Детройте или там шахтерам после закрытия завода или шахты остается только прямая дорога в систему общепита – жарить картошку и гамбургеры. Неудачливым или начинающим адвокатам и врачам тоже на самом деле несладко – доходы падают, а конкуренция растет, поскольку все новые толпы молодежи рвутся в эти профессии, думая, что там всегда будет медом намазано. Менджеры низшего и среднего звена вообще никому не нужны. В программировании таких проблем нет.

Конечно, есть некоторая массивная конкуренция со стороны программистов-иммигрантов из Индии и Китая. Но это все равно не сравнить с конкуренцией, которую испытывают между собой скажем выпускники-юристы. Да и ситуация меняется. Многие из них уезжают обратно на родину, либо не найдя работы, либо найдя дома лучшую работу в пересчете на местные цены. Чтобы понять масштаб явления, оцените следующий не очень относящийся к делу, но показательный факт: в 2008-м примерно два миллиона мексиканцев добровольно покинуло США и вернулось домой, считая, что в Мексике у них лучшие шансы на работу и нормальную жизнь. Причем, речь идет отнюдь не о программистах. Оценили?

Так что программисты из Индии и Китая - это скорее больше проблема для начинающих российских программистов здесь, которые еще не понимают культуры других народов. Как только вы начинаете понимать культуру китайцев, индусов, британцев, латиноамериканцев, румынов, и собственно американцев, оказывается, что большинство ваших коллег – отличные ребята и девчата, к которым вы начинаете испытывать искреннюю симпатию, даже если и несогласны с некоторыми их инженерными решениями. Вонючки, ясное дело, тоже иногда попадаются, но где их нет? В общем, конкуренция с программистами из Индии и Китая не такой уж большой фактор. А если вы хотите быть программистом в России, то и тем более неактуальный.

Однако, есть один фактор, который полезно понимать. Это то, что рынок труда программистов начинает структуироваться. И большая часть рынка труда на самом деле предназначена не для лучших, а для средних, а то и посредственных программистов. Так что большая часть того, чему вы научитесь на разных курсах или из тех же книжек, которые я упомянул раньше, вам не пригодится. Я уже упоминал, что за все время жизни в Штатах я только несколько раз написал сортировки, причем только один раз по работе, а остальное время так, для удовольствия?

Самое смешное, что интервьюировать-то вас будут все равно по-серьезному, а вот работа будет куда примитивнее и часто скучнее. Виноваты в этом часто сами программисты, которые проводят интервью. IT менеджеры просто вынуждены полагаться на их мнение, а наши собратья по профессии из средней категории часто отличаются полным отсутствие чувства меры. Так что гоняют вас на должность чуть ли не архитекта, а потом вы рисуете формочки. Причина простая. «Недоделанные» программисты обычно очень гордятся кусочками знания, которые им все-таки довелось получить, и поскольку эти кусочки разрозненные и случайные, то спектр вопросов, который вас ожидает на интервью в средней фирме, фактически очень широк. Куда шире, чем одолели бы те, кто проводит с вами интервью. В общем, вас наймут как микроскоп, и тут же начнут вами забивать гвозды. Это не очень приятно.

Смежный эффект происходит по той же причине: когда у «недоделанного» программиста в голове хорошо проработан один кусочек знания, он часто становится религиозной темой для него. Скажем, работал я с один товарищем (кстати, и правда товарищем – он из Китая), который хорошо знал уже упомянутый MF, и все делал в его стиле. Одна нить, все объекты в стиле COM, все операции асинхронно с обратными вызовами через IMFAsyncResponse... И любой программист, который так не делал, воспринимался им как плохой программист. И попробуйте угадать в первые несколько минут интервью, какие тараканы рулят в голове вашего собеседника? Причем, если вы умеете это делать, может вам лучше не в программисты, а в психиатры?

Никак не забуду один случай еще в конце 97-го – начале 98-го года. Я проходил интервью по телефону в фирме в Чикаго. Интервьюер очень хорошо знал MFC и очень гордился этим, так что и вопрос был по теме:

«А что вы сделаете, если вам нужно засунуть сто тысяч элементов в listbox?»

«Я не буду засовывать сто тысяч элементов в listbox.»

«А если заказчик требует?»

«Я поговорю с заказчиком и обьясню почему это неправильно.»

«А если он настаивает?»

«Тогда я сделаю в лоб, и покажу ему что это не работает. А потом сделаю без этого огромного listbox с какой-то навигацией...»

«А если он все равно настаивает?»

«Можно просто сделать в лоб, поскольку тут уж все равно. Машина – железная, она может и потянет, а пользователь, сидящий перед экраном – нет.»

Ребенок на самом деле хотел услышать ответ, что можно повесить обработчики событий на движения списка и динамически добавлять-убирать элементы из него. Решение, к слову, идиотское сразу по нескольким причинам – для начала слайдер сбоку listbox начал бы вести себя очень странно, попасть в нужную точку списка быстро было бы серьезной проблемой, а уж о дисковых операциях на кручение слайдера вверх-вних и думать страшно (поскольку сыр-бор был в первую очередь из-за того, что весь список не лез в память), но я даже не стал это обсуждать. Ему не было никакого дела до заказчика или пользователя. Вот MFC – это вещчь! В общем, я быстро понял, что туда не хочу, и чувство это было взаимным. Но это – прекрасная иллюстрация к тому, что интервьюировать вас нередко будут как раз не настоящие программисты, а полные идиоты.

И главное, это то, что я уже сказал. Нет так много хороших программистов и нужно в экономике. Да, есть заповедники гоблинов вроде MS или Гугл. Хотя и количество этих островков сокращаются. Sun явно идет на закат, IBM того гляди вообще всю разработку выставит в Китай и Индию, Intel и Motorola уверенно идут той же дорогой, только еще часть работ выводят в Россию... Есть некоторое количество консалтинга. То есть консалтинга много, а вот консалтинга, требующего хороших программистов так себе. Еще в хорошие времена есть стартапы. Ну, в общем-то и все.

В общем, пройти интервью вам это поможет, а насколько вы сможете задействовать свой потенциал – вопрос открытый.

Социальный статус

Не знаю, каков социальный статус у программистов в России, но надо понимать, что в целом программисты – это «синие воротнички» с высокой зарплатой. И обращаются с вами соответственно. Если в России вы работали в науке или преподавании, в университетской среде, то получали вы может и очень немного, но ваша свобода как в распоряжении своим временем, так и в направлении исследований была несравненно выше. Даже если вы подрабатывали консалтингом и проектами на стороне. А свобода – это один из важнейших показателей социального статуса.

Уйдя в программисты, особенно программисты в Америке, все это меняется. Это работа по найму. Это рабочий день с 9 до 5 (а то и с 9 до 9). Это подчинение менеджменту. Это партсобрания, пардон, team meetings, на которых вам втюхивают, как вам повезло и какая классная группа, команда, фирма, на которую вы работаете. Причем делают это так фальшиво и неубедительно, что даже если вы в это и верили, то начнете сомневаться. Это не говоря о том, что вам это будут втюхивать даже если ваша фирма делает цифровые контроллеры для унитазов. Кстати, вероятно полезная штука, но очень неудобный объект для пропаганды. Вас может не клеймят как скот, но периодически выдают футболки с лого фирмы или вашего продукта. В принципе, опять же, это даже и неплохо, но все равно что-то где-то в глубине души... как бы это сказать... шкрябает...

В общем, не все так плохо. Получаете вы все равно неимоверно больше чем сезонный Педро, работающий на уборке фруктов. У вас свой дом, хотя бы и с ипотекой. Страховка от работодателя гарантирует вам доступ к медицине и врачам. Вам есть на что содержать семью, послать детей учиться в университет. Так что, были бы деньги, а на социальный статус можно и плюнуть. В конце концов, доходы программистов сравнимы с доходами многих врачей и юристов. Просто надо понимать, что программирование – это не социальный лифт, и стать миллионером (или просто достичь финансовой независимости) в этой профессии ничуть не легче чем в любой другой. И «стекляный потолок» может и выше, чем в многих других областях, но все равно вполне реален и весьма прочен.

Но наблюдая некоторых наших соотечественников я могу сказать, что многих из них это беспокоит. По крайней мере судя по болезненной потребности доказать первому встречному-поперечному как правильно они сделали, что уехали из России. Я, конечно, не психиатр, но когда кто-то представляет свой внедорожник-Лексус как достижение жизни, и ездит хвастаться им на партсобрания республиканцев... в общем, вспоминается бородатый анекдот про панка и нового русского.

Если не в курсе: Подъезжает новый русский к заправке, рядом стоит панк с зелеными волосами. Тот спрашивает, а что с волосами-то? Панк отвечает, ну, чтобы отличаться. Новый русский тыкает себе в грудь и говорит: «Видишь, пиджак? Тыщу баксов стоит. УМОМ НАДО ОТЛИЧАТЬСЯ!»

К слову, я не пытаюсь вас отговорить от программирования. Просто насколько могу честно рассказываю о некоторых не столь широко известных аспектах этой профессии. И если вы внимательно посмотрите на другие профессии, то скорее всего будет как сказал бы Иа-Иа, «Так и знал. С этой стороны ничуть не лучше.»

 

Tuesday, December 2, 2008

Как стать хорошим программистом? (часть 2 из 3)

Ну, что ж... продолжим. А если все-таки случилось так, что вы – не программист, а хотите им стать. И даже по здравому размышлению, поняли конкретную реальную причину почему вы этого хотите.

Да-да, как обычно, с персонального блога...

Для начала, поздравляю, вы уже удовлетворяете первому требованию к хорошему программисту. Вы не только пытаетесь что-то сделать, вы еще и критично все оценили, убедились, что вам это действительно нужно, и точно знаете причину. Хороший программист просто обязан выпить стакан-другой крови PM'а (менеджера, архитекта, аналиста, или кто там обьясняет вам, что надо делать). И вовсе не потому, что это вам или ему продлит жизнь, даже в полную луну. Скорее наоборот. Но зато вы будете ПОНИМАТЬ что же вы делаете и зачем. А это означает, что ваш код будет делать то, что нужно пользователю. Для справки, я уже писал, что происходит в обратном случае. То есть, когда программист не понимает, что надо. Посмотрите историю блога.

К слову, это кажется очень простым требованием. Это не простое требование, это только вам так кажется. Мы все привыкли толковать движения ушами и хвостом, как в «Повести о ходже Насреддине», а затем верить в то, что наши фантазии -  это святая правда. Как бы вы ни истолковали, вы от этого не станете визирем, а ишак – принцем. И хороший программист знает, что каким бы ослом ни был заказчик, толковать движения его ушей нельзя – нужно чтобы он сам сказал, что хочет. И если в консалтинге, где заказчик еще и сам платит деньги, приходится идти на компромиссы (аккуратно прикрыв предварительно пятую точку), то уж когда заказчика представляет работник вашей собственной компании – будь то PM, архитект, или там, «аналист» – тут уж точно необходимо переквалифицироваться из легковерного Агабека в папу Мюллера.

Что приводит нас ко второму обязательному университетскому курсу для профессии программиста, называемому «Как стать занудой». Да-да, вы уже догадались? Это шутка. Подчеркиваю, ШУТКА. Нет, не шутка в смысле статьи, для программирования это и правда нужно. Шутка, в том смысле, что такого курса не бывает. Не, правда. Ни в одном университете такого курса я не видал. Вот сходил на Гугл – и правда, нет таких курсов. И вообще, этому не учат в университетах...

Ладно, в тексте блога быть занудой на самом деле необязательно, но это все равно не знание, это – черта личности, которая будет переть из вас где надо, и где не надо. Вообще, вам приходилось слышать фразу «программист – это не профессия, это диагноз»? Упомянутое письмо включало примечание вроде: «Я даже могу принять такой ответ как «Стать программистом нельзя – им надо родиться!»» Так вот, стать программистом можно! Врожденная склонность, равно как и неаккуратные няньки, стукающие младенцев головой об перила, бывает помогают, но само программирование – это не врожденное, это благоприобретенное. Ну, как другие состояния психики, кончающиеся заботливыми руками санитаров. Хорошая новость в том, что состояние психики именуемое «программист» столь полезно обществу, что вместо санитаров и обитой войлоком комнаты вас сажают в обитый тканью кубик и используя особенность заболевания, приковывают вас к тихо шуршащему ящику, переливающемуся яркими красками монитором, мышке и прямоугольному устройству с множеством кнопочек, которые можно нажимать в таком разнообразном количестве комбинаций... Причем приковывают не буквально, а просто знают, что от этой игрушки вы никуда не денетесь. А подающим признаки выздоровления вроде меня всегда можно дать 3-4 таких ящика, желательно разных (пару под Вистой, один под Windows Server, один под XP, один Мак, и один Xbox в версии для разработчкиов – ну, да, обычный Xbox – это для программиста слишком скучно). Такое практически детерминированно заканчивается острым рецидивом весьма полезным для общества, фирмы, и даже счета в банке самого больного. Могу подтвердить. В общем, никто не в обиде.

Собственно, точность и занудность – это просто две стороны главной стороны личности программиста, которую я называю fidelity to reality – верность реальности. Не «правде», не «истине», а именно «реальности». Не тому, что написано на развевающемся знамени, а тому «как на самом деле». И опять же, это не университетский курс, это свойство личности. Не врожденное, благоприобретенное, но тем не менее свойство личности, которое будет видно и во всех остальных областях вашей деятельности. Во всех областях вашей ЖИЗНИ. И это будет мешать. Серьезно будет. Ваш единственный шанс вписаться в организации вроде Коммунистической Партии Советского Союза (а также менеджерской структуры любой американской корпорации) – это воспринять реальность как еще один восхитительный компьютер, который надо запрограммировать. Но добравшись до этого состояния вы, скорее всего, потеряны для программирования, поскольку программирование человеческих сообществ после программирования компьютеров – это как гоночный автомобиль или самолет после механической колымаги от Тойоты или General Motors. Количество адреналина и серотонина просто несравнимое. К слову, а макроэкономика (в рамках стран и мира), если вы не обращаетесь с ней как профессиональные экономисты (дойная корова, способ развести лохов в правительстве на вашу липовую модель), а как программист («как это на самом деле?») – это как космический корабль из StarWars, StarTrek или там Babylon 5.

Обращаясь к автору письма: вы, должно быть, разочарованы. Вы спросили меня о практических советах, а я тут о свойствах личности рассуждаю. Нет, чтобы по-простому, делай раз, делая два, делай три... Но в том-то и дело, что программист – это в первую очередь свойство психики, если вообще, не состояние психики. Я, конечно, говорю о хорошем программисте. Рисовать формочки все это не нужно. Берете месячный курс C# и .Net или там Visual Basic – и вперед. Ни одного настоящего программиста вы не обманете, но такие тоже нужны. В общем, никаких проблем. Даже не раз-два-три, а ррраз, и программист! В общем, если это то, что вам нужно – вперед, и дочитывать этот пост ни к чему. А пока вернемся к настоящему программисту.

Кстати, изменение своей собственной психики кажется далеко не простым делом, но трюк в том, что от вас и не требуется его делать самостоятельно. Нет-нет, никаких университетских курсов. Изменения происходят сами собой по мере того как программирование затягивает вас как наркотик. Fidelity to reality не воспитывается заботливыми гувернантками или профессорами, оно – результат вашего общения с компьютером в роли программиста. В реальной жизни есть много причин предать реальность, и обычно они все сопровождаются кратковременными наградами. В программировании каждый раз, когда вы предаете реальность, вы тут же получаете столом по морде. С полного размаха. Компьютер ляпов не прощает. Компьютер тупой и исполнительный, он делает ровно то, что вы сказали, даже если ваше махание ушами и хвостом не должно было это означать. И это происходит изо дня в день, из месяца в месяц, из года в год. И вы привыкаете к мысли, что ваша вера в то, что вы написали все правильно не имеет никакого значения, и каждый ваш ляп вылезает тут же и нелицеприятно. По крайней мере пока вы не приучились делать только ОЧЕНЬ мелкие ляпы. К чему компьютер и приучает вышеописанным методом очень и очень эффективно.

К слову, еще одна черта воспитываемая компьютером в программисте, это твердая вера, что КАЖДАЯ ПРОГРАММА ИМЕЕТ ХОТЯ БЫ ОДИН БАГ. Это означает знание, что сам ты тоже в чем-то неправ, о чем бы ни шел разговор, и способность продолжать действовать и не впадать в истерику по этому поводу. Правда, общение с простыми смертными часто приводит к убеждению, что они-то вообще почти во всем не правы. К этому вас приучает даже не компьютер, а сами простые смертные, компьютер лишь приучает вас это замечать. Тоже, как понимаете, не самая лучшая черта в плане социальных навыков. Хотя обычно помогает то, что вы в основном общаетесь почти исключительно в обществе программистов, на которых (после многолетнего мордобития со стороны компьютеров) это правило к вашему удовольствию не распространяется. В смысле, они не всегда неправы, а только так, изредка, баг проскакивает. В общем, выражение «тараканы в голове» приобретает несколько новую и очень конкретную форму.

Теперь главный вопрос о том, как стать программистом. Мы уже выяснили, что главное – долго и упорно потихоньку (а лучше в полную силу) программировать, а уж компьютер сам из вас сделает программиста своей нелицеприятной и жесткой реакцией на плохой код. А вот как продолжать программировать достаточно долго, чтобы это произошло. А ответ простой. Для этого нужно получать от программирования удовольствие.

Некоторые сравнивают программирование с сексом. И знаете, в этом есть изрядная доля правды. По крайней мере на стадии хакера. К слову, публика считает «хакеров» какими-то исключительными программистами. Это неправда. Хакер – это как раз начинающий программист. Своего рода личинка программиста. Освещение в прессе и инциденты с хакерами обычно связаны как раз с тем, что их квалификации еще не хватает, чтобы получить нормальную работу программиста, а программировать хочется, поскольку они от этого получают тонны удовольствия, вот и программируют что попало вплоть до компьютерных инфекций. С начинающими в сексе тоже такое случается. Это уже потом случайных dial-up'ов начинает нехватать, и приходится все-таки тратиться на DSL, а то и T1, кому как повезет. Кстати, заметили что от программирования и секса я перескочил на Интернет. К слову, того же поля ягода...

Можно неполткорректный анекдот? Луг, стадо коров, холм, на вершине холма старый здоровый бык и молодой бычок. Бык флегматично жует траву, а бычок прыгает вокруг и с интересом приглядывается к коровам у подножия холма. Подпрыгивает к быку и кричит: «Дядя бык, дяда бык, давай быстро-быстро сбежим с холма и проявим интерес к той ЧЕРНОЙ коровке?» Бык, продолжая жевать, флегматично отвечает: «Не-е-е...» Бычок прыгает вокруг еще и подскакивает с альтрернативным предложением: «Дядя бык, дяда бык, давай быстро-быстро сбежим с холма и проявим интерес к той РЫЖЕЙ коровке?» Бык, продолжая жевать, опять флегматично отвечает: «Не-е-е...» Так повторяется несколько раз. Наконец, бычок спрашивает: «Так, дядя бык, а что ж мы будем делать?» Бык перестает жевать, вздыхает, и отвечает: «Мы медленно-медленно сойдем с холма и проявим интерес ко всему стаду!»

Это к слову, о разнице между хакером и профи, если не поняли.

Ну, и теперь к самому конкретному вопросу в том письме. Какие курсы взять? Хотите честный ответ?

А НИКАКИХ!

Представляете себе такое письмо от бычка: «Дядя бык! Я тут листаю PlayBull и надеюсь когда-нибудь перейти к настоящему сексу. Какие курсы в местном университете и какие сертификации вы посоветуете?» Никаких. Начните общаться с коровками (в случае бычка), девушками (в случае секса) или с компьютером (в случае с программирования). И старайтесь каждый день чуть продвинуться вперед. Ну, там, сегодня пуговку расстегнуть, завтра руку куда засунуть... Если вы IT admin (это я о все о программировании, если вы запутались в моих сравнениях), напишите скрипт там на Питончике, shell или Перле. Потом крохотную программку на C# или C++, которую этот скрипт вызовет. Поучаствуйте в каком-нибудь конкурсе плагинов. Скачайте онлайн библиотеку для персональных нужд. Естественно, программой, которую сами написали. Походите по программистским форумам. Знаете, как начинающие ребята в баре, хвастающиеся своими постельными подвигами. Ну, и так далее. По ходу дела сами увидите какие университетские курсы или сертификации вам нужны. Заодно убедитесь, что как правило лучший способ выучить язык – это начать писать на нем. Ни один курс лучше этого не поможет.

Ну, и в общем и целом, конечно полезно быть в курсе таких университетских предметов как некоторый обьем математики (ставит мозги), вычислительной сложности и алгоритмики, физики и электроники (чтобы знать как эта штука у вас под столом работает, а также быть способным понять изрядный спектр задач во встроенных системах), физики и механики (для тех же нужды, плюс тоже ставит мозги). Короче, хороший университет в области математики, физики, или электроники помогает. Что вы и сами наверняка знаете. Но если возраст уже не тот, чтобы потратить пять лет в хорошем университете (вроде мат-меха Петербургского Государственного, который, как вы понимаете, мой любимый), то просто делайте как описано выше, и заполняйте дырки по мере обнаружения. Все равно ваша карьера в программировании именно так и будет работать – заполнение дырок по мере обнаружения. Как говорится, «век живи – век учись, все равно дураком помрешь.»

Ну, и для совсем уж зануд, есть хороший список из трех книжек на блоге у Сережи Соляника, а в комментариях альтернативный список от Вадика Слесарева. К слову, я уже писал, что быть занудой – обязательное требование для программиста? В общем, привожу эти списки...

Список Сергея:

Список Вадима (то же место):