Что изучать, на что тратить свободное время, чтобы в будущем стать востребованным программистом с нормальным заработком?
==========================================================================================================================

 Здравствуйте. Мне сейчас 17, учусь в колледже на специальности «обслуживание компьютерных систем и сетей». В будущем хочу работать программистом. Сейчас лето, у меня появилось огромное количество свободного времени, которое не хотелось бы тратить впустую. В данный момент активно изучаю с++ (по книгам). Планирую продолжать заниматься самообучением, поэтому интересуют, на что тратить время и силы, что и в каком порядке изучать (технологии, ЯП, инструменты разработки и т.д.), как сделать своё обучение более эффективным, на что стоит обращать внимание?  

Заранее спасибо за советы. 

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

Будет ли это сетевое программирование? Тогда это си, в основном.  

Захотите разрабатывать программы на десктоп? Вам нужны c# или java.  

На мобильные платформы? тогда java и objective c (плюс swift).  

Или податься в разработку игр? Тогда либо c++, либо с# (для Юнити - наверное, самой популярной платформе).  

Хотите экзотики? Приглядитесь к функциональным языкам - Erlang и Haskell.  

Разработка железа и драйверов для железа? тогда си (без плюсов) и ассемблер.  

Определитесь, что вы хотите, потому что всё объять не получится. Выберите один (или два) направления и добейтесь хорошего уровня в нём. А потом вам будет уже легче двигаться дальше.  
  

  

Добавлю, что очень правильный совет дал [@tsarevfs](http://toster.ru/user/tsarevfs) - помимо языка программирования, хороший программист должен знать несколько инструментов - и в первую очередь, это система контроля версий, например, git. Плюс юнит-тестирование (хотя это можно начать изучать позже, через годик-два). Плюс - нужно хорошо знать свою IDE, в которой работаете; не вздумайте работать в блокнотиках!  
  

Ещё помимо практики нужно знать теорию - читайте Макконнелла, Фаулера, Мартина, Бека.  

Подпишитесь на хабре на пару десятков хабов и регулярно читайте всё подряд. Через годик ваш уровень понимания статей сильно вырастет.  
  

Я сам преподаватель программирования в колледже, и, к сожалению, таких желающих изучать там очень мало. Пишите мне в личку, если будут вопросы.  
  
**UPD.** Важное дополнение из обсуждения в комментариях (спасибо [@Argentum88](http://toster.ru/user/Argentum88) [@Deerenaros](http://toster.ru/user/Deerenaros) )  

Чтобы стать профессионалом и "востребованным программистом с нормальным заработком", нужно очень хорошо понимать внутреннее устройство тех систем (платформ, фреймворков), на которых идёт работа.   

Для этого нужно заглядывать вглубь. Изучив различные мейнстрим-инструменты, посмотреть на аналогичные менее популярные системы. Изучать исходный код используемых open-source библиотек. Написать свою подобную систему. Для web - написать свою CMS (хотя бы базовую). Для десктоп-программ - попробовать программировать без навороченных библиотек, которые делают рутинную работу за программиста. Для разработчика игр - сделать простую игру на базовом инструментарии платформы, где всё придётся делать своими руками.  

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

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

 Подкину литературы, ссылок, дабы была подмога в выборе области.   

А то, в каком порядке изучать - так образование трудно облачить в алгоритм. Необходимо знать немного о всем и все о немногом. Главное чтобы пёрло и была поддержка в лице единомышленников.  
  

Из того, на что обязательно нужно взглянуть.  
  

Математика (база, во всех ее проявлениях):  

Кнут Искусство программирования  

Вирт Алгоритмы + структуры данных = программы  

Ахо,Лам,Сети,Ульман - Компиляторы. Принципы, технологии, инструменты.  

Кормен. Алгоритмы. Построение и анализ.  

Скиенна. Алгоритмы. Руководство по разработке.  

Таненбаум. Распределенные системы.  

Таненбаум. Современные операционные системы  
  

Сети:  

Олифер. Компьютерные сети. Принципы и технологии.  

Davies J. - Understanding IPv6  
  

Программирование паяльником:  

Титце, Шенк. Искусство сехмотехники  

Блог [easyelectronics](http://easyelectronics.ru/)  
  

Hardware:  

David A. Patterson, John L. Hennessy - Computer Organization and Design  

David A. Patterson, John L. Hennessy - Computer architecture  
  

ИИ:  

Норвиг. Искусственный интеллект.  
  

Информационная безопасность:  

Шнайер. Прикладная криптография.  

Головоломки для хакеров (забавная книга, автора не помню к сожалению, натуральная практика по программированию)  

The Giant Black Book of Computer Viruses  

Михайлов Д. М., Жуков И. Ю. - Защита мобильных телефонов от атак - 2011  

Абашев - Ассемблер в задачах защиты информации  

Nmap Network Discovery   

Russel, Mullen, Long. Stealing the Network  
  

Masterminds.of.Programming.Conversations.with.the.Creators.of.Major.Programming.Languages  

Брукс - Мифический человеко-месяц  
[Как выучить язык программирования за 10 лет](http://www.norvig.com/21-days.html)  
  

Для фантазии:  

Нейман - Теория самовоспроизводящихся автоматов  

Kurzweil - Singularity is near  
  

Выберите проект который реально сделает вашу жизнь проще (поможет вам жить). Возможно это будет автоматизация каких-то рутинных задач... Такие идеи практически наверняка можно будет продать или выложить на всеобщее обозрение.   

Не отчаивайтесь, если ваша идея уже будет гуглиться, уже будет кем-то решена. Скорее всего вы сможете сделать лучше и по-своему. Доводите до логического конца (если конкуренты обещают уже вотвот выпустить продукт - обещания это всего лишь обещания).   
  

И да - поставьте Linux. 

 1) Поставь Gentoo GNU/Linux. Постарайся сделать ее "дружелюбной" для себя.  

2) Выучи подмножество английского, необходимого для понимания технических текстов.  

3) Начни с изучения основ языка программирования С. Синтаксис, основные функции.  

4) Реализуй простые алгоритмы. Напиши несколько видов сортировок. Осознай их плюсы и минусы. Это даст начало развитию алгоритмического мышления. Ознакомься с таким понятием как рекурсия.  

5) Поставь себе простенькую задачу. Не ищи их в гугле, постарайся сам придумать. Придумав, реализуй ее без всяких книжек и туториалов, используя только [www.gnu.org/software/libc/manual/pdf/libc.pdf](http://www.gnu.org/software/libc/manual/pdf/libc.pdf) и мозг. (например я делал сниффер и клиент-серверное приложение, использующее в роли протокола - TLS 1.2)  
  

Такой путь я проходил сам. Раньше я сидел постоянно на винде и не видел даже в глаза GNU/Linux. И я сразу начал знакомство с Gentoo. Не бойся. Пол года помучаешься, зато знать будешь больше чем Убунтушник за 2-3 года пользования Ubuntu. Сможешь уже нормально мыслить. К тому же программировать на С под GNU/Linux одно удовольствие. На все мои пункты у тебя уйдет около 8 месяцев - 1 год, но это того стоит. И главное всегда помни, что любой язык программирования это не сама цель, а лишь средство, инструмент. Это чисто мое имхо) 

 Научись пользоваться системой контроля версий, например git + bitbucket. Храни там все что пишешь, в том числе по учебе.  

