00:00:12
Hello everyone. My name is Justin Searls, and you can find me on Twitter under that same name. Feel free to call me either.
00:00:18
This is what my face looked like in 2011, and thanks to how social media branding works, I'm now stuck with it forever.
00:00:25
I work for a company called Test Double, a software agency on a mission to improve how the world writes software.
00:00:31
You can learn more about us at our URL. The title of this presentation is "How to Program," and it's a rumination on the word 'workflow.'
00:00:37
This two-part word—'work' referring to the structure and behavior of programs—will guide our discussion.
00:00:43
I often find that we reprogram our thoughts and actions throughout our programming journeys.
00:00:51
When I reflect on my experience as a computer science student, I recognize that I was taught data structures, P versus NP, big-O analysis, and cryptography.
00:00:59
However, very little attention was paid to how to think or how to work effectively as a developer.
00:01:06
Boot camps today often focus on practical skills like web standards and frameworks, but they still overlook critical thinking.
00:01:12
We may admit the role of thought leaders in the community, but they often discuss work activities, not how to think through problems.
00:01:18
As programmers, we should ask ourselves, when and how do we learn? Who teaches us how to think?
00:01:25
If you're fortunate, you might stumble upon a productivity tip during your career. Usually, it's the 20-minute work and 3-minute break technique.
00:01:35
However, it can feel a bit like gaining a $4 plastic pin after 10 years of hard service. It's somewhat insulting.
00:01:43
Still, we all learn what programs do, but I dare say most of us were never truly taught how to program.
00:01:50
Just looking at search results for 'how to program' reveals a lot of poor teaching methods.
00:01:58
The traditional method involves starting from nothing and showing a finished example, leaving students to figure it out on their own.
00:02:05
My experiences in computer science mirrored that of drawing a cartoon owl: starting with two circles and nothing more.
00:02:12
I spent entire weekends in labs, staring at blank screens, having no idea how to write code.
00:02:19
This realization led me to the conclusion that programming is largely a philosophical activity occurring in our minds.
00:02:27
In recent years, we have seen evolution in computer science education, breaking down complex ideas into manageable parts.
00:02:35
However, explanations rarely convey the necessary thinking to make concepts real.
00:02:43
It may take years to replicate an application from a book, and I believe this is an act of imitation, not learning.
00:02:50
In our profession, we are inundated with how questions, like when to create a new method.
00:02:58
Simple advice we receive, such as 'messages should be three lines long,' reflects a lack of sophistication.
00:03:05
For instance, when my wife was in first grade, her teacher told her that sentences should be two lines long.
00:03:12
She followed this guideline without question until she was corrected years later.
00:03:20
It's amusing because here we are, as adults in the programming world, with simplistic guidelines influencing our work.
00:03:29
In spite of these limitations, let's say you eventually write a great program that you're proud of.
00:03:37
If I were to ask you about the productive or unproductive actions that led to this success, could you answer?
00:03:45
Most of us would likely struggle, which leads to rampant insecurity in our profession.
00:03:54
The reality is that 99% of the work I've done as a programmer has been about transferring spreadsheets to the Internet.
00:04:02
Yet, it took me a decade to feel confident as a programmer, which indicates something is wrong with how we teach.
00:04:09
Despite this industry being around for 60-70 years, we still look for quick fixes.
00:04:15
We think the next language or framework will make programming easier, but it seldom works out.
00:04:23
When environments are chaotic and uncertain, brilliant people often thrive, while those without validation struggle.
00:04:30
Imagine walking into a room full of programmers and not fitting in; it's truly a daunting experience.
00:04:38
Unless we resolve our issues with teaching, programming remains a terrifying endeavor for many.
00:04:46
Thus, if we want to promote diversity and inclusivity in this industry, we must address how we teach programming.
00:04:54
As it stands, the industry seems disconnected from understanding how software truly works.
00:05:03
Often, it analogizes software development to construction, design, or manufacturing, which is misleading.
00:05:10
Instead, we ought to focus on understanding how we think and solve problems as software developers.
00:05:18
So, how do we begin solving this issue? By introducing feedback loops, as programmers already use them to establish progress.
00:05:27
Let’s practice reflecting on our actions in our development processes today.
00:05:36
By doing so, we can improve our performance and emotional states through introspection.
00:05:44
Spoiler alert: we can also think about our thinking in order to optimize our productivity.
00:05:50
This concept leads us to what I call 'programmer enlightenment', but we must start from scratch.
00:05:57
In team environments where emotional immaturity exists, initiating conversations about feelings can be challenging.
00:06:05
Often, we resort to ineffective personality tests, like the Myers-Briggs Type Indicator, which oversimplifies human behavior.
00:06:14
It assigns people into arbitrary categories, implying there are only 16 types.
00:06:22
In reality, we know human complexity is far greater than this system accounts for.
00:06:31
Today, I present you with the Searls-Briggs Type Indicator instead.
00:06:39
Instead of asserting that there is a singular magical way to program, I'll share my personal journey.
00:06:47
Let's use an example feature to explore my thoughts and emotions throughout my career.
00:06:56
At Test Double, we've always been a distributed company, but we're learning that distribution doesn't imply equality.
00:07:05
In a flat organization, one might expect spontaneous collaboration, but that's not always the case.
00:07:13
We've experienced times where team members want to learn new technologies and have no means to connect.
00:07:21
This sparked an idea for virtual coffee chats among team members to facilitate conversation and collaboration.
00:07:29
It's akin to a handshake problem in mathematics, which calculates the number of potential relationships within groups.
00:07:39
We discussed assigning people randomly for short 15-minute chats, with the expectation that connections would grow.
00:07:48
Let's explore my approach and the first question to ask ourselves about emotional intelligence: Are you sensitive or fearless?
00:07:56
I personally prefer hearing all requirements upfront, but that overwhelm can be daunting.
00:08:05
Complexity often paralyzes me when staring at a blank screen, leading to doubt about my skills.
00:08:13
This sensitivity affects how I approach programming projects, as I'm often nervous about the unknown.
00:08:19
I focus on creating pairs, which sounds simple, but involves a decent amount of logistical effort.
00:08:27
To overcome this, reflect on the problem, keeping the core idea in mind rather than getting overwhelmed.
00:08:36
In my past, I embodied bottom-up programming, but I’ve transitioned to a top-down approach.
00:08:44
By defining the problem at a macro level, I can keep the end goal clear, allowing for better coding decisions.
00:08:52
This perspective encourages the minimization of wasted work and the inclusion of essential guard clauses.
00:09:00
Being sensitive often feels like a double-edged sword; while it encourages caution, it can lead to paralysis.
00:09:09
The act of rushing into coding without clarity can cause overwhelm because the details feel burdensome.
00:09:17
I found myself stuck at points, unsure of what to tackle next because of the lack of decomposition in my work.
00:09:26
Transitioning to discovery testing was a game changer for me, as it helped break down larger issues into manageable tasks.
00:09:34
Working through top-level concerns and methods allows me to see progress toward project goals.
00:09:40
Next, explore the inventive versus aesthetic side of programming choices.
00:09:48
When building software, I believe it's more important to construct the right thing than simply to build well.
00:09:56
I often find myself prioritizing implementation work rather than getting caught up in beauty or neatness.
00:10:05
That said, I still strive for visually appealing code, being mindful of syntax and symmetry.
00:10:12
Consistency across coding standards is crucial, but many find it boring digging through similar code.
00:10:19
As developers, we need clarity and understanding of our craft, so we avoid stubbornness in our practices.
00:10:29
This discourse highlights a fundamental truth; aiming to comprehend programming as a communication medium can yield better results.
00:10:36
Take feedback on your code seriously; it can highlight your biases when writing for yourself instead of others.
00:10:44
After all, our audience is other developers who will read what we've produced.
00:10:52
This realization shifted my approach toward making my code more approachable and discoverable for future teams.
00:10:59
Instead of the directed graph approach, I began organizing my code in a tree structure.
00:11:07
By separating value objects and functionalities, I could keep my code clearer and actions predictable.
00:11:14
Contrast becomes clear when we explore which methods serve specific functions and clarify interactions.
00:11:22
As a minimalist, I prefer to limit clutter in my code. The clarity increases my productivity as a developer.
00:11:31
In this pursuit, I considered how styles can introduce unnecessary complexity by encouraging inconsistencies.
00:11:39
To maintain productivity, I decided to minimize those unnecessary decisions upfront.
00:11:47
This way, I avoid falling into the rabbit hole of making arbitrary choices that lead to confusion.
00:11:55
My vulnerability led to identifying how better organization can create clarity and foster collaboration.
00:12:03
The last aspect is exploring the balance between economy and thoroughness in programming practice.
00:12:11
Quickly shipping code can be a good strategy, yet it sometimes leads us to neglect thorough testing.
00:12:18
In fact, most teams would benefit from deepening their understanding of code dependencies.
00:12:26
The reality is many developers don’t fully grasp how their code interacts within larger systems.
00:12:34
Encouraging separated coding styles may lead to siloed development, which hinders teamwork.
00:12:41
Some developers gravitate towards the lowest common denominator, resulting in mediocre outcomes.
00:12:49
As programmers, we should lean into normalizing clarity in our projects, urging collaboration and deep understanding.
00:12:56
Be aware of the complexity that arrives during coding. Sharing knowledge fosters better performance across teams.
00:13:03
Earlier, I mentioned the importance of pausing to reflect on our actions to enhance programming performance.
00:13:11
This practice will lead to more insightful questions, which will help us invest in our personal growth.
00:13:17
The true key to effective programming lies in understanding ourselves—our motivations, our feelings, and our reactions.
00:13:24
As we venture into this complex field, we develop systems to help articulate new ideas and solve bigger problems.
00:13:32
Programming is more than just writing code; it's about fostering understanding, collaboration, and creativity.
00:13:40
Henceforth, I encourage all of you to reflect deeply on your unique approaches to programming.
00:13:48
Thank you so much for your presence today. If you’re seeking a company that supports self-improvement, please check out Test Double.
00:13:57
Feel free to come up and take a commemorative edition of my printed material.
00:14:05
Also, we have a Test Double sticker for you if you'd like one. Your time here has been appreciated.