Блог пользователя ivan.popelyshev

Автор ivan.popelyshev, 13 лет назад, По-русски
Шарпиц продолжает радовать нас замечательными постами в жж.
Предлагаю обсудить сей эпичный пост:
http://sharpc.livejournal.com/67583.html

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


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

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



  1. C++, стандарт, Comeau, 1TBS, Страустрап/D&E/Джосаттис/Вандервуд, Дьюхэрст/Мейерс/Саттер, RAII, правило трех, exception-safety, Александреску/Абрахамс-Гуртовой, type erasure, CRTP, NVI, SFINAE, Koenig lookup, Duff's device, Boost, Сик-Ламсдейн/Карлссон, TR1, TR on C++ performance, тест Степанова, 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/race condition/starvation, атомарность, lock инструкции процессора, 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


  4. Язык ассемблера x86, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, AT&T и Intel-синтаксис, masm32, макросы, стек, куча/менеджеры кучи, соглашения вызова, hex-коды, машинное представление данных, IEEE754, little/big endian, SIMD, аппаратные исключения, прерывания, виртуальная память, реверсинг, срыв стека и кучи, return oriented programming, alphanumeric shellcode, L1/L2/RAM/page fault и их тайминг


  5. Аппаратное обеспечение, Хоровиц-Хилл, полупроводниковая электроника/спинтроника/фотоника, транзистор, схемотехника, микрокод, технология создания процессоров, VID/PID, Verilog/VHDL/SystemC, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomy ([SM]I[SM]D), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86


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


  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. Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос, структуры данных, алгоритмы, сложность и символы Ландау, классы сложности, NP-полные задачи, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика


  11. Машинное обучение, машинное зрение, OpenCV, image processing, OCR, фильтры Собеля, каскад Хоара, введение в психофизиологию зрения, TreeNet, нейросети, сети Кохонена, генетические алгоритмы, муравьиные алгоритмы, information retrieval/data mining/natural language processing, алгоритмы оптимизации, SVM, gradient boosting, метод отжига, hill climbing, подходы к моделированию AI


  12. Численные методы, метод Гаусса, интер- и экстраполяция, сплайны, МНК, метод Эйлера и Рунге-Кутты, дихотомия/метод Ньютона, метод Симпсона, метод Монте-Карло, метод Галеркина, QR и LU-декомпозиция, FFT/STFT, сходимость и устойчивость


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


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


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


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


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


  18. Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александреску-Саттер, защитное программирование, паттерны, GRASP, UML, OOP/OOD/OOA, правило Лисков, метрики кода


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


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


  21. Инструментальные средства разработки, IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), valgrind, системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ, профайлинг, lint, багтрекеры, документирование кода, сборщики кода типа cmake


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


  23. Операционные системы, Рихтер/Соломон-Руссинович/Робачевский/Вахалия/Стивенс/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, Роджерсон/Таварес, апартменты, моникеры, дополнительные ключевые слова VC++, DCOM RPC, CORBA, TAO


  25. Сеть, OSI, Ethernet, TCP/IP, TCP window, алгоритм Нейгла, сокеты, Protocol buffers/Thrift/Avro/ASN.1, AMQP, ICMP, роутинг, ARP, атака Митника, syn flood, HTTP/FTP, P2P, DHCP, SMB/NBNS, IRC/XMPP, POP3/SMTP/ESMTP/IMAP, DNS, WiFi/WiMax/GSM/CDMA/EDGE/Bluetooth, ACE, Wireshark


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


  27. Форматы, XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON, torrent, 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), монады, тайпклассы, АТД, система типов Хиндли-Милнера, ленивость/энергичность, логическое программирование (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
Курсы Интернет-университета
  • Проголосовать: нравится
  • +30
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится +13 Проголосовать: не нравится
Офигеть. Мне страшно подумать какой же тогда максимум :)
13 лет назад, # |
  Проголосовать: нравится +48 Проголосовать: не нравится
