80
From Renamer Plugin to Polyglot IDE Dmitry Jemerov CTO, JetBrains Monday, September 9, 13

From Renamer Plugin to Polyglot IDE

Embed Size (px)

DESCRIPTION

History of the IntelliJ IDEA codebase and development practices used in its development.

Citation preview

Page 1: From Renamer Plugin to Polyglot IDE

From Renamer Plugin to Polyglot IDE

Dmitry JemerovCTO, JetBrains

Monday, September 9, 13

Page 2: From Renamer Plugin to Polyglot IDE

IntelliJ IDEA: 2000-2013

• Started as a plugin for JBuilder

• Currently a product line of 8 IDEs, a compiler, a DSL workbench and a server-side code browser

• $xxK initial investment, $yyyM total revenue

• HEAD is a usable IDE every single day

Monday, September 9, 13

Page 3: From Renamer Plugin to Polyglot IDE

Agenda

• IntelliJ IDEA over the years

• IntelliJ IDEA development practices

Monday, September 9, 13

Page 4: From Renamer Plugin to Polyglot IDE

IntelliJ IDEA:Over the Years

Monday, September 9, 13

Page 5: From Renamer Plugin to Polyglot IDE

2000

• February 1st - company birthday

• Founded by Sergey Dmitriev, Eugene Belyaev and Valentin Kipiatkov from TogetherSoft

• IntelliJ Renamer, IntelliJ CodeSearch

Monday, September 9, 13

Page 6: From Renamer Plugin to Polyglot IDE

Monday, September 9, 13

Page 7: From Renamer Plugin to Polyglot IDE

Vista 1.0, Jan 2001

• PSI, VFS, commands

• Saved 2 months by not having plugin API

• Mentioned by Martin Fowler onhttp://refactoring.com/

Monday, September 9, 13

Page 8: From Renamer Plugin to Polyglot IDE

Stella2.0, June 2001

• First external developers

• JSP, CVS, Ant, formatter, live templates

Monday, September 9, 13

Page 9: From Renamer Plugin to Polyglot IDE

Pandora2.5, Dec 2001

• 13 new refactorings

• JUnit integration, one unit test in code

• Released 1 month after Eclipse 1.0

Monday, September 9, 13

Page 10: From Renamer Plugin to Polyglot IDE

IDEA 2.6June 2002

• Company renamed to JetBrains

• JOLT Award in April 2002

Monday, September 9, 13

Page 11: From Renamer Plugin to Polyglot IDE

Ariadna3.0, Nov 2002

• OpenAPI,

• 2 plugins (open-source): Starteam, Tomcat

• XML

• Real tests

• Oldest version available for download

Monday, September 9, 13

Page 12: From Renamer Plugin to Polyglot IDE

Fabrique

Monday, September 9, 13

Page 13: From Renamer Plugin to Polyglot IDE

Fabrique

• Framework and set of components for developing Web applications

Monday, September 9, 13

Page 14: From Renamer Plugin to Polyglot IDE

Fabrique

• Framework and set of components for developing Web applications

• Visual IDE based on top of IntelliJ IDEA

Monday, September 9, 13

Page 15: From Renamer Plugin to Polyglot IDE

Fabrique

• Framework and set of components for developing Web applications

• Visual IDE based on top of IntelliJ IDEA

• Drove a lot of platform API changes

Monday, September 9, 13

Page 16: From Renamer Plugin to Polyglot IDE

Fabrique

• Framework and set of components for developing Web applications

• Visual IDE based on top of IntelliJ IDEA

• Drove a lot of platform API changes

• Project view, structure view, extensions

Monday, September 9, 13

Page 17: From Renamer Plugin to Polyglot IDE

Fabrique

• Framework and set of components for developing Web applications

• Visual IDE based on top of IntelliJ IDEA

• Drove a lot of platform API changes

• Project view, structure view, extensions

• Canceled in 2005 before reaching 1.0

Monday, September 9, 13

Page 18: From Renamer Plugin to Polyglot IDE

Monday, September 9, 13

Page 19: From Renamer Plugin to Polyglot IDE

ReSharper

• Started in mid-2003

• Implemented in C#, di!erent architecture

• Initially used some parser/PSI technology from IntelliJ IDEA

Monday, September 9, 13

Page 20: From Renamer Plugin to Polyglot IDE

