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

 Взываю к тебе, хабражитель.  

  

Я давно занимаюсь программированием, в области web`а (сайты). Образование получал давно и никак не связанное с IT или программированием. Знаю несколько языков(php, python), работал как с мелочью, так и более менее крупными проектами.  

  

Но наступает тот момент, когда понимаешь, что просто выбрать язык и изучить его. Или почитать интересные статьи в интернете. Это не до конца то. Очень сильно не хватает базовых знание, которые думаю преподают в ВУЗах по специальности (матанализ, теория чисел, алгоритмы etc). Ничего этого естественно в голове нету. Изучить очень хочу. Но что изучать не знаю?   

  

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

Варианты поступить(очка, заочка, удалёнка), прослушать лекции — не хочу рассматривать. Так как прочитаю и попробую на практике я быстрее, чем буду посещать несколько лет лекции.  

Пробовал гуглить, чтобы почитать. Но или информации нету или она сильно размыта, по части того что же именно преподают по специальности и что стоит изучать.  

  

Всем откликнувшимся, заранее спасибо.  

  

*P.S. Если будет предложено несколько вариантов, то расположите пожалуйста в хронологическом порядке важности изучения. Ну или что сначала необходимо изучить, чтобы понимать следующее из списка.*  

  

**UPD: Варианты «прочитать учебник по языку, на котором пишешь», не нужны. Это очевидно и актуально в самом начале пути. Я уже прочитал их не мало и работаю программистом несколько лет. Интересует именно то, что на прямую не связано с моими языками, но связанно с программированием в целом.** 

 Онлайн-курсы чем не угодили? Там и теория, и практика и с кровати вставать не надо.  

  

Если говорить предметно, то:  

1. Алгоритмы. Must have для программиста. Тут можно посоветовать известную книгу Кормена и Ко «Алгоритмы: Построение и анализ». Практиковаться можно на известных архивах вроде [тимуса](http://acm.timus.ru/) или площадках вроде [codeforces](http://codeforces.ru/).  

2. Дискретная математика. Тоже важная область. Сюда можно приписать теорию графов, логику, комбинаторику, основы теории вероятностей. Сильно пересекается с предыдущим пунктом.  

  

3. Что касается матана и теории чисел: особо углубляться без нужды не советую. Из матана хватит дифференциально-интегрального исчисления (с базой в виде пределов, конечно же). Обязательно линейную алгебру: матрицы, вектора, определители. Это следует изучать вместе с аналитической геометрией. Каких-то книг я, к сожалению, порекомендовать не могу.  

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

  

Ну и что-нибудь про проектирование, ООП и паттерны. По паттернам библией считается книга банды четырёх, по ООП вроде прилична книга Гради Буча «Объектно-ориентированный анализ и проектирование». Но я не читал её. 

 Немного не в тему, но может быть очень полезно:  

1) Проверить свою память и ее детальность  

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

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

Тут может быть полезна книга Уильяма Аткинсона "Наука самосовершенствования и влияния на других" - немного устаревшая но нужная, как 101 курс можно взять ее сокращение от Эксмо Москва 2012 (то же название, но приписка на 7 стр. "Под редакцией д-ра Артура Пелла")  
  

2) Умение концентрации, сосредоточенности и воли  

Думаю понятно для чего, но для наглядности объясню. Все слышали про Юрия Долгорукого который умел делать одновременно несколько дел, но к счастью люди обычно обладают такой управляемой шизофренией. Сколько-бы процентов мозга мы не использовали, это не имеет значения до тех пор пока био, нейро науки не научатся увеличивать это количество без последствий. Поэтому можно считать "выносливость" и "силу" мозга конечной и медленно восполняемой -> очень важно, как мы их используем, это дает понимание, что отвлечение на посторонние вещи (например музыку во время работы (не для музыкантов)) может сильно сказаться на качестве конечного продукта мысли.  

Как раз тут и нужны:   

концентрация - для продуктивности, мобилизации сил  

сосредоточенность - чтобы не отвлекаться и не распылят собственные силы  

воля - чтобы отсекать неуместное в данный момент, но вероятно ценное для нас в общем. Тут то и пригодится память, чтобы потом восстановить идею  

3) Информация и ее устройство  

Очень важно концептуальное понимание, а не прямое заучивание... зазубривание  

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

Мастерство  

В общем чтобы стать по настоящему Мастером своего дела нужно наложить на себя ограничения, не в плане что если хочешь стать программистом, то не качаться на качелях, а ограничение области работы (многие наверно помнят на начале бума фрилансеров, они хватались за все что угодно и в итоге мало к чему приходили), также в смежных областях не позорно оставаться Учеником или Подмастерьем.  
  

Еще стоит посмотреть "Athene's theory of EVERYTHING" 2011 для общей картины, стоит заметить что русский перевод в некоторых частях слишком волен и обобщен, замена некоторых фразеологизмов может сильно поменять на восприятие фильма в целом. Этот фильм может дать небольшое представление о современной научной мысли о работе мозга. Сам я этот фильм смотрел в течении трех суток, по частям, для лучшего понимания и осмысливания.   
  

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

PPS Пока писал об этом подумал может стоит написать подробнее и оформить в виде статьи для Хабра? Если бы вы хотели бы прочитать об этом, то пожалуйста задайте пару вопросов и пожеланий в ЛС, что хотели бы увидеть и о чем прочитать. 

 Может немного не по теме и абстрактно. Но наболевшее. Очень советую параллельно с любой областью изучать ее оптимизации.   

Просто многие не задумываются об этом, пишут вещи которые могут быть намного эффективнее.   

Привыкают что ресурсы не ограниченны и всегда можно их масштабировать.  

  

Что касается веба (но применима к любому языку, да и не только)  

Изучили php — посмотрите как оптимизировать. Как закэшировать и тд  

Изучили MySQL — изучите оптимизацию запросов.  

Изучили JS — найдите как более рационально его применить.  

Оптимизируйте сервера, в общем все что только можно.  

  

Извиняюсь за излишнюю эмоциональность. Просто наболело и надоело видеть кучу тормозного кода.   

Начиная от сайтов заканчивая приложениями. 

 Нужно изучать то, что требуется. Если задались таким вопросом, значит почувствовали, что вот тут что-то делаете не так. Возьмите и загуглите "<язык программирования> как сделать <вещь>". Но при этом не забывайте изучать более полно, а не ограничиваться одной статьей и рваться в бой. Прочитали про технологию, прочитайте еще пару статей. Постарайтесь понять какие минусы и недостатки, как и где эта технология применяется. Как оптимизировать ее. Это и есть база. Плюс этого способа в том, что не требует сразу тратить много времени. По сути, вы будете делать тоже самое, что и сейчас, но более полно, более основательно подходить к изучению. Со временем накопиться тот самый бэкграунд.  

  

А всякий матанализ скорее всего и не пригодится. Дискретка еще возможно, но тоже редко. Согласитесь, 80% кодинга — рутина :) Если вы не используете этого в работе, то они вам не помогут, а когда столкнетеся с реальной задачей, то, наверняка, сами захотите ее загуглить.   

  

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

  

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

По алгоритмам — читайте то, что используете. Например, в вебе нужны сортировки, редко что-то сложнее. Поэтому погуглите алгоритмы сортировки.  

Изучать то, что вы не используете полезно, но скучно и быстро забывается.  

Прочитайте про паттерны, хотя инфа о них, как правило, трудно воспринимается, кроме тех, что используете реально. Например, active record для работы с базой. Последнее и будет полезным.  

Для улучшения практического скилла советую читать чужой код и смотреть скринкасты опытных людей. Такие вещи часто богаты мелкими-оптимизациями. А если автор еще и озвучивает ход своих мыслей при проектировании функционала, вообще замечательно. (Именно этим полезны курсы по питону на udacity, например.)  

  

p.s^ Старайтесь знать все о чем-то и что-то о всем :)  

p.s.s^ длинновато вышло :( 

 Я бы предложил почитать разные вариации на тему «Алгоритмы и структуры данных».  

А потом найти интересные задачи/реализации на известных вам ЯП и посмотреть как они реализованы.  

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

 Мне кажется, веб-программист в первую очередь должен быть программистом. Потому рекомендую [Алгоритмы и структуры данных](http://www.ozon.ru/context/detail/id/128290/) Н. Вирта (это азбука и второй курс, но весьма полезная).  

  

Обязательно рассмотрите древовидные структуры и алгоритмы на графах. Когда был школьником, мне взорвала мозг (в хорошем смысле) [книга](http://rutracker.org/forum/viewtopic.php?t=1277082) Кубенского.  

  

Почитайте (погуглите) про генетические алгоритмы.   

  

Еще есть классная книга по анализу программистских задач (и нетривиальных решениях) — [Жемчужины программирования](http://www.ozon.ru/context/detail/id/1039964/) Дж. Бентли  

  

Ну и в остальном — начните с того, что вы знаете о своем языке (инструменте, библиотеке, фреймворке и т.п.). Вы пользуетесь ассоциативными массивами? А знаете, как они устроены? Как происходит доступ по ключу? Насколько трудоемкая это задача?  

  

Пользуетесь TreeMap? В javadoc к нему упоминается красно-черные деревья. А что это?  

Как выполняется программа на моем языке? Мне нужно встроить в свое приложение язык отчетов, похожий на SQL, как мне это сделать?  

  

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

 Значение математики для программиста преувеличивают.  

Конечно, если Вы работаете в сфере, где кругом много математики (трехмерная графика, анализ данных), то знание математики желательно. Но не критично. Вряд ли Вы самостоятельно будете создавать библиотеки, скорее всего Вы будете их использовать.  

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

Но ведь это только в узких сферах.   
  

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

 Советую данный курс: [www.edx.org/course/uc-berkeley/cs169-1x/software-service/253](https://www.edx.org/course/uc-berkeley/cs169-1x/software-service/253) (если регистрация закрыта — качать можно в другом месте, однако вы получите только лекции, без проверки домашних заданий и тестов)  

Он охватывает множество областей.  

И не важно, что программировать вы можете на другом языке. 

 Базы данных. Принципы работы и, как указал предыдущий оратор, оптимизации.  

Книжки советуют, сам не читал (хотя как минимум вторую стоило бы):  

Мартин Фаулер, «Шаблоны корпоративных приложений»;  

Cтив Макконнелл, «Совершенный код»;  

Джеф Раскин, «Интерфейс: новые направления в проектировании компьютерных систем».  

  

Advanced-level книжки по используемому языку.  

  

В плане профессионального роста удобно работать с людьми, старше-умнее-опытнее тебя.  

  

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

*Это комментарий на обсуждение выше — ошибся веткой.*  

  

> > Изучать то, что вы не используете полезно, но скучно и быстро забывается.  
> 
>   
> 
> Смотря как подходить к вопросу изучения. Если на «меня заставили» или «мне это не пригодиться», тогда да. А если понимание, что это моя работа, мой хлеб, моё хобби и от этого я буду писать более лучший код? :)

  

  

1) Если это работа, хлеб и хобби, то тогда это не «то, что вы не используете». Для этого случая я написал выше — более основательно подходить к изучению.  

  

2) Судя по вашим ответам, вы сами не знаете чего хотите. Это не дерзость, а просто факт. Все что связано с вебом, но не связано с «питон, вёрстка, базы данных, высоко нагруженные сайты, не стандартная логика» — это другие сферы жизни. Похоже, вам просто нужно хорошее интеллектуальное хобби, отличное от работы. Я прав? 

 Я много распинался по этому вопросу. Посмотрите, к примеру, [раз](http://eax.me/beginning-programming/) и [два](http://eax.me/books-issue-1/). 

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

 Не ответ, но комментарий в поддержку: по-моему миру очень нехватает книги типа «теоретическая информатика (computer science) и профессиональное программирование (консервативные и agile методологии, организация процесса совместной разработки, управление версиями, юнит-тестирование, и т.п.) для ~~чайников~~ самоучек». Я, вот, тоже 20 лет за компом, но всё сам. В результате так или иначе знаю целый ряд языков, паттернов, «секу тему» на практике (но только в одиночку), но не могу решить ни одну элементарную задачку на алгоритмы (в лучшем случае своё что-то выдумаю) и не представляю как можно работать над программой если она не умещается вся у тебя в голове (хотя с архитектурой и паттернами у меня всё в порядке).