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

12 вещей, которые помогут вам в учебе и работе. Мы выбрали для вас дюжину лучших ответов со stackexchange на вопрос «Что должен знать программист?».

Если вы только начинаете кодить, то, вероятно, не раз задавались вопросом о необходимом уровне знаний. Мы постарались собрать для вас лучшие ответы со stackexchange, которые помогут вам определиться с базовым набором. Подборка является универсальной и не зависит ни от языка, ни от среды разработки, ни от ОС, в которых вы работаете.

Каждый программист должен знать:

1. Общие понятия и что они значат. Например, шаблоны проектирования, юзабилити, тестирование, стэк и пр.
2. Иметь понимание ООП.
3. Быть крутым хотя бы в одном языке. Ничего сверхъестественного, просто уметь инициализировать переменные, методы и т.д. С этого момента вы сможете учиться быстро.
4. Как читать чужой код.
5. Все время учиться. Учитесь правильно потреблять информацию. Книги, интернет, что угодно.
6. Системы контроля версий. Не обязательно все, главное знать основы, встречающиеся в каждой.
7. Когда нужно просить о помощи, а когда нет.
8. Какую проблему решать. Очень часто программисты тратят огромное количество времени на пустяки.
9. Иногда забывать о самолюбии и признавать ошибки, не принимая их на личный счет.
10. Как думать, как пользователь, а не просто техно-гик программист. Важно понимать, что вашим софтом пользуются люди, поэтому вы должны хотеть сделать их счастливыми.
11. Как отдыхать. Отдых – залог продуктивной работы. Силы воли и кофе недостаточно.
12. Как работать в команде. Успешная карьера программиста наполовину зависит от работы с людьми.

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

Хотите получать больше интересных материалов с доставкой?

Специфика знаний и навыков, конечно, во многом определяться областью, в которой работает человек. Одни пишут приложения на планшетные устройства, другие разрабатывают движки сайтов, третьи – игрушки и т.д. Но тем не менее есть некоторые навыки, которые пригодятся любому программисту.

Быть на «ты» с компьютером

Это самый простой и базовый навык, присущий каждому программисту. Он предусматривает живой интерес к компьютерным технологиям, который уже, в свою очередь, порождает те или иные вопросы у будущего специалиста: для начала - как поставить «винду»? Как найти и взломать модную игрушку? А что такое BIOS, хостинг, ядро системы, ООП? – и понеслось...

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

К чему все это? А к тому, что мир информационных технологий – это мир игрушек, с которыми должно хотеться играть. Именно с интереса к этим «игрушкам» все и начинается. Если его нет, нет и программиста.

Английский

Без английского не обойтись. Чтобы выучить язык программирования, продется перелопатить много литературы, видео-уроков и документации. Почти все (99%) первоисточники написаны на английском языке. Если его не знать, то спектр материалов для изучения сузиться в разы. Соответственно скорость изучения языка программирования значительно снизиться.

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

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

Математика

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

Есть, конечно, области программирования, где нужно знать специфические формулы, но, во-первых, так далеко не везде, во-вторых, с ними можно ознакомиться по ходу и в этом могут помочь специализированные математические программы. Физика и математика пригодиться особенно в том случае, если вы хотите создавать качественные компьютерные игры.

Общительность

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

Есть некий миф, мол, отшельничество и замкнутость – это неотъемлемая часть натуры программиста. В большинстве своем программисты весьма интересные и коммуникабельные люди. А отшельничество – это некий образ присущий всем гениям независимо от профессии, будь-то программист, лингвист, доктор и т. д.

Гибкий ум

Самого ума (умение оперировать нужными знаниями) мало, нужно чтобы он был гибким. Гибкий ум предусматривает умение учиться (пополнять знания, заменять устаревшую информацию на новую). Есть люди вроде бы умные, но очень консервативные. Они владеют неплохим логическим мышлением, высказываются внятно и последовательно, но вот выучить что-то новое, увы, не могут. А есть наоборот – голова очень пытливая, всем интересуется, все нужно, но в голове каша, то есть не может связать всю накопленную информацию в целостную позицию, структурировать ее.