Я конечно могу ошибаться, но по-моему это неприкрытый явный троллинг. Сомневаюсь, что существует человек, который знает (именно знает, а не слышал название) хотя бы половину всего этого (включая самого sharpc, что бы он там ни говорил). Количество комментариев к оригинальному посту подтверждает мою гипотезу.
  • 13 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
    Причём очень-очень толстый ) Одни COM-ы С/F шарпы чего стоят. А так автор какие слова слышал - всё в кучу слил и MD5 с дихитомией, которые на пальцах объясняются и функциональный анализ с эллиптическими кривыми, которые 99.999% программистов просто не в состоянии понять
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Вот мне особенно интересно, каким здесь местом функциональный анализ. Я занимаюсь им в аспирантуре и за несколько лет так и не нашёл никаких точек соприкосновения с программированием. Конечно, если под функциональным анализом подразумевается изучение R3  с евклидовой нормой или что-то в этом духе, то вопрос снимается)
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
Автомат калашникова в теме дискретная математика - это хорошо
  • 13 лет назад, # ^ |
      Проголосовать: нравится +4 Проголосовать: не нравится
    "Лучший инструмент для превращения стека в очередь" 
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    Кстати, люди, которые знают устройство автомата Калашникова, скажите, действительно ли это стоящее знание? Может автор не иронизировал, а просто проверил на собственном опыте и получил полезные умения.
    • 13 лет назад, # ^ |
        Проголосовать: нравится +9 Проголосовать: не нравится
      За время своего недолгого общения с автоматом Калашникова, в том числе и изучения его устройства и принципиальной схемы работы, удалось получить два полезных знания:
      1. Не стоит совать пальцы в разнообразные подходящие (и не очень) по диаметру отверстия;
      2. У меня не такие уж и кривые руки, и из него реально можно куда-то попасть =)
      Какое из этих знаний наиболее полезно для вас - решайте сами =)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      вспомнилась пословица: "Оптимисты учат английский, пессимисты китайский, а реалисты автомат Калашникова" :)
      • 13 лет назад, # ^ |
        Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

        Насколько я помню, пессимисты учат автомат Калашникова, а не реалисты. Реалисты учат китайский, потому что думают, что китайцы заполонят весь мир, что на самом деле и происходит.
        • 13 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          Насколько я вижу, реалисты всегда думают ровно также, как и автор комментария про оптимистов, пессимистов и других ...стов :).
13 лет назад, # |
  Проголосовать: нравится +36 Проголосовать: не нравится
Автор - идеалист и максималист :) Вспомнился его давний пост, вот цитата: "Пользуясь случаем, хочу поругать codeforces.ru за тошнотворный дизайн, который надо было еще постараться испортить, учитывая его хабрапроисхождение, участие в отвратительной расистской кампании Stop IE6, полное пренебрежение юзабилити, раскрашивание Пети синим цветом и пропаганду мертвых языков Delphi и Java - на мой взгляд, как общеСНГшный СП-ресурс по сравнению с TTB Codeforces это явный шаг назад."
  • 13 лет назад, # ^ |
      Проголосовать: нравится +43 Проголосовать: не нравится
    Круто! Я теперь тоже буду называть троллей идеалистами/максималистами :)
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      последую примеру, либо планку себе подниму...
  • 13 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится
    А кто автор?
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    > пропаганду мертвых языков Delphi и Java
    Ага! Вот почему в этом "минимуме" нет Java... :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    По поводу "мертвый язык Delphi": я слышал, что Skype написан на нем, так что не такой уж он и мертвый:)
    • 13 лет назад, # ^ |
        Проголосовать: нравится -12 Проголосовать: не нравится
      Учитывая, что skype купил microsoft-считай, уже мертвый:)
      • 13 лет назад, # ^ |
          Проголосовать: нравится +1 Проголосовать: не нравится
        Одним скайпом список не органичивается:  MySQL Tools (Administrator, Query Browser), Total Commander, AIMP, QIP, R&Q, Dev-C++, Dev-PHP... (GTA 2 в конце концов=))
    • 12 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      На дeльфи написан только интерфейс скайпа, но дельфи развивается (щас 11 или 12 версия вышла),на дельфи написан Totall Commander, например.

      • 12 лет назад, # ^ |
          Проголосовать: нравится -8 Проголосовать: не нравится

        Понятно что только интерфейс. Не логику же на нем писать :)

