The Limitations of C and Me

reflection
What the job search is teaching me about coding and myself.
Author

Jackson Philion

Published

October 10, 2024

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.