Fork me on GitHub

robknight.org.uk

Blog

A peer-to-peer future for money and markets?

Posted on 9 December 2009 - 9:50pm

As the recession grinds on, the question of "what to do about the banks" remains on the agenda. Today the government announced their latest maneouvre, a 'windfall' tax on bonuses paid to banking staff based in Britain. The BBC's Robert Peston looks at the possible effects of this move, including the possibility that by discouraging bonuses, the government will cause the banks to instead build up their capital and, as a result, be in a better position to lend and kick-start economic growth. I don't know enough about economics to know if this is right, but I'm skeptical.

As the "great financial crisis" has worn on, I've become ever less interested in how to 'fix' the banks, at least by using any of the measures that our politicians will entertain. Taxing bonuses does nothing to address the underlying problems and it does nothing to deal with the fact that banks, despite banking being a mature and, in theory, competitive industry, are still generating huge (though very volatile) profits, against what economic theory tells us should happen. If the banks can be fixed then I'll have to hope that one day, the people with the right ideas to do so take over, but I'm not holding my breath waiting.

So, what's an ordinary person to do? For me, a far more attractive proposition than hand-wringing over someone else's bonus payments is to look at alternatives to traditional banking. One such option is peer-to-peer lending, which operates on the simple basis of people lending their savings to other people who need to borrow. The interest rates are generally profitable enough to make it worth the lender's risk, but also generally cheaper than borrowing an equivalent amount on the same terms from a bank. The lack of middlemen taking bonus payments helps!

I suspect that the future will involve a lot more of this kind of thing. The continuing reduction in the costs of communication and the increasing ease of financial transfers means that we don't really need banks for many of the things that they have traditionally monopolised. I'm reminded of this post by Sean Park which suggests that the business models that some banks have relied upon simply don't work any more. Banks as great central clearing-houses of money, able to control who gets it, when, and for what price, may soon be a thing of the past.

Another interesting contribution to this debate came from Melody Hildebrant, in her O'Reilly Ignite talk entitled "Web capitalism doesn't need a bailout", which covers peer-to-peer ecommerce and lending, prediction markets and crowdsourcing (all some of my favourite things; if she had covered VRM too then it would have been perfect!). It's worth watching as an introduction to the idea that the future world might involve fewer "too big to fail" institutions and corporations, and more peer-to-peer interaction. On a more personal note, having just bought a house and with a need to spend some cash on home improvements, I'll probably be looking at Zopa for my borrowing needs rather than a bank.

Recent work - Drupal, Drupal, Drupal

Posted on 8 December 2009 - 6:33pm

I've been pretty busy lately with several projects, most of which are developed on Drupal. One, in particular, has been really exciting to work on. The great thing about working in the web industry is that your clients are often varied and interesting people, and this is a good example.

The most recent major project was for a new public policy think tank called ResPublica. I won't pass judgement on their politics, except to say that the people involved are all committed, intelligent and genuinely hoping to make a positive difference to the world. I've already blogged about the purpose of the site and written a case study on Drupal.org, but I'd like to go into a bit more detail about the process of building and deploying sites like this.

Drupal's new essential modules

There has always been a class of Drupal modules that were 'essential' for most sites despite not being part of Drupal core. In Drupal 5, the essential modules included Views, CCK and often an image-handling module like ImageCache. Google Analytics, XML Sitemap and others were useful, but for me Views + CCK were the two modules that I would always use on every project. Drupal 6 suffered greatly from the fact that these modules were not 100% ready with upgrades when Drupal 6 launched - a problem that has been largely solved for the upcoming Drupal 7.

Since Drupal 6 was released, a few new modules have made it on to the 'essential' list. The first is 'Features', which integrates with CCK, Views, Context and other modules to make it easy to package your settings into code in a module. This means that you can create Views and Content Types on your development server, save them as a 'Feature' (which is a Drupal module with some extra hooks) and then install that module on your production server. Voila! Your settings appear on the production server instantly. No need to manually export/import anything. This radically simplifies deployment and development scenarios.

Even better, because Features are stored in code and not in the database, there are far fewer occasions when you might need to take copies of database tables. If you wipe your database, you still have all of your Views/Content Types/etc. And to add icing to the cake, storing these settings in code means that they can be committed to source code control (I use git, but any version control system would be suitable). With this, you can have a full version history of your major Drupal configuration options, able to roll back to old versions or compare old with new.

