SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Daniel Teng, Certified Scrum Coach
Tech talk at Think in Lamp Gathering
June 6, 2010
   Continuous Integration
   Check In Dance
   ATDD & TDD
   Live Demo
   The Challenges
   CI in One Page
   Why It Helps
   Visualize the Status
   CI Tools
   Basic Guidelines
   Integration of components
   Application configuration
   Deployment
   Testing
   Monitoring
   Logging
   Safe Net
   Communication
   Feedback
   History
   Website
   Email
   Desktop notification
   Build monitor
   Traffic light
   Rabbit
   Sound
   Hudson
   CruiseControl, CruiseControl.Net,
    CruiseControl.rb
   TeamCity
   Team Foundation Server
   More on
    http://en.wikipedia.org/wiki/Continuous_Integ
    ration#Software
   Check in as often as you can
   Avoid stale code
   Don't ever check into or out of a busted build
   Communicate and negotiate check in's to the
    rest of the team
   If you're working on fixing the build, let the
    rest of the team know
   DON'T LEAVE THE BUILD BROKEN
    OVERNIGHT
   Check in Dance
   Go
   Get the latest code from source control.
   Do a merge on any conflicts.
   Run the build locally and fix any problems
   Peer Review
   Let the rest of the team know a change is
    coming if it's a significant update.
   Commit the changes to source control.
   Stop coding until the build passes.
   If the build breaks, drop everything else and
    fix the build.
   The Agile Cycles
   TDD Cycles
Sprint demo

Acceptance Test

  Continuous
  integration

    Unit test


      Pair
  programming
User Story Selected For           Development
Iteration
                                   Story
                                   Implemented
Domain Model / User
                                   Using TDD
Story Elaborated For
Feature
                                   Unit Tests
StoryTest developed by             Initially Fail
Business Owners and
Development/QA
                                   Refactor Until
                                   Unit Tests           Story
   StoryTest Initially             Pass                 Accepted
   Fails                                                when Story
                                                        Test passes


                    Defining “done” for a user story.
   Problem -> String Calculator
   Tools
      Fitness & Slim, FitSharp (revised)
      TeamCity
      C# 3.5
      VS.Net 2008 + ReSharper 4.5
      SubVersion
      NAnt + MSBuild
      NUnit
      NCover + NCoverExplorer
      NDepend
Email: tengzhenyu@gmail.com                  Blog: http://www.cnblogs.com/tengzy/
LinkedIn: http://www.linkedin.com/in/dteng   Twitter: http://twitter.com/danielteng

Mais conteúdo relacionado

Mais procurados

Manual testing good notes
Manual testing good notesManual testing good notes
Manual testing good notes
dkns0906
 
4. bagian bagian struktur konstruksi jembatan
4. bagian bagian struktur konstruksi jembatan4. bagian bagian struktur konstruksi jembatan
4. bagian bagian struktur konstruksi jembatan
Agus Tri
 

Mais procurados (20)

Manual testing good notes
Manual testing good notesManual testing good notes
Manual testing good notes
 
Successfully Implementing BDD in an Agile World
Successfully Implementing BDD in an Agile WorldSuccessfully Implementing BDD in an Agile World
Successfully Implementing BDD in an Agile World
 
99160197 kendali-mutu-beton
99160197 kendali-mutu-beton99160197 kendali-mutu-beton
99160197 kendali-mutu-beton
 
4. bagian bagian struktur konstruksi jembatan
4. bagian bagian struktur konstruksi jembatan4. bagian bagian struktur konstruksi jembatan
4. bagian bagian struktur konstruksi jembatan
 
Test-Driven Development (TDD)
Test-Driven Development (TDD)Test-Driven Development (TDD)
Test-Driven Development (TDD)
 
Rest api 테스트 수행가이드
Rest api 테스트 수행가이드Rest api 테스트 수행가이드
Rest api 테스트 수행가이드
 
Meetup #4 Testing Manifesto
Meetup #4 Testing ManifestoMeetup #4 Testing Manifesto
Meetup #4 Testing Manifesto
 
Test and Behaviour Driven Development (TDD/BDD)
Test and Behaviour Driven Development (TDD/BDD)Test and Behaviour Driven Development (TDD/BDD)
Test and Behaviour Driven Development (TDD/BDD)
 
