?

Log in

No account? Create an account

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

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

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

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

МинимумСвернуть )


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

Часто отвечаемые ответыСвернуть )

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

Некоторые полезные ссылки:
Книги, которые стоит читать в 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

Last update: 2014/12/31

Comments

Страница 7 из 7
<<[1] [2] [3] [4] [5] [6] [7] >>

(Анонимно)

А мне перечень теорминимума напомнил такой анекдот:
Если бы водителей принимали на работу так же, как программистов, то выглядело это примерно так.
Вакансия: водитель.
Требования: профессиональные навыки в управлении легковыми и грузовыми автомобилями,троллейбусами,трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимисяна вооружении стран СНГ и НАТО.
Навыки раллийного и экстремального вождения обязательны. Опыт управления болидами "Формулы-1" - приветствуется. Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, антиблокировочных систем, навигационных систем и автомобильных аудиосистем ведущих поизводителей - обязательны. Опыт проведения кузовных и окрасочных работ - приветствуется. Претенденты должны иметь сертификаты Mercedes, BMW, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
Зарплата: 1500-2500 рублей, определяется по результатам собеседования.

Во-первых, имхо, зная всё это получается практически "универсальный солдат" способный работать почти в любом направлении программирования, но нужно ли это каждому начинающему программисту. Это каждый решает сам для себя.
Во-вторых, что, человек не владеющий всеми этими знаниями, я так понимаю, не может носить гордое звание "Программист", он автоматом переносится в категорию быдлокодописателей?
В-третьих, зачем же сразу отправлять таких людей на поиски книг по воровству?
Что, улучшать мир можно только владея вышеуказанными знаниями?
Если программист будет только улучшать мир не беспокоясь за "зарабатывание денег", то как он выживет в этом глупом мире - коммунизм ещё не наступил на нашей матушке планете.
По поводу деградации мозга: мозг человека деградирует в любом возрасте, если его не нагружать работой и овладение теорминимумом в начале карьеры не гарантирует от деградации в 45 или 40.
Извиняюсь за многословие, задели некоторые безапеляционные утверждения автора, в статье всё же стоило указать, что это теорминимум (хотя я не думаю, что это минимум - это больше максимум напоминает) для программиста в геймдеве, тогда всё встанет на свои места.
Вы не первый цитируете этот анекдот. Несмотря на его очевидную профсоюзную ценность, к реальности он едва ли имеет какое-то отношение.

Человек, владеющий этим теорминимумом, может называться хорошим, годным инженером (уже не начинающим программистом), способным разрабатывать новые технологии и улучшать мир, за что обычно хорошо платят. Не владеющий будет разрабатывать технологии, которые мир будут ухудшать (there are 15 competing standards).

Нельзя так просто овладеть теорминимумом, а потом утратить интерес к саморазвитию и деградировать.

(Анонимно)

К статье

Невероятно сложно быть хорошим теологом и физиком-теоретиком одновременно. Аналогично, пока речь идет о математическом аппарате - все хорошо, пусть и математика завышена, но когда дело доходит до совмещения архитектуры (макромир), кодинга (микромир) и юзабилити (параллельная плоская вселенная) в одном человеке, возникает проблема не "все это знать невозможно", а "все это знать бесполезно". Пользы от подобного программиста будет не больше, чем от Анатолия Вассермана, если попросить его прочитать текст, написанный линейным письмо А.
Таких программистов набирется на глобусе от силы пара сотен, и код они не пишут, они пишут учебники.
Это я вам как опытный быдлокодер говорю.
Ваша оценка сильно занижена. Это я вам как 1863-й по рейтингу участник Codeforces говорю.

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

Пользователь krewphil сослался на вашу запись в записи «Теоретический минимум для программиста» в контексте: [...] Оригинал взят у в Теоретический минимум для программиста [...]

Роадмап для падаванов

Пользователь just_a_think сослался на вашу запись в записи «Роадмап для падаванов» в контексте: [...] ШАД)     МП: Цикл книг Босса («математика с птичьего полета»)     *П: Теормин [...]

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

Пользователь orfis_sakarna сослался на вашу запись в своей записи «Теоретический минимум для программиста» в контексте: [...] _____________________________________ Оригинал взят у в Теоретический минимум для программиста [...]
Заметил, что список недавно обновлялся. Предлагаю несколько дополнений:

C++:
GotW, Meyer's singleton, cppgm

Процессоры:
intel optimization manuals, performance counters, OoO execution лучше изменить на алгоритм томасуло

