Perhaps it is the case that most people are born with such a strong intuition about the world that they never have to search for a direction for their lives. Like a compass they know exactly which direction to point in at all times, only succumbing to self-doubt amidst great chaos. If that describes you then, by all means, do not waste your time on my thoughts, for they come from a place of much greater confusion.
I am a strong proponent of optimistic empiricism. By empiricism, I mean that we should not trust anything but our own senses and personal experiences when it comes to making decisions or deciding that certain truths are real, and maybe not even those. The optimistic part means that even though we shouldn’t, by nature, it makes a lot of sense to build upon the ideas, opinions, feelings, and experiences of the rest of humanity, especially in the modern world.
Humanity exhibits what I might call a hive mind, except with a few important differences. While we are not connected in real-time in our brains, and we each make decisions independently from one another, we have untethered access to (almost) the entire body of knowledge that defines the history of our species. We actively add to that body of knowledge daily, even if we aren’t aware of it, and even if our contributions aren’t necessarily impactful to the species as a whole.
Today I would like to talk about ideas. How we find them, how we build them, and what we do with them. I would like to take a quick second to recognize that while this post is largely focused on the field of software engineering, the same ideas can be applied to almost anything, such as music, art, or engineering.
Part 1 — Finding Great Minds
Every person in recorded history who has had a great idea did not get there from scratch. They were springboarded towards that idea with the help of some external knowledge. It is impossible to solve a problem that you don’t even know about. Science is a fantastic example of this concept. I am by no means a scientist, but without Newton, there could not have been Einstein, at least not in the same sense. His contributions would have been different, if not altogether nonexistent. Without Einstein, no Hawking.
As Bret Victor points out in an amazing talk on the future of programming, ironically set in the early ’70s, our species knows essentially nothing about the true nature of computation. We have made a marvelous first attempt, with Alan Turing likely being the best candidate for the field’s own Newton. The answers to “What is a computer?”, and “What is programming?”, however, remain not only subjective but also tragically unexplored.
The first step that we must take when trying to find great ideas is to admit that we need them. This requires a mixture of humility and self-awareness. We must believe that there is something greater out there than what we already know, some truth greater than the one that we currently hold. Once we reach that point, we are truly lucky. Not only have we opened ourselves to the beautiful journey of accumulating knowledge, but we live in the absolute best time to pursue that knowledge.
A quick youtube search will turn up dozens of fantastic talks on the nature of programming, computation, and even thought. If you haven’t already come across this list of the best programming talks around, I highly recommend that you check it out. It is easy to find ideas, but how do we know what to do with them?
Part 2 — Question Everything
If you don’t already know who Alan Kay is, stop reading this and go watch any one of his vast number of fantastic talks. One of the points that Dr. Kay loves to make is that mindset and knowledge trump IQ every time. His classic example is that Leonardo Da Vinci was incredibly brilliant, and he was obsessed with creating an engine to power various vehicles that he prototyped through the decades that he was alive. He was unsuccessful. Henry Ford, on the other hand, was not nearly as brilliant, but with another 500 years of human knowledge under his belt, he was able to accomplish a task that eluded Da Vinci for decades.
Dr. Kay is also a dedicated proponent of Innovation over Incrementalism. This might be a case where my lasting impression of his thoughts is incorrect, either due to my own biases or flat out allowing the true message to be lost on myself. When I listen to Alan discuss this, it feels a lot like Innovation vs. Incrementalism. From my perspective, he views these things as being at odds with one another, and that pursuing one requires giving up another. Or, rather, that incrementalism only exists as a tool to empower true innovation.
In these instances, it is important to understand that Dr. Kay is preaching to a group of people who probably can’t be found amongst the masses. This is where we have to be humble because when it comes to the list of people who are going to fundamentally change or shape human history, we as individuals are not very likely to be on it. It might hurt to openly acknowledge the fact that we aren’t going to change the way that most people think about technology, but it doesn’t have to be an ultimate defeat. It can be the beginning of our own type of journey. One that might potentially result in revealing new truths to others, or even pushing humanity as a whole forward in some way.
But it doesn’t have to be. It can be a much more realistic journey. One where we decide that we are going to at least push ourselves forward. Not just in the scope of our knowledge, but in that way we pursue our craft. In the end, my point is a simple one: Alan’s message is very powerful when delivered to that small subset of people that are destined to change the world if only they had the right mindset, but it might miss the point for the everyman. My real fear here is that someone, like myself, might watch Dr. Kay speak on this and decide to avoid incremental progress in lieu of finding some grander goal/purpose. Sometimes the best thing that we can do is to make incremental progress.
To put it simply, question everything. Go out and find these great minds, and listen to what they have to say. Listen humbly, and with an opened mind. Listen intently, and listen again if you didn’t grasp it the first time. But please, don’t stop there. Question what they are saying. Truly dig into the meat of what they are saying and gain as much perspective as you can. Move forward adopting those ideas which push you forward and leaving behind those that might cause you to falter on your journey. Most importantly you must do neither blindly.
Part 3 — Finding Yourself & Motivation
I certainly don’t mean to preach, and the title of this section was not chosen to diminish the reader to my level. If you remember I actually started this post by alluding to my own imperfections. This is targeted at those of us who are still on our journeys, or potentially even just now defining those things which are important to us.
Bret Victor, who is worth mentioning hundreds of times over, has another wonderful talk called inventing on principle. His focus is on individuals finding and defining those things which they are so passionate about that they begin defining the individual’s journey almost automatically. His thoughts have been instrumental in my own recent period of growth. In the same way that I think Alan Kay may have been overreaching, I think Bret Victor may have done the same. It is okay to take an incremental approach when defining the things that are important to you. Making any progress is wonderful, and you are not wasting your time just because you don’t go straight from 0 to 100.
Part 4 — Using Myself As An Example
I definitely have not reached the finish line of defining my own principles, but I am getting closer every day. Another great speaker who I have to thank for that is the wonderful Rich Harris of the NY Times, the guy who is also behind the svelte component framework. Perhaps this is just my own flawed perspective rearing its head yet again, but I think his talk on Rethinking Reactivity will be looked back on as one of the most impactful talks in the history of web development. The big takeaway from his talk, for me, is the idea of the framework as a compiler. Svelte is not the first thing to do this, not even the first front-end web framework. In fact, we have been using code generation since the ’60s and ’70s in the form of macros.
After watching his talks and a few others I found myself researching compilers and DSLs, and I found myself asking an interesting question: why don’t companies create more tools for themselves? This is not to say that some companies don’t make their own internal tools, but that the ones I’ve worked for typically don’t. I’ve been working on the same project at work for over 3 years now, but this marks the 10th large scale software project that I’ve worked on in my career. These have been written in various programming languages, various environments, and for all sorts of different business needs. They have all had one thing in common, though: they have all been written essentially from scratch, with the exception of using various open-source community tools.
Due to my other hobbies and responsibilities in life (I am a dedicated musician, and I also have a family), I have not always had the time and energy to be obsessed with Software Engineering outside of work. I am just getting to the point where my own tools and productivity are more important to me that maybe anything else, at least in the context of software.
So moving into 2020 I will be aggregating ideas from all three of the great speakers that I have mentioned so far:
- Bret Victor
- Alan Kay
- Rich Harris
From Bret, I will take the importance of personal principles in development. From Alan, I will take the inspiration and confidence to look towards the future, while not being afraid to take baby steps in getting there. And from Rich, I will take the concept of using a DSL to describe my applications. That is not to say that these takeaways accurately represent these individuals and their personal beliefs, but rather the mark that they have left on me.
My goal for 2020: building an application that helps me build applications both quickly and correctly. It will essentially be a DSL represented by a UI. After all, a DSL, like any programming language, is a representation of ideas. One might say that it is the representation of the current state of ideas relative to some software system. And what better represents state than a UI?
Thank you for reading, and good luck with your own goals in 2020. Happy holidays!