Aurora4.0, Feb 2004

• Multiple-module projects

• On-the-fly inspections

• UI Designer

Monday, September 9, 13

Page 21: From Renamer Plugin to Polyglot IDE

Pallada4.5, July 2004

• J2EE

• First two community-developed plugins

• Inspection Gadgets

• Intention PowerPack

Monday, September 9, 13

Page 22: From Renamer Plugin to Polyglot IDE

Irida5.0, Aug 2005

• Custom language API

• JavaScript, Python

• Perforce + Subversion, open-source plugins

• 1M LOC

• 10 developers, no QA engineers

Monday, September 9, 13

Page 23: From Renamer Plugin to Polyglot IDE

Monday, September 9, 13

Page 24: From Renamer Plugin to Polyglot IDE

Demetra6.0, Oct 2006

• Core and Enterprise subteams

• TeamCity 1.0

• First plugin contest

Monday, September 9, 13

Page 25: From Renamer Plugin to Polyglot IDE

Selena7.0, Oct 2007

• New caching VFS implementation

• Facets

• Ruby, Groovy

Monday, September 9, 13

Page 26: From Renamer Plugin to Polyglot IDE

Diana8.0, Nov 2008

• Java-independent IntelliJ Platform extracted

• RubyMine 1.0 in April 2009

• Language-independent indices

• Language-independent debugger

Monday, September 9, 13

Page 27: From Renamer Plugin to Polyglot IDE

Community EditionOct 2009

• Moved to git

• ~ 60% of codebase open-sourced

• Expected 30% drop in sales, got small gain

• Couple dozen external contributors

Monday, September 9, 13

Page 28: From Renamer Plugin to Polyglot IDE

Maia9.0, Dec 2009

• Background indexing

• Artifacts

• PHP

Monday, September 9, 13

Page 29: From Renamer Plugin to Polyglot IDE

Idea X, Xena10.0, Dec 2010; 10.5; Feb 2011

• Autopopup completion

• Android in Community Edition

• PhpStorm (May 2010), PyCharm (Oct 2010)

Monday, September 9, 13

Page 30: From Renamer Plugin to Polyglot IDE

Nika11.0, Dec 2011

• UI redesign

• "core" package for Kotlin compiler

• AppCode (Oct 2011)

Monday, September 9, 13

Page 31: From Renamer Plugin to Polyglot IDE

Leda12.0, Dec 2012

• Darcula

• External make

• UpSource, headless indexing framework

Monday, September 9, 13

Page 32: From Renamer Plugin to Polyglot IDE

Android StudioMay 2013

Monday, September 9, 13

Page 33: From Renamer Plugin to Polyglot IDE

Android StudioMay 2013

• Built by Google with support by JetBrains

Monday, September 9, 13

Page 34: From Renamer Plugin to Polyglot IDE

Android StudioMay 2013

• Built by Google with support by JetBrains

• Apache 2.0 licensed, no contracts and no money involved

Monday, September 9, 13

Page 35: From Renamer Plugin to Polyglot IDE

Android StudioMay 2013

• Built by Google with support by JetBrains

• Apache 2.0 licensed, no contracts and no money involved

• 500K downloads in first 3 weeks

Monday, September 9, 13

Page 36: From Renamer Plugin to Polyglot IDE

CardeaVersion 13, in development

Monday, September 9, 13

Page 37: From Renamer Plugin to Polyglot IDE

CardeaVersion 13, in development

• ~ 25 developers

Monday, September 9, 13

Page 38: From Renamer Plugin to Polyglot IDE

CardeaVersion 13, in development

• ~ 25 developers

• ~ 5.6M LOC, ~3M LOC open-source

Monday, September 9, 13

Page 39: From Renamer Plugin to Polyglot IDE

CardeaVersion 13, in development

• ~ 25 developers

• ~ 5.6M LOC, ~3M LOC open-source

• ~ 100K daily active users, 72% Ultimate

Monday, September 9, 13

Page 40: From Renamer Plugin to Polyglot IDE

CardeaVersion 13, in development

• ~ 25 developers

• ~ 5.6M LOC, ~3M LOC open-source

• ~ 100K daily active users, 72% Ultimate

• 50% Windows, 30% Mac, 20% Linux

Monday, September 9, 13

Page 41: From Renamer Plugin to Polyglot IDE

