As software engineers, it isn’t unusual for us to encounter obstacles in our work. There are difficult problems that must be solved, new technologies that must be learned, muddled documentation that must be deciphered, and expectations that must be managed. It’s a wonder that we’re able to create any software at all, much less something of quality. As I’ve pondered my experience working with the CodeTrain team this semester, I’ve struggled to identify any one particular challenge whose ugly head reared itself higher than the rest. In truth, the whole experience felt like a daring daylight escape; a recurring dance with the orders of ignorance.

The first step was to become acquainted with the project. Jason started working on CodeTrain last semester, so we weren’t starting from scratch. It was hard not to feel hopelessly lost amid the swirling vortex of new technologies that assailed my senses during our first meeting: Vagrant, AngularJS, RethinkDB, NodeJS, Docker, Karma, Git, RabbitMQ, GoInstant, Mocha, and Jenkins just to name a few. Git aside, I had only heard of about half of them, forget about previous experience. I began to feel a measure of panic: “How am I going to contribute anything to this project? It will be April before I even can understand what needs to be done!”

In spite of the initial overload, I realized I had been in this situation before. It wasn’t the first time, for me or anyone else on the team, where we found ourselves up the proverbial creek without a paddle. I didn’t have the skills necessary to start contributing right away, but I did have the knowledge of how to obtain those skills. With that assurance, I rolled up my sleeves and went to work.

As I started researching the unfamiliar domains and building a mental model of the program, barriers began to fall. One by one each unknown became known, but somehow I just had even more questions. My first assignment was to make sure that we sanitize the markdown that content-writers supplied. As I considered how I would accomplish this, I had to ask myself, why does markdown need to be sanitized? What are the potential exploits? What tools exist to do this for me? Is is simple enough to write myself? A solution materialized as I found answers to these questions, and so it continued throughout the semester. I felt like I was starting from ground zero with each new task, and yet somehow, I was becoming more productive. The knowledge I had gained in each area was beginning to overlap. What had loomed so ominously before me a few weeks before had been reduced to trivialities.

It is interesting to observe, both in the Computer Science program at BYU, as well as in the workforce and in life in general, how differently people approach the unknown. To some, it seems to be so terrifying that they simply cannot continue until someone has revealed for them what they didn’t know. They seem to think that they just don’t have what it takes, that if they were smarter, they would just know the answer. They’re unable to see the mental triathlon that is run in the minds of their teammates as they discover solutions for themselves. To such teammates, the unknown presents an irresistible challenge, a pool whose depths must not go unexplored. They realize that they lack knowledge, but then immediately put themselves to work searching for the missing pieces. If you can learn to diagnose your own ignorance, there is no knowledge that you cannot eventually obtain.