Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Eclipse Code Recommenders @ cross-event Deutsche Telekom Developer Garden TechTalk and Java User Group Darmstadt

1,518 views

Published on

Code Recommenders in depth techtalk slides,

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Eclipse Code Recommenders @ cross-event Deutsche Telekom Developer Garden TechTalk and Java User Group Darmstadt

  1. 1. Eclipse CodeRecommendersIDE  2.0:  Leveraging  the  Wisdomof  the  So:ware  Engineering  Crowds dt sta alk m ar chTtw:  @MarcelBruch p  D n  Teg+:  +Marcel  Bruch r ou de r  G ar se er  G a  U lop Jav v e De
  2. 2. 2
  3. 3. Eclipse  Code  Recommenders             All Frameworks CodeCode Eclipse CodeDevelopers Who Called “new Text()” Method Also Called setText() addListener() setLayout() setFont() 89% 53% 99% 35%What Do Developers Ultimately Override After Extending This Class? 100 % overwrote PreferencePage.createContents() 96 % overwrote PreferencePage.performOk() 5 % overwrote PreferencePage.performCancel() 3
  4. 4. “Other  developers  frequently  bought  used  the  following  methods…”INTELLIGENT  CODE  COMPLETION
  5. 5. Code  Comple8on…@Overrideprotected Control createDialogArea(final Composite parent) { Composite container = (Composite) super.createDialogArea(parent); swtTextWidget = new Text(container, SWT.BORDER); swtTextWidget.| return container;} What  does  the  developer  need,  i.e.,  which  methods  should   the  code  compleLon  present  to  the  user? 5
  6. 6. All  164  Methods  of  Text  ?
  7. 7. JBuTon?  381  Methods.
  8. 8. Code  Comple8on…@Overrideprotected Control createDialogArea(final Composite parent) { final Composite container = (Composite) super.createDialogArea(parent); swtTextWidget = new Text(container, SWT.BORDER); swtTextWidget.| return container;} What  does  the  developer  need,  i.e.,  which  methods  should   the  code  compleLon  present  to  the  user? 8
  9. 9. Intelligent  Code  Comple8on …  or  just  the  three  missing  ones?   9
  10. 10. How  it  works  -­‐  in  a  nutshell 10
  11. 11. How  it  works  -­‐  in  a  nutshell Framework 10
  12. 12. How  it  works  -­‐  in  a  nutshell Framework Example   Example   ...ApplicaLon  1 ApplicaLon  n 10
  13. 13. How  it  works  -­‐  in  a  nutshell Framework Example   Example   ... ApplicaLon  1 ApplicaLon  nextract  facts  about  how  the  framework  is  reused «extends:A» «extends:A» «overrides:A.b» ... «overrides:A.d» «calls:B.c» «calls:B.c» … … 10
  14. 14. How  it  works  -­‐  in  a  nutshell Framework Example   Example   ... ApplicaLon  1 ApplicaLon  nextract  facts  about  how  the  framework  is  reused «extends:A» «extends:A» «overrides:A.b» ... «overrides:A.d» «calls:B.c» «calls:B.c» … … 10
  15. 15. How  it  works  -­‐  in  a  nutshell Framework If  you   extend  A, Example   Example   you  should   ... call  B.c ApplicaLon  1 ApplicaLon  nextract  facts  about  how  the  framework  is  reused «extends:A» «extends:A» «overrides:A.b» ... «overrides:A.d» «calls:B.c» «calls:B.c» … … 10
  16. 16. From  code  to  models... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t.class Example extends Page { :P n: ex ex ex ex .. Text t; in i T T T T . @Override 1 0 1 1 0 0 … void createContents() { t = new Text(); t.setText(..); .. } 0 1 0 0 0 1 …} … … … … … … … 11
  17. 17. From  code  to  models... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t.class Example extends Page { :P n: ex ex ex ex .. Text t; in i T T T T . @Override 1 0 1 1 0 0 … void performOk() { t.getText(); .. } 0 1 0 0 0 1 …} … … … … … … … 12
  18. 18. From  models  to  recommenda8ons... () ts en () nt Ok Co rmclass MyPage extends Page { te fo () t() t() t() ea er t> ex on ex Text t; cr .p ni tT tF tT @Override e. ge <i se se ge ag Pa t. t. t. t. void createContents() { :P n: ex ex ex ex .. t = new Text(); in i T T T T . t.|<^space> 1 0 1 ? ? ? … }} 13
  19. 19. From  models  to  recommenda8ons... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t. :P n: ex ex ex ex .. in i T T T T . 1 0 1 1 1 0 … 1 0 1 0 0 0 … 1 0 1 1 0 0 … 0 1 0 0 0 1 … … … … … … … … 1 0 1 ? ? ? … 14
  20. 20. From  models  to  recommenda8ons... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t. :P n: ex ex ex ex .. in i T T T T . 1 0 1 1 1 0 … 1 0 1 0 0 0 … 1 0 1 1 0 0 … 0 1 0 0 0 1 … … … … … … … … 1 0 1 ⅔ ? ? ? … 14
  21. 21. From  models  to  recommenda8ons... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t. :P n: ex ex ex ex .. in i T T T T . 1 0 1 1 1 0 … 1 0 1 0 0 0 … 1 0 1 1 0 0 … 0 1 0 0 0 1 … … … … … … … … 1 0 1 ⅔ ? ⅓ ? ? … 14
  22. 22. From  models  to  recommenda8ons... () ts en () nt Ok Co rm te fo () t() t() t() ea er t> ex on ex cr .p ni tT tF tT e. ge <i se se ge ag Pa t. t. t. t. :P n: ex ex ex ex .. in i T T T T . 1 0 1 1 1 0 … 1 0 1 0 0 0 … 1 0 1 1 0 0 … 0 1 0 0 0 1 … … … … … … … … 1 0 1 ⅔ ? ⅓ ? 0 ? … 14
  23. 23. “Welcome  to  the  forest...”CALL-­‐CHAIN  COMPLETION
  24. 24. How  to  obtain  an  instance  of...public class MyView extends ViewPart { public void updateMessage(final String newMessage) { // How do I get an instance of IStatusLineManager? final IStatusLineManager manager = | manager.setMessage(newMessage); } There is no trivial solution anymore. Again, what should code completion return?
  25. 25. What  we  need... !"#$%&( 5#(!"#$*"(#67public void updateMessage(final String newMessage) { // How do I get an instance of )!"#$*"(# final IStatusLineManager manager = this .getViewSite() 5#(+,-./8&167 .getActionBars() .getStatusLineManager(); manager.setMessage(newMessage); )+,-./0&1} 5#(*(&(213"/#4&/&5#67 )*(&(213"/#4&/&5# 17
  26. 26. 01/1 %1"-( 2B&.#)&(& ,#."1- 2B&.# )#*"+# 01BF15"(# ,#+(&-./# D#-7 201-("67(1 E"5(#-# 201-C.7&91-3/#B#-( 234(#-5"1- E&A17( ?=#// 2D3 )"5F/&A ?+1//:& 01-(1/ 23>"(1%&( 2D#-7D&-&.# 2?#*"+#E1+&(1!"#$%&( 28>&F(&6/# 2?#/#+91- 2;1<6#-+=;"->1$ 2G&*".&91-H"5(1A 2;1<6#-+=%&( 2;1<"-.?#( 2;1<6#-+=%&(?"(# 2@#A:"->"-.?#*"+# 234(#-5"1-I&+<# 2;1<6#-+=%&.# 2!"#$,#J##-+# 2!"#$?"(# 2?#/#+91-%1*"># 2!"#$%&( 23>"(1,#J##-+# 2;1<6#-+=;"->1$ 2%&(?#*"+# 2;1<6#-+= 2?#/#+91-?#*"+# 2?#*"+#E1+&(1 2D#-7D&-&.# 28+91-:&5 2?(&(75E"-#D&-&.# 28+91- 2I11/:&D&-&.#
  27. 27. Tools  Outline 19
  28. 28. Tools  OutlineIntelligent  Code  Comple8on 19
  29. 29. Tools  OutlineIntelligent  Code  Comple8on Smart  Bug  Detec8on What  have  I  missed? 19
  30. 30. Tools  OutlineIntelligent  Code  Comple8on Smart  Bug  Detec8on What  have  I  missed? Extended  Documenta8on 19
  31. 31. Tools  OutlineIntelligent  Code  Comple8on Smart  Bug  Detec8on What  have  I  missed? Extended  Documenta8on Code  Example  Recommender How  do  I  get  an  instance  of…? 19
  32. 32. Tools  OutlineIntelligent  Code  Comple8on Smart  Bug  Detec8on What  have  I  missed? Stacktrace  Search  Engine Extended  Documenta8on Code  Example  Recommender What  caused  that  stacktrace? How  do  I  get  an  instance  of…? 19
  33. 33. Tools  OutlineIntelligent  Code  Comple8on Smart  Bug  Detec8on What  have  I  missed? Stacktrace  Search  Engine Extended  Documenta8on Code  Example  Recommender What  caused  that  stacktrace? How  do  I  get  an  instance  of…? 19
  34. 34. “The  good  ones  in  the  crock,  the  bad  ones  in…  the  problem  view.”SMART  BUG  DETECTION  –  DRIVEN  BY  REAL  USAGES
  35. 35. What’s  wrong  with  this  code? “Hello!” “id” 21
  36. 36. At  run8me  you  get… 22
  37. 37. ...and  a  lengthy  stacktraceorg.eclipse.core.run8me.Asser8onFailedExcep8on:  null  argument: at  org.eclipse.core.run8me.Assert.isNotNull(Assert.java:85) at  org.eclipse.core.run8me.Assert.isNotNull(Assert.java:73) at  org.eclipse.jface.wizard.Wizard.createPageControls(Wizard.java:174) at  org.eclipse.jface.wizard.WizardDialog.createPageControls(WizardDialog.java:734) at  org.eclipse.jface.wizard.WizardDialog.setWizard(WizardDialog.java:1162) at  org.eclipse.jface.wizard.WizardDialog.updateForPage(WizardDialog.java:1221) at  org.eclipse.jface.wizard.WizardDialog.access$4(WizardDialog.java:1218) at  org.eclipse.jface.wizard.WizardDialog$6.run(WizardDialog.java:1207) at  org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) at  org.eclipse.jface.wizard.WizardDialog.showPage(WizardDialog.java:1205) at  org.eclipse.ui.internal.dialogs.ImportExportPage.treeDoubleClicked(ImportExportPage.java) at  org.eclipse.ui.internal.dialogs.ImportPage$2.doubleClick(ImportPage.java:72) at  org.eclipse.jface.viewers.StructuredViewer$1.run(StructuredViewer.java:824) at  org.eclipse.core.run8me.SafeRunner.run(SafeRunner.java:42) at  org.eclipse.ui.internal.JFaceU8l$1.run(JFaceU8l.java:49) at  org.eclipse.jface.u8l.SafeRunnable.run(SafeRunnable.java:175) at  org.eclipse.jface.viewers.StructuredViewer.fireDoubleClick(StructuredViewer.java:822) at  org.eclipse.jface.viewers.AbstractTreeViewer.handleDoubleSelect(AbstractTreeViewer.java) at  org.eclipse.jface.viewers.StructuredViewer$4.widgetDefaultSelected(StructuredViewer.java) ... 23
  38. 38. So what have we missed? 24
  39. 39. If  all  of  your  colleagues  do  it  –  why  don’t  you? 25
  40. 40. If  all  of  your  colleagues  do  it  –  why  don’t  you? 25
  41. 41. How  to  detect  such  wrong  uses? 26
  42. 42. How  to  detect  such  wrong  uses? 26
  43. 43. How  to  detect  such  wrong  uses? 26
  44. 44. How  to  detect  such  wrong  uses? 26
  45. 45. How  to  detect  such  wrong  uses?That’s  “strange” 26
  46. 46. How  to  detect  such  wrong  uses? 27
  47. 47. Just  one  formula… 0 .5 .9 1x = {observed method calls on a variable}E(x) = {exact similar usages for variables of type x in the code base}A(x) = {almost similar usages, i.e., x+1 method call} 28
  48. 48. Missing  Calls  Detector  in  Eclipse 29
  49. 49. Applied  on  Eclipse  3.5... 30
  50. 50. “Developers  who  bought  overwrote  this  method  typically  also  overwrote...”USAGE-­‐DRIVEN  JAVADOC
  51. 51. In  good  documenta8on  we  trust.../** * Rollsback the transaction if any and clears different lists to * start with an empty resource again. * Note that the super.doUnload is not called because that clears * the list resulting in all kinds of undesirable inverseremoves. */@Overrideprotected void doUnload() { super.doUnload();} 32
  52. 52. In  good  documenta8on  we  trust.../** * Rollsback the transaction if any and clears different lists to * start with an empty resource again. * Note that the super.doUnload is not called because that clears * the list resulting in all kinds of undesirable inverseremoves. */@Overrideprotected void doUnload() { super.doUnload();} 32
  53. 53. In  good  documenta8on  we  trust.../** * Rollsback the transaction if any and clears different lists to * start with an empty resource again. * Note that the super.doUnload is not called because that clears * the list resulting in all kinds of undesirable inverseremoves. */@Overrideprotected void doUnload() { super.doUnload();} No?  Are  you  sure? 32
  54. 54. In  good documenta8on  we  trust... good  /** * Rollsback the transaction if any and clears different lists to * start with an empty resource again. * Note that the super.doUnload is not called because that clears * the list resulting in all kinds of undesirable inverseremoves. */@Overrideprotected void doUnload() { super.doUnload();} No?  Are  you  sure? 32
  55. 55. Genera8ng  high-­‐quality  API  documenta8on 33
  56. 56. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  57. 57. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  58. 58. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  59. 59. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  60. 60. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  61. 61. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  62. 62. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 33
  63. 63. Genera8ng  high-­‐quality API  documenta8on high-­‐quality   /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 34
  64. 64. Genera8ng  high-­‐quality  API  documenta8on /** * The number of questions. */ private int numberOfQuestions; /** * Sets the number of questions. * * @param numberOfQuestions the number of questions * @throws IllegalArgumentException the illegal argument exception */ public void setNumberOfQuestions(int numberOfQuestions) throws IllegalArgumentException { if (numberOfQuestions < 0) { throw new IllegalArgumentException("numberOfQuestions < 0"); } this.numberOfQuestions = numberOfQuestions; } 34
  65. 65. What  people  say  about  JAutodoc... 35
  66. 66. What  people  say  about  JAutodoc...User: Anonymous Rating: 9 2009-08-02 11:32:37Wow exactly what I needed! 35
  67. 67. What  people  say  about  JAutodoc...User: Anonymous Rating: 9 2009-08-02 11:32:37Wow exactly what I needed!User: Anonymous Rating: 9 2009-02-13 19:58:32Thank you... this plugin rocks! 35
  68. 68. What  people  say  about  JAutodoc...User: Anonymous Rating: 9 2009-08-02 11:32:37Wow exactly what I needed!User: Anonymous Rating: 9 2009-02-13 19:58:32Thank you... this plugin rocks!User: Anonymous Rating: 9 2009-02-13 19:58:32Works perfectly. Smarter than I expected! 35
  69. 69. What  people  say  about  JAutodoc...User: Anonymous Rating: 9 2009-08-02 11:32:37Wow exactly what I needed!User: Anonymous Rating: 9 2009-02-13 19:58:32Thank you... this plugin rocks!User: Anonymous Rating: 9 2009-02-13 19:58:32Works perfectly. Smarter than I expected! WTH?  What  did  you  expect?! 35
  70. 70. How  Recommenders  is  coming  to  rescue... 36
  71. 71. Some  facts  about  the documenta8on  of  overridable  methodsOverridable 2.074Overridden 623 0 700 1400 2100 37
  72. 72. What  clients  do  with  your  API... Overridden 623 Documented * 155 0 325 650*  documented  as  overridable  by  using  phrases  like  “clients  may/should/must  override/extend  this  method” 38
  73. 73. What  clients  do  with  your  API... Overridden 623 Documented * 155 478 0 325 650*  documented  as  overridable  by  using  phrases  like  “clients  may/should/must  override/extend  this  method” 38
  74. 74. What  documenta8on  would  you  expect  when   subclassing  Dialog? package org.eclipse.recommenders.examples.demo; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.window.IShellProvider; public class MyDialog extends Dialog { protected MyDialog(final IShellProvider parentShell) { super(parentShell); } } 39
  75. 75. What  Javadoc  gives  you... 40
  76. 76. What  Javadoc  gives  you...A  dialog  is  a  specialized  window  used  for  narrow-­‐focused  communica8on  with  the  user.   40
  77. 77. What  Javadoc  gives  you...A  dialog  is  a  specialized  window  used  for  narrow-­‐focused  communica8on  with  the  user.  Dialogs  are  usually  modal.  Consequently,  it  is  generally  bad  prac8ce  to  open  a  dialog  without  a  parent.  A  modal  dialog  without  a  parent  is  not  prevented  from  disappearing  behind  the  applica8ons  other  windows,  making  it  very  confusing  for  the  user.  If  there  is  more  than  one  modal  dialog  is  open  the  second  one  should  be  parented  off  of  the  shell  of  the  first  one  otherwise  it  is  possible  that  the  OS  will  cus  to  the  first  dialog  poten8ally  blocking  the  UI.   40
  78. 78. What  Javadoc  gives  you... A  dialog  is  a  specialized  window  used  for  narrow-­‐focused   communica8on  with  the  user.   Dialogs  are  usually  modal.  Consequently,  it  is  generally   bad  prac8ce  to  open  a  dialog  without  a  parent.  A  modal   dialog  without  a  parent  is  not  prevented  from   But what are the disappearing  behind  the  applica8ons  other  windows,   making  it  very  confusing  for  the  user.  hot-spots of Dialog? If  there  is  more  than  one  modal  dialog  is  open  the  second   one  should  be  parented  off  of  the  shell  of  the  first  one   otherwise  it  is  possible  that  the  OS  will  cus  to  the  first   dialog  poten8ally  blocking  the  UI.   40
  79. 79. What  code  comple8on  offers... 41
  80. 80. What  code  comple8on  offers...Which of the 56 methods should we override? 41
  81. 81. Recommending  method  overrides...public class MyDialog extends Dialog { 42
  82. 82. Recommending  Self-­‐Callspublic class MyDialog extends Dialog { @Override protected Control createDialogArea(Composite parent) { 43
  83. 83. Mining  for  Subclassing  parernspublic class MyViewerComparator extends ViewerComparator { 44
  84. 84. Mining  example  code  snippetspublic class MyDialog extends Dialog { @Override protected Control createDialogArea(Composite parent) { 45
  85. 85. Scarered  Resources 46
  86. 86. Scarered  Resources 46
  87. 87. Scarered  Resources 46
  88. 88. Extended  Documenta8on  Plasorm + Machine Learning 47
  89. 89. Extended  Documenta8on 48
  90. 90. How  it  works  -­‐  in  a  nutshell 49
  91. 91. “Why  is  Google  Codesearch  not  ‘google  for  code  search’?  ”CODE-­‐SEARCH  ENGINES  LIFT  OFF
  92. 92. How  many  request  per  minutes  do code  search  engines  have? 51
  93. 93. 20Number  for  koders.com  in  2009  according  to    “Analyzing  and  mining  a  code  search  engine  usage  log” hrp://dx.doi.org/10.1007/s10664-­‐010-­‐9144-­‐6 52
  94. 94. Naviga8ng  the  API  jungle…private CompilationUnit createCompilationUnit(String source) { // how can I create and configure an ASTParser? ASTParser parser = null; parser.setSource(source.toCharArray()); // ASTParser --> CompilationUnit: how? CompilationUnit cu = null; return cu;} 53
  95. 95. Naviga8ng  the  API  jungle… private CompilationUnit createCompilationUnit(String source) { // how can I create and configure an ASTParser? ASTParser parser = null; parser.setSource(source.toCharArray()); // ASTParser --> CompilationUnit: how? CompilationUnit cu = null; return cu; } How  to  solveString  -­‐>  ASTParser  -­‐>  CompilaLonUnit? 53
  96. 96. When  asking  Google  code  search... 54
  97. 97. When  asking  Google  code  search... 54
  98. 98. When  asking  Google  code  search... 54
  99. 99. When  asking  Google  code  search... 54
  100. 100. Why? 55
  101. 101. Why? Text-based retrieval! 55
  102. 102. Why? Text-based retrieval! Inexpressive query language! 55
  103. 103. Why? Text-based retrieval! Inexpressive query language! Ignores prior knowledge! 55
  104. 104. Why? Text-based retrieval! Inexpressive query language! Ignores prior knowledge! License Issues! 55
  105. 105. Example  code  search  enginepublic class MyJavaEditor extends EditorPart { private CompilationUnit createCompilationUnit(String source) { // how can I create and configure an ASTParser? ASTParser parser = null; parser.setSource(source.toCharArray()); // ASTParser --> CompilationUnit: how? CompilationUnit cu = null; return cu; } 56
  106. 106. Example  code  search  enginepublic class MyJavaEditor extends EditorPart { private CompilationUnit createCompilationUnit(String source) { // how can I create and configure an ASTParser? ASTParser parser = null; parser.setSource(source.toCharArray()); Query // ASTParser --> CompilationUnit: how? CompilationUnit cu = null; return cu; } 56
  107. 107. “Why  is  Google  Codesearch  not  ‘google  for  code  search’?  ”LEVERAGING  USER  FEEDBACK  TOIMPROVE  CODE  SEARCH  ENGINES
  108. 108. Leveraging  user  feedback 58
  109. 109. Leveraging  user  feedback 58
  110. 110. Refine  the  ranking  based  on  feedback 59
  111. 111. Refine  the  ranking  based  on  feedback 59
  112. 112. Learning  how  to  rank 60
  113. 113. Ranking  the  examples 61
  114. 114. Ranking  the  examplesdocument 61
  115. 115. Ranking  the  examplesdocument query 61
  116. 116. Ranking  the  examplesdocument query feature-­‐score  i [0..1] 61
  117. 117. Ranking  the  examplesdocument query weight   feature-­‐score  i (-­‐∞..+∞) [0..1] 61
  118. 118. Upda8ng  the  feature  weights... 62
  119. 119. Upda8ng  the  feature  weights... 62
  120. 120. Upda8ng  the  feature  weights...10.000  ∗ 62
  121. 121. Benefits  of  automated  tweaking#  kendall’s  ι #  queries baseline click-­‐through 63
  122. 122. Interac8ons  diagram Client Server 1 Developer «triggers»2 Search Invocation 3 Code Snippet Ranking Incomplete Source Code Query Ranking Search Function Index4 Code Snippet Presentation Code «updates» Examples 5 Feedback Processing Code Code Summarization Highlighter Weights Learning Clickthrough Cli kth h Function data 64
  123. 123. Applica8on  scenarios  for  your    company Open  Source Repositories 65
  124. 124. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories 65
  125. 125. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories 65
  126. 126. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories 65
  127. 127. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories 65
  128. 128. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories Filesystem   65
  129. 129. “People  that  bought  had  this  NullPointerExcepKon,  made  this  mistake:...”WHAT  CAUSED  THAT  STACKTRACE?
  130. 130. So  far  we  have… 67
  131. 131. So  far  we  have…Intelligent  Code  Comple8on 67
  132. 132. So  far  we  have…Intelligent  Code  Comple8on Extended  Documenta8on 67
  133. 133. So  far  we  have…Intelligent  Code  Comple8on Extended  Documenta8on Code  Example  Recommender How  do  I  get  an  instance  of…? 67
  134. 134. So  far  we  have…Intelligent  Code  Comple8on Extended  Documenta8on Smart  Bug  Detec8on Code  Example  Recommender What  have  I  missed? How  do  I  get  an  instance  of…? 67
  135. 135. But  what  if  you  get  this? 68
  136. 136. Debugging  –  the  old  way 69
  137. 137. Debugging  –  the  old  way 69
  138. 138. Debugging  –  the  old  way 70
  139. 139. But  more  ozen  we  get… 71
  140. 140. How  can  we  fix  that?  Don’t  stacktraces  share  some  commonali8es? 72
  141. 141. How  can  we  fix  that?  Don’t  stacktraces  share  some  commonali8es?org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:3884) at org.eclipse.swt.SWT.error(SWT.java:3799) at org.eclipse.swt.SWT.error(SWT.java:3770) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355) at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317) at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:619) 72
  142. 142. How  can  we  fix  that?  Don’t  stacktraces  share  some  commonali8es?org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:3884) at org.eclipse.swt.SWT.error(SWT.java:3799) at org.eclipse.swt.SWT.error(SWT.java:3770) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355) at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317) at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:619) 72
  143. 143. How  can  we  fix  that?  Don’t  stacktraces  share  some  commonali8es? Excep8onType  Feature (evaluates  iden8cal  excep8on  type) Message  Similarity  Feature (counts  of  similar  words)org.eclipse.swt.SWTException: Invalid thread access at org.eclipse.swt.SWT.error(SWT.java:3884) at org.eclipse.swt.SWT.error(SWT.java:3799) at org.eclipse.swt.SWT.error(SWT.java:3770) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355) at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317) at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source) at java.lang.Thread.run(Thread.java:619) TraceDiff  Similarity  Feature (counts  similar  stackframes  per  trace) 72
  144. 144. How  about  stacktraces.org? 73
  145. 145. Applica8on  scenarios  for  your    company Open  Source Repositories Company Repositories 74
  146. 146. “IDE  2.0?  Leveraging  the  wisdom  of  the  (Eclipse)  community…”ECLIPSE  CODE  RECOMMENDERS
  147. 147. A  developer’s  day... Switching Applications Edit Code Searching Code Testing NavigateDependenciesReading API Doc Comprehend Task Handling Comprehending Interruptions Code Source:  Eclipse  Mylyn  Developer  Techtalk  2011,  IEEE  TSE,  Vol.  32,  No.  12,  2006 76
  148. 148. From  IDE  1.0  to  IDE  2.0 77
  149. 149. From  IDE  1.0  to  IDE  2.0 77
  150. 150. Where  does  IDE  2.0  improve  the  process? Edit Code Testing Comprehend Task Handling Interruptions … 78
  151. 151. Build  directly  from  version  control P2 79
  152. 152. Leveraging  your  IDE’s  build  environment 80
  153. 153. Leveraging  your  IDE’s  build  environment projectenvironment 80
  154. 154. Leveraging  your  IDE’s  build  environment context projectenvironment 80
  155. 155. Leveraging  your  IDE’s  build  environment context object usage projectenvironment 80
  156. 156. Leveraging  your  IDE’s  build  environment context object usage project selectedenvironment proposals 80
  157. 157. Leveraging  your  IDE’s  build  environment context object usage project selectedenvironment proposals click feedback 80
  158. 158. Leveraging  your  IDE’s  build  environment context object usage project selectedenvironment proposals click feedback Stacktraces 80
  159. 159. Crowd-­‐sourcing 81
  160. 160. “Yours  is  ours  and  mine  is  mine...”BUT  HOW  ABOUT  PRIVACY?
  161. 161. Usage  data  sharing  exampleimport com.mycompany.*;import org.eclipse.*;public class MyCompanyDialog extends Dialog implements ICompanyService { MyCompanyController controller = new MyCompanyController(); @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Button sync = new Button(container, SWT.CHECK); sync.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { if (sync.getSelection()) { controller.synchronize(); // lot of more things done with controller } } }); return container; } @Override public void myCompanyServiceMethod() { controller.setup(); } 83}
  162. 162. Usage  data  sharing  exampleimport com.mycompany.*;import org.eclipse.*;public class MyCompanyDialog extends Dialog implements ICompanyService { MyCompanyController controller = new MyCompanyController(); @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Button sync = new Button(container, SWT.CHECK); sync.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { if (sync.getSelection()) { controller.synchronize(); // lot of more things done with controller } } }); return container; } @Override public void myCompanyServiceMethod() { controller.setup(); } 83}
  163. 163. Informa8on  cleared  by  privacy  se{ngsimport com.mycompany.*;import org.eclipse.*;public class MyCompanyDialog extends Dialog implements ICompanyService { MyCompanyController controller = new MyCompanyController(); @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Button sync = new Button(container, SWT.CHECK); sync.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { if (sync.getSelection()) { controller.synchronize(); // lot of more things done with controller } } }); return container; } @Override public void myCompanyServiceMethod() { controller.setup(); } 84}
  164. 164. Effec8ve  usage  data  sharedimport com.mycompany.*;import org.eclipse.*;public class MyCompanyDialog extends Dialog implements ICompanyService { MyCompanyController controller = new MyCompanyController(); @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Button sync = new Button(container, SWT.CHECK); sync.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { if (sync.getSelection()) { controller.synchronize(); } } }); return container; } @Override public void myCompanyServiceMethod() { controller.setup(); } 85}
  165. 165. Effec8ve  usage  data  sharedimport com.mycompany.*;import org.eclipse.*;public class MyCompanyDialog extends Dialog implements ICompanyService { MyCompanyController controller = new MyCompanyController(); @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); Button sync = new Button(container, SWT.CHECK); sync.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { if (sync.getSelection()) { controller.synchronize(); } Only  the  informaLon  how  you   }); } used  Eclipse  is  shared. return container; } @Override public void myCompanyServiceMethod() { controller.setup(); } 85}
  166. 166. “Support  your  own  framework.  Live  walk-­‐through...”RECOMMENDERS  FOR  ANDROID
  167. 167. 87
  168. 168. SummaryIntelligent  Code  Comple8on Usage-­‐Driven  Javadocs Stacktrace  Search  Engine Smart  Bug  Detec8on Code  Example  Recommender What  caused  that  stacktrace? What  have  I  missed? How  do  I  get  an  instance  of…? 88
  169. 169. Contributors  so  far…Jan   Kassens,     Peter  Schroeder,  Daniel  Glöckner,  Maik   Görtz,  Johannes   Lerch,  Johannes  Born,  Mohsen  Parisay,  Andreas  Sewe,  SebasLan  Ahlfeld,  SebasLan  Kasten,  Daniel  Staesche,  David  Kalnischkies,   SebasLan   Wörner,   Boyan   Yurukov,   Jan   Stolzenburg,   Nico   Wombacher,   Dirk  Kröhan,   Florianrian   Jakob,   Julius   Rückert,   Steffen   Remus,   Christopher   Mann,   Stefan   Henss,  Andreas   Kaluza,   Nikolay   Shindov,   Michael   Novotny,   KrisLn   Arand,   Sinem   Emeröz,   Michael  Kutschke,   SebasLan   Proksch,   Tomasz   Kalbarczyk,   Marko   MarLn,   Sheip   Dargutev,   David  Schuld,   Jens   Krause,   KrisLjan   Madunic,   Daniel   Brandtner,   Roman   GeTo,   ChrisLan   Kilb,  Johannes   Kastl,   Dennis   Sänger,   Annie   Liu,   Markus   Migenda,   Tjark   Vandommele,   SebasLan  Denel,  Florian  Nöll,   Gary  Fritz,  Dennis  Siebert,  Peter  Sinzig,  Laura  Altmüller,  Paul  Schatygin,  Jan-­‐Michael  Heller,  Minh  Hoang  Nguyen,  Sascha  Nordquist,  Paul  Emmanuel  Faidherbe,  ... 89
  170. 170. Q  &  A 90
  171. 171. Q  &  AIntelligent  Code  Comple8on Usage-­‐Driven  Javadocs Stacktrace  Search  Engine Smart  Bug  Detec8on Code  Example  Recommender What  caused  that  stacktrace? What  have  I  missed? How  do  I  get  an  instance  of…? 91
  172. 172. It’s  there.hrp://eclipse.org/recommenders/ Follow  me  on  twirer:  @MarcelBruch google+:  +Marcel  Bruch 92

×