Adaptive Integrated Development Environment (AIDE) - CiteSeerX

0 downloads 0 Views 136KB Size Report
Many experienced programmers use stylistic characteristics in their coding ... clearly expresses the effects of inserting the suggested text. ... In other words, they force users to follow one standardized code ... Among these analysis metrics are typographical style .... activities include using the Tab key to move from one field.
Adaptive Integrated Development Environment (AIDE) Paul Aumer-Ryan, Krishnan Ayyer, Will Meurer School of Information The University of Texas 1 University Station D7000 Austin, TX 78712-0390 USA +1 512 471 3821 {prar, krishnana, meurer}@mail.utexas.edu ABSTRACT

Many experienced programmers use stylistic characteristics in their coding practices that are often hindered by inflexible features offered by current-generation Integrated Development Environments (IDEs). We describe an Adaptive IDE (AIDE) that offers auto-completion and code guidance based on a user’s individual coding style. Our system learns from the user’s style and offers suggestions based on the language context; further, AIDE monitors the acceptance and rejection of these suggestions to tailor their future use. If rejected, the system detects various stylistic aspects of the structure as written by the user and adjusts its subsequent suggestions. AIDE is meant as a step toward next-generation IDEs that conform to an individual’s style and workflow. We conducted a limited evaluation of usability aspects of the suggestion interface and discuss the results and their implications. Finally, we close with suggestions for future work and implementations. Keywords

Intelligent agents, adaptive systems, user interfaces, pattern recognition engines, integrated development environments. INTRODUCTION

Programmers commonly spend hours writing code in a special-purpose text editor known as an Integrated Development Environment (IDE). IDEs have become feature-rich, providing, among other things, syntax clues, auto-completion suggestions, and automatic code formatting. Although some of these features are useful, others become irritating and seem inflexible, especially for the expert whose own style is well-established. Fostering subtle stylistic nuances could allow experts to create code more quickly and may provide a much more comfortable development experience for everyday coders. Additionally, having the ability to “translate” a snippet of foreign code into a user’s personal style can help increase that user’s understanding of the purpose of the code. This paper proposes an Adaptive Integrated Development LEAVE BLANK THE LAST 2.5 cm (1”) OF THE LEFT COLUMN ON THE FIRST PAGE FOR THE COPYRIGHT NOTICE.

Environment (AIDE) that seeks to address two specific limitations of current-generation text editors and IDEs: (1) inflexibility of auto-completion suggestions for common programming language structures; and (2) lack of implicit personalization to a user's unique programming style. Our system builds on top of the benefits of today's editors and environments (e.g., syntax highlighting, block demarcation, inline syntax checking) with the following notable improvements: (1) the addition of a pattern recognition engine that adapts its auto-completion suggestions to the specific user's stylistic variations; and (2) a non-intrusive method for presenting the user with these suggestions that clearly expresses the effects of inserting the suggested text. Our goal is to build upon the rich assistive feedback system present in current-generation editors and environments while offering an adaptive system that conforms itself to a user's particular style. This paper is structured in the following way. First we describe the problem space, including related work that provides a basis for some of our design decisions. Next we detail our approach and design, with a description of the specific implementation details. We continue with the results of two preliminary evaluations of the interface. Finally, we reflect on the evaluation results, discuss future work, and end with conclusions. PROBLEM DESCRIPTION

There are many current IDEs which provide code formatting and code suggestions. Some of them can format code, but can only format in one specific way. In other words, they force users to follow one standardized code format or a linear workflow in order to take advantage of coding aids. For example, Microsoft Visual Studio [16] converts the following C# code: if(a) { // My comment b=1; c=2; }

