03 марта 2015

старье

Если вам предлагают писать Windows Forms под .NET Framework 2.0, а у вас Visual Studio 13 на Windows 8 – то у вас есть 2 выхода:

  1. бежать от предлагающих как можно быстрее
  2. пойти в Control Panel –> Programs and Features –> Turn Windows fetaures on or off и включить там .NET Framework 3.5

Так как выбрать первый вариант я пока не могу, пришлось попробовать второй. На что система мне сообщила что ей нужны файлы и она не может их скачать потому что 0x800F0906.

Уж не знаю чего там блокировало доступ к Windows Update – вот эта статья подсказала как установить offline. Смонтировал образ из числа доступных на корпоративном файловом хранилище – и заработало.

18 ноября 2014

Сравнение с boolean

Есть одна вещь в коде, которая мне не нравится (она не одна :), но все перечислять не буду). Это сравнение с boolean literal:
image
Не так давно, на одном из проектов, я пытался понять что движет людьми когда они так пишут код – я решил что это либо недостаток знания языка, либо ошибка, либо страх менять legacy код.
По поводу legacy – есть код который работает (возможно лет десять). И тут возникает необходимость добавить фичу\фикс. После того как работа сделана – изменения могут привести к тому что появится сравнение с boolean (например, упростилось логическое выражение) и автор кода не хочет убирать сравнение в страхе поломать что-нибудь. Ситуация выдуманная и я не знаю она ли приводит к подобному коду – но я вижу это не в первый раз. К слову, код написан специалистами из Индии для клиента из Индии :).
Но, вот код из документации Microsoft
http://msdn.microsoft.com/en-us/library/bb546150.aspx
image
Я в своей практике стараюсь убирать подобные выражения. По моему мнению, если код требует сравнения с boolean чтобы было понятно что происходит – то нужно выносить это в метод с понятным и информативным названием.

06 мая 2014

О зависимостях

Чем мне не нравится зависимость контрола от контрола.

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

Наша задача - максимально облегчить работу с компонентами, чтобы с ними можно было работать по отдельности, чтобы можно было легко подменять реализации компонентов на другой стороне зависимости. Мы используем разделение обязанностей, чтобы упростить работу. Вот, например, MVC - это разделение обязанностей на model, view и controller. Ведь раньше то ничего не мешало напихать все это в одно место. Но разделение обязанностей облегчает работу, делит код на части, определяет взаимодействие между частями. Чем меньше код тем проще с ним работать, меньше ошибок допускается, легче понять. Тоже самое происходит и с зависимостями. Зависимость - это один из аспектов ответственности компонента. В случае с контролами, контрол может отвечать за генерацию представления (HTML), binding к данным, обработку взаимодействия с пользователем, валидацию. Если мы заставим его отвечать еще и за взаимодействие - контрол проще не станет, и работать с ним проще не будет.

Это Inversion of Control - мы конечно можем управлять зависимостью изнутри компонента, но выделение границ между зависимостями помогает нам видеть эти границы, их сложнее случайно нарушить, меньше соблазнов добавить костылей к коду - нужно задекларировать костыль в интерфейсе. Это особенно важно когда мы работаем с JavaScript - ведь в нем намного меньше средств ограничить возможные методы использования объектов.

Выход из этого положения – это возложить ответственность за взаимодействие на того, кто создает взаимодействующие компоненты. В случае с контролами – на view, их использующую. Как это сделать – договориться что происходит в случае когда сообщение от одного компонента должно попасть к другому. Например опубликовать событие и генерировать его вместо прямого вызова метода зависимого компонента, обрабатывая событие на уровне view. В случае с JavaScript – использовать publish-subscribe pattern.

12 января 2014

Git Extensions – проблема с доступом

Опять столкнулся с проблемой доступа к github используя Git Extensions. Условия – свежепоставленный Git и Git Extensions. Касается это, похоже, не только github – проверять не стал.

В общем накоммитил, решил сделать Push и получил вот что:

geissue

Проблема известная. Чтобы я мог потом легко найти решение – вот ссылка. Вкратце – проблема в глобальном конфиге git, в опции [credential] куча лишних обратных бекслешей в начале и в конце. Нужно оставить по одному.

