«Правда в том, что существует лишь одна Сила. Она выше таких мелких понятий, как хорошо и плохо, чёрное и белое, добро и зло».— Дарт Сидиус
Вы знаете, чтобы стать полноценным разработчиком, мало знать просто один язык программирования и пару двухэтажных SQL-запросов. В мире full stack developer — это машина, которая понимает все процессы от а до я, человек с сильными фундаментальными знаниями.
Как умиляет этот вечный холивар Java vs C#: «Вы украли у нас это! — А вы — это!..». «PHP — отстой, JavaScript развивается, да всё самое крутое пишут на С++...» Пожалуйста, просто перестаньте сотрясать воздух своим невежеством и упрямством.
Зарубите себе на носу, что для инженера высочайшего класса язык программирования — это всего лишь один из множеств инструментов, каждый из которых в чем-то лучше, в чем-то хуже. Зачем подымать тяжеловесный Java для обычного чатика, который можно за два дня написать на NodeJS? Зачем плодить громадный maven DAO модуль c Spring JPA, если хватит двух-трех SQL-запросов c использованием чистого JDBC? К примеру, Parser Combinators в Scala станет для вас находкой, после которой вы будете стараться использовать ее везде, где только можно. Нет идеального языка, идеальной технологии, из-за которой вы с пеной у рта должны доказывать, что именно вы лучше, чем остальные. Расширяйте свой кругозор настолько, насколько можете.
Прежде чем пройтись по языкам, давайте окунемся в фундаментальные знания. Без них — как без рук. Вопрос не в том, можете ли вы оставаться Java-разработчиком без знаний криптографии, работы тех или иных сетей и алгоритмов. Вопрос в другом: насколько быстро вы упретесь в свой карьерный потолок?
Эта статья косвенно уже не конкретно для junior/middle Java разработчика, а для тех, кто хочет шагнуть дальше, по ту сторону Силы :). Поехали?
Computer Science
Intro
Наверное, «Код. Тайный язык информатики» считается самой первой тропинкой, от которой вьется путь в мир Computer Science:
Чарльз Петцольд окунет вас в историю создания телеграфа, объяснит, что такое биты и байты и какова роль царицы Информатики во всем этом. Очень увлекательная книга.
После книги можно смело отправляться на курсы «Introduction to Computer Science».
Первый — это курс от Udacity — «Intro to Computer Science. Build a Search Engine & A Social Network»:
Хороший вводный курс, заодно познакомитесь немного с Python.
Как вариант, можно выделить еще Coursera — «Computer Science 101 by Stanford».
Оба курса вы можете пройти в любое время. Есть, кстати, что то похожее от Edx платмормы Harwardи от МIT.
Algorithms
После того, как прошли азы, можно смело браться за изучение алгоритмов.
Да-да, самым популярным курсом на Coursera считается «Алгоритмы» от Седжвика и Уэйна, которые проходят каждый год:
Вам невероятно повезло, потому что обе части стартуют уже вот-вот скоро: первая с 4 сентября по 23 октября, и вторая с 30 октября по 18 декабря.
Из книг можно выделить того же Седжвика «Алгоритмы на Java»:
Седжвик уже в своих курсах отсылает к этой книге как к ресурсу с более глубоким подходом, но, в принципе, большая часть покрыта программой Coursera.
Вторая по популярности книга в этом направлении — это Лафоре «Структуры данных и алгоритмы»:
Как видите, в обоих книгах для джавистов шикарный бонус: все примеры книг написаны на Java.
Тем, кто видит себя в будущем в Google, Amazon и т.д., следует обратить внимание на данные англоязычные книги.
Thomas Cormen. Introduction to Algorithms, 3rd Edition:
Steven Skienna. The Algorithm Design:
Конечно, не достаточно тупо прочитать это — относитесь серьезно к задачам в учебниках, а также обратите внимание на такие ресурсы, как TopCoder и CodeForces. Это замечательные площадки, чтобы попрактиковаться на реальных задачках.
Advanced
После алгоритмов можно углубиться в изучение операционных систем. Как-то сам Google рекомендовал этот курс: UC Berkeley Computer Science 162. К сожалению, это только лекции на youtube, но даже так — уже хорошо.
По криптографии можно послушать курс от Stanford — «Cryptography»:
Практически то же самое есть и у Udacity:
Самым популярным курсом по компиляторам уже долгое время является Стэнфордский курс на Coursera:
А из книг самая авторитетная работа в этой области принадлежит Alfred Aho «Compilers. Principles, Techniques & Tools».
По TCP/IP самой рекомендуемой книгой является трехтомник от Kevin Fall «TCP/IP Illustrated». Вот, к примеру, первый том:
Такие темы, как фундаментальные знания по компьютерным сетям, архитектуре компьютера, распределенным системам и т.д. очень хорошо раскрыты в легендарных трудах классиков в этой области. Поэтому не проходите мимо серии книг «Классика Computer Science»:
Билл Гейтс: «Если вы считаете себя действительно хорошим программистом, прочитайте „Искусство программирования“. Если вы сможете прочесть весь этот труд, то вам определённо следует отправить мне резюме».
Конечно, есть еще Дональд Кнут, но почему-то я не нашел ни одного нашего человека, который бы отправил резюме Билу Гейтсу :). Скорее всего, участь Кнута лежит в плоскости справочника. После алгоритма Евклида идет такая математика, которую нужно вспоминать/учить отдельно. Но это, как говорится, только мое сугубо личное мнение.
Также можно обратить внимание на интересные лекции от Yandexв рамках Школы анализа данных и на Computer Scienceв рамках образовательного проекта «Лекториум».
Languages
Все языки не перечислишь, попробую осветить максимально близкие по духу и практике к Java. Буду описывать только самые вводные и популярные книги, чтобы вы сами уже решали, как вам двигаться дальше.
Scala
Конечно, самым популярным языком после Java для джавистов является Scala. Вкусная, модная, совершенно нечитабельная, но безумно интересная!
Перед «Programming In Scala» я бы лучше попрактиковался на Хорстманне. «Scala для нетерпеливых»:
Установите Scala, запускайте REPL — и вперед, пример за примером вместе с Хорстманом.
После можно окунуться в официальный труд от самого Мартина Одерски — «Programming In Scala» (когда уже выйдет
Можно еще обратить внимание на «Manning: Scala in Depth»:
Из онлайн-курсов есть Odersky на Coursera: «Принципы функционального программирования в Scala».
У Ивана Головача есть классный курс по Scala для джавистовна Udemy. Не поскупитесь и обязательно купите его: более 170 видеоуроков, да еще и на русском языке.
C/C++
По С есть замечательная книга от Brian Kernigan «The C Programming Language»:
По С++ для старта можно обратить внимание на «Программирование. Принципы и практика использования С++» от создателя языка Бьярне Страуструп:
C#/.NET
Исходя ответов моих знакомых эти две книги являются одними из самых значимых.
«Pro C# and .NET 4.5 Framework» by Andrew Troelsen:
«CLR via C#» by Jeffrey Richter:
Python
Здесь бесспорно, Марк Лутц «Изучаем Python» является одной из самых-самых:
На Codecademy есть хороший курс по Python.
Javascript
По поводу JavaScript подборка оказалась очень похожа с подборкой DOU, так что я нарочно упускаю этот момент. Также обратите внимание на классные интерактивные курсы от codeschool.com.
В принципе, каждый из языков можно подтянуть на таких ресурсах, как Project Euler, где вы можете использовать прелести языка на конкретных задачах.
Заключение
Мне пришлось опросить многих авторитетных и уважаемых мною людей, чтобы подготовить эту подборку, но я буду очень признателен, если вы поделитесь ресурсами, которые считаете значимыми. Помните, это всего лишь подборка. Вы, и только вы решаете, где вам развиваться, — это просто личный взгляд со стороны.
В следующий понедельник выйдет последняя статья, которая будет посвящена куда более приземленным вещам — мотивации, межличностным отношениям и профессиональному росту.
Спасибо за внимание.
Предыдущие части цикла:
— Пособие для будущего Java разработчика. Основы Java;
— Пособие для будущего Java разработчика. Элегантный код;
— Пособие для будущего Java разработчика. Enterprise — часть 1;
— Пособие для будущего Java разработчика. Enterprise — часть 2;
— Пособие для будущего Java разработчика. Enterprise — часть 3.