— Вам уже 45? Но у нас коллектив очень молодой. Вы уверены, что хотели бы у нас работать?
— Да, конечно! Я много наслышан о вашей компании. Это мечта всей моей жизни!
— Ну ладно. Вот вам простой вопросик. Что означает буква L в аббревиатуре SOLID?
— Liskov Substitution Principle.
— Нет. У меня написано, что это Liskov Substitutability Principle.
— Но…!
— Никаких «но»! Неверно ответили, ведь видно же, что не готовились к собеседованию, так и скажите, да еще и спорите! Вы вообще конфликтный человек? Ладно, даю вам еще один шанс. Как развернуть односвязный список?
— Развернуть односвязный список за один проход? Да, пожалуйста. Проходимся по каждой ноде, запоминаем её next, вставляем ей в next указатель на предыдущую, потом идем по запомненному next-у и так далее. Да, в первую ноду в next вставляем, конечно же, nullptr. Нечетко объясняю? Ну давайте я лучше напишу.
— Хм… Хорошо, достаточно. А рекурсивно можете?
— Да, рекурсивно тоже могу.
— А сколько в Москве бензозаправок?
— O-)????!!! 1127!
— Откуда вы знаете???
— А у меня папа работал в Лукойле.
— Ладно… А знаете наихудший случай quicksort? Есть такой наихудший случай. У меня тут на листочке записано…
— Да, знаю.
— Но молодые специалисты это тоже знают. Почему мы должны платить вам на 15% больше?
— Но у меня семья, дети, ипотека… Да я и английский знаю.
— Все его знают. Этим сейчас уже никого не удивишь.
— Но я его очень хорошо знаю и говорить могу тоже хорошо. If you would like to ask me some questions in English, you are welcome.
— Huh!.. Это для нас не принципиально. Зачем программисту говорить на английском?
— Но я еще и французский знаю. Si vous voulez parler francais…
— Хватит!!! Кому в баню в программировании сдался ваш французский???
— Что же мне тогда делать?
— Застрелитесь! То есть… что там у меня написано?.. мы вам перезвоним. Если у нас возникнет такая потребность.
почти выдуманный диалог на собеседовании
У меня растут года. Будет мне 120.
Где работать мне тогда? Чем заниматься?
актуально в свете повышения пенсионного возраста
Когда я начинал свою трудовую деятельность в далеком 1996 году, то и представить себе не мог, как будет развиваться моя профессиональная карьера на десятилетия вперед и чем я буду заниматься, скажем, в 2017. Уверен был, что это будет связано с компьютерами, а чем конкретно – понятия не имел. Даже не был уверен, кем стану: программистом или сисадмином.
Вокруг меня все время были молодые специалисты, причем чем старше я, тем моложе они… 2000-й год… молодые специалисты…. 2010-й год… молодые специалисты…. 2017-й год – другие молодые специалисты. Удивительно, но работаешь 20 лет – и вокруг тебя одни молодые специалисты … и специалистки. Да, в последнее время стало много девушек-программисток. Раньше, лет 15 назад, в процентном отношении среди моих коллег их было от 0 до 5%, а теперь все 20%.
Причем чем больше я работал, тем больше вокруг было молодых специалистов. Как ни удивительно, меньше всего их было на самой первой моей работе, когда сам я был зеленым молодым специалистом, которого никто никуда не хотел брать, только … в компанию к «немолодым специалистам». Я рос, креп, переходил в другие компании, но никак не мог объяснить этот странный феномен. Откуда же берутся все новые и новые молодые специалисты и куда деваются старые? Они же вроде бы должны взрослеть и переставать быть «молодыми»? Но они постоянно присутствуют и появляются все в большем количестве!
Пришло время, я переходил «от подмастерья к мастеру» и наконец на собственной шкуре узнал, куда деваются программисты после 40! Они … стреляются! Шутка! На самом деле все мои бывшие коллеги, которые были когда-то «молодыми специалистами», осели либо за рубежом, либо растворились в граале отечественных IT-технологий Яндексе (не хочу обижать альтернативные граали – Касперского, Abbyy, Parallels, а также сотни менее крупных по масштабам, но, возможно, более прекрасных по духу граальчиков). Никого не осталось! Вот куда поступает «осадок» молодых специалистов. Почему же никто из них не стал «биг-боссом», менеджером высшего звена или иным руководителем? Ну это ж программисты, они код писать любят и своей профессии не предадут. Так что под конец карьеры такие вот «пожилые» специалисты концентрируются в лучших компаниях (а где еще можно работать?).
Поймал себя на мысли, что 20-й год тем только и занимаюсь, что перекладываю данные из одного места в другое… Почти как сортировщик апельсинов из известного анекдота. Ну просто никаких алгоритмов, обычное перекладывание туда-сюда, туда-сюда. И так 15 лет. Ну максимум, был у нас merge sort больших файлов лет 10 назад. И всё. Засортировали и будя.
Вообще, профессия у нас рабочая. Руками мы любим трудиться. Ну мозгом, конечно, тоже надо, не без этого. Не зря же Андрей Аксенов (автор поисковой системы Sphinx) сравнивал программистов, точнее, низкоуровневых программистов-оптимизаторов, с «сантехниками, которые ковыряются в потрохах, рыцарями г… и пара» (доклад на HighLoad 2010 по низкоуровневой оптимизации С/C++).
Дедушка мой, кстати, был сапожником. И не обычным сапожником, а модельным. Он работал в театре и обувал актеров для спектаклей. Он не был менеджером. Зачем сапожникам менеджеры по сапогам? Так вот и я считаю, что менеджер – это совершенно другая профессия. Сапожник сапоги шьет, как и программист, производит реальный продукт, а менеджер управляет процессом производства сапог. Но в театре нет массового производства сапог, равно как и в небольшом стартапе нет массового производства софта.
Не все программисты идут в управленцы, так же как не все управленцы – хорошие программисты. Но для управленца, как ни странно, это не самое главное. Главное — иметь под рукой грамотного профессионала, с которым всегда можно посоветоваться.
Когда лет десять назад подвернулась возможность «продвинуться» в менеджеры, я усомнился в целесообразности этого. Потому что это означало бы деквалификацию. Ведь для любого мастера очень важно ежедневно оттачивать свою технику. Вот для скрипача главное — ежедневная практика. Для спортсмена что главное? Ежедневные тренировки. Если бы я стал полноценным менеджером, то потерял бы возможность главного и самого приятного – программировать. Мне пришлось бы заниматься оргвопросами, принимать участие в совещаниях, ругать и хвалить пресловутых «молодых специалистов», и вообще руко-водить, то есть водить за руку эту зелёную молодежь, вчерашних студентов. Нет! Без меня обойдутся. Займусь-ка лучше тем, где я лучше всего самореализовываюсь.
Относительно себя с возрастом в профессии ты хуже не становишься. Но есть ли возможность беспредельно развиваться в рамках профессии программиста, не меняя её? Конечно, ты не угонишься за всеми трендами и технологиями в Computer Science.
Если в 80-е и 90-е годы IT-специалист в принципе мог владеть исчерпывающим объемом знаний, касавшихся Computer Science, то теперь единственный путь IT-специалиста, как мне кажется – в специализацию. Число областей Computer Science растет в геометрической прогрессии, а время на их изучение ограничено, поэтому специализируйтесь и выбирайте вашу специализацию тщательнее!
Мне как-то пришло сообщение в linkedin от одной рекрутерши или … рекрутрисы (много их теперь стало, а раньше не было совсем. Сам, всё сам… даже через FIDO приходилось искать работу). Она писала:
«Добрый день:) Для восстановления справедливости во Вселенной Орден Джедаев набирает в свои ряды Великих Воинов джедая С++. Действия происходят на хорошо защищенной и комфортной Планете Yandex в центре Московской Галактики!
…(описание вакансии опущено)…
Итак, если Вы — Великий Воин или готовы им стать, жду Тайного манускрипта (резюме). В нашей галактике Вам не страшна звезда уныния и тоски !!»
Письмо, видимо, все же не для великих джедаев, а для тех, кто собирается ими стать, раз адресант сомневается в способности адресата догадаться, что такое «Тайный манускрипт».
Я тут же ответил в духе воина-джедая, не подавая виду, что и сам не догадался бы про «манускрипт» без подсказки:
«Здравствуйте. Большое спасибо за проникнутое юмором послание. Я улыбнулся. Джедаем, Великим Воином, гуру и сенсеем я, безусловно, собираюсь стать. Еще большее спасибо за рекомендацию конкретной вакансии Яндекса. Мне нравится афоризм, в котором говорится, что все программисты делятся на тех, кто уже работает в Яндексе и тех, кто мечтает об этом. Я из последней категории, но мои многие бывшие коллеги уже «там»: они вкусили прелесть работы в лучшей технологической компании страны. Мне же, чтобы дорасти до минимального «проходного» уровня Яндекса (я трезво оцениваю свои знания) необходимо 2-3 года интенсивной подготовки. Необходимо вспомнить институтский курс тервера, порешать задачки на логику и сообразительность, детально изучить то, что «под капотом» у современных библиотек, изучить последние «писки» моды в стандартах С++, алгоритмы на графах и многое, многое другое (список литературы и лекций включает примерно 50 наименований). А ходить «на шару» на интервью в _такую_ компанию (авось пройду) мне совесть не позволит. Отнимать время у Яндексоидов понапрасну не могу. Последний раз был на интервью в «Яндексе» в 2007 году примерно. Получил большое удовольствие (бесплатно обучили :) С тех пор, конечно, уровень свой поднял, но мне еще далеко до необходимого минимума знаний. По рассказам «знающих людей» интервью продолжается более 14 часов. Кандидату дают задачи из разных областей, его собеседуют интервьюеры различных направлений, чтобы составить взвешенное мнение о кандидате. Раньше было проще: не так интенсивно. У меня есть знакомые, которые смотрят на интервью как на своеобразное хобби, позволяющее улучшить свой уровень, пообщаться с коллегами по цеху, приятно провести время наконец. Я отношусь к этому серьезнее, поэтому и подготовкой занимаюсь соответственно. Не буду надолго задерживать ваше внимание. На этом попрощаюсь, но предлагаю поддерживать контакт».
Тем и закончилось общение с чудесной нимфой из Святого Грааля. О Яндекс! Грааль мечты! Только у тебя люди не просто перекладывают данные, а делают с ними что-то осмысленное. Например, пропускают их через чудесный самописный супероптимизированный и концептуально написанный заковыристый алгоритм.
Профессиональное выгорание? О чем вы говорите? Оно наступило у меня уже с десяток лет назад, и обожгло так, что я разродился статьей на хабре и начал со страшной силой читать книжки. Книжки по программированию на английском. Кстати, предпочитаю их русским переводам, потому что наши бывает исказят смысл до неузнаваемости, вот и гадай потом, что имел в виду автор, профильтрованный через их белиберду. Лучше уж взять оригинал.
Меня потряс как-то «список знаний и умений любого уважающего себя» программиста из miram.livejournal.com/630972.html и sharpc.livejournal.com/67583.html. Не поленюсь привести полную цитату:
Все, что должен знать программист, чтобы его после 40 лет не выбросили на Помойку, Где Бомжи.
… В возрасте около 45 лет начинает активно проявляться деградация мозга, приводящая к существенным проблемам в понимании и способности оперировать кодом с обычной цикломатической сложностью. Потеря способности писать код в сочетании с неспособностью из-за отсутствия тренировок к анализу/синтезу — гарантированный путь именно туда. Некоторые люди сохраняют способность оперировать нормальной цикломатической сложностью и в старости, однако лишь за счет превышающих норму показателей в молодости. Проверить, входите ли вы в зону риска, можно на TopCoder.
Добавление от себя. TopCoder – это реально хорошее место, чтобы держать себя в тонусе. Решаем задачки оттуда и поддерживаем тонус (или даже участвуем в challenges, конкурируем с другими и зарабатываем деньги). Итак, что же нужно знать, чтобы тебя не выбросили на помойку?
• C++, стандарт, Comeau, 1TBS, Страустрап/D&E/Джосаттис/Вандервуд, Дьюхэрст/Мейерс/Саттер, RAII/copy-and-swap/exception-safety, правило пяти, Александреску/Абрахамс-Гуртовой, type erasure, CRTP, NVI, SFINAE, Koenig lookup, Duff's device, Boost, Сик-Ламсдейн/Карлссон, TR on C++ performance, тест Степанова, forwarding problem/move semantics, SPECS, GotW, Meyer's singleton, cppgm
• Компиляторы С++, особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile, быстрое вычисление математических функций через битхаки, linkers & loaders by Levine
• Мультитредность, обедающие философы, deadlock/livelock/race condition/starvation, атомарность, lock инструкции процессора, memory model/barrier/ordering, CAS или LL/SC, wait/lock/obstruction-free, ABA problem, написание lock-free контейнеров, spin-lock, TLS/per-thread data, закон Амдала, OpenMP, MPI, map-reduce, critical section/mutex/semaphore/condition variable, WaitForSingleObject/WaitForMultipleObjects, green thread/coroutine, pthreads, future/deferred/promise, модель акторов, parameter server, RDD (as seen in sparks), downpour SGD, wait-free, stackful vs stackless
• Язык ассемблера, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, x86, FPU/MMX/SSEn/AVX, AT&T и Intel-синтаксис, masm32, макросы, стек, куча/менеджеры кучи, соглашения вызова, hex-коды, машинное представление данных, IEEE754, little/big endian, SIMD, аппаратные исключения, прерывания, виртуальная память, реверсинг, срыв стека и кучи, return oriented programming, alphanumeric shellcode, L1/L2/RAM/page fault и их тайминг, язык ассемблера ARM
• Аппаратное обеспечение, Хоровиц-Хилл/Титце-Шенк/От физики к Си от panchul, полупроводниковая электроника/спинтроника/фотоника, транзистор, триггер, схемотехника, микрокод, технология создания процессоров, logic synthesis, static timing analysis, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomy ([SM]I[SM]D), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86, VID/PID
• Процессоры, конвейеризация, hyper-threading, алгоритм томасуло, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти, intel optimization manuals, performance counters
• Дискретная математика, K2, теорема Поста, схемы, конечные автоматы (ДКА и НДКА), автомат Калашникова, клеточные автоматы
• Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем, interactive proofs, теорема Левина-Кука, 3SAT, PSPACE = NPSPACE, #P
• Языки программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, PCRE, БНФ, Boost.Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, статический анализ кода, компиляция/декомпиляция/обфускация/деобфускация, Clang/LLVM/XMLVM/Emscripten, GCCXML, OpenC++, построение виртуальных машин, JiT/AoT/GC, DSL/DSEL, on-stack replacement, type checking/type inference алгоритмы, CYK parser, advanced compiler design and implementation by Muchnick
• Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос/e-maxx.ru, структуры данных, алгоритмы, сложность, символика Ландау, теорема Акра-Баззи, time-space tradeoff, классы сложности, NP-полные задачи, КМП, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика, gusfield (suffix tree, string alignment), motif search, scanning line, cache oblivious, funnel sorting, VEB-layout, корневая оптимизация, алгоритмы для динамических графов,
модели вычисления (RAM-machine/pointer machine/decision trees и т.д.), алгоритмы в иерархиях памяти/стриминговые алгоритмы, time forward processing, range & rank, LSM-trees, buffered a-b-trees, toku trees, персистентные структуры, succint-структуры, lossy-струтуры (bloom/bloomier filter, hash-tables with false positives), locality sensitive hashing, space-time tradeoff в хэш-таблицах, scheduling strategies
• Численные методы, дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, QR и LU-декомпозиция, SVD, МНК, методы Рунге-Кутты, метод Адамса, формулы Ньютона-Котеса, метод Ритца, метод Бубнова-Галеркина, метод конечных разностей/элементов, FFT/STFT, сходимость и устойчивость, l-bfgs и другие квазиньютоновские методы, adagrad, PARAFAC, cassowary, interior point methods, вариационные методы для байесовского вывода, nesterov, автоматическое дифференцирование, alternating least squares, what every computer scientist should know about floating point arithmetics by Goldberg, Nocedal & Wright/Boyd & Vandenberghe
• Машинное обучение, Тибширани/Bishop, подходы к моделированию AI, переобучение/кроссвалидация, байесовские сети, нейросети, сети Кохонена, Restricted Boltzmann machine, градиентный спуск/hill climbing, стохастическая оптимизация (метод Монте-Карло, метод отжига, генетические алгоритмы, муравьиные алгоритмы), SVM, gradient boosting, кластерный анализ, метод главных компонент, LSH, обучение с подкреплением, MDP, information retrieval/data mining/natural language processing, машинное зрение, Szeliski, OpenCV, image processing, OCR, фильтры Собеля, каскад Хаара, Viola-Jones framework, SURF, введение в психофизиологию зрения, IPython/pandas/scikit-learn, (ME)HMM, CRF, label bias problem, stacked NN, LeToR, factorization machines, autoencoders, RNN/CNN, вместо NLP лучше отдельные задачи (language modelling, co-reference detection, text chunking, POS-tagging, probabilistic parsing, statistical machine translation, misspell correction, question answering, NER, collocation detection, text summarization, speech recognition, fact extraction, sentiment analysis), эффективное вычисление softmax, feature engineering/selection, quality estimation, Manning/Jurafsky/McCallum/Koehn, latent topics (LDA, chineese restaurant, pLSI), parallel coordinates, vowpal wabbit, NLTK, structured learning, EM-алгоритм, contrastive divergence, optimal brain surgery, belief propagation, semi-supervised learning, inductive vs transductive learning, kernel trick, discriminative/generative pairs (as seen by Ng & Jordan), sequence to sequence learning, bagging, анализ социальных графов, рекомендательные системы/collaborative filtering, multimodal learning
• Теория информации, сжатие, Хаффман, RLE, BWT, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова, maximum entropy problem, kullback-leibler divergence, elias/shannon-elias encoding
• Криптография, Шнайер/Ященко, Принцип Керкгоффса, симметричная (DES, AES), асимметричная (RSA), качество ГПСЧ, алгоритм Диффи-Хеллмана, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки (атака гроссмейстера), WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, PKI, HTTPS/SSL, доказательство с нулевым разглашением, пороговая схема, murmurhash/cityhash, DKIM
• Математика, Кнут-Грэхем-Паташник/Зорич/Винберг, Spivak/Dummit-Foote, матан, линал, комплан, функан, диффгем, теория чисел, дифуры/интуры/урчпы/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теорвер/матстат/слупы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple), теория категорий
• Физика, правила Кирхгофа, закон Джоуля-Ленца, комплексное сопротивление, скорость и частота света, уравнения Максвелла, лагранжиан и гамильтониан,
quantum tunnelling/hot electron injection :)
• Химия, стехиометрия, химия кремния :)
• Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александреску-Саттер/Буч, защитное программирование, паттерны, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, метрики кода, uncle Bob
• Методологии разработки, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE
• Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI, mocks/stubs/spies, fixture, запахи и паттерны тестов (Osherove/Meszaros)
• Инструментальные средства разработки, IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), DWARF debug information format, дизассемблеры и декомпиляторы (IDA/HexRays/Reflector), системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ (lint, cppcheck), динамический анализ (valgrind, фаззинг), верификация и валидация ПО (Frama-C, RAISE (RSL), Coq), профайлинг, багтрекеры, документирование кода, системы сборки (CMake), пакетные менеджеры (NuGet)
• Фреймворки, Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre
• Операционные системы, Silberschatz/Рихтер/Соломон-Руссинович/Робачевский/Вахалия/Стивенс/Таненбаум/Love/Linux Kernel Internals, менеджер памяти, менеджер кучи и ее устройство (LAL/LFH/slab), менеджер устройств, менеджер процессов, context switch, реальный и защищенный режим, исполнимые файлы (PE/ELF/Mach), объекты ядра, отладочные механизмы (strace/ptrace/dtrace/pydbg, Debug API) и минидампы, bash, сетевой стек и высокопроизводительные сервера, netgraph, CR0, IPC, оконная подсистема, система безопасности: ACE/ACL и права доступа, технологии виртуализации, RTOS (QNX), программирование драйверов, IRQL, IRP, файловые системы, BigTable, NDIS/miniport/FS drivers/filter driver, Mm-, Io-, Ldr-функции, DKOM и руткиты, GDT/IDT/SDT, ядра Windows/Linux/BSD, POSIX, TRIM
• Компонентно-ориентированные модели, Роджерсон/Таварес, COM/OLE/ActiveX/COM+/DCOM RPC, ATL, апартменты, моникеры, MIDL, XPCOM, CORBA, TAO, D-Bus
• Сеть, Стивенс, OSI model/Internet model, Ethernet, TCP/IP, TCP window, алгоритм Нейгла, сокеты, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, роутинг/BGP/OSPF, ARP, атака Митника, syn flood, HTTP/FTP, P2P/DHT, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth/GPS, ACE, Wireshark
• Графика и GPGPU, алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA/AMP, ландшафты, лоды, тени, deferred shading, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping, virtual/augmented reality
• Форматы, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON/bencode, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode, кодировки однобайтные/UTF-8/UTF-16/UCS-2/UTF-32, проблемы длины и сравнения Unicode-строк, base64, markdown
• Базы данных/Распределенные системы, Грубер/Дейт, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, хранимые процедуры, триггеры, алгебра Кодда/А, Tutorial D, нормальные формы, оптимизация и выполнение запросов, структуры данных индексов, транзакции и ACID, CAP-теорема Брюера, graph DB, document store, wide column store, key-value storage, теория распределенных систем, CRDT, net split проблема, протоколы консенсуса, теория шардинга/репликации, ORM (C++ ODB), ERD, OLAP, семантическая сеть, triplestore, RDF/Turtle, SPARQL, OWL, Semanticscience Integrated Ontology, reasoner, DBpedia, big table/hbase vs. dynamodb/cassandra/riak, 2/3PC, chubby/zoo keeper, leader election (paxos/raft), hdfs/gfs/glusterfs, deduplication problem, causality detection (vector clock/stamps), R/W quorum, load balancing, устройство индексов поисковых систем, event sourcing, CRDT, дизайн протоколов и принципы коммуникации, с точки зрения эволюции, расширяемости, надежности, дизайн программных интерфейсов (API)
• Прикладное программирование, C#/F#, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly, Scala, Хорстманн/Одерски, pattern matching, макросы/квазицитаты
• Квантовые вычисления, алгоритм Шора, квантовая криптография
• Функциональное программирование, Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), система типов Хиндли-Милнера, монады, тайпклассы, АТД, dependent types, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)
• Веб-программирование и скриптовые языки, Фланаган/Zend PHP5 Certification Course + Study Guide, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/ReactPHP/Zend Engine/Doctrine или Propel/CodeIgniter или Symphony или Yii, Python/Django/Twisted, Ruby/RoR, ASP.NET MV*, JavaScript/jQuery/React/Google Closure/ExtJS/node.js, ООП в JavaScript, HTML5, CSS3/табличная и блочная верстка, RSS, canvas/WebGL, Ajax/WebSockets, вопросы безопасности (XSS, SQL injection, CSRF), highload, C10k problem, SWIG, CDN, shadow DOM, квирки браузеров, real time bidding/trading, anomaly detection, архитектура single page apps, устройство веб-краулеров, web/social graph random walk, asm.js и компиляция в js, v8/spidermonkey internals, PaaS/IaaS, SPDY
• Проектирование GUI и представление информации, Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX, алгоритмы визуализации данных (as seen in d3), subpixel rendering
Немного на 40 лет, правда? Или много, если надо еще и работать? Действительно, когда же это изучать, если надо работать? В свободное время? А я не знаю и половины из этого списка. И четверти не знаю. Метод Карацубы пока не освоил. Химию кремния, наверное, придется, как и уравнения Максвелла, отправить в долгий ящик. Есть более приоритетные темы.
Но в свете будущего повышения пенсионного возраста мне ведь еще минимум лет 40 работать – как раз узнаю вторую половину в свободное от работы время. И что же, что будет, если я всё это узнаю? Что будет с тем гением, который знает всё по этому списку? Уверен, что его не только не выбросят на помойку, более того, его под конец жизни ожидает священный грааль – Яндекс (и зарплата молодого специалиста + 15%). Там он и найдет упокоение. Аминь.