Monday, February 1, 2016

Разработка через тестирование. Нужно ли это.

Я попробую тезисно ответить на вопросы

Нужно ли TDD?
Когда его стоит внедрять?
Замедляет ли работу написание тестов?
Какие подводные камни вы можете встретить?

Нужно ли TDD. 


Очень трудно ответить на этот вопрос, для начала нужно внести ясность. 

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

Написание тестов - всего лишь написание тестов. Простой пример, если вы научились писать тесты, они вам помогают в работе, вы оценили всю мощь такого подхода, работаете ли вы по TDD? Может быть да, может быть нет. Если вы не проводите рефакторинг после каждого успешного теста - то это уже не TDD ( я могу ошибаться, но к понимаю важности этого момента я шел очень долгое время), более того, если вы не проводите рефакторинг тестов, это тоже не TDD. 

Еще сложный технический момент, само по себе написание тестов не такая простая задача, если вы учитесь писать тесты, то по сути вы учитесь заново программировать ( при условии что вы все делаете правильно) 

Или например вы пишите тесты, но высокого уровня. Например тесты на views для django. Или любые другие высокоуровневые или приемочные тесты  и только их. Это уже не TDD. Вы покрываете систему требованиями, но не контролируете архитектуру. Это разработка через приемочные тесты. 

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

Ну и финальный ответ на поставленный вопрос - прост. Обладая опытом разработки через TDD уже после пары проектов вы начнете видеть нужно ли TDD для каждой конкретной задачи. Поэтому как "идеальный программист" вы должны освоить эту методологию. 

Когда его стоит внедрять?

Wednesday, January 27, 2016

Как стать веб разработчиком?

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

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

 Так как же стать веб разработчиком? 

Tuesday, January 12, 2016

Ссылка на статью с объяснением statsd, graphite, и на объяснение upper_90, mean_90 метрик

Долго не понимал как точно все это работает. Спасибо коллеге дал мне хорошую ссылку.

https://blog.pkhamre.com/understanding-statsd-and-graphite/

Вдогонку, понятное объяснения метрик upper_90 и т.п.

https://gist.github.com/ageron/5212412

Sunday, December 6, 2015

Docker для разработчика. Основы. Часть 1.

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

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

До докера моя рабочая машина включала в себя.

  1. mysql
  2. memcache
  3. redis
  4. elasticsearch
  5. rabbitmq
  6. statsd
  7. logstash
  8. postgresql
  9. mongo
  10. python 2.7
  11. python 3.4
  12. python 3.5
  13. nginx
  14. apache
  15. phing
  16. ant
  17. fabric
  18. Порядочное число библиотек, для сборки которых нужны была уйма *dev пакетов. 
  19. И наверное еще кучу мелочей которые сходу и не припомнить. 
Отдельной песней шел один из проектов который состоит из нескольких сервисов, настройка проекта в целом занимала очень долгое время. Помню когда мы наняли первого стороннего разработчика, настройка его рабочего места заняла практически день. Теперь, новый человек, который приходит в проект получает рабочее место в пределах часа.  В качестве дополнительного бонуса, все работы для быстрого разворачивания пригодились в CI сервере. 

Итак что за софт у меня теперь? 
  1. docker
  2. docker-compose
  3. ant который идет в idea, просто для удобства
У меня теперь нет даже php, несмотря на то, что я веду несколько проектов на нем. У меня нет python3.4, python3.5, хотя все остальные проекты на нем. И даже python 2.7 который есть в системе я не трогаю для своих целей. 

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

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

Теория


Итак основы.  Я не собираюсь подробно расписывать все возможности. Сосредоточусь на минимуме, которого хватит для его использования при разработке.
  1. docker - это демон который позволяет запускать из образов (images) процессы (контейнеры, containers)
  2. image - образ для запуска процессов ( контейнеров). Состоит из набора файловых систем, которые наслаиваются друг на друга, образуя единую файловую систему. Слои обычно выглядят как
    1. Операционная система.
    2. Библиотеки
    3. Программа. 
  3. container - процесс запущенный на основе образа. По умолчанию все запущенные контейнеры живут в отдельной подсети созданной демоном докера. 

Программисту, возможно, будет проще воспринимать image как класс, а container как объект созданный из класса (образа).  Отсюда все можно делать простые выводы, два контейнера запущенные из одного образа - независимы, но при запуске имеют одинаковую файловую систему.

Важно! docker image может базироваться на любой операционной системе, никто вам не помешает запускать docker image memcached на основе debian stable из вашей операционной системы, пусть у вас будет ubuntu или slackware. memcached запущенный внутри докера будет считать что он работает из под debian. 

