Классификация знаний в области программирования

Классификация знаний в области программирования

517
ПОДЕЛИТЬСЯ

2 года назад я написал статью о классификации познаний в области программирования. Написал статью и запамятовал о ней. Это было на волне энтузиазма и моей активной деятельности по самообразованию в компьютерных науках. В конце концов, она базируется на моем личном опыте и знаних, которые могут оказаться очень субъективны. Публиковать на Хабре не собирался.

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

С иной стороны, из-за широких способностей самообразования, программеры и не торопятся обучаться в Университетах — все стремятся начать практиковать как можно ранее. Но до этого, чем «запустить» материал, еще маленькое отступление. Дело в том, что у нас в странах бывшего СССР с образованием в области IT чрезвычайно туго. О том, почему вообщем я все это писал. С одной стороны нет программ обучения, которые подготовят профессионалов на должном уровне (наверняка, за чрезвычайно редкими исключениями, которые можно отнести к погрешности). Отсюда вытекают трудности с качеством кода, и с эффекивностью алгоритмов, с велосипедированием. В итоге у нас большущее количество программистов, которые и базисных вещей не знают. При этом, на этом все заканчивается. Нередко изучается лишь одно направление (к примеру PHP+Mysql — самое популярное) и в бой.

А поднять большая часть веб-сайтов можно прочитав пару книжек по PHP и HTML. Да, выстроить дом (дом) можно своими руками и без образования. Но многоэтажку без специальной подготовки не построишь, как и Google не напишешь, не зная основ. Но программирование — это настоящая область познаний, которая просит в том числе и инженерной подготовки. Точно так же, как стройку либо телекоммуникации.

Как разобраться, что и в какой последовательности учить? Мне кажется, что этот материал поможет разложить по полочкам области познаний в компьютерных науках и составить для себя програмку исследования по книжкам. Единственное, чего же не хватает, — это системности подготовки. Способности для самообразования в компьютерных науках на данный момент огромны. Выбор книжек — тема отдельная, в рамки статьи не заходит, но это можно обсудить в комментах.

Поехали.

Да и вообщем, программером ли? для начала необходимо узнать, каким программером необходимо стать. Не считая того, на рынке нужны как высококвалифицированные дорогие спецы, так и “рабочая сила”. Меня время от времени спрашивают, что необходимо выучить, чтоб стать программером. Т.е. Пакет познаний и опыта первых и вторых различается в значимой степени. нормально ответить на него по-моему нереально. Вопросец несколько доверчивый, т.к.

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

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

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

Как-то выходит так, что программер — это не непременно инженер. Это уровень среднего образования. Время от времени довольно кодировки: используя данный набор технологий, слепить что-то работающее. Обычный пример — стадо корпоративных либо рекламных веб-сайтов на джумлах, ворпрессах, друпалах и т.д. проектирует системы. Даже из определения Википедии следует, что инженер — это в первую очередь проектировщик. А в практике программирования проектирование необходимо не постоянно. Это тот, кто делает, т.е. В прошлом абзаце я специально ввел термин “инженер-программер”. Это уровень техника, не инженера. И работать техником можно даже опосля окончания курсов какого-или языка программирования, крепкая теоретическая база там не нужна.

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

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

Внедрение предполагает необходимость фрагментарных познаний другого предмета, а расширение — необходимость как минимум обзорных, но полных познаний расширяемой дисциплины. Меж дисциплинами есть 2 вида связей: внедрение (рядовая стрелка) и расширение (контур стрелки).

1-ый уровень из CS (computer science) — Особая база. Это стартовая площадка для хоть какого программера по четырем направлениям:

арифметические базы ЭВМ (системы счисления и операции с числами, логические операции);
физические базы ЭВМ (полупроводники, транзисторы, логические элементы, схемы, интегральные микросхемы);
теория алгоритмов (методы и структуры данных; сложность, эффективность; методы представления инфы в памяти);
языки программирования (задачка и понятие ЯП, уровни, типы языков, абстракция, уровни абстракции, трансляция/компиляция, шаблоны, принципы, парадигмы — обзор).

Особая база дает фундаментальные теоретические познания, на которых строятся дисциплины наиболее больших уровней. Для неких специализаций требуется углубленное осознание теории алгоритмов (до этого всего — разрабам различного рода библиотек). Для среднего программера нужны обзорные познания по всем предметам специальной базы.

