Шарпиц продолжает радовать нас замечательными постами в жж.
Предлагаю обсудить сей эпичный пост:
http://sharpc.livejournal.com/67583.html
Многие начинающие программисты, особенно обучающиеся в провинциальных вузах, часто не знают, в какую сторону им развиваться, и что они должны знать для того, чтобы эффективно работать по специальности. Удивительно, но каждый день используя продукты и технологии, созданные другими программистами на основании развитых областей знания, они даже не догадываются о том, как они устроены.
Построенные на теории массового обслуживания и протоколе GSM сети мобильной связи; PHP-скрипты, исполняющиеся на удаленных серверах и передающие свою выдачу через Ethernet по TCP/IP на компьютеры с NDIS-драйверами; процессоры, переупорядочивающие и спекулятивно исполняющие наборы инструкций для того, чтобы скомпенсировать вызванную ограничениями полупроводниковой электроники и скоростью света остановку роста тактовой частоты; рассчитанные на ЭВМ корпуса самолетов и автомобилей, лекарства и структуры ДНК; компьютерные игры, ради крохотного блика в которых пишутся мегабайты заполненных интегралами Френеля статей; электронные фильмы и книги; алгоритмы NLP и TreeNet, вызывающие нам из огромных баз данных поисковую выдачу — вот то, что окружает нас каждый день благодаря программистам, благодаря оригинальным подходам и фундаментальным знаниям, благодаря продуманной и отточенной десятилетиями методологии разработки и управления сложностью ПО.
Я и мои единомышленники взяли на себя труд составить теоретический минимум для программиста на основании наиболее ярких отраслей IT, вошедших даже в программы нормальных университетов, на основании собеседований и постоянно пригождающихся на практике знаний. Часть из пунктов этого минимума можно изучить за 5 минут по википедии, часть же потребует серьезного труда на протяжении нескольких месяцев, но это именно то, что обязательно следует знать и чем следует свободно владеть. В комментариях приветствуются исправления и дополнения.
UPD: Некоторые комментарии повторяются довольно часто, и разумно было бы попробовать ответить на них в апдейте поста.
Этот теормин вполне справедливо критикуется за отсутствие системности изложения и ВНЕЗАПНЫЕ соседства различных как по глубине, так и по содержанию топиков. Это не бага, это фича. Системное изложение программы по практически любому из пунктов заняло бы места не меньше, чем оглавления пухлых талмудов, поэтому лучше как раз названия этих талмудов и приводить. Как же тогда работать с этим списком? Следует брать хорошие книжки по тематике и читать их до тех пор, пока все упомянутые слова не встретятся в процессе чтения. Авторы и в страшном сне не могли предположить, что кто-то решит, что устройство Даффа посчитают по глубине и объему чем-то равным полуторатысячестраничному Священному Стандарту. Однако этот критерий вполне рабочий — можно перечитать сотню книг по C++ для начинающих, и ни разу не встретить упоминания о нем, но если читать действительно полезные книги и статьи (для тем, подобных C++, такие книги существуют и перечислены), то все слова довольно быстро встречаются. Смысл программы, обусловленный ее размером, именно в том, чтобы дать возможность оценить, достаточное ли количество книг по теме прочитано.
Весьма значительное количество критики теормин встречает и со стороны людей, считающих себя программистами, которые полагают, что все это знать невозможно, изучать слишком долго, а в некоторой абстрактной узкой практике большая часть не используется. Эти люди, к сожалению, просто не понимают, в чем разница между эрудицией/памятью и знаниями. Ценность для программиста имеет не запоминание точного формата какого-нибудь из пакетов NBNS, а овладение подходами, которые использовались при разработке, другими словами не способность воспроизвести, а способность воссоздать или опознать, в том числе в другой области. Именно способность человека к анализу и синтезу (которая все же не берется из ниоткуда, а достигается активным познавательным трудом) отличает его от гугла, который даже в очень отдаленной перспективе не научится решать даже div2 250. Именно на развитие этой способности и направлен теоретический минимум, который в процессе работы обязательно придется дополнять domain-specific знаниями, будь то особенности игровой физики, разработка оперденей на Java или создание реальных микросхем.
В отдельный абзац стоит выделить вопрос от тех, кто сомневается в своих способностях освоить теормин, либо полагает, что способность его применять будет редко востребована и ослабнет. В целом, теорминимум в большинстве пунктов несколько уступает учебным программам факультетов CS нормальных университетов, так что за 5 лет его освоить вполне возможно, даже совмещая с работой. Конкретно в геймдеве активно используются (по разным подсчетам в обсуждениях) от 1/3 до 2/3 перечисленных пунктов. Недостающую активность можно восполнять, к примеру, консультируя других на Stack Overflow.
Отдельную категорию людей, высказывающуюся в стиле «я такого не знаю, я такое запрещаю» составляют те, кто полагает, что цель программиста заключается не в улучшении мира, а в зарабатывании денег. Им этот теоретический минимум действительно не нужен, а следует поискать самоучители по тому, как правильно и со знанием всех тонкостей воровать, обманывать и заставлять работать вместо себя других.
«Нас и тут неплохо кормят». Этот аргумент встречает свое опровержение во втором по активности обсуждении статьи у metaclass:
Все, что должен знать программист, чтобы его после 40 лет не выбросили на Помойку, Где Бомжи.
Действительно, в возрасте около 45 лет начинает активно проявляться деградация мозга, приводящая к существенным проблемам в понимании и способности оперировать кодом с обычной цикломатической сложностью. Потеря способности писать код в сочетании с неспособностью из-за отсутствия тренировок к анализу/синтезу — гарантированный путь именно туда. Некоторые люди сохраняют способность оперировать нормальной цикломатической сложностью и в старости, однако лишь за счет превышающих норму показателей в молодости. Проверить, входите ли вы в зону риска, можно на TopCoder.
Кроме того, хочу поблагодарить тех, кто помогал исправлять досадные ошибки в этом теормине, особенно своих коллег, которые не только владеют его большей частью, но и внесли наиболее ценные замечания по его дополнению.
Некоторые полезные ссылки:
Книги, которые стоит читать в IT
Матрица Компетентности Программиста
Список Баткина
MIT OpenCourseWare
Курсы Интернет-университета
Предлагаю обсудить сей эпичный пост:
http://sharpc.livejournal.com/67583.html
Многие начинающие программисты, особенно обучающиеся в провинциальных вузах, часто не знают, в какую сторону им развиваться, и что они должны знать для того, чтобы эффективно работать по специальности. Удивительно, но каждый день используя продукты и технологии, созданные другими программистами на основании развитых областей знания, они даже не догадываются о том, как они устроены.
Построенные на теории массового обслуживания и протоколе GSM сети мобильной связи; PHP-скрипты, исполняющиеся на удаленных серверах и передающие свою выдачу через Ethernet по TCP/IP на компьютеры с NDIS-драйверами; процессоры, переупорядочивающие и спекулятивно исполняющие наборы инструкций для того, чтобы скомпенсировать вызванную ограничениями полупроводниковой электроники и скоростью света остановку роста тактовой частоты; рассчитанные на ЭВМ корпуса самолетов и автомобилей, лекарства и структуры ДНК; компьютерные игры, ради крохотного блика в которых пишутся мегабайты заполненных интегралами Френеля статей; электронные фильмы и книги; алгоритмы NLP и TreeNet, вызывающие нам из огромных баз данных поисковую выдачу — вот то, что окружает нас каждый день благодаря программистам, благодаря оригинальным подходам и фундаментальным знаниям, благодаря продуманной и отточенной десятилетиями методологии разработки и управления сложностью ПО.
Я и мои единомышленники взяли на себя труд составить теоретический минимум для программиста на основании наиболее ярких отраслей IT, вошедших даже в программы нормальных университетов, на основании собеседований и постоянно пригождающихся на практике знаний. Часть из пунктов этого минимума можно изучить за 5 минут по википедии, часть же потребует серьезного труда на протяжении нескольких месяцев, но это именно то, что обязательно следует знать и чем следует свободно владеть. В комментариях приветствуются исправления и дополнения.
- 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
- Компиляторы, особенности реализации стандарта, ограничения реализации, интринсики, отличия стандартных библиотек (контейнеры, rand), ABI, реализация виртуальных функций, виртуального наследования, исключений, RTTI, switch, указателей на функции и методы; оптимизации, copy elision (RVO, NRVO), sizeof на различных платформах, дефайны компилятора и среды, __declspec, ключи компилятора, empty-base optimization, статическая и динамическая линковка, манглинг, распределенная компиляция, precompiled header, single compilation unit, (strict) aliasing/restrict, inline/_forceinline, volatile
- Мультитредность, обедающие философы, 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
- Язык ассемблера x86, Зубков/Хайд/Дреппер/Касперски/Фог/Абраш, AT&T и Intel-синтаксис, masm32, макросы, стек, куча/менеджеры кучи, соглашения вызова, hex-коды, машинное представление данных, IEEE754, little/big endian, SIMD, аппаратные исключения, прерывания, виртуальная память, реверсинг, срыв стека и кучи, return oriented programming, alphanumeric shellcode, L1/L2/RAM/page fault и их тайминг
- Аппаратное обеспечение, Хоровиц-Хилл, полупроводниковая электроника/спинтроника/фотоника, транзистор, схемотехника, микрокод, технология создания процессоров, VID/PID, Verilog/VHDL/SystemC, Arduino, устройства памяти (ROM → EEPROM, RAM, SSD, HDD, DVD), RISC/CISC, Flynn's taxonomy ([SM]I[SM]D), принстонский и гарвардский подход, архитектуры процессоров, архитектуры x86
- Процессоры, конвейеризация, hyper-threading, out-of-order execution, спекулятивное исполнение, branch predict, префетчинг, множественный ассоциативный кэш, кэш-линия/кэш-промах, такты, кольца защиты, память в мультипроцессорных системах, тайминг памяти
- Дискретная математика, K2, теорема Поста, схемы, конечные автоматы, клеточные автоматы, автомат Калашникова, ДКА и НДКА
- Вычислимость, машина Тьюринга, нормальные алгоритмы Маркова, машина Поста, диофантовы уравнения Матиясевича, лямбда-функции Черча, частично рекурсивные функции Клини, комбинаторное программирование Шейнфинкеля, Brainfuck, эквивалентность тьюринговых трясин, проблема останова и самоприменимости, счетность множества вычислимых функций, RAM-машина, алгоритм Тарского, SAT/SMT-солверы, теория формальных систем
- Языки программирования, грамматики, иерархия Хомского, теорема Майхилла-Нероуда, лемма о накачке и лемма Огдена, алгебра Клини, НДКА -> ДКА, алгоритмически неразрешимые задачи в формальных языках, Драгонбук, Фридл, регекспы и их сложность, 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
- Алгоритмы и комбинаторная оптимизация, Кормен/Скиена/Седжвик/Кнут/Ахо-Хопкрофт-Ульман/Пападимитриу/Шрайвер-Голдберг/Препарата-Шеймос, структуры данных, алгоритмы, сложность и символы Ландау, классы сложности, NP-полные задачи, графы и деревья, потоки в сетях, матрица Кирхгофа, деревья поиска (особенно RB-дерево и B-дерево), occlusion detection, куча, хэш-таблицы и идеальный хэш, сети Петри, алгоритм русского крестьянина, метод Карацубы и матричное умножение Винограда-Штрассена, сортировки, жадные алгоритмы и матроиды, динамическое программирование, линейное программирование, diff-алгоритмы, рандомизированные алгоритмы и алгоритмы нечеткого поиска, псевдослучайные числа, нечеткая логика
- Машинное обучение, машинное зрение, OpenCV, image processing, OCR, фильтры Собеля, каскад Хоара, введение в психофизиологию зрения, TreeNet, нейросети, сети Кохонена, генетические алгоритмы, муравьиные алгоритмы, information retrieval/data mining/natural language processing, алгоритмы оптимизации, SVM, gradient boosting, метод отжига, hill climbing, подходы к моделированию AI
- Численные методы, метод Гаусса, интер- и экстраполяция, сплайны, МНК, метод Эйлера и Рунге-Кутты, дихотомия/метод Ньютона, метод Симпсона, метод Монте-Карло, метод Галеркина, QR и LU-декомпозиция, FFT/STFT, сходимость и устойчивость
- Теория информации, сжатие, Хаффман, RLE, LZ, коды коррекции ошибок, информационная энтропия, формула Шеннона, сложность Колмогорова
- Криптография, Ященко, симметричная, асимметричная, Диффи-Хеллман, RSA, DES, AES, эллиптические кривые, хэширование (MD5, SHA, CRCn), DHT, криптостойкость, криптоатаки, WEP/WPA/WPA2 и атаки на них, цифровая подпись и сертификаты, HTTPS/SSL, доказательство с нулевым разглашением
- Математика, Кнут-Грэхем-Паташник/Зорич/Винберг, матан, линал, комплан, функан, диффгем, теория чисел, дифуры/интуры/урчпы/вариационное исчисление/оптимальное управление, производящие функции, ряды, комбинаторика, теорвер/матстат/слупы/теория массового обслуживания, цепи Маркова, интегральные преобразования (Фурье, Лаплас, вейвлет), NZQRCHOS, матпакеты (Mathematica, Maple)
- Физика, правила Кирхгофа, комплексное сопротивление, скорость и частота света, лагранжиан
- Химия, стехиометрия, химия кремния :)
- Архитектура и стиль кода, Макконнелл/Фаулер/Лебланк/Гамма/Александреску-Саттер, защитное программирование, паттерны, GRASP, UML, OOP/OOD/OOA, правило Лисков, метрики кода
- Методологии разработки, Waterfall/RUP/Agile/Scrum/Kanban/XP, TDD/BDD, CASE
- Тестирование, юнит-тесты, функциональное, нагрузочное, интеграционное тестирование, тестирование UI
- Инструментальные средства разработки, IDE, IntelliSense, отладчики (VS/Olly/WinDbg/kdb/gdb) и трейсеры (strace/ltrace), valgrind, системы контроля версий (SVN, GIT), merge/branch/trunk, системы именования файлов и бранчей, continuous integration, ant, code coverage, статический анализ, профайлинг, lint, багтрекеры, документирование кода, сборщики кода типа cmake
- Фреймворки, Qt, moc и метаинформация, концепция слот-сигнал, Саммерфилд-Бланшет/Шлее, PoCo, промышленные библиотеки: GMP, i18n, lapack, fftw, pcre
- Операционные системы, Рихтер/Соломон-Руссинович/Робачевский/Вахалия/Стивенс/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
- COM, OLE/ActiveX/COM+, ATL, Роджерсон/Таварес, апартменты, моникеры, дополнительные ключевые слова VC++, DCOM RPC, CORBA, TAO
- Сеть, 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
- Графика, алгоритм Брезенхема, цветовые модели, трассировка лучей vs полигональная графика, OpenGL/GLSL/Open Inventor, DirectX/DirectShow/DirectAudio/HLSL, stencil/depth/alpha-test, графический конвейер в DirectX 11, шейдеры, модели освещения (Фонг), пропускная способность, fillrate, OpenCL/CUDA, ландшафты, лоды, тени, текстурирование и фильтрация, антиалиасинг, HDR, tone mapping
- Форматы, 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
- Базы данных, Грубер, 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
- Прикладное программирование, C#/F#/Nemerle, Шилдт/Троелсен/Рихтер, генерики, yield, linq/plinq, рефлексия, AST, WCF, WinForms/WPF/Silverlight, AOP, фреймворки логгирования, .NET assembly
- Квантовые вычисления, алгоритм Шора, квантовая криптография
- Функциональное программирование, Haskell/Ocaml/Scheme/Alice или Oz, SICP/TaPL/YAHT/Purely Functional Data Structures/Харрисон-Филд, HOF (map/fold/filter), монады, тайпклассы, АТД, система типов Хиндли-Милнера, ленивость/энергичность, логическое программирование (Prolog или Mercury), конкурентное программирование (Erlang или Oz)
- Веб-программирование и скриптовые языки, Фланаган/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
- Проектирование 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
Курсы Интернет-университета
Страница 5
- Не стоит совать пальцы в разнообразные подходящие (и не очень) по диаметру отверстия;
- У меня не такие уж и кривые руки, и из него реально можно куда-то попасть =)
Какое из этих знаний наиболее полезно для вас - решайте сами =)Ага! Вот почему в этом "минимуме" нет Java... :)
На дeльфи написан только интерфейс скайпа, но дельфи развивается (щас 11 или 12 версия вышла),на дельфи написан Totall Commander, например.
Понятно что только интерфейс. Не логику же на нем писать :)
Вообще я хотел спросить, где можно еще почитать статьи по схожей тематике?
Есть ли похожие списки нужных знаний, но по различным отраслям программирования? Например, web-программирование, прикладное, программирование игр. Интересно было бы почитать практический, а не теоретический минимум. Например, что полезно уметь делать, а что обязательно, чтобы получить хорошую работу в такой-то отрасли?
Моё мнение - что почему бы и нет.
Автор не настаивает на глубоком знании всех областей - понятно, это было бы бессмысленно, потому что каждая из областей требует годы экспириенса, чтобы можно было считать себя профессионалом в ней. А иметь общее представление желательно во многих областях, да я и не сомневаюсь, что многие здесь знакомы хотя бы с четвертью этих понятий и имеют достаточные представления о них, чтобы хотя бы не впадать в ступор от страшных слов :) и понять суть проблемы, не лезя в гугл в поисках сомнительных источников информации.
В качестве цели для саморазвития - почему бы и нет...
Для сравнения - если выписать такой гипотетический список олимпиадника - насколько большим бы он был? Особенно если включить в него не только перечисление алгоритмов, а также и методов решения и того множества "стандартных идей", которые стали таковыми после прорешивания сотен контестов и задач. Спорить можно по поводу целесообразности включения тех или иных пунктов (как нужен ли Укконен? нужно ли знать FFT? и т.д.), но понятно, что выбрасывая так один за другим "редко" применяемые идеи, останется что-нибудь типа двух пунктов "обход в ширину; динамика" :)
Поэтому мне кажется естественным, что список для профессионального программиста (который, в отличие от олимпиадника, - не школьник и не студент, а взрослый человек, да ещё и с многолетним опытом работы) должен быть весьма внушительным.
+1
Задача олимпиадника: знать все, что б на протяжении 5 часов решить больше всех.
Задача профи: иметь мозги и уметь решать новые возникающие задачи по мере их поступления.
Понадобилось то что не знаешь: сел и освоил.
Автор кое-где писал очень даже разумные вещи(по крайней мере с первой парочкой абзацев я абсолютно согласен).
Но разве Программист - не человек, который знает всё перечисленное Автором??*уже одно прочтение всего списка заслуживает уважения)*
Настоящий Программист - в первую очередь Профессионал. А это требует наличия как минимум личностных качеств, широты мышления, умения признавать ошибки, причём не менее, а где-то даже более, чем знание и прочтение вышеуказанной кучи материалов. Мм.. Но пожалуй я отвлёкся.
Друзья! Тут нужно определиться, что мы понимаем под именем "Программист".
Скорее всего многие из нас хотят*а некоторые уже воплотили свои желания* в будущем устроиться работать в какую-нибудь уважаемую компанию программистом. Программистом! Но чтобы попасть туда, участвовать в проектах, разработке ПО, Вы должны быть асом в своей области и иметь быстросоображающую голову, а не знать понемногу отсюда и оттуда. Да и нереально это!
Последним физиком, который уверенно разбирался во всех областях, был Ландау. Но когда он жил??! Делаем выводы)
Ммм.. Пост ни о чём получился, извиняюсь)
forest, будьте добры, приведи пожалуйста пример таких "уважаемых" компаний? Чтоб это не было похоже на пустой разговор.
Intel, к примеру, всем участвующим в конференциях и прочее предлагает отправить резюме и, даже в случае неудачи, резюме хранится в течение 3х лет. Несложно догадаться, что им просто нет смысла брать людей с улицы, когда есть кандидатуры, которых они знают достаточно продолжительное время.
Желания бывают разные, но лично я хочу работать в компаниях типа Intel, Yandex, Google. Да, это звучит слишком самонадеянно, но стремиться к этому никто не запрещал
я, вообще, никогда не хотел работать ни в каких компаниях :)
и прекрасно живу и без них :)
а откуда тогда взялись все эти профики в разных концах света, если они не работали в топовых компаниях? :)
Значит профик может расти и не в топовой компании?
http://news.tut.by/it/218095.html
В мире множество хороших языков, подходов к программированию и программистов. Разнообразие – это здорово. Но мы приглашаем далеко не всех. Более того, нам нужны лучшие. Почему? Работать над нашими проектами сложно. По-хорошему, чисто технически это далеко не простые проекты.
Поэтому если вы не знакомы с двоичным представлением чисел, схемами кэширования, не знаете ничего о битовых операциях, понятиях "список", "ассоциативный массив (карта)", "хеш-таблица", "стек", "очередь", "куча", TCP/IP, DNS, IP – мы с вами не найдем общего языка.
Если вы не владеете ООП, не можете писать код на Javascript без костылей-"фреймворков", не знаете, что такое нормальные формы, группировки, подзапросы, связи, индексы – вы нам не подходите.
Если вы не можете объяснить, каким образом и почему появляется страничка в вашем браузере, когда вы указали его URL – вам точно не к нам.
Если за всю свою профессиональную жизнь овладели только одним языком программирования – вряд ли мы сможем продуктивно сотрудничать.
Поэтому давайте экономить время на рассылке резюме и собеседованиях.
Другое дело, что студенты делятся на тех, кто ничего не понимают, что-то воспринимают, все понимают (!) и еще одну группу, которой особо полезно почитать исходные требования в "приглашении на работу". Это те, кто освоил HTML+PHP+select *
и считают, что пора деньги зарабатывать, чего еще надо то.
___________________
Вполне возможно, но я досконально не знаю курс наших информатиков - программистов, а у меня такого углубления не делают.
А сама профессия программиста Вам нравится? Чем?
А дальше, правильное - это то, что я знаю, а то, что я не знаю, - неправильное.
Ну... почти :)
Только "неправильным" является то, что "я" прекрасно знаю, и на опыте работы не в одной фирме знаю, что так делать не надо.
А фрэймворки вы совершенно правильно подметили - бывают "правильные" и бывают собственные кривые велосипеды конкретной фирмы, которые сделаны от незнания (и нежелания знания) никаких стандартных фрэймворков.
Ну давайте скорректируем так: сама форма такого объявления хороша, ну а если в паре пунктах нет особых знаний, но зато по многим другим все просто супер, то думаю это компенсирует все.
А профессиональных программистов на мой взгляд сложно отсеить, т.к. хороший работодатель должен правильно расставлять приоритеты.
Ну форма хороша... Но по содержанию вакансии профессиональный программист иногда может отличать работу, где надо писать быдло-код, где надо изобретать свои велосипеды или не дай бог пользоваться чужими велосипедами от нормальной работы. :)
P.S. Ну и на английской версии страницы есть ссылка на скан оригинальной статьи с нормальным описанием. Что может быть лучше первоисточника?
Только этим можно объяснить, например, указание на необходимость изучать x86-ю архитектуру и ассемблер, а скажем современнейшие и мегараспространённые AVR, AVR32, ARM из архитектур или, например, Java из языков сюда не вошли... ;-)
А например тот факт, что нейронные сети, нечёткая логика и математика (фурье, вейвлеты, гы-гы) разбросаны по разным местам и упоминаются вскользь - как бы намекает что автору известны очень мало применений для них - и, например, о цифровой обработке сигналов куда это можно было бы всё объединить, он почти ни сном ни духом... :D
Напомнило цитату: "Есть такой уровень развития программиста - называется лемминг... Когда он вырастает, впрочем, он становится просто старым леммингом..."
В науках как в дереве перебора - чуть только на уровень углубился, сразу количество ветвей в k раз увеличилось...
Интересно всем предложить выписать те или иные технологии, алгоритмы, теоретические идеи и т.п. с которыми приходилось сталкиваться в практике, но которые в этом списке отсутствуют... Наверняка получится гораздо больше... %)
С обратной стороны - 90% из всех перечисленных знаний востребованы только в 10% случаев... ;-)
------------------------------------------------------------------------------
Отдельную категорию людей, высказывающуюся в стиле «я такого не знаю, я такое запрещаю» составляют те, кто полагает, что цель программиста заключается не в улучшении мира, а в зарабатывании денег. Им этот теоретический минимум действительно не нужен, а следует поискать самоучители по тому, как правильно и со знанием всех тонкостей воровать, обманывать и заставлять работать вместо себя других.
------------------------------------------------------------------------------
становится понятно, что у автора странное восприятие материального мира.
Такое ощущение, что по его установкам, все кто зарабатывает деньги это те кто ворует, обманывает и заставляет работать за себя других.
Такое мышление - это путь Диогена, который жил в бочке (так как заработать на дом было влом, это ж дело воров, обманщиков и эксплуататоров), занимался онанизмом и размышлял про улучшение мира.
Мне интересно, что автор бы сказал своему ребенку в ответ на "папа, я хочу кушать".
Иди погрызи кору дерева, а я тут улучшаю мир и свой список теормина? :)
С голой задницей мир не улучшить!
Любое интелектуальное и духовное развитие должно идти паралельно с материальным и биологическим развитием.
===и что они должны знать для того, чтобы эффективно работать по специальности.
речь идет не о "just for fun", а все таки о работе по специальности. Да и "just for fun" вообще не может быть списка минимума или максимума. Потому что у каждого свой "fun" :)
это раз. но главный моммент, это когда автор тех кто по его мнению занимается программированием для зарабатывания денег, отправляет за учебниками по воровству и намахалову.