В программировании нужно учиться всегда. Самой важной и тяжелой проверкой способностей начинающего специалиста будет изучение первого языка программирования. Далее будет проще, но нужно помнить, что полностью расслабиться во время профессиональной деятельности не удастся никогда.

Работа такого специалиста – это комбинация чисто технических действий с разными языками программирования и творческой работы по оптимизации функционала итогового программного продукта. Специалист занимается проектированием, созданием алгоритма программы, написанием ее кода, проверкой на работоспособность.

Необходимые профессиональные умения и знания

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

Другой вопрос, что нужно знать чтобы поступить на программиста. Здесь невозможно за 2–5 лет вырасти в профессионала, если подойти к профильному образованию с минимальным набором школьных знаний. Желая опередить соперников, со старта карьеры получить преимущество, каждый программист (будущий) должен приступать к освоению профессии с отличной базой:

  • по математике (здесь же – логика, теория вероятности);
  • физике;
  • информатике;
  • английскому, русскому.

Что должен знать программист для работы на перспективу (карьера, зарплата, репутация)? Нужно глубокое понимание архитектуры программной среды, где предстоит работать, принципов кодирования, знание простейших методов создания программ.

Знать нужно очень много: стандарты программирования, концепцию проектирования задач, методологию тестирования ресурсов. Чем глубже студент погружается в основы математики (анализ, графы), тем сильнее его позиции, шире арсенал применяемых инструментов.

Дополнительные навыки делающие конкурентоспособным на рынке труда

Какие навыки помогут быстрее завоевать рынок престижных вакансий?

  • Умение работать в команде для IT-специалиста – 50% успеха его становления на любом поле (разные архитектуры сетей, языки программирования).
  • Усидчивость, упорство, неумение сдаваться.
  • Аналитический склад ума + критическое мышление позволят отмести априори неисполнимые задачи. Умение экономить время заказчика – самый важный плюс профессионала.
  • Аргоритмизированный подход (системность характера) поможет добиться успеха быстрее.
  • Особенность профессии – работа в условном отрыве от социума – определяет некоторые привычки программиста, которые в будущем могут снизить его эффективность. Потому навыки позитивного общения и умение презентовать свои идеи, привычка быть в курсе популярных алгоритмов, сервисов тоже являются полезными навыками.

Что должен знать новичок

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

  • навыков написания программ на 2–3 популярных языках (оптимальными для начинающего специалиста считаются Python, JavaScript, HTML);
  • знания и понимания алгоритмов, баз данных, паттернов программирования;
  • изучения фреймворков (программная среда под разные операционные платформы – Windows, iOS).
10 марта 2016 в 09:56

Что должен уметь программист, чтобы получить работу в сфере финансов

  • Блог компании ITI Capital ,
  • Разработка веб-сайтов

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

Сегодня здесь востребованы математики, физики и программисты. Люди способные создавать алгоритмы торговли и делать на их базе качественный софт. Многие программисты, в свою очередь, хотели бы попробовать свои силы в финансовой отрасли - она может предложить привлекательное сочетание интересных задач и высоких зарплат.

Сегодня мы поговорим о том, какими навыками нужно обладать, чтобы получить работу в HFT-фирме, инвестиционном банке, хедж-фонде или брокерской компании. При подготовке топика использовались материалы сайтов и quantstart.com .

Языки

Одним из самых популярных в сфере финансов языков программирования на протяжение многих лет является C. Его нужно знать не только для поддержки устаревшего кода, но также для организации работы с API в системах электронных торгов и обмена данными с провайдерами.

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

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

Для одного из наших прошлых материалов мы общались с российским экспертом по созданию торговых систем, который в ситуациях, когда необходима максимальная скорость, использовать следующие технологии:

Для этих задач очень хорошо подходит C++ и чистый C. Бывает и так, что быстрые роботы создаются и чуть ли не на ассемблере - здесь стоит упомянуть механизмы прямого чтения-записи данных в память сетевой карты, минуя стандартные механизмы работы через драйверы, а также работу с «супербыстрым программируемым железом» вроде FPGA.

По данным создателя ресурса QuantStart и профессионального трейдера Майкла Халлс-Мура, сегодня senior-программист с 5-7-летним опытом работы на C++ может зарабатывать в Лондоне £500-700 в день. В российских компаниях специалисты по C++ также очень востребованы. Кроме того, таких разработчиков часто привлекают профессиональные трейдеры, которые могут создать успешную торговую стратегию, но нуждаются в помощи того, кто мог бы ее запрограммировать.

C# и Java также довольно давно используются различными финансовыми институтами. В основном, крупными банками для их трейдинговой инфраструктуры. Эти языки используются для создания фронтенд-интерфейсов и обработки данных.

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

Тем, кто начинает свой путь в трейдинге или как-то заинтересован в этой области, я бы посоветовал обратить свое внимание на высокоуровневые платформы и языки, такие как.NET и Java. Последняя очень популярна на западных фондовых рынках, у нас пока меньше, но есть хорошие перспективы более широкого распространения этого языка. Это значит, что Java-программисты, будут востребованы в финансовых компаниях, фондах и брокерах. Все-таки.NET - довольно закрытая платформа, которая к тому же имеет целый ряд ограничений. Для low-latency и HFT-торговли она подходит не очень хорошо.

Но и на.NET и на Java можно довольно быстро создавать законченные программные продукты. Главный минус - они бывают не самыми быстрыми (если счет идет на микросекунды).


Для прототипирования квантовых моделей в хедж-фондах и «квантовых» трейдерских подразделений в банках часто применяют скриптовые языки, вроде Python, MATLAB и R.

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

Клиент-серверные системы

Трейдинговые системы по определению являются распределенными. Практически все компании, от небольших фирм до крупных инвестиционных банков, строят свои системы с применением протоколов TCP и UDP - иногда в деле трейдинга скорость важнее гарантии доставки данных.

Поэтому разработчикам торговых приложений необходимо хорошо разбираться в классах сокетов для C: socket(), bind(), poll() и select(). Работать с ними напрямую практически никогда не нужно, поскольку для этого уже есть множество готовых библиотек, однако понимать, как устроено взаимодействие с ними просто необходимо.

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

Потоки

Создание клиент-серверных систем и многопоточное программирование в финансовой сфере идут рука об руку. Все это подразумевает, к примеру, написание стандартного TCP-сервера, сервера балансировки нагрузки, сервера высокой производительности - разработчик, который хочет заниматься созданием софта в финансовой компании должен уметь это делать. Неплохо также понимать, что такое классы pthreads(), fork(), mutexes и идея семафора в целом. В случае применения Java также нужно разбираться в существующих для этого языка методов синхронизации.

Базы данных

В основе систем для финансовой сферы лежат базы данных, поэтому разработчикам необходимы глубокие знания SQL. Знания простых операторов выбора будет недостаточно - довольно часто в ходе работы придется возиться с созданием процедур хранения, разбираться с индексами, и т.д. Кроме того, необходимо понимать разницу между table-level, page-level и row-level блокировками.

UNIX
Трейдинговые системы обычно используют платформу UNIX (часто это Solaris и Linux). Для Windows, как правило, создаются торговые терминалы с графическими интерфейсами, для разработки же «движка» трейдингового софта используют UNIX.

Это означат, что разработчикам просто необходимо понимать, что такое команды tail, sed, grep, awk, tr и top. Еще лучше, если специалист умеет работать с either vi, vim или emacs и не пугается проблем, вызванных неверной конфигурацией $LD_LIBRARY_PATH.

Навыки отладки

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

Заключение

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

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

P. S. В команду разработчиков ITinvest для проектной работы над