IntelliJ IDEA:Development Practices

Monday, September 9, 13

Page 42: From Renamer Plugin to Polyglot IDE

Break the Rules

• No detailed planning

• No unit tests

• No QA

• No code comments or internal docs

• No API compatibility

• Many wheels reinvented

Monday, September 9, 13

Page 43: From Renamer Plugin to Polyglot IDE

Release Planning

Monday, September 9, 13

Page 44: From Renamer Plugin to Polyglot IDE

Release Planning

• Management sets only high-level goals and target date

Monday, September 9, 13

Page 45: From Renamer Plugin to Polyglot IDE

Release Planning

• Management sets only high-level goals and target date

• Each developer responsible for detailed planning of their subsystem(s)

Monday, September 9, 13

Page 46: From Renamer Plugin to Polyglot IDE

Release Planning

• Management sets only high-level goals and target date

• Each developer responsible for detailed planning of their subsystem(s)

• No iteration planning

Monday, September 9, 13

Page 47: From Renamer Plugin to Polyglot IDE

Release Planning

• Management sets only high-level goals and target date

• Each developer responsible for detailed planning of their subsystem(s)

• No iteration planning

• No feature specifications

Monday, September 9, 13

Page 48: From Renamer Plugin to Polyglot IDE

Standup Meetings

• Daily, broken into sub-teams

• Over video conference between St.Petersburg, Munich and Prague

• Allow management, QA and writers to stay on top of dev activity

Monday, September 9, 13

Page 49: From Renamer Plugin to Polyglot IDE

Development Flow

• Everything done in master

• Almost no long-lived feature branches

• Branches used only for releases

• Refactorings in incremental steps

• New features side by side with existing code, turned on by system property

Monday, September 9, 13

Page 50: From Renamer Plugin to Polyglot IDE

Automated Testing

• Mostly data-driven acceptance tests

• Code before, action to perform, code after

• Few pure unit tests, little usage of mocks

• Test framework agnostic (JUnit, TestNG, Cucumber)

Monday, September 9, 13

Page 51: From Renamer Plugin to Polyglot IDE

Continuous Integration

• Used TeamCity since day 0, CruiseControl before that

• Remote run not mandatory but recommended

Monday, September 9, 13

Page 52: From Renamer Plugin to Polyglot IDE

Testing: Upsides

• Easy to write

• Often just copy code example from bug report

• Very little fragility when impl changes

• Tests written 8 years ago still valuable

Monday, September 9, 13

Page 53: From Renamer Plugin to Polyglot IDE

Testing: Downsides

• Whole test suite (37K tests) takes 7 hours to run

• Multiple commits per test run

• Failures di"cult to debug

• Especially async code (indexing, UI)

• Tests stay red for weeks

Monday, September 9, 13

Page 54: From Renamer Plugin to Polyglot IDE

Testers

• Had no testers until 2006

• Focus on manual testing and usability

• No "quality assurance" as such, relying more on CI tests and user feedback

Monday, September 9, 13

Page 55: From Renamer Plugin to Polyglot IDE

update.bat

• Every developer starts their day with building IntelliJ IDEA from latest sources

• "Do not update" emails if something badly broken

• Core Java stu! always works

Monday, September 9, 13

Page 56: From Renamer Plugin to Polyglot IDE

Early Access Preview

• Public free-to-use builds released every 1-2 weeks

• Broad community testing for features we don't use internally

• A few thousand active EAP users

• Licenses for most helpful participants

Monday, September 9, 13

Page 57: From Renamer Plugin to Polyglot IDE

Public Issue Tracker

• Initially ITN, then JIRA, then YouTrack

• ~ 50 new issues per day

• Low noise but many duplicates

• Triaging incoming issues – almost full-time job

• Imbalance between developers

Monday, September 9, 13

Page 58: From Renamer Plugin to Polyglot IDE

Exception Analyzer

• Separate from issue tracker

• Reports grouped into problems

• Semiautomatic merging of duplicates

• Exception duty rotated between developers, takes a few hours per day

Monday, September 9, 13

Page 59: From Renamer Plugin to Polyglot IDE

Code Review

• Previously used manual review (mostly face-to-face) for merging into release branches

• Now reviewing all platform changes

• Using Crucible and hating it

• Need tools to see context of change

Monday, September 9, 13

Page 60: From Renamer Plugin to Polyglot IDE

