Archive for June, 2008

The 3 minute LinkedIn Overview video

How would you describe LinkedIn to a friend or family member? That’s exactly the question we wanted to answer when we started working with the fine folks at CommonCraft to make a video explaining LinkedIn. Yes, the same folks who brought you “Social Networking in Plain English”!

Since our video is actually ready, I won’t bog down this post by reiterating what LinkedIn is and why I think it’s so great. I’ll just let you watch the video that explains simply what value LinkedIn adds to your professional life.

Note, that we’ve also split the video into two parts so that you can just share a specific section if you want— the first part is an overview of what LinkedIn is…

and the second video is all about how LinkedIn works.

Feel free to embed the videos on your blog and share them with your network!

Share: Email | LinkedIn | Digg | Twitter

LinkedIndia

I’ve been waiting for a while to use that headline in a blog post ;) Recently, we reached a great milestone in our business – 1 million members in India.  Between those of us at LinkedIn who are from India originally (including our very own Blogger-In-Chief Mario Sundar), and those of us who spend time there, there are a lot of us who are both personally and professionally excited about this achievement.

But we can’t take all the credit – it’s the enthusiasm and success of our members that has driven this growth.

When I was in Delhi recently, I sat down with one member, Ajay Jain, an author, journalist, blogger, and enthusiastic LinkedIn user to ask him how LinkedIn has made a difference in his career.  Here’s what he said:

LinkedIn has actually enabled me to move from being just a journalist and blogger to being an author and publisher too. And the site has proven to be just the right marketing platform too for all my work. I wrote my book after extensively interviewing and interacting with LinkedIn users. I use LinkedIn Answers to get additional inputs for any newspaper columns and blogs posts I write.  All this has enabled me to enhance my brand equity in many ways giving me visibility and introductions to valued people who I would otherwise have never known about. LinkedIn is working for me. All I am doing is following my own advice in my book.

But we know that there are thousands of more member stories out there.  I posted a question on Answers yesterday to find more successes:

Indian Linkedin Members: How do you use LinkedIn?

We’ve already gotten some great answers, and we’d love to have more – feel free to post your own story on Answers, or on this blog.

Our million member milestone is good news for our members outside of India, too – in an increasingly global economy, LinkedIn continues to expand in markets around the world, and in a very big way.  With over 24 million members representing every country you can think of, we’re the world’s largest and most powerful online professional network.

What does this mean for you?  Unparalleled opportunities to accelerate your own professional success, by building relationships and exchanging knowledge, opportunities and advice– across town, or across the ocean. Looking for a marketer in Mumbai?  A supplier in Sao Paulo?  An answer from Amsterdam? We’ve got you covered.

We here at LinkedIn will be celebrating our million Indian members with a small celebration – watch for photos on our Flickr stream next week.   But more importantly, we want to offer up a big THANK YOU to our current and future Indian members – and to the members around the world who invited them.

Share: Email | LinkedIn | Digg | Twitter

News Recommendation and Discovery Improvements

Following the announcement of LinkedIn News we regularly been shipping improvements and built on top of the existing functionality.  We are continuously adding companies that are able to see news as well as news queries that should be relevant for those companies. Additionally we are constantly adding new sources for which we pull, we have added news sharing, company discussions around news articles, and last week Armin Ahumada improved how you can recommend an article and Eishay Smith improved how we add syndicated feeds (such as RSS and ATOM) to our fetcher.

1. Recommendation Improvements

Almost everywhere that you see new, you will see a thumb’s-up.  There are three different states:

Grey = no one has recommended or commented on the article
Blue = someone within your company has recommended or commented on the article
Blue with orange rays = you have recommended or commented on the article.

LinkedIn News Dashboard

The benefit to having these states is that it allows you to look at all of the news that is provided to you and scan for articles that your co-workers have engaged with and it helps you decide which articles you would like to take the time to read.

2. News Discovery

When users submit a new article to the site, we are paying attention to the source the article is from.  If we are not getting articles from that source already, we will check to see if the publisher has any syndication feeds that we can fetch news from.  If you are a blogger or a professional online journal in a niche category, it can be hard for us to find you. To start seeing your own content on LinkedIn organically, promote your blog or publication on LinkedIn by listing it as a website on your profile or share your blog posts with your company and connections by “Submitting a new article”.  On that note, we are doing our best to provide our members news of high quality so this does not guarantee news distribution on the LinkedIn, but it definitely won’t hurt :)

