Лекция: Теоретический минимум для программиста

Етап Зміст етапу Стратегічні питання
А. Чим займається фірма нині? Ідентифікація Якою є імпліцитна чи експліцитна поточна стратегія?
Припущення Які припущення щодо відносного становища компанії, сильних та слабких місць, конкурентів і тенденцій у галузі слід зробити, щоб наповнити змістом поточну стратегію?
Б. Що відбувається в зовнішньому середовищі? Аналіз стану галузі Якими є основні чинники успіху конкуренції та найважливіші можливості й загрози, що існують у галузі?
Аналіз конкурентів Якими є спроможності та обмеження існуючих конкурентів та їхні найімовірніші дії у майбутньому?
Аналіз суспільних умов Які можливості та загрози можуть випливати з найважливіших урядових, суспільних та політичних чинників?
Сильні і слабкі місця Що ми можемо сказати про сильні та слабкі місця компанії порівняно з існуючими та майбутніми конкурентами, знаючи результати аналізу галузі та конкурентів?
В. Як слід діяти фірмі? Тестування припущень та стратегій Як порівнюються припущення, втілені в поточні стратегії, з аналізом, проведеним на етапі «Б»?
Стратегічні альтернативи Якими є реальні стратегічні альтернативи за наявності проведеного вище аналізу? Чи є поточна стратегія однією з них?
Стратегічний набір Яка альтернатива найкраще узгоджує становище компанії із зовнішніми можливостями та загрозами?

 

1. Конкурентна стратегія в нових галузях. Більшість компаній цієї галузі знаходяться у стадії організації, залучення персоналу, будівництва або придбання виробничих потужностей, розширення збутової мережі, залучення на свою сторону потенційного покупця, з проблемами розробки товару, з технологічними проблемами. Конкурентні стратегії, орієнтовані на низькі витрати або на диференціацію, зазвичай найбільш життєздатні.

2. Конкурентна стратегія в галузях, що знаходяться у стадії зрілості. Хоча момент переходу в стан зрілості, який уповільнює зростання, не можна точно спрогнозувати, його можна відстрочити на якийсь час шляхом використання технологічних досягнень, модернізації товару і проведення інших заходів щодо підтримки ринкового попиту. Проте, коли темпи зростання знижуються, перехід в стадію зрілості зазвичай приводить до істотних змін в конкурентному середовищі галузі, що необхідно врахувати при коригуванні існуючих стратегій.

Типові помилки фірм при визначенні стратегії в період, коли галузь знаходиться у стадії зрілості: вибір чогось середнього між низькими витратами, диференціацією і фокусуванням; нехтування міцними конкурентними позиціями заради миттєвого прибутку; занадто повільне реагування на зміну цін; залучення великих потужностей при уповільненні темпів зростання галузі; великі витрати на маркетингові засоби зі збільшення продаж.

3. Конкурентні стратегії для фірм, які діють в галузях, що знаходяться в стані стагнації або спаду. Багато фірм діють в галузі, де попит росте повільніше, ніж в середньому по промисловості, а іноді, навіть, спостерігається його падіння. В даній ситуації найбільш очевидними є стратегія «збору урожаю», що забезпечує отримання максимального обсягу готівкових коштів за короткий період часу, продаж фірми або припинення діяльності.

Найпривабливішими галузями, що знаходяться у стадії спаду, є ті, де обсяг продажу скорочується повільними темпами, оскільки там завжди існують вбудований попит і прибуткові ніші. Типові стратегічні помилки фірм, що працюють на ринках, що стагнують: залучення до виснажливої і збиткової конкурентної боротьби; занадто швидке вилучення з обороту вагомої частини готівки; занадто оптимістичне відношення до ситуації і пасивне очікування того, що справи підуть на краще.

4. Конкурентні стратегії в роздроблених галузях (галузях, що складаються з сотень і навіть тисяч дрібних і середніх фірм). Головною відмінною рисою роздробленої галузі є відсутність лідерів, що володіють величезною часткою на ринку і визнані покупцями. Конкурентна боротьба в роздроблених галузях може варіюватися в межах від помірно сильної до запеклої.

5. Конкурентні стратегії на міжнародних ринках повинні чітко відповідати ситуації, що складається. Особливу увагу слід приділити тому, наскільки смаки і переваги споживачів, збутові канали, перспективи зростання, рушійні сили і тиск конкурентів на світовому ринку відрізняються від умов національного ринку; яким є рівень виробничих витрат, коливання валютних курсів, особливості торгової політики національних урядів, характер міжнародної конкуренції.

