Like many other aspiring authors, I’m always sharpening my writing skills, dozens of writing books (including one of my favorites: On Writing by Stephen King) lined up on my bookshelf. Almost all these books share the same stance when comparing the active and passive voices. They strongly prefer the active voice over the passive voice. Always. Black and white. No grey area. Their justification? The books claim the passive voice sound weak when compared to the (strong) active voice.
Sorry — that’s baloney.
Some situations call for passive voice. What I’m saying is this: sometimes passive voice outperforms the active voice. Voice selection depends on whose story you want to tell. Here’s a simple example: Jack loves Jill. In this example, Jack (the subject) loves (the action) Jill (the object); as readers, we expect that the following sentences revolve around the subject, Jack. But, what if the author really wanted to focus the story on Jill, instead? Simple: change the voice from active to passive. Switch the subject from Jack to Jill and change the tense: Jill is loved by Jack. Jill (subject) is loved (the action) by Jack (agent).
How about taking a look at an example of changing the voice (from passive to active) adds confusion to the mix. In the two examples below, the top is written in passive, the bottom its active voice equivalent.
Passive voice. Source: Gopen (2020) video companion PDF
Active voice. Source: Gopen (2020) video companion PDF
Does the conversion improve the movement, improve the quality, improvement the passage as a whole? No! If anything, the new passage confuses us readers! We are now distracted, our attention pointing towards the scientists, when we should be focusing on the science.
There are no shortcuts to becoming a great writer. As Stephen King says, great writers need to read a lot and write a lot. But that’s not enough. Nope. I’d argue you need to take writing one step further: imitate good writing.
Imitating great tennis players
When I was a young boy, about 8 or 9, I imitated all the top tennis players. I’d slip on my worn-out tennis shoes (leaving the laces untied, a bad habit that I cannot seem to shake, even as an adult), slide into my above-the-knee shorts and position myself in front of the 10″ CRT television. I’d then watch the tennis legends from the late 90s, mirroring their every move. Gripping my imaginary carbon fiber tennis racket, I’d bend my knees and point my finger into the sky as I leaned into the platform serving position (aka trophy position) just like Pete Sampras, I’d shuffle my feet like Michael Chang, I’d glide towards the net to serve and volley like Patrick Rafter. Over time, my tennis game became an amalgamation of theirs (of course, I never reached their levels). And I believe that this approach of mimicking the greats should be applied to aspiring writers who want to improve their craft.
Claim: Great writers reverse engineer
Great authors imitate other great authors. In “Sense of Style”, Pinker asserts that good writers are avid readers and that they have “absorbed a vast inventory of words,idioms, constructions, ropes, and rhetorical tricks, and with them a sensitivity to how they mesh and how they clash.”
One example of an author who took this deliberate approach to learning the craft is Elizabeth Gilbert. In her book, Big Magic, she talks about how she studied from great teachers: “teachers that live on the shelves of your great library, that live on the walls of museums, that live in recordings made from decades ago”. She states that “No living writer has ever taught me more about plotting and characterization than Charles Dickens has taught me.” Although she didn’t study from Charles Dickens directly she did “spend years privately studying his novels like they were holy scripture, and then to practice like the devil on my own”.
Imitators
Another example of such an author who took a rigorous approach to learning the craft is Benjamin Franklin.
Benjamin Franklin
Benjamin Franklin would read articles, take voracious notes, and set them a side for a few days. When he returned to his notes, he attempted to rewrite the article, using his own words. Then, he’d compare his writing with that of the original and took stock of where his writing fell short. His vocabulary was weak, so he worked on expanding it. He had also noticed another shortcoming: his organization (or lack thereof). Tackling this head on, he would decompose some piece of writing that he admired into sections and copy each of them onto their own index cards. After mixing the cards a pile, he’d then attempt to rearrange them in the correct (original) order. That’s how he practiced organization skills. That’s amazing discipline.
Why don’t more of us take this same approach? Well, some do, like Stephen King.
Stephen King
In “On Writing”, Stephen King shares about how, when he was a child, he would read comic book after comic book after comic book, reading whatever he could get his hands on. Believing that imitation precedes creativity, King would “copy Combat Casey” comics word for word in (his) Blue Horse tablet, sometimes adding (his) own descriptions where they seemed appropriate.”
Hunter Thompson
One final example: Hunter Thompson. “He chose, rather than writing original copy, to re-type books like The Great Gatsby and a lot of Norman Mailer, the Naked and the Dead, a lot of Hemingway. He would sit down there on an old type-writer and type every word of those books and he said, “I just wanna feel what it feels like to write that well.”
Summary: Go and imitate
There are no short cuts. Clear out space on your cluttered desk. Make a neat stack of all the books that you want to write like. And come to terms that, writing is a life long journey of reading and writing, a never ending cycle of these two activities.
One silver lining of COVID-19 is that I’m working remotely from home and despite the constant interruptions, I’ve grown to appreciate situation. I’m afforded experiences not normally available to me when working physically in the office. Among which is seeing my daughter grow up, right before my eyes. Every day, I catch these fleeting moments, such as her lifting her chin up and staring softly and lovingly at her mom.
Yet, these beautiful moments strike fear in me.
I have not been able to shake that idea that that Elliott will forget about the dogs — Metric and Mushroom — once they pass away, memories of them vanishing too. Compared to us humans, dogs live a short life span, an unfair reality. And my dogs, in particular, have likely reached their half-life. So, every time the two dogs roll around on the floor with Elliott and every time Elliott puckers her lips and lays a wet one on their noses, I simultaneously feel both joy and pain. Joy for the current moment. Pain for the future.
I fear that Elliott’s memories of the dog will fade because I too forgot about my first dog. Apparently, I grew up with a German Shepherd, named Champ. Apparently, Champ was present in the first two years of my life— but I have zero recollection of him.
I do wonder, though, how much of Champ left an imprint on me. Did his presence early on in my life influence my “random” decision of choosing a German Shepherd breed for my first dog?
Perhaps.
Back to my Elliot. I painfully understand that she’ll only remember, if I’m lucky, fragments of her first two dogs. She’ll forget their unique smells. She’ll forget the countless number of times we pulled out dog hair from her mouth during lunch. She’ll forget all the times she woke up from a nap, screaming for them to join her in bed.
She’ll forget the first day she met the two dogs, the day we brought her home from the hospital, when both dogs dutifully slept by her crib, neither dog leaving her side, obediently guarding her. She’ll forget all the times she purposelessly threw scraps of food on the floor for them to lick off the ground.
But as her father, I’ll never forget. I’ll remember them, cherish them, and hold on to them, dearly.
And the best I can offer her, and myself, are capturing and collecting and sharing these memories.
So, here you go, Elliott. Here are a few snapshots of your childhood with the doggies.
I serendipitously stumbled on another Zettelkasten desktop application called Zettlr. Perusing the online forum over at Zettelkasten.de, I had noticed that at least three of four members repping the app in their signatures. Naturally, I was curious so I followed the scent on the trail and loaded up the Zettlr website in my browser.
After skimming through the description, I decided to test drive the application.
And so far, I am really loving the application. It’s beautiful. It’s use friendly. It sparks joy.
Sure, the application is still in an infancy and has a few rough edges: the application fails to open up external third party application links (e.g. DevonThink) and the support for markdown tables is clunky at best and sometimes the cursor lags behind when I’m typing at my top speed. However, none of these issues are deal breakers. And I’m certain that, overtime, the application’s performance will be improved.
Top features
Keyboard shortcuts. Want to generate a unique identifier for your note card? Type in “CTRL + L” and the app will spit out a timestamp that serves as a unique ID for other cards to reference. Just plain awesome. How about inserting a markdown hyperlink? Well, just select some text and then press “CTRL + K”, the text converted to a markdown based hyperlink. And these two shortcuts are just the tip of the iceberg.
Built-in statistics. Check out at a glance how many words you are writing daily.
Writing is on fire!
Built in emojiis. I didn’t anticipate that I would enjoy inserting emojiis into my documents. Of course, I don’t over do it and only sprinkle them sparingly. Regardless, they add a nice little touch, a spark of joy in the creative writing process.
Auto-generated table of contents. By marking down your content with appropriate headings, you get a beautiful table of contents located in the side bar (which renders the emojiis nicely too).
Zettlr: Emojii support and auto-generated table of contents
Wrapping up
Overall, I love the application so far (again: it’s only been about 3 days). I’m certain I’ll discover other blesmishes as I continue to use the application. Regardless, Zettlr allows me to enjoy creating content: I’m able to achieve a sense of flow, often losing myself in the process, thanks to both the aesthetically pleasing interface as well as the low cost of context switching between reading, editing, writing and searching.
I’m obsessed with personal information management (PIM) and as I learn more about the discipline, one concept continues to repeatedly crop up: Zettelkasten. I first learned about Zettelkasten after reading one of my favorite books “How to take smart notes”, and since then, I’m sold on the idea and continue to tweak my digital workflow and draw inspiration from the online Zettelkasten community at Zettelkasten.de. This online forum, like many other online communities, buries tons of gems hidden within the conversation threads.
At the time of this writing, the forum paginates across 43 pages, each page containing one or more forum posts, each post potentially containing nuggets of gold. But because I’m short on time, I really only want to read the top discussions. Unfortunately, there’s no easy or built in way to sort those posts so I wrote a little script that identifies the top posts by view count. Below are the top 5.
Top 5 Forum Posts
Below are the top 5 forum posts from Zettelkasten.de, sorted by views in descending order.
This section describes how I used a combination of bash and python to fetch the view counts on the forum. The actual (python) code for parsing the pages themselves can be found in my public github repository hosting my random one off scripts.
Fetch all the forum posts with curl
Save HTML to disk
Write a little python parser that extracts the view count
Output a comma separated value (CSV)
Use sort followed by with head
[code lang=”bash”]
% for page_num in $(seq 1 42);
do curl "https://forum.zettelkasten.de/discussions/p$page_num -O ;
done
[/code]
Generally speaking, there two ways people store their digital assets. Some file their digital assets— PDF documents, images, videos, bookmarks and so on — into neat, hierarchical structures. In the other camp are people who leverage tagging, assigning one or more key words to their files. When retrieving assets, these people tend to leverage their software’s search capabilities.
I’m somewhere in between.
And my digital organization is far from my perfect. I cannot begin to count the number of times when I think of some article that I read, go search (for hours) in my personal database, and come up empty handed. So frustrating.
Key Value Pairs as tags
To reduce the time it takes to retrieve my digital assets, I now tag them using key/value pairs. In practice, here’s what it looks like. I’ll stumble on some article — maybe from Hacker News — that I want to save. Instead of just mindlessly clicking the bookmark button, I’ll hit the brakes and pause for a moment, pondering about the appropriate key/value pair I should assign. I ask myself: under what context will I search for this (this question is different than how should I store the information).
Here’s a concrete example. Say I finished reading an article around C (the programming language) and want to save the web page. Instead of tagging the article with “C”, I’ll now do something like: programming_languages. Programming languages is the key, and the value is C.
This semester, I manage to pull off an A not only for the midterm and final exams, but for the class as a whole. My intention of revealing my grade is not to boast (that’s poor taste), but to give some credibility to the techniques and strategies below, techniques and strategies (rooted in pedagogy) for someone who is working full time, someone who is is growing as a (freshly minted) father and husband, someone who pursues a wide array of other interests outside of graduate school. That being said, receiving the highest letter grade is not my goal in the program (although I admit it once was). My goal is to learn as much as I can, absorb as much computer science, connect the dots between all the other classes, bridge the gap between theory and practice, and apply the knowledge to my job as a software engineer.
Exam logistics
Assumptions
This blog post assumes that you can openly collaborate with other students. During my term (Fall 2020), us students shared our answers using a two pronged approach: studying with one another over Zoom (see my post on War Rooms) and comparing answers in a shared Google Document. Crowd source at its finest.
Time Bound
You have up to 3 days to take exams. And before the exam window opens, the study guides (i.e. all the previous exams bundled up in a .zip file) are published. That’s about a week for you to prepare. And once the exam window opens, the professor and teacher assistants publish the actual exam. That’s right: they provide all the questions (even then, the exam is no walk in the park). In other words, you walk into the exam with no surprises, knowing exactly what questions to expect.
Put simply, instead of one massive, multi-hour study session, I break down the study sessions into a fistful of sessions, around five to ten, and spread the sessions across multiple days (i.e. “spaced repetition”), each session lasting anywhere between 10-20 minutes. During each study session, I test myself (i.e. “testing effect”) and try to answer questions just as I’m about to forget them (i.e. “forgetting curve”). With this approach, I optimize memory retention for both short and long term. This technique aligns with what Bacon stated back in 1620:
“If you read a piece of text through twenty times, you will not learn it by heart so easily as if you read it ten times while attempting to recite from time to time and consulting the text when your memory fails”.
Studying previous exams
Here’s how I study previous exams.
First, I create a blank page in Google Docs. Then, I select one of the previous exams (only one because of time constraints) and copy all of its questions into this blank document. Next, I attempt to answer each question on my own: no peeking at the solution guide! This is how I test myself.
My google doc sheet
After answering each question, I compare my guess — sometimes it is way off — with the answer printed in the answer sheet. If my answer is incorrect, I then copy the correct answer, word by word, below my original answer. The act of copying helps reinforces the right answer and positioning the two answers — mine and the correct one — next to each other helps me see the holes in my logic.
I apply this circular technique — copy question, answer question, compare the two, copy correct answer — for each question listed in the exam. Bear in mind that I apply this circular technique only once. Repetition will come in later when I study the actual final exam.
Studying final exam
Studying for the final exam approach closely resembles my circular technique (describe previously). The main difference is this: instead of only making a single pass through the questions, I make two passes. The first pass is the same (described above) circular technique of copying each questions and taking a stab at them. In the second pass, I review my answers against the collaborated google docs, where all the other students dump their answers.
Collaborated Google Doc study guide
Once my answer guide — not the collaborated Google Docs — is filled out with (hopefully) the right answers, I then the contents into my space repetition software: Anki. After copying, I simply rote memorize, drilling each questions into my head until I stop answering incorrectly, which normally takes about an hour in total, spread across 2 days.
Finally, after the spaced repetition sessions using Anki, with the contents of the exam sitting fresh in my working memory, I take the exam and simply brain dump my answers.
World class writers sit down and pour out beautiful prose in a single sitting, right? That’s the image I image I held in mind for many years and this belief is not only far from the truth but this belief crippled me as a writer. I would sit down to type and proceed to write at glacial speed, spending more time watching the cursor blink. But over many many years of reading about writers and reading about the craft of writing, I learned the truth: that the best of writers make multiple passes at their writing.
Recently, Neil Strauss shared his creative writing process in his weekly newsletter and he suggests breaking down the writing into three discrete passes. Each pass serves a different purpose. They differ in modes of thinking and vary in speed of execution.
Second pass – edit and keep your reader/audience in mind
Third pass – scrutinize your work
Get it all out … as quickly as possible
One of the most common mistakes is trying to write everything perfectly. As if each word was being etched in stone, or going straight to print.
During this first pass, you aim for banging out the writing — as fast as possible. Your goal is NOT perfection. Your goal is to brain dump and clear your working memory. You want to generate a mountain of writing that you can, in the subsequent phases, chisel and shape and smooth out. And don’t fear: you never show this writing to anyone (unless you want to, of course). This first draft is for your eyes, and your eyes only.
Think about your reader
This is where you start sculpting the clay of your book. You see the book not through your ego, which wanted to write the book, but through an ideal reader’s eyes.
Now that a heap of writing sits in front of you, what next? You shift your mode of thinking. In the previous pass, you were writing for yourself. But now, center your attention towards your audience. Try and view the writing from their perspective. Consider the clutter. Consider where you are losing their attention. Consider the reader and be prepared to toss out entire sentences — or even sections.
Welcome the haters
Note that hater-proofing isn’t just anticipating their arguments and defusing them ahead of time, but also checking to make sure your facts, research, and even spellings are correct. And your arguments are correct and unassailable.
Once you’ve consider your reader, you now put yourself in the position of your hater, your worst enemy. This is the time for you to really scrutinize your work, to find any chinks in your armor. This is the phase in which you get to play devil’s advocate. Basically, imagine stepping into the ring and boxing with a logical opponent, someone trying to poke holes in your writing, someone trying to expose you as a fraud. Anticipate the punches and tackle them head on.
Summary
Ultimately, the three phases creates some structure and within that structure lives creative freedom. And again, each phase serves a different purpose. At the beginning, you want to be your biggest cheerleader, rooting for yourself. Then, towards the end, you transition into your toughest critic.
We’ll address some questions like “how to program big data systems” and how to “store and disseminate content on the web in scalable manners”
Quiz: Giant Scale Services
Basically almost every service is backed by “Giant Scale” services
Tablet Introduction
This lesson covers three issues: system issues in giant scale services, programming models for applications working on big data and content distribution networks
Generic Service Model of Giant Scale Services
Generic Service Model of Giant Scale Services – Source: Udacity Advanced OS Course
Key Words: partial failures, state
A load manager sits between clients and the back end services and is responsible for hiding partial failures by observing state of the servers
Clusters as workhorses
Clusters as workhorses – Source: Udacity Advanced OS Course
Key Words: SMP, backplane, computational clusters
Treat each node in the cluster as the same, connecting the nodes via a high performance backplane. This strategy offers advantages, allowing easy horizontal scaling, making it easy for a systems administrator manage the load and system
Load Management Choices
Load Management Choices – Source: Udacity Advanced OS Course
Key Words: OSI, application layer
The higher the layer in which you construct the load manager, the more functionality you can have
Load management at the network level
Load Management at the network level – Source: Udacity Advanced OS Course
Key Words: DNS, semantics, partition
We can use DNS to load balancer traffic, but this approach does not hide server failures well. By moving up the stack, and performing balancing at the transport layer, we can balance traffic based off of service
DQ Principle
DQ Principle – Source: Udacity Advanced OS Course
Key Words: DF (full data set), corpus of data, harvest (D), yield
We’re getting a bit more formal here. Basically, there are two ratios: Q (yield) and D (harvest). Q’s formula is Qc (completed requests)/ Q0 (offered load). Ideally want this ratio to be 1, which means all client requests were serviced. For D (harvest), formula is Dv (available data) / DF (full data). Again, want this ratio to be 1 meaning all data available to service client request
DQ Principle (continued)
Key Words: IOPS, metrics, uptime, assumptions, MTTR, MTBF, corpus of data, DQ
DQ principle very powerful, helps architect the system. We can increase harvest (data), but keep the yield the same. Increase the yield, but keeping D constant. Also, we can track several metrics including uptime, which is a ration between MTBF (mean time between failures) and MTTR (mean time to repair). Ideally, this ratio is 1 (but probably improbable). Finally, these knobs that a systems administrator can tweak assumes that the system is network bound, not IO bound
Replication vs Partitioning
Replication vs Partioning – Source: Udacity Advanced OS Course
Key Words: replication, corpus of data, fidelity, strategy, saturation policy
DQ is independent of replication or partioning. And beyond a certain point, replication is preferred (from user’s perspective). During replication, harvest data is unaffected but yield decreases. Meaning, some users fail for some amount of time
Graceful Degradation
Graceful Degradation – Source: Udacity Advanced OS Course
Key Words: harvest, fidelity, saturation, DQ, cost based admission control, value based admission control, reduce data freshness
DQ provides an explicit strategy for handling saturation. The technique allows the systems administrator to tweak the fidelity, or the yield. Do we want to continue servicing all customers, with degraded performance … or do we want to, once DQ limit is reached, service existing clients with 100% fidelity
Online Evolution and Growth
Online evolution and growth – Source: Udacity Advanced OS Course
Key Words: diurmal server property
Two approaches for deploying software on large scale systems: fast and rolling. With fast deployment, services are upgraded off peak, all nodes down at once. Then there’s a rolling upgrade, in which the duration is longer than a fast deployment, but keeps the service available
Online evolution and growth (continued)
Online evolution and growth – Source: Udacity Advanced OS Course
Key Words: DQ, big flip, rolling, fast
With a big flip, half the nodes are down, the total DQ down by half for U units of time
Conclusion
DQ is a tool for system designers to optimize for yield or for harvest. Also helps designer deal with load saturation, failed, or upgrades are planned
Click here to download “Advanced OS refresher course – summary and study guide”
I compiled my various blog posts from the advanced operating systems refresher course and bundled them together into a nicely packed e-book. So, if you are about to enroll in Georgia Tech’s advanced operating system course (AOS) and want to step through the refresher material (without sitting through and watching the entire lecture series) or just get a sense of whether you can skip the refresher course all together, then definitely check out the e-book above.