13 лет назад, # |
Rev. 2   Проголосовать: нравится +6 Проголосовать: не нравится
Невольно вспоминается математическая программа Вербицкого (link).

Не думаю, что список стоит воспринимать серьезно (на самом деле, каждый может дописать к нему еще 100500 подобных пунктов, которые сам считает важными/интересными).

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

Как результат, встречаются, например, такие вещи: недавно знакомый рассказывал, что к ним в компанию на собеседование приходил сертифицированный (SCJD) Java-программист с 5-летним опытом работы, который не знал, что такое дерево. Еще один удручающий пример можно извлечь отсюда (искать по ключевым словам "linked list").
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    А мне математическая программа нравится, вполне реально за 5 лет пройти. И на порядок проще программистского минимума в обсуждаемой статье.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Если кроме математики ничем не заниматься.(с учетом что к теории прилагается практика)
    • 13 лет назад, # ^ |
        Проголосовать: нравится +8 Проголосовать: не нравится
      Вы это серьезно? :) Какую часть минимума Вербицкого вы освоили?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я где-то в середине Школьной программы, надо вечерком почитать что-нибудь, подтянуть знания
        • 13 лет назад, # ^ |
            Проголосовать: нравится +11 Проголосовать: не нравится
          Тогда ваше замечание про возможность пройти программу за 5 лет слегка самонадеянное.
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
А какую ценность имеет упомянутый Brainfuck?

Вообще я хотел спросить, где можно еще почитать статьи по схожей тематике?

Есть ли похожие списки нужных знаний, но по различным отраслям программирования? Например, web-программирование, прикладное, программирование игр. Интересно было бы почитать практический, а не теоретический минимум. Например, что полезно уметь делать, а что обязательно, чтобы получить хорошую работу в такой-то отрасли?
13 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Моё мнение - что почему бы и нет.

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

В качестве цели для саморазвития - почему бы и нет...

  • 13 лет назад, # ^ |
      Проголосовать: нравится +31 Проголосовать: не нравится

    Для сравнения - если выписать такой гипотетический список олимпиадника - насколько большим бы он был? Особенно если включить в него не только перечисление алгоритмов, а также и методов решения и того множества "стандартных идей", которые стали таковыми после прорешивания сотен контестов и задач. Спорить можно по поводу целесообразности включения тех или иных пунктов (как нужен ли Укконен? нужно ли знать FFT? и т.д.), но понятно, что выбрасывая так один за другим "редко" применяемые идеи, останется что-нибудь типа двух пунктов "обход в ширину; динамика" :)

    Поэтому мне кажется естественным, что список для профессионального программиста (который, в отличие от олимпиадника, - не школьник и не студент, а взрослый человек, да ещё и с многолетним опытом работы) должен быть весьма внушительным.

    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ближе всего я именно к этому мнению.
      +1
    • 13 лет назад, # ^ |
        Проголосовать: нравится +7 Проголосовать: не нравится
      разница между профи и олимпиадником, в том, что олимпиаднику запрещено пользоваться справочниками и средствами связи во время контеста.

      Задача олимпиадника: знать все, что б на протяжении 5 часов решить больше всех.

      Задача профи: иметь мозги и уметь решать новые возникающие задачи по мере их поступления.
      Понадобилось то что не знаешь: сел и освоил.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Тут проблема далеко не в длине списка, а в его наполнении (никто не спорит, что знать нужно много и требуется иметь представление о широком диапазоне областей). Но если вы, либо ещё кто-то другой составит аналогичный список, то отличаться они будут достаточно сильно.
    На самом деле, видимо, любая попытка создания одного универсального списка обречена на провал.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Если бы автор не настаивал, он бы назвал тему "теоретический максимум". Так что еще как настаивает :).