Одним з найважливіших напрямів конкретизації стратегії є її прив'язка до конкурентного статусу компанії, і в першу чергу до ступеня її домінування на ринку,що обумовлює виокремлення чотирьох конкурентних позицій для: аутсайдера ринку; фірм, що мають слабку і сильну конкурентні позиції; лідера ринку.

6. Для фірми, що має слабку конкурентну позицію, пропонується будувати свою політику, виходячи з чотирьох основних стратегічних можливостей:

стратегія кругового наступу (концентрація на зниженні витрат або на диференціації продукту; умова — наявність у фірми достатніх фінансових коштів і кадрів);

стратегія оборони і зміцнення (використання варіації існуючої стратегії і ведення важкої боротьби боротьбу за збереження обсягу продажу, частки ринку, прибутковості і конкурентної позиції на досягнутому рівні);

стратегія негайного відступу і покидання галузі (продаж фірми, або припинення діяльності, якщо не можна знайти покупця);

стратегію «збору урожаю» (мінімізація до крайньої межі своїх реінвестицій і максимізація короткострокових грошових потоків з метою підготовки виходу з галузі).

7. Фірма з сильною конкурентною позицією. Спроба стати лідером за собівартістю для таких структур зазвичай можлива тільки, коли один з лідерів на ринку вже не застосовує дану стратегію.

8. Лідер ринку. У зв'язку з тим, що лідер має доведену практикою стратегію і відому репутацію, головне питання в тому, яким чином він зберігатиме і покращуватиме наявні конкурентні переваги. Для цього доцільно проаналізувати можливості лідера як мінімум в трьох стратегічних напрямах діяльності:

— продовження наступальної політики(оцінити: чи достатньо ресурсів у лідера для продовження інновацій в зниженні собівартості, диференціації продукції, обслуговуванні споживачів, вдосконаленні системи збуту товарів; наскільки стандарти поведінки лідера прийнятні для інших підприємств галузі; чи можлива переорієнтація стратегії для збереження наступальної політики лідера; які нові методи і прийоми конкуренції можуть підсилити наступ на конкурентів);

