Pull to refresh
7
0
Виктор Куликов @bezdoom

Senior software engineer at AVITO.ru

Send message

Top 5 раздражающих моментов в работе программиста

Reading time4 min
Views194K
В процессе работы, будучи программистом, в разные периоды я не раз сталкивался с рядом проблем. Во многом из-за непонимания клиентами и руководителями работы программиста. Хочется собрать наиболее раздражающие моменты, которые делают работу невыносимой и портят все удовольствие, и объяснения начинающим менеджерам на доступном языке, как не быть в глазах разработчика обузой.

1. А сколько займет сделать этот раздел (дается ТЗ из одной строки)?

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

Менеджеру: поймите, что программист строит в голове модель будущей системы. По одному предложению нельзя смоделировать приложение. И только ваша вина, если вы не потрудились уточнить ТЗ (это ваша работа, кстати) у заказчика, а хотите сразу назвать ему срок (и цену). Потому что оценка с потолка невозможна — вроде как ответить на вопрос «сколько времени займет покрасить комнату неизвестной площади?».

2. Ты же ОБЕЩАЛ сделать за два дня, а прошла неделя! (моют мозг по сроку из пункта 1)

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

Менеджеру: ничто так не демотивирует, как обвинение в некомпетентности и лжи. Постарайтесь давать точное ТЗ и бить задачу на простые кусочки, в чем программист с удовольствием поможет (если хорошо попросить). Тогда можно будет более точно управлять сроками.
Читать дальше →
Total votes 195: ↑159 and ↓36+123
Comments203

Практический опыт переноса ресурсов из Flash в Unity 3D

Reading time4 min
Views20K
Буквально недавно мы с товарищами запустили наш первый проект под iOS — игрушку про змейку Shadow Snake. Хотелось опробовать разработку под iPad, поэтому решили перенести уже готовый проект, сделанный на Flash, тем более, что механика позволила очень гармонично использовать возможности сенсорного управления.

Конечно, первой идеей было попробовать AIR SDK — проект запустился, но из динамичной аркады он превратился в аркаду “походовую”. FPS был ужасно низким отчасти из-за того, что практически вся графика во флешке была векторной, а мобильный AIR с ней не очень дружит. Я уже не помню точно, какой AIR на тот момент был доступен (2.x или первые версии 3.x), но мы проводили эксперименты как с векторной графикой, так и с другим проектом, сделанным в растре на Flixel. Результаты не очень нас обрадовали. Сейчас, я смотрю, прогресс сдвинулся, Adobe даже выпустила какой-то новый компилятор. В любом случае, в то время было решено использовать Unity 3D.

Unity 3D на тот момент уже хорошо зарекомендовала себя в мобильных играх и имела хорошую визуальную среду для создания игровых сцен. Благодаря этому можно было разделить непосредственно программирование, подготовку ресурсов и дизайн игровых уровней и распределить эти задачи по разным членам команды. Кроме того, по роду основной деятельности я давно уже работаю с C#, поэтому с Unity я чувствовал себя комфортно.

Встала задача, как перенести графику и анимации (в том числе составные) в новый проект.
Читать дальше →
Total votes 37: ↑28 and ↓9+19
Comments33

Git Rebase: руководство по использованию

Reading time8 min
Views820K
Rebase — один из двух способов объединить изменения, сделанные в одной ветке, с другой веткой. Начинающие и даже опытные пользователи git иногда испытывают нежелание пользоваться ей, так как не видят смысла осваивать еще один способ объединять изменения, когда уже и так прекрасно владеют операцией merge. В этой статье я бы хотел подробно разобрать теорию и практику использования rebase.

Теория


Итак, освежим теоретические знания о том, что же такое rebase. Для начала вкратце — у вас есть две ветки — master и feature, обе локальные, feature была создана от master в состоянии A и содержит в себе коммиты C, D и E. В ветку master после отделения от нее ветки feature был сделан 1 коммит B.


Читать дальше →
Total votes 122: ↑121 and ↓1+120
Comments169

Продуктивное использование PHPStorm

Reading time7 min
Views327K
В процессе использования IDE иногда случайно, иногда специально находятся полезные фишки, сочетания клавиш и прочие заложенные разработчиками приятные штуки, которые никогда не оседают в памяти без регулярного их использования и всячески ускользают при чтении мануалов.