Features was created by the guys at Development Seed, and they're still developing new, ahem, features which make this even more exciting. One of these is the 'Feature Server' which provides an easy way to distribute Features that you have created. For example, if you have created an image gallery using CCK, ImageField and Views, you can package the settings up as a Feature (which will automatically have the correct dependencies) and distribute it via your Feature Server. Sites using your Feature will check the Feature Server for updates to the Feature, notifying admins of new versions just like new versions of modules on Drupal.org.

One of the modules that I mentioned integrating with Features earlier was the Context module. Context solves the frustrating problem of getting Drupal to display the correct blocks of content in sidebars, footers and headers around particular pages. In the traditional block configuration page, which hasn't changed much since I first started using Drupal four years ago, you can optionally enable/disable the block based on user permissions and on a match with the URL path. This works well if you have a simple URL structure on your site, but can quickly become troublesome on sites with complex URL structures. And heaven help you if you change your URL structure - all of your blocks will need to be updated too. If you want to use any other information to control block visibility, your only other option is to write a PHP snippet to control it, or install one or more custom modules.

Context solves this by creating a simple UI for selecting from a wide range of criteria to control block visibility. You can select criteria such as node content type, location in the menu trail and the traditional URL path. Context can also be used to disable whole regions (for example, disabling a sidebar on the home page) and to set custom theme variables. It's a far superior way to control aspects of your site's appearance based on context, and I expect that it will develop further to allow for more fine-grained control.

My other choice of essential module is, in fact, not a module at all. Drush is a command-line script which can be used to perform many common administrative tasks from a shell prompt, rather than via the web interface. It can also do a few things that the web interface can't (without custom modules), such as downloading modules, clearing the cache and taking a backup of your database. For a developer, this speeds up common tasks considerably and, in particular, makes setting up new sites incredibly straightforward.

There's lots more that I would like to mention, including drush_make and the Aegir hosting platform, but I'll have to return to them another time (if you want to know why these are a big deal, read this post).

Why winning is easier than finishing second

Posted on 21 November 2009 - 1:00am

Over the last 18 months at work, I've taken on certain duties that, as a software developer, were new to me. Whilst it's hard to work as a software developer without having at least some exposure to client meetings, specifications and project scoping, my more recent experience has included writing proposals, giving presentations and generally taking a more active role in sales. Some of the things that I have learned have surprised me.

Looking back over a range of projects, some that we won and others that we lost, my most striking conclusion is that the amount of effort expended on the ones we lost, on average, substantially exceeded the effort expended on the projects that we won. Finishing second somehow takes a lot more work than finishing first.

I have some ideas about why this might be. For any given project, you have starting odds of winning; these might be based on your portfolio, existing relationships, ability to charge low rates or your sales acumen. Before a single word is written in a proposal, there's already some competitors better placed than others. And in many cases, the company that's best placed at the beginning goes on to win. Sometimes the favourite is so far ahead that there's no point in trying to beat them.

But it can be quite difficult to know that this is the case. It's very tempting to think that if you create the best proposal possible, give a great presentation to the client and generally bend over backwards to satisfy their every whim, you'll win the contract. In truth, if you're having to make that kind of effort it's probably a sign that you're not going to win. If you feel that the only way to be in contention for a contract is to spend large amounts of (unpaid) time trying to persuade the client to award you that contract, you're almost certainly better off doing something else.

Now, this might sound a bit defeatist and depressing. But it really isn't. The solution isn't simply to give up on any hope of making sales. The solution is to sell via your reputation, such that the potential clients you deal with already know who you are, what your strengths are, and have pre-screened you for inclusion in pitching processes. Instead of being one of the "also ran" companies there to make up the numbers when someone else is the favourite, the goal should be to *be* the favourite. Some of our most interesting and most rewarding work has come from sales where there wasn't even any other agency in the picture, where the client knew what they wanted and knew that they wanted us to deliver it.

This is where, at least in a web development context, open source software really helps. Open source projects generally have good communities around them, making it easy to talk about your projects and promote yourself through your work. Publishing modules or case studies, or giving talks to user groups, are great ways of establishing credibility. Being known for being great at something means that clients come to you when they know that that's what they want.

Drupal and the usability question

Posted on 15 November 2009 - 8:08pm

A few things recently have prompted me to think about the difference between how we pursue the goals of usability and the goals of good software development. In particular, how do we deal with the fact that the mindsets of professionals in both disciplines are often different?