MODUL TKP M5KB2 - GAMBAR BANGUNAN JALAN _ JEMBATAN
MODUL TKP M5KB2 - GAMBAR BANGUNAN JALAN _ JEMBATANMODUL TKP M5KB2 - GAMBAR BANGUNAN JALAN _ JEMBATAN
MODUL TKP M5KB2 - GAMBAR BANGUNAN JALAN _ JEMBATAN
 
API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)
 
Planejamento de testes em um mundo ágil
Planejamento de testes em um mundo ágilPlanejamento de testes em um mundo ágil
Planejamento de testes em um mundo ágil
 
OKR Playbook v2.0.pptx
OKR Playbook v2.0.pptxOKR Playbook v2.0.pptx
OKR Playbook v2.0.pptx
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
QA interview questions and answers
QA interview questions and answersQA interview questions and answers
QA interview questions and answers
 
발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법발표자료 1인qa로살아남는6가지방법
발표자료 1인qa로살아남는6가지방법
 
Add boq tpa morowali
Add boq tpa morowaliAdd boq tpa morowali
Add boq tpa morowali
 
Konstruksi Bahan Bangunan-Baja
Konstruksi Bahan Bangunan-BajaKonstruksi Bahan Bangunan-Baja
Konstruksi Bahan Bangunan-Baja
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
웹서버와 ProudNet 서버간 상호작용 가이드
웹서버와 ProudNet 서버간 상호작용 가이드웹서버와 ProudNet 서버간 상호작용 가이드
웹서버와 ProudNet 서버간 상호작용 가이드
 
TMMi Implementation Guideline
TMMi Implementation GuidelineTMMi Implementation Guideline
TMMi Implementation Guideline
 

Destaque

Looking At Christmas Back In Time
Looking At Christmas Back In TimeLooking At Christmas Back In Time
Looking At Christmas Back In Time
Jeanette Murphy
 
11 Pipers Piping
11 Pipers Piping11 Pipers Piping
11 Pipers Piping
genequezada
 
Brochure In2intelligence
Brochure In2intelligenceBrochure In2intelligence
Brochure In2intelligence
remconicolai
 
FINISTERRE
FINISTERREFINISTERRE
FINISTERRE
NCS
 
PeaK Ict Wiki Space Histry Jan Oct 2009
PeaK Ict Wiki Space Histry Jan Oct 2009PeaK Ict Wiki Space Histry Jan Oct 2009
PeaK Ict Wiki Space Histry Jan Oct 2009
Jeanette Murphy
 
Capturing Evidential Data –
Capturing Evidential Data –Capturing Evidential Data –
Capturing Evidential Data –
Jeanette Murphy
 

Destaque (20)

Hyperactivation
HyperactivationHyperactivation
Hyperactivation
 
Voorbeelden voor Zeeland: Mediaregeling Limburg & e52
Voorbeelden voor Zeeland: Mediaregeling Limburg & e52Voorbeelden voor Zeeland: Mediaregeling Limburg & e52
Voorbeelden voor Zeeland: Mediaregeling Limburg & e52
 
Social Media For Small Business 5 10 11
Social Media For Small Business   5 10 11Social Media For Small Business   5 10 11
Social Media For Small Business 5 10 11
 
Pmr Bm Kertas 1 Set 3
Pmr Bm Kertas 1 Set 3Pmr Bm Kertas 1 Set 3
Pmr Bm Kertas 1 Set 3
 
Historic Springfield Ppt
Historic Springfield PptHistoric Springfield Ppt
Historic Springfield Ppt
 
Payroll And Personal Services
Payroll And Personal ServicesPayroll And Personal Services
Payroll And Personal Services
 
Mediamachten en e52, voor #smc040
Mediamachten en e52, voor #smc040 Mediamachten en e52, voor #smc040
Mediamachten en e52, voor #smc040
 
Looking At Christmas Back In Time
Looking At Christmas Back In TimeLooking At Christmas Back In Time
Looking At Christmas Back In Time
 
11 Pipers Piping
11 Pipers Piping11 Pipers Piping
11 Pipers Piping
 
Circuito
CircuitoCircuito
Circuito
 
Brochure In2intelligence
Brochure In2intelligenceBrochure In2intelligence
Brochure In2intelligence
 
Company profile royal bricks infraheights
Company profile   royal bricks infraheightsCompany profile   royal bricks infraheights
Company profile royal bricks infraheights
 
Has Anyone Asked a Customer?
Has Anyone Asked a Customer?Has Anyone Asked a Customer?
Has Anyone Asked a Customer?
 
FINISTERRE
FINISTERREFINISTERRE
FINISTERRE
 