13 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится
У меня вот данный список генерирует радость - столько всего ещё можно узнать о своём деле.
13 лет назад, # |
  Проголосовать: нравится +57 Проголосовать: не нравится
Молодой человек собрал миллион марок, лег на них, и застрелился (С) Чехов
Удивило отсутствие в данном списке целого ряда важных тем необходимых программисту в каждодневной работе:
1. Психология (отношения с клиентами и начальством), индивидуальная/групповая психология, психоанализ, Фрейд/Хорни/Юнг, бессознательное, эго, ид, бихевиоризм/необихевиоризм, когнитивная психология, социальная психология, психотерапия, электоконвульсивная терапия, лоботомия.
2. Физиология (организация эффективной работы), биоритмы, остеология, строение костей черепа, генетика, состав ДНК человека и высших приматов, антропология, цитология, нейрохирургия.
3. Юридическое право, лицензии GNU FDL/GPL/X11/BSD, WTFPL, Mozilla PL, Open Directory, Creative Commons, public/common law, гражданское/римское/международное/уголовное право, Джек-потрошитель, дело врачей, морское законодательство.
4. Философия, классическая философия, конфуцианство, Тибетская книга мертвых, гносеология, эмпиризм, позитивизм, неопозитивизм, неокантианство, материализм, диалектика.
В зависимости от сферы деятельности программисту в каждодневной деятельности могут понадобится обширные познания в астрономии, экономике, истории.
З.Ы. по ходу чтения возникло стойкое ощущение, что автор скриптом сжимал изначально древовидную структуру тем в comma-separated list.
З.З.Ы. "XML/XSLT/XPath/XMLStarlet/DOM/SAX, RTF/ODF, JSON/BSON, torrent, YAML, JPEG/PNG/WebP, AVI/MPEG/RIFF/WAV/MP3/OGG/WebM, SVG, Unicode" - ULTIMATE COMBO!!!
13 лет назад, # |
  Проголосовать: нравится -24 Проголосовать: не нравится
По моему субъективному и скромному мнению:
Автор кое-где писал очень даже разумные вещи(по крайней мере с первой парочкой абзацев я абсолютно согласен).
Но разве Программист - не человек, который знает всё перечисленное Автором??*уже одно прочтение всего списка заслуживает уважения)*
Настоящий Программист - в первую очередь Профессионал. А это требует наличия как минимум личностных качеств, широты мышления, умения признавать ошибки, причём не менее, а где-то даже более, чем знание и прочтение вышеуказанной кучи материалов. Мм.. Но пожалуй я отвлёкся.
Друзья! Тут нужно определиться, что мы понимаем под именем "Программист".
Скорее всего многие из нас хотят*а некоторые уже воплотили свои желания* в будущем устроиться работать в какую-нибудь уважаемую компанию программистом. Программистом! Но чтобы попасть туда, участвовать в проектах, разработке ПО, Вы должны быть асом в своей области и иметь быстросоображающую голову, а не знать понемногу отсюда и оттуда. Да и нереально это!
Последним физиком, который уверенно разбирался во всех областях, был Ландау. Но когда он жил??! Делаем выводы)
Ммм.. Пост ни о чём получился, извиняюсь)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Асом быть не обязательно - многие уважаемые компании берут людей с улицы.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Да. Насчёт "Аса" я погорячился - с этим не спорю. Достаточно иметь хорошую голову и проявлять хоть какую-то активность.
      forest, будьте добры, приведи пожалуйста пример таких "уважаемых" компаний? Чтоб это не было похоже на пустой разговор.
      Intel, к примеру, всем участвующим в конференциях и прочее предлагает отправить резюме и, даже в случае неудачи, резюме хранится в течение 3х лет. Несложно догадаться, что им просто нет смысла брать людей с улицы, когда есть кандидатуры, которых они знают достаточно продолжительное время.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я не имею ввиду лидеров индустрии - аутсорс, бодишопы
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Простите, но я о подобных и не говорил ничего.
          Желания бывают разные, но лично я хочу работать в компаниях типа Intel, Yandex, Google. Да, это звучит слишком самонадеянно, но стремиться к этому никто не запрещал
          • 13 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится
            а почему куча народу говорит "я хочу работать в компаниях типа Intel, Yandex, Google" и почти никто не говорит, "я хочу стать таким крутым, что б создать свою компанию типа Intel, Yandex, Google..."

            я, вообще, никогда не хотел работать ни в каких компаниях :)
            и прекрасно живу и без них :)
            • 13 лет назад, # ^ |
                Проголосовать: нравится +2 Проголосовать: не нравится
              Чем выше уровень окружающих тебя специалистов, тем быстрее сам растёшь как специалист. Я бы вот уже ради того, чтобы работать в команде сильных программеров, с радостью согласился бы работать в какой-нибудь такой топовой компании, стянувшей под свои знамёна лучших профиков со всего света.
              • 13 лет назад, # ^ |
                  Проголосовать: нравится -6 Проголосовать: не нравится
                Вот именно. Компанию можно будет создавать, если ты уже очень хорош  в программировании, у тебя есть хороший большой проект, который можно развивать и развивать, и ты смыслишь кое-что в бизнесе.
              • 13 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                === стянувшей под свои знамёна лучших профиков со всего света.
                а откуда тогда взялись все эти профики в разных концах света, если они не работали в топовых компаниях? :)

                Значит профик может расти и не в топовой компании?
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Вот, кстати, интересное по форме приглашение на работу, что, по-моему, по теме.

