This interview was for a Linux Scripting Engineer position with Python. I was supposed to have a Linux computer prepared for the interview.
It was conducted via a Microsoft Teams link, and I first tried installing Microsoft Teams Preview for Linux on my PopOS laptop but it seemed not to allow me to use the app without a company account, although it then turned out that the link worked in it. So I thought I will have to use the web app in browser, and as MS Teams webapp didn't support Firefox, I installed Microsoft Edge for Linux specifically.
The link ended up xdg-opening the app on linux and so I joined through the app but I simulaltaneously expected it to fail so I immediately also went for the "in browser" link and began entering my name there. My speakers were a bit silent but I then heard something when I raised my volume and it turned out the app successfully joined the meeting.
But the performance of the app+laptop or, as they were nearly sure about, of the network connection which was also possible with the crappy router and this laptop only having 2.4GHz WiFi, was making sentences cut-off for them even after I disabled my webcam on their request. The Linux laptop sports an i7-3630QM CPU and 8GB of RAM, so it's not that I chose some weak one.
So I ran for my more performant Windows laptop with 5GHz WiFi and tried to open Teams on there, to no success. And Microsoft Teams were previously installed there with Chocolatey from the also-administrator account of my quasipartner. While in-interview, I attempted reinstalling microsoft-teams with chocolatey with --force, to no avail. It now turns out that there are package parameters like /AllUser and /AllUsers or something like that (there are two similarly named like that but distinct) that make the package install not in the default way of a system-wide -but- one-user installation.
I wonder if similar parameters exist for Windows Terminal because my quasipartner just needed it and I also thought I had it installed system-wide with Chocolatey from *my* account, and --force reinstalling (*from her account*) did nothing. We ended up installing it for her from the Store.
I ended up having the idea to try joining the call from browser from the more performant laptop
( /fortunately/s Windows had Microsoft Edge preinstalled besides my Chocolatey-installed Firefox *(hey, I don't recall that one needing an installation to be parametrized for all-users!)* )
and that let us begin with the call at last.
After a lengthy introduction on the position, I got asked several questions about my personal past and motives which I answered in a somewhat weird way but it might have been not that bad. I managed to speak about needing to learn things and have knowledge to share - present and blog about -, and about the need not to feel worthless, and about a job being a cure for my burnout to allow me to return to university in a few years time. I mentioned I once frequented certain meetups in another city that the company organized.
For the tech interview I was supposed to open a shell and share the view as presenter in the call, they expected an interactive interview. As I was now running Windows, I first tried running a WSL Ubuntu, but as it started they replied that them being unsure of its limitation they would rather not work with it.
So I decided to ssh, from a Powershell tab in Windows Terminal, to my Linux laptop standing on my right hand side. And here it all started.
When typing in the password I was asked if I know about other ways of logging in without a password, I mentioned public keys and that there are other PAM methods like one-time passwords.
First they asked me to show them how would I check what distribution am I running.
1 less /etc/os-release
Then they asked to show how I would check hardware information, connected devices, later mentioning CPU... I first started typing `lsusb`, `lspci` but ultimately I decided on
2 lshw ^C^C^C^C^C 3 sudo lshw 4 sudo lshw | less 5 cat /proc/cpuinfo
Then I got asked to check what kernel version am I running. Now that I think of it from head, I could have used `uname` ig, but I ended up with
6 ls /boot/ 7 file /boot/initrd.img
I then got asked to print just the last word of the output of !7
file /boot/initrd.img | awk {^H^H^H^H^H^H^H^H^H^H^H^H^ 8 man bash / /EXPANSION 9 RES="$(file /boot/initrd.img)" echo ${RES##* } 10 RES="$(file /boot/initrd.img)" echo ${RES##.* }
and here they asked me to even just print the variable
11 RES="$(file /boot/initrd.img)" echo $RES 12 echo $RES
yes I guess !12 wouldn't haave shown anything and that was verbally communicated
13 RES=abc 14 echo $RES 15 RES="$(file /boot/initrd.img)" 16 echo $RES 17 echo ${RES##* }
Here I got asked to use the shell variable in a sentence, so they meant string interpolation and I decided to do that neatly and not just echo
18 RESS="The last word of \$RES is ${RES##* }." 19 echo $RESS
I then got asked to explain pipes
So I mentioned there are named pipes and anonymous pipes, named pipes are special files while anonymous pipes are kernel constructs that are issued two file handles for assigning to two file descriptors table entries to two programs so that they are able to communicate with each other as if they were writing (or reading) to a file.
20 cd /etc
and then I was asked to *use a pipe* to search the directory listing for "pass"
21 ls | grep pass 22 ls 23 man ls 24 ls -C 25 man ls / /1 # I got assisted with advice to search for "1" nnnnppppnnn 26 ls -1 27 ls -1 | grep pass 28 ls -1 | grep "pass.*d" # now with a d at end 29 ls -1 | grep "pass.*?d" # how do i greedy?? 30 ls -1 | grep "pass.*d$" 31 ls -1 | grep "^pass.*d$" # now make sure it won't start with sth else
Then I got asked to show the permissions on that file and read them
32 stat /etc/passwd
I mentioned that there was no sticky bit or anything and elaborated the permissions briefly. I was then told to create a file in temp.
33 cd /tmp 34 touch a 35 stat a 36 chmod o+x # I SOMEHOW WENT WITH o AS IN owner !! 37 stat a 38 chmod u+x 39 chmod u+x a 40 chmod o-x a
But I then said I went for this format for tidyness sake and I'm usually using the numeric notation, so I got asked to use it
41 stat a 42 chmod 764 a 43 stat a
I got asked to explain what each digit means, I elaborated on the fours the twos and the ones and the most significant bit and the least significant bit and then I was getting questions calling octal digits octets which were supposed to be tricky to check my knowledge I suppose.
Then I was asked to write a command that would depend on a file existing
44 test -f a 45 echo $? 46 test -f b 47 echo $? 48 if test^H^H^H^H[[ -f a ]]; then echo a; else b; fi 49 if [[ -f b ]]; then echo a; else b; fi 50 if [[ -f b ]]; then echo a; else echo b; fi
51 cd /etc 52 grep -r root 53 grep -r root | less -r 54 grep -r root /etc 55 clear
Now how would you schedule tasks?
56 systemctl status crond 57 systemctl status atd 58 systemctl status cron 59 crontab -e 00 00 5^H^H^H^H^H^H^H 0 0 5 *^H^H^H 0 0 * * 5 bash -c "touch /tmp/a-$(^H^H^H^H^H^H^HH^H^^H^H^ 0 0 * * 5 touch /tmp/a
Haha now my laptop will do this every Friday "Yes don't forget do remove that later"
Now please write a script that will accept two arguments and divide them.
"In Python or in Bash?" - In Bash, we are focusing on shell scripting in this interview.
60 cd ~ 61 vi div.bash
Here my PowerShell-ran ssh lags terribly, arrows or sth fail sometimes and result in As and Bs being typed, I :q! even struggling to do so a bit because of lags
62 nano div.bash !/usr/bin/env bash expr $1 / $2 63 chmod +x div.bash 64 ./div.bash 15 3 :: ./div.bash: line 1: !/usr/bin/env: No such file or directory :: 5 66 nano div.bash # adding the she in shebang 67 ./div.bash 15 3 :: 5
"But what if 0 is the second argument?" - Only now that I'm writing this I am realizing that I totally was mindless about having to account for edge cases in this brief interview task, when the time was rushing us verily after first losing over 15min over the MS Teams complications and that was very expressed to me.
68 ./div.bash 15 0 :: expr: syntax error: unexpected argument '0' 69 nano div.bash #!/usr/bin/env bash if [[ $2 != 0 ]] # first having typed == and fixing lines later \t then expr $1 / $2 \t else echo "Division by zero not allowed." >&2 fi 70 ./div.bash 15 0 71 nano div.bash # that what you did at the end of there [...]
So I got here asked about it and said it was the standard error output, standard diagnostic output; got asked if I know what the other output is and I said there is standard output at 1.
Then I got asked to show how I would clone a repository
72 git clone git@github.com:mkf/3manchess 73 cd 3manchess/ 74 git checkout -b feature-1 -- git push -u origin feature-1
And then I got asked about what I would do if there were to be other changes on the base branch in the meantime and I responded that I could do a rebase, for example with interactive rebase.
So that's all I remember for now, there may have been a few more things between the lines (literally haha) but I feel like I can't remember there being any other things to write down.
I was terribly embarrassed about this interview and I don't think they will pick me. I was running around the flat in stress with chest pains, finally cuddling up to my quasipartner on the couch for comfort; *sweats typing this*. I will receive feedback within two weeks.
~~~~~~~~~~