PeaK Ict Wiki Space Histry Jan Oct 2009
PeaK Ict Wiki Space Histry Jan Oct 2009PeaK Ict Wiki Space Histry Jan Oct 2009
PeaK Ict Wiki Space Histry Jan Oct 2009
 
T2, Week 6, 2010
T2, Week 6, 2010T2, Week 6, 2010
T2, Week 6, 2010
 
Roger
RogerRoger
Roger
 
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare BiscuitCeramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
Ceramic teapots -PMI Loyalty Program for Red Rose Te and Dare Biscuit
 
Capturing Evidential Data –
Capturing Evidential Data –Capturing Evidential Data –
Capturing Evidential Data –
 
RUN FOR HOPE
RUN FOR HOPERUN FOR HOPE
RUN FOR HOPE
 

Semelhante a Check in dance

Testing apps with MTM and Tea Foundation Service
Testing apps with MTM and Tea Foundation ServiceTesting apps with MTM and Tea Foundation Service
Testing apps with MTM and Tea Foundation Service
Kevin DeRudder
 
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
Anna Russo
 

Semelhante a Check in dance (20)

Agile Software Development in Practice - A Developer Perspective
Agile Software Development in Practice - A Developer PerspectiveAgile Software Development in Practice - A Developer Perspective
Agile Software Development in Practice - A Developer Perspective
 
TDD - Agile
TDD - Agile TDD - Agile
TDD - Agile
 
Continuous delivery slideshare upload 101914
Continuous delivery   slideshare upload 101914Continuous delivery   slideshare upload 101914
Continuous delivery slideshare upload 101914
 
PyCon 9: Continuous Delivery starts at your Development Dnvironment
PyCon 9: Continuous Delivery starts at your Development DnvironmentPyCon 9: Continuous Delivery starts at your Development Dnvironment
PyCon 9: Continuous Delivery starts at your Development Dnvironment
 
Continuous Delivery for Python Developers – PyCon Otto
Continuous Delivery for Python Developers – PyCon OttoContinuous Delivery for Python Developers – PyCon Otto
Continuous Delivery for Python Developers – PyCon Otto
 
Test driven development_continuous_integration
Test driven development_continuous_integrationTest driven development_continuous_integration
Test driven development_continuous_integration
 
Ci tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepinsCi tips and_tricks_linards_liepins
Ci tips and_tricks_linards_liepins
 
Agile Software Development Process Practice in Thai Culture
Agile Software Development Process Practice in Thai CultureAgile Software Development Process Practice in Thai Culture
Agile Software Development Process Practice in Thai Culture
 
Tech talks #1- Unit testing and TDD
Tech talks #1- Unit testing and TDDTech talks #1- Unit testing and TDD
Tech talks #1- Unit testing and TDD
 
TDD with BizTalk
TDD with BizTalkTDD with BizTalk
TDD with BizTalk
 
Adrian marinica continuous integration in the visual studio world
Adrian marinica   continuous integration in the visual studio worldAdrian marinica   continuous integration in the visual studio world
Adrian marinica continuous integration in the visual studio world
 
xUnit and TDD: Why and How in Enterprise Software, August 2012
xUnit and TDD: Why and How in Enterprise Software, August 2012xUnit and TDD: Why and How in Enterprise Software, August 2012
xUnit and TDD: Why and How in Enterprise Software, August 2012
 
Continuous Everything
Continuous EverythingContinuous Everything
Continuous Everything
 
Beyond Scrum: Scaling Agile with Continuous Delivery and Subversion
Beyond Scrum: Scaling Agile with Continuous Delivery and SubversionBeyond Scrum: Scaling Agile with Continuous Delivery and Subversion
Beyond Scrum: Scaling Agile with Continuous Delivery and Subversion
 
TDD in functional testing with WebDriver
TDD in functional testing with WebDriverTDD in functional testing with WebDriver
TDD in functional testing with WebDriver
 
Testing apps with MTM and Tea Foundation Service
Testing apps with MTM and Tea Foundation ServiceTesting apps with MTM and Tea Foundation Service
Testing apps with MTM and Tea Foundation Service
 
#SPSToronto How to do #DevOps with #SPFx and why it matters
#SPSToronto How to do #DevOps with #SPFx and why it matters#SPSToronto How to do #DevOps with #SPFx and why it matters
#SPSToronto How to do #DevOps with #SPFx and why it matters
 