Данный текст появился как ответ на стандартную реакцию "настоящих программистов" в ответ на мои слова что я програмист 1С. "А-а-а, 1с-ник, да какой тыпрограммист, так скриптописатель в лучшем случае. Копаетесь там в своей бухгалтерии и почему-то считаете себя программистами. Настоящий программист знаешь сколько всего должен знать?"

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

МАТЕМАТИКА

Численные методы, дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, 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

Алгоритмы, Кнут-Грэхем-Паташник/Зорич/Винберг, Spivak/Dummit-Foote, математический анализ, линейная алгебра, комплексный анализ, функциональный анализ, дифференциальная геометрия, теория чисел, дифференциальные уравнения/интегральные уравнения/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теория вероятностей/математическая статистика/случайные процессы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, Вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple), теория категорий

Теория информации, сжатие, Хаффман, RLE, BWT, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова, maximum entropy problem, kullback-leibler divergence, elias/shannon-elias encoding

Дискретная математика, K2, теорема Поста, схемы, конечные автоматы (ДКА и НДКА), автомат Калашникова, клеточные автоматы

Криптография, Шнайер/Ященко, Принцип Керкгоффса, симметричная (DES, AES), асимметричная (RSA), качество ГПСЧ, алгоритм Диффи-Хеллмана, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки (атака гроссмейстера), WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, PKI, HTTPS/SSL, доказательство с нулевым разглашением, пороговая схема, murmurhash/cityhash, DKIM

Квантовые вычисления, алгоритм Шора, квантовая криптография

ОБЩИЕ ОСНОВЫ ПРОГРАММИРОВАНИЯ

Мультитредность, обедающие философы, 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/WaitForMultipleObjec ts, green thread/coroutine, pthreads, future/deferred/promise, модель акторов, parameter server, RDD (as seen in sparks), downpour SGD, wait-free, stackful vs stackless

Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем, interactive proofs, теорема Левина-Кука, 3SAT, PSPACE = NPSPACE,

Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-У льман/Пападимитриу/Шрайвер-Голдберг/Преп арата-Шеймос/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

Машинное обучение, Тибширани/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

ОБЩИЕ ПРИНЦИПЫ НАПИСАНИЯ ПРОГРАММ

Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александ реску-Саттер/Буч, защитное программирование, паттерны, SOLID/GRASP/KISS DRY SPOT/YAGNI, UML, OOP (Smalltalk), OOD/OOA, метрики кода, uncle Bob

Методологии разработки, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE

Инструментальные средства разработки, 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

Проектирование GUI и представление информации, Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX, алгоритмы визуализации данных (as seen in d3), subpixel rendering

Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI, mocks/stubs/spies, fixture, запахи и паттерны тестов (Osherove/Meszaros)

ЯЗЫКИ ПРОГРАММИРОВАНИЯ

Общее представление об языках программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, 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

Язык ассемблера, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, 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

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

Прикладное программирование, 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

БАЗЫ ДАННЫХ

Базы данных/Распределенные системы, Грубер/Дейт, 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)

ОПЕРАЦИОННЫЕ СИСТЕМЫ

Операционные системы, Silberschatz/Рихтер/Соломон-Руссинович/Р обачевский/Вахалия/Стивенс/Таненбаум/Lov e/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

Форматы, 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

Компонентно-ориентированные модели, Роджерсон/Таварес, 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

АППАРАТНОЕ ОБЕСПЕЧЕНИЕ

Аппаратное обеспечение, Хоровиц-Хилл/Титце-Шенк, полупроводниковая электроника/спинтроника/фотоника, транзистор, триггер, схемотехника, микрокод, технология создания процессоров, logic synthesis, static timing analysis, FPGA, Verilog/VHDL/SystemC, SISAL, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn"s taxonomy (ID), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86, VID/PID

Процессоры, конвейеризация, hyper-threading, алгоритм Томасуло, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти, intel optimization manuals, performance counters
___________________________________

Ну как, впечатляет?Интересно, есть в мире хоть ОДИН ЧЕЛОВЕК, который реально все это знает?