Машинное обучение:
Рассел-Норвиг, имхо, бестолковая книжка. Её следует заменить на Тибширани.
(ME)HMM, CRF, label bias problem, stacked NN, LeToR, factorization machines, autoencoders, RNN/CNN, вместо NLP лучше отдельные задачи (language modelling, co-reference detection, text chunking, POS-tagging, probabilistic parsing, statistical machine translation, misspell correction, question answering, NER, collocation detection, text summarization, speech recognition, fact extraction, sentiment analysis), эффективное вычисление softmax, feature engineering/selection, quality estimation, Manning/Jurafsky/McCallum/Koehn, latent topics (LDA, chineese restaurant, pLSI), parallel coordinates, vowpal wabbit, NLTK, structured learning, EM-алгоритм, contrastive divergence, optimal brain surgery, belief propagation, semi-supervised learning, inductive vs transductive learning, kernel trick, discriminative/generative pairs (as seen by Ng & Jordan), sequence to sequence learning, bagging, анализ социальных графов, рекомендательные системы/collaborative filtering, multimodal learning

Алгоритмы:
gusfield (suffix tree, string alignment), motif search, scanning line, cache oblivious, funnel sorting, VEB-layout, корневая оптимизация, алгоритмы для динамических графов,
модели вычисления (RAM-machine/pointer machine/decision trees и т.д.), алгоритмы в иерархиях памяти/стриминговые алгоритмы, time forward processing, range & rank, LSM-trees, buffered a-b-trees, toku trees, персистентные структуры, succint-структуры, lossy-струтуры (bloom/bloomier filter, hash-tables with false positives), locality sensitive hashing, space-time tradeoff в хэш-таблицах, scheduling strategies

Численные методы:
l-bfgs и другие квазиньютоновские методы, adagrad, PARAFAC, cassowary, interior point methods, вариационные методы для байесовского вывода, nesterov, автоматическое дифференцирование, alternating least squares, what every computer scientist should know about floating point arithmetics by Goldberg, Nocedal & Wright/Boyd & Vandenberghe

Мультитрединг:
parameter server, RDD (as seen in sparks), downpour SGD, wait-free, stackful vs stackless

Криптография:
В хэши стоит добавить murmurhash/cityhash, DKIM

Языки программирования: on-stack replacement, type checking/type inference алгоритмы, CYK parser, advanced compiler design and implementation by Muchnick

Теория информации:
maximum entropy problem, kullback-leibler divergence, elias/shannon-elias encoding

Компиляторы:
быстрое вычисление математических функций через битхаки, linkers & loaders by Levine

Операционные системы:
TRIM

Теория вычислимости (думаю разумно сюда кинуть и сложность):
interactive proofs, теорема Левина-Кука, 3SAT, PSPACE = NPSPACE, #P

Базы данных:
big table/hbase vs. dynamodb/cassandra/riak, 2/3PC, chubby/zoo keeper, leader election (paxos/raft), hdfs/gfs/glusterfs, deduplication problem, causality detection (vector clock/stamps), R/W quorum, load balancing, устройство индексов поисковых систем, event sourcing

Веб:
CDN, shadow DOM, есть майкрософтовский MVC, но, кажется, разумнее его заменить на MV*, квирки браузеров, real time bidding/trading, anomaly detection, архитектура single page apps, устройство веб-краулеров, web/social graph random walk, asm.js и компиляция в js, v8/spidermonkey internals, PaaS/IaaS, SPDY

Физика:
quantum tunnelling/hot electron injection :)

GUI:
алгоритмы визуализации данных (as seen in d3), subpixel rendering

Математика:
Теория категорий

Форматы:
base64, markdown, стоит добавить ссылку на статью спольски про юникод

Архитектура и стиль кода:
uncle Bob

Тестирование:
mocks/stubs/spies, fixture, запахи и паттерны тестов (Osherove/Meszaros)

Не хватает, имхо, раздела про DSP. Какие-то огрызки размазаны по другим пунктам, но этого мало. Раздел про дискретную математику какой-то мутный, его стоит объединить с теорией вычислимости. Раздел про базы данных стоит переименовасть в "Базы данных/Распределенные системы". Раздел про компиляторы стоит переименовать в "компиляторы C++" или "особенности реализации C++"

Edited at 2015-01-12 02:04 (UTC)
Это стоит обсудить. У вас есть более оперативное средство связи, жаббер какой-нибудь?
Забавно, что я практически одновременно с предыдущим комментатором захотел написать, что на месте теории распределенных систем, CRDT, net split проблемы, протоколов консенсуса, теории шардинга/репликации и их implications на общую производительность системы, вопрос данные-к-вычислениям или вычисления-к-данным, и всего такого прочего, зияет дыра. Через 4 года после последней активности в треде.

Еще не нашел:
- (немного связано с распределенщиной) дизайн протоколов и принципы коммуникации, с точки зрения эволюции, расширяемости, надежности.
- дизайн программных интерфейсов (API). На мой личный взгляд, это _очень_ важная тема, входящая в топ 5-10 по полезности из этих 30+ для программиста _любой_ специализации.

