The Limitations of C and Me
Unlike my other posts, I have no finished lab to reflect on this week! I am in the midst of working through the bugs in my code on Lab 4, and eagerly await the moment when I hit “download” and hear the electronic tones of Für Elise. Until I hit that point, however, I want to take a moment to describe my experience this week, when I took a skills assessment as part of a job application.
Getting Set Up
Through my internships and job applications thus far, I have never been asked to complete a written/tested skills assessment. I think this is because I most often end up applying for and working at smaller start-up companies, where a less rigid hiring structure is expected. I have been asked to demonstrate knowledge, or expand on what technical knowledge my experiences have taught me, but never in a format more closely related to a midterm than a conversation.
This time was different. After downloading a test proctoring software, I was prompted to begin the multi-part test. A timer in the corner counted each second as I was asked question after question on basic math, coding syntax, logic puzzles, and more. Finally, I reached the free response section, where I was prompted with several functions to build in any language of my choosing.
Now, it is important to note: the introduction to the assessment had stressed repeatedly that no prep was necessary, emphasizing that the role did not require any particular flavor of programming experience. It stressed that general familiarity with coding patterns and thought processes was most important, no matter the language. Given that I had spent the past several months immersed in C and SystemVerilog, and had been doing prep for other similar jobs anyways, I figured that I was fresh enough on my “general coding knowledge” to take a stab at the assessment.
The Test, and My Own Personal Island
The first question asked applicants to create a function to manipulate a string of text. Simple! I had done this many times in the past in Python, and implementation should be a piece of cake. I clicked in the field to start creating my answer and… paused. Crap. I didn’t remember how to format a python function. I hadn’t thought to review it before this assessment because I had yet to be asked a question on Python in any interview. Looking back, of course I should have reviewed it. It was too late, however. After several stabs at writing a python function, none of them quite looked right.
I felt like I had blinked and found myself on a deserted island with only a torn rucksack, a half-drunken canteen bottle, three toothpicks and a crumpled pack of crackers. I needed to build a raft to escape, but I had just realized that I had left my saw at home. It was time to take stock of my resources, and the blinking red light recording my computer screen reminded me that I had to move quickly. This led me to my first realization:
Not all coding languages are created equal, and some are downright useless for a particular task.
Standing on that desert island, I reached into my pack and pulled out an old calculator. Matlab. I had spent a good deal of time using this my sophomore and junior year, and knew that it had character manipulation functionality. However, when I took the cover off the back and wiggled around the batteries, I remembered that I had only ever used it for manipulating matricies, calculating differential equations, and digitally processing signals. Sure, it was useful stuff, but it wasn’t going to help me build a raft to get off the island. As the lighted display on the calculator flickered and died, I tossed it to the side.
Reaching back into the pack, I next pulled out a pencil. SystemVerilog. Intimately familiar with this tool from my past year of study, the familiar weight settled into my hand nicely. However, Verilog is a Hardware Description Language (HDL), not a coding language. My professors had drilled this into me, and yet I had never appreciated it as much as in this moment. Sure, I could use the pencil to draw whatever kind of raft I wanted, but it would never have the same kind of substance and power that a coding language like python, java, or matlab does. It can create an effective design, but it is reliant upon the hardware that you give it to synthesize into. I tucked the pencil into my pocket, steadied myself with a sigh, and dug back in.
HTML? Nope, useless here. CSS? Ditto.
That left me with one option left. My trusty old pocket knife, C. It isn’t glamorous. It isn’t winning any awards for ease of use or complexity. It’s just good ’ole, reliable C. This, I recall immediately. Realization two:
Programmers refer to C as a low level language for a reason.
C is great for embedded systems. It lets you control, with extreme authority, every action and function of a microcontroller with a memory-mapped control system. It lets you manipulate individual bits of data, and store things and efficiently or inefficiently as you wish. Things it’s not so great at? Implementing higher complex logic easily. You have to build these sorts of functions from the ground up. That is why so many standard C libraries exist. Such standards let designers use more powerful functions as basic building blocks without having to reinvent the wheel. This functionality balances precice control and function with ease of use and design.
Multiple programmers have already come together to create a standard suite of funcitons called I <ctype.h>
. I did not know about this suite, as I do almost no tasks requiring string or character manipulation. This left me to do my best to build out these basic functions first, before I even got to working on a bigger picture function to accomplish the task. Back to my island analogy, I was trying to build a raft with a pocket knife. It was possible, sure, but it wasn’t the right tool for the job.
It was arduous, especially without any debugging tools, reference material, or experience working with character/string syntax. I can guarantee that what I wrote does not run. In many ways, it was demoralizing – here I am, an electrical engineer with experience in these languages, scrapping together my best guess at a dictionary in C. I had a lot of time to think as I sat there trying to carve my raft. I can only imagine what the test assessor will say when they see the function – I imagine there will be some amount of laughter.
The Vulnerability of a Job Search
I’m glad for the experience, however, job or not. I had never been left to consider my knowledge in such a way. It is not often that I am given a test which I feel unprepared for – I try explicitly to make sure that doesn’t happen, in fact. It made me default back to the problem solver that I am at heart. I could not check, or verify, or debug any of my work. I saw my most basic qualities reflected back at me. Each line was written carefully and deliberately. The whole text was thoroughly commented, as I work best when explaining my thinking out loud or with a peer. At points, I heard the little voice in my head tell me that I should just quit the assessment. When my gaze wandered, looking for a small respite from the insecurity that I felt looking at my code, I saw the blinking red light in the corner. It felt like I was in a fishbowl, with the software recording my every move. It was a deeply humbling experience, unexpected on a Tuesday at 12:10pm before lunch. It revealed to me the expectations that I implicitly hold myself to, and how my brain operates when I am not meeting those expectations.
I finished most of the assessment in nearly 3 hours, at which point I could continue no longer. It turns out that nervously drinking water throughout the assessment was a poor choice. However, I can confidently say that I gave it my best shot – my brain was starting to melt at that point. I feel sure that my problem-solving process is clearly described within the online pages of the test, which is the most I can ask for. If they decide that I don’t fit the bill, then so be it. I have found myself thinking way more about the process itself than the end result anyways.
I’ll be curious to see how many similar skills assessments I do in the future, and how I respond to them. After this, I certainly will struggle to expect anything except the unexpected from these kinds of interviews and assessments. Each time I think I’ve prepared well, I seem to get hit with the question that I hadn’t considered.
The job hunt is a deeply personal, vulnerable process. It demands that you be your best self, and your most authentic self, at the same time. It tells you not to worry about your weaknesses, and to focus on your strengths. And yet, throughout the entire process, you are poked and prodded to reveal flaws and missing knowledge. It brings out the best in people while also plainly laying out all of the possible reasons for rejection. It is a maddening dichotomy and an uncomfortable process.
Yet, the job search is a fact of life. More than that, it is uncomfortable because it is a process of growth, change, and soul-searching. I hope that it has the intended outcome – a job that I see a future for myself in. But, for now, it’s already helping me be more introspective, less hell-bent on perfection, and revealing my Electrical Engineering work in a whole new light. In that sense, I guess that it’s already started to pay off.