The main prompt was this post by Larry Garfield. He's a long-time Drupal contributor and his lengthy post covers various topics, including the Drupal 'smallcore' movement and the D7UX project designed to improve usability in the upcoming Drupal 7 release.

His first major point is a criticism of the way 'smallcore' if often discussed, arguing that the focus on 'smallness' is misleading as the true goal should be flexibility. I agree with this, but this post isn't about smallcore, so I'll leave it at that. What's important about this observation is that, amongst software developers, there's a great concern to avoid making software that is 'bloated' or 'inflexible'. There's barely any disagreement about this topic: given that a piece of software like Drupal must serve as a platform for many other developments, it's necessary that it maintains the capability to be customised for many different purposes.

What follows in Larry's post is a discussion of the different philosophical approaches one might take to build a flexible CMS/framework. This is the sort of debate that occurs very often in software development. There are hundreds of books, each of which running into hundreds of pages, detailing different philosophical approaches to building software. Each concept for software design is expanded upon until, eventually, we have so many competing concepts that it becomes necessary to create yet another conceptual model that attempts to go 'back to basics' and simplify things (I'd argue that Domain Driven Design is an attempt to take Object-Oriented Programming back to its roots, for example).

My point is that software developers are always seeking for a way of building software that is simple, elegant and definitive. We never quite find one that we're happy with, but what we're looking for is a system that reduces - or eliminates - the need for repetitive work. Software developers are lazy - and that's why they're good at their jobs. Software should be as complex as necessary and as simple as possible. Keep it simple, stupid, and don't repeat yourself. Simple, reusable software can be tested for bugs once and re-used many times without that expensive effort having to be repeated. When we want to change something, we change it in one place and the same change automatically applies elsewhere. A lot of effort goes into making things that simple.

This brings me on to the second part of Larry's post, about the Drupal 7 User Experience project (D7UX). This is intended to improve the usability of Drupal, a very necessary aim as Drupal is now competing on many fronts with both corporate enterprise software and lightweight, single-purpose content management software.

Tellingly, Larry's criticism of the D7UX project is this:

The D7UX project was focused on a particular class of CMS, and most of the code that came out of it was in the form of large single-purpose Lego blocks.

In other words, the usability improvements made were insufficiently re-usable, too focused on solving narrow problems. Given how developers think, these conclusions are not surprising. Larry links to Leisa Reichelt, the usability lead on the D7UX project, who concludes that:

From the very outset our goal with D7UX was to make Drupal more accessible to people outside of the Drupal community and less technical people – people who didn’t even know what PHP was let alone how to code it.
...
This approach is representative of the goal to make Drupal more of a ‘product’ – an out of the box CMS solution that non-technical users can drive.
...
The changes that are required to the interface to really achieve the goal that we were tasked with ... has the consequence of making Drupal a less efficient and enjoyable place for Drupal developers to build cool stuff.
...
And so we have this tension. Drupal as a ‘Consumer Product’ and Drupal as a ‘Developer Framework’. Currently, the official direction is that the project is going to attempt to be both. I think this is a serious problem.

I think that this is the classic technology vs. usability problem. Developers want to create things that solve a wide range of problems at once, including problems we don't even know that we have yet. Usability professionals think more in terms of concrete use cases and user personas. Getting the two sides to agree about how a piece of software like Drupal should work is very difficult. Larry quotes a discussion:

Bojhan, one of our two new UX leads (woohoo!), commented:

Yet in most discussions, developers assume that design proposals are ill-informed – even if the design proposals truly are informed (by user observations and knowledge about Drupal inner workings)

To which Jeff Eaton replied:

And designers, in most discussions, assume that developers are visually illiterate and uneducated about UX matters. It’s a double-edged sword.

In January this year I gave a presentation to Northern User Experience about the different approaches that developers and UX people bring to their roles. For me, the difference boils down to the fact that UX people think in specifics, and developers think in the abstract. The D7UX project seems to have suffered from some of the problems I outlined, with misunderstanding and suspicion creeping in as both sides struggle to understand the other's aims.

So what's the solution? Personally, I think that Leisa Reichelt is correct, that it is likely to be impossible to reconcile the needs of all of Drupal's user groups in a single project. My perspective on this comes from working at PRWD, as a software developer at a usability-led company. I've learned a tremendous respect for usability, but it's important to remember that usability means thinking in specifics. It's impossible for a single centrally-run project to consider all of the specific scenarios in which Drupal might be deployed, or even to identify a very common use case.

