Как выбрать правильный вектор развития в IT сфере?
====================================================

 Здравствуйте друзья. С места в карьер... Не дает покоя мысль - как стать хорошим программистом?   

Точнее мне не хватает плана развития. Я понимаю, что в наше время, в связи с быстрым развитием технологий (хотя уже ставится под сомнение увеличение скорости и надвигающаяся стагнация) , создать какой-то жесткий и структурированный план развития в сфере IT трудно, да и в купе еще могут добавиться человеческие факторы такие как: "Надоело", "Скучно" и т.д. Но я по настоящему хочу стать профи и что-то создавать, творить, чтобы этим пользовались. Программирование как творчество - самореализация. Я уже задавал вопрос про NIH синдром, получил хорошие ответы и уже с первых коммитов начал разбирать Vue. Но вот сами вопросы, которые я разделю на две части:   

 Часть 1 (сам процесс разработки):  

1. Как можно стать профи, если постоянно используешь готовые библиотеки и не пишешь "велосипеды"?  

2. Стоит ли иногда писать велосипеды или это бессмысленно?  

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

4. Ваше личное мнение по поводу full-stack разработчика. Мне очень нравится full-stack, в идеале я бы хотел быть таким разрабом, который не специализируется на чем-то конкретном... А например, быстро читает любой код, входит в курс дела на том или ином языке, знает особенности и дает советы другим. Быстро правит и делает. Ну вообщем как Группа быстрого реагирования:). Стоит ли развиваться в таком направлении, нужны ли такие люди например вам в команду или все же лучше специализация.  

Часть 2 (план):  

Готов и открыт изучать все. Начинать хочу с математики и английского языка, чтобы читать документации. Обожаю разделы на php.net пособие хакера, нравится лезть и разбираться в "кишках" каких нибудь больших систем.  

Поэтому посоветуйте какой нибудь план действий. Например: Математика (дискретка, дифуры), Английский (технический), Алгоритмы (такие такие). Вообщем задать вектор.  

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

 Отвечаю по вашим вопросам.  
  

1. Человек, которые знает все тонкости к React, будет шарить лучше чем человек, который пилил свой велосипед. Да, велосипедист будет учиться на своих ошибках, но это ошибки детские. Человек, который учит React будет видеть ошибки местами детские, местами взрослые и знание как их решить будет полезней. К тому же велосипедист при написании свое кода местами будет бороться с языком/машиной, что к его профессионализму никак не скажется и как правило еще раз, это детские ошибки.  

2. Только в целях самообучения и стартапы. На обычный продакшн даже не смей.   

3. Если ваш начальник такой умный, то пусть мне даст готовое решение по синтезу речи на питоне к примеру. Что есть, но оно топорное? Или к примеру пусть кинет ссылку на игру где можно изменять ДНК, где есть караваны, космодесанты... да что же такое, опять нет? Ну ладно, даю последний шанс - операционная система такая же популярная как Windows, но без навязчивых обновлений и жрущая в 3 раза меньше ресурсов умещая в Adobe Premire.... оу, кто-то сдал позиции.   
  

Короче писать еще и писать программы. Дело не в том насколько революционная программа, люди тысячи программ пишут про одно и тоже. Все они отличаются тем, что каждая по своему удобна, быстра и дешева.   
  

Кстати, хотите революционного? Напишите язык, который также удобен к примеру как питон, который может во все платформы и быстр как C. Вперёд!  

4. Только если вы в стартапах хотите работать. Фулстек это как ортопед, и не смотря на то, что ортопед знает много, в основном это понос и ОРВИ. В вашем случае это CRUD и шаблоны будут. Ну такое короче.   
  

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

 Не считаю себя хорошим программистом и профи, пока в процессе. Могу поделиться своим ИМХО.  
  

Часть 1  

1. Готовое использовать тоже надо уметь и знать, где это готовое найти, которое помочь может, какое готовое хорошо, а какое будет лишним.  

2. П.1 не исключает возможности писать велосипед. Писать велосипеды полезно для себя, чтобы глубже разобраться в работе готового, в процессе подглядеть на готовый код, подумать как написал бы сам. Мб писать узкоспециализированные велосипеды, которые подойдут именно вашей задаче лучше, чем готовые, но универсальные решения.  

3. Я работаю full-stack. У нас все такие, ибо народу не так уж много. Периодически устаю от этого, но периодически не представляю себя без возможности писать и на фронте, и на беке. Если вам по душе решать задачу от начала и до конца, то почему нет? Главное, чтобы в кайф. Возможно стоит в таком случае развиваться периодами - выделяем период и изучаем это направление, потом переключаемся на другое. А возможно надо отталкиваться от конкретной задачи и в её рамках изучать как решить её на клиенте, а как на сервере. Чтобы переключаться и читать любой код, надо обладать широким кругозором и знать базовые концепции, Computer Science, паттерны, парадигмы и т.п. Чтобы делать это быстро, нужен опыт. Когда однажды решал что-то подобное, то второй раз решить это будет проще и быстрее. Ещё полезно держать руку на пульсе и слушать, что сейчас в IT вообще твориться, чтобы знать куда копать, если возникнет необходимость - я покрываю это подкастами и статейками из всяких еженедельных рассылок.  
  

Часть 2  

1. Английский каждый день, хоть 10 минут, но каждый день. Читать, смотреть, слушать. В идеале ещё и говорить.  

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

3. Алгоритмы и структуры данных - да. Какие-нибудь классические книжки по этому делу. Кормен, например. Но вот тут, имхо, нужно писать велосипеды! Изучаете алгоритм или структуру данных, описание на естественном языке, а потом берёте ваш любимый ЯП и реализуете этот алгоритм по описанию сами. Затем ищите в интернете его "эталонную" реализацию, сравниваете с вашим велосипедом. Как книжку пройдёте, то мб захочется углубиться в какую-нибудь сферу Computer Science. Ещё есть Open Source Univercity - <https://github.com/ossu/computer-science> - это сборник лучших бесплатных материалов по CS в сети, как бы онлайн-образование в сфере CS. Сам не проходил, но в планах туда заглянуть есть)  

4. Паттерны, как и п.3  

5. Изучите пару ЯП с парадигмой, отличной от привычной вам.  

6. Если вы в web, то надо познать как работают сети.  

7. В идеале познать ОС, в общих чертах как устроена, как работает. Команды оболочки, поадминить какие-нибудь сервисы в мини-сети из виртуалок, пожить немного чисто в консоли.  

8. Принять участие в Open Source. Вы же пользуетесь готовыми штуками. Возьмите небольшую такую штуку, посмотрите как она устроена внутри, сходите на её гитхаб, посмотрите issue, мб там нужна ваша помощь. Часто есть issue, отмеченные для новичков. Тут одни плюсы - разберётесь в готовой штуке, сделаете её лучше для себя и для других, получите гордое звание контрибьютора).  

9. Не слушать таких людей, как ваш начальник - это у него не получится, а вы на себе крест не ставьте, вам до пенсии ещё кодить и кодить.  

10. Ну и писать код, больше кода богу кода. 

 1. Со временем.  

2. В зависимости от отношения цель / время + ресурсы.   

3. На заборах тоже пишут много всякого.  

4. Маркетинговый булшит.  
  

Задаю вектор: начните решать реальные задачи. Свои, чужие. Не важно. 

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

1) Мне нравится писать на Python, но я пишу на Java - почему? За Java мне платят в 2 раза больше, чем за Python.  

2) Мой друг из банковской сферы шутит, что программист на Java должен быть среднего качества, чтобы его код работал, но при этом он был отварительного качества, чтобы никто не мог в нем разобраться кроме него. Это прямой рычаг на повышение зп и улучшения условий работы.  

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

