2007-09-24

OOPs - продолжение 2

Начало: 1, 2.

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

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

Хорошая идея? Очень. Поскольку знать и помнить всё невозможно. Нужно ограничить информацию, количество оперируемых понятий и состояний. Всегда можно структурировать задачу, разбить её на части, на уровни, с учётом зависимостей. Теперь кодируем эти понятия и уровни в виде объектов и их методов. И готова программа правильная, объектная, понятная и развиваемая! Вперёд!

Говорите, не получается? Тут же всё просто. Значит делаем объект клиент, объект ресторан, объект стейк, объект официант. Дальше добавляем метод "сделать заказ". Кому добавляем метод? Эээ... Официанту? Нет, клиенту? Может ресторану? О, идея! Сделаем класс "менеджер заказов". И добавим его в ресторан. И с ним пусть все общаются. И диспетчер официантов. И очередь клиентов. Так, дальше, состояние заказа. Ага, в стейке хранить не будем. Какое состояние, когда он съеден? Нужен менеджер стейков. Или диспетчер. Клиент? Подожди, тут не до клиентов. Нужен менеджер очередей и диспетчер менеджеров.

А может ну их на хрен объекты? Сейчас быстренько организуем структурку состояния заказа, функцию добавить заказ с несколькими параметрами "ресторан", "клиент", "официант", и т.д. Как просто получается! А массив структур переделаем в табличку базы, всё просто получается. Но не объектно. Ладно, один объект оставим. Ресторан.

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

Мысль вторая - некоторые действия затрагивают несколько объектов сразу. Модель черного ящика с методами изменяющими "его" состояние, не работает, когда надо согласованно изменить состояние нескольких объектов. Старая добрая функция выглядит здесь наиболее уместно.

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

Четвертое. Эээ... Забыл. Завтра вспомню.

2007-09-22

OOPs - продолжение

Мир состоит из объектов. Объект "я" сел в объект "машина", поехал по объекту "дорога" в объект "ресторан", где попросил создать экземпляр класса "стейк". Мне принесли объект "стейк", я его съел, отдал объекты "деньги", получил объект "чек" и т.д. Некоторые объекты вполне реальны. Я, машина, дорога, стейк. Все они локализованы в пространстве-времени, отличаются от окружающей среды, обладают своими особыми свойствами, ведут себя своим собственным образом. Некоторые объекты есть лишь в нашем воображении. Объект "King County" (местное административное деление), вполне условен и существует постольку, поскольку мы договорились его признавать в данных границах. Так же и свойства объектов, бывают вполне объективны. Например материал стейка, вес, даже с некоторыми оговорками вкус. А есть условные, например цена стейка, марка машины, её остаточная стоимость со всеми её помятостями, престижность этой машины в различных кругах (короче, далее по Пелевину). Все это зависит не столько от самого объекта, сколько от различных субъективных факторов нашей оценки этого объекта, от наблюдателя. --- Знаете, чем данный, например, текст отличается от программы? Любой текст пишется для его читателей. Этот текст рассчитан только на на один вид читателей - homo programmaticus. А любая программа имеет двух читателей - тех же homo, плюс компьютер. Эта двойственность делает программу текстом особенным, и эту двойственность читателя постоянно надо держать в уме при написании. Бывают программы, где человеческий читатель полностью игнорируется. Лишь бы компьютер сжевал, а на остальное наплевать. Их никто и не читает, выкидывают и пишут другую. Другой полюс - наплевать на компьютер. В том плане, что надо чтобы программа была понятна любому и это будет определять всю её структуру. Работает такая программа тоже не очень, её тоже приходится переписывать. Думаю примеры того и другого всем хорошо знакомы. --- Когда-то давно, задолго до того, как впервые подошёл к компьютеру, где-то в старшей школе, я придумал для себя термин "объектное мышление", как результат чтения советской прессы. Он означал разделить понятия принадлежащие объекту и понятия навешанные на него наблюдателем. Знаете, чем отличается "очередная гнусная провокация террористов" от "неудачно проведённой операции национально-освободительной армии"? Отношением к ним. В реальности просто была перестрелка противоборствующих вооружённых группировок преследующими свои, разные, цели. Очень полезный навык в различных областях, очень рекомендую. И в частности в программировании. В стадии анализа задачи очень важно понимать что принадлежит объекту, а что есть его отражение наблюдателем. А в стадии написания кода важно понимать, что пишется для компьютера, а что для человека. --- Ну так для кого пишутся классы? --- ... продолжение следует ...

2007-09-21

OOPs