— збереження поточних позицій (встановити, яким чином лідер уникатиме ситуацій, що підривають довіру до нього (якщо частка ринку досягає монопольних розмірів) або підтримуватиме досягнутий рівень рентабельності і обсяг прибутку (якщо довгострокові перспективи галузі не дуже привабливі); оцінити можливості: встановлення серйозних вхідних бар'єрів в галузь, збереження розумних і привабливих з погляду якості цін, поліпшення обслуговування споживачів, збереження частки ринку і запобігання будь-якому її скороченню, спрямування вільних грошових коштів в прибуткові виробництва.

— конфронтація з конкурентами (встановити, наскільки різко і як швидко лідер присікатиме будь-які дії, спрямовані на втручання в його сферу чи порушення створених неформальних правил бізнесу; оцінити можливості лідера: розгортати широкомасштабні безкомпромісні кампанії у відповідь на намагання конкурентів збільшити свої частки ринку, організовувати вигідні операції для постачальників і споживачів, «нагадувати» агресивним фірмам про те, як необхідно слідувати за лідером.

9. Стратегії у сфері масового виробництва.Великі фірми, що здійснюють масове виробництво, володіють великою ресурсною силою і, природно, їм властива силова конкурентна і інноваційна поведінка на ринку – віолентна.

Віоленти характеризуються великим розміром, чисельністю працівників, безліччю філіалів і дочірніх підприємств, повнотою асортименту, здібністю до масового виробництва, великими витратами на НДДКР, виробництво, маркетинг. Їх постійна проблема – завантаження потужностей.

10. Стратегії диференціації продукції і сегментації ринку. Фірми-патієнти («хитрі лисиці») можуть бути різних розмірів: малі, середні і навіть зрідка великі. Патієнтная стратегія – це стратегія диференціації продукції і заняття своєї ніші, вузького сегменту ринку. У цій стратегії чітко простежуються дві під стратегії: ставка на диференціацію продукту; необхідність зосередити максимум зусиль на вузькому сегменті ринку.

11. Стратегії інноваційних дослідницьких організацій-робників. Фірми-експлеренти – це, в основному невеликі організації, головна роль яких в економіці – інноваційна (створення радикальних, «проривних» нововведень, нових продуктів і нових технологій у всіх галузях народного господарства). Як творці радикальних нововведень, вони відрізняються своєю цілеспрямованістю, відданістю ідеї, високим професійним рівнем співробітників і лідера, великими витратами на НДДКР.

12. Стратегії у сфері дрібного неспеціалізованого бізнесу. Дрібні фірми, задовольняючи локальний і вузькогруповий або, навіть, індивідуальний попит, беруться за все, що не викликає інтересу у віолентів, патіентів і експлерентів. Їх роль об'єднувальна, зв'язуюча – комутантна. Фірми-комутанти активно сприяють просуванню нових продуктів і технологій, в масовому порядку створюючи на їх основі нові послуги і прискорюючи процес дифузії нововведень; беруть активну участь в процесі рутинізації нововведень за рахунок схильності до імітаційної діяльності і організації нових послуг на основі нових технологій.

13. Менеджмент знань як конкурентна стратегія. Управління знаннями як ключовий напрямом стратегічного менеджменту на сучасному етапі, має на меті створення нових і могутніших конкурентних переваг. Менеджмент знань – це модель, яка об'єднує дії, пов'язані з формуванням знань, їх кодифікуванням, розповсюдженням і використанням, а також з розвитком інновацій і навчанням. Управління знаннями можна визначити як мистецтво створювати вартість із нематеріальних активів організації, як цілеспрямований процес конвертації знань у вартість.

14. Конкурентна стратегія великих фірм – стратегія обслуговування масового попиту. Великі підприємства в своїй абсолютній більшості дотримуються силової стратегії конкурентної боротьби, за якої найефективніше виробництво масових, стандартних продуктів. Головне достоїнство стандартних товарів полягає в можливості організувати їх ефективне виробництво.

15. Конкурентні стратегії спеціалізованих фірм.Специфіка нішової стратегії – диференціація продукту доповнюється вузькою спеціалізацією, що забезпечує високий ступінь захисту ніші фірми від конкурентів. Знайти (або створити) власну нішу дуже важко – вибраний ринковий сегмент повинен відрізнятися певною стійкою відособленістю (унікальний технологічний досвід, особлива збутова мережа, історичний престиж марки).

16. Конкурентні стратегії у сфері радикальних інновацій.НТП у ринковій економіці має одну парадоксальну особливість: велику частку НДДКР проводять одні компанії, а найбільш значущі результати отримують інші. Причини, що забезпечують фірмі-піонеру велику пристосованість до діяльності:

— конкурентна стратегія фірм-піонерів сильна тим, що лежить в іншій площині, ніж у їх могутніх суперників (сфера діяльності великих фірм – передбачений поточний НТП, а ризиковані прориви в невідоме – шанс фірми-піонера);

— готовність фірми нести величезні, майже неприйнятні ризики;

— оптимальна форма колективу, що працює над проривною інновацією – група на чолі із сильним лідером, вдачею першопрохідця.

— мотивація фірми-піонера носить сильніший і багатоплановий характер

 

Теоретический минимум для программиста

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

Построенные на теории массового обслуживания и стандарте GSM сети мобильной связи; PHP-скрипты, исполняющиеся на удаленных серверах и передающие свою выдачу через Ethernet по TCP/IP на компьютеры с NDIS-драйверами; процессоры, переупорядочивающие и спекулятивно исполняющие наборы инструкций для того, чтобы скомпенсировать вызванную ограничениями полупроводниковой электроники и скоростью света остановку роста тактовой частоты; рассчитанные на ЭВМ корпуса самолетов и автомобилей, лекарства и структуры ДНК; компьютерные игры, ради крохотного блика в которых пишутся мегабайты заполненных интегралами Френеля статей; электронные фильмы и книги; алгоритмы NLP и TreeNet, вызывающие нам из огромных баз данных поисковую выдачу — вот то, что окружает нас каждый день благодаря программистам, благодаря оригинальным подходам и фундаментальным знаниям, благодаря продуманной и отточенной десятилетиями методологии разработки и управления сложностью ПО.

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

 

 

1. C++, стандарт, Comeau, 1TBS, Страустрап/D&E/Джосаттис/Вандервуд, Дьюхэрст/Мейерс/Саттер, RAII/copy-on-swap, правило трех, exception-safety, Александреску/Абрахамс-Гуртовой, type erasure, CRTP, NVI, SFINAE, Koenig lookup, Duff's device, Boost, Сик-Ламсдейн/Карлссон, TR1, TR on C++ performance, ABI, тест Степанова, forwarding problem, SPECS, C++0x

 

2. Компиляторы, особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile

 

3. Мультитредность, обедающие философы, 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, модель акторов

 

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

 

5. Аппаратное обеспечение, Хоровиц-Хилл/Титце-Шенк/От физики к Си от 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

 

6. Процессоры, конвейеризация, hyper-threading, out-of-order execution, спекулятивное исполнение, static/dynamic branch prediction, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах (SMP/NUMA), тайминг памяти

 

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

 

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

 

9. Языки программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА → ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, PCRE/POSIX RE, БНФ, Boost.Spirit + Karma + Qi/Ragel, LL, LR/SLR/LALR/GLR, PEG/packrat, yacc/bison/flex/antlr, статический анализ кода, компиляция/декомпиляция/обфускация/деобфускация, Clang/LLVM/XMLVM, GCCXML, OpenC++, построение виртуальных машин, JiT/AoT/GC, DSL/DSEL

 

10. Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос, структуры данных, алгоритмы, сложность, символика Ландау, теорема Акра-Баззи, time-space tradeoff, классы сложности, NP-полные задачи, КМП, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика

 

11. Численные методы, дихотомия/метод Ньютона, интер- и экстраполяция, сплайны, метод Гаусса/Якоби/Зейделя, QR и LU-декомпозиция, SVD, МНК, методы Рунге-Кутты, метод Адамса, формулы Ньютона-Котеса, метод Ритца, метод Бубнова-Галеркина, метод конечных разностей/элементов, FFT/STFT, сходимость и устойчивость

 

12. Машинное обучение, Рассел-Норвиг, подходы к моделированию AI, байесовские сети, нейросети, сети Кохонена, градиентный спуск/hill climbing, стохастическая оптимизация (метод Монте-Карло, метод отжига, генетические алгоритмы, муравьиные алгоритмы), SVM, gradient boosting, кластерный анализ, метод главных компонент, LSH, обучение с подкреплением, MDP, information retrieval/data mining/natural language processing, машинное зрение (OpenCV, image processing, OCR, фильтры Собеля, каскад Хаара, Viola-Jones framework, SURF, введение в психофизиологию зрения)

 

13. Теория информации, сжатие, Хаффман, RLE, LZ, коды коррекции ошибок, сжатие с потерями (изображения, аудио, видео), информационная энтропия, формула Шеннона, сложность Колмогорова

 

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

 

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

 

16. Физика, правила Кирхгофа, комплексное сопротивление, скорость и частота света, уравнения Максвелла, лагранжиан

 

17. Химия, стехиометрия, химия кремния :)

 

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

 

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

 

20. Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI

 

21. Инструментальные средства разработки, IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), DWARF2 debug information format, дизассемблеры и декомпиляторы (IDA/HexRays/Reflector), системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ (lint), динамический анализ (valgrind, фаззинг), верификация и валидация ПО (Frama-C, RAISE (RSL), Coq), профайлинг, багтрекеры, документирование кода, системы сборки (CMake)

 

