Архивы: software

VS 2010: полет нормальный

Все идет четко по плану

DEP

За будущее разработки ПО я совершенно спокоен!

Кто последний в Новую Зеландию?

Буду за Вами. Там собираются запретить софтверные патенты. Явно.

We recommend amending clause 15 to include computer programs among inventions that may not be patented. We received many submissions concerning the patentability of computer programs. Under the Patents Act 1953 computer programs can be patented in New Zealand provided they produce a commercially useful effect.3 Open source, or free, software has grown in popularity since the 1980s. Protecting software by patenting is inconsistent with the open source model, and its proponents oppose it. A number of submitters argued that there is no “inventive step” in software development, as “new” software invariably builds on existing software. They felt that computer software should be excluded from patent protection as software patents can stifle innovation and competition, and can be granted for trivial or existing techniques. In general we accept this position.

Программерское: Мой топ признаков плохого кода

Собрал тут свой собственный список признаков факапнутости кода.

На первом месте — классы со словом «Manager» в названии. Безоговорочный лидер в номинации «превратим любой код в страшные спагетти». Самое ужасное в таких классах это то, что делаются они из самых лучших побуждений. Впрочем, так всегда — самые кошмарные деяния совершаются под прикрытием лозунга «мы же хотим тебе лучшего». Я специально не пишу о внутренностях этих классов, само название «Manager» для меня уже достаточное основание к тому, чтобы код полетел в помойку.

Второе место достается небезопасным преобразованиям типов. Ну, это когда в коде появляется преобразование от класса-предка к классу-потомку. Вроде этого

class A;
class B: public A;

void DoSomething(A* ptr)
{
(B*)ptr->MethodOfB();
}

100% признак проявления идиотии в проектировании иерархии классов. Особый шик, когда подобный downcast встречается в одном из базовых классов — это уже индикатор того, что пора сушить весла. Исключений не бывает. Если же такой код появляется в процессе рефакторинга там, где ничего подобного до того не было, то сушить весла нужно отправлять аффтара этого рефакторинга.

Третье место — классы «универсальный всемогутор».  Близкий родственник класса «Manager», протащеный оным на ключевую позицию в проекте, способен отравлять жизнь двум-трем поколениям программистов, которым выпадет этот код поддерживать. Обычно характеризуются тучей публичных методов, никак не связанных по смыслу ни друг с другом, ни с названием и предназначением класса и не изменяющих и не использующих ни одного из свойств класса, но при этом зачастую имеющих тучу неявных связей друг с другом.

Четвертое место — преднамеренное нарушение энкапсуляции. Это когда в класс «бутылка пива» пытаются заодно вкрячить нечто, что вроде как должно научить экземпляры его автоматически упорядочиваться внутри класса «ящик пива». Когда через неделю закономерно выяснится, что бутылки нужно упорядочивать в сикспаки, начинается любимый в народе аттракцион «аврал». Есть вообще только один случай, когда объектам допустимо иметь какие-то знания о контейнере, в которые их будут складывать — это преднамеренно делается интрузивный контейнер. Во всех остальных случаях такой код — индикатор того, что code review можно прекращать прямо сейчас, иначе проблемы этот код начнет доставлять уже на следующей неделе. В общем случае — запихивание в классы внешних нерелевантных зависимостей есть большое зло.

Пятый признак — преднамеренное игнорирование или извращенное употребление паттернов программирования. Когда из-за страха перед великим и ужасным шаблоном «фабрика» образюутся иерархии, где один-единственный параметр конфигурации спускается каждым промежуточным классом вниз на десять уровней, чтобы там ему где-то делали if или switch..case, когда при программировании на C++ боятся использовать RAII или бьют по рукам за bind; или же, наоборот, пихают повсюду smart pointers (доморощенные, конечно же, бо boost — это слишком сложно), жди беды. Очень быстро кто-то посередине той иерархии забудет, зачем нужен этот мистический параметр, нигде в обозримых окрестностях не применяющийсяи «пофиксит» код, обеспечив остальных неделями отладки (ведь юнит-тесты для такого кода писать не принято — он же очень сложный!); неиспользование RAII рождает трудноуловимые дедлоки, а умные поинтеры дают вкусить циклических зависимостей по полной.

