Category: it

Category was added automatically. Read all entries about "it".

Про объектно-ориентированное программирование

justy_tylor: В ООП что-то работает. Но большая часть - муляжи из говна и соломы (типа design patterns).

Я -- специалист не большой, но мне тоже так кажется...

ДОПОЛНЕНИЕ 1. Вот что говорит А.Степанов, создатель STL:
Да. STL не является объектно-ориентированным. Я думаю, объектно-ориентированность является почти такой же раздутой фальшивкой (hoax), как и теории искусственного интеллекта. Мне еще не попадался интересный кусок кода, который пришел бы от этих объектно-ориентированных людей.

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

Я нахожу объектно-ориентированное программирование философски нездоровым. Оно утверждает, что всё является объектом. Даже если это так, это не очень интересно: сказать, что всё является объектом -- значит, не сказать вообще ничего.

Я нахожу объектно-ориентированное программирование неправильным методологически. Оно начинается с классов. Это как если бы математик начал с аксиом. Вы не начинаете с аксиом -- вы начинаете с доказательств. Только когда вы нашли кучу соотносящихся доказательств, вы предлагаете аксиомы. Вы заканчиваете аксиомами.

То же справедливо и в программировании: вы должны начать с интересных алгоритмов. Только когда вы хорошо их понимаете, вы можете предложить интерфейс, который позволит им работать.
ДОПОЛНЕНИЕ 2. Спасибо alj868 за ссылку 1:
I think part of the reason people in big companies like object-oriented programming is because it yields a lot of what looks like work. Something that might naturally be represented as, say, a list of integers, can now be represented as a class with all kinds of scaffolding and hustle and bustle.
и ссылку 2:
Object-oriented programming generates a lot of what looks like work. Back in the days of fanfold, there was a type of programmer who would only put five or ten lines of code on a page, preceded by twenty lines of elaborately formatted comments. Object-oriented programming is like crack for these people: it lets you incorporate all this scaffolding right into your source code. Something that a Lisp hacker might handle by pushing a symbol onto a list becomes a whole file of classes and methods. So it is a good tool if you want to convince yourself, or someone else, that you are doing a lot of work.

Нужна помощь в преодолении виндовского идиотизма

У меня Windows Vista Home Premium, и я обнаружил, что при инсталляции программ некоторые файлы могут быть записаны на пользователя, над которым и администратор не властен. Более того, я сделал виндовский backup и развернул его обратно на побочном диске (F:), чтобы выкинуть ненужное. Получилось вот что:
43.06 КБ

То есть идиотские виндовсы создали файл, приписанный TrustedInstallerу, который даже администратор не может уничтожить даже после его копирования! Пытался удалить его и так, и сяк, но, кажется, без форматирования диска не обойтись.

Что скажете, товарищи?

Big Brother Is Watching You! (Большой Брат следит за тобой!)

О сколько нам открытий чудных готовит Интернета дух!

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

Collapse )

Абстрактное мышление как дар Божий

Математик falcao спросил, что люди понимают под абстрактным мышлением (кажется, спросил только френдов). Я кое-что осознал по этому поводу, и сейчас уместно будет об этом сказать.

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

Хотя я по образованию -- физик-теоретик, абстрактное мышление у меня развито до прискорбия слабо. Наука от этого не страдает, поскольку я давно ею не занимаюсь, а занимаюсь уже лет 10 программизмом. Программизм, по сути -- вещь очень примитивная, но и здесь требуется абстрактное мышление. Собственно говоря, на примере программизма я и проиллюстрирую, как работает абстрактное мышление.

Для описания различных объектов программисты придумали понятие интерфейс. По существу, объект рассматривается как черный ящик, про внутреннее содержание которого ничего не известно. Интерфейс -- это описание того, как будет реагировать черный ящик, если его дернуть там или сям.

Например, интерфейс "дам по лбу" работает так: вы нажимаете кнопку и получаете удар по лбу. Как и чем наносится удар -- не существенно: это может быть пулька, или палка, или, может быть, электроразрядник.

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

Я -- программист посредственный; мне трудно работать с объектом, который описан только в его интерфейсном аспекте. Мне очень желательно узнать, как объект устроен внутри, то есть получить о нем конкретную информацию. Для этого мне надо посмотреть на пример имплементации объекта; в примере с объектом "дам по лбу" мне желательно увидеть, что там, в черном ящике, есть пружинка, которая приводит в движение палочку, которая бьет по пульке, и т.д. Увидев пример имплементации, я уже далее могу оперировать с объектами с таким же интерфейсом, даже если их имплементации будут совершенно другими.

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

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

