Programming Techniques

Summarized using AI

Programming Intuition

Glenn Vanderburg • August 27, 2009 • Earth

In his talk titled "Programming Intuition," Glenn Vanderburg addresses the nuances of what makes a programmer exceptional, building on the ideas he presented in his previous year's discussion on "Tactical Design." He emphasizes the importance of developing intuitive thinking in programming by analyzing how great programmers perceive and engage with code.

Key points discussed in the talk include:

- Diverse Programmer Skill Levels: Vanderburg highlights the disparity between exceptional and average programmers, noting that productivity differences can be as high as a factor of ten. He pushes for a focus on nurturing great programmers rather than merely catering to average ones.

- Importance of Mentoring and Teaching: He argues that current teaching methods are ineffective in bridging the gap between average and exceptional programmers, advocating for better approaches to help aspiring programmers advance their abilities.

- Role of Intuition in Programming: Vanderburg makes the distinction between technical knowledge and the intuition that drives great programming, citing an interview with Paul Graham. He notes that intuition, often undervalued in programming education, is crucial for success.

- Sensory Engagement: The speaker discusses how exceptional programmers utilize sensory experiences to make abstract concepts more tangible. He references how programmers respond emotionally to good and bad code, drawing parallels to music where emotional engagement enhances understanding.

- Visual and Tangible Learning: Through anecdotes about creating physical representations of programming concepts, such as Natalie Jeremijenko's work visualizing ethernet activity, he illustrates the benefits of anchoring abstract ideas in sensory experiences.

- Cultivating Intuitive Thinking: Vanderburg concludes with insights on fostering intuition, encouraging programmers to look for patterns, visualize concepts actively, and embrace both detail and vision in their craft.

The goal is to enhance the quality of programming talent by shifting focus from rigid methodologies to intuitive practices, ultimately strengthening the industry by cultivating exceptional programmers.

Overall, Vanderburg's talk is a call to action for educators and industry leaders to rethink how they approach the development of programming talent by focusing on the intuitive understanding that sets great programmers apart.

Programming Intuition
Glenn Vanderburg • August 27, 2009 • Earth

Programming Intuition by: Glenn Vanderburg

LoneStarRuby Conf 2009

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.
Explore all talks recorded at LoneStarRuby Conf 2009
+14