Share: Email | LinkedIn | Digg | Twitter

Joining LinkedIn: An Intern’s Perspective

Andrew Carman, LinkedIntern

Despite the foreboding, Matrix-esque connotation, I was excited to become truly LinkedIn. My previous internships were interesting and educational, but I was looking forward to working in a younger, faster company. And, wow! LinkedIn delivers on that. By the end of day one I was set up with envy-inspiring equipment (fully-loaded MacBook Pro, giant Cinema display, and super comfy chair!), friendly, helpful colleagues, and all the tools I needed to start working on my first project, OpenSocial widgets.

The goal was to create a lightweight widget that grabs company information from LinkedIn via OpenSocial, and displays buzz about the user’s company on their LinkedIn home page, all as an exercise to help LinkedIn’s OpenSocial team develop and test the platform. Getting up to speed on OpenSocial was very easy. Between the Google tutorials and knowledgeable colleagues, setting up “hello world” was practically done for me. By day four I had a working, albeit ugly, version of the widget.

In short, working at LinkedIn is awesome. From the fast pace and supportive working environment (free food!) to the trust the company places in all its employees, even interns, LinkedIn is a company I am proud to work for. It’s going to be the best summer ever! Or at the very least, better than that one I spent painting houses. ;-)

Andrew Carman
LinkedIntern

Share: Email | LinkedIn | Digg | Twitter

LinkedIn is 99% Java but 100% Mac

As a podcast addict I’m constantly looking for good shows. As far as I can tell, The Java Posse (from Tor Norbye, Carl Quinn, Dick Wall, and Joe Nuxoll) is the best one out there. I’ve been listening to the show for the last two years and I’m very impressed that they’ve maintained such high quality for so long now. Shortly after joining LinkedIn I created a new LinkedIn Group for Java Posse, which has been growing rapidly.

A few days ago I heard the last episode while enjoying the ease of use of Twitters API. It was a nice surprise to hear the announcement about LinkedIn being elected the “Java Website of the Week”. It was even nicer to hear them praising the famous Linker Steve Ganz.

It seems that the announcement is a result of a blog post from the “Break it Down” blog commenting on the presentations the LinkedIn CDN team did at the last JavaOne. The post is titled LinkedIn Is Written in 99% Java, so to complete the picture I responded to the community with a message about how LinkedIn is 99% Java but 100% Mac.

The rest of the programming languages we use are C++, Ruby on Rails and Groovy/Grails. We have one team that uses Ruby on Rails top to bottom, another which heavily uses Grails, and of course XUL for the Firefox toolbar. While we enjoy using these great technologies, most of our core business logic is written in Java on a Spring/Jetty/Tomcat stack.

The 100% Mac is the development environment used by all the engineers (i.e. desktops and laptops). A new engineer that comes in gets a new MacPro with dual quad-core CPUs and 12GB of ram and a MacBook Pro. The down side of the whole deal is that you have to choose between two 23’’ or one 30’’ Apple Cinema display. Life is tough and you just can’t have it all. ;-)

Ruslan at Work

LinkedIn Development Environment

If you would like to have such an epic working environment you still have a chance – we’re hiring.

Share: Email | LinkedIn | Digg | Twitter

Web Scalability Practices: Bumper Sticker on Rails

This is the first post in a series on scalability using Ruby on Rails including an examination of the steps we took – some successful, some not so much – to scale Bumper Sticker to be one of the top four applications on Facebook. This time out, we’re going to give you a quick history of the Light Engineering Development (LED) team at LinkedIn and the creation of Bumper Sticker.

One of the best things about working for LinkedIn is the constant exposure to new technologies and challenges. While the majority of the LinkedIn infrastructure runs on Java, it’s no secret that we don’t shy away from other interesting languages and frameworks – we’re always looking for ways to make better software faster. This is the spirit that launched the LED group with the charter to see how quickly it could prototype new ideas and features using Ruby on Rails.

