6. Musicians can memorize every note
of thousands of songs or long symphonies...
Programmers should be able to commit
entire programs to memory in exact detail.
9. Cognitive Neuroscience
Understanding how the functions of the physical brain
can yield the thoughts and ideas of an intangible mind.
George Miller and Michael Gazzaniga
10. 1. Have conversations with
grounded vocabulary.
2. Make better predictions.
3. Inspire new interface
designs and tools.
11. Information Sources [ICPC 2006, 2009]
What strategies and sources of information do
programmers use to recover from interruptions?
Developer Tool Use [ICSE 2009/TSE 2011]
Why arenāt refactoring tools used to refactor code?
Memory Failures [PPIG 2010]
What memory deļ¬ciencies arise from interruptions?
Memory Cues [CHI 2010]
Which cues beneļ¬t programmers recovering from interruptions?
Social Memories [Web2SE 2011]
How do developers blog about learning experiences?
12. Information Sources [ICPC 2006, 2009]
What strategies and sources of information do
programmers use to recover from interruptions?
Surveys (500 devs), Observational studies (12),
Developer Tool Use [ICSE 2009/TSE 2011]
Why arenāt refactoring tools used to refactor code?
Recorded Logs and Data Analysis (80),
User Studies (15)
Memory Failures [PPIG 2010]
Neuroscience Literaturearise from interruptions?
What memory deļ¬ciencies (100 papers, 5 courses)
Memory Cues [CHI 2010]
Which cues beneļ¬t programmers recovering from interruptions?
Social Memories [Web2SE 2011]
How do developers blog about learning experiences?
30. Developers use tabs, scroll positions and
various environmental cues. [KO TSE 2006]
āI remember ļ¬nding that code,
I just canāt remember where it is!ā
35. Developers using diff to recover history of changes.
Improved when
done episodically.
[CHI 2009]
Hattori [ICPC 2011]
36. Developers using diff to recover history of changes.
Improved when
done episodically.
[CHI 2009]
Hattori [ICPC 2011]
Observed developer (with poor memory) maintaining timeline.
37. Developers using diff to recover history of changes.
Improved when
done episodically.
[CHI 2009]
Hattori [ICPC 2011]
Observed developer (with poor memory) maintaining timeline.
Preserving and sharing development narratives on blogs.
38. Developers using diff to recover history of changes.
Improved when
done episodically.
[CHI 2009]
Hattori [ICPC 2011]
Observed developer (with poor memory) maintaining timeline.
Preserving and sharing development narratives on blogs.
[Web2SE 2011]
44. Associative Tabs
TASK: Navigating unfamiliar code.
INFO NEED: Need to quickly remember unfamiliar content and locations.
INFO NEED: Need to quickly recall information based on partial knowledge.
56. Smart Reminders
TASK: Resume blocked and tangential tasks.
INFO NEED:Need to be able to condition and
automatically monitor when to display reminder.
INFO NEED: Need to be able to modulate
the strength of the prompt mechanism.
57. ded by the visualization.
this.ByTimeChecked = true;
}
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Tasking)
Refresh reminder list if
{
viewport reminder marked
this.SelectedTabIndex = 1;
done.
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Proximity)
{
this.SelectedTabIndex = 2;
this.ConfigureProximityViewModel.NotificationPath = (this.Reminder.Condition as Conditions.Proximity.
}
new reminder.
this.SaveCommand = new RelayCommand( 6.5: Viewport
Figure notiļ¬cations.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notiļ¬cations are straight-forward. The message box appears as soon as the reminder condition
if (this.SelectedNotificationIndex == 0)
{
plicable, blocking the main view until dismissed. Because constrictive notiļ¬cations are deļ¬ned as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notiļ¬cations is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must ļ¬rst review a reminder
age. In general, a constrictive notiļ¬cation differs from a obstructive notiļ¬cation in that constrictive gate certain activities
as committing a ļ¬le or building a project, whereas obstructive notiļ¬cations gate all activity in the iDE.
58. ded by the visualization.
this.ByTimeChecked = true;
}
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Tasking)
Refresh reminder list if
{
viewport reminder marked
this.SelectedTabIndex = 1;
done.
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Proximity)
{
this.SelectedTabIndex = 2;
this.ConfigureProximityViewModel.NotificationPath = (this.Reminder.Condition as Conditions.Proximity.
}
new reminder.
this.SaveCommand = new RelayCommand( 6.5: Viewport
Figure notiļ¬cations.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notiļ¬cations are straight-forward. The message box appears as soon as the reminder condition
if (this.SelectedNotificationIndex == 0)
{
plicable, blocking the main view until dismissed. Because constrictive notiļ¬cations are deļ¬ned as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notiļ¬cations is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must ļ¬rst review a reminder
age. In general, a constrictive notiļ¬cation differs from a obstructive notiļ¬cation in that constrictive gate certain activities
as committing a ļ¬le or building a project, whereas obstructive notiļ¬cations gate all activity in the iDE.
59. ded by the visualization.
this.ByTimeChecked = true;
}
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Tasking)
Refresh reminder list if
{
viewport reminder marked
this.SelectedTabIndex = 1;
done.
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Proximity)
{
this.SelectedTabIndex = 2;
Proximity
this.ConfigureProximityViewModel.NotificationPath = (this.Reminder.Condition as Conditions.Proximity.
}
Reminder new reminder.
this.SaveCommand = new RelayCommand( 6.5: Viewport
Figure notiļ¬cations.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notiļ¬cations are straight-forward. The message box appears as soon as the reminder condition
if (this.SelectedNotificationIndex == 0)
{
plicable, blocking the main view until dismissed. Because constrictive notiļ¬cations are deļ¬ned as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notiļ¬cations is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must ļ¬rst review a reminder
age. In general, a constrictive notiļ¬cation differs from a obstructive notiļ¬cation in that constrictive gate certain activities
as committing a ļ¬le or building a project, whereas obstructive notiļ¬cations gate all activity in the iDE.
60. ded by the visualization.
this.ByTimeChecked = true;
}
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Tasking)
Refresh reminder list if
{
viewport reminder marked
this.SelectedTabIndex = 1;
done.
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Proximity)
{
this.SelectedTabIndex = 2;
Proximity
this.ConfigureProximityViewModel.NotificationPath = (this.Reminder.Condition as Conditions.Proximity.
}
6.1. WORKLETS Reminder new reminder. 71
this.SaveCommand = new RelayCommand( 6.5: Viewport
Figure notiļ¬cations.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notiļ¬cations are straight-forward. The message box appears as soon as the reminder condition
if (this.SelectedNotificationIndex == 0)
{
plicable, blocking the main view until dismissed. Because constrictive notiļ¬cations are deļ¬ned as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notiļ¬cations is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must ļ¬rst review a reminder
age. In general, a constrictive notiļ¬cation differs from a obstructive notiļ¬cation in that constrictive gate certain activities
as committing a ļ¬le or building a project, whereas obstructive notiļ¬cations gate all activity in the iDE.
Figure 6.6: Constrictive reminder. 1) A developer attempts to make a commit in the programming environment. 2)
The reminder message is displayed and prompts the developer if the reminder is complete or not.
61. ded by the visualization.
this.ByTimeChecked = true;
}
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Tasking)
Refresh reminder list if
{
viewport reminder marked
this.SelectedTabIndex = 1;
done.
}
if (this.Reminder.Condition.Type == Conditions.ConditionType.Proximity)
{
this.SelectedTabIndex = 2;
Proximity
this.ConfigureProximityViewModel.NotificationPath = (this.Reminder.Condition as Conditions.Proximity.
}
6.1. WORKLETS Reminder new reminder. 71
this.SaveCommand = new RelayCommand( 6.5: Viewport
Figure notiļ¬cations.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notiļ¬cations are straight-forward. The message box appears as soon as the reminder condition
if (this.SelectedNotificationIndex == 0)
{
plicable, blocking the main view until dismissed. Because constrictive notiļ¬cations are deļ¬ned as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notiļ¬cations is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must ļ¬rst review a reminder
Constrictive
Reminder
age. In general, a constrictive notiļ¬cation differs from a obstructive notiļ¬cation in that constrictive gate certain activities
as committing a ļ¬le or building a project, whereas obstructive notiļ¬cations gate all activity in the iDE.
Figure 6.6: Constrictive reminder. 1) A developer attempts to make a commit in the programming environment. 2)
The reminder message is displayed and prompts the developer if the reminder is complete or not.
62. Code Narratives
TASK: Learning and preserving a new API experience.
INFO NEED: Need to recall key events and their order.
INFO NEED: Need to recall detailed information about event.
67. Read More
A Cognitive Neuroscience Perspective on Memory for Programming Tasks
[PPIG 2010]
Background reading on memory:
http://blog.ninlabs.com/2012/02/memory-2-0-a-prelude/
Tools:
http://blog.ninlabs.com/