Советы преподавателя, как войти в Java в 2021 году
Этот пост для тебя, если на следующие вопросы ты отвечаешь “Да”, или “Ну да!”:
- Ты студент.
- Основная специальность в вузе = ИТ, “программная инженерия”, “компьютерная инженерия” или подобное.
- Вообще нравится программирование.
- Раздумываешь, а может войти-в-айти?.
- Что-то слышал о программировании от знакомого/соседа/сотрудника, не против ознакомиться.
- Уже ознакомился, но хочешь более плотно.
“Иногда утомляет, как в наше время люди ведут себя. Иные рассказывают, что можно “писать код, не зная языки программирования”, ну или почти не зная, в конструкторе. Мы, преподававшие языки программирования 5-6-7 лет, смотрим известно как на людей, приходящих к нам на лекции и спрашивающих “А что мне учить?”, а ведь таких много.
Им я обычно отвечаю, “Начните с какого-то языка программирования, и выучите его до состояния ХОРОШО”.
Когда-то я не знал, что такой совет очень плохо влияет на студентов, особенно на тех кто “в непонятке” насчет своей дальнейшей карьеры, неясно понимающих, что им предстоит.
Студенты засыпают вопросами, всегда субъективными, и часто, хм, личными. В целом, выбор карьеры в ИТ (и выбор языка конечно) – есть вопрос инициативности, решительности, дальновидности, и все эти качества, как я заметил, в большом дефиците у нынешней молодежи. Выслушав мои ответы, студенты далее спрашивают:
- Какой язык программирования лучше всех?
- Слышал, что язык Х лучше, чем язык Y, а вот почему?
- С чего начать?
- Что нужно, чтобы приняли на первую работу?
- Посмотрел на Ютубе ролики вот этого Java-инфлюэнсера, достаточно?
- Видел хороший платный курс Java, подаваться?
Вообще, если у студента иногда возникают такие вопросы, то это вообще нормально, у меня они тоже возникали в свое время, когда я делал первые шаги в ИТ.
По моему опыту, если надо учить Java в 2021 году, то этот процесс – от “начинающего” до “ого, я опытный разработчик” будет состоять из 4 этапов “постижения Java”.
Перед тем как описать их, хочу отметить, что найдутся люди, которые придут в коменты и начнут писать, “Ой, зачем усложняешь дорогой, делай то, делай это, посмотри этот ютуб, запишись вот на тот курс”, но не обращайте внимания. Освоение языка программирования – больше всего похоже на изучение человеческого языка. Твой мозг должен забыть часть прошлого опыта (или по крайней мере временно игнорировать), чтобы избавиться от “когнитивных помех”. Надо научиться мыслить в понятиях “чужого языка”. Для этого тебе понадобятся систематические усилия: твое оружие – усидчивость и трудолюбие. Если бы все было так просто, как некоторые говорят, то все люди вокруг давно бы стали программистами в Google, и весь мир превратился бы в некую Утопию Программистов, свободную от проблем, багов и прочего плохого.
Итак. Каждый язык программирования “говорит компьютеру, что делать”, эти указания переводятся в ноли и единички, так что процессору все равно, на каком языке ты пишешь свои приложения или сайты. Языки создаются, чтобы быть удобными и хорошими для программистов, а не для компьютеров.
Для начала, советую штудировать вот эту книгу:
Java: A Beginner’s Guide by Herbert Schildt. Это как бы база.
Синтаксис и семантика Java
- Типы данных (8 примитивных типов Java)
- Переменные (ключевое слово var)
- Преобразование и приведение типов в Java
- Автоматическое распространение типа (Automatic Type Promotion)
- Массивы
- Операторы: арифметические, побитовые, реляционные (условные), булевы, оператор присвоения, оператор ?, таблица приоритета операторов
- Управляющие конструкции, управление ходом исполнения (операторы If, If-Else, If-Else-if, For-Each, Switch; в том числе в новых версиях Java)
- Итерация, операторы итерации (While, Do-While, For, For-Each, вложенные циклы), операторы continue/break, метки (этикетки, закладки в коде, labels)
- Аргументы командной строки в Java-программе
- Класс String
- Vararg (аргументы неизвестной длины и неизвестного количества)
- Классы Scanner и BufferedReader
Объектно-ориентированное программирование
- Программные “элементы” Java, их пять типов: Класс, Абстрактный Класс, Интерфейс, Перечисление (Enum), и начиная с прошлого года – Запись(Record)
- Объявление объектов в методах и работа с ними
- Ссылочные типы (референсные, reference) и их значения
- Методы (сигнатура метода, типы методов)
- Конструкторы
- Ключевое слово this
- Перегрузка методов
- Перегрузка конструкторов
- Объекты (ссылочных типов) как параметры методов и аргументов
- Объекты (ссылочных типов), возвращаемые из метода
- Рекурсия; стек вызовов (Call Stack), рекурсия головы и хвоста (Tail-Recursion, Head-Recursion)
- Ключевое слово static (создание
static
-членов класса) - Ключевое слово final (применительно к классу, к методу, к члену класса)
- Вложенные классы и внутренние классы
- Наследование (Super и подклассы), Иерархия в Java
- Ключевое слово super (вызов членов Super-класса из подкласса)
- Типы Иерархий в Java (Простая, Многоуровневая, Множественная, Гибридная)
- Переопределение методов
- Абстрактные классы и методы
- Интерфейсы; создание интерфейса, его имплементация, вложенные интерфейсы, члены интерфейса, методы: private/static/default
- Пакеты Java (переменная CLASSPATH, импорт пакетов)
- Обработка исключений (типы исключений, перехваченные и пропущенные исключения, блоки try-catch, try-finally, try-catch-finally, multiple catch, вложенные try, ключевые слова throw и throws, пользовательские исключения)
- Многопоточность (Java Thread Model, главный поток, создание потока, класс Thread, интерфейс Runnable, параллельное выполнение, метод sleep(), приоритеты потоков, лямбда для создания потока, как анонимный класс создает поток)
- Классы-перечисления Java
- Wrappers-классы, обертки/оболочки в Java
- Упаковка и распаковка (boxing/unboxing)
- Аннотации в Java
- Дженерики в Java (или иначе – обобщения, generics, универсальные): ограниченные типы (Bounded Type), маски (метасимволы, Wildcard-типы), ограниченные маски (Bounded Wildcards), универсальные методы (generic methods) и конструкторы, дженерики со статическими методами, обобщенные классы (generic classes) и интерфейсы, перегрузка и переопределение таких универсальных методов, стирание типов (Type Erasure), универсальные массивы
- Лямбда-выражения (функциональные интерфейсы, лямбда как аргумент, ссылки на методы)
- Stream API (типы методов, часто используемые методы в этом API)
- Работа со строками (конструкторы класса String, длина строки, операции со строками, извлечение символов из строки, сравнение строк, поиск символов, модификация строки, StringBuilder, StringBuffer)
- Классы в пакете java.lang
Структуры данных и алгоритмы:
- Java Collection Framework в Java; интерфейсы и реализация; List, Set, Deque, классы ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue, ArrayDeque, итераторы в коллекциях, класс Iterator, цикл for-each, потоки (stream), Custom Collections Classes, карты (Maps) – интерфейсы и классы, Vector, Stack, Dictionary, Hashtable, Properties
- Остальное по желанию, но желательно знать такие классы: StringTokenizer, BitSet, Optional, LocalDate, LocalTime, LocalDateTime, GregorianCalendar, TimeZone, Locale, Random, Timer, Currency, NumberFormat, StringFormat.
Если возникают проблемы
Когда получите достаточный уровень в том, что перечислено выше, можете углубиться в язык, практикуя свои навыки на сайтах, приведенных далее. Это сайты для так называемого “Competetive Programming” – решая задачи и проблемы, постигаете Java-дзен.
- TopCoder
- CodeForces
- CoderByte
- Project Euler
- HackerRank
- CodeChef
- Exercism
- CodeWars
- LeetCode
- Sphere Online Judge SPOJ
- CodingGame
В принципе, будет полезно “зависать” на любом из них, они более-менее сравнимы по уровню.
Также можем посоветовать пару толковых книжек, конкретно по “соревновательному программированию”:
- Guide to Competitive Programming Learning and Improving Algorithms Through Contests
- Java Coding Problems
- The The Complete Coding Interview Guide in Java
Необязательно точно соблюдать порядок пунктов (от азов к высотам), и если достигнут хотя бы минимальный уровень, уже можно пробовать заниматься на указанных “олимпиадных” сайтах, типа CodeWars.”