Чувствую, пора писать статью про ООП. Которое объектно-ориентированное программирование, или, иногда, проектирование. Но не сегодня. Сегодня осталось всего пять минут. А пока я собираюсь с мыслями, давайте вспомним и подумаем, что же такое ООП? * Какое отношение к объектам имеют инкапсуляция, наследование и полиморфизм? * И что, собственно, это такое и зачем они нужны? * Почему они все вместе? * Какое отношение к ООП имеют языки C++, C#, C. * Какое отношение к ООП имеют базы данных? * В чем, собственно, выигрыш от использования ООП? * А в чем ловушка? Это не вопросы из учебника по информатике. Это очень важные практические вопросы, как показывает практика. А ответы, как показывает та же практика не столь однозначны, и не совпадают с ответами из учебника.

2007-09-20

По следам предыдущей темы

То же место, другое освещение. Это Nestle. У них тут даже не ферма, а учебный центр. Простая, старая, неглобализированная Америка ниже. Это Bob's Corn Maze. Лабиринт из кормовой кукурузы. В кукурузе протоптанны дорожки в виде лабиринта. За недорого по нему можно гулять. Тут же можно покататься на тележке и купить всякую ерунду, например тыквы. Не для еды, для украшения. Потом кукурузу скашивают, и получают тот же корм, что и без лабиринта. У местных фермеров, в пригороде, развлечение посетителей - один из основных источников дохода. Некоторые почти полностью перепрофилировались на атракционы. Ещё здесь любят лошадей держать, для верховой езды. Иногда попадаются ламы, не знаю, зачем их держат, но они очень симпатичные. Моя дочка, маленькая, всегда, когда их видела в окно автомобиля, восклицала "мама мыла ламу!".

2007-09-19

Snoqualmie Valley, Nestle Farm



Это не панорама, это серединка. Снято мыльницей, которой снимал подводные кадры на Maui.

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

Ну и что, что навоз? Ну, да, говно. Говно реальное, пахнущее, ничем не хуже виртуального продукта жизнедеятельности программистов. Программисты - это скорее коровы, чем фермеры. Они сидят в своих офисах-кубиклах, и вариантов у них один: непрерывно засовывать себе в голову чужой код, пережёвывать его там, и производить из этого свой. И даже ночью во сне, продолжать его жевать.

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

А лучше всё-таки быть фермером, ездить на тракторе, убирать кукурузу, а в воскресенье катать ребятишек по corn-maze. Хочу на волю! Где солнце, дождь и ветер!


2007-09-13

Перечитывая старые книжки ... по программированию

Когда я был школьником, компьютеры казались передним краем технологии. Ещё были физика микромира и космос. Это то, о чем было жутко интересно читать, о чем хотелось мечтать. Я мечтал и читал. Изучал Алгол и Фортран, очень был впечатлён языком APL. Прошло несколько лет "теоретической подготовки" прежде чем удалось поработать на реальном компьютере. Мой первый компьютер был советский аналог PDP-11. Даже внешний вид был похож. Оперативная память на ферритовых кольцах. Один куб - 4К. Внешняя - перфолента. Вставные модули на транзисторах и микросхемах низкой степени интеграции, вентили, пары триггеров. Начальный загрузчик вводился на пульте переключателями в двоичном виде наизусть. Интерпретатор языка "FOCAL" был дизассемблирован, изучен и переделан. И ведь всё работало!

Спустя ещё несколько лет, когда я уже вовсю писал программы и под Unix-ом, и для разных других малоизвестных сейчас платформ, я обнаружил, что старые компьютерные книжки продолжают быть интересны и содержательны. То, что только появлялось в мире мини-компьютеров, было уже давно исследовано в мире мэйнфреймов. Язык Алгол-68, графическая система Алгамс, мощная графическая библиотека Графор, куча открытого фортрановского софта для научных расчетов. Система TeX для форматирования текстов. Я всегда тщательно просматривал технические букинистические отделы книжных магазинов, на которые некоторые коллеги смотрели снисходительно, типа, что там может быть, когда всё так быстро развивается.

Так вот, господа, программисты. Парадокс в том, что ничего, собственно, не развивается. Всё, что мы видим - это развитие аппаратной базы, которая действительно скакнула поразительно. Память не 4К кубы, а 4G чипы. Не перфолента на 32К, а винчестер 1T. Такт - не единицы мегагерц, а единицы гигагерц. Связь не по RS232 с соседней комнатой, а по оптоволокну с другим полушарием. Отсюда и прогресс. Хватает памяти и скорости справляться не только с текстами, но и со звуком и с видео.

Что касается софта, то тут прогресс не столь очевиден. Тот же TeX так и остаётся лучшей системой подготовки текстов, несмотря на все свои недостатки. Старая книжка по Algol-68 как была для меня источником идей по компьютерным языкам, так и осталась. Не слишком большой прогресс в операционных системах, языках или способах взаимодействия с компьютером. Диктовать компьютеру до сих пор нельзя, проще напечатать самому. До сих пор нельзя спросить на естественном языке. Классическое "Где накладные за прошлый месяц?". Или "Сколько я потратил на еду?" Всё до сих пор вводится в формы, в бланки, и т.д.