Разработка сложного технического стандарта (например, сетевых протоколов вроде USB или DeviceNet) до появления его первых имплементаций также требует абстрактного мышления.

Более того, несколько лет назад в компании, где я работаю, ввели систему планирования разработок, в которой каждая разработка разбивается на несколько изолированных фаз, и фазы эти связаны потоками документации, и вся эта система создана под любой тип разработки. (Некоторые термины: work -- собственно разработка, rework -- переделка неправильно сделанного, inherited work -- то, что должны были сделать на предшествующей фазе, но не сделали, и приходится делать тебе, и т.д.) Вся система расписана очень детально, снабжена множеством диаграмм и т.п. Поначалу мне она казалась почти бредом; как может нормальный человек заниматься таким в высшей степени забюрократизированным творчеством при том, что люди в своей повседневной работе прекрасно обходятся без всех этих диаграмм?

Но потом я понял, что, даже если это творчество и бесполезно (скорее всего, вредно, потому что отнимает время без заметной пользы для дела), оно требует способности к абстрактному мышлению. И эта способность приближает человека к Богу. В самом деле, составьте-ка подробный план создания мира за 6 дней, не зная заранее, с каким материалом придется иметь дело. Большинство людей напишут, в лучшем случае, полстранички, а человек с абстрактным мышлением, может быть, напишет 6 томов.

О трудовой теории стоимости Маркса

В связи с днем рождения тов. Ленина один из комментаторов упомянул вклад Маркса в политэкономию. Мои сведения о его теории весьма обрывочны и основаны по большей части на плохо формализуемых ощущениях, вынесенных с отнюдь не эйфорических университетских занятий по политэкономии. Тем не менее, я хотел бы изложить мое видение того, что у Маркса есть некоторые фундаментальные слабости, хорошо заметные сейчас, которые, однако, он мог предвидеть и в свое время. (Может ли кто-нибудь предложить форму прошедшего времени причастия "могущий", как, например, в случае "видящий" - "увиденный"?)

Если я неправ в понимании Маркса, надеюсь, товарищи меня поправят.

Мне кажется, Маркс чрезмерно абсолютизировал понятие стоимости, предполагая, что она имманентно присуща товару сама по себе, вне зависимости от обстоятельств продажи и использования товара. Более того, он выводил стоимость как производную от количества и качества труда: Стоимость — это общественно необходимое рабочее время на производство товара (затраты труда). Конечно, можно стоимость определить и так, но людей интересует не количество труда, затраченного на производство товара, а способность товара удовлетворить какую-то потребность, то есть потребительная стоимость. Кажется, Маркс был склонен считать просто стоимость и потребительную стоимость эквивалентными.

Например, рабочий получает 20 долларов в час, а производит стоимость на 100 долларов в час. Тогда разница -- 80 долларов в час -- является прибавочной стоимостью, которую кладет себе в карман капиталист, по крайней мере, на время до выплаты налогов. (Впрочем, как было отмечено ранее, достаточно большой налог способен уравнять содержание карманов пролетария и капиталиста.) Профессор, будучи человеком высокой квалификации, производит в час, скажем, 5000 долларов стоимости.

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

Для рассмотрения второй проблемы с марксовой трудовой теорией стоимости рассмотрим такой пример. Биль Гейц купил права на операционную систему QDOS (эта аббревиатура означает Quick and Dirty Operating System, то есть "наспех сляпанная операционная система") у автора по имени Tim Paterson за 50 тысяч долларов. Переименовав ее в MS-DOS и продавая ее многочисленные копии, Биль сколотил свой первый миллиард.

Подойдем к этим трудово-стоимостным отношениям с марксовской позиции. Какова была стоимость системы в момент покупки ее Билем Гейцом? 50 тысяч или миллиард? По Марксу, скорее, последнее. Таким образом, капиталист Гейц осуществил акт эксплуатации пролетария Патерсона с нормой прибыли в 2,000,000%. Однако то, что Гейц сделал на MS-DOS миллиард, обусловлено также и тем, что он был великий прохиндей, а мама его заседала в совете директоров фирмы IBM, с продукцией которой и продавалась операционная система. Не будь у Биля такой мамы, он, возможно, смог бы продать "свою" систему лишь на миллион.

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

