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 deficiencies arise from interruptions?
Memory Cues [CHI 2010]
Which cues benefit 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 deficiencies (100 papers, 5 courses)
Memory Cues [CHI 2010]
Which cues benefit 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 finding 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 notifications.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notifications 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 notifications are defined as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notifications is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must first review a reminder
age. In general, a constrictive notification differs from a obstructive notification in that constrictive gate certain activities
as committing a file or building a project, whereas obstructive notifications 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 notifications.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notifications 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 notifications are defined as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notifications is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must first review a reminder
age. In general, a constrictive notification differs from a obstructive notification in that constrictive gate certain activities
as committing a file or building a project, whereas obstructive notifications 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 notifications.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notifications 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 notifications are defined as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notifications is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must first review a reminder
age. In general, a constrictive notification differs from a obstructive notification in that constrictive gate certain activities
as committing a file or building a project, whereas obstructive notifications 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 notifications.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notifications 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 notifications are defined as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notifications is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must first review a reminder
age. In general, a constrictive notification differs from a obstructive notification in that constrictive gate certain activities
as committing a file or building a project, whereas obstructive notifications 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 notifications.
() =>
{
this.Reminder.ReminderMessage = this.Message;
he design of the obstructive notifications 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 notifications are defined as preventing performance
this.Reminder.NotificationType = NotificationType.Viewport;
tain activities, they are only enabled for activity-based reminder conditions. An example of an constrictive notifications is
> ""
in Figure 6.6, where a developer is prevented from committing a source code change and must first review a reminder
Constrictive
Reminder
age. In general, a constrictive notification differs from a obstructive notification in that constrictive gate certain activities
as committing a file or building a project, whereas obstructive notifications 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/