Сетевое программирование: читай Таненбаума или, если больше нравится, можно посмотреть [лекции](http://www.lektorium.tv/course/22904).   

Unix и операционные системы в целом: [маленький список](http://oxij.org/activity/itmo/os/plan/). 

 Занимайся самообразованием тк оно рулит, учи с++, java, python, java script и будет тебе счастье. 

 Я бы посоветовал посмотреть в сторону программирования под мобильные операционные системы.  

iOS - Objective-C  

Android - Java  
  

Но к этому еще хорошо бы знать какой нибудь серверный язык (js, php, perl) для того что бы мог писать сразу серверную и клиентскую часть 

 Мои пять копеек:  
  

1. Бросайте колледж. Если хотите получить формальное образование - поступайте в институт (тщательно выбирайте учебное заведение и программу). Либо просто бросайте и занимайтесь самообразованием, параллельно подыскивая первое место работы.  
  

Колледж это пустая трата времени. Ценится только диплом о ВЫСШЕМ образовании. Для работодателя выпускник колледжа это то же самое, что человек без формального образования вообще. Говорю как работодатель.  
  

2. Учите английский язык. Вы должны уметь читать технические книги, учебники, блоги и т.п. в оригинале. Поверьте, такие способности сэкономят вам кучу времени и денег.  
  

3. Ставьте линукс, изучите (в общих чертах), как он работает и начинайте изучать bash. Заморачиваться с дистрибутивом не советую - то, что вам тут советовали это системы не для новичков. Потратите много времени на решение третьестепенных вопросов типа настройки звуковой карты. Ставьте убунту, проблем будет меньше всего (но все равно будут).   
  

4. Если есть возможность, практикуйтесь. Спросите знакомых - может быть, кому-то нужен сайт. Сделайте его с нуля на какой-нибудь несложной CMS (joomla, wordpress). Попробуйте сделать простенькую игру или приложение для мобильного. И так далее. Лучший способ что-то изучить - применить это в деле. 

 программист - это в первую очередь математика, алгоритмы и структуры данных. по сути - вышка в ВУЗе.  

а языки, среды разработки, модули и библиотеки - это кодер.  

программисту достаточно листа а4 и карандаша в общем случае, дальше работа кодеров.  
  

поэтому определяйтесь) 

 Забейте на Java. Учите .NET он не такой тормозной и с безопасностью все хорошо + полная кроссплатформенность и одна из самых удобных IDE. 

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

 Раз уж ты решил стать программистом, то советую изучить после С++ алгоритмы и структуры данных по книге Роберта Сэджвика . Если знаешь английский то вот видео курс Сэджвика с coursera   

[rutracker.org/forum/viewtopic.php?t=4294269](http://rutracker.org/forum/viewtopic.php?t=4294269)  

Сэджвик крутой препод - он учился у Кнута и первым опубликовал концепцию структуры данных red-black binary search tree, хотя придумал такие деревья кто то другой вроде бы.  

Там правда Java, но разница между Java и С++11 вплане возможностей синтаксиса очень мала.  

Главное понять как это работает и как этим пользоваться.  

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

Ещё советую заняться спортивным программированием. Хотя бы на время. Для первоначальной прокачки алгоритмического мышления отлично подойдёт.   

Это для базы.  

А чтобы найти работу нужно определиться со сферой деятельности и языком программирования. Тогда сразу узнаешь что учить. Посмотри какие программисты востребованы, выбери что больше нравиться и учи, обычно в требованиях к вакансии указано все что должен знать соискатель. За год-два вполне возможно доучиться до junior в какой то сфере.  
[С++](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+%D0%A1%2B%2B&rid=225)  
[С#](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+c%23&rid=225)  
[PHP](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+php&rid=225)  
[Java](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+Java&rid=225)  
[iOS(программирование под iphone)](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+ios&rid=225&strict=false)  
[Android](http://rabota.yandex.ru/search.xml/?text=%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82+android&rid=225&strict=false) 

 У вас в руке площадка 10x10 из кубов, которые стоят в столбики. Эту конструкцию опускают в воду и поднимают из воды. Какая-то часть воды осталась внутри этой конструкции. Сколько воды осталось, если размер кубика 1x1x1?  

Если вы решите эту задачу быстрее, чем за O(n*n*n), то можете вообще ничего не учить. 

 iOs или Android. Хороший специалист получает 150 000 р., и в тоже самое время самих этих хороших специалистов крайне мало 

 Найди то что тебе нравиться и начинай этим заниматься если хочешь достичь чегото. Деньги просто так никто платить не будет :).  

А так наиболее востребованы технологии веб и мобильные приложения 

 можно так:  

для софта - питон (PyQt, PyGTK, etc.) + основы (хотя бы на первых порах) С/С++  

для веба - php, питон (django, flask, bottle.py, etc.) или js/nodejs (но можно и руби с рельсами и синатрами)  

для кодинга под встраиваемые системы (умные телевизоры/холодильники/часы и прочее) - Lua или джава, хотя знаю, что есть пару минималистичных реализаций питона для этого дела  
  

таким образом можно свести все к связке - питон + джаваскрипт и изучить это дело хорошенько.   

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

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

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

так что без разницы какой из трендовых языков вы выучите 

 Нужно понять, какая именно у Вас цель. "Работать программистом" на цель не тянет. Если чисто абстрактная мечта, то совет простой:   

1) найти вакансию "своей мечты"  

2) посмотреть, что в ней требуют  

3) начать это всё изучать, как теоретически, так и на практике (попутно получая всякие сертификаты, если это принято для данных технологий)  
  

