*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

воскресенье, 30 октября 2011 г.

Сколько дней в году работает программист

Как вы оцениваете потенциальную продуктивность програмистов?

Понятно, что все зависит от типа работы, поэтому даю конкретный пример.

Дано: работа программиста над устоявшимся продуктом, который имеет major релизы раз в год; в течение года выпускаются minor релизы и критические исправления; плюс в поддержке находятся релизы последних 5-6 лет.

Вот мой расчет:

365 дней в году
365 / 7 = 52 недели в году
52 * 5 = 260 рабочих дней в году
260 - 25 = 235 рабочих дней в году за вычетом отпуска
235 - 10 = 225 рабочих дней в году за вычетом еще и государственных выходных
225 - 15 = 210 еще минус две недели в среднем "по болезни"

Итак: 210 человеко-восьмичасовых-дней.

Общение с несколькими менеджерами программистов показало, что цифра "100 дней" является весьма распространенной как оценка сверху на то, сколько новой разработки планировать в год на человека.

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

вторник, 25 октября 2011 г.

Закомментированные куски кода

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

Ребята купили в офис "Test Driven Development for Embedded C" от James W. Grenning.

Хоть там и много про hardware, но примеры как можно и нужно изолировать зависимости для упрощения тестирования на языке С очень полезные. Кроме того описаны пара xUnit библиотек для этого языка (хотя cmockery нет).

Итак, цитата (как есть, без сокращении и перевода).

Commented-out Code

Sources files littered with commented-out code are an ugly mess. New or returning programmers are faced with questions about what the code is supposed to do. "Should the code be uncommented?" "It is no longer needed?" "When will it be needed and under what circumstances is it needed?" "What's that for?"

The solution to this code smell is simple; delete the commented-out code. It can always be recovered from your source repository.

Посты по теме:

среда, 19 октября 2011 г.

Запрещенные слова для комментариев и имен

Мы договорились в команде, что слова "new", "now" и "old" являются запрещенными для употребления в комментариях, именах переменных окружения, описаниях коммитов, когда речь идет об изменении поведения чего-либо.

Например, переменная окружения, включающая "старый" алгоритм генерации ключа: вместо "OLD_KEY_ALGORITHM" должно быть "USE_ABCDEF_ALGORITHM".

Вместо ссылок на прошлое или будущее надо описывать конкретное поведение, так как характеристики "new", "now" and "old" становятся неактуальными уже через неделю. А еще хуже, что они приводят к появлению таких имен как "OLD_2_KEY_ALGORITHM" или "NEW_2_KEY_ALGORITHM".

пятница, 14 октября 2011 г.

сonst везде, где только можно

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

Я не имею ввиду очевидные применения const для аргументов функций и константных методов.

Я имею ввиду, что любая переменная, которая не меняется с момента ее создания, должна быть const. Само название "переменная" значит, что объект должен меняться. Если он не меняется, то это уже не переменная. Сделать переменную непемеренной в C/C++ можно с помощью ключевого слова const.

Пара примеров, где люди часто не ставят const (выделено жирным):