В него входят: По-этому я именовал этот уровень Базы. Уровнем выше размещаются дисциплины, которые являются базисными конкретно в программировании.

архитектура ЭВМ (процессоры, микроархитектура, память, шины, ввод/вывод);
обработка инфы (теория инфы, статистика, модели, поиск данных, лингвистические нюансы, обработка инфы средствами табличных процессоров);
базы C/C++ (базисные характеристики языка, синтаксис, указатели, ввод/вывод, массивы, базы STL).

Он включает 5 дисциплин: Это 1-ый прикладной уровень, и особо нетерпеливые могут начать коммерческую практику, овладев сиим уровнем. Следом за Основами идет Уровень 1.

базы ASM (развитие архитектуры ЭВМ в направлении программирования, написание простых драйверов и алгоритмов, ассемблерные вставки в C/C++);
C/C++ (ООП, разработка прикладных приложений, библиотеки, WinAPI, make utils, параллельное программирование).
операционные системы (архитектура ОС, процессы, межпроцессное взаимодействие, потоки, планирование, работы с памятью и переферией, POSIX-системы);
системный анализ (предметная область, бизнес-процессы, потоки, диаграммы, принципы и теория системного анализа);
базы данных (теория множеств, виды СУБД, реляционные СУБД, модели данных, SQL, определенные БД).

По развитости этот предмет поближе все-таки к первому уровню. Кстати, компьютерные сети попали в него лишь по той причине, что для их исследования лучше (но не непременно) предварительно освоить операционные системы. Последующий уровень — Уровень 2 — развивает предшествующий.

Уровень 2 включает:

разработку ПО (жизненный цикл ПО, этапы разработки, базы ведения программных проектов, инструменты);
анализ данных (Data Mining, OLAP, машинное обучение, нейронные сети, ИИ);
компьютерные сети (по уровням стеков TCP/IP и/либо ISO/OSI “от и до”, протоколы, сетевое программирование на C/C++);
языки программирования с управляемым кодом (управляемый код, виртуальные машинки, сборщики мусора, юнит-тестирование, фактически практика на C# либо Java);

Всего их вышло 6: Он самый большой и включает лишь те дисциплины, которые конкретно соединены с разработкой ПО. Уровень 3 — крайний уровень для среднего программера.

разработка UI и юзабилити (принципы построения интерфейсов юзера);
управление командами и проектами (методологии разработки и остальные вопросцы управления);
тестирование ПО (обзорно: виды тестирования, инструменты);
интернет-технологии (HTTP-протокол, интернет-сервер, CGI, кэширование и проксирование, клиентское программирование);
распределенные системы (архитектуры распределенных систем, протоколы сетевого взаимодействия компонентов, инструменты, принципы, подходы к построению распределенных систем, отказоустойчивость, огромные данные, высочайшие перегрузки);
интерпретируемые языки программирования (индивидуальности, базы по двум-трем языкам, практика по одному-двум языкам: JS, PHP, Python, Ruby).

По большому счету этот уровень можно расширять неограниченно, добавляя в него смежные с разработкой дисциплины и более сложные нюансы разработки ПО. получится очень много стрелок, идущих через все уровни, вплоть до Общей базы. Наверняка, широкие зависимости — это один из признаков вопросцев экспертного нрава. Я привел 3 примера — разработка компиляторов, разработка операционных систем и построение архитектур огромных программно-аппаратных систем, или архитектур, рассчитанных на особо высочайшие перегрузки. Тут как раз подтверждается то, что экспертный уровень просит самых широких познаний и неплохого опыта. Зависимости к нижним уровням га графе не рисовал, т.к. Все, что идет выше, — расширенные Экспертные познания.

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

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

А отменная модель как правило дает ответы сходу на множество вопросцев. Граф — это модель. для тестировщика, системного администратора и остальных близких к программированию профессий он будет наиболее либо наименее близким, но очевидно иным. И еще раз припоминаю, что это граф для программера. Я поставил перед собой задачку сделать неплохой граф, близкий к действительности. Т.е. Естественно, он основан на моем личном опыте и не претендует на эталон. Я старался сделать его более объективным.

Это любопытно не всем, это необходимо не всем. Это личный выбор каждого и статья совершенно не о этом. Тут приведена классификация познаний и взаимосви меж ними. habrahabr.ru P.S. Убедительная просьба не развивать холивары на тему, что должен и что не должен знать программер.