Standard eXtreme programming emphasises the great importance of test-driven development - of the model layer of an application. Testing the UI layer, whether while developing it or afterwards, is treated much more lightly: prominent advocates of XP have suggested it can be largely and safely ignored. Experience taught the author that ignoring UI testing has costs. He therefore developed patterns that, with little extra coding, extend XP tests to the UI layer. He uses these in his projects, including in his open-source project, where portability of the tests across dialects is also of value. The talk will briefly overview UI testing approaches in Smalltalk and then present the patterns in detail. It will end with a discussion to share experiences and approaches.
See you in Toronto!
Technorati Tags: smalltalk
On today's Smalltalk Daily, we build up a base development image again - but this time, we script the entire process. It turns out that you can have the system file in a Smalltalk script at startup with the -filein argument - and that allows us to fully automate image builds.
Technorati Tags: smalltalk
Nick Carr has a provocative take on Open Source development - taken from the perspective of the individual developer. I'm not sure I'd go as far as Nick does with this, but it's worth a few moments thought - and I think he's absolutely correct that the software market is driving faster and faster away from license revenue and toward a service model.
There aren't any spoilers here if you're worried about that - I have a simple question though: Do the writers have answers up their sleeves, or is this more like "X-Files", where they are just making it up as they go along, dropping some plot points into the ocean, and creating new ones like mad? At the moment, I'm leaning more towards the "X-Files" theory.
In this talk we will go through the process of securing a web server using SSL protocol and X.509 Certificates. We will discuss certificates and why they are needed and how to use them with SSL protocol to achieve various security objectives. As time permits we will conclude with a discussion of various practical aspects and performance considerations. Everything will be discussed in the context of live demonstrations using VisualWorks.
See you in Toronto!
Technorati Tags: smalltalk
Eric Lundquist notes a possible bump in the road on the way to "Software as a Service" nirvana: The difference in cost for vendors between traditional product sales and those of server farms. He says this about the traditional license route:
Selling software was once such an easy job. Since most of your costs were associated with creating your first copy of the software, you knew that if you had even a moderately successful product, you could make a lot of money, as every subsequent copy would cost only pennies but would be sold for dollars. Companies that got the formula correct -- Microsoft comes immediately to mind -- enjoyed revenues and profit margins that were the envy of the entire business world.
That over-simplifies a bit - in particular, you do have the ongoing development and maintenance tasks (it's not as if Word 1.0 is still shipping, unchanged). However, you still have this cost with SAAS - you can update online apps more easily, but you still need to staff on hand to do that work. So in this sense, the two are the same. There is an additional cost, however:
The second consequence is the capital investment hangover. Financial analysts have no patience and will not look favorably on big capital investments that do not drive immediate service revenues. Technology executives will have to learn what steel mill executives discovered long ago: Capital investment is not a one-time event. That server farm you built last year will soon require another big round of investment to stay current and efficient.
The cost for a large server farm dwarf the costs of the machines you buy for your staff - which is why I think this cost isn't really going to be borne directly by most companies looking to build out services to sell. Rather, they'll be going to Google, or Amazon, or Joyent, and paying a utility fee to have them host their services. What this change is going to do is push the move to a utility model even harder.
Here's a security tale that will either make you laugh out loud, or pull your hair out (depending on whether you live in Europe and whether you care about Windows *cough* security *cough*). If you have Windows Vista installed in Europe, you can't lock out USB devices unless you install Windows Media Player. Why?
The ability to block read/write access to removable storage devices via Group Policy depends on the presence of the Portable Device Enumerator Service, which is not installed by default in the Vista Business N edition. We discovered this because we accidentally installed this version of the operating system on our test machines. Vista Business N is a Europe-only edition that complies with the EU mandate that Windows Media Player be decoupled from the operating system.
Unfortunately, the Portable Device Enumerator Service comes with Windows Media Player rather than with the base Vista operating system, so the N versions of Vista won't get the feature without installing the Windows Media Player or kludging together a different workaround.
Some people are going to sniff an evil plan from MS here, but I seriously doubt it. I'll echo something I heard Doc Searls say on last week's TwIT podcast - "Never ascribe to malice what can be explained by incompetence".
Technorati Tags: stupidity
I'll be giving a roadmap presentation at Smalltalk Solutions this year - if you can't attend, you can at least have a look at my presentation (PDF). I'll be happy to answer questions about it as well - and, if we have network connectivity at the podcast next Monday, I'll field queries from the IRC channel. If you want to ask questions for the podcast, we'll be doing that at 5:15 PM Monday. I don't have anything in place to stream it live though :/
Update: Link to the PDF is fixed.
I did a screencast yesterday on automating the build of a development image; after fielding a few questions, I figured I'd post the relevant scripts. First, I use this workspace script to save my Store Repository profiles out to disk:
fname := 'connects.txt' asFilename writeStream. Store.RepositoryManager.Repositories do: [:each | 1 to: each class allInstVarNames size do: [:evar | | obj | obj := each instVarAt: evar. obj isNil ifTrue: [fname nextPutAll: 'nil'] ifFalse: [fname nextPutAll: obj]. fname nextPut: $,]. fname nextPut: Character cr]. fname close.
That saves my repository information out to a simple, comma/CR delimited flat file. With that, I can automate the build of a development image with a script like the one below (obviously, the mix of parcels and store package/bundles will vary):
| fname list | "do initial parcel load" #( '$(VISUALWORKS)\database\oraclethapiexdi.pcl' '$(VISUALWORKS)\contributed\postgresql\storeforpostgresql.pcl' '$(VISUALWORKS)\store\storefororacle.pcl' '$(VISUALWORKS)\contributed\sunit\sunitui.pcl' '$(VISUALWORKS)\parcels\rbsunitextensions.pcl' '$(VISUALWORKS)\net\netclients.pcl' ) do: [:each | Parcel loadParcelFrom: each]. "read in Repository settings" fname := 'connects.txt' asFilename readStream. list := OrderedCollection new. [fname atEnd] whileFalse: [ | prof str line i | line := fname upTo: Character cr. str := line readStream. prof := Store.ConnectionProfile new. i := 1. [str atEnd] whileFalse: [ | next | next := str upTo: $,. next = 'nil' ifTrue: [next := nil]. prof instVarAt: i put: next. i := i + 1]. list add: prof]. fname close. list do: [:each | Store.RepositoryManager addRepository: each]. "connect to Store" profile := Store.RepositoryManager repositories detect: [:each | 'cincomsmalltalk' = each name] ifNone: [nil]. profile ifNil: [^self]. Store.DbRegistry connectTo: profile. "load a bundle" (Store.Bundle newestVersionWithName: 'RSSBuilding') loadSrc. "disconnect" Store.DbRegistry disconnect. "save image" ObjectMemory saveAs: 'team' thenQuit: false
It probably makes sense to split the individual sections out, and to create "manifest" files of parcels/package to load - but you get the idea. This is a nice, simple way to automate a build - and you don't even need to "doIt" after starting your image. Instead, start the base visual.im as follows:
visual visual.im -filein build-team.st
That's it - works nicely for me
Technorati Tags: smalltalk
Jason Calacanis has boiled down the entire problem that print media has to a small paragraph:
I think that people may have underestimated exactly how dead print is as a NEWS carrier--and why. Print is dead in the news role because it can't keep up with the conversation--not because people don't like print per se.
That's pretty much it. The reporters at the NY Times, the WaPo (etc) still want to be breaking stories. The problem is, they can't accomplish that in print - and like any other mature business (RIAA, anyone?), they are having trouble adapting to the new reality.
This talk and short demonstration discusses the experience of choosing and using an application framework for Smalltalk based development. Discussed are factors such as what an application framework is, what it should do for us and some criteria for selection. Two known frameworks are contrasted and discussed, and an example of the chosen framework is given. Finally, the experience of years of use of the chosen framework, its advantages and disadvantages are discussed.
See you in Toronto!
Technorati Tags: smalltalk
Rogers Cadenhead notices an interesting bit of syndication news:
The largest email-based RSS service was sold to NBC Universal this week, an event that's curiously absent from the tech press. Randy Charles Morin's R-Mail was purchased by the entertainment network for an undisclosed amount.
The service has 50,000 users, 100,000 subscriptions and sends out more than 50,000 e-mails per day, according to DMW Daily , though I suspect a zero's missing from the last figure. When I wrote about R-Mail last August , it had 20,000 users.
This kind of thing could be the breakout from niche to general that syndication advocates (myself included) have been expecting. An awful lot of corporate staff "live" in email - and this is an easy way to reach them.
SciFi Wire reports that the summer will have watchable TV - Dr. Who is returning July 6th.
Based on the comments I got on yesterday's post, you can tell that I missed a feature of the product - the ability to save/restore Store Repository information is built in - so you don't need to extra bit of code I used. With that in mind, I've done a "correction" Smalltalk Daily, which adds that information.
Technorati Tags: smalltalk
You can file this under "you learn something new every day". Yesterday, I posted on automated image builds - and had a bunch of people point out to me that you can save/restore repository information with stuff that's already lying around in the image. To wit: see the image below:
After you export that, the build script changes as follows:
| fname list | "do initial parcel load" #( '$(VISUALWORKS)\database\oraclethapiexdi.pcl' '$(VISUALWORKS)\contributed\postgresql\storeforpostgresql.pcl' '$(VISUALWORKS)\store\storefororacle.pcl' '$(VISUALWORKS)\contributed\sunit\sunitui.pcl' '$(VISUALWORKS)\parcels\rbsunitextensions.pcl' '$(VISUALWORKS)\net\netclients.pcl' ) do: [:each | Parcel loadParcelFrom: each]. "read in Repository Information" Store.RepositoryManager importRepositoriesFromXmlOn: 'repositories.xml' asFilename readStream. "connect to Store" profile := Store.RepositoryManager repositories detect: [:each | 'cincomsmalltalk' = each name] ifNone: [nil]. profile ifNil: [^self]. Store.DbRegistry connectTo: profile. "load a bundle" (Store.Bundle newestVersionWithName: 'RSSBuilding') loadSrc. "disconnect" Store.DbRegistry disconnect. "save image" ObjectMemory saveAs: 'team' thenQuit: false
See that one liner for reading in repository information? That's the change. Now, there is a -settings option, but here's the problem: If the settings file has repository information, and you haven't loaded in any Store drivers... you have a chicken/egg issue. So instead, I just have the one liner that reads in repository settings files in the build script.
I won't be able to attend ESUG 2007 this year, but other Cincomers will be there. If you're interested in speaking, they've just made a call for participation:
15th International Smalltalk Joint Conference - Call for Contributions
August 25 - 31, 2007 - Lugano, Switzerland
For the past 14 years, the European Smalltalk User Group (ESUG) has organised the International Smalltalk Conference, a lively forum on cutting edge software technologies that attract people from both academia and industry for a whole week. The attendees are both engineers using Smalltalk in business and students and teachers using Smalltalk both for research and didactic purposes.
As every year, this year's edition of the largest European Smalltalk event will include the regular Smalltalk developers conference with renowned invited speakers, a Smalltalk camp that proves fruitful for interactions and discussions. Besides, this year will be held the 4th edition of the Innovation Technology Awards where prizes will be awarded to authors of best pieces of Smalltalk-related projects. Last, but not least the event includes as usual a research conference which was renamed this year into "International Conference on Dynamic Languages". This reflects the widening of the scope of this conference to enable cross-fertilization with research conducted using other dynamic languages.
You can support the ESUG conference in many different ways:
- Sponsor the conference. New sponsoring packages are described here
- Submit a talk, a software or a paper to one of the events. See below.
- Attend the conference. We'd like to beat the previous record of attendance (116 people at Köthen, Germany in 2004)!
- Students can get free registration and hosting if they enroll into the the Student Volunteers program. See below.
The conference features the following events:
- Camp Smalltalk
- Developers Forum
- Research Forum
- Technology Forum
Developers Forum : International Smalltalk Developers Conference
This year we are looking for YOUR experience on using Smalltalk. The list of topics includes, but is not limited to the following:
- XP practices
- Development tools
- Experience reports
- Model driven development
- Web development
- Team management
- New libraries & frameworks
- Educational material
- Embedded systems and robotics
- SOA and Web services
- Interaction with other programming languages
Submissions due on 30th of May 2007
Notification of acceptance on 15 of June 2007
More information is available here
Research Forum : International Conference on Dynamic Languages
Smalltalk is one of the oldest object-oriented languages, but its conception and programming environment can still be considered as a design pearl and as a beacon in the realm of programming languages and programming environments. The bulk of its modern contenders are still lacking many of the features that Smalltalkers find both mundane and essential. Nevertheless, as software engineering practices and new application fields evolve, Smalltalk should keep up. This concerns the language, its implementation technology, its programming tools as well as the software development culture it supports. The research forum invites scientific articles that report on original research conducted in and/or for Smalltalk. The list of topics includes, but is not limited to the following:
- Aspects, Aspect languages and Applications
- Ambient Intelligence, Ubiquitous & Pervasive Computing
- Embedded Systems
- Compilation Technology, Optimization, Virtual Machines
- Language Engineering, Extensions
- Model Driven Engineering
- Programming in the Large, Design, Architectures, Components
- Development Environments
- Program Analysis
- Reflection and Metaprogramming
- Agile Techniques
- Web Services & Internet Applications
More information is available here
We are proud to announce the 4th Innovation Technology Awards. The top 3 teams with the most innovative software will receive, respectively, 500 Euros, 300 Euros and 200 Euros during an awards ceremony at the conference. Developers of any Smalltalk-based software are welcome to compete.
More information is available here
Student Volunteer Program
If you are a student wanting to attend ESUG, have you considered being a student volunteer? Student volunteers help keep the conference running smoothly; in return, they have free accommodations, while still having most of the time to enjoy the conference.
More information is available here
Noury on behalf of the ESUG board
Dr. Noury Bouraqadi - Enseignant/Chercheur
ARMINES - Ecole des Mines de Douai - Dept. I.A.
European Smalltalk Users Group Board
Time for the weekly look at the logs - BottomFeeder downloads perked up to 191/day last week:
HTML page traffic was up a bit - the Mozilla usage was, too:
|Tool||Percentage of Accesses|
The syndication traffic was up a bit as well - that distribution:
|Tool||Percentage of Accesses|
|Net News Wire||5.1%|
|Google Feed Fetcher||4.5%|
|Strategic Board Bot||2%|
It's interesting to see the syndication stats for IE go up, while the HTML accesses for it stay about the same. Not sure what that means :)
The next edition of "Industry Misinterpretations" is going to be recorded on Monday afternoon, after the coding contest at Smalltalk Solutions - so if you would like to come by and throw us some questions, come to room 201F at the convention center at 5PM. I'm not sure how long we'll go - we don't normally record for more than 40 minutes or so. See you there!
I just finished reading Malcolm Gladwell's "Blink", and it was one of the most compelling little reads I've had in awhile. Gladwell does a great job of breaking down the way we make "snap judgments" - and how they can be both better and worse than a considered opinion - depending on things like visual cues, the overall flow of information, and our pre-existing (and not necessarily conscious) prejudices. It's a book that will make you ponder the way you think and act.
It looks like the folks over at Skype (owned by EBay) - have allowed a lawyer to play at PR:
Skype lawyer Seema Sharma emailed blogger Jan Geirnaert Friday afternoon. She told him his popular skype-watch.com and skype-gadgets.com blogs put him in legal jeopardy.
Boy, that theory of operation worked so well for Warren Kremer Paino, and again for JL Kirk and Associates. Now it looks like Seema Sharma has stepped up to play "just how bad can I make my company look?" Do lawyers actually understand the way things work now? I can certainly understand Skype being concerned over the possible confusion with an unaffiliated site using their name - but would it have been too hard to try a soft approach first? A polite phone call by a non-lawyer - with some reasonable accommodation reached - would have been a lot smarter. Consider how Microsoft dealt with Mike Rowe, for instance. They started off stupid, but understood what was happening fairly quickly. If Skype has any sense, they'll slap the lawyer down and send in PR - stat.
Reading my ongoing commentary about DRM, you might come to the conclusion that I'm against the whole idea of copyright. Not so much - and I think Dare Obasanjo just summarized the rationale behind copyright far better than I could - in a piece that does a take-down on TechDirt's "information wants to be free" take on the matter.
The arguments on TechDirt seem to boil down to this: "I like stealing music, so let me construct an argument that rationalizes my behavior". My anti-DRM stance is different; I think that the music industry is doing immense damage to itself by treating their entire customer base like criminals. That doesn't mean that I think we ought to live down to their theory.
Technorati Tags: DRM
Here's a tip for those clever folks who use DRM to keep us law abiding people from legally using stuff we paid for on a variety of devices we own: If you send out a "take-down" letter to someone who's posted AACS keys for a DVD online, don't include those keys in the urls you send along with the take-down. You already look stupid; no need to make it even more obvious.
Technorati Tags: copyright
Next Stop: Toronto. Signing off the BWI WiFi, and heading to Air Canada. See you there!
I would have thought that Sony was full up on bad PR, but boy - was I ever wrong. They staged a promotion for "Gods of War II" that included a freshly slaughtered goat:
Electronics giant Sony has sparked a major row over animal cruelty and the ethics of the computer industry by using a freshly slaughtered goat to promote a violent video game.
The corpse of the decapitated animal was the centrepiece of a party to celebrate the launch of the God Of War II game for the company’s PlayStation 2 console.
I'd love to know which genius at Sony thought that would be a good idea...
I made it to the (rather small) hotel last night, and now it's time to hunt up some breakfast.
Dave Buck is making his training material available on CD:
As an alternative to or in addition to instructor-led training, Simberon will be providing Smalltalk training on CD-ROM.
Well - the network situation this year is marginally better. I can actually get to a hotspot, but I have to pay $13 (CDN) for a day pass. That gives me network access as I sit here in the "Ruby for Smalltalkers" tutorial with Chad Fowler.
So - to get started on that, Chad's pointing out that Ruby is a lot like Smalltalk, albeit without the image or tools. So for instance - in the interactive interpreter, you can list the methods for a Ruby class, similarly to what you could do in an inspector. Interesting side point here - Ruby is serving as a "gateway drug" for a lot of companies - so it may help get other niche languages - Smalltalk, Erlang, Lisp, etc.
On to Ruby: Variable types
- $variable - begins with a $, so it's global
- local variables (scoped to the area they are defined in - method, class, etc)
- Pop an @ sign at the front - you get an instance variable
- Class variables exist as well
- Constants exist as well - assignments that begin with a capital letter are Constant (and global)
Heh: "Java is written for Stupid People". Does not mean that all Java developers are stupid; rather, it means that Java attempts to protect you from yourself, such that intelligent developers get frustrated with the shackles.
One of the interesting shortcuts possible in Ruby is that "self" can be an implicit receiver of methods. So instead of:
you can do
Which would be the same as:
Another interesting thing: I can, within a method, invoke super (without the method name or arguments), and have all of the arguments sent to the current method implicitly sent up. That also means that you can't have super invoke a method other than the one of the same name as the one you're in (which, while it would be bad practice most of the time in Smalltalk, is possible).
So here's a class definition with some methods:
class SomeClass def make_one superclass.new end def a_method(a_parameter, another = 123) @local_here = "whatever" end end
So what about naming conventions for methods and/or parameters? There really aren't widespread conventions there. If you're looking at a class and set of methods, how do you tell what arguments the methods take? Documentation, source (etc).
The most interesting part of this session is how the audience is interacting with Chad - it's like twins that have never met, have some differences, but get along famously.
Back to Ruby - conditionals in Ruby are syntax. They have if-then-else and elseif. Some examples:
if a > b puts "yes" elsif b > c puts "asdf" else puts "no" unless 2 > 1 puts "abcd" end puts "it is" if 2 > 1 puts "hi" unless false while a > b puts "yes" end for i in (0..2) do puts i end
This is all different than Smalltalk, but then again, likely much more comfortable for people coming in from Java (etc). Another example:
1.upto(10) do | num | puts num*2 end Is like 1 to: 10 do: [:num | Transcript show: num*2]. to define a block (closure): the_block = lambda do | num | puts num * 2 end 1.upto(10, &the_block) or invoke the block: the_block.call(123)
Blocks cannot be serialized. At this point, there was a rather long trip down a rathole as to why Ruby blocks can be used the way they are, and I have to admit I zoned out on that - Why they are structured the way they are is less relevant than the simple fact that they are set up that way. So we're taking a break here, and we'll get on to Rails afterwards. I'll push that as a separate post.
Technorati Tags: smalltalk
So part 2 - Ruby on Rails. First - use the packager and install Rails. "What is Rails?" Rails is a wrapper around a bunch of other little frameworks. The core is made up of ActiveRecord and ActionPack. ActiveRecord is a simple O/R mapping pattern. ActionPack implements the web-facing piece, implementing an MVC pattern for the web. The big thing to remember about Rails is this:
Convention over Configuration
One of the results of this is that using Ruby, you don't end up arguing over things like "which db framework, which directory structure...", etc. etc. So the first step - create an ActiveRecord subclass for the first bit of the domain, and then use some Ruby code to create a table for it. The class Chad created has more fields, but you get the idea:
class CeateContacts < ActiveRecord::Migration def self.up create_table :contacts do | t | t.column :first_name, :string t.column :last_name, :string t.column :created_at, :datetime end end def self.down drop.table :contacts end end Class Contact < ActiveRecord::Base end
That last bit does the class to table mapping. That's it - by following this convention, we have the mapping. Note that we didn't worry about primary keys, SQL (etc, etc). You can name various columns in ways that will automatically map to the database in intelligent ways.
There's a nice log being kept for you that saves a record of your database interactions; this can be useful for figuring out what SQL is being created, and where you may need to tweak.
Some more code - a controller (the handler for actions on the back end). There would typically be a view here for rendering, but we are just being simple (like my web examples in my screencasts :) )
class ContactsController < ApplicationController def index @contacts = Contact.find(:all) render :text => @contacts.inspect end
Now a new View HTML Page (in its own directory structure spot) to handle the rendering. Like web toolkit (and other web frameworks), there's a way to embed Ruby code in pages
<html> <body> <h1>Contacts!</h1> <ul> <% @contacts.each do | contact | %> <li><%= contact.first_name %><%= contact.last_name %></li> <% end %> </ul> </body> </html>
Simply change the controller to eliminate the specific rendering using inspect. The framework also handles giving you basic forms for editing domain objects based on the Ruby and DB definitions. There are a number of built in things for pagination, number of items per page (etc, etc).
With respect to code generation, Chad finds it to be mostly useful for "getting started" and setting up the initial scaffolding.
Technorati Tags: smalltalk
I walked into this one late - the pub we hit for lunch wasn't really ready for a sudden flood of 20 people :) So - I came in to hear Joseph talking about "retrospective coherence", which we discussed in this podcast awhile back.
Here's a good question: "How long from here to Ottawa?" - Answer: 4 hours. The problem: how many implicit assumptions are built into that answer (by car, with what kind of traffic, in what kind of weather, etc.).
What is Agility
- It's not just going faster with less process
- It's a discipline
We call it the art of the possible. In fixed price contracts, customers don't get to change their minds (except later, at an additional cost. In an agile contract, customer pays for every iteration, can change direction after every iteration, and gets a running (viable) system after each iteration. If you do this right, you can start delivering value in as little as 2 weeks.
Scrum is a system for managing work in a socially complex domain. One where there is uncertainty due to unfairness/emergence issues (technology change is an example of the latter). It's been around since 1990, and doesn't say anything at all about the engineering process itself. Interestingly enough, it can be used in a fully CMM level 5 fashion (making it Enterprisey ready :) ).
Interestingly enough, one of the first software product uses of Scrum was at Easel on the Enfin product (Enfin is the predecessor of Cincom's ObjectStudio). One of the biggest priorities of Scrum is keeping the product backlog open as a living document. It needs to be revisited at the end of each iteration and updated to reflect new information. So with that, we have the first break - we'll go through the Scrum practices after the break. So - stay tuned for the next post :)
Technorati Tags: smalltalk
Heh - Being late from lunch to the first part, I missed the opening, where Joseph ran a video of an unmanaged - but efficient - traffic intersection. No lights, no signs, seeming chaos - but no accidents, and continuous flow.
So on to Scrum Practices:
- Iterations of 1 to 4 weeks
- Team builds functionality that includes product backlog and meets Sprint goals
- Team self-organizes to achieve goals
- Team conforms to existing standards and conventions
- Abnormal termination of Sprint:
- Team can cancel Sprint if the goal of the Sprint is deemed to be unattainable
- Product owner can cancel based on external circumstances changing
An interesting heuristic for Sprint length: How long can management shut up and allow the team to work? Another interesting comment: "The purpose of meetings is to keep people from taking responsibility".
- Takes ownership of the backlog
- Can be influenced by committees, management, customers, sales (etc)
- Responsible for ensuring that the most important business functionality is delivered first
- Ensures that one (and only one) set of requirements drives the project
- Eliminates the confusion of multiple bosses, interference, etc
- Cross Functional
- Selects the iteration goal and specific work results
- responsible for committing to work
- Self organizing
- Authority to do whatever is required to meet goals
- Open, co-located space
- Demos work results to the Project Owner
Ideal team size: Seven +/-2. That's the largest size that can sit at a table and all engage in one conversation.
- Responsible for establishing Scrum practices and rules
- Representative to management
- Representative to team
- A coach
- Engineering and Development skills
- Agile version of IT project manager
The Lead developer really can't be in this role, due to conflict of interest issues. A Scrum Master can be defined as a "Servant Leader".
There are few roles and few practices - Scrum is low overhead. There's a Product Planning Meeting, where requirements emerge. From that, a product backlog gets put together - this consists of functional and non-functional requirements. Anyone can add to the backlog, but the Product Owner is the only one who prioritizes.
Estimates for work - like produce - have a "sell by" date, and that date is the end of a Sprint. At the end of a Sprint, the estimate will either be past (i.e., functionality delivered), or need revisiting. Joseph recommends this book: "Agile Estimation and Planning" by Mike Cohn, as a good source of information about how to do agile planning.
Scrum Planning Meetings:
- What's on the backlog
- What are the Team Capabilities (who can do this?)
- What are the Business Conditions?
- How stable is the technology? What's Changed?
- Executable Product Increment (what did we do last Sprint)
The goal is to plan the next sprint.
Daily Scrum Meeting:
- 15 minute status update - trick to get people there on-time: last in talks first
- Same place/time every day
- Meeting room
- "chicken and pigs"
- Three questions:
- What did you do yesterday
- What will you do today
- Do you have any impediments blocking your progress?
- Impediments and Decisions
Another thing here - Joseph recommends lightweight tools. Index Cards, Spreadsheets, web-based equivalents for distributed teams.
- What did we do?
- New priorities set
- Team devises solution to most vexing problems
Common complaints as to why "it won't work for us"
- We don't have the right people
- Requires business involvement
- Project is too big for Agile
- Project is too complex for Agile
In all these cases, there's a business problem. You know you're doing Scrum when "things come together" - you realize that you can start a project without all information, the team starts to work as a team of developers.
Technorati Tags: smalltalk
We recorded today's podcast at Smalltalk Solutions, in the room where the Coding Contest was wrapping up - download the podcast to get the results. We had all of us - myself, Dave, Michael, and James Savidge together in one place for the first time ever, and we also had a pretty full audience to play off of. We discussed today's talks at the show, the Coding Contest, and some news from Gemstone. Check it out - it was a lot of fun to do this week!
There are two interesting pieces of news out this week that could lead to different ideas of what the future of development is going to look like:
- The Microsoft announcement of cross platform support for the CLR, which includes improved dynamic language support. Add in the JRuby work (and the presumed JVM improvements for dynamic languages), and you start to think that it's all about two platforms
- Amazon just re-priced Elastic Computing - bandwidth charges dropped.
The first case leads you think that the VM platforms matter a lot - the second makes you wonder whether they matter at all. If you use S3 and ECL, no one knows (or cares) what you are running, so long as it scales sufficiently. And it will scale sufficiently either via work on your end, or the virtual throwing of more hardware (ECL VM instances) at it.
I don't know how it will come out, but I don't think it's as simple as "it's all about the platform".
Technorati Tags: management
This morning's talk is with Thomas Gagne, who is the technical lead for InStream Services. Thomas is going to talk about how they use databases, and how they map objects into them. Thomas has an interesting take on this field: his assertion is that there is no Object/Relational impedance mismatch. You can read Thomas' take at his blog.
- The database is the biggest object in the system
- The database is the most important object in the system - everything else is cosmetic
- The database is not invisible
The database is a Semantic Persistence Store (SPS) - a self contained component for managing data. Other examples of an SPS: X.500 Directory Services, Domain Name Service (DNS).
Another concept: Message Oriented:
- Communicate between two loosely components
- Characterized as the message having its own identity
- Its own Object
- Believed by Alan Kay to be very important
So what is the O/R impedance mismatch? The attempt to map tables and columns to objects and methods. At the bottom, OO and RDB are similar but fundamentally different. In Thomas' shot, there is no separation between the OO and Relational people - the same staff handle the applications and the database.
So why are we here? Assertion: The impedance mismatch does not exist in OLTP systems. OLTP is loosely coupled and highly cohesive. Observations:
- Business came before the technology
- The technology is there to assist people
- Private Data
- Activation via message sending (late binding being important)
How is an SPS like a Smalltalk Object? It's a subclass of a more general database. It can dehydrate and rehydrate. It's a state object, it's a singleton. The database is reflective (you can ask the database questions about its structure). Reacts poorly to tight coupling - changes to internal data can be hidden behind an API.
How do they differ? A database does not enforce API only access (variables are public by default). So now Thomas is off to an example - a simple banking application with four methods: login, logout, add money, remove money. The idea is that by giving the database an API (stored procedures in this case), you isolate it from changes at the application level. They don't have application level SQL at all - they have "guarded" the database with a stored procedure API.
What's coming for VA? Windows Vista support and support for SuSe Linux look like the two main things. They'll have direct support for User Account Control (including registry access, file access, etc). VA Smalltalk makes use of the standard Vista manifest for this stuff. Setting up Envy servers still requires admin access rights.
They have support for Aero if you turn on the Vista theme support - that's done in the application manifest file. This support is in VA 7.5 and up only. The SuSe linux support is the same as RedHat - the new thing is formal support. They now have large address support (up to 3 GB in Windows). You need to link VA Smalltalk executables with specific switches.
They've added Oracle 10 support. That includes BLOB and CLOB support. There's also been a lot of bug repair in the Oracle and DB layer support.
They've upgraded the documentation for Web Services, including a Web Services Demo. This includes a set of tools to make the process of building WS* stuff easier. They've made loading the Refactoring browser and "Mastering Envy" extensions to it simpler (at the Envy load level). They are also including the SUnit Browser, and plan to integrate it into the RB.
Envy/QA is now part of the base, rather than an additional purchase. Interesting side note in a discussion of goodies/contributions - there's no free download available, so you need to contact Instantiations if you would like to contribute.
The browser has gotten an icon refresh, such that they look better on Windows and Linux. As to the future?
- Seaside - needs continuations which VA does not have. They are looking to either change VA contexts, or do some image level work that would emulate and get them "close"
- Web Services - XML Editor, Wizard tools, diagnostic tools
- IDE Enhancements - a lot of consolidation of formerly extra tools into the base. On Windows, move to Windows controls for tools.
- Installation - Consolidate the installers for client/server (Envy) into one. Work more seamlessly with Windows Vista UAC. Work on supported Unix/Linux w/o manual intervention
- Documentation - Update docs to PDF or Windows CHM. Investigate the future of F1 help.
Since version 7 (2004), they've had over 5000 downloads, about 2000 active users, over 200 active customers. Support is mostly moved from the old IBM forums to Instantiations own site. Pricing is still the same as it's been.
Technorati Tags: smalltalk
Next up: Aik Siong Koh with a talk about 3D CAD and Motion Simulation. The motivation driving him is that UIs in general seem to be moving in this direction (virtual reality games, Croquet, Second Life). Why Smalltalk? CADSM is very complex - Smalltalk is time tested and simpler. VisualWorks gives him platform independence.
What is freeCAD?
- Basic 3D CAD with advanced motion simulation
- Imports DXF (AutoCAD) and STEP (ISO Standard format) files
You can grab this stuff at askoh.com. Cool - he tried running this stuff on the OLPC an hour ago, and freeCAD worked - meaning, VW works there :)
Looks like the rest is a demo, so your best bet is to download it and try it yourself. The math problems are gbeing solved using StMath, which is part of the overall package (you can get that in the public store). Future work?
- Improve GUI and Solid Modeling
- Port to Squeak and Croquet
- Port to OLPC
- Motion add-ons for other CADs
- Control robots and CNC machines
- Finite Element Analysis
- Computational Fluid Dynamics
- System simulation (Modelica)
He's looking for volunteers to help out :)
Technorati Tags: smalltalk
Last talk of the day (not counting the STIC event later), and it's Michael Lucas-Smith talking about Smalltalk and C interfacing. First question: Why do we bother with C? C is the "standard" level of access to operating systems, databases, libraries, etc. It's what you use if you want to reuse.
There are two main ways to interface: wrap an interface into the VM via primitives (relink/recompile the VM), or use a foreign interface (like DLLCC). There's a third way: Recompile the foreign library such that it can talk to you. This is the best way to get C++ apps (that don't have a C API) to have an interface. Python does this heavily, and has some partial automation in that direction.
- C Header Parser (has limitations, more or less dated to the K&R spec)
- You end up doing the interface "by hand"
- VW does have good error handling with calls out to C, and can handle threading C calls.
- C functions defined in a large pragma definition
- Structs are subclasses of OSObject or OSPtr
Squeak, Dolphin, and VW are similar in terms of how they talk to C - Squeak does have the interesting VMMaker thing.
- Limit description of the interface
- Modify the VM by including the definition and recompiling
- In your Smalltalk code you basically add a primitive
- Dynamically compiles C code inline in a Smalltalk method - you can write C code in your methods
So - how do other languages do this? Python uses BOOST - allows you to make calls at the Python level very easily. Perl is mostly similar - open the DLL and then call the C API you want to hit. Ruby is the second worst (Only Java is worse). You recompile the C library with additional macros, and then make calls. The Ruby folks don't seem to mind though - they do lots of C interfacing.
C# - no structure information from the header file at all. You import the DLL and specify the entry points (basically, a separate manifest file from the header file). Somewhat similar to the way VW works (at a high level).
Java - the hardest to integrate.
- Modify the DLL
- Write an interface library
- Java will fix up the arguments based on this "middle man"
Lisp - somewhat similar to the way Perl and Python does it. (Aside - varies by implementation?) Scheme is the same, but with different names.
Forth - they have a header file parser, like VW, but it works better. However, it looks like moth Forth programs statically link libraries rather than use dynamic linking. There are also a lot of Forth implementations.
What about COM, .NET (etc)? The VW COM interface subclasses of COMInterface (usually IUnknown) which does a DNU to do dynamic lookups. The calls are easy to make. The DotNetConnect - you subclass off DotNETObject, actual calls are done using the C interface (as with DLLCC). Some Lessons:
Don't Reinvent the Wheel - we interface to C because the libraries already exist. For instance: LibXSLT. VW has an XSL library, but is not standard compliant (created pre-standard) - and thus does not work with XSL "in the wild". Much of the open source code out there is cross platform, so you don't lose anything if that's true. Even if it's single platform, that may not matter for your project.
Sometimes, you need to Reinvent the Wheel - LibTidy only worked on win32 and Linux, and was unstable. The Mac and Unix versions were only command line, not DLL. The end result: time might have been better spent writing a Smalltalk version.
Don't use C interfaces - if you can use a command line stdin/stdout interface, you may be better off just doing that.
Don't use C - Sometimes you're better off just writing the application in Smalltalk. Used to use LibASpell for spell checking in the XML Editor (but it was slow). Redoing it in Smalltalk with a better algorithm was simpler and better.
Use C - When you come across a library that's worth it (Michael's example: BerkeleyDB). In the process of doing this, a few bugs cropped up - issues with fragmentation in FixedSpace, for example.
Most slowness in C interfacing (VW) is from garbage created as a side effect. Michael's suggestion? Allocate on the stack for C Calls, as C does. Another lesson: don't use ephemerons for C objects, as this just spikes the GC harder.
What ends up happening? People implement an interface to the little bit of a library that they need access to, and no more (because dealing with the header files is so hard). Many of the libs Michael has built are pieces of the Windows API. So why is this hard? C Parser grammar is kind of insane. C is a partially context bound grammar. The C pre-processor is powerful enough to play towers of hanoi! C++ is completely context bound grammar. C++ templates are virtually impossible to deal with, and C and C++ ABIs have deficiencies:
- size and alignment of data types
- layout of structured types
- calling conventions (cdecl, pascal, etc)
- register usage conventions
- interfaces for runtime arithmetic support
- object file formats
C++ has these, and adds more (name mangling!). Also exception handling, invoking constructors/destructors, layout, alignment and padding of classes, and layout and alignment of virtual tables. Interestingly, intel has fixed this in x86 64 :)
SWIG (Simplified Wrapper and Interface Generator). Has its own syntax for describing interfaces. Generates a compiled version for an existing language - need to create own for each language. Python BOOST is similar, done better for Python only (now). Works for C++, allows calling back and forth from Python and C++. GCC-XML outputs an XML manifest prior to compilation - complete reflection for C/C++. No need to parse header files with this. Pyste is a combination of BOOST and GCC-XML to build Python/C++ interfaces. There's also C++Filt - claims to be able to de-mangle names. If it works, you could automate interfaces to C++.
- Smalltalk modeling
- Stack allocation
- ANSI C compliant parsing
- All common and OS libs pre-parsed and delivered withVW
- C++ interfacing
- C++ reflection
- Automatic generation of classes based off C structures and functions that use those structures
Here we are at 6 PM on Tuesday, and it's time for the STIC event. Bob Nemec has introduced Georg Heeg, the new executive director of the council - you can read Georg's thoughts on this over here, on his blog. Here's his evening summary:
The STIC board is made up members from Cincom, Gemstone, and Instantiations. So - what does STIC do now?
- Organizes Smalltalk Solutions
- Provides Websites
- STIC does some level of user group coordination
STIC has a slightly different mission from user groups: STIC tries to raise the awareness of Smalltalk beyond the Smalltalk community. What are Georg's goals?
Improve awareness and visibility of Smalltalk in the industry
Bear in mind: STIC is a volunteer organization. What you do for STIC you do for Smalltalk in general. So back to Bob Nemec, for what happened over the last year.
A year ago, we had some issues - finances were messy, websites were stagnant or non-existant. The finances are now documented, and there are websites:
We lost stic.org - there were issues with our domain registrar. The new STIC site can take payments for individual members. Upstairs, there's a Squeak booth (set up with the help of Chris Cunnington, a complete Smalltalk newbie). Which points the way to the future: STIC can help mostly by getting help from the Smalltalk community :)
Next, a few words from each board member - my thoughts are all over my blog all the time, so no need to repeat them here :) Ed Klimas (Instantiations) spoke about the actual cost (in terms of function points) of converting an application from Smalltalk to something else (and, as I've said here before, such conversions are rarely justified, regardless of which languages and directions are involved). Ed has data behind that point, that come from a variety of sources - Steve McConnell and Capers Jones being two of them.
So using that, given a 3000 function point system, Smalltalk will take 50-60 person months, while Java will take 300 person months. The dollar cost differential there is obvious. At a micro level, Java will give you numbers on the order of 20 function points per man month, even for high end developers. Smalltalk can crank you as high as 100. Ed has discussed these numbers directly with Capers Jones, and he wasn't surprised. Moreover, Java and .NET developers aren't cheaper than Smalltalkers anymore :)
Crunching Ed's numbers, for a new application, Smalltalk will be 2x to 3x cheaper in terms of $$. What about conversion? Bear in mind that testing now consumes half of the development schedule - and in a conversion, testing is going to be a very big piece. Now we get to errors per function point:
- Smalltalk: 0.14 per function point
- Java: 0.50 per function point
Note how much "static typing" helps :) Further, Eiffel on that list was at 0.21 per function point (Haskell was at 0.18). So much for that. So: an experienced developer injects 100+ defects per KLOC. Only half will be found by a compiler - so in a typical conversion - you end up with more code (and thus, more errors). Which gets back to something I've said: a conversion forces you to stand still (feature-wise) for the duration of your conversion, and it adds errors you don't have now. Bottom line: Converting from Smalltalk to X (whatever X is) makes no economic sense. The slides will be available on the Instantiations site shortly.
Technorati Tags: smalltalk
Bert Freudenberg is talking to us (and showing us) the OLPC device this morning. I've been skeptical of the machine, but it is an interesting device. They've done a number of interesting things to keep the price of the screen down, and yet still give you something that's visible in daylight (as opposed to this Thinkpad I'm typing on :) ).
The system is using Linux (somewhat stripped down RedHat), X11, GTK+, Cairo, and D-Bus (messaging framework for inter-application comms). The UI is "Sugar", written in Python. There's an AbiWord based editor, and a Firefox based browser. There are also two educational apps:
- TamTam (music)
- EToys (Squeak)
EToys is a media-rich authoring environment (I've used it in a software class I did for 4th and 5th graders a few years ago). EToys was influenced by the original Smalltalk-80 work at PARC, by LOGO, by Apple's HyperCard, and by Self (comes out in Morphic).
EToys is based on Morphic. You have Players, Costumes, and Uni-classes. Scripting is implemented by having classes created on the fly for you, and making the environment be instance based.
Technorati Tags: smalltalk
The hype over Silverlight is already so far over the top as to be astonishing. Dare Obasanjo has declared Ajax to be an endangered species. Scoble says it's a complete game changer. There are more stories on Digg than I can shake a stick at.
I think it's time to step back, and Patrick Logan provides the tonic:
I want to *develop* on other platforms than Windows. Not just deliver. (Moot point for silverspoon -- it neither delivers nor develops on Linux, apparently.)
Microsoft is trying to create the kind of walled garden they stumbled into on the desktop out on the net. The problem is, a lot of us would rather develop/deploy on Linux (because it's easier to manage a Linux server remotely). At present, Silverlight is completely uninteresting if that's where you are, and they aren't likely to change that. That doesn't mean that MS won't be successful, mind you - I suspect that an awful lot of intranet applications are going to end up being Silverlight based. At the same time, I'll be surprised if Silverlight ends up displacing more than a trivial number of public facing Ajax apps - because Ajax doesn't limit you in the same ways. Adobe's Apollo, on the other hand - it's going to end up inside and outside. It's the game to watch, IMHO.
Update: Mark Pilgrim adds some thoughts to the "the hype is way overboard" side of the equation. Here's a thought: try Seaside :)
Gemstone has had the most interesting set of stories out of this year's conference - they announced a free (including commercial use) version of Gemstone/S on Monday night, and today they are introducing GLASS - which puts together Seaside with a persistence story. Ruby on Rails is a large part of the inspiration behind the nomenclature. Seaside does what it does better than Rails (in our opinion) - but it has had no persistence (database) story.
The nice thing about Seaside is that you write applications in a very natural fashion using Smalltalk - the development pattern is more like that for traditional "screen" apps than most web application frameworks. Seaside came out of some Ruby work Avi Bryant did, but then moved to Smalltalk due to the better set of libraries and tools.
Seaside is attractive because it makes it much easier to create stateful applications over HTTP. The way it does this is via continuations - served pages can be associated with continuations (the stack). James Foster is now going through the standard Counter example that comes with Seaside. To support Seaside, you need continuations. We now have that in VisualWorks, ObjectStudio 8, Dolphin, Squeak, and Gemstone. Gemstone has added support because they can jump in and add value immediately with persistence.
Gemstone can work with internal web servers (Swazoo, Hyper, and Kom), or external servers - Apache (via FastCGI), or Lightpd (also via FastCGI). The Gemstone port is pretty nifty - they built an interface to Monticello and support loading straight from there. Interesting side effect there - they now use _ as an assignment operator, since Squeak code uses that. They do require spaces before and after - and this is a change from earlier revs of Gemstone.
Looks like something you'll want to head on over to Gemstone's site to take a look at. Since you can run multiple Gemstone VMs (hitting the same back end data), you can scale pretty much linearly. From the tools level, you can use VisualWorks, VisualAge, or Squeak to browse/edit code. The VW and VA interfaces are richer and more feature-full. The link above is a public "sandbox" that you can set up an account in and try things out in.
Technorati Tags: smalltalk
After lunch - Boris Popov is giving a Seaside Experience Report. Boris is using Seaside on VW, and is giving a shout out to Michel Bany, who maintains the Seaside port for VisualWorks. Boris works for DeepCove Labs - 4 Smalltalk developers (they are a part of a much larger company). I did a podcast on their applications with Joerg Beekman recently.
They build a payment processing platform (Raven) - multiple currencies/countries, multiple types of transactions. They do nearly everything in Smalltalk, they do use C libraries where they need to (external device connectivity, databases, etc). They are on VW 7.4.1, and are getting ready to move to VW 7.5. They have their own homebrew (simple) O/R mapping to their SQL Server database.
The Seaside app is a portion of their web portal - payment initiation and reporting. The project started a year ago, after the StS 2006 Seaside/Ajax presentation given by Avi Bryant. This was Boris' first real exposure to Seaside, and he built a simple prototype while he was flying back home - three hours of work.
Why did he care? They were using WebDAV before this, and it was kind of awkward. They wanted a web front end sooner rather than later. They wanted to avoid Servlets and SSP - looked harder than necessary, and they only had a few in-house resources. Boris showed his prototype off when he got back to the office - it was "cheesy" (his description :) ), but he got management buy-in to go forward. They had an actual mockup done in eight days.
Visual Design Matters: make it look slick as early as possible. A professional appearance helps out a lot. The layout affects functionality in that way. Key take away: don't let the developers do the designer's job. Find the right person and let them help you. When working with the designer, express what you want, not how it should be done. If you can agree on a working model, future updates are mostly a matter of CSS file updates.
They really wanted two factor authentication - they went with RSA. RSA has a strong presence in the financial sector. Verisign wouldn't even return their calls ("too small").
HTML Generation: It's not magic - you have to get down and do it. It's not templated - you send messages to objects - which is what makes it more like standard UI creation. You end up reusing and refactoring, not copy/pasting. Callbacks (blocks) make actions work a lot like they do in a UI framework.
They use some Ajax, but take a "don't use it unless you need it" approach". Using Seaside, you can go a long way in Smalltalk, as Lukas Renggli has wrapped the scrit.aculo.us library quite heavily. You can jump in and add custom Seaside if you care.
Boris' message: Don't worry, you won't get it right the first time - but you can iterate to the right answer quickly. What about Deployment? They started with Apache+SSL and a headful Seaside image. They allowed all static resources served from Seaside initially. They ended up shifting all static resources over to Apache. They then added load balancing across multiple images (session affinity).
They finally shifted the static resources out to S3 (Amazon), which lightened their load quite a bit. They pay Amazon about 24 cents a month right now.
Builds: They have an automated build process once all the tests pass.
- Upload all resources to S3
- Trim all sample/config apps
- Configure the app for deployment (set various Seaside/HTTP parameters)
- Save a headless image
The rest of the time was a short demo.
This afternoon, Niall Ross is doing a talk on Extreme UI Testing. Heh: from 1999:
One of the great things about the web is that it's trained our users to not be so picky. They're now accustomed to seeing UIs that look like garbage and change without notice"
Niall is probably right in saying that Ajax (and Apollo, and Silverlight) are undermining this assumption. For UI testing, there are options: SilverMark's Test Mentor, Dave Buck's VWUnit. James Foster has extended WinRunner as well. Niall says that these tools are good for retrofitting an existing system. They don't really support "Test First" (i.e., you can't click an unpainted widget).
An approach: Method Wrappers. Easily possible in VW and Squeak, since you can subclass CompiledMethod and muck with the method dictionary. In VA, you have to do some additional work. Why use MethodWrappers? Niall's earliest attempts at getting at widgets as UI operations returned things made code unpredictable. Using MethodWrappers, you can:
- Wrap the #open method
- Have it not actually open, but instead just report "yes, I was about to open"
You can extend that approach to other actions the UI takes and install before/after handling/reporting. Wrappers are a way to achieve what other languages do with "policy" code.
The ideal test is like a use case test at the "top" of the model layer. Niall uses a strategy pattern to automatically wrap threads that get forked off by looking up the stack to see if the code is under test (and if it is, make sure to install a wrapper). He wraps processes, deferred messages, completion helpers, etc. In VW, there's some additional cleanup necessary to ensure that WindowManagers (for example) get "kicked". In VA, you have to drain the event queues.
- MethodWrappers are good for UI tests
- The same tests can drive the model layer and the UI layer
- You can still do this in multi-process UIs.
A lot of thanks to various people: John Brant, Don Roberts, Michael Lucas-Smith, and Reinout Heeck.
Last talk of the show: Arden Thomas is talking about Application Frameworks. He's been using a derivative of the old "Slam Dunk" stuff from way back in the day at PPS. Today, he's talking about that. He's also building a new rev of this for Widgetry (briefly discussed today).
Arden put the original framework to use at a Hedge Fund he worked for during the early 2000's. He adapted it over time, since his employer wanted regular, tangible results (i.e., no going "off into a cave" for months to create it). Arden sometimes discusses this stuff on his blog. The idea behind any good framework: make things simpler and easier to understand - and facilitate reuse.
Most importantly: A framework should not get in your way and put you in a box. Eventually, you'll need to go outside of the box, and that shouldn't be hard to do. The two frameworks that inspired Arden (for Wrapper):
- Tim Howard's DomainInterface (from his book)
- Steve Abell's ValueInterface (this was inspired by Roby's "SlamDunk")
The main idea: "one" domain, held in a value model. Both frameworks avoided littering ApplicationModel with instance variables (which are just copy of domain instance variables anyway). The main thing is this: it's a set of simple ideas, consistently applied. What ValueInterface did is to use the dependency mechanism to auto-hook a UI and a domain via ValueModels (typically, AspectAdaptors and/or BufferedValueHolders).
AspectAdaptors translate UI level messages into things the domain will understand (and you automate this via naming conventions). BufferedValueHolders are simply wrappers on an underlying ValueModel. All of this allows for a very simple set of messaging - sending #value and #value: gets everything done, and changes at the domain level are automatically signalled up.
Moving forward, Arden is building a Widgetry based version of this. The rest: a Demo. Both the Widgetry version and the older ValueInterface (for Wrapper) will be pushed to the public store repository by the end of next week - so check the RSS feed :)
Technorati Tags: smalltalk
Apparently, I missed a huge kerfuffle yesterday over HDTV CSS codes and Digg; Mark Bernstein has all the details. I think the upshot of this is: it's virtually impossible to disappear things from the web today. Once it's out there, it's out there. There are both upsides and downsides to that; either way, it pays to be aware of that fact.