Interestingly enough, the most successful of LED’s Rails applications is one of its first – Bumper Sticker, the fun, viral media sharing application that allows users to express their individuality by sticking small, quirky, sometimes edgy, often humorous, rarely serious virtual stickers on each other’s (and their own) Facebook profiles.

Bumper Sticker started as a small experiment in August, 2007. Facebook had released their development platform while we were hard at work on our own. We were curious to experiment and discover some of the characteristics of an application platform built on a social network and to see what, if any, learning we could apply to our own efforts. After noticing that professional and business-related applications weren’t flourishing in the Facebook ecosystem, a few of our Product folks put their heads together while out for a run; one engineer, one week, and a few Joyent accelerators later, Bumper Sticker was born.

We’d be lying if we said that anyone was prepared for the kind of success Bumper Sticker has had since then … though we should have expected it, given the excellent Product team here at LinkedIn. Here’s a quick snapshot of Bumper Sticker statistics at this moment:

  • 13.5 million installations
  • 1.5 million daily active users
  • 20-27 million canvas page views a day

All of this is served by:

  • 13 web application servers running nginx and mongrel
  • 8 static asset servers serving over 3,500,000 stickers, soon to migrate to a content distribution network (CDN)
  • 4 MySQL servers in a master/slave configuration using Rick Olson’s excellent masochism plugin

Ruby on Rails is frequently criticized for lacking the ability to scale. While the road to a billion page views per month has certainly had some potholes, Bumper Sticker has clearly demonstrated that the Rails platform can scale quite well, so as long as the team behind it understands that many of the bottlenecks are exactly those faced by developers on any other database-driven web platform. From an engineering perspective, Bumper Sticker could not be more perfect for developing a set of best practices for scaling web applications that exhibit unpredicted, unexpected, explosive growth.

Stay tuned! There’s much more good stuff to come.

Quick Update: Watch Ikai and Jim describe the genesis of the LED team and Bumper Sticker

Share: Email | LinkedIn | Digg | Twitter

OSGi at LinkedIn: Integrating Spring DM (Part 1)

LinkedIn has been extensively using the Spring Framework for wiring purposes and life cycle management (we seldom use other features like AOP, JDBC, Spring MVC, etc.). In other words we essentially use the IoC container. To give you an idea of how extensive we use it, as of this writing, we have over 1000 Spring files that make up the LinkedIn platform!

Before Spring 2.0, there was no easy way to extend the framework itself to add your own custom XML tags. One might wonder why you would want to do this? Well I guess the best answer lies in the fact that it was introduced with Spring 2.0 :-). More seriously, the idea of having your own custom tags can be compared to the ability of creating a JSP tag library for JSPs: you can create tags that are more specific to your domain, define required attributes so that it can actually be validated with an XML schema (instead of properties), etc.

Example without custom tags:

<bean id="dataSource" class="...JDBCDataSource">
<property name="dbURL" value="jdbc:..."/>
<property name="timeout" value="1000"/>
</bean>

With custom tags (achieving the same result):

<lin:jdbcDataSource id="dataSource" dbURL="jdbc:..." timeout="1000"/>

The documentation for writing your own custom tags explains in details how to create your own. After you’ve created custom tags, your JAR file will look something like the following:

META-INF/
spring.handlers # http://www.linkedin.com/lispring=com.linkedin.spring.LispringNamespaceHandler
spring.schemas  # http://www.linkedin.com/lispring/lispring.xsd=com/linkedin/spring/lispring.xsd
com/
linkedin/
spring/
LispringNamespaceHandler.class # extends NamespaceHandlerSupport
lispring.xsd # contains the schema for the custom tags

Writing the code that handles the new tag is pretty low level and requires you to understand how Spring actually works under the covers. If I had one wish, it would be the ability to write the extension without having to write code (basically defining the extension as a normal Spring XML file!).

Spring Dynamic Modules (or Spring DM) is the integration of Spring and OSGi. It is very interesting because it allows you to stay in POJO land and be able to look for references/deploy services in an OSGi container without ever writing any OSGi specific code. For example you don’t need to write a BundleActivator, Spring DM does the plumbing for you. Spring DM is extending the Spring framework using the namespace extension described previously, to offer a new set of custom tags to wire the services together (<osgi:service> and <osgi:reference>).

Example:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lin="http://www.linkedin.com/lispring-osgi"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/osgi

