Below are my top 6 photos I cherry picked from our first family photo shoot that took place a couple weeks ago.
As some of you my already know, my daughter Elliott was born recently, on October 3rd (2019). And shortly after, my wife had arranged for a professional photographer — Stephanie BC — to spend half the day in our Pacific Northwest home, scheduling the photographer on a typical, no sunshine Sunday to snap some photos and capture some moments of our growing wolf pack: once four now five (3 humans and 2 dogs).
And I must say, the images turned out nothing short of beautiful; I could not be any happier with not just the end product but the process itself. Apart from one or two photos, all the captured images are not staged, meaning we were not posing or putting on a forced smile or contorting our arms and body in some uncomfortable (but aesthetically pleasing) position. The entire shoot felt organic.
Anyways, enough of the chatter. Here are my 6 photos I hand picked from the our shoot.
Music. Such a gift. Here I am playing guitar and singing for Elliott and my wife. The song is titled “My Little Bird”, which I wrote when Elliott was just a week or two old.This is how I spend 90% of my time with Elliott: cradling her in my arms and rocking her to sleep.Here’s my and my first fur daughter: Metric. In her head, she weights 10 pounds still and loves to lean all her weight on those willing.Look at this cutie staring out the window while I hold her in the foot ball position. I cannot imagine that I’ll be able to hold her like this much longer since her weight is increasing exponentially, my forearms no longer able to sustain the burn.Yes. She’s peeing all over me. Luckily, this time, the pee only hits my shirt and my jeans. I have been tagged in the eye and mouth (who knew girls and projectile pee like boys).Me giving Elliott what I call “Kissy kisses” (no idea how I came up with that name) while she rests on top of my wife’s folded legs.
I’m almost half way through the OMSCS (online masters in computer science), last week marking the end Spring 2020, my third term in the program. And although I’m looking forward to taking compilers next semester, my mind often wanders into the distant future , my mind fast forwarding to the time in which I’ll be graduating from the program. So, I stitched together a line graph that includes the classes, breaking down each term along with the courses that I’ve already taken (and will take). Here’s what it looks like:
As you can see from the above graph, I’ve historically taken one class per semester (except for the previous semester, when I simultaneously took information security and computer networks simultaneously); taking one class per semester takes the middle path, allowing me to balance school and work and family and other obligations and the millions of my other hobbies (e.g. singing, guitar). So at this current rate, I anticipate that I’ll graduate in Spring 2021 — 2 years from now. Seems like a long time away but it really isn’t. Because as they say: time flies. And It really does. Feels like yesterday when my wife and I were discussing whether it even made sense for me to apply and enroll to this masters program.
Taking computer science courses are already paying off in my career. Nothing too significant (yet) but I am witnessing small wins.
For example, this past summer I suffered through HPCA (high performance computing architecture), a course historically only offered in the longer semesters (e.g. fall, spring). In the course, I learned a lot of theory: barrier synchronization, processing pipelines, instruction scheduling, multi level caches, branch predicators, cache coherence protocols, and much more (many of which I have already purged from my memory). However, since most of that knowledge was primarily theory, very little of it I’ve been able to directly apply to my day to day job.
Until a couple days ago.
While at work, my co-worker had pointed out that the unlikely C function calls were sprinkled throughout our code base, used for branch prediction. And thanks to theory, I was able to describe to another co worker how the compiler (with its understanding of the underlying CPU architecture) will rearrange the assembly (or machine code) in order to avoid a branch prediction miss: if the wrong instruction is fetched, the processing pipeline must flush all the previous instructions queued in the pipeline, temporarily halting the pipeline, which ultimately reduces the throughput.
And this is just one example of how taking my masters had paid off. There have been a number of other situations (like understanding shared memory and interprocess communication) that I’ve been able to apply theory from academia to practice at work.
Thanks to the program, I’m feeling much more competent and confident working as a software developer at Amazon Web Services.
For next semester, Spring 2020, I enrolled in what I expect to be one of the most difficult (yet rewarding) courses: compilers – theory and practice. I’m stoked and at the same time, feeling very nervous.
I’m stoked for several reasons. First, according to the previous semester’s syllabus, I’ll be learning a ton of theory: Automata, finite state machines, grammars, predictive parsers. Many of these concepts I’ve learned on my own with my self directed education.
The second reason that I’m elated is that I’ll be given the opportunity of building an entire compiler, from the ground up! No existing code base, all from scratch. That in itself strikes fear in me.
And third, Steve Yegge’s executive summary (on his post on compilers) — “If you don’t know how compilers work, then you don’t know how computers work” — motivates me, making me want to prove (to myself) that I know how computers work.
So with all that good stuff, why am I feeling nervous?
Normally, taking a master’s course while working is manageable. I often carve out about an hour (or sometimes 90 minutes) of my early morning, studying while eating an avocado toast and sipping a ginger tea, headphones wrapped around my head while people are buzzing in the background at a near by café. In addition to the early mornings, I will leverage my one hour lunches, again watching lectures or banging out code for a (school) project.
But my life has changed.
Although my previous routines and rituals worked well for me for the last several years, my life has changed in significant ways. Most obvious is the arrival of my (first) child, Elliott. With Elliott now here (and no longer just an abstract creature curled up in my wife’s belly), I want to make sure that I’m present for her: not just for the big moments (like her first vaccinations) but for the little, day to day moments (in fact, I had one of the weirdest feelings when I stepped into the office this past Monday, my first day back in the office after 4 weeks off of paternity. while staring into the wide screen monitor pinned up against the wall of my not too shabby cubicle, I wanted to be at home, changing Elliott’s dirty diaper).
Elliott with her thinking hat on
On top of all of this, omscentral reviews (the unofficial review website for courses offered by online master’s program at Georgia Tech) suggest that the course demands anywhere between 15-25 hours per week. Those extra 10 hours gotta come from somewhere. But from where? Sacrifice it from hanging out with my life? Or strumming my guitar? Or singing? Or writing music? Or exercising at the gym? Or playing with my dogs? Or spending time with other friends and family?
You see, there’s only so much time (you already knew that) and all the decisions (small and large) are trade offs. These choice reflect our ethos. The sum of where and how we spend our time essentially defines who we are and what we believe in.
Okay. Rant over.
Back to studying (information security and computer networks) on my day off of work — thank you Amazon for offering a ramp back period, allowing me to work 50% (of course my salary is pro rated) and allowing me to pitch in with my family on Thursdays and Fridays.
This afternoon, I started on project 4 for introduction to information security (IIS). This goal for this project is to have us students learn more about web security and consists of three objectives, manufacturing three web attacks: cross site scripting, cross site forgery and structure query language (SQL) injection attack. And although I’m very familiar with the terms, I’ve actually never carried out any of those attacks in neither an academic or professional setting. In this post, I’ll share some of the things I learned while spending 4 hours in a cafe chipping away at the project.
Cross site request forgery (CSRF)
This attack was very straight forward: inspect the source code of the (PHP) files and carefully tease out which form inputs could be set in the body of the HTTP POST.
Cross site scripting (XSS)
This task was a ton of fun. Initially, I headed down an entirely wrong path and found myself getting very frustrated. Initially, because of the video lectures, I had wrongly assumed that the only way to perform the attack was to embed an iFrame my hand crafted HTML page, the iFrame loading the contents of the remote website, the target of the attack. And although this entirely possible, embedding an iFrame is unnecessary: what I really need to do is basically send an HTTP post to the remote site, embedding javascript in one of FORM values, carefully ensuring that when the page renders in the browser, it’s identical to the original website.
At work, I’m subscribed to an e-mail distribution group called “dogs@amazon.com”, a list dedicated to anyone interested in dogs. And today, I read an e-mail that broke my heart. A fellow Amazonian just had their second child and they are now giving away their 3 year old Labrador because they can no longer give it the attention that it deserves.
I cannot stomach the idea of letting go of either of my dogs — Metric and Mushroom. To me, they are permanent members of my family, my pack. Metric joined my world 6 years ago, when I picked her up from a backyard breeder in Austin Texas; Mushroom joined us about 4.5 years ago, when Mushroom was pretty much spending most of her days in a crate at my mom’s house.
Anyways, I’m looking forward to having them around for a long long time. In fact, I cannot wait for them to welcome another member to my pack in September, when my wife and I are expecting our first child.
January 7th, 2019 marks the first day of my computer science master’s program through University of Georgia Tech. The week leading up to the first day was somewhat stressful since I was mid flight (returning to Seattle from London), my plane hovering over the massive blue sea, while I frantically typed away on my keyboard trying to register for a course in my allotted time window. Because of the spotty internet connection on the airplane, it took me about an hour and half to register for my course and by that point, the open spots filled up so fast that I positioned 100+ on the wait list (which I discovered, later on after reading online posts, that 100+ wait list is normal and that I would like get get into the course, which I did).
Anyways, despite all that headache, I’m officially enrolled in a course that I’ve wanted to take for a very very long time: Introduction to Operating Systems. So far, although it’s only been 1 week, I love the course, for multiple reasons.
First, I love the collaborative and sense of community of the program. Before getting into this master’s program, I was taking a handful of undergraduate computer science courses (e.g. computer organization, discrete mathematics, data structures) from University of North Dakota and University of Northern Iowa, two excellent schools that offered courses through their Distant Learning platform. Now although I learned a lot from the courses, I always felt like I was working in isolation, by myself, my only interaction was through a few short threaded e-mails with the professors. But now, with this course, there’s an online forum (i.e. Piazza) and chatty chatroom (via Slack, which was paid out of pocket by one of the TA of the course), where students fire off questions and comments (especially random comments in the #random slack channel). So in a sense, despite never meeting these folks, there’s a sense of comradery, a shared a goal.
Second, I’m learning a ton of material that’s not only applicable to my day to day job (as a software engineer) but material that I’m genuinely interested in. For the first week, the professor of the course has us reading a 30 page white paper (titled “Introduction to Threading”) written in 1989, a seminal piece of work (on threads and concurrency) that gives me perspective and appreciation of my industry. In addition to reading the white paper, I’m watching lectures covering fundamental operating system concepts (e.g. processes, virtual memory) and above all, writing C code! A ton of C code!
The project has us writing code for a multi-threaded client and multi-threaded web server (think implementing HTTP protocol) that’s intended to teach us how to write safe, concurrent systems that utilize the threading facility offered by the operating system.
Any time you read code (in production or from a textbook), you’ll often see the control variable, when employing for loops, being declared with the variables i,j,k. And for most of my programming career, I’ve never really questioned why we specifically choose those three letters. Why not m (a great letter), or c or d or e — or any other letter for that matter. Seems rather arbitrary.
But, I suspect that it has to do with William Rowan Hamilton, a famous Irish mathematician, who published a book in the 1800’s, the book titled “A theory of Systems of Rays”. And in this book, William uses i, j,k notation when representing vectors (in R3). This representation of vectors became the standard notation and he’s the person we need to thank when we type in those three letters when programming.
I’ve been limping around for the past week, pulling a muscle in my left thigh. No fault other than my own, though.
One evening last week, Jess and I hit the gym together, exercising at the Northgate 24 hour fitness (which is apparently one of the more popular 24 hour fitnesses in Seattle, due to the larger floor plan and access to the wide range of newer equipment). The two of us were standing in front of the mirrors, facing the dumbbell racks, shrugging our shoulders up and down to work our traps. After 12 shrugs, the first set was complete but out of no where, I decided to transition, without rest, directly into a new exercise that I invented on the spot: air lunges with 35 pound weights in either hand.
So with the circular 35 pound weights dangling on the finger tips of my hands, I stepped my left foot out in front of me and lowered both my knees to 90 degree angles, pausing for a moment and inhaling deeply, and then pressed the balls of my feet into the ground to propel me against the gym floor. After a thunderous landing, I switched to the other side, my right foot now in front, repeating the same motion.
But it only took 1 repetition of this ridiculous exercise to realize that this was a bad idea. Air lunges — without weights — already strains both the muscles in my thighs and calves, the additional weights pushing me over the edge, exceeding my pain threshold. Immediately after, I regretted my decision. Worst of all, this impromptu exercise must’ve really damaged either my ligaments or muscles or tissues (or all three) cause since then, I’be been in a fair amount of pain and unable to neither exercise nor walking normally.
Lesson learned.
Take it slow — I’m not 15 any more (in fact, I’m twice that age!).
Earlier this morning, before starting the work week, I took my first linear algebra exam at the nearby Northgate Testing center. The proctored exam covered the first four modules in the course, topics including:
Gaussian elimination (row echelon)
Gaussian Jordan elimination (row reduced echelon)
Adding, subtracting, multiplying matrices
Calculating the inverse of matrices (using identity matrices)
LU Factorization
I felt well prepared (thanks again to Khan Academy and 3Blue1Brown). Going into the exam, I worked (and reworked) the suggested exercises in the textbook. Honestly, I think if I hadn’t attempted the exercises, my mind would’ve tricked me into believing that I understood the material. But that obviously wasn’t the case because the different math problems had me fumbling around, furiously scribbling pencil all over my notebook paper followed by vigorous strokes of erasing. Anyways, 1 exam down — 2 more to go.
Next topic: calculating the determinant of a matrix (at this present moment, I have no idea what that means)