Iâd finished up my CLI project and was, frankly, pretty proud of myself! Iâd found a relevant topical domain, learned how to work with the API, and utilized a ton of new gems and tools that resulted in something prettier and more functional than I couldâve imagined. I ticked off all the requirements boxes for passing the assessment, but also added a bunch more stuff just because I started having fun! See: Greenfield is Exhilarating!
My Project Walkthrough: so much CLI! It doesnât look like it (limited formatting here) but that image is a link to my Project Walkthrough video, if you feel so inclined.
I came to my review slightly nervous, but excited to show off what Iâd been working on. Previously, Iâd submitted a blog post on my work, the GitHub repo URL, and a video of me walking through the gem. I had a solid big picture of what my gem did, as well as of how it did, and a ton of inline docs to help me over the parts I was worried Iâd forget.
When my reviewer popped on the line, I was thrown off right out the gate by her confusion over what we were doing there. She first asked me excitedly how I was feeling about my final project, and when I looked confused, corrected to âOh, this must be a Sinatra project!â ânope. Not a fatal start, but I felt kindâv deflated.
In the next few minutes it became clear that the reviewer had no idea who I was or what my project was about. Iâm not sure if this is an oversight, or an intentional part of the way the reviews are structured. I had assumed that I was writing a blog post and recording my tool walkthrough so that my assessor would come prepared with questions and thoughts, but perhaps that was a faulty assumption.
That too shouldnât have been a fatal step, but in a lot of ways it was. Remember earlier, when I said Iâd used fun tools and gems to make things look nice and work well? My reviewer complemented the way things looked, but very rapidly started expressing frustration with those tools. Specifically, the general messaging was âthis is bad because I donât know how it works.â
The primary tool she took issue with was thor
:
Thor is a toolkit for building powerful command-line interfaces. It is used in Bundler, Vagrant, Rails and others.
Thor has nearly three hundred million downloads on RubyGems. Itâs a dependency of Rails, bundler, fog, faker, rack, google-api-client, bourbon, solargraph, jenkins, and I could go on but letâs just round it up to a rough 1.3 million repos and 6400 packages.
The point is to say, the âcomplicated toolâ that was a real thor-n (get it, thor? heh!) in my reviewerâs side wasnât some new, untested, dinky gem Iâd pulled off an arcane StackOverflow question or some such thing (not that even that shouldâve been a problem, but still). It was a nearly decade-old tool thatâs intrinsic to the ecosystem, well known, and quite frankly, not all that complicated.
Though we spent barely any time on my actual program code (weâll get to that a bit later), each time we did she paused to remind us out loud that it was extra complicated and/or hard to parse because of âthis Thor thing you usedâ.
She also took issue with the fact that I didnât understand how Thor itself worked on the inside. This line in particular: Candidates::Cli.start
. She seemed incredibly disappointed that I couldnât explain how Thorâs start
method itself worked.
This part I have mixed feelings about. Sure, I couldâve spent time learning about how each of the gems I used worked, but first, a lot of it would surely be over my head at this stage, and second, isnât not knowing how they work precisely the point? If I could do everything Thor did, I wouldnât have needed itâI couldâve just written it all myself. From my perspective most of the value of using open source tools like Ruby and Rails is that you can accomplish more than you understand. You can save time, effort, and lots of make-work, by benefiting from those who came before you.
And sure, when I have much more experience programming, I will likely understand more about the innards of the tools I use. But at this stage, it seems like a useless critique. What am I to take from it? That I should stay away from anything I canât 100% build on my own? That the entire robust ecosystem of tools is up in an ivory tower Iâm to stay away from until I become a mythical âreal programmerâ? I donât know how Ruby implements most of the things weâve been learning in the class either. Uhoh.
Back to our review. So Thor was definitely a thing hanging over my head the whole session. She absolutely made me feel bad for using it, and frankly Iâm pretty upset about that. See my earlier point about preparation. Had she taken a look at anything about my project before our session, then she couldâve compensated for the fact that sheâd never heard of Thor before, by doing maybe five minutes of research.
But also, isnât coming across code and tools you havenât seen before the job? Has she never approached a code base she didnât write entirely on her own? That canât be true. Why was she so thrown by seeing something she didnât know about, and more importantly, why did she, in the position of power in this interaction, make me feel incompetent for using an ambitious toolset? Iâm not the instructor here, but when someone Iâm assessing professionally has come up with a clever way to accomplish their assigned task, Iâm impressed by their find, not defensively dismissive because thereâs something I hadnât seen before. To the contrary: by all means, teach me something!
Thor led to some of the things she said that were the most upsetting:
âItâs totally fine that youâre using Thor and everything, but you had to then explain all that to me, and that took too much time.â
âI can tell you put in a lot of work but your code is a mess because of all this Thor stuff.â
âThis CLI class is majorly confusing because itâs so heavily dependent on Thorâ
I was chastised for having used a tool that resulted in what my assessor herself called âprobably the most complex CLI project Iâve seen in a long timeâ (in a good way), and that âlooked way better than the other projects Iâve seenâ and âdoes so much more than any of the other projectsâ⌠because she herself couldnât grasp how one of my dependencies was implemented.
I want to stop here and focus on one seemingly throwaway thing she said: that my code was âa messâ.
First, a plea. Please literally never say this to any new student. Maybe itâs not that big a deal, but to me it effectively undermined just about all my workâeven though the work itself worked! And it worked well! Weâre talking custom error classes, multiple forks to take, a handy wizard, the whole shebang! (Iâll come back to the shebang later tooâŚ)
Second, no, it was not a mess. Was it the most beautiful code ever written? Almost certainly not! It was standard, and possibly even better-than-run-of-the-mill, new developer code. Iâd written, refactored, gotten help from mentors and engineers, extracted parts out when they got complicated, and done literally everything Iâve been taught at this point to keep it tidy. Line spacing and indents that all followed convention, breaking out bits of methods so they donât do a ton at once, had fairly descriptive method names, and even used an overly-aggressive linter to fix things I hadnât previously even known were things.
Unlike a lot of the other students sheâs talked to, Iâm also an industry veteran, and I myself have seen almost certainly more beginner and advanced code than she has. Unfortunately, knowing what I know didnât make it any less of a gut punch when the person tasked with evaluating me casually undermined it all.
But Iâll move on. So the shebang.
This might be another case of mismatched expectations, but I went into the assessment eager and prepared to explain all the code Iâd written. Instead, right out the gate we focused on the code I hadnât written. Iâm not talking about Thor here, Iâm talking about all the stuff Bundler and RubyGems give you right out the gate to make writing gems quick and easy (bundle gem
ftw!)Â . The things they provide since theyâre always nearly identical, and so you can get to the business of learning and writing your actual code.
So instead of being asked how my code worked, the focus was on why Bundler set up the file directory the way it did. And what the bits of that, were called. And on where I required
my files. In one particularly frustrating case, she asked about this line:#!/usr/bin/env ruby
We ran into multiple problems here. First, it seemed there was a sheet she was using to tick off boxes, that required me to literally say certain words (she referred to it as a rubric, which is typically much more about skills than a vocabulary list, but regardless).
The challenging part was that she was pretty bad at letting me know what she was trying to get me to say. Several times in the review I said âI donât understand your question. Are you trying to get me to say the word X?â. When I got it right, I got a laugh and an affirmative nod. When I got it wrong, I got a blank âyou donât know what youâre doing, do you, silly studentâ stare back.
Even while criticizing my own choice of words as âtoo vagueâ she kept asking questions like âwhat is thisâ and âI need you to say something differentâ while fishing for a very specific answer that I had very little chance of sorting out without additional prompts.
In theory, this might not be bad. We have lectures and office hours each week, and itâs pretty routine for our cohort lead to respond to a studentâs confusion with âwell what is that calledâ and âhow does that workâ, in an effort to help lead them to an answer they already know. But this didnât feel at all like that, and it wasnât because I didnât know the answers (because I did probably 86% of the time).
It felt like playing Taboo, where the cards prohibited her from saying pretty much anything useful, and I was left there just reciting a dictionary in an effort to figure out what plane we were even on. As with all the other things, I canât know if this was my particular reviewerâs way, or a prescribed Flatiron plan. In either case, it wasnât helpful, and it constrained the conversation enough that I ended up appearing to not know things I knew cold because I couldnât interpret the word salad (lite!) and understand what was being asked .
So back to the shebang. I didnât remember that it was called a shebang. This resulted in numerous expressions of disappointment, the hard statement that âI clearly havenât been talking about code at allâ and the assessment that I didnât know âwhere any of my code went.â
A little more detail on that: my CLI tool ended up being nicely complex. So in an effort to make it easier to read, I split my primary code into two files: a topic.rb
file, and a cli.rb
file, and added the various require statements to make it all work (plus most of it was inside the same Module). The main distinction I drew was that my actual API calls and data fetching happened in the topic.rb
file, as well as the Class definition and instantiation, whereas the actual business of the CLIâs interactions, happened in cli.rb
. It was a choice based on intuitive sense, rather than âinstructions told me to do it this precise wayâ, and that didnât seem okay to my reviewer.
I explained this thrice. I got blank stares in return each time, and continued assertions that I had no idea where anything was supposed to be. My technique went from what I had thought was a good idea to make it easier for someone to read the code, to âthis is bad because I have to look at two different files instead of one.â Now again, beginner programmer here, but isnât splitting code up so itâs easier to grok a good thing? Arenât we supposed to avoid super duper long files with thousands of lines of code?
PS: She also told me twice âbut none of this is Object Oriented Programmingââââwhich I kindâv just stuttered at. Ruby is OO. I made a Class, and then instantiated instances of it. What part of OO did she think Iâd missed?? How was my entire project not OO? She didnât provide any precise explanation, just a hand-wavey âyou didnât do the main thing you were supposed to do.â
Iâm not perfect by any stretch. I didnât expect to need to walk through the things bundler had done for me, and so indeed I found her questions on that confusing and demoralizing (in addition to the previously mentioned problematic lack of clarity).
Itâs not that Iâm right for not knowing them, itâs just that they really didnât seem like the high order bit. What about all the code Iâd written, that I was supposed to be demonstrating? How was that less than 20% of the time we spent? How was that the afterthought?
Imagine you spend significant time working on an ambitious solo project, and you build a beautiful house. Buyers are coming through, and youâre ready to explain to them how it all works, why you chose the fixtures you chose, what choices you made in the foundation, all of it. Everything from the paint color choices to the soil sample reports you looked up before you started. But then the buyers arrive, and they donât ask about any of those things.
Instead they want to know the precise title of the city inspector who provided your permits when you broke ground, and where he went to college. They want to know what brand of gaskets the plumber used when installing the hot water heater, and by the way, gaskets made it really unattractive to look at the pipes anyway. They want to know a whole bunch of things that you could easily look up, and indeed looked up when they were relevant as you made the choices, but which you absolutely didnât commit to memory, couldnât spit out on demand, and which you trusted vetted professionals along the way to handle for you.
Oh yeah. And then, on the way out, after telling you that you clearly had no idea what was going on, they mentioned that it was the most beautiful and well built house theyâd seen in years, and congratulated you on the offer headed your way later.
At the end of the day, I made the sale. I passed the evaluation. And studying up on my gaskets and inspectorâs titles is a thing I can do anyway, so thatâs greatâI will.
But how was I walking away from my meeting feeling like crap? How did it not seem strange that in the same evaluation, she told me it was the best app sheâd seen, and also that I had no idea what was going on, and that my code was a mess?
Some of the other reasons I felt bad, full disclosure, were perhaps things I should learn to ignore. For example, my assessor clearly had something else going on while doing my assessment. Unsure if it was a pet, or a child, or a plumber, whoeverâbut she kept drifting out while I was explaining things to motion to or interact with someone off the screen. And when sheâd come back, sheâd missed much of what Iâd said, sowing extreme doubt on my end. Was I right? Should I repeat what I just said? Was I wrong? Was she just not listening?
All in all it was the closest to a grade school experience that Iâve had in decades. Where someone, just by virtue of them being in the position of power, criticized things I was pretty confident werenât broken, focused on the âthe curriculum list says this so you have to do exactly thisâ rather than what Iâd accomplished, and where I was so thoroughly unimportant that despite this being a critical step for me, the person in power literally had no idea who I was. It felt like an exercise in following the rules, rather than a programming exercise, and it was completely absent any empathy.
Iâm in a frankly pretty privileged position right now. Iâm learning more coding because I want to, not because my current livelihood depends on it; when Iâm done I likely wonât go out and job hunt, Iâll just be able to do more different things at my current job. That makes it lower pressure. But if Iâd had that review experience, coupled with my financial future being dependent on it, the pressure wouldâve likely just made me quit. It wouldâve made me ârealizeâ that I âjust wasnât cut out for programmingâ and that wouldâve been that.
Last up, lest you all think I thought I was perfect, my list from my review of things I do indeed need to get a better understanding of:
require
vsrequire_relative
. There were a few of the former in my codebase that the reviewer said ought be the latter, and I definitely need to better understand why I choose whichâeven though I can make it work with them being effectively interchangeable.- The file structure bundler provides by default. Iâd been able to put everything where it needed to be to work, and I learned it all once upon a time, but indeed I canât quite articulate some of the choices I made. For the most part in that case the answer is âI googled it and figured it outââbut remembering more of the why is of course useful.
- I had various gems
require
d in different places. Specifically, when I reasoned about where to put each gem, I tried to put therequire
statements in the files that would actually be using them, thinking that that way, if another file was the one being used, it wouldnât need to load every single gem in my program. My reviewer thought they ought all be in one single place (âRuby only loads things once, so they should all be in the same place; they should all be in the environment fileâ). I need to dig into this to better understand what she means, so I make better decisions next time around. - Testing! Testing is not not one of the things we talked about in my review, even though I did some, and itâs something I really donât know enough about building out. Weâve only barely covered them in the curriculum, but I could already see from just the CLI project how theyâd be useful and found myself missing them. So requirements agnostic, I hope I can devote more of my side-energy to learning more to write tests.
- Custom Error Handling. Again, not critical to my gem, and not a project requirement. We touched on it briefly in the curriculum, and I implemented it in my projectâbut barely. I lacked confidence while working with it, and had everything not worked precisely so, likely wouldâve given up and stripped it out, even though it was a valuable enhancement. So this too is on the list of things I want to go back and get better at.
I talked over my review experience with some folks in my cohort at the next office hours, and thankfully it seems like my experience wasnât the norm. My classmates who had already had theirs seemed to have been able to focus mostly on the code they wrote, werenât quizzed much on terminology in the precise way Iâd been, and walked away feeling encouraged and optimistic. So hopefully my experience was isolated. It helped me feel less like âmaybe I was just being so sensitive,â and more like âthis was peculiar, and I shouldnât hold on to it much.â Iâm still just as good at this as I thought I could be going into the review.
Maybe my reviewer was having a bad day. Maybe their life is really stressful right now. I guess the best thought I can offer to hopefully help this not happen in the future, are these words of advice to reviewers:
- Recognize that youâre in a position of power. Recognize that casual insults you may not even commit to memory, are extremely meaningful to a beginner, and extremely high stakes. Recognize that they have little value, and thereâs surely a more positive way to constructively criticism.
- Prepare! Your student has a lot riding on this. Itâs another task for you, but an extremely important milestone for them. You should be excited, receptive, and appear to care. Fake it if you must!
- Try not to be distracted. Yes, life happens, but for important assessments, the person youâre evaluating should be the primary and solitary thing youâre focusing on. Being distracted sows doubt, and instead of reinforcing your student so they do better, youâre panicking them about why they canât keep you focused.
- Your student is an adult. This isnât grade school. Yes, in this case youâre in a position of power, but thatâs incidental. When the eval is over, most of us are parents, bosses, nurses, whatever, and weâre just trying to claw our way to a better spot in the world! Itâs not important to establish the power dynamic with you as the person âin chargeâ. You are in charge, thatâs enough. Thereâs zero value in interacting with a newbie in a way that reminds them theyâre a newbie at every step of the way. They may know more than you, in certain areas, and thatâs a possibility you ought embrace, not a challenge you ought stymie. Best to ask why they did something the way they did it, rather than chastise them for taking some path other than the precise one youâd have chosen.
- And lastly, be empathetic. If your interaction comes from an empathetic place, youâll likely get all the previous things on the list right. Put yourself in our shoes, remember the anxieties you felt when you were in our spot: making someone feel at ease is the least you can do, and will result in better outcomes for the students, and more enjoyable interactions for you.
For reference, as a final thought, this is the feedback / review I received after my session:
TTY gem create table, color + nice user interface
deesn't know sheebang, or really know where her code goes
doesn't really understand the diff btw require & require relative
confusion on ID'n self when involking fn
very bright
live code showing the user list of name of the users they've searched for & added into the app
blog about diff btw require & require relative, w/snippet about shebang line
Well. At least Iâm bright đ