Toolbars: An Interface Designer’s opinion
As a designer, it is very important to me that the software I use provides me access to the functions I need without interfering with the creative process. Since I use a 15” monitor at work, screen space is always at a premium, which makes it even more critical that the tools in the applications I use are in there when I need them, and gone when I don’t.
Toolbars, Pallets, Panels, whatever they’re called, they are the entities—stationary or floating, separated or attached, minimized or maximized--that give me the access to application functions and object properties that I need to do my job. So I spent some time in the apps I most frequently use at work-- Microsoft office, Photoshop CS, Illustrator CS, GoLive CS, Flash Mx2004—moving, attaching, snapping, connecting, splitting, minimizing, scaling, customizing, the hell out of these things, to try and get a good idea of how effective each is at making my life as a designer as stress free as possible. Here’s what I’ve found…
Microsoft Word
The good
The application does a good job of knowing what I need when I need it. For instance, the formatting toolbar, which appears above the document window by default, contains all the necessary tools I need about 80% of the time. And the picture toolbar opens when I’ve selected a picture, disappearing when it is deselected. The object specific toolbars, such as Table, and Picture provide an easy way to edit specific objects quickly without running through menus and submenus repeatedly.
Toolbar icons are self-explanatory. I almost never need to think very long before I understand which button I need to press to perform a specific action.
The arrows to the right of toolbars with extra functionality present less often used, but still important features in an easy to get to manner.
The customize dialog box allows me to completely reconfigure my toolbars by adding and removing tools. It even lets me create new toolbars to support my workflow.
The not so good
Each individual toolbar is its own mini window, and the screen can get cluttered if I need many features for a specific task. The lack of ability to quickly collapse or snap toolbars together is a major limiting factor in the usability of the application.
There are no tool presets—which are saved workspace layouts, so toolbars that have been opened or shifted for one purpose will have to be re-shifted or closed manually, one at a time, to support another task.
Since toolbars are mini windows, I would think to look for them in the ‘Window’ menu. However they are located in the ‘View’ menu, alongside options for viewing the current document such as rulers and guides. I’ve been using word for over a decade, and I still trip up on that one.
The verdict
Nice tool set, conceptuality works well, but the screen can get cluttered, and finding some tools is counterintuitive.
Total Score: 5
Photoshop CS
The good
The contextual toolbar docked at the top—added to the interface in version 6.0—makes fine tuning the your selected tool quick and easy. The palette well can be used to station any number of toolbars in it, so you can move about freely without shoving windows around to make space available.
Individual toolbars, called palettes in Photoshop, can be detached and inserted into any of the toolbar mini windows. This effortless customizability is a real plus.
Saving and opening toolbar presets, called Workspaces in Photoshop is also a breeze. Rather than constantly shifting palettes around, you can save separate workspaces for individual tasks, so, for example, If I’m color correcting, I can save and use a ‘Color Correcting’ workspace, which contains the histogram, color palette, channels and layers opened in separate mini-windows for one click access. Hen when I need my original workspace I can call it back with one click from the ‘Window’ drop down menu.
The not so good
The palette well does not allow docked pallets to be opened, so access to any of their tools requires an extra click…not a big usability loss, but when you’re involved in a repetitive task, it adds up.
Although mini-windows snap to each other, they cannot be connected; so quickly nudging your entire toolset to grab an errant object on the canvas is not possible.
Mini-windows can and frequently do get hidden behind other mini-windows. I’ve wasted way too much time looking for the Character palette, which the ‘Window’ menu item says is opened, but I can’t find it, because it’s hiding behind another palette.
The ‘Tools’ palette for some reason refuses to get with the program and become a dockable, attachable, closeable mini-window just like its siblings. I’m not sure why this is, perhaps Adobe’s user research suggests it works there, but I would rather the enhanced control and customization of the ‘Tools’ palette.
The Verdict
Big strides every release, but there’s still a ways to go.
Total Score: 6.5
Illustrator CS
Insofar as the display and behavior of toolbars are concerned, there are few significant differences between Illustrator and Photoshop, so most of the advantages and disadvantages of the latter apply to the former.
The good
One small difference between the two apps is the ability to separate tools from the ‘Tools’ palette in illustrator. This nice little feature enables easier access to all the sub-tools in the palette.
The not so good
However there are two significant features missing from the app. Neither the Palette well, nor the ability to save workspaces appear in Illustrator. What the reason is for this, who knows, but at least as of CS 1 Illustrator lags behind Photoshop in this category.
The verdict
Why the difference between Illustrator and Photoshop? There’s too much of a lag between the two apps to be acceptable.
Total Score: 4
GoLive CS 2
Although an Adobe product, GoLive’s toolbar look and feel departs quite substantially from that of Photoshop and Illustrator.
The good
There is a tremendous amount of flexibility, and customization capability in this interface. Almost everything can be moved, removed, attached, docked, resized or closed.
I like the idea that every palette can detach to become its own window, including the tabs that reside in the main site window by default.
The ‘Tools’ palette can be resized (but only because the palette is now contextual to the editing mode you’re in—itself a useful feature to deal with the complexity inherent in an application of this capacity).
The toolbar at the top of the interface displays different tool sets for view modes. For instance, when in site view mode, the toolbar will show site-specific tools. Opening an html file will cause the toolbar to display a new set of tools related to document editing.
The major departure from Photoshop and Illustrator is that floating mini-windows can be attached by stacking one on top of the other. Thus allowing all attached palettes to be manipulated at once. Each individual palette can also be minimized using a small min-max triangle at the left of the palette, an elegant solution to the problem of screen real estate that maintains palette grouping, allows quick access to functions, and drastically increases the available space.
The bad
The sheer number of things you can do in Adobe GoLive CS2 makes it difficult to find the function you need at the time you need it. The application has a very high learning curve for precisely this reason.
Although you can take apart the site window palette by palette, you cannot attach those palettes to the toolbars. The interface doesn’t make the distinction between the two types of palettes very clear.
Stacking toolbars is not a very intuitive action in GoLive. There isn’t enough of a visual queue to let you know that they can be stacked. You sort of have to discover it by accident.
The verdict
Lots of features, not enough flow. I still don’t know where to find most tools, and I’ve been working with the application for a year now.
Total Score: 4.5
Flash MX 2004
When working in 4 dimensions, it is critical to be able to view your canvas, as well as have unfettered access to you timeline and key framing functions, so animation workspaces need to be even more sensitive to the screen real estate issue.
The Good
Flash does a very good job of utilizing the space your monitor provides it with.
The position of the timeline is extensively customizable. It can be placed alongside the top, left or right of the canvas, and it can be removed as well, becoming a floating mini-window along with the other toolbars. This configurability keeps me from getting lost in the timeline no matter what type of project I’m working on.
Another useful feature of the interface is that most toolbars can be stacked, minimizing the screen space occupied by tools not in use at the moment.
It is also possible to save workspaces as in Photoshop, making it simple and quick to move between workflows
The not so good
It would be nice to be able to dock the timeline underneath the canvas, but the UI allows docking on only 3 sides-strange, since the timeline in adobe’s other animation application, After Effects, defaults to underneath the canvas.
The verdict
Overall, the Flash toolbars do a great job of giving me what I need when I need it, and getting out of the way otherwise.
Total Score: 7.5
Topics: Usability, User Experience
Using GWT to Create Widgets for Other Frameworks, Part II
Eric Sessoms of Nub Games read my post about using GWT for other frameworks and decided to put the idea of exposing GWT functions as regular javascript functions to the test. He exposes the constructor of a widget through a static factory method.
While this is a good start, It's not the final stop. To make the GWT suitable for integration with other frameworks, we can't view it as an application framework but rather as a Java to Javascript compiler or as a generator of individual object types. Someone has to be in charge, and if our goal is to integrate GWT into some othe framework, control has to be in that other framework. My experimentation with the GWT seems to suggest that using it's event handling code in the abscence of widgets may not be so simple.
While you're over at Nub Games, have a look at some of their other posts, such as the one on using CSS with GWT.
Topics: GWT
IDE Watch - Aptana
Aptana is a new IDE (embeded in Eclipse for now). If you already use Eclipse 3.2, you can just install the plugin from the update site: http://update.aptana.com/update/. Lots of good stuff: HTML, CSS, and Javascript code assist, etc. I've use it a bit and it seems likely to become a part of my development environment -- lots of productivity enhancements. Now I can write twice the number of social bookmarking sites as before.
The documentation is also very strong. Just check out all of the tutorials for using Aptana with various AJAX client frameworks:
- Creating a new AJAX library project
- Enabling Code Assist to work with AFLAX
- Getting started with Aptana and AFLAX
- Getting started with Aptana and Dojo
- Getting started with Aptana and MochiKit
- Getting started with Aptana and Prototype
- Getting started with Aptana and Rico
- Getting started with Aptana and script.aculo.us
- Getting started with Aptana and Yahoo UI
None too shabby.
Topics: Ajax Frameworks, Ajax Tools, IDE
Framework Watch - HSE 2.0 Beta Released
HSE, which stands for Hibernate, Spring and Echo2, has a 2.0 Beta out now. From the annoucement:
New in this release:
- HSE is now an application framework! The distribution is now split into modules that can be plugged into the base framework. See the example and minimal apps.
- Improved the database disconnect detection. Detection is now done within the DAO rather than at the UI level. Currently supports Derby and Postgresql.
- Fixed bug where messages were not localized properly.
- Missing messages no longer cause a crash; It will instead display an error in place of the message.
- The old HSE base app has been adapted to use the framework and is now the example app.
- A new minimal app, that has no security system or pre-existing database tables. Pretty boring app, but a good starting point if you want a different security system or no security at all.
Topics: Ajax Frameworks, Echo2
Using GWT to Create Widgets for Other Frameworks
Every AJAX framework developer I've spoken to has speculated that you could use GWT to write widgets and other Javascript logic for thier framework. But just how would you go about doing it? At runtime, GWT:
- Loads the correct browser-specific generated Javascript file into the browser.
- Calls the entry point of the module, which inserts various widgets into the DOM and initialized various objects.
- Responds to user action via the various event handlers that have been registered by the module's entry point.
Now other people have hooked things like script.aculo.us into GWT, but the flow of control has been from GWT to the library. What about going the other way, from another framework to GWT? Can we simply create custum GWT widgets and register framework calls and callbacks within 'native' methods of the widget, or should we write static methods and register them in their name-mangled form from the entry point with the window object, there to be called by non-GWT javascript. We certainly want to leverage the browser independent DOM, event and other libraries of the GWT.
Once we've solved the problem of hooking into GWT, will this break our ability to debug in hosted mode? I aim to find out by writing a simple Echo2 widget, first in the usual way, next using GWT. Wish me luck.
Topics: Ajax Components, Ajax Frameworks, GWT
Application Watch - Gliffy, Visio on the Web
Yes, it's Flash and not AJAX, but this Visio-like Flash application demonstrates two things:
- As AJAX is driving acceptance of desktop-like functionality in the browser, Flash is also benefiting from that same changing mindset. The same decisionmakers who used to wrinkle their nose at the mention of Flash are now weighing it as a legitimate option for providing RIA's in the browser.
- The march of desktop applications to the browser continues. This app is good enough for 90% of the network diagrams people produce. Why do I need a $200+ piece of software for that? The answer? I don't.
My suspicion is that we will end up seeing a melding between Flash and AJAX, where most Rich Interaction Web Applications (RIWA) end up using both technologies. We're already seeing this happening in small increments, whether it's the use of Flash for cross domain cummunication or wrapping the Flash sound object to play mp3's in your AJAX app.
Perhaps the best know example of a melding of AJAX and Flash is Google Analytics (the former Urchin), where many of the graphs are rendered in Flash.
Topics: Flash, Rich Interactions
Cross Domain Comet
I hate to be a blog echo chamber, but there's a post from Alex Russell of Dojo Toolkit that is worth spreading around a bit more.
First, some background. There are two technologies that Alex and Co. have been working on. One is called JSONP, which stands for JSON with Padding. The essential idea is that you can insert a script tag dynamically in a document and have it pull a script from a server in a different domain. This URL for this script takes a parameter that is prepended to the JSON which is also wrapped in parentheses. In the case where the prefix is null, we have just a JSON object. Otherwise, it's a function call. This gives us the ability to do a callback when the script loads; you want to do a callback, otherwise, how will you know that the thing loaded? Obviously, this requires some cooperation from the server -- you can't just do this with any old JSON service. A discussion by Alex of this technology can be found here. Dan Theurer has a somewhat clearer explanation, IMHO, of a similar technology used by Yahoo.
The other technology is Cometd. What is Comet? Without getting too technical, when a web application is to update a browser using AJAX, the browser "polls" the client, i.e. it keeps opening up connections to the server to ask "is it ready?" With Comet, the browser opens up a connection to the server and keeps it open until the server has something to say. There are all sorts of issues in doing this, from limitations of the HTTP protocol, to the Servlet specification, to the consumption of resources on servers and network appliances that are expecting short connections. Cometd is a server that tries to solve some of the issues.
What Alex has done is combine Cometd and JSONP to allow cross domain Comet. You can read Alex's post here...
Is Cross Domain AJAX/Comet a 'Good Thing?'
There's a school of thought that AJAX apps should really be the SOA orchestrator of various backend services from various domains -- a little Amazon S3 here, a little Google maps there, a little Yahoo mail there -- and voila!, the ultimate mashup. While it is seductive to think you can assemble applications in this way, it makes me nervous for some reason that I can't quite articulate. Having been the victim of bad SOA governance within companies, I have to think that these types of applications will be very brittle at the least, and vulnerable to security exploits at the worst.
Topics: Ajax Frameworks, COMET, Editorial
ZK and Data Binding
I've been meaning to focus some more on the excellent set of 'small talks' available for the ZK framework. These have the feel of the original O'Reilly books and are great for those who learn best by having someone prod them gently into doing. For those who pine for the wonderful world of the .NET datagrid, there is a small talk by Chanwit Kaewkasi entitled Small Talk: Data-Binding Implementation. It demonstrates how to do something similar in ZK:
I use the technique called "subscribe-to-expression" (found in Borland ECO framework for .NET) with the simple Observer pattern in the current implementation. Two new properties, "bind" and "dataSource", have been introduced to the ZUL elements. The "dataSource" property is to link with a business object, and then we can set the name of property we want to display and/or edit using the "bind" property. When the "dataSource" or the "bind" property are changed, the element will subscribe itself to the "bind" expression of the "dataSource" object for update notification. The subscription process will be done through the DisplayRegistry class.
After a user making a change to the value of a ZUL element, the element will trigger an update notification to all elements that has subscribed to the same "expression." So you can see that these elements will be automatically updated.
Currently in the proof-of-concept version, I use Apache Commons JXPath as a binding expression library. It is a bit different approach comparing with the EL expression found in ZK, and might confuse the ZK users in the first time. However, other technique is welcome to improve the coding experiences.
If you like this sort of thing, it's well worth a look. As someone who has worked on plenty of Datagrid-ectomies, I can't say I like it for anything but the most simple webapps. It's one of those classic time saving constructs that depends on good developer behavior to work. In practice, data binding punches through the layered or tiered architectural pattern and couples the UI tightly to the data layer.
Still, the kids ask for it. In the words of Paul Simon, "Who am I to blow against the wind?"
Topics: Ajax Frameworks, ZK
Visualization in Project Planning
Visualization is a powerful tool when trying to take a large amount of data and communicate it in a form that is more immediately digestible. We’ve been experimenting with applying visualization to project planning.
Traditional project plans face two challenges. First, the typical list of tasks or Gant chart can be a confusing communication vehicle. Usually such artifacts are printed in microscopic fonts on a relatively small sheet of paper and it’s hard to see the forest among the trees. The second challenge of traditional project plans is they don’t really build a cognizance among team members of what the other team members are doing. In the end, the project has to succeed as a whole, so it’s crucial that team members work well together.
One method of visualizing the project plan is to create a visual timeline. The timeline shows thumbnail sketches of deliverables and environments used to create the deliverables. Example environments could include a location for user research or a meeting room for a brainstorming session. Participants can be represented by simple stick figures. Depicting a plan in this fashion can enable a lucid walk through and vetting with team members.
Another way of visualizing the project plan is to use a storyboard technique. Each panel shows an element of action, a deliverable or a progress measure. When panels are juxtaposed, the entire story of the project plan can be told clearly and effectively.
Visualization of project plans does not demand a lot of artistic skill, just a new approach. Give these techniques a try if you are looking for a way to make your projects plans more communicative and get your team working more closely.
Topics: Best Practices
The Short Circuited OR Considered Harmful
In my discussions with James Taylor about using wizards to write rules, I was reminded of some cases where it was necessary to create a wizard for this purpose. They all shared two things in common: the need for justifications and non-shortcircuited OR's. Let me give you an example.
Let's suppose you are designing a system that decides whether or not to recommend prisoners for early release. Your facts inlcude the prisoners' criminal records, the details of their behavior behind bars, recommendations by prison officials and the district attourney, enrollment in treatment and rehabilitation programs, and mitigating circumstances such as aged parent or infirm spouses or children. You formulate the state's sentencing and release guidelines as business rules and implement them in your vendor platform of choice. When a feed of data comes from the department of corrections, you add it to your database and run it through your rule system which issues recommendations to a board charged with making the final decision. This board makes a judgement call based on the information you provide them.
When they look at your recommendation, they don't just want to see a yes or no, they want to see an explanation or justification. Something like "Prisoner Joe Smith, #54-56, is not recommended for release because he had at least 3 incidents of misbehavior in the last 6 months and was convicted of at least a Class C felony." Ideally, you'd want to spell out exactly what the issues were:
Prisoner: Joe Smith
Number: 54-56
Recommended for Early Release: No
Reasons: At least 3 incidents of misbehavior in the last 6 months (stabbing of guard, 4/5/2006; assault of fellow prisoner, 4/22/2006; contraband in cell, 5/17/2006) AND convicted of at least a Class C felony (Criminal Possession of Stolen Property, 6/11/2004)
Now as a board member, I can look at the prisoner and see that while he was convicted of a nonviolent crime, he looks to have been violent while in prison. If he had just been flagged for contraband, maybe I might consider releasing him.
OK, so justification is useful in this context, as it is in many other fields, like healthcare, insurance underwriting and claims, criminal science, etc. How do we produce a justification with our rule engine? The sad truth is that none of the commercial vendors of forward-chaining BRE's will do that for you automatically. You have to roll your own. One approach is to use the Fact Harvest pattern to construct and build a ReleaseRecommendation object. This fact would tell us whether a particular prisoner was recommended for release (true or false) and all of the conditions that contributed to this recommendation. It might contain a list of all of the misbehavior's over the last 6 months and the crime for which he was convicted.
Here we come to the first reason for using a wizard to write rules: if you are testing a particular condition in the 'IF' part of your rule and then updating your ReleaseRecommendation object with the details of that same condition in the 'THEN' part of the rule, you're essentially recapitulating the condition in the action part of the rule. Aside from being a pain in the neck, it's also a maintenance problem. Every time you update a condition, you have to make sure to update the corresponding action. If you don't, Charles Manson gets released by accident -- or, rather, because of your bug. It voilates the DRY principle (Don't Repeat Yourself). One way of handling this is to have your wizard generate the rule for you, with both the condition and action parts. Now you make one change and the rule is generated in a way that is guaranteed to maintain consistency.
The second reason for using a wizard has to do with the short-circuited OR of the title. If our rule above actually tests for
has had at least 3 incidents of misbehavior in the last 6 months OR is a drug addict
then what happens with our rule? If you've programmed much, you know that most languages use what is known as "short-circuited OR," i.e. if you are testing A OR B and A evaluates to true, then B is never tested. If you are depending on side effect of B (such as the building of a list of incidents, etc.), you can forget about it ever happening. The 'is a drug addict' part of the condition is never tested. To make things worse, if we are constructing a justification, we have to test in the action which parts of the OR clause in the condition actually evaluated to true. Imagine now a complex condition with lots of OR, NOT's, AND's and parentheses. Yuck.
A way around this mess is to break apart the OR clause into seperate rules and accumulating them in the ReleaseRecommendation object. The drawback, of course, is that now we have to create several rules where before we had only one. Again, generating these rules with a wizard is a more or less elegant way out.
If anyone has a niftier solution to justification or non-short-circuited OR, I'm more than happy to hear about it.
Update 1: Michael Chermside correctly points out in the comments that it would be more elegant to have a justification engine that worked directly with the BRE's internals. I agree. Unfortunately, none of the forward-chaining BRE's I've worked with have very good support for justification or supply hooks into their internals to support the building of a justification engine through AOP or something equivalent. If you work with an open source engine like JBoss Rules, you can build in your own justification logic.
Topics: Best Practices, Business Rules
IDE Watch - Googlipse, GWT Eclipse Plugin
I'm working on some stuff to bring the GWT and other AJAX frameworks question -- "how can I write widgets for framework X in GWT?" -- full circle. In the meantime, I thought I'd point out two useful resources. First, GWT Site is a blog that tracks developments in the Google Web Toolkit world. If you don't have time to scan through the discusion forum every day, it's a good place to get your updates (other than here, of course ;-)).
One of the things that caught my eye, of course, was Googlipse, the so-new-its-still-wet Eclipse plugin for working with GWT. Regular readers of this blog will know that I've been working on my own Eclipse plugin for GWT, slated for release some time in 2010. After getting over my disappointment at being scooped, I decided to try it out.
The download is a simple jar that you add to your Eclipse 3.2 plugins directory. From the quickstart doc:
Googlipse is implemented as a WTP Facet. When creating a new Dynamic Web Project, select Googlipse in the Project Facets page. If you already have a Dynamic Web Project, you can add Googlipse facet by selecting Project->Properties->Project Facets(Please make sure you don't have gwt-user.jar in your classpath). In case you didn't like Googlipse, you can remove the facet.
[snip]
You can open the RemoteService interface and add/change methods in it. You need to provide the implementation of those methods in RemoteServiceImpl class, but thanks to Googlipse, you don't have to do anything in RemoteServiceAsync. Googlipse will automatically update the corresponding Async file whenever a RemoteService interface is changed.
The plugin simplifies creation of modules, creation of remote methods and handles launching and debugging in hosted mode. Since the your developing a a dynamic webapp, you can ship your GWT app in the end as a war. Best of all, it's Open Source.
Topics: Ajax Frameworks, Ajax Tools, GWT, IDE
Exploiting the Google App Ecosystem
A number of readers have noted that XMLHttpRequest can only communicate back to the same host that served up a page. This is true. We've all played around with XMLHttpRequest to see if we could make it break. Barring browser bugs, even with iframe and document.domain hacks there isn't much you can do. You can use the super twin powers of Flash to do cross domain scripting in some cases, but even that has its limitations. So we're safe, right?
As I pointed out last week, sites that allow for the persistence of executable artifacts -- Javascript scripts and Flash files -- can provide a leading wedge for AJAX worms and viruses. Many of these same sites have various forms of messaging, such as email. If you can push the buttons on these apps, you don't have to make cross domain XHR calls at all. So, is an application like Yahoo or Google mail "scriptable" enough to allow this sort of subversion?
I know that reading through code like this
may make you feel confident that no one could decipher the inner workings of Gmail, but remember the old cracker war cry: "Security through obscurity is no security at all." What man has compiled, man will also decompile -- the Google Web Toolkit will give up its secrets.
With this in mind, I would be much more at ease if all of the various google applications I use -- maps.google.com, spreadsheets.google.com, mail.google.com, and the various apps under www.google.com -- didn't all have single sign-on and the same google.com domain. It makes for a better experience, to be sure, but I'm pretty certain I don't want someone mailing my spreadsheets to a compromised mailbox.
In the olden days, a popup browser window that started behaving strangely was a dead giveaway that foul play was involved. These days there is no window or status bar message and email may be going out in your name that you don't even know about.
Why Your Engine Should Support Programmatic Rule Generation
I've published an article over at the RealRules Blogzine on programmatic generation of rules, i.e. why and under what circumstances this makes sense. Check it out.
Topics: Business Rules
Application Watch - Kool, a Meebo IM Competitor
Via TechCrunch, it's getting crowded in some of these AJAX application categories. For a while, Meebo was the sole player in the AJAX IM arena, with only local chat apps playing at its ankles. No longer. A new competitor is entering the fray: Kool IM. While I was napping, a number of others have also crept up on Meebo:
In addition to Silicon Valley based Meebo and Amsterdam based eBuddy, ILoveIM, Germany based Mabber and other competitors are out there vying for the same user base. Luckily, users tend to rack up a lot of time (if not page views) with the service, allowing the companies to generate reasonable revenue from advertising - eBuddy claims to be profitable.
"Too early is the same as wrong," as the old Venture Capital maxim goes. I guess all these competitors are validating Meebo's business model, just as they're getting ready to eat it's lunch.
Topics: Ajax Products
RSS and Social Bookmarking - The Drosophila of Web 2.0
Via Micro Persuasion, Earthlink has launched an RSS reader and a social bookmarking app. Steve correctly points out that both Earthlink and AOL cannot be left behind when their users are leaking to other sites. Still, is a me too strategy sufficient in the fast moving world of Web 2.0? Has Google changed the name of the game from "distribution and content" to "applications, baby!"?
Topics: Ajax Products, Web 2.0
About Pathfinder
Follow the Blog
-
Get a monthly update on best practices for delivering successful software.
Subscribe via email
Subscribe via RSS
Categories
Topics
Archives
- July 2009
- June 2009
- May 2009
- April 2009
- March 2009
- February 2009
- January 2009
- December 2008
- November 2008
- October 2008
- September 2008
- August 2008
- July 2008
- June 2008
- May 2008
- April 2008
- March 2008
- February 2008
- January 2008
- December 2007
- November 2007
- October 2007
- September 2007
- August 2007
- July 2007
- June 2007
- May 2007
- April 2007
- March 2007
- February 2007
- January 2007
- December 2006
- November 2006
- October 2006
- September 2006
- August 2006
- July 2006
- June 2006
- May 2006
- April 2006
- March 2006
Blogroll
Recent
- Elements of Testing Style
- Aesthetics and Web Design
- Asterisk-Java Testing with Groovy
- 3 Misuses of Code Comments
- Fluently NHibernate
- Digging a Hole and Covering it with Leaves — The Software Development Version
- The Importance of User Experience - Do You Understand It in Your Bones?
- Writing Your Own Protocol With NSURLProtocol
- What’s In Your Dock: iPhone edition
- Feature Fatigue