22. Фреймворки, Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre

 

23. Операционные системы, 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

 

24. Компонентно-ориентированные модели, Роджерсон/Таварес, COM/OLE/ActiveX/COM+, ATL, апартменты, моникеры, MIDL, DCOM RPC, XPCOM, CORBA, TAO, D-Bus

 

25. Сеть, Стивенс, 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

 

26. Графика и GPGPU, алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA/AMP, ландшафты, лоды, тени, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping, virtual/augmented reality

 

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

 

28. Базы данных, Грубер/Дейт, ANSI SQL, T-SQL, ODBC, MySQL/PostgreSQL/MS SQL/BDB/SQLite/Sphinx, хранимые процедуры, триггеры, алгебра Кодда/А, Tutorial D, нормальные формы, оптимизация и выполнение запросов, структуры данных индексов, транзакции и ACID, CAP-теорема Брюера, NoSQL, key-value storage, шардинг, ORM (C++ ODB), ERD, OLAP

 

29. Прикладное программирование, C#/F#/Nemerle, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly

 

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

 

31. Функциональное программирование, Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), система типов Хиндли-Милнера, монады, тайпклассы, АТД, dependent types, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)

 

32. Веб-программирование и скриптовые языки, Фланаган/Zend PHP5 Certification Course + Study Guide, Apache/nginx, CGI/FastCGI, PHP/Zend Framework/phpDaemon/Zend Engine/Doctrine или Propel/CodeIgniter или Symphony или Yii, Python/Django/Twisted, Ruby/RoR, ASP.NET MVC, JavaScript/jQuery/ExtJS/node.js, ООП в JavaScript, HTML5/XHTML/doctype/табличная и блочная верстка/CSS3, RSS, canvas/WebGL, Ajax/Comet/WebSockets, вопросы безопасности (XSS, SQL injection, CSRF), highload, SWIG

 