Into this: if (a) { // My comment b = 1; c = 2; }

The IDE automatically makes these formatting changes:

1.

Inserts a space after reserved words (“if”);

2.

Starts an opening block on a new line (“{”);

other intelligent agents; therefore, Maes’ [12] principles of intelligent agents apply. Maes argues that agents should:

3.

Places spaces around mathematical operators (“=”).

1.

Observe and imitate the user’s behavior;

Note that the IDE’s behavior in each of these cases can be modified by a foray into the system’s robust options menu; an enterprising user can usually make the IDE format code in a way that suits him or her. However, the point is that this must be done explicitly, with a nontrivial time commitment, and the default behavior adheres to a single, fixed style. AIDE seeks to make this process adaptive, with minimal strain on the user’s resources.

2.

Adapt based on user feedback;

3.

Be trained by the user on the basis of examples;

4.

Ask for advice from other agents assisting other users;

5.

Allow the user to bypass its functionality.

Oman and Cook [14] built a system which automated the analysis of programming style using various code aspects, which they later included in a taxonomy of programming style. Among these analysis metrics are typographical style elements [15], like whitespace differences, commenting characteristics, and whether function or structure keywords are followed by statements on the same line. Oman and Cook used this work for identifying authorship, though it is apparent from their research that a programmer has a unique style from that of other programmers and that typographic features like these are differentiators of programming style. Other IDEs [8, 9] take this into consideration and allow users to customize the way their code is formatted. So, for example, someone who always writes the opening brace, {, on the same line as the if keyword can explicitly make this change in the way the IDE formats the code. This adds to the customizability of the program to fit a programmer’s individual style, but it can become problematic in the following ways: 1) the user must make explicit decisions about the style of programming and structures prior to writing any code; 2) as a programmer’s style changes over time, s/he must personally modify the patterns before they can be used in the new context, and 3) it only allows a programmer to specify a single pattern for each code structure type. For example, a programmer may use one format for multiple-statement ifs: if(a) { // My comment a=1; b=2; }

and another for single-statement ifs: if (a) { a=1; } // My comment

AIDE is a third type of IDE, built to overcome these deficiencies. To provide maximum value, AIDE is flexible; it does not assume, for example, that a programmer is writing code from top to bottom, and instead of requiring users to explicitly customize patterns it alters the patterns it suggests implicitly by observing the natural style a programmer employs. Although the initial version of our adaptive pattern system is implemented within a simple text editor, it works just as

Our system works within these guidelines in order to be valuable and non-invasive to the user (but, in the interests of being non-intrusive, does not maintain a visual presence like many intelligent agents). The fourth guideline above may be beyond the scope of the initial effort, but it is worth considering when extending our concept in future work. APPROACH

In this section we discuss our approach to—and subsequent design of—the components of AIDE. We cover initial usability concerns and discuss the basic AIDE interface, its pattern matching engine, and the method we use for maintaining user and language states. Usability Concerns

To provide the best service, AIDE must suggest patterns in an unobtrusive manner. Horvitz [6] comments on risk assessment of interrupting or not interrupting a user’s work based on the presumed value such interruptions could provide. AIDE is able to provide suggestions to a user which s/he can reject by simply ignoring them and continuing to type, so in this fashion risk is a minimal issue. On the other hand, offering a suggestion after every character typed, even when a strong pattern match does not exist, may annoy the user. Therefore, AIDE defers suggestions when strong patterns either do not exist or have been repeatedly rejected upon suggestion. There are obviously many usability issues that could adversely affect the ultimate usefulness of AIDE. If the system is distracting or frustrating to users they may more often reject using it than accept its help. To this end we follow the subsequent guidelines which presume to make our system transparent and useful. Pattern suggestions must be easy to reject or ignore

This guideline has several implications. First, suggestions should not impede the progress of a programmer’s regular work. If each time a suggestion is made the programmer must break his/her train of thought to accept or reject it, the feature becomes more of a hindrance than a benefit. Second, suggestions should not obstruct the view of work already done. Because programmers do not always adhere to a linear coding style, and because our system detects patterns that are multi-line structures (e.g., blocks like if, for, while), offering suggestions inline with the cursor is a challenge to implement without abruptly changing the user’s workspace (e.g., temporarily pushing code downward to make space or covering up the code with a suggestion). Third, it must be obvious to the user that the

suggestions are just that—suggestions—and not inserted code. Otherwise, two unintended consequences may arise: 1) the user may not understand that what is given is a choice, and therefore that s/he can reject it or accept it, and 2) the user may attempt to delete it before it “sticks,” or becomes permanent, possibly causing the user to become frustrated. To address these concerns, we have implemented two different suggestion styles (called “inline” and “tooltip”), and presented them to users during our evaluation to see their reactions. Pattern suggestions must be easy to accept

