Прежде чем писать, есть желание заинтересовать. Простая задачка с codewars.com для затравки.
Дана последовательность четных и нечетных чисел, в которой только одно четное число или только одно нечетное, нужно вернуть позицию того единственного числа. Нумерация начинается с 1.
iq_test("2 4 7 8 10") => 3 // Third number is odd, while the rest of the numbers are even
iq_test("1 2 1 1") => 2 // Second number is even, while the rest of the numbers are odd
Ответы - в спойлере.
Открыть спойлер
Почему я начал решать такие задачи?
Недавно заметил что работа для меня превратилась в рутину. Интересных задач как и маленьких открытий остается все меньше и меньше. Я решил скомпенсировать такой ход дел поиском сайтов, помогающих в развитии навыков программирования. Сайты в стиле - напиши AI и прочее я отмел сразу. Но открыл для себя:
Недавно заметил что работа для меня превратилась в рутину. Интересных задач как и маленьких открытий остается все меньше и меньше. Я решил скомпенсировать такой ход дел поиском сайтов, помогающих в развитии навыков программирования. Сайты в стиле - напиши AI и прочее я отмел сразу. Но открыл для себя:
- http://www.codewars.com/ - каты программирования.
- https://www.codeeval.com/ - интересные задачки.
Честно говоря решив пару тривиальных вещей на codewars я решил к этому сайту не возвращаться. Но буквально же в этот день прочитал книгу "Идеальный программист. Как стать профессионалом разработки ПО" Роберта Мартина. Особо отметил некие "ката" смысл которых не понял. Действительно, мне показалось глупым раз за разом писать один и тот же алгоритм "совершенствуя" свои навыки. В результате в качестве исследования я решил позаниматься неделю на codewars, результаты ниже. А в чем же смысл ката по Мартину?
Обычно при кодировании мы придумываем решение и затем его реализуем. Иногда решение придумано либо неправильно либо не продумано до конца. В этот момент мы кидаемся с одного на другое. Если например мы будем знать решение задачи и более того мы его уже несколько раз реализовывали то что нам это дает?
- Наработка механической памяти между задачей и решением.
- Занесение в подкорку типовых приемов
- Если механика набора уже наработана, то мы можем осваивать IDE изучая новые комбинации хоткеев, которые позволят нам сократить время набора кода.
- Реализация известного решения на новом языке позволит его быстрее изучить.
В целом codewars.com немножко не про то. Но вот прошла неделя когда я каждый день делал по одной ката в день на двух языках один из которых даже не знаю. И теперь могу поделиться результатом.
Сама реализация ката занимает очень короткое время. Т.е. тут нет задачи где стоит подумать. Больше упирается в то, насколько лаконично ты реализуешь задачу. После ее решения можно сравнить свой результат с другими людьми, а это уже интересно.
- Я достаточно неплохо знаю питон, но тем не менее мой результат от лучших зачастую был чуть длинее чем лучший, при этом на него похож. Почти из каждой задачи я вынес "best practice" которые уже использую в работе.
- В es6 я не силен, поэтому вначале очень много подчерпнул из особенностей языка особенно на первых порах. Сильно помогало, что эту же задачу до этого я решал pyton поэтому сосредотачивался уже на нюансах языка
- На этом сайте ужасные js программисты, сравнивая решения python и js хочется развидеть все решения на js :) Хотя конечно есть и хорошие.
- Мои "наработанные" приемы уменьшения объемы кода или его украшательства иногда давали решения длиннее чем грамотно использованные if :)
Ну и самое главное. Я действительно стал набирать код более качественно. В целом набор кода у меня занимает очень мало времени, но периодически возникали огрехи - не там закрыта скобка, не там поставлена точка, забыта запятая. После недели занятий я стал допускать в два раза меньше таких огрехов.
Я стал более уверенным набирая алгоритмический код. Если первые ката у меня частенько валились на ошибках, то теперь такое - редкость.
codeeval - тут особо нечего писать. Основное отличие что иногда действительно приходится подумать. А также ты не знаешь полного набора тестов и поэтому отправка решения более ответственный этап.
Также на codeeval ценна оптимизация. Если на codewars часто видно не оптимальные решения, но короткие, то на codeeval наоборот :) Поэтому зачастую получив низкую оценку за задачу, хочется выполнить ее быстрее.
Ну и на codeeval нельзя (или я не знаю как ) посмотреть результаты других участников.
В целом вынес для себя кучу позитива, мне кажется выполнение таких задачек стоит внести в обязательный набор junior - остальные для себя сами все решат.