П.С. Программистский колледж - это ПТУ. Идите в институт, если есть тяга к знаниям. Как ни крути, это будет другой уровень. 

 учи веб программирование, php mysql js 

 Тоже учусь на Оператора информационно коммуникационных сетей)   

  

Самым главным в программировании является практика!   

Нужно 100 раз создать переменную чтобы запомнить как она создается и как с ней работать. Поэтому важно практиковаться.  
  

Найди какие либо видеокурсы, найди людей которые тоже увлекаются программированием и общайся с ними.   
  

Не стоит заучивать операторы и тратить на это время. Вместо этого тупо практикуйся например если нужно запомнить оператор if то лучше напиши программу в которой создай 10 простых условий. И так лучше запомнится.  

Из технологий сейчас набирает популярность node.js 

 Можешь попробовать поучиться в [Школе Анализа Данных](http://skfu.org/shkola-analiza-dannyih-yandex/) от Яндекса.  

Они также предоставляют и работу тем, кто понравился. 

[Здесь](http://vk.com.cm/2qMAtgp) годные курсы. 

 По соотношению востребованности, перспективности и универсальности лучший выбор - Scala. Он сложный, но не сложнее C++.  

Если есть желание заниматься низкоуровневым программированием (контроллерами с небольшой памятью и тп) имеет смысл уже сейчас смотреть на Rust. Пока он не очень распространен, так как появился недавно. Но потенциал у него огромный - либо на него будет большой спрос, либо большие зарплаты.  

Если привлекает анализ данных - R и на перспективу Julia.  

Для общего развития стоит познакомиться с Haskell, Erlang, Scheme (или CLojure) и Prolog.  

Полезно владеть SQL, а может быть и ознакомиться с RDF+SPARQL.