Изучайте язык, создавая что-то полезное

Каждый разработчик программного обеспечения знает Hello, World! — программу для первого знакомства с новым языком программирования. А может быть, вы встречали 99 бутылок пива? Но если ваша цель — просто выучить язык и у вас нет конкретного проекта, над которым вы работаете, что вы делаете дальше?

Вы можете следовать руководству и создать несколько API для зоомагазина (любимый для Java и Swagger), но если вы не находитесь в центре диаграммы Венна владельца зоомагазина и разработчика программного обеспечения, это может показаться немного безрезультатно.

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

Я говорю о Одноразовых паролях на основе времени. Если вам это ничего не говорит, подумайте о Google Authenticator, Authy, LastPass Authenticator и многих других. Всякий раз, когда вас просят настроить двухфакторную аутентификацию в учетной записи в Интернете, вы обычно можете использовать любое из этих приложений, и все они работают, потому что все они основаны на одном и том же стандартном алгоритме. Это означает, что вы можете создать собственное приложение и использовать его для двухфакторного доступа к GitHub, Amazon, LinkedIn, Evernote и т. д.

Сам алгоритм описан в RFC 6238, опубликованном Internet Engineering Task Force: https://datatracker.ietf.org/doc/html/rfc6238, и этот RFC включает код Java для генерации одноразовых кодов в Приложении. А.

В двух словах, вы подсчитываете, сколько 30 секунд прошло с 1 января 1970 года, хешируете это число с помощью какого-то секретного ключа (в основном это то, что находится в QR-коде, который вас просят отсканировать при настройке учетной записи 2FA), берете некоторые из байты из полученного хэша, а затем превратить эти байты в число — это число является вашим одноразовым паролем для входа в систему. Каждые 30 секунд количество прошедших 30 секунд увеличивается на 1, значение хэша изменяется, байты измениться, и окончательное число изменится. Есть некоторые дополнения, преобразования между шестнадцатеричными, байтовыми и целыми числами, а также несколько побитовых операторов, чтобы закончить это, но в целом это довольно маленькая автономная функция с детерминированным результатом. Если вы не уверены, что получили правильный вывод, запустите Google Authenticator и проверьте соответствие.

Это может быть менее 50 строк в Kotlin, где вы узнали о функциях, переменных, параметрах, немного криптографии, датах, массивах байтов, побитовых операторах, математических операторах и обработке исключений. Кроме того, для этого алгоритма существуют библиотеки с открытым исходным кодом, так что это может дать вам возможность понять систему управления зависимостями и сборки языка.

Оттуда у вас есть базовая реализация, и вы можете подумать о том, как вы хотите ее использовать, вы можете добавить несколько строк и сделать ее инструментом командной строки:

REST API (Spring Boot, Serverless Lambda, развернутый в облаке…):

Приложение для смартфона или часов (нативное для iOS/Android, React, Flutter…):

Когда этот код выдает точное значение и вы входите с ним в GitHub в первый раз, это, безусловно, вас удовлетворяет.

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

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