15 ноября 2013

Books and films

Около года назад я прочитал книгу Ender’ game автора Orson Scott Card. Книга мне понравилась, читал в оригинале. Изначально цель была улучшить английский, и, чтобы не забросить, выбрал любимый жанр – фантастику. После первой книги автор не остановился и написал еще несколько, но начав читать одну из них мне стало скучно – видимо Ender’s game выглядела для меня настолько законченным произведением, что не хотелось портить впечатление сиквелами. А вот недавно с удивлением обнаружил что по книге сняли одноименный фильм. Хочу сходить посмотреть.

Кроме того, снова проснулся интерес к фантастике – и теперь я думаю что бы еще такого прочитать.

07 ноября 2013

программист = рабочий

Я задумался над работой программиста. На описании множества вакансий написано, какие именно аббревиатуры должен уметь расшифровывать будущий работник. Сколько лет опыта он должен иметь, какой диплом и уровень английского языка. Из всего этого, мне кажется, наиболее толковым показателем является английский язык.

Для разработчика важно знать, как общаться с компьютером и как - с людьми. Если человек не умеет общаться с людьми, то, скорее всего, его умение рассказывать компьютеру «что делать» вам не пригодится.

Что толку знать об определенной версии фреймворка, если она изменится через несколько месяцев? Какова ценность знаний, обесценивающихся с каждым годом? Вы можете быть в десятке лучших в стране экспертов в очень узкой области знаний – и вместе с тем не находить себе применения, поскольку в стране есть занятие только для четырех экспертов. Мне кажется, что более ценным является навык воспринимать и обобщать знания. Фреймворки и технологии – всего лишь инструменты. Умея постигать новое, совсем несложно научится использовать новые инструменты.

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

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

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

02 ноября 2013

Brainbench

Недавно закончились игры на Brainbench. Это такое событие, когда они открывают все свои тесты для бесплатного доступа (обычно тесты стоят 50 долларов) и ведут статистику, из какой страны больше тестов сдали. Вот результаты, штаты впереди, Украина в тройке лидеров.

Пока тесты были бесплатными, я решил попробовать их на вкус. Прошлый раз пробовал в 2005 году, на играх того года. Потратив несколько вечеров, получилось закрыть несколько JobRoles – это условный набор характеристик, которым должен обладать сферический специалист. По ощущениям – сдавать легко. Запрета пользоваться гуглом я не нашел.

Сдавая тесты, обнаружил интересную приписку на leaderboard о том, что набравший на играх больше всех баллов в каком-то тесте получит годовую подписку. А также обнаружилось, что тесты по .NET Framework и C# имеют общие вопросы (т.е. я встречал в одном тесте вопросы, которые уже видел в другом) – это облегчило прохождение. А так как тестов по .NET Framework там 6 штук, а по C# – 7, то результаты улучшались с каждым тестом. В итоге, получилось сдать C# 3.0 Fundamentals на 5, что и принесло мне в итоге годовую подписку – вот только я не уверен что буду ей пользоваться.

Еще оказалось что по ADO.NET 2, который я сдавал только чтобы закрыть job role, тоже набралось больше всех (хоть и не 5). Если честно, я слегка удивлен результатам, такое впечатление, что тесты попросту не привлекали особого внимания и потому легко было попасть в лидеры.

Что касается качества тестов, то ощущения смешанные – некоторые вопросы были из разряда выбрать метод среди похожих, другие требовали опыта в определенной области. Если сравнивать с Microsoft – то brainbench мне нравится больше. Как мне кажется основная проблема онлайн тестов – это количество вопросов. Рано или поздно вопросы начинают повторяться и это дает возможность идти на тест уже зная ответы. Те попытки защитить вопросы от копирования, предпринимаемые, например, Microsoft, не особенно продуктивны. Думаю, что решением было бы менять вопросы в тесте на протяжении всего времени что тест доступен для сдачи – но тут не обойтись без дополнительных вложений. В итоге, баланс между качеством тестов и вложениями каждый выбирает сам.

Ссылка на мой профиль на brainbench

Статья на DOU про Brainbench Games