http://news.tut.by/it/218095.html
В мире множество хороших языков, подходов к программированию и программистов. Разнообразие – это здорово. Но мы приглашаем далеко не всех. Более того, нам нужны лучшие. Почему? Работать над нашими проектами сложно. По-хорошему, чисто технически это далеко не простые проекты.
Поэтому если вы не знакомы с двоичным представлением чисел, схемами кэширования, не знаете ничего о битовых операциях, понятиях "список", "ассоциативный массив (карта)", "хеш-таблица", "стек", "очередь", "куча", TCP/IP, DNS, IP – мы с вами не найдем общего языка.
Если вы не владеете ООП, не можете писать код на Javascript без костылей-"фреймворков", не знаете, что такое нормальные формы, группировки, подзапросы, связи, индексы – вы нам не подходите.
Если вы не можете объяснить, каким образом и почему появляется страничка в вашем браузере, когда вы указали его URL – вам точно не к нам.
Если за всю свою профессиональную жизнь овладели только одним языком программирования – вряд ли мы сможем продуктивно сотрудничать.

Поэтому давайте экономить время на рассылке резюме и собеседованиях.

  • 13 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Хотя требования, по-моему, почти ни какие...
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      это минимальные требования, все логично, если этого не можешь или не знаешь, то пока.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Это я просто со своей колокольни требования оценил. А большинство выпускников ВУЗов и близко к этому уровню не приближаются, не говоря уж об отсутствии опыта.
        • 13 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится
          Ну если конечно рассматривать выпускника без опыта работы, то эти требования жестковаты (это мягенько). 
        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится
          Надо заметить, что и программы обучения большинства вузов и близко к этому уровню не приближаются. Или приближаются, но лишь на бумажке.
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            Дело даже не в приближении, а в приоритетах вуза и профилях. 
          • 13 лет назад, # ^ |
              Проголосовать: нравится +5 Проголосовать: не нравится
            Да учим мы всему этому. Я, например, преподаю (и надеюсь неплохо) ООП, СУБД, Организацию ОС (понравилась сегодня задача В с OpenCup про FINUFO, прям как лабораторная), Теорию информации и кодирования (всё про биты), Методы компиляции (ну как программировать, не понимая, что внутри).
            Другое дело, что студенты делятся на тех, кто ничего не понимают, что-то воспринимают, все понимают (!) и еще одну группу, которой особо полезно почитать исходные требования в "приглашении на работу". Это те, кто освоил HTML+PHP+select *
            и считают, что пора деньги зарабатывать, чего еще надо то.
             
             
            • 13 лет назад, # ^ |
                Проголосовать: нравится 0 Проголосовать: не нравится

              ___________________

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

  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Просто великолепно и при чем сразу отсеивает тех, кто просто "просидел" 4-6 лет в универе и получил диплом за "посещаемость".
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
      Угу... и ещё много кого отсеивает, в том числе очень профессиональных программистов, которые просто из идеологических соображений «не могут писать код на Javascript без костылей-"фреймворков"», потому что по своему опыту знают, что эти костыли-"фреймворки" в большинстве своём куда лучше чем самописные костыли-"фреймворки" в почти любой крупной фирме, которых они за последние годы хорошо повидали.
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А как это не писать код "из идеологических соображений"?
        А сама профессия программиста Вам нравится? Чем?
        • 13 лет назад, # ^ |
            Проголосовать: нравится +8 Проголосовать: не нравится
          А это так: есть такие зажравшиеся программисты, которые не хотят (даже за деньги) работать через ж*пу, а предпочитают делать всё по-нормальному и нормальными средствами. ;)
          • 13 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится
            По-моему, из такого подхода следует, что существуют правильные и неправильные фреймворки, правильные и неправильные языки программирования и т.п.
            А дальше, правильное - это то, что я знаю, а то, что я не знаю, - неправильное.
            • 13 лет назад, # ^ |
              Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

              Ну... почти :)

              Только "неправильным" является то, что "я" прекрасно знаю, и на опыте работы не в одной фирме знаю, что так делать не надо.

              А фрэймворки вы совершенно правильно подметили - бывают "правильные" и бывают собственные кривые велосипеды конкретной фирмы, которые сделаны от незнания (и нежелания знания) никаких стандартных фрэймворков.

      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Ну давайте скорректируем так: сама форма такого объявления хороша, ну а если в паре пунктах нет особых знаний, но зато по многим другим все просто супер, то думаю это компенсирует все.


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

        • 13 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

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


