STIC анонсировал первое ежегодное соревнование программистов на Smalltalk.
Призы:
Соревнование состоит из двух фаз. 1-я фаза, продолжительностью 48 часов, начнётся в понедельник 16 мая в 9 часов утра EST (17 часов по московскому времени) и закончится в среду 18 мая в 9 часов утра EST (17 часов по московскому времени). Для участия в соревновании нужно зарегистрироватся на сайте www.stic.org. Регистрация начинается 1-го мая и заканчивается 13 мая в 18 часов (14 мая в 2 часа по московскому времени).
Судьями в 1-й фазе будут по одному представителю от Cincom Systems, GemStone, IBM, и Knowledge Systems Corporation. Они и выберут 3-х победителей. Победители 1-й фазы будут объявлены 1-ого июня 2005 г. на сайте www.stic.org.
2-я фаза, она же и финальная, пройдёт на конференции Smalltalk Solutions в г.Орландо, штат Флорида. Однако, для участия в 1-й фазе не нужно быть зарегистрированным для участия в конференции.
Другая информация возможно заинтересует студентов. ESUG обявляет, что участие в 13-й международной конференции 2005 для студентов будет бесплатным. Проезд не оплачивается, хотя, возможно, будет существовать частная спонсорская программа. В зависимости от количества студентов, возможно, что бесплатным будет и проживание. Количество мест ограниченно. Как послать заявку смотрите на сайте www.esug.org.
Думаю, что было бы хорошо, если бы кто-то из русскоговорящих студентов побывал на конференции, и написал бы краткий отчет.
Ярлыки: conference
Bruce Eckel написал заметку о том, что более предпочтительно начинать изучение программирования с динамически типизированных языков.
Цитата:
У большинства тех людей, которых я знаю, и которые начинали со Smalltalk-а, во много раз лучше развито понимание фундаментальных концепций и способность увидеть недостатки в определённом языке, чем у людей, которые начинали с языков, близких к железу.
Цитата:
Я хорошо знаю как устроены списки и хеш-таблицы, но мне интересно, насколько сильнее я бы стал, начни я с языка, в котором динамически расширяемые списки и словари являются частью базового инструментария. Мой нынешний опыт и то, что я видел, наблюдая за программистами, начавшими со Smalltalk-а, утвержают, что вы переносите подобные концепции в такие языки, как C++ и Java, и, как результат, вы способны использовать эти языки более эффективно.
Цитата:
Даже, хотя ежедневно я работаю с такими языками как C++ или Java, я уверен, что изучение динамического языка не только добавит вам знание очень ценного инструмента (инструмента, с которым вы сможете решать "сторонние задачи" намного быстрее), но и позволит вам вернуться к "основному" языку с новым виденьем, и это поможет вам решать проблемы более эффективно и элегантно.
Smalltalk считается объектно-ориентированным, а должен был бы ориентированным на обмен сообщениями.
Don Box решил изучить Ruby и восстановить свои знания Smalltalk-а (с которым он не имел дела уже 18 лет). Повод - выбор языка для обучения его детей программированию. В списке языков кандидатов Lisp, ML, Smalltalk, Ruby.
Цитата:
Бросается в глаза отсутсвие в списке некоторых языков. Меня не волнует, поймёт ли хоть один из трёх моих детей отличие абстрактного класса от интерфейса или разницу между ссылкой и указателем. По-этому, я и не рассматривал такие языки как C++, C#, Java и VB.NET. Честно говоря, пока современная индустрия заставляет программистов задавать подобные вопросы до появления следующего поколения программистов, я буду полагать, что моё поколение расбрасывается возможностями.
Раннее были опубликованы ссылки на номера журнала "The Smalltalk Report" за 1991-95 гг.
Теперь доступен архив номеров за 1996 г.. Размер файла около 3,7Мб. В отличии от раннее опубликованных ссылок, этот архив содержит не отсканированные изображения страниц номеров, а нормальный текст.
Больше "The Smalltalk Report" не выходил.
Без политики похоже никуда :)
15 февраля самосформировалась команда которая берёт на себя вопросы связанные с развитием Squeak.
Естественно, развернулась дискуссия как о легитимности такого "комитета" в частности, так и о целесообразности централизованного управления вообще.
В последнее время довольно часто звучала мысль, что Squeak-сообщество сейчас малоспособно принимать какие-либо решения. Так что появление "комитета", берущего на себя ответсвенность за дальнейшее развитие Squeak может быть позитывным фактом. По крайней мере, из тех людей которые высказали своё мнение, позитивно воспринимающих такой шаг больше, чем воспринимающих негативно.
Ярлыки: squeak
В конце января ObjectConnect выпустила релиз Smalltalk/MT 5.2 (раннее была доступна бета-версия).
Smalltalk/MT 5.2 работает только под Windows 2000/2003 Server/XP, но позволяет легко использовать все возможности предоставляемые платформой. Минимальный размер генерируемого исполняемого файла - около 100К.
Если кто еще не знал, то номера журнала "Smalltalk Report" с 1991-96 гг. доступны в электронном виде.
Однако, там, по загадочной причине заголовочные (индексные) страницы в PDF. Что слегка затрудняет просмотр. По-этому, привожу прямые ссылки:
Индексный файл для номеров за 1991-95 гг.Рекомендую для того, что бы убедится как мало изменилось в технологиях программирования за это десятилетие.
С ссылками на номера за 1996 г. разберёмся следующим разом.
Но в этом случае возникает два больших вопроса:
1. Как рефакторить такой код.
2. Как вести версионый контроль.
Одно из возможных решений – писать серверные методы на клиенте с последующей копированием методов на сервер. Так как мы пишем весь код на клиенте, то проблем с рефакторингом и версионным контролем не будет.
Скопируем на сервер все методы которые находятся в категориях с названием ‘server methods’
filter := MethodCollector new protocol: 'server methods1'. methodDefinitions := (MethodCollector new select: filter). methodDefinitions do: [:each | "Копируем метод на сервер" each implementingClass compileMethodAt: each selector inGSSession: GBSM currentSession failedMethods: nil].При компиляции на сервере возможны ошибки. Хорошо бы увидеть все методы которые не прошли компиляцию.
failedMethods := OrderedCollection new. filter := MethodCollector new protocol: 'server methods1'. methodDefinitions := (MethodCollector new select: filter). methodDefinitions do: [:each | each implementingClass compileMethodAt: each selector inGSSession: GBSM currentSession failedMethods: failedMethods]. failedMethods isEmpty ifFalse: ["Открывается окно со списком методов не прошедших компиляцию с указанием причин" GbxMethodListBrowser openListBrowserOn: failedMethods label: 'Methods failing compilation' session: GBSM currentSession]Выбирать методы для копирования на сервер можно по разному. Например я пользуюсь таким способом. В каждом методе который будет копироваться на сервер вызываю метод serverMethod. serverMethod ничего не делает – это просто метка которая говорит о том что метод будет копироваться на сервер. Тогда фильтр будет выглядеть так:
filter := MethodCollector new referencesTo: #serverMethod.
Такой подход для меня предпочтительный, так как не надо загонять все копируемые методы в один протокол.
Также можно использовать другие фильтры и соединять фильтры с помощью And и Or. Более подробно рассказано в комментариях к классу MethodFilter.
В номере "ACM Queue" за декабрь/январь вышло интервью с Аланом Кеем.
Цитата:
В конце 60-х гг. Джин Сэммет (Jean Sammet) описывал около 3 тысяч языков программирования, живых на то время.Цитата:
Внедрение языков программирования происходило зачастую случайным образом, и не однократно основной акцент делался на лёгкость реализации языка, а не на его возможности. Например, Бейсик никогда бы не был выявлен, потому что были языки подходящие лучше Бейсика для той цели. Таким языком был Joss - великолепный язык созданный раньше Бейсика. Но так вышло, что Бейсик работал на системе разделения времени GE, которая была создана в Дартмуте. И когда начали выдаваться лицензии на эту систему, то начал распространятся и Бейсик. Только потому, что он работал на этой системе, а не из-за каких-либо особых качеств.Цитата:
Грубо говоря, большинство проблем в ИТ, которые мы имели за последние 25 лет, от того, что дизайнеры пытались вносить краткосрочные исправления, не думая о том, будут ли внесённые идеи масштабироваться, в случае их принятия.Цитата:
Цитата:Как только появляется нечто, развивающееся быстрее чем растёт подготовка людей, вы тут же сталкиваетесь с поп-культурой. Хорошо известно, что я пытался подавить Smalltalk в конце 70-х гг. Это были годы, когда Smalltalk был наиболее прекрасной системой в мире. Он позволял сделать что угодно более компактным и удобным способом, чем всё, что существовало до того. Но время шло. Как только мы узнавли больше и стали более претенциозными в отношении того, что мы хотели получить, оказалось что в Smalltalk есть возможности, которые не масштабируются в нужной степени. Например, возможности рефлексии. Smalltalk был одним из первых языков способных "увидеть" самого себя, однако сейчас известно, как реализовать рефлексию на всех уровнях намного лучше - значит мы должны реализовать так.
Через несколько лет мы узнали, что всё можно реализовать намного лучше. Объектная модель могла быть лучше, и т.д. И так, проблема в том - я считаю это относится и к Lisp и к Smalltalk, - что они стремятся пожирать своих детей. Я имею ввиду то, что Lisp и Smalltalk являются такими ошеломляющими средствами благодаря наличию у них мета-систем. Они способны решать задачи огромным количеством способов, чего не предоставляют языки с ранним связыванием. В результате, людям, которые любят Lisp или Smalltalk, трудно вообразить как может быть иначе.
Теперь вспомните пару фактов о Jave: в ней нет полноценной мета-системы. В Java есть проблема работы в двух, а не в одном режиме. Так, у неё есть не объекты, и объекты. В Java проблемы с динамикой. Зато у неё есть сборщик мусора. А что с того? Сборка мусора существовала задолго до того. Но это не слишком важное добавление само по себе.
В течениеи многих лет, SDK для Java реализуются на C++. Этим всё сказано.
Мы изучали Java очень детально в 1995 г., когда мы приступили к работе над реализацией, потому, что жизнено важно реализовать ядро языка. Менее всего в Java нам понравился реализации. Основано всё на старой идее, которая никогда не работала, что нужно иметь набор бумажных спецификаций, реализацию ВМ (виртуальной машины) по тем спецификациям, и, наконец, имть набор тестов, которые могут подтвердить соответсвие того, что мы только что реализовали. Так вот, такая схема никогда не приводила к полностью совместимым системам.
Технология, которую мы использовали для Smalltalk, заключалась в написании ВМ на самом Smalltalk. Таким образом, у нас всегда был симулятор ВМ на Smalltalk, который и являлся спецификацией ВМ. Вы можете отлаживать ВМ, и вы можете узнать, что будет делать ВМ в том или ином случае, просто "скормив" ей код, и все изменения в ВМ вы вносите изменяя симулятор. После того, как всё отлажено, вы нажимаете кнопку, и, без всякого вмешательства человека, будет сгенерирована математически корректая С-версия, которая будет работать на любой платформе, на которой вы её проверяли.
В результате, сегодня эта система, называемая Squeak, идеинтично работает на более чем двух десятках платформ. Java этого не умеет. А ведь что такое Интернет? Это необходимость идеинтичного выполнения на всём, что подключено к Интернету. Итак, Java, для меня, всегда нарушала одно из основных требований к разработке ПО в мире Интернета.
Как только мы поняли, что Java, скорее всего, не будет совместима между платформами, мы сказали, что мы создадим свою систему, которая будет абсолютно совместима между платформами, и мы сделали это.
Кто угодно может так сделать. Если бы профессионалы в Sun имели возможность исправить Java, то мир стал бы более приятным местом. Это не секретное знание. Это секретное знание для поп-культуры.
Это было для меня большим открытием, я был тогда в аспирантуре, когда я понял, что пол листа кода, в верхней половине страницы 13 в руководстве по Lisp 1.5 был Lisp на самом себе.Цитата:
Smalltalk, в некотором смысле умер, как только настоящие программисты поняли, что он может быть полезен. Программисты изменили его по своему образу, и он начал терять свои возможности направленные на конечного пользователя.Цитата:
Одна из мыслей, к которой приходят люди изучая расширяемые языки, это то, что невероятно тяжело сделать мета-систему лёгкой в использовании. Smalltalk-72 использовали дети. Вы всегда расширяете язык, даже не осознавая этого, просто создавая классы. В результате, вам не нужно пользоваться такими эзотерическими инструментами как компилятор компиляторов - Yacc или нечто похожее - только для того, что-бы что-то добавить в язык.
Но, на обратной стороне монеты тот факт, что даже очень хорошие программисты и дизайнеры языков склонны делать ужасные расширения в пылу программирования, потому что дизайн это то, что требует спокойствия и осторожности.
Ярлыки: interview
Одной из самых больших проблем тестирования пользовательского интерфейса является его интерактивность. Часто для выполнения тестового сценария необходимо получить подтверждение пользователя на выполнение определенной операции.
Например:
(MessageBox confirm: 'Do you want to overwrite this file?') ifTrue: [...]
Традиционным способом решения этой проблемы является вынесение всех обращений к классу MessageBox в отдельный объект-адаптер с последующей его заменой на mock-object.
Но в Smalltalk возможен еще один более простой вариант благодаря наличию продолжаемых исключений (resumable exceptions).
Во-первых, сначала необходимо создать собственный подкласс класса Notification (это исключение по-умолчанию является продолжаемым):
Notification subclass: #ConfirmationNotification instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' classInstanceVariableNames: ''
В коде везде, где требуется подтверждение, пишем следующий вызов:
(ConfirmationNotification signal: 'Do you want to overwrite this file?') ifTrue: [...]
Тогда тестирование сценария с подтверждением может быть осуществлено следующим образом:
testExample1 [ Тестовый вызов testedObject doSomething] on: ConfirmationNotification do: [:n | Эмулируем подтверждение n resume: true]. Поверяем, что действие выполнено
Это вариант с одним подтверждением. А что делать, если их может быть несколько по различным поводам? Первый способ, это использовать поле исключения tag, которое передается с помощью сообщения #signal:with:. Второй способ, это создавать различные подклассы ConfirmationNotification. Он более предпочтителен, когда определенные виды подтверждений встречаются регулярно.
С тестами разобрались, а как теперь сделать, чтобы реальное приложение показывало диалог в соответствующих местах?
Как правило, любое приложение имеет центральный обработчик исключений, отлавливающий ошибки в обработчиках событий верхнего уровня. Именно в него и следует внести поддержку подтверждений:
Object>>handleDomainErrors: aBlock
aBlock
on: Error do:
[:e | MessageBox errorMsg: e messageText caption: 'Error']
on: ConfirmationNotification do:
[:n | n resume: (MessageBox confirm: n messageText]
Далее нужно лишь убедиться, что все события верхнего уровня содержат вызов этого обработчика:
someTopLevelEventHandler self handleDomainErrors: [ Выполнить необходимые действия ]
P.S. Примеры кода приведены для Dolphin Smalltalk, поэтому обращение к классу MessageBox должно быть заменено на эквивалентное действие в других диалектах. Дополнительно, в VisualWorks Smalltalk сообщение #signal: следует заменить на #raiseSignal:.
Andreas Raab описал в каком направлении будет двигатся Tweak.
Есть так же ряд проектов, в которых могут быть заинтересованы люди, но работа над которыми пока не будет вестись. Это портирование традиционных Smalltalk инструментов на Tweak и поддержка "родных" виджетов (native widgets).
Ярлыки: squeak