Exercises in Programming Style–Monolith

Yan Cui

I help clients go faster for less using serverless technologies.

This article is brought to you by

Hookdeck: The Serverless Event Gateway

Hookdeck is a reliable and scalable serverless event gateway for sending, receiving, authenticating, transforming, filtering, and routing events between services in your event-driven architecture.

Learn more

NOTE : read the rest of the series, or check out the source code.

If you enjoy read­ing these exer­cises then please buy Crista’s book to sup­port her work.


Fol­low­ing on from the last post, we will look at the Monolith style today.


Style 3 – Monolith

As the name suggests, this style is typified by the use of one big blob of code that contains all our application logic!


  • No named abstractions (i.e. no methods/functions)
  • No, or little, use of libraries


The first constraint meant that we can’t break up the logic into smaller functions, hence why everything is inside one big for loop.

I took the second constraint to mean that we should limit the number of namespaces we open (as is the case in Crista’s version). Which means a Dictionary is out of the question. I could still use a Map but that feels too much of a cheat so I decided to stick with an array of string * int tuple to keep track of the word frequencies.


First we need to load the list of stop words:


Then we read the text line by line and process it in one giant for loop…


One caveat I ran into whilst working on this, is with the behaviour of File.ReadAllLines. It removes the line ending character for each line, which means whilst looking for words in a line we have two cases:

  1. words in the middle of a line, e.g. “I spoke to Elizabeth today…”
  2. words at the end of a line, e.g. “…turned around to Elizabeth

so to make the logic consistent, and remove the special case (case 2) I decide to just add the newline character at the end of the string we need to process.


Other than the above caveat, this code is pretty simple. I decided to deviate from Crista’s implementation in another place – her solution reorders the word_freqs array whenever an existing word count is updated. But I figure it’s likely more efficient to just do it once after the main loop.



sidebar: I have used higher-order functions in a few places, which I’m not sure if they constitute as cheating. However, I don’t consider them violations to the constraints we have set ourselves for this particular exercise.



Code written in this style is generally hard to follow as you need to keep the entire application logic (i.e. the big for loop) in your head whilst trying to understand its behaviour, and we know our brains are not great at holding many items in the active memory (the famous 7 +/- 2 rule).


One thing to note is that, whilst this style was commonplace with low-level languages (and goto was popular back then too), it’s possible to program in this style with high-level languages too (as we’ve done with F# here).

I also find Node.js style callbacks tend to lend themselves to this style of coding too.


You can find all the source code for this exer­cise here.

Whenever you’re ready, here are 4 ways I can help you:

  1. Production-Ready Serverless: Join 20+ AWS Heroes & Community Builders and 1000+ other students in levelling up your serverless game. This is your one-stop shop for quickly levelling up your serverless skills.
  2. Do you want to know how to test serverless architectures with a fast dev & test loop? Check out my latest course, Testing Serverless Architectures and learn the smart way to test serverless.
  3. I help clients launch product ideas, improve their development processes and upskill their teams. If you’d like to work together, then let’s get in touch.
  4. Join my community on Discord, ask questions, and join the discussion on all things AWS and Serverless.

1 thought on “Exercises in Programming Style–Monolith”

  1. Pingback: Exercises in Programming Style–Cookbook | theburningmonk.com

Leave a Comment

Your email address will not be published. Required fields are marked *