[Карта развития веб-разработчика](https://github.com/zualex/devmap)  
[Coding Interview University](https://github.com/jwasham/coding-interview-university)  
  

По поводу велосипедов: [build-your-own-x](https://github.com/danistefanovic/build-your-own-x)  

Попробуй написать свою БД, веб сервер или поисковый движок.  
  

Давай действуй, я в тебя верю! 

> Но я по настоящему хочу стать профи и что-то создавать, творить, чтобы этим пользовались.

  
  

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

А творить что-то, чтобы этим пользовались - это скорее к стартапам, к бизнесу, к рекламе.  
  

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

 1. А что, создание приложения заключается только в использовании библиотек? Прям мечта всех «войтивайтишников» — поставил десяток пакетов и проект готов! Лепота! Так не бывает.  
  

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

3. 
> Однажды в молодости Макс Планк пришёл к 70-летнему профессору Жолли и сказал ему, что решил заниматься теоретической физикой.   
> 
> — Молодой человек, — ответил маститый учёный, — зачем вы хотите испортить себе жизнь, ведь теоретическая физика уже в основном закончена... Стоит ли браться за такое бесперспективное дело?!

Надеюсь, вы знаете, кто такой Макс Планк и что он сделал для физики?  
  

4. Моё личное мнение — узкая специализация с возможностью, ЕСЛИ ОЧЕНЬ НАДО, фуллстэчить. Я PHP-бэкэндер, но могу кодить на современном JS и верстать, хоть и не люблю. Только в экстренный ситуациях.  
  

Из вашего пространного монолога не понятно самое главное — чем вы занимаетесь сейчас и какой уровень знаний? 

 1. Писать велосипеды.  

2. Стоит, правда в большинстве случаев это будет бессмысленно.  

3. Неправда.  

4. Все мы немного фулстеки по жизни: и кран починить, и дерево посадить. Но специализация должна быть у каждого. Лично я убеждаюсь в том, что продуктивность теряется, когда ты пишешь как фулстек; при этом знать, что же происходит по ту сторону медали ты тоже должен(в идеале). Можно, условно, попробовать полгода фронт, полгода бек, договорившись с командой. А там и дальше сам выводы сделаешь. 

 Читайте книги и программируйте много и везде 

> 2. Стоит ли иногда писать велосипеды или это бессмысленно?  
> 

  

если Вам нужен только функционал, который есть в готовых изделиях, а остальное в них же не нужно, тогда ИНОГДА имеет смысл делать нечто свое.  

> 4. Ваше личное мнение по поводу full-stack разработчика. 

  

Эта ступень как раз хороша чтобы эволюционировать в архитекта и тех.лида, чтобы понимать не только свой участок(напрмер только ларавелю или только питон), но весь процесс и всю структуру разработки проекта. Чтобы тебе, ларавельщику, не вешали лапшу про бутстрап, чтобы ты мог понимать норм ли написан фронт на гридах, и т.п.  

> Стоит ли развиваться в таком направлении, нужны ли такие люди например вам в команду или все же лучше специализация.  
> 

  

да, нужны 

 Сам сейчас мучаюсь подобным вопросом и изучаю [английский](http://audiolang.info/audio-slovar-anglijskogo-yazyka/). 

 1. Только так. Человек который пишет велосипеды - не профессионал!  

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

Любитель сделает лучше, но профессионал сделает как надо!  

2.С точки зрения профессионализма - бессмысленно. А стоит или нет решать вам.  

3.В общем то чушь он сказал. Но если вы хотите стать профессионалом - все именно так.  

4.Ну разработчик и разработчик что особенного? Чем глубже специализация, тем лучше знаешь конкретный предмет, и тем больший профан в других областях и наоборот. Все имеет свои плюсы и минусы. Вам выбирать. 

> 1. Как можно стать профи, если постоянно используешь готовые библиотеки и не пишешь "велосипеды"?  
> 
> 2. Стоит ли иногда писать велосипеды или это бессмысленно?  
> 
> 3. Мой начальник сказал, что все уже написано и что то крутое создать не получится (я расскис после этих слов и не нашел аргументов), как вы считаете все ли написано? Будут ли скачки в программировании?

  

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

А начальника не слушайте. Есть такие... сидят в болоте годами, и считают, что так и надо.  
  

P.S. На тему велосипедов рекомендую этот курс от Дмитрия Елисеева:  

<https://www.youtube.com/watch?v=w4iqxN0nfTs>  

Там же, в самом начале, автор рассказывает зачем оно надо.