Еще общие замечания:
- чуть выше есть точный комментарий, суть в том, что это теормин (я бы даже сказал, теор-ок, если не теор-круто) R&D инженера, а не "программиста" в широком понимании смысла этого слова. Ты ответил, что "Я не скрывал, что это список для R&D engineer'ов". Вообще-то, скрывал. В прологе используется _только_ слово "программист", да еще и по соседству с оборотами "провинциальный вуз" и "не знают, куда податься", что однозначно указывает на более приземленное понимание этого слова. ИМХО это ненужное заигрывание с элементами снобизма. Теормин для R&D инженеров должен так и называться. (Это еще если читатели не пойдут в комментарии, где увидят прекрасный термин "опередни" в твоем употреблении, что просто offensive.)

- В одну кучу свалены 3 фракции:
- идеи/принципы/подходы/теоремы - 80% списка. По-хорошему, надо оставить только их в "R&D списке".
- Внезапно пункты 18-21, в каком-то смысле 38-33 (без 30), (+ фрагментарно в других), + упомянутый мной, но отсутствующий дизайн API, что следует расширить, + некое пересечение по отдельным пунктам с "R&D списком", причесать и выделить в отдельный список "культура и процесс разработки, создание end-user продуктов/библиотек, ..." короче, сложно как-то озаглавить этот список, но он будет однозначно полезнее для основной части программистов.
- по всему списку проскакивают просто конкретные технологии/наименования/баззоворды, в которых я не вижу никакой концептуальной ценности. Впечатление, что они добавлены "в извинение", чтобы опопсить список.

- Список надо было составлять не единолично и потом принимать дополнения, а сразу попросить 3-5 человек твоего уровня составить списки независимо, а потом выводить общее. Список, однозначно, biased, но увидеть это очень трудно, потому что для этого надо как минимум на 90% владеть этим списком и еще видеть на пол-порядка большую картину, на это способны от силы десятки человек в мире. Единственный способ исправить - найти сейчас тех самых 3-4 человек, которые ни разу еще не видели твой список, желательно из разных областей, и попросить их составить свои.
Я согласен с дыркой в распределенщине, потому что я от нее крайне далек и даже большую часть времени защищаю позицию, что распределенность не возникает в приложениях, написанных на нормальном языке™, потому что частота процессора совпадает по порядку с численностью населения Земли, а поэтому одного процессора хватит для всех задач, требующих "распределенного", а не "параллельного" подхода (возможно, за исключением небольших телекомовских ниш). Аналогично не было специалистов по этой теме и среди остальных составителей (либо они никак не спалились). Если вы составите хороший список, я с хорошей вероятностью пропатчу или пролинкую.

Это действительно теормин для R&D инженера, который занимается разработкой ИТ-технологий или технологически емких продуктов в отраслях типа геймдева или веб-поиска. Троллинг можно было не писать, но тогда бы было куда меньше прочитавших и комментариев, втч полезных. Троллинг можно убрать сейчас, но нет смысла и исторически неправдиво. И потом я не думаю, что для разработчиков оперденей какой-то теормин или мои образовательные усилия на самом деле нужны, а вот тех, кто только выбирает, может подтолкнуть на более прогрессивную дорожку.

Внезапные пункты 18-21 должны по идее называться "Системная инженерия и инструментарий в разработке ПО", но это в следующем апдейте. Похожая логика и в других элементах "списка для просто программистов" — показать существующие продукты и решения, чтобы не изобретать велосипед и использовать их как часть своих решений (или их подходы), где надо. Поэтому даже эта часть перекошена от того, что модно в индустрии в сторону слабо устаревающих или концептуально понятных вещей (поэтому я и не принимал критику про устаревание, плюс спустя 4 года понадобились довольно минорные патчи, в основном из-за моего невежества, а не реального устаревания). Например, jQuery (как втаскивание языка селекторов из дескриптивного языка в императивный код) есть, а Angular со сравнимой популярностью (как набор ad-hoc полезняшек с накрученной поверх инфраструктурой) отсутствует.

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

Список составляло довольно много человек, корректировало еще больше, плюс сам он построен на основе порядочного списка пролинкованных снизу источников, поэтому я полагаю, что это скорее ваш взгляд biased, а наш довольно медианный.
Перечитал. Впечатлен. Роскошно.
Фигня, ничего из этого не знаю и нормально программирую ))

(Анонимно)

Интересно, каким же это боком, скажем, Java-разработчику, специализирующемся на разработке систем управленческого учета может пригодится, например, знание arduino, физики, химии, модели освещенности (Фонг), С#, PHP, ?
Вы путаете специальность и профессию.
Страница 7 из 7
<<[1] [2] [3] [4] [5] [6] [7] >>