33. Проектирование GUI и представление информации, Раскин/Тафти, юзабилити, основы дизайна и типографики, закон Фиттса, основы верстки, LaTeX

 

 


UPD: Некоторые комментарии повторяются довольно часто, и разумно было бы попробовать ответить на них в апдейте поста.


Этот теормин вполне справедливо критикуется за отсутствие системности изложения и ВНЕЗАПНЫЕ соседства различных как по глубине, так и по содержанию топиков. Это не бага, это фича. Системное изложение программы по практически любому из пунктов заняло бы места не меньше, чем оглавления пухлых талмудов, поэтому лучше как раз названия этих талмудов и приводить. Как же тогда работать с этим списком? Следует брать хорошие книжки по тематике и читать их до тех пор, пока все упомянутые слова не встретятся в процессе чтения. Авторы и в страшном сне не могли предположить, что кто-то решит, что устройство Даффа посчитают по глубине и объему чем-то равным полуторатысячестраничному Священному Стандарту. Однако этот критерий вполне рабочий — можно перечитать сотню книг по C++ для начинающих, и ни разу не встретить упоминания о нем, но если читать действительно полезные книги и статьи (для тем, подобных C++, такие книги существуют и перечислены), то все слова довольно быстро встречаются. Смысл программы, обусловленный ее размером, именно в том, чтобы дать возможность оценить, достаточное ли количество книг по теме прочитано.

Весьма значительное количество критики теормин встречает и со стороны людей, считающих себя программистами, которые полагают, что все это знать невозможно, изучать слишком долго, а в некоторой абстрактной узкой практике большая часть не используется. Эти люди, к сожалению, просто не понимают, в чем разница между эрудицией/памятью и знаниями. Ценность для программиста имеет не запоминание точного формата какого-нибудь из пакетов NBNS, а овладение подходами, которые использовались при разработке, другими словами не способность воспроизвести, а способность воссоздать или опознать, в том числе в другой области. Именно способность человека к анализу и синтезу (которая все же не берется из ниоткуда, а достигается активным познавательным трудом) отличает его от гугла, который даже в очень отдаленной перспективе не научится решать даже div2 250. Именно на развитие этой способности и направлен теоретический минимум, который в процессе работы обязательно придется дополнять domain-specific знаниями, будь то особенности игровой физики, разработка оперденей на Java или создание реальных микросхем.

В отдельный абзац стоит выделить вопрос от тех, кто сомневается в своих способностях освоить теормин, либо полагает, что способность его применять будет редко востребована и ослабнет. В целом, теорминимум в большинстве пунктов несколько уступает учебным программам факультетов CS нормальных университетов, так что за 5 лет его освоить вполне возможно, даже совмещая с работой. Конкретно в геймдеве активно используются (по разным подсчетам в обсуждениях) от 1/3 до 2/3 перечисленных пунктов. Недостающую активность можно восполнять, к примеру, консультируя других на Stack Overflow.

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

«Нас и тут неплохо кормят». Этот аргумент встречает свое опровержение во втором по активности обсуждении статьи у metaclass:
Все, что должен знать программист, чтобы его после 40 лет не выбросили на Помойку, Где Бомжи.
Действительно, в возрасте около 45 лет начинает активно проявляться деградация мозга, приводящая к существенным проблемам в понимании и способности оперировать кодом с обычной цикломатической сложностью. Потеря способности писать код в сочетании с неспособностью из-за отсутствия тренировок к анализу/синтезу — гарантированный путь именно туда. Некоторые люди сохраняют способность оперировать нормальной цикломатической сложностью и в старости, однако лишь за счет превышающих норму показателей в молодости. Проверить, входите ли вы в зону риска, можно на TopCoder.

 

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

Некоторые полезные ссылки:
Книги, которые стоит читать в IT
Матрица Компетентности Программиста
Список Баткина
MIT OpenCourseWare
Курсы Интернет-университета


UPD2 (2011.07.04): Огромное спасибо Vissi за перевод статьи на английский язык.


UPD3 (2011.12.31):
Питер Норвиг. Научитесь программировать за десять лет
Matt Might. What every computer science major should know
От физики к программированию
Зачем нужно знать всякие низкоуровневые вещи

Ну и наконец, откуда вообще вырос этот теормин:
ACM Computer Science Curriculum

 

еще рефераты
Еще работы по информатике