const int sz = very_long_name_to_calculate_size(...);
for (int i = 0; i < sz; ++i) {
...
const VeryLongClassName var(a, lot, of, different, parameters);
int a = var.getX();
// Only "const" functions of "VeryLongClassName" are called further down.

Кстати, явное указание на неизменность переменной помогает компилятору в оптимизации.

Посты по теме:

воскресенье, 2 октября 2011 г.

Chromebook Samsung 5 3G

Прочитал я, что Google открыл в Лондоне офлайновый магазин по продаже Хромбуков.

Поехал посмотреть и магазин и Хромбук.

"Магазин" - это стойка из двух столов в десятком демо ноубутов в зале огромного PC World'а. Рядом отдел Apple, Sony и т.д. То есть это не целый отдельный магазин, как у Apple, например.

Хромбук, который там демонстрируется и продается - Samsung Series 5 3G.

Ниже будут не очень хорошего качества фотографии моего часового знакомства с данным устройством.

В закрытом виде.

Слева - питание, странного вида видео-разъем, USB и аудио.

Справа - еще один USB.

Спереди - SD.

Разъем питания в целом хлюпковат.

Посмотрим клавиатуру.

Над шифтом есть интересная кнопка Search, которая просто открывает в браузере новую пустую закладку и устанавливает курсор в строку поиска. По сути это CTRL-T. Мне эта кнопка очень понравилась.

В верхнем ряду кнопки для интернета. Та, что между полноэкранным режимом и яркостью - переключение между окнами Хрома, если их открыто несколько.

Кнопок Ins, Del, Page Up и Page Down нет.

После включения через 8 секунд появляется приглашение логина и пароля от вашего гугловского аккаунта (я воспользовался демо-логином), и затем появляется главный экран.

Все, что есть в Хромбуке - это браузер Хром. Войти/выйти из него нельзя. Можно только открывать новые табы и окна.

Сам Хром отличается от обычной десктопной версии разными дополнительными меню. Например, сетевые найстройки.

WiFi

Русский язык можно также добавить в настройках.

Печатать можно либо подключив USB-принтер (есть спискок поддерживаемых моделей), либо "правильным" гугловым методом через Cloud Print.

В Хромбуке можно хранить локальные файлы. Их можно приаттачивать к письмам, например.

В самом локальном хранилище реально можно что-то делать только с файлами определенного типа, например, фотографиями или видео. Их можно закачивать на WebPicasa.

В локальное хранилище попадают все скачиваемые файлы и скриншоты.

Скайпа тут быть не может, поэтому я проверил GTalk (в окне моя бритая голова).

Настройки GTalk.

После небольшего ерзанья GTalk все же упал.

Конечно я зашел на правильный сайт.

И еще на один.

И еще на один для оценки производительности.

Линукс загрузился за 33 секунды. На моем Mac Air Core Due оно грузится за 8 секунд. А вот богомипсы почему-то такие же - ~20.

Теперь мой субъективный вывод.

Стоит эта музыка 400 фунтов (~630 долларов), что, как мне кажется, является запредельно нереальной ценой. Сам ноут крайне прост и не является супер легким и тонким ультрабуком, за который можно было бы драть такую цену.

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

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

Если цена была бы 50 фунтов - лично я купил бы его прямо там, так как использую продукты Google и рад поиграться с подобной "консолью от Гугл", но за 400 фунтов - как-нибудь обойдусь.

вторник, 6 сентября 2011 г.

Типы в C++ с явным указанием размера

Наш продукт выпускается на нескольких типах UNIX и на Windows. К счастью, все релизы с этого года только 64-бит, включая Windows (Server 2008 и Studio 2010).

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

Сейчас мы пришли к выводу, что зоопарк типов надо прекращать.

Итак, правило.

Слова char, short, long, long long, __int64 по умолчанию запрещены. Их использование придется объяснить на code review. Если нужна переменная, которая логически не является смещением в памяти, и ее предельные значения с запасом укладываются в интервал от -2^31 до 2^31-1, по это просто int. Если это индекс или смещение в памяти - это size_t.

Если же нужен беззнаковый тип, или конкретный размер, то надо использовать типа из stdint.h (int8_t, uint8_t, uint16_t, int16_t, uint32_t, int64_t, uint64_t), которые аккуратно реализованы для каждой платформы в одном единственном месте.

Шаг радикальный, посмотрим как пойдет.

Кстати, как вы справляетесь вот с этим?

for (int i = 0; i < s.length(); ++i)

Убрать предупреждение о приведении size_t к int можно, изменив на:

for (size_t i = 0; i < s.length(); ++i)

Но как быть с:

for (int i = s.length(); i >= 0; --i)

Тут уже на size_t не изменить и надо внучную писать "int i = static_cast<int>(s.length())", что, конечно, плохо.

Похожая петрушка с "strlen()", также возвращающей size_t.

воскресенье, 4 сентября 2011 г.

Сравнение программ из коробки в Windows и Mac OS X

Что обычно происходит после установки Windows? Обычно начинается установка "нужных" программ, так как "родными" программами пользоваться нереально. На Маке же почти всеми программами "из коробки" можно и нужно пользоваться.

Рассмотрим некоторые.

Телнет

Windows: telnet.exe

Этой программой можно пользоваться только случайно, по несколько минут, когда ничего другого нет под рукой, а надо быстренько зайти. Если надо именно ssh, а не telnet - ставим SecureCRT или на худой конец putty. Проблема не в telnet.exe как таковой, а в реализации консоли.

Mac: благодаря нормальной консоли (табы, полноэкранный режим, масштабирование) можно просто пользоваться штатным telnet и ssh.

Просмотр картинок

Windows: штатный просмотр картинок - голимая программа. Реально хочется сразу поставить XnView или ACDSee.

Mac: Preview в сочетании с Finder (см. ниже) - удобнейшая вещь, понимающая не только картинки, но и PDF, текстовики и т.д. Для картинок есть встроенный редактор для минимального редактирования. В Windows надо открывать Paint.

Скриншоты

Windows: Можно сделать снимок либо окна, либо всего экрана. Снимок ложится в буфер обмена, откуда его надо куда-то перенести. Хочется сразу поставить, например, FastStone Capture.

Mac: встроенная система снятия снимков экрана умеет все. Можно даже делать это из командной строки.

Веб-браузер

Windows: IE - без комментариев. Нужен FF/Chrome/Opera.

Mac: Safari является одним из топовых браузеров. Хотя Chrome на Maке все еще актуален из-за синхронизации с Google, Flash и расширений.

Почта

Windows: Windows Mail (бывший Outlook Express) вполне можно использовать от лени, но Thunderbird лучше поставить.

Mac: Apple Mac (особенно 5.0 в Lion) даст фору Thunderbird'у и даже Microsoft Outlook'у (хотя надо отдать должное - Microsoft Outlook 2011 for Mac чертовски хорош).

Командная строка и скриптование

Windows: cmd.exe - без комментариев. Это не скриптование, а ёрзанье. cscript может еще как-то спасти ситуацию.

Mac: ksh/bash/csh/python/php/ruby - на выбор из коробки.

Автоматизация работы с окнами

Windows: встроенных программ для этого нет. Может через cscript можно?!

Mac: AppleScript и Automator позволяют делать почти все. Уж как минимум кнопочки на окнах нажимать можно.

Backup

Windows: вообще есть люди, реально использующие встроенную в Windows систему архивирования?

Mac: Time Machine является удобнейшей системой инкрементального бэкапа. Можно в любой папке "отмотать" время назад и вернуть файлы к нужной дате. Сохранения могут делаться локально, без внешнего накопителя, если место есть на диске, а когда накопитель появится в доступности (по USB или сети), то сохранения автоматически уходят туда.

Например, когда ноут у меня дома, то по Wifi он всегда видит NAS, и делает сохранения туда, периодически. Если у меня много изменений, то я могу подключиться кабелем, чтобы слилось быстрее. А когда ноут не дома, все накапливается локально, и по приходу домой происходит сливание. Да, заметьте, все описанное происходит автоматически, в фоне.

Словарь

Windows: нет

Mac: Приложение Dictionary интегрировано в систему и вызыватся кликом на слове или фразе почти отовсюду. Для русского языка есть словари от Лингво, правда неофициальные.

Запуск программ и документов из командной строки

Windows: В XP я использовал TypeAndRun. В Vista и 7 уже неактуально, так как в Start > Run можно набирать имя программы, и будут выводиться варианты программ и документов, доступных в системных путях. Жить можно.

Mac: Увы, но Spotlight (вызываемый по Сmd+Space) - это глобальный индекс по всему, что есть на файловой системе, обновление которого происходит каждый раз при ее изменении. Какие-либо логические "пути" тут не при чем.

Работа с файлами

Windows: Explore (Проводник). В целом с этой программой можно жить. Но лично моя программистская натура требует двух панелей в том или ином виде. Обычно это кончается FAR'ом или Total Commander'ом.

Mac: У меня есть двухпанельный менеджер файлов на Маке, muCommander. До Фара или TC, конечно, как до луны, но жить можно. Но! Поработав в Finder ("Проводник" на Маке) некоторое время, я начал замечать, что запускаю muCommander все реже и реже. Не могу точно описать почему, просто не нужно. Возможно просто из-за общей продуманности интерфейса и возможностей Finder'а.

Пока все, что волнует лично меня.

Как-то не понятно - почему Windows комплектуется столь недоразвитыми штатными средствами? Увы, часто понять это можно только поработав там, где программы "из коробки" нормальные.

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