Как стать программистом
Чтобы стать программистом, нужно развивать свои навыки изо дня в день, из года в год. Программирование может приносить удовольствие и пользу (для разума, духа и финансовую). В этой статье мы не приводим методы, которые позволили бы вам магическим образом превратиться в специалиста, и последовательность шагов необязательно должна быть такой. Эта информация даст вам общие знания о том, как можно стать программистом в одной из современных сфер разработки.
1. **Запишитесь на вводный курс по одной (или по всем) из следующих дисциплин:** логика;
дискретная математика;
язык программирования (изучите различные парадигмы программирования, начав с параллельного и объектно-ориентированного программирования, а затем переходите к функциональному и логическому. Начинающим лучше подходит Ruby/ Python/Pascal, а после некоторой практики уже можно переходить к C++/C#/Java).
2. **Изучите базовые концепции, включая таблицы, запросы и процедуры.** Можно присмотреться к любому из следующих продуктов:

MS Access;
DB V;
Fox Pro;
Paradox;
MySQL также подойдет, поскольку это бесплатная распространенная система, и базы данных связаны с SQL-запросами.
3. **Решите, каким программированием вы хотите заниматься.** Есть несколько типов программирования:


веб-программирование;
программирование приложений для компьютеров:

программирование операционных систем (специалист занимается разработкой одной операционной системы или набора систем);
программирование, не привязанное к конкретной платформе.


программирование прикладных распределенных систем;
программирование библиотек, платформ, фреймворков, ядер;
системное программирование:

программирование ядер;
программирование драйверов;
программирование компиляторов.



научное программирование.
4. **Изучите технологии и языки программирования, связанные с той сферой, которая вам нравится.** В последующих разделах этой статьи пойдет речь о конкретных задачах в различных сферах программирования.
5. **Знайте, что включает в себя веб-программирование.** Веб-приложения — это компоненты программного обеспечения, которые надстраиваются над архитектурой интернета. Это означает, что доступ к приложениям осуществляется с помощью веб-браузера (например, Firefox или Internet Explorer). Эта надстройка необязательно требует активного соединения с интернетом. Это лишь означает, что веб-приложения строятся на основании стандартных веб-технологий, включая следующие:


HTTP;

FTP;

POP3;

SMTP;

TCP;

IP протоколы;

HTML;

XML;

Coldfusion;

ASP;

JSP;

PHP;

ASP.NET.
6. **Просмотрите** (Нажмите правой кнопкой мыши по любой области, затем «Посмотреть источник» либо нажмите F12.) Обратите внимание на разнообразие информации и оформления и не гонитесь за количеством. Следует посетить хотя бы по одному из каждого вида сайтов:

корпоративный сайт (сайты торговых корпораций, некоммерческих, государственных организаций);
сайты, отвечающие за индексацию в сети (поисковые сайты, сайты с поиском по мета-данным, особые поисковые системы, директории);
сайты для интеллектуального анализа данных;
личные сайты;
информационные и энциклопедические сайты (вики-сайты, списки данных, технической информации, руководства пользователя с указанием директорий, блоги и дневники, новости и сайты новостных агентств, желтые страницы и так далее);
социальные сайты (социальные сети, сайты для создания закладок и заметок);
коллаборативные сайты (к этой категории относятся все страницы, упомянутые выше, включая вики-сайты и блоги).
7. **Ознакомьтесь хотя бы с одним методом или техникой мозгового штурма и приложением, которое было создано на основе этого метода.** Например, мозговой штурм диаграмм и MS Visio.
8. **Узнайте, по какой схеме строятся веб-сайты.** Сюда относится создание особых веб-диаграмм, карт сайта и навигации.
9. **Запишитесь на экспресс-курс графического дизайна.** Постарайтесь научиться пользоваться хотя бы одной программой для создания и обработки изображений (это необязательное требование, однако эти навыки вам будут полезны).
10. **Ознакомьтесь с основами интернет-инфраструктуры.** Вам нужно будет иметь хотя бы базовые знания о:

основных протоколах веб-сервисов (HTTP, FTP, SMTP и POP3 либо IMAP4);
программах для веб-серверов (желательно для платформы, с которой вы будете работать чаще всего);
веб-браузерах;
серверах электронной почты и клиентском программном обеспечении.
11. **Изучите основы HTML и CSS.** Для этих целей можно использовать программный пакет  «What You See Is What You Get (WYSIWYG)».
12. **Изучите XML и технологии, связанные с XML (к примеру XSL и XPath).** Делать это не обязательно, однако эти знания будут полезны.
13. **Начните создавать простые статические сайты и делайте это до тех пор, пока не освоите основы HTML.** 
14. **Изучите клиентский скриптовый язык программирования.** Чаще всего изучают JavaScript. Можно также заняться VBScript, однако этот язык несовместим с большинством браузеров.
15. **Займитесь выбранным вами клиентским скриптовым языком программирования.** Постарайтесь добиться своего максимума с помощью одного этого языка. Переходите к следующему шагу лишь тогда, когда будете хорошо ориентироваться хотя бы одном языке этого типа.
16. **Освойте хотя бы один серверный язык программирования.** Если решите работать лишь с одним типом программного обеспечения сервера, изучите хотя бы один из языков программирования, который используется для написания этого программного обеспечения. Если будете готовы к большему, изучите как минимум по одному языку программирования на каждый тип программного обеспечения сервера.
17. **Изучив язык программирования серверной части, создайте тестовый проект.** 
18. **Создайте свой личный сайт** 
19. **Узнайте, чем вам придется заниматься.** Как правило, программисты пишут коды для приложений, которые используются в бизнесе, поэтому вам следует выяснить, как работает бизнес, как он организован и как построена его финансовая система, с тем чтобы сэкономить время.
20. **Изучите различные типы архитектуры компьютерного оборудования.** Будет полезно изучить основы построения цифровых схем и компьютерной архитектуры. Однако некоторые специалисты считают, что на начальном этапе это не нужно, поэтому достаточно будет прочитать 2–3 статьи на эту тему. Вы сможете вернуться к этому, когда освоите свой первый язык программирования.
21. **Изучите язык программирования базового уровня.** Не стесняйтесь изучать то, что считается детским, лишь потому, что вы старше. Примером такого языка служит Scratch. Такие языки облегчат работу с вашим первым настоящим языком программирования. Тем не менее, этот шаг нельзя считать обязательным. Кроме того, заняться этим можно и до предыдущего шага.
22. **Начните изучать процедурные, объектно-ориентированные и  функциональные парадигмы программирования.** 
23. **Запишись на вводный курс по процедурным языкам программирования.** Какой бы язык вы ни выбрали позже, вам нужны будут знания процедурного программирования. Кроме того, многие специалисты считают, что для того чтобы понять программирование в целом, следует начать с этого.
24. **Изучите одну из систем продвинутого моделирования (к примеру, UML или ORM).** 
25. **Начните писать небольшие консольные или консолеподобные приложения.** Можно использовать упражнения из учебников по программированию. Выберите инструмент для написания программ на том языке программирования, с которым вы работаете.
26. **Запишитесь на курс по программированию на выбранном вами языке продвинутого уровня.** Вы должны понимать следующие концепции, чтобы уметь применять их с относительной легкостью:

ввод и вывод информации клиентами в программе;
логический поток и поток выполнения программ на процедурных языках программирования;
выбор, назначение и сравнение переменных;
создание ключевых конструкций, включая if..then..else и select/switch..case;
закольцовывание конструкций, включая while..do, do..while/until, for..next;
синтаксис вашего языка программирования для создания и названия процедур и функций;
типы данных и способы обработки данных;
типы данных, определяемые пользователем (записи, структуры, единицы), и их применение;
если ваш язык поддерживает функции перегрузки, вы должны в них разбираться;
способы анализа памяти в выбранном вами языке (указатели, звуки и так далее);
если ваш язык программирования поддерживает перегрузку операторов, вы должны знать это;
если в вашем языке есть указатели на функции, вы должны разбираться в них.
27. **Начните применять полученные знания.** 
28. **Пройдите вводный курс как минимум по одному языку программирования в другой парадигме программирования.** Следует выучить один язык в каждой парадигме, и, как правило, все хорошие программисты так и поступают, однако вам достаточно начать с одного, поработать с ним, потренироваться, а затем перейти к другим, когда у вас уже будет реальный опыт в программировании. Присмотритесь к одной из следующих сфер:

парадигма логического программирования;
парадигма функционального программирования;
объектно-ориентированная парадигма.
29. **Попробуйте сравнить два языка программирования, которые вы уже освоили.** Оцените сильные и слабые стороны каждого из них. Обычно делают это так:

Возьмите простой пример вашей ранней работы на первом языке программирования и перепишите ее, используя второй язык.
Создайте новый проект и используйте там оба языка. Возможно, некоторые вещи вам не удастся сделать на одном из языков — все будет зависеть от выбранного вами проекта и языков.
Сделайте шпаргалки или сравните похожие конструкции в обоих языках и их отличия в сводной таблице.
Найдите способ повторить конструкции, которые есть в одном языке, с помощью другого языка.
30. **Изучите концепции визуального программирования с помощью одного из выбранных вами языков.** Практически у всех языков программирования есть версии либо библиотеки, которые поддерживают визуальное программирование и другие виды консольного или консолеподобного программирования. Сделать это можно следующим образом:

Пройдите вводный курс по событийно-управляемому программированию. В основном визуальное программирование базируется на событиях и обработке событий (с помощью выбранного языка программирования).
Попробуйте поработать с большим количеством программного обеспечения для стационарных компьютеров, чтобы понять, что делают эти программы. Большинство компаний-разработчиков предлагают бета-версии приложений, которыми можно попробовать пользоваться. Следите за развитием пользовательского интерфейса.
Читайте статьи или руководства по работе с графическим пользовательским интерфейсом.
31. **Начните применять свои знания, разрабатывая простые приложения.** Попробуйте использовать полученные знания для решения повседневных проблем. К примеру, пишите программы, которые будут массово переименовывать файлы, сравнивать текстовые файлы визуально, копировать названия документов в определенное место в отдельный файл памяти или текстовый файл и так далее. Для начала пусть все будет простым.
32. **Создайте виртуальный дипломный проект.** Сделайте все до конца, применяя методы визуального программирования, которые вы уже освоили.
33. **Углубите свои знания визуальных схем, библиотек и программных пакетов, пройдя курсы для продвинутых, уделяя особое внимание более мелким вещам и старясь узнать как можно больше приемов работы со фреймворками из интернет-источников.** 
34. **Поищите другие программные пакеты и библиотеки визуальных элементов для ваших языков программирования и изучите их.** 
35. **Запишитесь на курсы графики (не графического дизайна).** Это будет очень полезно, если вы планируете создавать элементы с красивым пользовательским интерфейсом.
36. **Станьте разработчиком игр (по желанию).** Программирование компьютерных игр считается программированием для стационарных компьютеров. Если вы хотите создавать игры, вам нужно будет освоить основы этого программирования после завершения вышеописанных шагов. Вам обязательно нужно будет пройти курс программирования игр, а второй язык программирования, который вам следует выбрать, должен быть логическим/функциональным языком (желательно Prolog или Lisp).
37. **Начните заниматься программированием прикладных распределенных систем.** Это программирование считается одним из самых сложных и требует самых разных знаний в сфере компьютеров и информационных технологий.
38. **Пройдите экспресс-курс по телефонии и соответствующему оборудованию.** Делать это не обязательно, однако благодаря такому курсу вы будете лучше понимать сетевую топологию.
39. **Ознакомьтесь с архитектурой сетевого оборудования и устройств, включая хабы, свитчи и маршрутизаторы.** 
40. **Изучите сетевые протоколы и все связанное с ними.** Вам нужно будет хорошо понимать модель OSI (Open Systems Interconnection — международная программа стандартизации обмена данными между системами различных производителей), Ethernet, IP, TCP,  UDP и HTTP. Лишь после этого вы сможете начать работать.
41. **Изучите язык XML и научите пользоваться им.** 
42. **Начните изучать язык распределенного программирования.** Если речь идет о программировании под Windows, подойдет любой язык, который поддерживает Windows Scripting Host. При программировании под Linux используются Bash и Perl. Рекомендуется изучить JavaScript для работы с обеими платформами по следующим причинам:

JavaScript поддерживается практическими всеми скрипт-хостами всех операционных систем (Windows Scripting Host поддерживает JavaScript по умолчанию, а у большинства дистрибутивов  Linux есть пакет для поддержки JavaScript).
Считается, что изучить его проще.
JavaScript строится на синтаксисе ALGOL, а это позволит вам познакомиться со многими другими языками программирования, и выбрать второй язык вам будет проще (C, C++, C#, Java и J# имеют в своей основе синтаксис ALGOL).
Изучая  JavaScript, вы знакомитесь с клиентским скриптовым программированием веб-страниц, а это означает двойную пользу!
43. **Сначала используйте только процедурное программирование на одном языке.** Позже вы сможете применять более сложные приемы и парадигмы, соответствующие вашему скриптовому языку и тому, что он поддерживает. Все скриптовые языки используют процедурное программирование в той или иной степени.
44. **С помощью изученного вами скриптового языка начните писать скрипты, которые будут заставлять машины общаться.** Узнайте, что вам для этого нужно. Будет достаточно простого обмена данными.
45. **Перейдите на язык программирования для стационарных компьютеров.** Желательно выбрать язык с несколькими парадигмами — например Python. Изучите основы этого языка. Многие выбирают Java по самым разным причинам, однако в настоящий момент все более и более популярным становится язык C#. Причины, по которым лучше выбирать Java и C#, заключаются в следующем:

Это объектно-ориентированные языки, которые освобождают программистов в больших командах от необходимости думать о тонкостях внедрения, поскольку оба языка поддерживают компоненты (готовые объединенные единицы кода, которые позволяют выполнять определенные задачи и в других программах).
Они поддерживают событийно-управляемое программирование, а также объектно-ориентированное и процедурное программирование в определенной степени.
Фреймворк, на основе которого надстраивается язык, является распределенным по умолчанию (в случае Java).
Возможность использовать готовые пакеты, которые отвечают за сети, то есть пакеты для открытого кода и для встроенных во фреймворк пакетов. Благодаря этому программистам проще строить свою работу на основании уже существующего кода.
46. **Уделяйте больше внимания** Меньше внимания можно уделить пользовательскому интерфейсу, включая такие элементы, как вывод данных, дизайн окон и прочие техники.
47. **Изучите основы архитектуры прикладных распределенных систем.** Это можно сделать самостоятельно с помощью книг, интернет-источников или на курсах. Что бы вы ни выбрали, вам будет важно понимать основные принципы построения прикладных распределенных систем.
48. **Изучите разработку обслуживаемых компонентов и сервисов на выбранном вами языке.** 
49. **Изучите одну или несколько из следующих технологий.** Рекомендуется знать хотя бы немного о них всех. Большинство программистов прикладных распределенных систем не ограничиваются одним или двумя языками, а учат как минимум по одному языку на каждую операционную систему. Это объясняется тем, что для того чтобы сделать приложение распределенным, вам нужно будет создать по версии этой программы как минимум для основных операционных систем.

Общая архитектура посредника запросов к объектам (CORBA)
Простой протокол доступа к объектам (SOAP)
Асинхронный JavaScript и XML (AJAX)
Распределенная компонентная объектная модель (DCOM)
.NET Remoting
Веб-сервисы XML
50. **Узнайте, что такое программирование ядра.** Программисты ядер — это опытные программисты, которые перешли от разработки приложений к программированию единиц кода, которые могли бы использовать другие программисты.
51. **Изучите язык программирования, поддерживающий разработку компонентов и пакетов, которые можно было бы использовать готовыми, если вы еще этого не сделали.** 
52. **Пройдите продвинутый курс UML и ORM.** Чаще всего используется либо что-то одно, либо и то, и другое.
53. **Пройдите курс программирования программного обеспечения.** 
54. **Изучите как минимум способы модулярного программирования, программирования на основе компонентнов, объектно-ориентированного и событийно-управляемого программирования и основные принципы работы в этих системах.** Чем больше парадигм и языков вы будете знать, тем проще вам будет стать программистом библиотек и пакетов.
55. **Изучите различные операционные системы и фреймворки, которые работают в этих системах.** 
56. **Уделите особое внимание фреймоворкам, не зависящим от платформы, а также языкам программирования и технологиям.** 
57. **Если языки программирования, которые вы уже изучили, поддерживают стандартные версии ANSI/ISO/IEEE/W3C, освойте основы.** По возможности используйте стандартный код.
58. **Попробуйте воссоздать простые готовые библиотеки, особенно с открытым кодом.** Это будет очень полезно на первом этапе. Начните с простых пакетов (например, перевод единиц измерения или расчеты среднего уровня сложности). Если вы учитесь в университете, используйте информацию, полученную на других занятиях, и попробуйте применять уравнения и данные в качестве библиотек.
59. **Поищите пакеты с открытым кодом и попытайтесь поработать с ними в своей сфере программирования.** Сначала скачайте двоичные и исполняемые файлы. Начните работать с ними, чтобы понять, в чем заключаются их сильные и слабые стороны. Затем скачайте исходный код и постарайтесь разобраться, как он был создан. Попробуйте воссоздать библиотеки или их части. Сначала делайте это после того, как увидите код, а потом — до этого. Когда начнете разбираться в этом, попробуйте улучшить библиотеки.
60. **Изучите различные подходы к распределению и развертыванию компонентов для программистов.** Как правило, программисты библиотек и пакетов пытаются представить все задачи в обратном порядке и/или итерационно. Попробуйте представить задачу как совокупность мелких задач (последовательность простых действий) либо как повторяющий процесс, который позволяет свести большой масштаб к маленьким, а потом наслоить полученное друг на друга.
Программисты библиотек и пакетов часто обобщают. Когда перед ними есть простая и понятная задача, они пытаются представить общую проблему и решить ее, что автоматически решит все более мелкие задачи.
61. **Узнайте, что включает в себя системное программирование.** Системные программисты работают с научной стороной программирования, а не с конкретными задачами. Не привязывайтесь к определенной платформе.
62. **Следуйте рекомендациям в первых трех шагах для программистов приложений для стационарных компьютеров.** 
63. **Пройдите вводный курс по линейной алгебре.** 
64. **Пройдите курс по расчетным методам.** 
65. **Пройдите курс по логике и/или дискретной математике.** 
66. **Познакомьтесь с разными операционными системами без надстроек.** Это можно сделать следующим образом:

Выясните, как устанавливаются системы.
Научитесь устанавливать операционные системы на компьютер (рекомендуется).
Установите более одной системы. Не пользуйтесь вспомогательными пакетами — возьмите лишь основной функционал операционных систем.
67. **Пройдите курс по архитектуре компьютерного оборудования (либо прочитайте литературу по этой теме).** 
68. **Изучите особенности различных аппаратных платформ.** 
69. **Ознакомьтесь с основами языка ассемблера выбранной вами операционной системы или аппаратной платформы.** Позже вам нужно будет изучить язык ассемблера других платформ и систем.
70. **Изучите языки ANSI C и C++, а также основные принципы процедурного программирования.** 
71. **Изучите стандартные библиотеки на C/C++ и начните использовать их на выбранной вами платформе.** Особое внимание уделите библиотеке стандартных шаблонов (STL) и библиотеке активных шаблонов (ATL)
72. **Чтобы понять, как C/C++ работает на вашей платформе, читайте интернет-источники, книги и курсы.** 
73. **Начните создавать более сложный код на C и C++.** 
74. **Изучите более сложные нюансы Assembly.** 
75. **Пройдите курс разработки операционных систем.** 
76. **Найдите и прочитайте документацию по выбранной вами платформе.** Вам будет проще работать с операционной системой на основе Unix. Вам нужно будет очень хорошо разбираться в этой системе.
77. **Начните применять полученные знания.** Сначала создавайте небольшие системные утилиты. Будет полезно сделать следующее:

Воссоздайте небольшие инструменты, которые уже есть в вашей системе.
Попробуйте соединить утилиты, которые есть в других системах, с вашей системой.
78. **Изучите языки в том порядке, в котором это будет правильнее всего.** Лишь в этом случае имеет значение, какой у вас первый язык программирования. Лучше сначала изучить ANSI C, а не C#, Java или D. Затем переходите к C++.
Требование знания языка C и только C связано с тем, что системный программист должен владеть следующими знаниями:

Реальная и полная компиляция исходного кода.
Файлы выходных данных объектов нижнего уровня.
Связующие двоичные файлы.
Программирование на машинном языке нижнего уровня и программирование на ассемблере. На языке С многим проще изучать ассемблер. Кроме того, этот язык позволяет помещать языковой код ассемблера в основной код в любой момент, и это процедурный язык (как и ассемблер).
79. **Узнайте, чем занимается научный программист.** Научные программисты — это очень опытные специалисты, которые разрабатывают не приложения, а технологии: шифрование, языки программирования, алгоритмы по интеллектуальному анализу данных. Добиться этого уровня знаний без специального образования и упорства практически невозможно.
80. **Накопите научные знания, равноценные объему информации, даваемой в университете.** Это можно сделать несколькими способами:

Поступите в университет (обычно все так и делают).
Узнайте, в чем заключается университетская программа в этой сфере в одном из современных университетов, и начните либо заниматься на курсах, либо учиться самостоятельно. Теоретически это позволит получить все нужные знания, однако лучше всего поступить в университет.
81. **Выберите специализацию.** Чем более узкой она будет, тем лучше. Все зависит от ваших личных предпочтений, но мы приведем список основных сфер в научном программировании:

разработка алгоритмов (поиска, сортировки, шифровки данных, расшифровки, определения ошибок в передаче данных);
разработка и оптимизация языков программирования и компиляторов;
сфера искусственного разума (распознавание повторяющихся элементов, речи, обработка естественного языка, нейронные сети);
робототехника;
собственно научное программирование;
суперкомпьютеры;
системы CAD/CAM (компьютерное конструирование);
виртуальная реальность;
компьютерная графика (компьютерную графику часто путают с графическим дизайном или дизайном графического пользовательского интерфейса. Компьютерная графика — это сфера знаний, которая позволяет узнать, как создавать графику и управлять ею в компьютерных системах).
82. **Подумайте о получении научной степени.** Попробуйте стать кандидатом в доценты или доцентом.
83. **Изучите технологии и языки программирования, связанные с выбранным направлением.** 