Отсюда вытекает, что стоимость товара не является однозначно определимой константой, что дезавуирует все последующие рассуждения о прибавочной стоимости, эксплуатации и т.п. В самом деле, представим себе, что капиталист построил завод, нанял рабочих и давай их эксплуатировать, а товар не вызвал интереса потребителя -- не продается, хоть убей! В результате капиталист обанкротился, и имущество его компании распродано за долги. Что же, тогда, по Марксу, его нельзя считать кровопийцей-эксплуататором?

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

Мог ли Маркс предвидеть такое развитие событий? Пожалуй: книгопечатание было изобретено за два-три столетия до его рождения. А ведь книга -- это товар, и она обладает свойством приумножать потребительную стоимость с незначительными издержками на печать дополнительного тиража. Это был прообраз будущего товара-"нетрудовой идеи", который стал, в некоторых отраслях, преобладающим.

Александр Степанов -- великий русский программист, или Наш человек в логове врага

Москвич 1950 г.р., выпускник мехмата МГУ. Уехал в США между 1976 и 1979 годами. Как уехал -- не знаю. Судя по фамилии, не так, как это делало тогда большинство наших бывших соотечественников.

Из статьи Standard Template Library в Wikipediи:

STL (Standard Template Library) была и является одним из самых существенных благ для программистов на C++: она дает программистам готовый к использованию набор классов, таких как контейнеры и ассоциированные массивы, которые могут быть использованы с любым встроенным или определенным программистом типом, поддерживающим некоторые элементарные операции вроде копирования и присвоения.

STL достигает своих результатов через использование templates (шаблонов). Этот подход -- очень мощный, предоставляющий полиморфизм на этапе компиляции, что часто более эффективно, чем традиционный полиморфизм на этапе выполнения программы. Современные компиляторы C++ настроены так, чтобы минимизировать любые издержки абстрагирования, возникающие из-за интенсивного использования STL.

C++ Standard Library определена международным стандартом ISO/IEC 14882.

Архитектура STL -- в значительной степени детище одного человека -- Александра Степанова.


Из интервью Степанова:

Вопрос: Я думаю, STL и Generic Programming отмечают определенный отход от общепринятого стиля программирования на C++, который я нахожу почти полностью выведенным из языка SmallTalk. Согласны?

Степанов: Да. STL не является объектно-ориентированным. Я думаю, объектно-ориентированность является почти такой же раздутой фальшивкой (hoax), как и теории искусственного интеллекта. Мне еще не попадался интересный кусок кода, который пришел бы от этих объектно-ориентированных людей.

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

Я нахожу объектно-ориентированное программирование философски нездоровым. Оно утверждает, что всё является объектом. Даже если это так, это не очень интересно: сказать, что всё является объектом -- значит, не сказать вообще ничего. Я нахожу объектно-ориентированное программирование неправильным методологически. Оно начинается с классов. Это как если бы математик начал с аксиом. Вы не начинаете с аксиом -- вы начинаете с доказательств. Только когда вы нашли кучу соотносящихся доказательств, вы предлагаете аксиомы. Вы заканчиваете аксиомами.

То же справедливо и в программировании: вы должны начать с интересных алгоритмов. Только когда вы хорошо их понимаете, вы можете предложить интерфейс, который позволит им работать.

Вопрос: Java -- это очень новый язык, но в нем до сих пор нет templates, что предотвращает использование Generic Programming. Всё должно быть классом. Что вы думаете о Java?

Степанов: Я потратил несколько месяцев, программируя на Java. Вопреки предсказаниям ее авторов, она не стала казаться мне значительнее по мере использования. Я не нашел никаких новых прозрений -- в первый раз в жизни программирование на новом языке не принесло мне никаких прозрений. Java сохраняет весь тот хлам, который я никогда не использую на C++ -- наследование, виртуальные функции -- объектно-ориентированное барахло -- и удалила вещи, которые я нахожу полезными. Она может быть успешной -- в конце концов, и MS DOS была успешной, -- и это может быть выгодно для всех ваших читателей изучать Java, но она не имеет интеллектуальной ценности напрочь.

Взгляните на их реализации хэш-таблиц. Взгляните на их сортирующие процедуры, которые приходят вместе с их "клёвой" сортирующей applet. Попробуйте использовать AWT. Лучший способ судить о языке -- посмотреть на код, написанный его поборниками. "Radix enim omnium malorum est cupiditas" ("Деньги -- корень всего зла") -- и Java представляет собой явный пример денежно-ориентированного программирования ( money oriented programming (MOP)). Как сказал мне главный пропагандист Java в компании "Silicon Graphics": "Alex, ты должен идти туда, где деньги." Но я лично не хочу идти туда, где деньги -- там обычно пахнет не очень хорошо.


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