Не претендуя на библию или «настольную статью программиста» я хочу поделиться полезными находками в моей любимой IDE, не скатываясь в тупую копипасту мануалов и скучных списков хоткеев, только то, что я сам использую постоянно и над чем удивляются коллеги: «о! а так можно?»
Что ж там такое?
Total votes 120: ↑117 and ↓3+114
Comments124

Внутреннее устройство Git: хранение данных и merge

Reading time9 min
Views88K
В процессе перехода с SVN на Git мы столкнулись с необходимостью переписывания наших внутренних инструментов, связанных с развёртыванием кода, которые ориентировались на существование линейной истории правок (и разработку в trunk). На Хабре уже публиковались возможные решения этой проблемы через Git-SVN, но мы пошли другим путём. Нам нужна поддержка таких возможностей Git, как branching и merge, поэтому мы решили разобраться в основах, как же работает Git и каким способом должна осуществляться интеграция с ним.
Читать дальше →
Total votes 77: ↑77 and ↓0+77
Comments10

DivShot — онлайн-сервис прототипирования Bootstrap

Reading time1 min
Views75K
DivShot — отличный новый инструмент для работы с Twitter Bootstrap. С помощью него создавать прототипы интерфейсов с использованием популярного CSS-фреймворка стало до безобразия просто.

Читать дальше →
Total votes 155: ↑145 and ↓10+135
Comments21

HybridAuth — интеграция сайта с социальными сетями

Reading time7 min
Views38K

Введение


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

  1. Авторизация пользователей в случае закрытия Loginza или отказа от нее — в этом случае мы потеряем пользователей, в привязанных профилях которых не указан email;
  2. Дополнительная информация, например, ВКонтакте умеет отдавать фото пользователя в нескольких видах, в том числе квадратный аватар. С Логинзой получить эти данные не представляется возможным, сервис сам решает какие данные запрашивать и какие отдавать;
  3. С момента продажи Яндексу Логинза начала умирать: на запросы пользователей никто не отвечает, сервис не развивается, а находится в том виде, в котором был 1-2 года назад.

Встал вопрос замены и использовать альтернативные сервисы желания уже не возникало — никто не представлял возможности «общаться» с соц. сетью напрямую, а расширенные поля профиля обычно включались в платные услуги. Хотелось автономного решения с возможностью гибкой настройки запрашиваемых полей и в итоге я остановился на php библиотеке HybridAuth.
Подробнее о HybridAuth
Total votes 54: ↑52 and ↓2+50
Comments28

Немного про Deadlock

Reading time2 min
Views131K
Это совсем краткий пост о причинах возникновения Deadlock

В более менее нагруженных проектах, использующих транзакции InnoDB, в любой момент может возникнуть ошибка вида

«Deadlock found when trying to get lock; try restarting transaction»

Главное не паниковать при виде этих страшных слов, сейчас мы разберемся почему это происходит.
Читать дальше →
Total votes 31: ↑29 and ↓2+27
Comments50

Phalcon: Давайте учиться на примере

Reading time9 min
Views54K
PHP MVC Framework — PhalconPHP
Совсем недавно на хабре упоминался PHP MVC Framework написанный на языке C, где были описаны его преимущества и недостатки. Этой статьёй я хочу продолжить знакомство с довольно интересным инструментом веб-разработчика — PhalconPHP.

Данная статья является вольным переводом базового урока, в котором будет рассмотрен процесс создания приложения с простой формой регистрации, а также разъяснены основные аспекты поведения фреймворка.

Лучший способ использовать это руководство – пройти его шаг за шагом.
Давайте приступим
Total votes 43: ↑35 and ↓8+27
Comments45

Перевод Azure Services Platform Девида Чеппела 2 часть

Reading time18 min
Views3K
Первая часть перевода

Детальный взгляд на технологии.


Получить общее представление о Azure Service Platform это важный первый шаг, однако, более глубокее понимание каждой из технологий тоже необходимо. В этом разделе каждый из членов семьи Azure рассматривается немного более детально.
Читать дальше →
Total votes 23: ↑22 and ↓1+21
Comments7

Siege — утилита для нагрузочного тестирования веб-серверов