Очевиден прогресс в области видео и музыки, но он целиком обусловлен возможностями аппаратуры. Нет ничего, чего не было бы в том или ином виде раньше. Я видел черно-белый ray-tracing выведеный на АЦПУ (алфавитно-цифро-печатающее устройство, кажется). Браузеры тоже перешли плавно от устройств ввода-вывода текстовых руководств с гипер-ссылками, которые были давно к тому же самому, но дополненому картинками и работой через сеть. Современные графические системы типа Windows проигрывают про продуманности и мощности интерфейса старым системам САПР (CAD/CAM), где можно было выполнять графические операции с несколькими объектами, определять макросы на процедурных или функциональных языках, произвольно масштабировать видимое изображение, выделять цветом интересующие информационные слои и т.д. Ничего из этого нет не в Windows ни в OSX. Да ведь в Windows до сих пор нельзя правой стрелкой сдвинуться на поле справа от текущего, надо жать tab, или дёргать мышку!

Многие верят, что идею Windows придумали либо в Microsoft либо в Apple, что сборка мусора и байт-код придуман в Java или в .NET, а програмные компоненты означают COM, которые придуман в Microsoft. BCE Y BAC HEBEPHO (кто знает - той поймёт, в чем прикол фразы). COM придуман в DEC, в той же компании, которая и сделала вушеупомянутую PDP-11, а потом выпускала компьютеры VAX. А компоненты существовали задолго до этого в разных языках. Вышеупомянутый Algol-68 (68 - это год принятия стандарта) имел встроенную сборку мусора. Большинство интерпретаторов языков используют байт-код внутри, а, например, P-система, очень распространенная в 70-е годы, имела виртуальную машину, интерпретирующую байт-код, называвшимся P-кодом, который сохранялся в виде файлов, причём мог переносится между машинами с разными системами команд. Очень похоже на Java. Я даже не буду писать про Эльбрус, который настолько обогнал своё время, что мы подойдём к его концепциям лет через двадцать, не раньше.

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

Мне кажется, что пора возвращаться к основам, переосмыслить стереотипы, отказаться от них. Только тогда возможен дальнейший прогресс. Все эти файлы, каталоги, процессы и много чего, что было придумано, есть искусственные понятия, которые мешают двигаться вперёд больше, чем помогают. Они полезны, они выполнили свою функцию, как оператор goto. Пора переходить к чему-то более защищённому и структурному. Вот сижу, смотрю на Windows и знаю, что хочется совсем другого. И я знаю, что мне хочется. Сам удивляюсь, но я знал это всегда. Я в школе знал, что мне хочется, как должен работать компьютер, а как должен выглядеть компьютерный язык. Но если попытаться рассказывать, собеседник мгновенно начинает возражать (я пробовал :-). Хочется людям разного, а многим ничего вообще не хочется. "Оставьте всё как есть и не морочьте голову". Я иногда думаю, что есть люди, кто давно понял, например, как сформулировать единую теорию поля, но их просто никто не понимает и не слушает.

P.S. А о том насколько люди разные напишу в следующий раз.

2007-09-10

Работать совсем не хочется

Перебирая старые баяны. Забавный снимок, раньше не видел. "Навстречу космической угрозе".

2007-09-07

HDTV и .NET