Support

Monday, September 9, 13

Page 61: From Renamer Plugin to Polyglot IDE

Support

• Until recently one support engineer (Serge Baranov) was covering all IntelliJ Platform-based IDEs

Monday, September 9, 13

Page 62: From Renamer Plugin to Polyglot IDE

Support

• Until recently one support engineer (Serge Baranov) was covering all IntelliJ Platform-based IDEs

• Best Technical Support (small to medium-sized business, SD Magazine Reader's Choice 2005)

Monday, September 9, 13

Page 63: From Renamer Plugin to Polyglot IDE

Support

• Until recently one support engineer (Serge Baranov) was covering all IntelliJ Platform-based IDEs

• Best Technical Support (small to medium-sized business, SD Magazine Reader's Choice 2005)

• Developers actively involved

Monday, September 9, 13

Page 64: From Renamer Plugin to Polyglot IDE

Internal Docs

Monday, September 9, 13

Page 65: From Renamer Plugin to Polyglot IDE

Internal Docs

• XP's belief: comments are a code smell

Monday, September 9, 13

Page 66: From Renamer Plugin to Polyglot IDE

Internal Docs

• XP's belief: comments are a code smell

• Most 3rd party plugins are open-source, good examples

Monday, September 9, 13

Page 67: From Renamer Plugin to Polyglot IDE

Internal Docs

• XP's belief: comments are a code smell

• Most 3rd party plugins are open-source, good examples

• Improving docs does not increase average plugin quality

Monday, September 9, 13

Page 68: From Renamer Plugin to Polyglot IDE

Internal Docs

• XP's belief: comments are a code smell

• Most 3rd party plugins are open-source, good examples

• Improving docs does not increase average plugin quality

• Investing into docs to promote IntelliJ Platform to companies

Monday, September 9, 13

Page 69: From Renamer Plugin to Polyglot IDE

Plugin API

Monday, September 9, 13

Page 70: From Renamer Plugin to Polyglot IDE

Plugin API

• No separate facade, plugins access internal IDE classes directly

Monday, September 9, 13

Page 71: From Renamer Plugin to Polyglot IDE

Plugin API

• No separate facade, plugins access internal IDE classes directly

• No way to repurpose IDE the way we did without breaking API compatibility

Monday, September 9, 13

Page 72: From Renamer Plugin to Polyglot IDE

Community Plugins

• Large part of feature set

• Always by agreement with author

• Usually reworked at JetBrains

• Usually kept open-source

• Rewards through plugin contest

• Sometimes hiring authors

Monday, September 9, 13

Page 73: From Renamer Plugin to Polyglot IDE

Build System

• Not using Maven or Gradle

• Still storing dependency .jar files in VCS

• JPS: tool that builds IntelliJ IDEA project from command line

• Same as external make in IDE

• Gant scripts to generate distribution

Monday, September 9, 13

Page 74: From Renamer Plugin to Polyglot IDE

Extensibility

• Not using OSGi, Guice or Spring

• PicoContainer for dependency injection

• Home-grown extension point system

• Components and extensions to load specified in .xml files

Monday, September 9, 13

Page 75: From Renamer Plugin to Polyglot IDE

Non-Java Languages

• Some Groovy for tests

• Live Edit's Chrome extension written in Kotlin and translated to JavaScript

• Scala plugin written in Scala

• Clojure plugin uses some Clojure

Monday, September 9, 13

Page 76: From Renamer Plugin to Polyglot IDE

Summary

Monday, September 9, 13

Page 77: From Renamer Plugin to Polyglot IDE

Summary

• Codebase repurposed far beyond original goals through relentless refactoring

Monday, September 9, 13

Page 78: From Renamer Plugin to Polyglot IDE

Summary

• Codebase repurposed far beyond original goals through relentless refactoring

• Full-time dogfooding is essential for maintaining quality and usability

Monday, September 9, 13

Page 79: From Renamer Plugin to Polyglot IDE

Summary

• Codebase repurposed far beyond original goals through relentless refactoring

• Full-time dogfooding is essential for maintaining quality and usability

• Lightweight process is enough for product development with no external stakeholders

Monday, September 9, 13

Page 80: From Renamer Plugin to Polyglot IDE

Q&A

[email protected]@intelliyole

Develop with Pleasure!

Monday, September 9, 13