There are also a few implications within this guideline. First, to achieve maximum utility, suggestions must be easy enough to accept so that doing so does not break a user’s typing stride. Similar to the easy-to-reject guideline, it is reasonable to expect that the more steps the system requires a user to perform to accept a suggestion, the less likely it is that the user will utilize that feature, especially if it is easier to reject. Second, actions performed in order to accept a suggestion must be intuitive. To fulfill this, two requirements exist for our key-press acceptance mechanism:

system uses Tab to toggle between selections; in accordance with similar conventions, we use Enter to explicitly accept a pattern, and Escape to explicitly reject one. IMPLEMENTATION

AIDE has been implemented using the .NET 2.0 framework and was coded in C# [17]. The application is composed of three main subsystems: the text editor interface, the pattern matching system, and the extensible, XML-based database containing specific programming language details and individual user profiles and patterns. These systems are detailed below.

1. It should not be a key likely to be used after typing a structure keyword (keywords like if, for, or switch). If it is a common key, such as “(“ or a letter of the alphabet, purposeful action is difficult to distinguish, and rejecting it would again be difficult; 2. It should be a key common to similar acceptance actions in other IDEs or operating system controls so as to adhere to standard interaction with which a user is more familiar. For example, in both Microsoft Visual Studio and Macromedia Dreamweaver, accepting a code suggestion can be done by pressing Enter, Tab, or the spacebar. AIDE uses Enter and Tab for acceptance. Multiple pattern suggestions must follow suit

Should the system suggest more than one pattern for a given structure type, as in the case that a programmer has one format used for multiple-line if statements and another format for single-line if statements (example above), then the system must have a way to offer the programmer a choice between these patterns (or, of course, a way to reject or ignore them all). There are two main concerns here. First, for the sake of consistency in user experience, the multiple-pattern-suggestion interface must not differ dramatically from the single-suggestion interface; however, it must be made obvious to the user that there is not only a suggestion to accept or reject, but that there are indeed multiple suggestions being presented from which a user can choose. Second, the toggle key should adhere to standards of similar activities in other programs. Common toggle activities include using the Tab key to move from one field to the next in a form, using Alt+Tab to switch between currently running program windows in computer operating systems, and pressing Ctrl+Tab to switch between tabs in some Web browsers. Based on these conventions, our

Figure 1: The AIDE user interface. Text Editor Interface

AIDE implements a basic text editor interface reminiscent of mid-level text editors designed for programmers (see figure 1). While a full-fledged integrated development environment would have more features, this interface acts as a test-bed for exploring the novel pattern matching system developed here. AIDE implements the following basic text editor functionality: file management (new file, open file, save file, close file); unlimited undo and redo levels; clipboard functionality (cut, copy, paste, select all); line numbering; and an AIDE-specific toolbar, pattern list, and status bar. The AIDE toolbar allows users to set the current user and programming language (which determines what patterns are available and other user- and language-specific settings). Additionally, the user can modify a “suggestion frequency” slider that determines how often patterns will be presented to the user. Finally, the user can choose between the two implemented suggestion styles—tooltip and inline. The tooltip suggestion style presents matched patterns to the user in a fashion common to currentgeneration IDEs (i.e., by displaying a text box that follows the cursor). The inline style places suggested text after the cursor position and immediately selects it, so if the user does not want to accept the pattern they must only keep typing. See figure 2 for a comparison.

Figure 2: Comparing the tooltip suggestion style (left) with the inline suggestion style (right). Finally, the interface contains a convenient listing of the patterns currently available to the user (on the right side of the interface window); mousing over individual patterns will bring up a full description of that pattern, and rightclicking on a pattern will let the user delete it. Pattern Matching Engine

The core component of AIDE is its pattern matching engine, which has two main tasks: deciding when to suggest appropriate patterns to the user, and “listening” to the user’s keystrokes to detect new patterns. Let us first focus on how AIDE makes suggestions to the user. The system is constantly monitoring keystrokes and looking for patterns typed on the current line. If a pattern in the database begins with the text on the current line, then it will be selected for potential suggestion. However, before being presented to the user, this pattern (and others like it) must go through a culling process to ensure it is the most appropriate pattern to suggest to the user. The engine first checks the current suggestion frequency (defined by the slider in the toolbar) to make sure that the user has typed enough of the pattern for it to be suggested; if this is not the case, the pattern is discarded. Second, each pattern in the database has a confidence level applied to it; this confidence level is a representation of how likely the user is to accept it, and is based on the user’s past behavior towards this pattern (rejections and acceptances). A userdefined cutoff level specifies the minimum confidence level that will be suggested; if the potential pattern’s confidence level is below this cutoff, it will be culled. Furthermore, if multiple patterns are suggested to the user, then they will be ordered by their confidence levels, and the pattern with the highest confidence level will be suggested to the user first. If the potential pattern in question manages to pass this culling process, it will be suggested to the user for his/her acceptance or rejection. The suggestion system has four base states that indicate, in a simplified fashion, how it should interact with the user. These states are: waiting (actively checking for patterns); offered (one or more patterns have been suggested to the user); accepted (the user has accepted one of the suggested patterns); and rejected (the user has rejected a suggested pattern). For example, new patterns will not be suggested if the system is in the “offered” or “rejected” state, since pattern(s) are already being offered in the first case and since the user does not want the pattern(s) in the second case.

The pattern suggestion system affords the user the ability to explicitly accept a pattern, explicitly reject it, or implicitly reject it. An explicit acceptance is indicated by the user pressing Enter while a pattern is suggested; an explicit rejection is indicated by pressing Escape. Similarly, if the user wishes to implicitly reject (i.e., ignore) a pattern, s/he need only keep typing as usual and the suggested pattern will eventually disappear. Finally, if the user accepts a suggested pattern, it is inserted into the document. Many patterns have what we call “caret hotspots”—in other words, places in the pattern that the user is expected to type specific text that varies between pattern instances (e.g., the conditional in an if statement). We indicate caret hotspots with the ‘@’ character, and allow the user to cycle between them in the document by pressing Ctrl-Tab (select the next hotspot in the document) or Ctrl-Shift-Tab (select the previous hotspot in the document). Figure 2 shows an example of caret hotspots appearing in a pattern. The second component of the pattern matching engine, the pattern detection system, plays a more behind-the-scenes role in the application’s interaction with the user. The pattern detection system is constantly “listening” to the user’s keystrokes in an attempt to detect new patterns, or to reinforce old ones. The current proof-of-concept implementation detects patterns at the block level, where the opening and closing block characters are defined in the XML file for the current programming language (e.g., in the case of Java, ‘{‘ and ‘}’). When the user completes a block (by typing the closing block character and moving off of the line it is on), the engine determines if the block (and it’s header and comment header, if they exist) is a potential pattern for inclusion in the database. The process begins by converting the potential pattern into regular expression syntax, followed by the replacement of highly variable contents with a “caret hotspot” (the ‘@’ symbol). This pattern is then compared against the existing patterns in the database; similarity measures are calculated (such as the Levenshtein distance algorithm [11]) to judge how close the new pattern is to existing patterns. If the new pattern is exactly the same as an existing pattern, then it is not added, and the confidence level of the existing pattern is increased. If the new pattern is similar to one or more existing patterns, then it is added with a confidence level slightly higher than the existing similar patterns. Finally, if the new pattern is not similar to any existing patterns, it is added at the default confidence level. User Preference and Language Structure

As stated earlier, AIDE is built on an extensible XML framework for defining specific programming language structure and individual user preferences. Support for any programming language can be added to AIDE simply by creating a languageX.xml file, where ‘X’ is the name of the language in question. The language definition files contain a list of keywords and reserved words defined in the

language, as well as special constructs like comment characters, opening and closing block characters, and a list of all delimiters. See figure 3 for an example. Similarly, any number of users can use AIDE, and each user can have an individualized profile that contains his/her patterns and settings (userX.xml, where ‘X’ is the name of the user; see figure 4 for an example of a user preference XML file). The user preference file contains such information as the last accessed directory/folder, the user’s specific cutoff levels, and a definition for each pattern in the database (and its related confidence level).

Figure 3: Sample language definition file (languageJava.xml).

In order to appropriately evaluate the AIDE interface, it was necessary to select test participants who had relevant background experience and knowledge to evaluate the system. We noticed an inherent trade-off between supporting users’ personal styles and maintaining consistent syntax and formatting; whereas seasoned programmers are more likely to have developed a preferred coding style and have enough confidence in language syntax to create their own patterns, novice programmers are more likely to make syntactical errors which can make pattern recognition difficult. To this end, we used a screening process to select our test participants: based on the assertion that AIDE is targeted towards experienced programmers, we selected only those test participants who had at least 6 months programming experience using any IDE. This was ensured by handing out a pre-test questionnaire. The pre-test questionnaire helped us assess whether the participants had used any form of an IDE before and, if so, how many months of programming experience they had. In addition to selecting test participants who met the experience profile, we also worked to ensure that the users were sampled across a broad demographic range. Our users were a mixed gender group ranging from age 22 to 45+ years. Most of the test participants had a Bachelor’s degree in Computer Science or a related field. On the basis of the aforementioned criteria we selected four test participants for the usability evaluation. After selecting our participants, we gave them a set of four tasks designed to test the usability of AIDE. Each task was constructed to require around 5 minutes to complete. We formulated the tasks to be as real-world as possible. Upon completion of all the tasks, we handed a post-test questionnaire to all the test participants. The questionnaire asked the test participants to express their perceptions of AIDE and how well they understood and liked it. We also included several open-ended questions so that the users could express their impressions without being constrained by the structure of the questionnaire.

Figure 4: Sample user preference file (userDefault.xml). EVALUATION

We conducted an evaluation to examine the usability of AIDE. In this evaluation we attempted to address some of the usability concerns outlined earlier. The goals of the usability evaluation were as follows:

The tasks were designed to make the participant try out different constructs like for, if-else, and try-catch. We believed that this would give us a better perspective about how the participants utilize different constructs, and if they use them differently while coding. Also, we asked the participants to try both the inline and tooltip suggestion styles for each of the tasks. This helped us gain insights into which style the participants preferred.

1. To identify if AIDE offers useful services not present in other IDEs;

Findings

2. To gauge user-preference for both of the suggestion styles for inserting patterns (the inline method and the tooltip method);

Using the evaluation criteria discussed above, we analyzed the test results to develop a set of findings. This section discusses:

3. To measure the ease of acceptance and rejection of the patterns suggested by AIDE.



Usability problems noted during the test (findings)



Feedback we collected from test participants using questionnaires and post-test interviews

A Likert-scale was used to codify users’ opinions. The values assigned are as follows: Strongly Disagree

1

Disagree

2

Neutral

3

Agree

4

Strongly Agree 5 Table 1: Codifying user opinion with a 5-point Likert scale. Questions from the post test questionnaire

Mean scores

The patterns were easy to reject.

2.5

Manipulating the “suggestion frequency slider” was easy.

4.75

The service focused on my programming needs.

3.75

The suggestions were easy to accept.

2.75

The inline suggestions were intrusive

4.5

The tooltip style is less intrusive

4

I prefer the tooltip method to the inline method.

4.5

The service can be used easily without a paper manual.

3.5

The number of constructs handled (e.g., if, for) are sufficient

3.5

The AIDE is better than other conventional IDEs.

2.5

It provides me with all the services I need

2.33

Table 2: Average user opinion from the post test questionnaire.

2. The users were happy with the tooltip style. All the users wrote positive things about the tooltip method. One comment was: “The tooltip does not impose its suggestion on me and I like that”; 3. All the test participants preferred the tooltip style to the inline style (mean value 4.5). Some comments were: “I prefer the tooltip method to the inline method” and “the tooltip style gives me the option of selecting or rejecting, which is nice”; 4. The test participants felt that AIDE could be used easily without the need for a paper manual; 5. The users were also satisfied with the number of patterns currently handled by AIDE. From the initial evaluation it was clear that the tooltip style was substantially more favorable to the participants than the inline style (mainly because they felt it was less intrusive). Most of the participants felt that AIDE focused on their programming needs. However, they did feel that AIDE could provide more services. We intend to add more features to AIDE in future versions; this is elaborated in the Future Work section. Latest prototype

After the initial usability evaluation, we continued developing another prototype to address some of the problems expressed by the participants. As an example of the issues addressed, in the initial prototype if the user started to type a for loop AIDE would insert the following structure: for ($CURSOR; $CURSOR; $CURSOR) { $CURSOR;

Table 2 represents the mean opinions of the four test participants from the post-test questionnaire. Based on the results shown in Table 2, we compiled a set of generalized findings from the participants’ positive and negative feedback. Critical feedback summary

Some of the test participants commented on issues they would like to see improved in AIDE. They are summarized below: 1. The users found it difficult to accept and reject patterns; 2. Unanimous feedback (mean value of 4.5) indicated that the users found the inline style intrusive. Some comments expressed by the users were: “I did not like the inline method” and “the inline style is very intrusive and I did not like it”; 3. The users felt that the current services provided by the IDE are not sufficient and they required more services (based on mean value of 2.33). Positive feedback summary

Test participants offered several positive comments about AIDE. They are summarized below: 1. The test participants felt that AIDE focused on their programming needs;

}

All the participants expressed frustration at having to delete $CURSOR and type in their own replacement text (note that while it was possible to use the Ctrl-Tab and CtrlShift-Tab shortcut keys to quickly select and highlight successive $CURSOR positions, none of the participants took advantage of this behavior). They were not willing to delete so many characters. In our latest prototype we overcome this problem by making the following suggestion: for (@; @; @) { @; }

This would mean that the user would have to delete just one character, @, as opposed to $CURSOR. The latest prototype was designed to be more intuitive and easier to use. We performed a follow-up evaluation on the latest prototype to discover if this prototype was better than the earlier version. To ensure consistency, we selected the same participants who had evaluated the earlier prototype. In order to avoid the potential inflation of positive feedback due to an increased familiarity with the program (i.e., since we used the same participants, they had learned about the

interface from the previous test, and this would affect their performance in the current test), we discarded questions like “the suggestions were easy to accept.” We attempted only to evaluate the changes in the interface and the overall experience of working with AIDE. The table below summarizes our findings. Mean score

Delta

The new prototype is better than the earlier version.

4

N/A

The service focuses on my programming needs

4

+0.25

The service can be used easily without a paper manual.

4

+0.5

This AIDE is better than other IDEs

4

+1.5

Post test questions

It provides me with all the services I need 3.5 +1.17 Table 3. Average user opinion for latest prototype, with the amount of difference (Delta) in the mean from the previous evaluation. From Table 3 we conclude that the latest prototype is an improvement on the earlier version (mean value of 4). The participants felt that the application was more aligned with their programming needs than the earlier version. The users were much happier with the character @ discussed earlier instead of $CURSOR. However, we are aware that the current AIDE could be improved still further by providing more services. Some possible enhancements are discussed in the next section. FUTURE WORK

Programming style standards are commonly created, either by the developer of a programming language (e.g., Microsoft’s C# guidelines [1] and Sun’s Java guidelines [4]), or by groups of developers for collaborative projects, (e.g., Mozilla [13]). Additionally, corporations may develop internal programming style guides which their developers must follow to ensure smooth transitions between programmers and versions. AIDE is concerned with individual styles, as opposed to standardized group styles, but it is worth considering allowing standard suggestions to be built for groups so that standards could be adhered to more consistently. In fact, if the pattern matching system is sufficiently robust, it will have the ability to “translate” between programming styles. In this fashion, corporate or project standards can be converted to individual styles, and vice-versa. This can increase standards compliance while letting programmers continue to interpret code in their own personal style. This holds benefits for both individuals and groups. Individuals would have the ability to quickly view any code in their own style, make their own modifications, and then have the ability to export the result in the original style. Organizations and corporations would be able to maintain stylistic consistency across multiple programmers and teams without imposing

strict code styles on individual programmers (and especially new employees). In collaborative programming environments, like [10], a common style from all contributors could be kept in a central style repository so that a sort of live style standard could be implicitly built, instead of one person explicitly taking the time to create and update style documentation. Project leaders would have the ability to fix these group style definitions at a specific time, or continue to allow them to change and evolve. Similarly, this approach allows for the development of more organically created group programming styles: as more and more project contributors write code, their individual code styles would be recorded in the central repository and suggestions could be made for code segments and structures based on the most commonly-used styles of all contributors. To allow for more hierarchical organizational structure, weights could be given to styles of those more-experienced programmers in the group, and certain aspects of code could be included in the central repository (those aspects most important to keep similar, like variable names) and other aspects could remain on an individual programmer’s local style guide. An extension of this work is providing programmers the ability to export and import profiles of their style. This would enable programmers to move from machine to machine without the environment having to relearn that user’s coding style. Since our system saves information about a user’s style in XML, a user’s style file can be used on other machines that have AIDE installed. A powerful use of exporting and applying programming styles is to reformat someone else’s code to your personal style so that it is easier to read and understand. This enables a user to read all code in a specific format which is comfortable to him or her. Additionally, support for more non-linear programming styles can be represented in pattern structure based on user actions. For example, Macromedia Dreamweaver MX 2004 [5] adds a closing tag (e.g.
) directly after the user types an opening tag (e.g.
); this behavior is unwelcome if the user is modifying an HTML/XHTML document (rather than creating a new document in a linear fashion), and forces the user to reposition the closing tag after the block of data the tag is meant to enclose. The AIDE pattern matching system has the potential to recognize when a user is creating a new div block, as opposed to wrapping an existing block of data in tags. Applying formatting to a file automatically, instead of while coding, takes us back to the issue of a single formatting style for all structures of the same type because this implies that the user has no choice whether it happens or not. In order to hedge this problem of inflexibility, context-aware formatting and auto-completion agents may be the next step in AIDE. AIDE is currently implemented as part of a standalone editor as a proof-of-concept. Our intention is to eventually

implement it as an extension to current integrated development environments like Eclipse [6] (using the Rich Client Platform), so that users could integrate our engine and suggestion interface into their editor of choice, instead of creating and requiring users to learn an entirely new environment.

3.

Blum, A. 1992. Neural networks in C++: An objectoriented framework for building connectionist systems. New York: Wiley.

4.

Code conventions for the Java programming language. Sun Developer Network. Santa Clara, CA: Sun Microsystems, Inc. Retrieved April 13, 2006, from http://java.sun.com/docs/codeconv.

5.

Dreamweaver MX 2004 (Version 7) [Computer software]. San Fransisco, CA: Macromedia, Inc.

6.

Eclipse 3.1.2 2006 [Computer Software]. Ottawa, Ontario, Canada. Eclipse Foundation, Inc.

7.

Horvitz, E. 1999. Principles of mixed-initiative user interfaces. Proc. CHI 1999, ACM Press, 159-166.

8.

IntelliJ IDEA 5.1 2006 [Computer Software]. Prague, Czech Republic. JetBrains.

9.

JBuilder 2006 [Computer Software]. Cupertino, CA. Borland Software Corporation.

CONCLUSION

In this paper we have detailed advances made by currentgeneration integrated development environments to streamline the act of computer programming. We have proposed and designed an incremental improvement upon these efforts in the form of AIDE, an adaptive integrated development environment. The main purpose of AIDE is to explore the use of individualized pattern recognition and matching of specific stylistic differences among programmers, and to do so in a fashion that is not intrusive to the use. AIDE’s adaptive interface implicitly recognizes common code styles and suggests them at appropriate times in the future. We conducted two usability evaluations, the first exploring the relative merit of the improvements in AIDE and its overall ease of use, and the second addressing specific issues identified in the first. Finally, we addressed the possibilities for future work and improvements, detailing the areas in which AIDE has succeeded and those that require further work. Ultimately, we have found that there is an inherent trade-off between the enforcement of standardized coding styles and the accommodation of individual styles; the impetus for this project arose out of our belief that current systems emphasize the former at the expense of the latter. We believe, using many of the techniques discussed in this paper, that more room can be made for supporting individual styles without sacrificing standardization efforts. ACKNOWLEDGMENTS

We thank Luis Francisco-Revilla for his feedback and encouragement during the development process, and the class members of INF 385C (Spring 2006) in the School of Information at the University of Texas at Austin for their insights and camaraderie. REFERENCES

1.

2.

.NET framework general reference: Design guidelines for class library developers. MSDN Library. Redmond, WA, Microsoft Corporation. Retrieved April 13, 2006, from http://msdn.microsoft.com/library/default.asp?url= /library/en-us/cpgenref/html/cpconNETFramework DesignGuidelines.asp. Beale, R., and Finlay, J., Eds. 1992. Neural networks and pattern recognition in human-computer interaction. West Sussex, England: Ellis Horwood.

10. Jo, C.H. & Arnold, A.J. (2003). A portable and collaborative distributed programming environment. International Multi-Conference in Computer Science and Computer Engineering. Retrieved April 18, 2006, http://jo.ecs.fullerton.edu/research/jo-SERP03DPE.pdf. 11. Kruskal, J. & Sankoff, D. (eds.) 1999. Time warps, string edits, and macromolecules: The theory and practice of sequence comparison, chapter 1. New York: CSLI Publications. 12. Maes, P. 1994. Agents that reduce work and information overload. Communications of the ACM, v.37 n.7, p.30-40. 13. Mozilla coding style guide. Mozilla.org. Retrieved April 13, 2006, from http://www.mozilla.org/hacking /mozilla-style-guide.html. 14. Oman, P.W. & Cook, C.R. 1989. Programming style authorship analysis. In Proceedings CSC ‘89, 17th Annual ACM Computer Science Conference proceedings. Louisville, Kentucky, Feb. 21-23, 320326. 15. Oman, P.W. & Cook, C.R. 1990. A taxonomy for programming style. In Proceedings of the Eighteenth Annual Computer Science Conference, Washington D.C., February, 1990, New York. 244-250. 16. Visual Studio .NET 2003 Professional Edition [Computer software]. Redmond, WA. Microsoft Corporation. 17. Visual Studio .NET 2005 Professional Edition [Computer software]. Redmond, WA. Microsoft Corporation.