Saturday, November 28, 2015

Тренировки программиста, ката. Задачки. Обучение.

Прежде чем писать, есть желание заинтересовать. Простая задачка с 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 и прочее я отмел сразу. Но открыл для себя: 

  1. http://www.codewars.com/ - каты программирования.
  2. https://www.codeeval.com/ - интересные задачки.
Честно говоря решив пару тривиальных вещей на codewars  я решил к этому сайту не возвращаться. Но буквально же в этот день прочитал книгу "Идеальный программист. Как стать профессионалом разработки ПО" Роберта Мартина. Особо отметил некие "ката" смысл которых не понял. Действительно, мне показалось глупым раз за разом писать один и тот же алгоритм "совершенствуя" свои навыки. В результате в качестве исследования я решил позаниматься неделю на codewars, результаты ниже. А в чем же смысл ката по Мартину? 

Обычно при кодировании мы придумываем решение и затем его реализуем. Иногда решение придумано либо неправильно либо не продумано до конца. В этот момент мы кидаемся с одного на другое. Если например мы будем знать решение задачи и более того мы его уже несколько раз реализовывали то что нам это дает?

  1. Наработка механической памяти между задачей и решением.
  2. Занесение в подкорку типовых приемов 
  3. Если механика набора уже наработана, то мы можем осваивать IDE изучая новые комбинации хоткеев, которые позволят нам сократить время набора кода. 
  4. Реализация известного решения на новом языке позволит его быстрее изучить. 
В целом codewars.com немножко не про то. Но вот прошла неделя когда я каждый день делал по одной ката в день на двух языках один из которых даже не знаю. И теперь могу поделиться результатом. 


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

  1. Я достаточно неплохо знаю питон, но тем не менее мой результат от лучших зачастую был чуть длинее чем лучший, при этом на него похож. Почти из каждой задачи я вынес "best practice" которые уже использую в работе. 
  2. В es6 я не силен, поэтому вначале очень много подчерпнул из особенностей языка особенно на первых порах. Сильно помогало, что эту же задачу до этого я решал pyton поэтому сосредотачивался уже на нюансах языка
  3. На этом сайте ужасные js программисты, сравнивая решения python и js хочется развидеть все решения на js :) Хотя конечно есть и хорошие.
  4. Мои "наработанные" приемы уменьшения объемы кода или его украшательства иногда давали решения длиннее чем грамотно использованные if :) 

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

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

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

Также на codeeval ценна оптимизация. Если на codewars часто видно не оптимальные решения, но короткие, то на codeeval наоборот :) Поэтому зачастую получив низкую оценку за задачу, хочется выполнить ее быстрее. 

Ну и на codeeval нельзя (или я не знаю как ) посмотреть результаты других участников. 

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


No comments:

 
Каталог сайтов, Добавить сайт