Наконец то нашёл программу, которая бесплатно показывает HDTV с моего тюнера. Собственно, тюнер простой и маленький. Ловит HDTV канал и гонит цифровой mpeg поток по USB2 не раскодируя его. Получается относительно небольшой поток, вычислительная мощность в тюнере не требуется, вообще мощность не требуется, у него даже питания своего нет, достаточно того, что есть в USB. Всё ложится на процессор компьютера. Купил тюнер год назад. Вот нашел, наконец, программу. Перебрал кучу вариантов. BeyondTV, SageTV. Не пробовал Media Center и Vista. Совершенно не хотелось переставлять операционку. Это совершенно простая программа, должна работать под XP. Я даже взял GraphEdit и построил работающий граф, который показывал картинку! Казалось, всё, только заскриптовать, и наслаждаться. Так нет, BeyondTV занимает сотню мегабайт, ещё требует гигабайт на диске, процессор под завязку на 100%. Что она там делает? Запущено несколько сервисов, память тоже забита. И ещё стоит всё это удовольствие около 70 баксов. Попробовал свободный Media Portal, он показывает, но компьютер при этом ни на что вообще не реагирует. Даже убить процесс не даёт. Только ресет. Кучу программ перебрал. Всем явно не хватает ни памяти, ни процессора. Несмотря на то, что декодеры я выбираю те, что пришли с видеоадаптером - они с аппаратной поддержкой и не должны занимать основной процессор вообще (ну, почти). А запись видео на диск - так даже раскодировать не надо! Бери цифру с тюнера и пиши на диск! И вот наконец WatchHDTV. Не требует инсталляции. Всё занимает 2 мегабайта. Процессор занят на треть даже при максимальном разрешении 1920x1200. Телевизор показывает, может делать timeshift, может записывать на диск, чтобы потом смотреть. UI кривоват, но это терпимо, зато ничего лишнего и всё работает. Чем отличались все программы, которые я смотрел до этого - они были на .NET. Как беру какой нибудь Супер-Пупер-Портал на .NET, так начинаются цветные разводы с полупрозрачными меню, съедающие и процессор и память, и при этом ни хрена не работает. Не в технологии дело, наверное можно написать и на .NET (я даже знаю как - написать всё на С++ и вызвать одной строчкой из С#), но люди, которые выбирают писать на C#, не умеют сделать маленькую и эффективную программу, но хотят при этом сделать "красиво", в своём понимании эстетики (всё как в Висте). Не видел ни одной программы, написанной на C#, которую захотелось бы оставить. Как, впрочем, и на Java. Kudos, WatchHDTV!

2007-09-06

Плот и оплот.

Есть такое слово "Plot". Когда-то я думал, что оно означает "чертёж". От одноимённой юниксовой программы и устройства "plotter", очень распространённого раньше в околонаучных и инженерных кругах. И лишь потом узнал, что это ещё и "заговор". Типа сидят в тёмной комнате некие люди и при тусклом свете качающейся лампочки чертят чёрными чернилами чертёж. В смысле, план.

Есть другое слово, тоже означающее заговор: "conspiracy". Оно широко известно последнее время своей устойчивой ассоциацией с паранойей. Но поверьте старой народной мудрости: "Если у Вас паранойя, это не значит, что за вами не следят!". Никакого дела нельзя сделать, чтобы не выработать план, и часто он делается в тайне! Например, представьте, что вы решили открыть с друзьями стартап. Сначала будете встречаться, договариваться, потом делать что-то не шибко это анонсируя, возможно ещё пребывая формально на старой работе. Потом будете в узком кругу придумывать как объявлять, как рекламировать, где просить денег, что при этом обещать и о чем умалчивать. Plot. Или например решили вы поиграть в избирательные игры. Опять сначала будет plot. Как чернить конкурентов, на что напирать в своей программе. Я уж не говорю о том, если вы придумали и решили провернуть нечто не вполне законное или такое, про что законы не писаны.

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

Если вы начнёте пытаться видеть приёмы в газете, в рекламе, раскладывать рекламный слоган по полочкам, то через некоторое время эти приёмы начнут бросаться вам в глаза. Всегда сомневайтесь в написанном! Правда - вообще очень большая редкость. Тем более, что исказить смысл можно просто немного умолчав. Сомневаться в предлагаемом - это не ку-ку. Ку-ку - это чтение газеты на просвет. А чтение с элементарным анализом текста - это нормально, не надо этого стесняться. Стесняться надо быть "целевой аудиторией". Хотя, в принципе, стесняться вообще вредно, это комплексы.

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

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

Иначе придётся мучиться, сомневаться, взвешивать доводы сторон, и при недостатке достоверной информации, и при полной невозможности на что-то повлиять. Говорите, "Нафига?" Несомненно, вы правы, blue pill - лучший выбор, рекомендован минздравом. Но если вы всё же выбираете red pill, предпочитая мучиться сомнениями, то вам сюда.

2007-09-04

Sunrise Visitor Center - Mount Rainier National Park



Palm Foleo накрылся.

Сегодня получил e-mail о том, что foleo не будет. Жаль. Симпатичная получалась игрушка. С другой стороны я и не особенно надеялся, что они её сделают. Изначально казалось, что идея "ассистента телефона" какая-то ущербная. Даже не мой ассистент, а моего телефона! Короче, коврик для мышки, тапочки для тараканов, херня всякая. А стоит дороже самого телефона!

Но хорошая штука могла бы быть в правильных руках. Очень легкий, очень тонкий, мгновенно включающийся ноутбук без механических деталей. С малым энергопотреблением. Размера средней книжки, но тонкий. С встроенным WiFi и bluetooth. Почти как моя Nokia N800, но экран побольше и с клавиатурой. Так я его и рассматривал, как маленький и быстрый браузер-почта-редактор-книжки. Аналогичного размера ноут от Sony стоит около двух тысяч, а тут всего $400.

Мой прогноз - это конец Palm-а. Ну и хрен с ними. Сделал бы такую штуку кто-нибудь другой! Например та же Nokia. Аппаратно почти то же самое, что и N800, и софт можно было поставить тот же самый!