http://www.springframework.org/schema/osgi/spring-osgi.xsd

http://www.linkedin.com/lispring-osgi

http://www.linkedin.com/lispring-osgi/lispring-osgi.xsd">

<osgi:service ref="jobsDataService" interface="com.linkedin.jobs.ds.api.JobsDataService">
<osgi:service-properties>
<entry key="linkedin.remotable" value="true"/>
</osgi:service-properties>
</osgi:service>
</beans>

So now here is an interesting question: how do you make your own custom tags available with Spring-DM?

In regular (non OSGi) Spring, whenever a namespace is defined in the (rather verbose) XML declaration, Spring uses the classpath to locate the entry point to the code that needs to be executed for the namespace you define (META-INF/spring.handlers). In my previous post, I mentioned that in OSGi the concept of classpath is nonsensical, so clearly this mechanism does not work anymore.

Spring DM actually uses a famous OSGi pattern: the extender pattern. Roughly speaking, it comes down to implementing a listener on the OSGi framework bundle events like "bundle resolved" or "bundle unresolved". Whenever Spring DM detects a resolved bundle which contains the correct file (META-INF/spring.handlers), it adds the namespace to the list of known namespaces (and remove it when the bundle is removed).

This is a very good demonstration of how dynamic OSGi is: it is very easy to add and remove features to a running OSGi container. As a side note, "remove" is a concept that is often overlooked as it can even be experienced in the JDK itself! For example, there is a way to add new protocol handlers for URLs with the method URL.setURLStreamHandlerFactory(URLStreamHandlerFactory factory). Not only this method can be called only once per JVM (as stated in the javadoc), but where is the unset method? Thankfully, the OSGi spec defines a way to add and remove dynamically new stream handlers.

Below is a code example for the extender pattern:

BundleContext context = ...
context.addBundleListener(new BundleListener() {
public void bundleChanged(BundleEvent event)
{
if(event.getType() == BundleEvent.RESOLVED)
{
Enumeration urlEnum = event.getBundle().findEntries("META-INF", "spring.handlers", false);
if(urlEnum != null)
{
// namespace extension detected!
}
}
}
});

Note that in the listener, you have access to the Bundle itself (event.getBundle()), so the extender pattern can be based on whatever you want which is accessible through this interface. For example it could be based on proprietary manifest headers that are accessible through Bundle.getHeaders().

The answer to the original question (about how do you make your own custom tags available with Spring-DM) is now very simple. If you have a JAR file already containing your custom namespace, it is now just a matter of turning the JAR file into an OSGi bundle. Spring-DM will automatically detect it!

I have been using Spring DM 1.1.0-m2 for my testing and it works perfectly. Nonetheless be aware of an issue: there is a race condition which is not properly handled in this release (it is unclear to me whether it will be addressed in a future release). The scenario is the following:

  • Install 2 bundles: B1 which contains the namespace extension and B2 using the namespace extension.
  • If B2 happens to be resolved before B1 then spring will fail when it encounters your custom tag (because it doesn’t know about it).

It is a race condition because it depends on the order and timing in which bundles gets resolved. It can be pretty tricky to enforce an ordering and I believe it would be better if Spring DM would handle this case gracefully. If an unknown namespace is encountered, it should wait for some amount of time for the namespace to be (asynchronously) registered. If the namespace does not get registered within the amount of time, then it should fail. Spring DM is already doing something similar when wiring services which may not be present in the OSGi registry at wiring time.

Stay tuned for part 2: I will be talking about how to extend the Spring DM application context using fragments.

For previous posts on OSGi at LinkedIn, please see my introduction and Java Compilation in OSGi.

Share: Email | LinkedIn | Digg | Twitter

LinkedIn Companion + Firefox 3 = Good Web 2.0 Karma

I’m sure everyone reading this post is cognizant of Mozilla’s recent record breaking download day for the latest version of the Firefox 3 browser! Over 8.3 million downloads in the first 24 hours, a feat that will find mention in next year’s edition of the Guinness Book of World records!

Our team was hard at work to deliver an updated version of our LinkedIn Firefox Companion that’s now compatible with Firefox 3. We also took this opportunity to scale some new features and squash some minor bugs. Not only that, we’re excited that we were one of the featured add-ons recommended by Mozilla.


