00:00:18.300
Okay, good morning! My name is Glenn Vanderburg, and I work for Relevance.
00:00:24.480
This is my third year speaking at LoneStarRuby Conf.
00:00:30.140
I'd like to be known as the Nathaniel Talbot of LoneStarRuby Conf, the guy who's spoken at every event.
00:00:35.760
But, uh, let's address something first.
00:00:42.420
Can you all hear that buzzing? No? Okay, good. I think our sound is just turned up too loud or something.
00:00:50.399
Last year, I gave a talk called 'Tactical Design,' and I discussed something that has captured my interest for a long time: teaching and mentoring programmers to help them become better.
00:01:02.539
This year's talk is titled 'Programming Intuition' and, in a way, it serves as a sequel to last year's conversation.
00:01:16.320
Since this is the case, I want to start by recapping a bit of what I covered last year. How many of you were here for my talk last year?
00:01:30.140
Okay, less than half the room, so it's worthwhile to go over it again. This is a picture of the programming world.
00:01:41.579
We have a handful of programmers who are exceptionally good, many who are average, and it's unclear if the distribution looks like a power law or a bell curve.
00:01:54.600
The important takeaway is that there are many average programmers and just a few exceptional ones.
00:02:01.340
Studies consistently show that the productivity difference between an average programmer and a good programmer isn't just a factor of two; it's often a factor of ten.
00:02:16.200
Great programmers are difficult to find, but they are invaluable when you do find them.
00:02:29.840
Historically, the strategy among management, tool builders, and others in our field has been to focus on how we can derive acceptable results from a group of average programmers.
00:02:45.060
The Rails community, which is part of the broader Ruby community, partially rejects that idea.
00:03:00.060
It's more about catering to the great programmers and seeing what can be achieved.
00:03:08.580
When I left my last corporate IT job to work with Ruby, I expressed my frustration in trying to extract marginally acceptable results from a multitude of average programmers.
00:03:17.099
I wanted to discover how well we could perform with a group of great programmers, and I still believe that is the right approach.
00:03:28.620
However, the world isn't divided into strictly two categories: great programmers and average programmers. There exists a spectrum.
00:03:48.599
There are people who are pretty good and may be three times better than the average programmer. If we are going to adopt the mindset of catering to great programmers, we must also consider how to support those who are nearing that level.
00:04:05.519
I don't believe our current methods for teaching programming, whether to beginners in schools or to new employees, effectively bridge the gap between average and great programmers.
00:04:18.120
I think that today's great programmers are those who are passionate, have the aptitude, and somehow manage to figure it out on their own.
00:04:29.220
I don't believe we are doing an effective job in teaching people to become great programmers.
00:04:40.800
I also believe that those who fall into that band just below the exceptional may not have the means to figure things out independently but could improve significantly if taught properly.
00:04:53.100
They might be able to learn how to become better programmers and progress up the curve if we clearly understand how to teach them.
00:05:18.120
Last year, I addressed tactical design, and the essence of that talk was to focus on three small, tactical principles: 'do one thing,' 'dry' (don't repeat yourself), and the single level of abstraction principle.
00:05:37.080
Each method should only contain elements at the same level of abstraction. This approach allows for becoming a better programmer or teaching those who show a spark of competence how to produce superior work.
00:05:52.020
This year's talk shifts focus from techniques to the process of thinking—how great programmers think.
00:06:12.600
To initiate this discussion, I want to share a clip from an interview with Paul Graham on the Econtalk podcast from three or four weeks ago.
00:06:29.220
During the interview, they discussed venture capital and various other topics, and one crucial question was about what made him write his earlier book, 'Hackers and Painters.' I'm hoping this doesn't blast you out of your seats.
00:06:49.800
So, let’s listen: 'What made you good at it was not what would make a scientist good at science; it was more like what would make an architect good at architecture. What makes an architect good is not a command of statics; it's something less organized than that.' This rings especially true.
00:07:27.360
Yet, we tend to teach programming as if success is solely based on command of programming languages and design patterns. What’s really occurring is far less structured than that.
00:07:44.859
I'm going to outline my theory regarding how our brains work and the task of understanding abstractions.
00:08:05.280
Our brains are wired to interact with the real world, with a significant portion—around 85% to 90%—dedicated to processing sensory inputs like sight, sound, touch, smell, and taste.
00:08:25.860
However, in programming, we handle concepts that are unseen—abstractions. Only a small part of our brain can deal with that effectively.
00:08:43.740
I've noticed that great programmers talk about code as if they can see, feel, touch, and even smell it.
00:08:56.280
What I conclude is that exceptional programmers find ways to engage the larger, real-world-oriented parts of their brains to assist with abstraction.
00:09:10.140
First, I need to justify my claim about the significant parts of our brain involved in perceiving the real world, and I'll do this by discussing music.
00:09:30.840
I want to show you two videos, the first one from the World Science Festival featuring Bobby McFerrin.
00:09:46.740
He demonstrates the pentatonic scale and how expectations play a significant role. How many of you have seen this video?
00:10:07.200
After various discussions and challenges regarding sharing this video, I still don't believe it conclusively proves the pentatonic scale is hardwired into our brains.
00:10:27.180
However, the pentatonic scale often appears in early Western music and in diverse musical cultures worldwide, hinting at a deeper connection to our understanding of sound.
00:10:43.920
Let’s look at how these notes correspond to frequencies commonly used in modern instruments.
00:10:58.500
When plotted, it reveals intricate relationships between them—our understanding of scales involves sophisticated signal processing.
00:11:16.440
Our brains innately grasp sound frequencies and their relationships, just as great programmers connect with code in a real and visceral way.
00:11:37.899
I want to share another intriguing video that Marcel Molina highlighted involving an animation that visualizes the harmony of various musical compositions.
00:11:55.920
The visuals illustrate how different notes can sound in harmony or dissonance, enhancing our understanding of music’s complexity.
00:12:17.720
One fascinating aspect of music theory is how our brains process harmonic intervals and their mathematical relationships.
00:12:34.560
This intricate relationship forms a sophisticated understanding of sound frequencies that reflects how great programmers perceive and engage with code.
00:12:52.620
Have you ever noticed programmers' emotional responses to good and bad code? Bad code usually elicits a cringe, while good code brings satisfaction and pleasure.
00:13:14.859
This emotional connection hints at how deeply intuitive great programmers have become about the quality of code.
00:13:34.620
There's a known correlation between musical training and programming talent, so I've speculated on why musicians often excel in programming.
00:13:54.180
Part of it may be that musicians develop skills to make mental mappings between notation and sensory outputs.
00:14:18.240
They learn to bridge the gap between static representations and dynamic experiences.
00:14:38.819
This cognitive practice of transforming static representations into dynamic realities resembles how great programmers navigate their code.
00:14:56.699
Music and programming share qualities that make them both highly abstract and sensory, and I want to provide examples of programmers discussing code.
00:15:11.460
Tweets from Kathy Sierra illustrate how our experiences matter, as she responds to a conversation regarding physical versus digital experiences.
00:15:35.280
Michael Feathers powerfully describes closure variables using relatable analogies, demonstrating how physical analogies bridge ideas.
00:15:59.280
Similarly, Brian Foote compares generics in programming to balancing a wobbly table, enhancing our understanding of programming challenges.
00:16:23.460
In diving into practical anecdotes, I want to present three stories that showcase how individuals link abstract concepts back to tangible forms.
00:16:37.019
A story from Michael Weiser explains how Natalie Jeremijenko at Xerox Park crafted a tangible, sensory representation of ethernet activity using a servo and string.
00:16:59.640
This physical representation allowed her team to visualize network performance in a way that was typically invisible.
00:17:14.760
Similarly, Paul Graham describes how physical gauges in his previous work allowed him to stay aware of server load without constant checking.
00:17:32.700
These analogies show how tangible outputs assist in understanding abstract concepts within programming.
00:17:49.680
Finally, the story of a team member who used lava lamps linked them to their continuous integration processes, fostering team awareness.
00:18:07.380
These stories illustrate how appealing tangible representations can culminate in newfound awareness.
00:18:25.200
So, which senses do good programmers utilize? Code smells is a valuable metaphor, but we actually engage our visual cognition more.
00:18:49.320
We visualize code and construct multi-dimensional abstractions in our minds based on textual representations.
00:19:05.220
In contrast, I believe formal representations like UML can constrain our view of code, hindering our flexibility to visualize it in varied ways.
00:19:25.080
Projects that allow flexibility in switching visualizations, like the one being developed at Microsoft, hold promise for aiding comprehension.
00:19:49.380
I suspect that our musical kinesthetic senses inform how we interpret and analyze code; it's akin to feeling structures develop within programming.
00:20:09.060
Understanding abstract concepts means being able to transform static representations into dynamic, functional software.
00:20:27.060
This leads to a more engaged and sensory-aware coding experience, much like musicians interpreting notes and melodies.
00:20:45.600
Good programmers develop an innate ability to feel the code pushing back, encountering resistance when exploring different paths.
00:21:01.859
By addressing resistance and obstacles, they learn reflexively to navigate around difficulties.
00:21:18.300
When we talk about beauty in programming, we often mean adhering to principles derived from years of experience.
00:21:34.080
We recognize beauty in code that works seamlessly and cling to principles that avoid pitfalls, leading to emotional responses when something doesn’t fit.
00:21:52.320
The goal is to cultivate intuition in programming, akin to what great programmers possess.
00:22:08.700
How do we develop that intuition? It involves looking for patterns and understanding that good programmers think differently.
00:22:29.880
We must encourage practice and actively visualize programming concepts, using tools that allow immediate feedback and quick iteration.
00:22:45.780
I believe that when programming feels instantaneous, our ability to internalize learning enhances dramatically.
00:23:03.840
So, I want to conclude with a quote from Benoit Mandelbrot, who once said that intuition is not something that comes easily; it’s something that’s developed.
00:23:23.040
He spoke about how those in the field rely on intuition formed from experiences, not something innate.
00:23:40.440
Instead of rigid methods dominating the field, we should learn to cultivate intuition among programmers, allowing them to develop their skillsets.
00:24:01.060
Finally, I want to revisit the two videos I shared about music, but now I’ll discuss two contrasting visual storytelling examples.
00:24:13.760
One clips depicts Ed Wood, regarded for directing one of the worst movies, 'Plan 9 from Outer Space,' focusing on detail rather than the broader vision.
00:24:30.060
The other is from documentary context featuring David Lean, who directed iconic films, noting his passion for the craft and detailed attention to visual components.
00:24:51.600
Lean loved immersing himself in details while maintaining an awareness of the overall picture, showcasing a balance between both approaches.
00:25:05.220
As we approach programming, let’s remember that the craft requires both detail and vision.
00:25:27.600
I encourage everyone to reflect on how we perceive programming outside the mechanical methods traditionally emphasized.
00:25:46.540
By focusing on cultivating practical intuition, we can enhance the quality of programmers, leading to a stronger industry with more exceptional talents.
00:25:58.200
Thank you for your time.
00:26:14.320
Thank you.
00:26:17.800
Thank you.
00:26:20.000
Thank you.
00:26:23.200
Thank you.
00:26:26.000
Thank you.
00:26:29.200
Thank you.
00:26:32.000
Thank you.
00:26:35.000
Thank you.
00:26:38.000
Thank you.
00:26:41.500
Thank you.
00:26:44.500
Thank you.
00:26:47.500
Thank you.
00:26:51.500
Thank you.
00:26:54.500
Thank you.
00:26:57.500
Thank you.
00:27:00.500
Thank you.
00:27:03.500
Thank you.
00:27:06.500
Thank you.
00:27:09.500
Thank you.
00:27:12.500
Thank you.
00:27:15.500
Thank you.
00:27:18.500
Thank you.
00:27:21.500
Thank you.
00:27:24.500
Thank you.
00:27:27.500
Thank you.
00:27:30.500
Thank you.
00:27:33.500
Thank you.
00:27:36.500
Thank you.
00:27:39.500
Thank you.
00:27:42.500
Thank you.
00:27:45.500
Thank you.
00:27:48.500
Thank you.
00:27:51.500
Thank you.
00:27:54.500
Thank you.
00:27:57.500
Thank you.
00:28:00.500
Thank you.
00:28:03.500
Thank you.
00:28:06.500
Thank you.
00:28:09.500
Thank you.
00:28:12.500
Thank you.
00:28:15.500
Thank you.
00:28:18.500
Thank you.
00:28:21.500
Thank you.
00:28:24.500
Thank you.
00:28:27.500
Thank you.
00:28:30.500
Thank you.
00:28:35.500
Thank you.
00:28:40.500
Thank you.
00:28:45.500
Thank you.
00:28:50.500
Thank you.
00:28:55.500
Thank you.
00:29:00.500
Thank you.
00:29:05.500
Thank you.
00:29:10.500
Thank you.
00:29:15.500
Thank you.
00:29:20.500
Thank you.
00:29:25.500
Thank you.
00:29:30.500
Thank you.
00:29:35.500
Thank you.
00:29:40.500
Thank you.
00:29:45.500
Thank you.
00:29:50.500
Thank you.
00:29:55.500
Thank you.
00:30:00.500
Thank you.
00:30:05.500
Thank you.
00:30:10.500
Thank you.
00:30:15.500
Thank you.
00:30:20.500
Thank you.
00:30:25.500
Thank you.
00:30:30.500
Thank you.
00:30:35.500
Thank you.
00:30:40.500
Thank you.
00:30:45.500
Thank you.
00:30:50.500
Thank you.
00:30:55.500
Thank you.
00:31:00.500
Thank you.
00:31:05.500
Thank you.
00:31:10.500
Thank you.
00:31:15.500
Thank you.
00:31:20.500
Thank you.
00:31:25.500
Thank you.
00:31:30.500
Thank you.
00:31:35.500
Thank you.
00:31:40.500
Thank you.
00:31:45.500
Thank you.
00:31:50.500
Thank you.
00:31:55.500
Thank you.
00:32:00.500
Thank you.
00:32:05.500
Thank you.
00:32:10.500
Thank you.
00:32:15.500
Thank you.
00:32:20.500
Thank you.
00:32:25.500
Thank you.
00:32:30.500
Thank you.
00:32:35.500
Thank you.
00:32:40.500
Thank you.
00:32:45.500
Thank you.
00:32:50.500
Thank you.
00:32:55.500
Thank you.
00:33:00.500
Thank you.
00:33:05.500
Thank you.
00:33:10.500
Thank you.
00:33:15.500
Thank you.
00:33:20.500
Thank you.
00:33:25.500
Thank you.
00:33:30.500
Thank you.
00:33:35.500
Thank you.
00:33:40.500
Thank you.
00:33:45.500
Thank you.
00:33:50.500
Thank you.
00:33:55.500
Thank you.
00:34:00.500
Thank you.
00:34:05.500
Thank you.
00:34:10.500
Thank you.
00:34:15.500
Thank you.
00:34:20.500
Thank you.
00:34:25.500
Thank you.
00:34:30.500
Thank you.
00:34:35.500
Thank you.
00:34:40.500
Thank you.
00:34:45.500
Thank you.
00:34:50.500
Thank you.
00:34:55.500
Thank you.
00:35:00.500
Thank you.
00:35:05.500
Thank you.
00:35:10.500
Thank you.
00:35:15.500
Thank you.
00:35:20.500
Thank you.
00:35:25.500
Thank you.
00:35:30.500
Thank you.
00:35:35.500
Thank you.
00:35:40.500
Thank you.
00:35:45.500
Thank you.
00:35:50.500
Thank you.
00:35:55.500
Thank you.
00:36:00.500
Thank you.
00:36:05.500
Thank you.
00:36:10.500
Thank you.
00:36:15.500
Thank you.
00:36:20.500
Thank you.
00:36:25.500
Thank you.
00:36:30.500
Thank you.
00:36:35.500
Thank you.
00:36:40.500
Thank you.
00:36:45.500
Thank you.
00:36:50.500
Thank you.
00:36:55.500
Thank you.
00:37:00.500
Thank you.
00:37:05.500
Thank you.
00:37:10.500
Thank you.
00:37:15.500
Thank you.
00:37:20.500
Thank you.
00:37:25.500
Thank you.
00:37:30.500
Thank you.
00:37:35.500
Thank you.
00:37:40.500
Thank you.
00:37:45.500
Thank you.
00:37:50.500
Thank you.
00:37:55.500
Thank you.
00:38:00.500
Thank you.
00:38:05.500
Thank you.
00:38:10.500
Thank you.
00:38:15.500
Thank you.
00:38:20.500
Thank you.
00:38:25.500
Thank you.
00:38:30.500
Thank you.
00:38:35.500
Thank you.
00:38:40.500
Thank you.
00:38:45.500
Thank you.
00:38:50.500
Thank you.
00:38:55.500
Thank you.
00:39:00.500
Thank you.
00:39:05.500
Thank you.
00:39:10.500
Thank you.
00:39:15.500
Thank you.
00:39:20.500
Thank you.
00:39:25.500
Thank you.
00:39:30.500
Thank you.
00:39:35.500
Thank you.
00:39:40.500
Thank you.
00:39:45.500
Thank you.
00:39:50.500
Thank you.
00:39:55.500
Thank you.
00:40:00.500
Thank you.
00:40:05.500
Thank you.
00:40:10.500
Thank you.
00:40:15.500
Thank you.
00:40:20.500
Thank you.
00:40:25.500
Thank you.
00:40:30.500
Thank you.
00:40:35.500
Thank you.
00:40:40.500
Thank you.
00:40:45.500
Thank you.
00:40:50.500
Thank you.
00:40:55.500
Thank you.
00:41:00.500
Thank you.
00:41:05.500
Thank you.
00:41:10.500
Thank you.
00:41:15.500
Thank you.
00:41:20.500
Thank you.
00:41:25.500
Thank you.
00:41:30.500
Thank you.
00:41:35.500
Thank you.
00:41:40.500
Thank you.
00:41:45.500
Thank you.
00:41:50.500
Thank you.
00:41:55.500
Thank you.
00:42:00.500
Thank you.
00:42:05.500
Thank you.
00:42:10.500
Thank you.
00:42:15.500
Thank you.
00:42:20.500
Thank you.
00:42:25.500
Thank you.
00:42:30.500
Thank you.
00:42:35.500
Thank you.
00:42:40.500
Thank you.
00:42:45.500
Thank you.
00:42:50.500
Thank you.
00:42:55.500
Thank you.
00:43:00.500
Thank you.
00:43:05.500
Thank you.
00:43:10.500
Thank you.
00:43:15.500
Thank you.
00:43:20.500
Thank you.
00:43:25.500
Thank you.
00:43:30.500
Thank you.
00:43:35.500
Thank you.
00:43:40.500
Thank you.
00:43:45.500
Thank you.
00:43:50.500
Thank you.
00:43:55.500
Thank you.
00:44:00.500
Thank you.
00:44:05.500
Thank you.
00:44:10.500
Thank you.
00:44:15.500
Thank you.
00:44:20.500
Thank you.
00:44:25.500
Thank you.
00:44:30.500
Thank you.
00:44:35.500
Thank you.
00:44:40.500
Thank you.
00:44:45.500
Thank you.
00:44:50.500
Thank you.
00:44:55.500
Thank you.
00:45:00.500
Thank you.
00:45:05.500
Thank you.
00:45:10.500
Thank you.
00:45:15.500
Thank you.
00:45:20.500
Thank you.
00:45:25.500
Thank you.
00:45:30.500
Thank you.
00:45:35.500
Thank you.
00:45:40.500
Thank you.
00:45:45.500
Thank you.
00:45:50.500
Thank you.
00:45:55.500
Thank you.
00:46:00.500
Thank you.
00:46:05.500
Thank you.
00:46:10.500
Thank you.
00:46:15.500
Thank you.
00:46:20.500
Thank you.
00:46:25.500
Thank you.
00:46:30.500
Thank you.
00:46:35.500
Thank you.
00:46:40.500
Thank you.
00:46:45.500
Thank you.
00:46:50.500
Thank you.
00:46:55.500
Thank you.
00:47:00.500
Thank you.
00:47:05.500
Thank you.
00:47:10.500
Thank you.
00:47:15.500
Thank you.
00:47:20.500
Thank you.
00:47:25.500
Thank you.
00:47:30.500
Thank you.
00:47:35.500
Thank you.
00:47:40.500
Thank you.
00:47:45.500
Thank you.
00:47:50.500
Thank you.
00:47:55.500
Thank you.
00:48:00.500
Thank you.
00:48:05.500
Thank you.
00:48:10.500
Thank you.
00:48:15.500
Thank you.
00:48:20.500
Thank you.
00:48:25.500
Thank you.
00:48:30.500
Thank you.
00:48:35.500
Thank you.
00:48:40.500
Thank you.
00:48:45.500
Thank you.
00:48:50.500
Thank you.
00:48:55.500
Thank you.
00:49:00.500
Thank you.
00:49:05.500
Thank you.
00:49:10.500
Thank you.
00:49:15.500
Thank you.
00:49:20.500
Thank you.
00:49:25.500
Thank you.
00:49:30.500
Thank you.
00:49:35.500
Thank you.
00:49:40.500
Thank you.