13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится
Навеяло....кто нить может подкинуть теории по "матричное умножение алгоритмом Копперсмита — Винограда"? Я как-то искал описание алгоритма и способов его реализации....но нормального не нашел(
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    в CLRS есть. И на википедии
    • 13 лет назад, # ^ |
      Rev. 6   Проголосовать: нравится 0 Проголосовать: не нравится
      Дык в ссылке zurg'a написано ж, что алгоритм Штрассена и алгоритм Копперсмита-Винограда - это разные вещи. ;)
      P.S. Ну и на английской версии страницы есть ссылка на скан оригинальной статьи с нормальным описанием. Что может быть лучше первоисточника?
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Точно, невнимательно прочитал коммент. А на русском похоже нет статей..
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        А вы пробовали читать первоисточник? Откуда сведения, что лучше него ничего нет? :)
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    http://mathoverflow.net/questions/34173/fast-matrix-multiplication
13 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится
Интересно в мире сколько человек знают весь список...
  • 13 лет назад, # ^ |
      Проголосовать: нравится +11 Проголосовать: не нравится
    ноль
    • 13 лет назад, # ^ |
        Проголосовать: нравится -6 Проголосовать: не нравится
      Следовательно можно не ставить цель в жизни этот список, ибо автор маньяк.
      • 13 лет назад, # ^ |
          Проголосовать: нравится +2 Проголосовать: не нравится
        Ну либо действительно маньяк, либо у него были веские причины выставить себя в таком свете :)
13 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

М-да... Смахивает на то, что автор решил перечислить, какой он умный и сколько всего знает...

Только этим можно объяснить, например, указание на необходимость изучать x86-ю архитектуру и ассемблер, а скажем современнейшие и мегараспространённые AVR, AVR32, ARM из архитектур или, например, Java из языков сюда не вошли... ;-)