Continuous Integration & the Release Maturity Model
Continuous Integration & the Release Maturity Model Continuous Integration & the Release Maturity Model
Continuous Integration & the Release Maturity Model
 
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
STAREAST 2011 - 7 Steps To Improving Software Quality using Microsoft Test Ma...
 
Essential practices and thinking tools for Agile Adoption
Essential practices and thinking tools for Agile AdoptionEssential practices and thinking tools for Agile Adoption
Essential practices and thinking tools for Agile Adoption
 

Mais de Daniel Teng

How to Get There - An Ideathon Toolkit
How to Get There - An Ideathon ToolkitHow to Get There - An Ideathon Toolkit
How to Get There - An Ideathon Toolkit
Daniel Teng
 

Mais de Daniel Teng (11)

Pretotyping Before Prototyping @ QCon Beijing
Pretotyping Before Prototyping @ QCon BeijingPretotyping Before Prototyping @ QCon Beijing
Pretotyping Before Prototyping @ QCon Beijing
 
Fearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdfFearless Change RSG Japan English.pdf
Fearless Change RSG Japan English.pdf
 
Be(yond/neath) Scrum Values
Be(yond/neath) Scrum Values Be(yond/neath) Scrum Values
Be(yond/neath) Scrum Values
 
Dance in the Darkness
Dance in the DarknessDance in the Darkness
Dance in the Darkness
 
Adult Manifesto
Adult ManifestoAdult Manifesto
Adult Manifesto
 
Be the Owner
Be the OwnerBe the Owner
Be the Owner
 
How to Get There - An Ideathon Toolkit
How to Get There - An Ideathon ToolkitHow to Get There - An Ideathon Toolkit
How to Get There - An Ideathon Toolkit
 
Meteor is Coming
Meteor is ComingMeteor is Coming
Meteor is Coming
 
Tool
ToolTool
Tool
 
Agile Beyond Software
Agile Beyond SoftwareAgile Beyond Software
Agile Beyond Software
 
Road To Agility
Road To AgilityRoad To Agility
Road To Agility
 

Último

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Último (20)

Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 

Check in dance

  • 1. Daniel Teng, Certified Scrum Coach Tech talk at Think in Lamp Gathering June 6, 2010
  • 2.
  • 3. Continuous Integration  Check In Dance  ATDD & TDD  Live Demo
  • 4. The Challenges  CI in One Page  Why It Helps  Visualize the Status  CI Tools  Basic Guidelines
  • 5. Integration of components  Application configuration  Deployment  Testing  Monitoring  Logging
  • 6.
  • 7. Safe Net  Communication  Feedback  History
  • 8. Website  Email  Desktop notification  Build monitor  Traffic light  Rabbit  Sound
  • 9.
  • 10.
  • 11.
  • 12. Hudson  CruiseControl, CruiseControl.Net, CruiseControl.rb  TeamCity  Team Foundation Server  More on http://en.wikipedia.org/wiki/Continuous_Integ ration#Software
  • 13. Check in as often as you can  Avoid stale code  Don't ever check into or out of a busted build  Communicate and negotiate check in's to the rest of the team  If you're working on fixing the build, let the rest of the team know  DON'T LEAVE THE BUILD BROKEN OVERNIGHT
  • 14. Check in Dance  Go
  • 15. Get the latest code from source control.  Do a merge on any conflicts.  Run the build locally and fix any problems  Peer Review  Let the rest of the team know a change is coming if it's a significant update.  Commit the changes to source control.  Stop coding until the build passes.  If the build breaks, drop everything else and fix the build.
  • 16.
  • 17. The Agile Cycles  TDD Cycles
  • 18. Sprint demo Acceptance Test Continuous integration Unit test Pair programming
  • 19. User Story Selected For Development Iteration Story Implemented Domain Model / User Using TDD Story Elaborated For Feature Unit Tests StoryTest developed by Initially Fail Business Owners and Development/QA Refactor Until Unit Tests Story StoryTest Initially Pass Accepted Fails when Story Test passes Defining “done” for a user story.
  • 20. Problem -> String Calculator  Tools  Fitness & Slim, FitSharp (revised)  TeamCity  C# 3.5  VS.Net 2008 + ReSharper 4.5  SubVersion  NAnt + MSBuild  NUnit  NCover + NCoverExplorer  NDepend
  • 21. Email: tengzhenyu@gmail.com Blog: http://www.cnblogs.com/tengzy/ LinkedIn: http://www.linkedin.com/in/dteng Twitter: http://twitter.com/danielteng