! onqJ%666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666@[Normalu[$\$$d%d&d'dDM
NOPQ]^BB*CJOJPJQJ^J_HaJfHmHphq
sHtH@{ Heading 1{$ZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z<5B*CJ$KH OJPJQJ\^JaJ fHphq
@{ Heading 2{$ZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z>56B*CJOJPJQJ\]^JaJfHphq
@{ Heading 3{$ZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z85B*CJOJPJQJ\^JaJfHphq
@{ Heading 4{$ZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z85B*CJOJPJQJ\^JaJfHphq
@{ Heading 5xZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z>56B*CJOJPJQJ\]^JaJfHphq
@{ Heading 6xZZZ[$Z\$@&$d%d&d'dDM
NOPQ]Z^Z85B*CJOJPJQJ\^JaJfHphq
DA@DDefault Paragraph FontJJwritelytoclowerroman&&Tr$a$""Img0"0Div[$\$2webkitindentblockquoteF$d%d&d'dNOPQehr<B<writelytocdisc.R.Ol[$\$BbBwritelytocdecimal6r6Option[$\$..Ul[$\$66Select[$\$JJwritelytocloweralpha
BlockquoteF$d%d&d'dNOPQehrJJwritelytocupperalpha&&Table..Li[$\$zzpbI$$d%d&d'dNOPQehr88Address[$\$PPPre [$\$]^OJPJQJ^JRQ"ROl_writelytocsubheading5J2Jwritelytocupperroman<B<writelytocnoneT p<#)08z>DD#$%&'()*+,b %.*T58z>D./012345678?QTX
h^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHoh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhHh^`OJQJhHh^`OJQJhHohpp^p`OJQJhHh@@^@`OJQJhHh^`OJQJhHoh^`OJQJhHh^`OJQJhHh^`OJQJhHohPP^P`OJQJhH

T3timesGTimes New Roman7Verdana?Courier New5Symbol;Wingdings@"h$4d2X $P(Growing an iPhone application with an...Unknown!` DAWJ4020 r>>TTZd`j5bhdz`e`+b
e]4_>`0`````````````````````````````Growing an iPhone application with an internal open source project.
For the Agile 2009 conference, ThoughtWorks wanted to help attendees connect to each other and the conference as a whole using exciting technology and simple design. Our solution was an iPhone application that has grown into a platform for conference application. Because of the long history of open source at ThoughtWorks, including projects like CruiseControl, Selenium, and DbDeploy, we choose to develop this project as an internal open source project. We connected developers, designers, and testers from around the world to build a compelling product, while refining our skills in iPhone development and cloud computing.
Although it was initially designed for a single conference, it has been repurposed for several additional conferences including West Coast Green, Agile Australia, and Forrester Consumer Forum. This application continues to evolve and we are currently evaluation converting it into an open platform that can support any conference.
The primary focus of this talk is on the technology involved in our application, how we effectively ran an internal open source project, and how this project will continue to evolve.
Why Conference Connection Application
Agile 2009 Conference, right here on our home turf
Have a booth
About 20 speakers
Hosted a party at our office
Had private 1 on 1 consulting meetings
Want to connect users
In Person Hallway conversations are the best part about conferences
At sessions Find sessions that people like me would like
Find most popular sessions
Online Twitter, blogs
Frustration with paper schedules
Typical conference gives you a big bag of paper.
Sometimes a large book with extra printouts stuffed in the front cover with the schedule and advertisements
Big, bulky
Not environmentally friendly
Can't search
Want reminders for when the sessions you are most interested in happen
They get lost
Don't get updates
How is it build
iPhone front end
Schedule
Maps
Reminders
Automated feedback collection
Twitter news feeds
A bit of Agile Flair Agile Manifesto
Cloud back end running on GAE
Send session updates to phone
Calculate hot sessions
Collect feedback
Local database on iPhone can run completely disconnected
Followed DbDeploy model.
Database has a version.
When you start up or periodically, send message to server requesting all database versions after the current one.
If there are newer changes, apply them to the local database
If there aren't or can't connect, you still have a working database at the current version
Why Internal Open Source
TW is a consulting company with projects all over the country and the world
US, AU, India, China, UK, Brazil
Experts in all kinds of technology
Focus on high risk, business critical systems
We have an open source culture. Creating projects like CruiseControl, Selenium, and DbDeploy
Best talent and people with availability could be anywhere
Different City
Different Country
Different timezones
It is a development methodology, not just a way of licensing software
Visibility
Sharing
Tests for a safety net
Distributed version control makes it easier to keep or reject individual contributions
Our consultants are excited about Mobile platform and Cloud computing. Keeping it open lets more people learn
Different people have different interests.
People tend to volunteer for sections that they know really well Things that are easy
Or want to learn Things that are hard
Very democratic. If someone values a feature, they work on it
If no one wants to do a feature, you have to think about why
You get a lot done when there is excitement and people on the beach
Distributed knowledge makes it easier to get help in a pinch
Before a big deliverable, you want to make yourself available.
Try not to schedule vacations
Try not to have multiple major deliverables at the same time
Have flexibility in case something comes up
We submitted the app over a month before the conference
Heard horror stories about long approval times
We planned ahead
Team was done and back to project work
1 week before the conference, get email saying app is ready for sale. whew, just in time
Because scheduling never works out the way you would expect it to
I waqs packing up all my family s belongings into a 26 foot truck
Driving from Chicago to Cleveland the week before the conference
Couldn t really pick any other week.
My wife had just finished her time as the summer minister at a church here in Chicago,
I had to be back in Chicago the next week for the conference
My son had to start week the week after that.
It was a scheduling nightmare
I had a reputation for doing everything all at once
Graduated
Married
Moved out of state
Started a new job
All in one week
Get a call on Monday Hi, this is Tracy from ThoughtWorks in Atlanta, There are some changes to the schedule. About 80 of them. Don t worry, I ll take care of them. Have fun packing
I get another cal on Tuesday The updates are ready, but there is some bad news. The session updates only work in development. We ll need a new release of the iPhone app to fix it.
We bring back another member of the team to make the change and I submit a new binary.
Friday, I get an email from Apple. This one hurt. Rejected for something that didn t change in the emergency fix we made.
Another member of the team jumps back in and makes the fix. We submit a new binary on Friday
We start calling everyone we know at Apple and beg for a rush review.
We are freaking out. Well, I m not, but everyone else is, because the conference starts on Monday
Sunday, we are all at the office preparing for the conference
Presenters are rehearsing
I get an email. App is approved.
This worked because we had distributed knowledge and universal access to the source.
Limitations of Internal Open Source
Great developers disappear when they are assigned to a new project
Some people will keep helping on evenings and weekends
Need a motivator
Recognition for an important deliverable
Involvement with decision makers
Rewards
Make their lives easier
Most TW open source projects are this kind
They are tools to ease development
Need to interest them in some way. IE team in AU was interested in learning more about TDD for iPhone applications.
When the excitement dies, it is hard to bring it back
Very uneven flow of work
Project work comes first
People will only work when they are motivated
Have to be brutally honest about what is essential and what is nice to have.
Prioritizing is important for any project
It is doubly important when you don t know how much development capacity you will actually have
You may not even get everything you think is essential
Work in small steps and be ready to back out things that don't quite work
Sometimes people disappear before they have really learned the app enough to be productive
Knowledge is not evenly distributed and you may have issues with people disappearing quickly.
Overcome this by working in small tasks
Keep track of what everyone else is doing
Crosspollinate ideas by getting people pairing or working together
Rotate what people are working on
Like a regular open source project, it is a good idea to have a core team that decides what is kept
Internal OSS doesn t get you anything for free. It still takes an investment of time.
Long term growth
Used for several other conferences since then.
Converting from single conference app to multiconference application
Images:Stack of paper  stackOfPaper.jpghttp://www.flickr.com/photos/56507475@N00/2683796968 HYPERLINK "http://www.flickr.com/photos/gregoryjameswalsh/" gregoryjameswalsh
n
r
vz.2JNpt*.04hl{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JBF 48pt :>`d {peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^J DH@Ddh>B$(X\(,lp{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JpHLhlF J ^ b p t P!T!."2"""8#<#{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^J<###
$$$$%%%%&&J&N&&& '$'''''((f(j()"))){peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^J)**.*****++&,*,,,,,,0BFTX4/8/00{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^J0R1V1H2L23333X4\44455P5T556L6P666D7H7h7l77788{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^J888D8H8888899>:B:r:v:::;;;;;;<<(=,===v>z>{peZCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^Jz>4?8?????f@j@@@xAzA$B.BNBRBBB*B*CJOJPJQJ^Jph j5CJUOJPJQJ^J5CJOJPJQJ^J j5CJUOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JCJOJPJQJ^JDDDDCJOJPJQJ^J j5CJUOJPJQJ^Jr
z2Ntzm`
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$ $\$A$a$$[$\$A$]^a$$[$\$A$]^a$$[$\$A$]^a$$[$\$A$]^a$
.4lF 8t}p
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$ >d Hs
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$ $\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$DhB(\}s $\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$,pLlJ b }p
$
&F\$A$a$
$
&F \$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F \$A$a$
$
&F \$A$a$
$
&F
\$A$a$
$
&F
\$A$a$
$
&F
\$A$a$
$
&F \$A$a$b t T!2""<##$$%%}p
$
&F \$A$a$
$
&F \$A$a$
$
&F
\$A$a$
$
&F
\$A$a$
$
&F
\$A$a$
$
&F
\$A$a$
$
&F \$A$a$
$
&F \$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$%&N&&$'''(j(")).*}p
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$.***+*,,,0FX}p
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$8/0V1L233\445T5}p
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$T566P66H7l7788H888vi
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$ $\$A$a$ $\$A$a$
$
&F \$A$a$89B:v::;;;<,==z>}p
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$z>8???j@@zA(B.BRBB@CDvl $\$A$a$
$
&F\$A$a$
$
&F\$A$a$ $\$A$a$ $\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$
$
&F\$A$a$Oh+'0`x
LX@@@0)Growing an iPhone application with an...@՜.+,0( Root Entry Fl@1TableeWordDocument3rSummaryInformation(DocumentSummaryInformation8X
!"#$%&'()*+,./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkmp