October 20, 2020

«О языках программирования и их изучении».

Автор: Гараев Тимур,

Студент 1 курса направления "Современное программирование" факультета МКН СПбГУ.

Часть 1. Как все начиналось?

Мое знакомство с языками программирования (как и в целом с таким понятием, как "программирование") началось еще в 5-6 классе.
Тогда я попал на два очень интересных курса, организованных в моем родном городе Университетом Иннополис. Это был курс "Программирование на языке Scratch" и "Робототехника, начало".

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

Scratch:


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

Если кратко: основными компонентами скретч-программы являются объекты-спрайты. Спрайт состоит из графического представления и простейшего скрипта, составленного из цветных блоков. Спрайты можно выставлять на сцену, заставлять появляться/пропадать/двигаться в зависимости от происходящих событий.

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

Вот пример популярной игры "Арканоид"., которую я когда-то написал на Scratch.
На фотографии видно поведение, которое требуется для объекта "блок"

Робототехника.

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

Но у тех в свою очередь есть очень классное свойство — роботов нужно программировать. Мне повезло, и я каким-то чудом попал в старшую группу, где был упор как раз на то, как объяснить роботу, что ты от него хочешь, с помощью языков программирования. Насколько сейчас помню, этим языком был RobotC.
Из источника:


RobotC (EV3, NXT, RCX)
RobotC is a C-based programming language with a fully integrated software debugger that supports a range of different hardware platforms. Extensive documentation and online support is available. For more information, visit: http://www.robotc.net/.


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

Пример простой программы на RobotC, которая заставляет мотор двигаться до тех пор, пока робот не преодолеет определенную дистанцию.

А что с опытом?

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

Часть 2. Что было дальше?

Прошло время, и в моей жизни появились C++ и олимпиадное программирование. Я начал посещать занятия кружка и узнавать, что программирование не так просто, как мне казалось изначально. Необходимость начать именно с "плюсов", казалось, была очевидной 5 лет назад. Все вокруг только и твердили о том, что С++ это лучшый язык программирования, потому что он самый быстрый и, и, и... И все, получается.

Решая все новые и более интересные задачи, мне приходилось иногда отходить от С++ и пробовать себя в чем-то новом. Тут есть "длинка", стоит написать пару строчек на Python, и задача решена. А тут захотелось написать что-нибудь под Android, и Java/Kotlin уже манят меня в свои ряды. Со временем я начал понимать, что привязываться к одному языку — максимально странная затея. Это как заставить ремонтную бригаду делать ремонт у себя дома одним молотком. Но ведь пилить однозначно удобнее пилой, а закручивать шурупы — отверткой. И лишь забивать гвозди стоит молотком. Да, можно и кувалдой. Но может получиться неаккуратно, и придется все переделывать заново ^_^

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

Со временем понял, что в случае с хорошими языками нужно уметь писать код, взяв в руки документацию и просто уйдя в оффлайн. Но так я пока только учусь. Использовать этот подход в принципе мало кто может, наверное.

Часть 3. Планы на будущее.

Сейчас мне очень интересен Kotlin. На мой взгляд, он достаточно хорош как в Web, так и в Android разработке. А это, кажется, одни из самых развивающихся сфер на данный момент в программировании. Плюс у него невероятно удобный и понятный синтаксис. Возможно я так думаю после того, как 5 лет программировал на C++. Но на данный момент, это определенно один из лучших языков, с которым мне приходилось работать.

Еще недавно я узнал про Flutter. И идея такого подхода к созданию приложений тоже заинтересовала меня. Так, возможно в скором будущем и Dart появится у меня в "TODO".

Но это точно не значит, что я ограничусь именно ими. В мире столько всего еще нужно запрограммировать! Постоянно появляется что-то новое, мир IT не стоит на месте. Так что на мой взгляд главное — научиться программировать. А каким инструментом пользоваться — выбор, зависящий только от конкретной задачи, которая пришла к нам на вход.

Часть 4. Изучение языка программирования на конкретном примере.

В качестве примера возьмем язык Kotlin.

Безусловно, начинать нужно с самых основ. Как запускается программа, что такое аргументы запуска, как можно работать с потоками ввода-вывода. Это, все-таки, наш элемент общения с программой. Очень сложно продолжать без этих навыков.


Потом, разумеется, рассказать про условия, циклы, переменные. Очень важно сосредоточить внимание на том, каких типов бывают переменные.
Ведь только на первый взгляд кажется, что: "Да в этих языках все одинаково, зачем нам это нужно".

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

Помню, когда я преподавал у себя в лицее, ко мне подходил парень, и после каждой задачки спрашивал: "А эта задачка на if'ы? а эта на массивы, да? А бинарный поиск будет только в одной задаче, правда? А почему мы проходили циклы давно, а задачи до сих пор используют их?". Наверное, мне стоило больших трудов каждый раз рассказывать ему, что задача это про: "соединить все свои знания так, чтобы получить решение". А возможно, я просто плохо преподаю ;)

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

1) Например, курс (не сильно важно онлайн/оффлайн), через который проходит один/несколько маленьких проектов. Разумеется, очень важно, чтобы проекты максимально точно проверяли навыки, полученные на курсе. Невероятно важен факт наличия Code-review. Мало научиться писать код, так любой умеет. Главный критерий успеха — чтобы написнный человеком код в будущем был красивым, читаемым, и главное, рабочим.

2) Я бы называл этот способ чуточку более "хардкорным". Но обычно люди, которые способны изучить язык таким образом — гении. Берем официальную документацию языка, придумываем себе задачу (ну или берем готовую), и идем себе программировать в подвал. Иногда выходим в свет, чтобы покушать и пообсуждать что-нибудь с такими же энтузиастами как мы. Обычно, так работает с новыми языками.

Часть 5. Что тут может не понравиться?

Не нравиться может многое. Я могу лишь разобрать один из примеров.
Например, Python:

1) Скорость интерпретации. Как известно, перед выполнением операций с любым объектом интерпретатор Python проверяет его тип. Решение: сделать строгие типы и поменять способ их хранения (насколько я знаю, в сравнении со стеком, куча работает медленнее, поскольку переменные разбросаны по памяти, а не сидят на верхушке стека).

2) Проблемы с потоками. Global Interpreter Lock (GIL) допускает выполнение только одного потока в каждый отдельный момент. Это создает заметные ограничения для использования языка Python. Решение: на мой взгляд, полезнее удалить GIL вообще, чем изменять его. Мне кажется, этот предмет требует дальнейшего изучения. Если разработчики языка решат, что GIL остается с ними, наверное, стоит исправить его поведение.

3) Пространство имен. В Питоне переменная, будучи объявленной, не обязана прекращать существование после выхода из родного блока отступов. Например, следующий код является рабочим:


a = 10
b = True
if b:
    x = 100

print(a * x)

for i in range(10):
    for j in range(5):
        pass

print(i, j)

1000
9 4

Спасибо за прочтение!

Контакты:


Мой аккаунт Telegram: @the_timur

Twitter: @the_timurr

Почта: [email protected]

XMPP: [email protected]

Instagram: the_timur