What would be better would be to accept that Drupal is never going to be an off-the-shelf product. This does not have to mean the end of the ambition for Drupal to be everywhere on the web. Larry makes an analogy with Firefox, but my analogy is with Linux: there is a core of software called the 'Linux kernel' which is used in thousands of high-powered web servers, data-crunching applications and supercomputers, but is also used on Netbooks and even mobile phones. It would be wrong to call Linux a 'product', because nobody uses 'pure' Linux. Ubuntu, Fedora, CentOS and Slackware are products that people use. Some of these Linux distributions are built on top of each other - Ubuntu is based on Debian, for example. Ubuntu is friendlier and easier to use, but it still wouldn't exist without Debian. Likewise, we're going to have to build new distributions of Drupal and *that* is the correct level on which to consider usability. Development Seed have produced a great example of this with their OpenAtrium intranet software - it's built on Drupal, but the user experience is far better than an out-of-the-box Drupal installation. And the reason that it is better is that it has been designed for intranet use. Those same usability improvements wouldn't work for a Drupal e-commerce site, or a Drupal social network.

As strong as the Drupal brand is, I think that the future might consist of separately-branded products targeting Drupal at specific use cases. The underlying framework will be the same, and that framework will ensure module compatibility across different distributions. But usability, apart from the most generic of usability considerations, will be the responsibility of these different products to consider.

Magento shipping module update

Posted on 14 November 2009 - 5:09pm

Aside from working with Drupal, another recent development at PRWD has been an update to our Auto-shipping Module for Magento. This module works by automatically applying the most suitable delivery cost to an order before the checkout process begins. This ensures that the customer sees the full cost of the order on the shopping basket page. This is important because nobody likes surprises during a checkout process, and unexpected costs can be a big cause of checkout abandonment.

The new updates to the module enable multi-store functionality, so you can set different default shipping destinations for different stores (e.g. where you have a different store for different languages). This makes the module considerably more flexible.

If you've used the module or have any suggestions for how it could be improved, let us know on the PRWD blog.

At PRWD we've just completed our latest project, a website for the new public policy think-tank ResPublica. The site was built using Drupal, and you can read the drupal.org case study here.

This has been the first full Drupal site I've delivered for a while, and I've been getting to grips with some of the great new contributed modules that have appeared recently. In particular, the Features module has been a revelation - what it does is incredibly simple and yet also incredibly powerful. It's something that I can't imagine not using on every project.

The Features module solves one of the biggest problems with Drupal development and deployment: the fact that lots of structural information - in particular, content types, views and imagecache presets - gets stored in the database. To deploy a site from development to staging and then to live can involve either A) duplicating (in part) the database or B) manually exporting each view, content type etc. each time they are altered, and importing them into the relevant sites. There's no version control and mistakes are very easy to make.

Features solves all of this by packaging your stuff into a module. This automatically-generated module contains definitions of your views, content types etc., ready for installation on another site. So you might create a view on your development site, add it to a Feature, then just install that Feature on the staging server. Voila! Your view appears on the staging site. What's more, your Feature module can be kept under source code control, enabling you to manage it in precisely the same way that you would manage custom modules you've created yourself. If you change the view on your development server, just update your Feature module, check it in to your version control system, and check it out again on the staging server and you instantly get your new view.

This is a massive step forward for professional Drupal development. Once again I'm in awe of how great the Drupal community is at solving each other's problems. The fact that I'm able to take advantage of the fantastic work of other people - and hopefully I'll be contributing something back - is a testament to the power of open source and, in particular, the Drupal project. There's a post that I want to write at some point investigating why certain projects - the Linux kernel, Apache web server, Rails and of course Drupal - seem to hit that sweet spot of community engagement where the efforts of all of the people involved combine well to create something truly useful. Why do these projects succeed and others with similar aims and ambitions fail? For now, the only thing worth mentioning is that Drupal is definitely a project that is succeeding, perhaps better than any other open source CMS or any other PHP development framework.

Git as a productivity mindhack

Posted on 30 August 2009 - 1:05pm

Git is a well-known source code management tool. It enables you to keep versioned copies of your source code, leaving a historical audit trail of your edits over time. It also supports branching - creating two or more divergent versions of your code that may proceed off in different directions. It also supports lots more cool stuff, but for the purposes of this post, these are the only features that matter.