А например тот факт, что нейронные сети, нечёткая логика и математика (фурье, вейвлеты, гы-гы) разбросаны по разным местам и упоминаются вскользь - как бы намекает что автору известны очень мало применений для них - и, например, о цифровой обработке сигналов куда это можно было бы всё объединить, он почти ни сном ни духом... :D

Напомнило цитату: "Есть такой уровень развития программиста - называется лемминг... Когда он вырастает, впрочем, он становится просто старым леммингом..."
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Да, он не любит Java, а список используется для троллинга :) Но по-моему , список харош!
    • 13 лет назад, # ^ |
        Проголосовать: нравится +14 Проголосовать: не нравится
      Список при всей его кажущейся полноте ужасно узок... ;-)

      В науках как в дереве перебора - чуть только на уровень углубился, сразу количество ветвей в k раз увеличилось...

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

      С обратной стороны - 90% из всех перечисленных знаний востребованы только в 10% случаев... ;-)
13 лет назад, # |
Rev. 2   Проголосовать: нравится -14 Проголосовать: не нравится

я хочу заметить, что для некоторый указанный список  будет не просто неинтересный.  Например я не хочу изучать ассамблер х86, но было бы интереснее изучить язык GO, или JAVA!! Я считаю, что любой человек должен быть разносторонний но, что бы это занятие было интересно ему!!
13 лет назад, # |
  Проголосовать: нравится +12 Проголосовать: не нравится
Чувствую родство с автором
  • 13 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится
    чувствую, что у нас приживётся Петросян =)
    • 13 лет назад, # ^ |
        Проголосовать: нравится +4 Проголосовать: не нравится
      Здесь неразработанный Клондайк хорошего юмора. Благодатная среда
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Пусть еще несколько контестов напишет, чтобы красным стать.
13 лет назад, # |
  Проголосовать: нравится -21 Проголосовать: не нравится
Прочитав этот абзац,
------------------------------------------------------------------------------
Отдельную категорию людей, высказывающуюся в стиле «я такого не знаю, я такое запрещаю» составляют те, кто полагает, что цель программиста заключается не в улучшении мира, а в зарабатывании денег. Им этот теоретический минимум действительно не нужен, а следует поискать самоучители по тому, как правильно и со знанием всех тонкостей воровать, обманывать и заставлять работать вместо себя других.
------------------------------------------------------------------------------
становится понятно, что у автора странное восприятие материального мира.
Такое ощущение, что по его установкам, все кто зарабатывает деньги это те кто ворует, обманывает и заставляет работать за себя других.
Такое мышление - это путь Диогена, который жил в бочке (так как заработать на дом было влом, это ж дело воров, обманщиков и эксплуататоров), занимался онанизмом и размышлял про улучшение мира.

Мне интересно, что автор бы сказал своему ребенку в ответ на "папа, я хочу кушать".
Иди погрызи кору дерева, а я тут улучшаю мир и свой список теормина? :)

С голой задницей мир не улучшить!
Любое интелектуальное и духовное развитие должно идти паралельно с материальным и биологическим развитием.

  • 13 лет назад, # ^ |
    Rev. 3   Проголосовать: нравится +4 Проголосовать: не нравится

    Что-то для меня ничего подобного из цитаты не следует, автор лишь подчеркнул то, что этот список актуален для той части программистов, которые на вопрос "Почему ты занимаешься программированием?" отвечают "Потому, что мне это нравится" или, каноничным "just for fun", но не для той скучной части, которая отвечает "Ради денег".


    P.S. На всякий случай, уточню, что ни в тексте автора, ни в моём сообщении не предполагается, что деньги зарабатывать не нужно. Просто во главу угла ставится первичный мотив.
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Мое мнение может быть ошибочным (поскольку любое мнение есть субъективное), но....

      ===и что они должны знать для того, чтобы эффективно работать по специальности.
      речь идет не о "just for fun", а все таки о работе по специальности. Да и "just for fun" вообще не может быть списка минимума или максимума. Потому что у каждого свой "fun" :)

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