Основные команды. 

1. Запуск контейнера, например нам нужен memcached 1.4  для работы. (!!!! минимум 132 Мб будет скачено)

docker run  -d memcached:1.4
82a90b065744f43fa2efd8f00fece0faeacc53c7d306cc54b137482728d8c9bb
-d Говорит докеру чтобы он запустил новый контейнер в фоновом режиме, без этой опции контейнер будет запущен, а ваш терминал будет получать stdout/stderrs от запущенного контейнера.

Мы запустили контейнер с memcached сервисом, из образа memcache версии 1.4 который докер будет искать в публичном репозитории докера. Если образа не было в системе, он скачается. 

2. Скачать образ 

docker pull memcached:1.4

Команда
docker pull memcached 
Эквивалентна
docker pull memcached:latest 
Т.к. latest это версия используемая по умолчанию. 

3. Список запущенных контейнеров

docker ps 

CONTAINER ID        IMAGE                                   COMMAND  ....
82a90b065744        memcached:1.4                           "memcached"   ...

Важно! 82a90b065744 это ID созданного контейнера, у вас будет другой. И во все команды нужно будет подставлять именно ваш. 


4. Узнать подробности о запущенном контейнере 

docker inspect 82a90b065744 | less

В частности нас интересует  "IPAddress": "172.17.0.89". (У вас будет другой)

Также ip запущенного контейнера можно получить при помощи команды 
docker inspect --format '{{ .NetworkSettings.IPAddress }}' 82a90b065744
Проверяем этот адрес 

cd:$ telnet 172.17.0.89 11211
Trying 172.17.0.89...
Connected to 172.17.0.89.
Escape character is '^]'.
set key 0 900 4
data
STORED
get key
VALUE key 0 4
data
END
quit
Connection closed by foreign host.


Видим что memcached запущен и работает. 

5. Остановка контейнера

cd:$ docker stop 82a90b065744 
82a90b065744

6. Повторный запуск остановленного контейнера 
cd:$ docker start 82a90b065744
82a90b065744

7. Попадаем внутрь контейнера

cd:$ docker exec -it 82a90b065744 /bin/bash
memcache@82a90b065744:/$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

-i - интерактивный режим.
-t - прикрепить терминал 
/bin/bash команда внутри докера которую вы хотите запустить

8. Удаление контейнера (предварительно его нужно остановить)

cd:$ docker rm  82a90b065744
82a90b065744

Где искать образы? 

https://hub.docker.com/ отдавайте предпочтение официальным образам, либо образам крупных компаний, как правило они правильнее собраны и имеют меньший размер. 

Теперь мы умеем. 

1. Находить нужные образы
2. Скачивать нужные образы
3. Запускать контейнеры из образов
4. Попадать внутрь запущенного контейнера.
5. Останавливать контейнер


Практика:


Что нам дают эти знания?

1. У вас есть проект, который использует mysql, локально у вас установлен mysql5.3, ошибка воспроизводится на mysql 5.4.

Делаете дамп базы.
mysqldump mydatabasename -u myuser -pmypassword > projectname.dump.sql
Запускаете mysql5.4. из образа

docker run  -e MYSQL_ROOT_PASSWORD=root mysql:5.4

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

-e ENV_NAME=env_value для команды run - создает переменную окружения ENV_NAME с указаным значением для запущенного контейнера.

Заливка дампа во вновь созданный контейнер:

находим id образа
docker ps
получаем его ip 
docker inspect --format '{{ .NetworkSettings.IPAddress }}' IDOFMYSQLCONTAINER
Внутри контейнера создаем базу данных, заливаем дамп, меняем настройки доступа - исправляем ошибку.

Уже одного этого более чем достаточно для того чтобы начать использовать docker : )

Какие еще преимущества нам дает? Пусть вы используете gentoo и mysql 5.3.  Ошибка воспроизводится на ubuntu 14.04 и mysql 5.3. Вы ищете образ сделанный на основе ubuntu 14.04 с установленным mysql5.3 запускаете контейнер и получаете mysql 5.3. работающий внутри ubuntu 14.04 на вашем ненаглядном gentoo.


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





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 - остальные для себя сами все решат. 


Tuesday, November 13, 2012

Индикатор загрузки данных

Мелочь а вечно не мог подобрать подходящий. Вот: (ajaxload.info) замечательный сервис для генерации разнообразных индикаторов.
 
Каталог сайтов, Добавить сайт