For a long time, I've heard lots of positive stuff about Git (there's even a whole site devoted to this) without really appreciating the points being made. At work, we use Git for basic source code management, but 95% of what we use it for is simply for keeping a history of what was edited and when. In short, I've never really got the best possible use out of SCM/version control systems. My standard practice has been to start a repository at the beginning of a project, and progressively commit more changes until the project is finished. If I need to copy code between projects, or create a new project based off an old one, I'll often take the lazy way and just physically copy the files and create a new repository.

What follows is an anecdote of how using version control properly has made me more productive. If you habitually use version control and have done for years, you might find little of value in this.

As a background, I should explain that my biggest challenge as a software developer is getting things finished. On almost any project, there are myriad ways of doing things, many of which are more interesting than the challenge of creating working software. And yet working software is often what people want, and there's a certain satisfaction that comes from delivering software that cannot be had by any other means. Getting to the end of a project is a long-term reward; experimenting with cool stuff is near-instant gratification. All too often, instant gratification wins. (At this point I should point out that a certain amount of experimentation is healthy; it's only by trying new things that we learn. However, by completing projects you open up a whole range of new options for experimentation, often more fulfiling than those you began with).

I recently experienced this problem when working on some code for Wisdom Hive. This is a part-time project for me and, as such, it's very tempting to use it as a testing ground for new ideas. The problem I was having was that I was tying myself in knots, constantly revising my code in a perfectionist quest to find the best way of doing things. It was a classic case of premature optimisation. Again, it was not without value - I've learned a lot about concurrency, distribution and scalability from the practical research I've done into it. But it wasn't necessary for creating working code.

The solution to my problem turned out to be extremely simple. Having realised that I could either write simple code that worked or write complex code that worked even better, I simply set up a new branch of the project for experimental stuff, and decided to write the simple code for the main branch. For some reason, something clicked in my brain. I could now write code very quickly and with minimal fuss for the main branch, safe in the knowledge that, if I wanted to try something out, I could do it on the experimental branch. I could even create more branches for different experiments. What changed from before was that I stopped thinking of the version control system as simply being "where code goes after it has been written" and started to think of it as a tool in the process of development itself. I can now have multiple versions of my code, all behaving differently, allowing me to quickly experiment with a new idea with minimal commitment. My perfectionist anxiety is gone, allowing me to create simple working code for the master branch, meaning that I get things done much more quickly.

I realise that this is probably an obvious notion to many people. But for me, it has helped me to overcome one of my most annoying personality traits in order to become more productive, so I'm posting about it in the hope that others might benefit from a similar approach.

This is the first post in a series on the subject of Domain-Driven Design and its use in PHP development.

If you're reading this, I'll assume that you already have a reasonable knowledge of PHP, although it's not essential. Before going any further, I'll explain the basic notion of what DDD is, and why you might want to care about it. Fortunately, I've already written a basic introduction to DDD in a response to a question on Stack Overflow, which I'll reproduce here:

Firstly, if you don't know that you need it then it's possible that you don't need it. If you don't recognize the problems that DDD solves then maybe you don't have those problems. Even DDD advocates will frequently point out that DDD is only intended for large (>6 month) projects.

Assuming that you're still reading at this point, my take on DDD is this:

DDD is about trying to make your software a model of a real-world system or process. In using DDD, you are meant to work closely with a domain expert who can explain how the real-world system works. For example, if you're developing a system that handles the placing of bets on horse races, your domain expert might be an experienced bookmaker.

Between yourself and the domain expert, you build a ubiquitous language, which is basically a conceptual description of the system. The idea is that you should be able to write down what the system does in a way that the domain expert can read it and verify that it is correct. In our betting example, the ubiquitous language would include the definition of words such as 'race', 'bet', 'odds' and so on.

The concepts described by the UL will form the basis of your object-oriented design. DDD provides some clear guidance on how your objects should interact, and helps you divide your objects into the following categories:

  • Value objects, which represent a value that might have sub-parts (for example, a date may have a day, month and year)
  • Entities, which are objects with identity. For example, each Customer object has its own identity, so we know that two customers with the same name are not the same customer
  • Aggregate roots are objects that own other objects. This is a complex concept and works on the basis that there are some objects that don't make sense unless they have an owner. For example, an 'Order Line' object doesn't make sense without an 'Order' to belong to, so we say that the Order is the aggregate root, and Order Line objects can only be manipulated via methods in the Order object

DDD also recommends several patterns:

  • Repository, a pattern for persistence (saving and loading your data, typically to/from a database)
  • Factory, a pattern for object creation
  • Service, a pattern for creating objects that manipulate your main domain objects without being a part of the domain themselves