Keep in mind, this is compatible with both your Macs and PCs. And, yes, you’re welcome! Have a great weekend ahead!

Share: Email | LinkedIn | Digg | Twitter

And so do CNN Money, CNBC, and Yahoo! Tech Ticker

A week ago, Mario blogged that “FOX Business gets LinkedIn” – an obvious reference to the interview that Dan Nye, our CEO, gave to Liz Claman. Subsequent to that interview many of you may have read our recent Series D funding announcement in a post interspersed with a video from our four investors.

You may have also stumbled upon the commentary from one of these news outlets:

New York Times, Wall Street Journal, BusinessWeek, Boom Town, TechCrunch, LA Times, Venture Beat, Reuters, Guardian Online, BBC News and more.

In addition to the above-mentioned coverage, Dan and Reid, were also interviewed by CNN and CNBC (Too bad, we couldn’t embed the video clips in the post itself).

However, we’ve got two parts of an interview that Sarah Lacy (Yahoo! Tech Ticker) did with our co-founder, Reid Hoffman that you can view below.

Part 1: What that $1B really means?
View it here

Part 2: What could stop Web 2.0?
Continue watching here

Share: Email | LinkedIn | Digg | Twitter

Graphing Social Patterns East: The NEED for FEEDS Panel

As mentioned last week here on the LinkedIn blog, I had the privilege to deliver a keynote at this year’s O’Reilly Graphing Social Patterns 2008 conference in Washington, DC.  LinkedIn was one of the featured keynotes, and it was great to have a chance to present our philosophy & vision at the event.  Here is my LinkedIn blog post from last week, where I review the Keynote and the slides presented.

I wanted to take a moment to follow-up with a second post on the conference, specifically about the NEED for FEEDS panel that I participated in Tuesday afternoon. The other panelists included:

It’s normally hard to have a great panel late in the afternoon – people are starting to wear down from waking up early, and sitting a few hundred people in a dark room is not a great way to generate high energy.  This panel, however, was extremely high energy (we even tried to get a Web 2.0 buzzword bingo game going) and ready to engage passionately on the topic.

The balance of the panel was good too – Kevin represented 3rd party application developers well, David & Chris did a great job advocating for open, user-controlled integration, and Dave & I representing the platforms.

I won’t try to cover all the questions or topics from the panel, but there were two points that I made at the panel that I think are worth sharing broadly:

1) Network Feeds are the interesting information problem for this generation of the web.

It’s quickly forgotten, but it wasn’t too long ago that the question of how to present the best 10 search results to a natural search query was a hotly contested product space. When Google, Yahoo, or Microsoft get a query of just a few keywords, they have to decide in an instant which 10 pages out of millions to show you.  Similarly, Amazon has to decide, out of millions of products, which 3 to merchandise to you at any given time.

The question of how to filter and present information and micro-events from your network to you in a digestible form is an extremely difficult and important question, and one of the most exciting things going on right now is the experimentation with different approaches to providing the right events to people at the right time in the right context.

2) How do you define success for Network Feeds?

What makes this challenge particularly difficult is that unlike search or merchandising, it’s unclear in this  context what the right  “success” events are to measure.  With search, it’s clicks.  With e-commerce, it’s purchases.   What should we measure with feeds, where sometimes the value is received just by reading the message?  Is it a click?  A hover?  A rating?  Dave Morin talked about optimizing for user engagement, but I think we’re all still experimenting with the best ways to measure success for feeds.

At LinkedIn, we place an extreme emphasis on business relevance in every application we develop. Nowhere is this more important than in Network Updates, where people count on getting useful updates on activity in their professional network.  As the number of activities and users on LinkedIn grows, we continue to investigate and experiment with ways to optimize the feeds we provide our users.  We have some of our best product, design and engineering talents on this exact problem.

With those two points made, I just want to say thank you to Dave McClure and the rest of the panelists for the great event. I’m looking forward to the next one already.

* By the way, as a lesser known LinkedIn tip, you can click the RSS button next to “Network Updates” on the homepage, and take your Network Events stream with you to any RSS reader.  Chris’ post shows you how.

Share: Email | LinkedIn | Digg | Twitter

Close
E-mail It
Powered by ShareThis