Шестой признак — использование наследования там, где нужна агрегация. Например, есть интерфейс классов, есть базовый класс, которые реализует 85% всей требуемой функциональности. Позднее выясняется, что функциональность реализована вообще на 100%, а единственное требуемое различие — это разное поведение в случае создания класса с определенными внешними параметрами. Например, в реальной жизни есть у нас автомобиль. Точнее, его кузов. Во всем мире все производители просто ставят разные двигатели на один и тот же кузов и обзывют это обидным словом «комплектация». В мире программирования часто происходит закат разума за ум — вместо того, чтобы создать класс «автомобиль» со свойством «двигатель», начинают городить иерархию «автомобиль А с двигателем Б», автомобиль Б с двигателем А» и так далее, что вообще противоречит здравому смыслу. Еще бы, класс автомобиль оказывается наследником класса «двигатель». Проблема тут в том, что разобраться во всем этом хитросплетении и потом поддерживать ее становится решительно невозможно. В то же время правильный вариант — создать нужный объект тпиа «двигатель» и передать его новому объекту типа «автомобиль» при инициализации- не только сэкономил бы пару тысяч строк кода, но и позволил бы унифицировать и протестировать все имеющиеся автомобили и двигатели отдельно друг от друга и даже попробовать впоследствии легко примерить движок от Мерседеса на Запорожец.

Юнит-тестирование. Всем чтить!

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

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

ППКС.

Об интерфейсах между программистами и простыми смертными

Тёма, конечно, клоун.

Но под этим постом готов подписаться

Больше всего меня в технике (от компьютера и кофеварки до телефона и лесопильного станка) бесят сообщения об ошибках. Программист, прикрывший свою жопу объявлением «Ошибка -1425″, будет, разумеется, гореть в аду, но мне-то от этого не легче.

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

Но особенно, как говорится, доставляют очень полезные в хозяйстве сообщения вроде «Невозможно закрыть файл» в модальном диалоге поверх всех окон с одной-единственной кнопкой «Ок». Авторов подобных шедевров считаю необходимым навсегда разжаловать в младших помощников старших черпальщиков при холерных обозах.

C++ мантра или почему порядок вызова конструкторов так важен.

Читать вдумчиво, с придыханием, каждое утро по 128 раз

«Порядок вызова конструкторов членов класса определяется только порядком их появления в объявлении класса. Список инициализации порядок не определяет»!

Полдня убил сегодня на поиск бага. Был класс с членом-смартпоинтером и еще одним членом, который инициируется таким же смартпоинтером:

class MyClass{
public:
MyClass(SmartPointerToSomeThing);
private:
    SomeOtherClass m_OtherClass;
    SmartPointerToSomeThing m_VeryImportantSmartPointer;
};

MyClass::MyClass(SmartPointerToSomeThing Ptr):
    m_VeryImportantSmartPointer(Ptr),
    m_OtherClass(m_VeryImportantSmartPointer)	///< fuck up is here
{
}

// Has to be instead:
MyClass::MyClass(SmartPointerToSomeThing Ptr):
    m_VeryImportantSmartPointer(Ptr),
    m_OtherClass(Ptr)                                        ///< Note - Ptr used instead of member
{
}

Что произошло в первом случае?

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

Что интересно, найти такой баг может быть очень-очень-очень сложно.

Закон Мерфи

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

Не зря я тестирую даже «хелловорлды», не зря.

Software engineering proverbs.

Software is Too Important to be Left to Programmers, by Meilir Page-Jones

More proverbs here.

Another joke:

Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end. (Henry Spencer)

From here.

Splashtop: Mozilla in BIOS.

It happened.

Now it is hard to get amazed by a newly released hi-tech gadget or a new «technology». It looked like everything has already been invented, and while we discuss whether .NET framework’s performance is good or bad or what hard disk drive to buy to install Vista on it, Asus released motherboards with integrated linux.

Just imagine — you turn your PC on and desktop appears immediately with  read-to-use Web browser, Skype and more. Of course, this still looks like a toy rather a useful solution, but it depends what we want from computer. This technology exactly fits «home media center» idea — it is not a big deal to add all essential media players, photo gallery software to the flash and you’ll get a device that just works. No more worries about viruses, firewalls, malware and the whole hard disk is at your hand — operating system does not take a fraction from it, not talking about enormous tens of gigabytes needed for Windows Vista.

I don’t think Windows will die in near future, however I think such ideas can add a big nail into its coffin.

I wonder how soon we’ll see notebooks and desktops with all essential software in a flash on motherboard?

32 посетителей онлайн
1 гостей, 31 bots, 0 зарегистрированных
Максимум сегодня:: 94 в 02:16 am UTC
В этом месяце: 130 в 10-22-2014 11:16 pm UTC
В этом году: 130 в 10-22-2014 11:16 pm UTC
За все время: 130 в 10-22-2014 11:16 pm UTC