Reading time7 min
Views81K
Надеюсь, что данный материал будет кому-нибудь полезен.

Siege – это утилита для нагрузочного тестирования веб-серверов. Она была создана для того чтоб дать разработчикам возможность проверить ресурсоёмкость своего кода в условиях, максимально приближенных к реальным. Так же Siege может имитировать обращения к сайту сразу нескольких пользователей. Это позволяет держать сервер как бы «под осадой» долгое время. Количество запросов, произведённых при «осаде», рассчитывается из общего количества пользователей и количества их обращений к серверу. Например 20 пользователей, обратившись по 50 раз, создают в общей сложности 1000 запросов. Результат, выводимый программой после тестирования, включает в себя время затраченное на проверку, общее количество переданной информации ( включая заголовки ), среднее время ответа сервера, его пропускную способность и число запросов на которые пришёл ответ с кодом 200. Эти данные формируются и выдаются при каждой проверке. Подробно они описываются ниже. Siege имеет 3 основных модели работы – режим регрессионного тестирования, режим имитации Интернета и режим грубой силы. Программа считывает порцию ссылок из конфигурационного файла и обращается к ним по очереди ( режим регрессионного тестирования ) или случайно ( имитация интернета ). Или же пользователь может указать один единственный адрес к которому будут производиться все обращения – режим грубой силы.

UPD: спасибо за плюсы, перенес в тематический блог.
Читать дальше →
Total votes 76: ↑74 and ↓2+72
Comments67

Лямбда-функции и замыкания

Reading time3 min
Views69K
imageКонечно многие из нас знакомы с этим понятием, однако данная статья рассчитана на новичков. В данном посте постараюсь рассмотреть данный феномен и привести примеры использования.
Читать дальше →
Total votes 55: ↑28 and ↓27+1
Comments58

Пишем на iPad'е под iPad

Reading time3 min
Views16K
Недавно в App Store появились первые игры написанные прямо на iPad, что лично меня очень радует. Можно сказать, что планшет становится не только средством потребления контента, но и его производства.

image
Под катом я расскажу, как и где это сделано, покажу простенький Hello World.

Читать дальше →
Total votes 73: ↑63 and ↓10+53
Comments39

Еще о кэшировании в Django

Reading time6 min
Views17K
Все знают, что такое кэширование и зачем оно нужно. Посещаемость растет, нагрузка на базу данных увеличивается, и мы решаем отдавать данные из кэша. В идеальном мире, наверное, для этого будет достаточно добавить строчку USE_CACHE = True в settings.py, но пока это время не пришло, понадобится немного больше телодвижений.

Когда мы собираемся использовать кэш в Django, нужно сделать выбор: взять готовое решение, которое сделает сделает все «за кулисами», либо реализовать свое. В отличие от многих других ситуаций, тут этот выбор не так очевиден, так как в существующих на сегодня готовых решениях довольно много ограничений и потенциальных неудобств.

Сначала мы быстро рассмотрим готовые решения, а потом разберемся, как же лучше реализовать кэширование самостоятельно.
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments14

Вникаем в метаклассы Ruby

Reading time6 min
Views53K

Примечание переводчика: данный пост является логическим развитием, а точнее «предысторией» поста Вникаем в include и extend и был подсказан в комментариях к нему пользователем murr, за что ему большое спасибо.

Классы и объекты в Ruby связаны между собой достаточно затейливо и не сразу можно понять что к чему. Из-за особого назначения классов очень легко потерять из вида тот факт, что классы — это тоже объекты Ruby. От «обычных» объектов их отличает два вещи: они служат образцом для создания новых объектов и они являются частью иерархии классов. Все верно, классы могут иметь экземпляры себя (объекты), суперклассы (родителей) и подклассы (детей).

Если классы — это объекты, то у них должен быть свой собственный класс. Классом всех классов (как объектов) в Ruby является класс Class:

# один из способов создать новый класс
Dog = Class.new
    
# общепринятый способ создания класса
class Dog
    # какая-то реализация собачьего поведения
end

Dog.class
=> Class

Читать дальше →
Total votes 41: ↑39 and ↓2+37
Comments11

Набор полезных утилит и библиотек мира .NET