Now, at this point I have to say that if you haven't heard of any of these things before, you shouldn't be trying to use DDD on any project that you have a deadline for. Before attempting DDD, you should be familiar with design patterns and enterprise design patterns. Knowing these makes DDD a lot easier to grasp. And, as mentioned above, there is a free introduction to DDD available from InfoQ (where you can also find talks about DDD).

So, DDD is an approach to system design that is useful on large projects that involve complex systems. DDD is great when you're dealing with a well-defined system and you have experts on hand to explain how that system needs to function. If you're writing software to automate factory processes, you need access to a shop floor manager who can tell you everything about how those processes operate. Not every project is like this. Sometimes you're creating software that's quite open-ended, where you're not sure exactly what the outcome is going to be at the end of the project. Whilst some DDD principles can help here, not all of it will be applicable. For small projects, the overhead of DDD is simply unnecessary - pragmatism may dictate that it's better to just get the job done rather than worry about the best possible design method.

As of now, DDD has gained a widespread following amongst 'enterprise' developers using .NET or Java, but isn't widely known in the PHP world. This is because the large-scale projects for which DDD is best suited are still relatively rare in PHP - they exist, but they exist alongside many more smaller projects that do not require DDD.

Recently, there have been some huge developments in the PHP world, which mean that large-scale projects are much more achievable than in the past, and PHP has found a new role in large-scale web projects that might previously have been done using Java or .NET. In his post on the subject, Cal Evans talks about how PHP is now being used by web innovators such as Digg and Facebook, as well as blue-chip corporates. PHP 5.3 has added some powerful new language features and has addressed issues of performance, stability and reliability. The Zend Framework provides implementations of many key design patterns which serve as the building blocks of both code and the design of code.

In summary, I think that the PHP community has a great opportunity to learn from other communities who have been solving enterprise problems for years. Concepts such as Domain-Driven Design can help us to make better software. In this series of posts, I'll cover DDD from a PHP perspective, explaining how it can be applied from the perspectives of design and coding.

The next post in this series will cover the groundwork, introducing the basic design patterns that are present in all DDD projects.

Tonight: Presentation to PHPNW

Posted on 5 May 2009 - 5:13pm

Tonight I'll be giving a presentation to PHPNW (event details here) on the subject of Object Relational Mapping in PHP. Putting together a presentation on this topic has been interesting and has caused me to look much more closely at the different types of ORM available. In particular, I've gained a new appreciation of the Zend Framework approach, built around the Table Data Gateway and Row Data Gateway patterns, rather than the Active Record approach favoured by Doctrine (and as used in the Symfony framework).

Active Record's popularity probably owes a lot to the popularity of Rails, which I've never used (I once had a choice between learning Rails and learning Django, and went for Django; I've never felt like revisiting it since). I'm not sure that Active Record is such a good fit for PHP, and using Doctrine does sometimes feel like a lot more complexity than is really needed to get the job done.

Anyhow, if you're interested in ORM and live in or around Manchester (a Venn diagram with a vanishingly small intersection, I'd imagine) then feel free to pop along. See you there!

PS: I've now created a page where you can view my presentations - I'll add this new one tonight once I've given the talk.

An amusing bit of spam

Posted on 13 April 2009 - 12:40pm

Looking through my email this morning, I encountered a fairly normal spam email:

Hi my dear,
my name is joy and i am a beautiful young girl with full of love and carely,
well i saw your email address in your profile today at (www.econsultancy.com)and i love it,
i think we can click together and be good friends
contact me with my email address(**********@yahoo.com)
i will like to show you my photo and at the same time you will know more about me.

thanks for your understanding
joy.
this is my email address (**********@yahoo.com)

This raises an interesting question. I want people to be able to contact me via professional networking sites like Econsultancy, including people that I don't already know. But at the same time, I don't want to receive spam.

The real problem is that I now have to decide if I want to remove my email address from my profile, potentially missing out on useful contacts, or leave it there and suffer the accumulation of spam as my address works its way through the databases of spam operations that will crawl the site. I like the idea of people being able to access my email address when they have some legitimate desire to contact me.

On my own site, this is not a problem. I have a contact form which people can use to contact me. This allows me to do some filtering of the inputs, and also means that I can add a captcha or similar security measure if I want to. What I can't do is place my own contact form on Econsultancy's directory, with control over what passes through it. It's all or nothing - share my email address, or share nothing.