Reading time2 min
Views13K
Продолжаю серию постов о библиотеках и прогрмаммах этого мира. Крайне советую всем не знакомым посмотреть в сторону языка программирования Nemerle. У него есть все шансы стать таким же мейнстримом, как C#, F#, VB.NET. Тут все зависит от вас, как говорится. Вы задаете мейнстрим, а не корпорации. Итак, приступим.

SharpDevelop



Это прекрасная IDE для работы в проектах .NET. Скоро будет добавлена поддержка C\C++. Сейчас она есть, но частичная. IDE полностью бесплатна, поддерживает на данный момент C#/VB.NET/IronRuby/IronPython/F#/Nemerle(надо доустановить плагин)/ Boo. Среди типов проектов — абсолютно любые, включая ASP.NET, WPF, WCF с визуальными редакторами, подсказками. Есть встроенный рефакторинг, имеющий пока что малую часть функционала ReSharper. Вместе с плагином ThemeTool превращается в полноценную Visual Studio 2010 визуально (см. скриншот). Это то, что должен попробовать каждый разработчик .NET и иметь при себе. Ведь в отличии от Visual Studio инсталлятор этой программы занимает всего 20 мегабайт.
Читать дальше →
Total votes 68: ↑51 and ↓17+34
Comments45

Web-Drawing библиотеки: Paper.js Vs. Processing.js Vs. Raphael.js

Reading time12 min
Views38K
Набрёл на статью со сравнением трёх JS библиотек для рисования в WEB Paper.js, Processing.js и Raphael.js. Думаю она будет интересна не только мне.

Прежде чем начать рисовать что-либо в браузере, спросите себя о следующих трёх вещах:


  • Вам нужна поддержка старых браузеров?
    Если ответ да, тогда единственный выбор, это Raphaël. Он поддерживает браузеры вплоть до IE 7 и Firefox 3. У Raphaël есть даже ограниченная поддержка IE 6, несмотря на то, что некоторые базовые для библиотеки технологии не могут быть реализованы в этом браузере.
  • Вам нужна поддержка Android?
    Android не поддерживает SVG, так что вам придется использовать Paper.js или Processing.js. Существуют слухи, что Android 4 будет поддерживать SVG, но большинство современных Android устройств уже не будет его поддерживать.
  • Ваш рисунок интерактивный?
    Raphaël и Paper.js сосредоточены на взаимодействии с рисуемыми элементами посредством клика мышкой, перетаскивания и касания. Processing.js не поддерживает никаких события уровня объекта, потому обработать движения пользователя в нём довольно сложно. Processing.js может рисовать классную анимацию на Вашей домашней страничке, а Raphaël и Paper.js более подходят для интерактивных приложений.

Читать дальше →
Total votes 68: ↑63 and ↓5+58
Comments30

Коллекция паттернов и антипаттернов JavaScript

Reading time1 min
Views5.5K
Несколько месяцев назад на Гитхабе появилась очень неплохая коллекция паттернов и антипаттернов JavaScript и jQuery на все случаи жизни. Автор проекта Shi Chuan проделал отличную работу, собрав десятки примеров кода из книг и других источников. Репозиторий уже набрал почти полторы тысячи подписчиков и активно пополняется. Всё очень удобно разложено по категориям и откомментировано. Наслаждайтесь!
Total votes 68: ↑54 and ↓14+40
Comments81

Prototype, proto и оператор new

Reading time3 min
Views84K
В этой статье я кратко в примерах объясню что такое свойства __proto__, prototype и работу оператора new в JavaScript.

Свойство __proto__


Абсолютно любой объект в JavaScript имеет свойство __proto__. Это скрытое системное свойство, и не во всех реализациях языка оно доступно пользователю.
При обращении к любому свойству объекта, оно в первую очередь ищется в самом объекте:
var obj = {ownProperty: 1};
console.log(obj.ownProperty);// 1
Но если его там нет, поиск происходит в свойстве __proto__:
obj.__proto__ = {propertyOfProto: 2};
console.log(obj.propertyOfProto);// 2
Если его нет и там, оно ищется дальше по цепочке:
obj.__proto__.__proto__ = {propertyOfProtosProto: 3};
console.log(obj.propertyOfProtosProto);// 3
Эта цепочка называется цепочкой прототипов (prototype chain).


Читать дальше →
Total votes 82: ↑67 and ↓15+52
Comments44

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity