All blogs / Software / engineering practice
Kevin Sookocheff
Kevin Sookocheff’s Personal Blog
Software / engineering practiceDevOps / SRE / infrastructureDistributed systems / cloudSecurity
- Posts
- 319 from 1 Jan 2001 to 17 Aug 2026
- Posting
- monthly (7 in the last year)
- Kind
- personal blog
- Feed
- https://sookocheff.com/index.xml
2026 6
2025 15
- Cryptography for the Everyday Developer: Understanding RSA
- Cryptography for the Everyday Developer: Number Theory for Public Key Cryptography
- Why Three Replicas Are Better Than Two
- Cryptography for the Everyday Developer: Double Encryption and the Meet in the Middle Attack
- Cryptography for the Everyday Developer: Understanding AES - The Advanced Encryption Standard
- Cryptography for the Everyday Developer: Understanding DES - The Data Encryption Standard
- Cryptography for the Everyday Developer: Confusion, Diffusion, and Substitution-Permutation Networks
- Using V2 CloudFront Logs via CloudFormation
- Fixing display flicker for Dell monitors on Apple Silicon
- Cryptography for the Everyday Developer: Measuring Security in Bits
- Cryptography for the Everyday Developer: Modular Arithmetic
- Cryptography for the Everyday Developer: Random Number Generators
- Cryptography for the Everyday Developer: Security Goals
- Cryptography for the Everyday Developer: Encryption Basics with Classical Ciphers
- Clustering a DSM Using Simulated Annealing
2024 6
2023 14
- Routing Users to a Login Page Based on Geolocation
- What is eBPF and Why is it Important?
- Disaster Recovery with DynamoDB Global Tables
- Supporting disaster recovery with a multi-region EKS deployment
- FSBench: A filesystem benchmarking utility
- Benchmarking AWS CSI Drivers
- Picking the right AWS CSI driver for your Kubernetes application
- Leveraging eBPF in the Kubernetes Networking Model
- Trust your users — they’re usually right
- Generating Large Test Files
- Generating JSON Web Token Assertions
- Tackling Technology Strategy with Portfolio Management
- Making Sense of Kubernetes Metrics
- Project Management for Software Engineers
2022 12
- Increased virtualization performance with the AWS Nitro System
- Using Neovim as a Java IDE
- Distributed System Models in the Real World
- Write-ahead logging and the ARIES crash recovery algorithm
- How to kill a process that is a using port on macOS
- Progress is a lake, not a line
- Why Systems Work So Well
- Java For The Experienced Beginner
- Behaviour Parameterization
- What complex systems can teach us about building software
- Hybrid Logical Clocks
- HybridTime
2021 13
- TrueTime
- Vector Clocks
- Lamport Clocks
- How Does NTP Work?
- Local Kubernetes Development with microk8s
- Why Foxes Make Better Decisions Than Hedgehogs
- Connecting Technology to the Needs of the Business
- The False Dichotomy of Design-First and Code-First API Development
- The Most Important Criteria for Choosing a Programming Language
- Augmenting Spring Data REST with Additional Endpoints
- Making Modular Monoliths Work
- Unpacking the eight fallacies of distributed computing
- Handling the rudder as an organization grows
2020 21
- The Cathedral, The Bazaar, and the API Marketplace
- Marrying RESTful HTTP with Asynchronous and Event-Driven Services
- Running a Dapr Application on Kubernetes
- Local Kubernetes Development with Tilt
- Local Kubernetes Development with kind
- There and Back Again: The Unexpected Journey of a Request
- Getting to know voltdb
- Understanding Spring's Environment Abstraction
- What is the OCaml toplevel?
- Building a Modern Java Web App with Spring Boot
- Inversion of Control, Dependency Injection, and the Spring IoC Container
- Starting a new OCaml project using Dune and Visual Studio Code
- A Tour Through OCaml with Project Euler
- Getting Started with opam, the OCaml Package Manager
- The OCaml Compiler Pipeline
- Above-the-line and below-the-line
- How Does DNS Work?
- Building Learning Communities
- Optimizing Processes Using a Design Structure Matrix
- Interdependence and Self-Reliance
- Improving Software Architecture Using a Design Structure Matrix
2019 20
- Using Little’s Law to Measure System Performance
- Why I’m not (too) worried about Python 2
- Riding the Architecture Elevator
- How Does WebRTC Work?
- How Does LTE Work?
- How Does WiFi Work?
- How Does Ethernet Work?
- Wireless Networks and Shannon’s Law
- Curate Don’t Dictate
- Tied to Machines Podcast — Architecture
- Principles of Architectural Leadership
- How Does UDP Work?
- Innovation with Constraints
- How Does TCP Work?
- How Do Websockets Work?
- The Zero Bug Policy
- How Does HTTP/2 Work?
- Vendor Management is a Core Competency
- Overambitious API gateways
- Putting the R in D
2018 24
- Fault-Tolerance and Data Consistency Using Distributed Sagas
- IaaS, PaaS, SaaS and Infrastructure
- Alpha Conversion
- Beta Reduction
- Building Stateful Services with Kubernetes
- Eta Reduction
- Testing in Production — Building Observable Distributed Systems
- Normal, Applicative and Lazy Evaluation
- Representing Pairs and Lists in Lambda Calculus
- Typed Lambda Calculus
- A Guide to the Kubernetes Networking Model
- Infrastructure in an Age of Commodities
- Recursive Lambda Functions the Y-Combinator
- Simplifying Lambda Syntax
- Introducing Lambda Calculus
- A Principled Approach to Architecture
- Range, Domain, and Codomain
- Functional Microservices
- A Functional Programming Learning Plan
- Practical Differences Between Functional and Imperative Programming
- Why Functional Programming? The Benefits of Referential Transparency
- Overcoming Optimism with a Premortem
- What is Functional Programming?
- Cloze Deletions
2017 34
- Improving Test Coverage Using Exploratory Outcomes
- Bulk Generating Cloze Deletions for Learning a Language with Anki
- Building Empathic Software Using Specification by Example
- How Fast Does it Need to be Anyways? The QUPER Model of Analyzing Non-Functional Requirements
- What is CQRS?
- Dissecting SQS FIFO Queues — Does Ordered and Exactly Once Messaging Really Exist?
- Learning a Language with Amazon Polly and a Serverless Chalice App
- Evolving Messaging For Microservices: A Retrospective from Building Workiva’s Messaging Platform
- How to create a functional VPC using CloudFormation
- Compiling private Java code from Leiningen
- Uploading Large Payloads through API Gateway
- Getting Started With TLA+
- Basic Math for TLA+
- First Musings on TLA+
- Paper Review: WebTables: Exploring the Power of Tables on the Web
- Paper Review: Combining Systems and Databases: A Search Engine Retrospective
- Publish-Subscribe Messaging Using Amazon SQS
- Paper Review: The Anatomy of a Large-Scale Hypertextual Web Search Engine
- Paper Review: Consistency Analysis in Bloom: a CALM and Collected Approach
- SQS or Kinesis? Comparing Apples to Oranges
- Software Architecture as Business Analysis
- Paper Review: The CQL continuous query language: semantic foundations and query execution
- Paper Review: BlinkDB: Queries with Bounded Errors and Bounded Response Times on Very Large Data
- Paper Review: Informix under CONTROL: Online Query Processing
- How Much is That Going to Cost Anyway? Calculating Cost of Goods Sold
- Paper Review: An Array-Based Algorithm for Simultaneous Multidimensional Aggregates
- Italics in Vim
- Comparing Swagger with Thrift or gRPC
- Being Good Enough
- Yet Another S3 Static Site
- Packaging a Custom Boomi Connector
- Creating a Custom Dell Boomi Connector
- Paper Review: Implementing Data Cubes Efficiently
- Getting Started With Dell Boomi
2016 53
- Optimistic Locking in a REST API
- Checking for null in an API Gateway transform
- Effective Cache Control
- Configuring REST-assured for Amazon API Gateway
- Paper Review: Robust Query Processing through Progressive Optimization
- Creating a Service Oriented Organization
- Understanding API Gateway Payload Mappings
- Securing a Swagger API with OAuth2
- How to deploy a Swagger specification to Amazon API Gateway using CloudFormation
- Designing a Swagger API
- What is OSGi? Microservices for the JVM
- Paper Review: The Volcano Optimizer Generator: Extensibility and Efficient Search
- Paper Review: Dynamo: Amazon’s Highly Available Key-value Store
- 0 to Message in 60 Seconds: Getting Started with Amazon SQS
- Paper Review: Cap Twelve Years Later: How the “Rules” Have Changed
- Integrating Applications: From RPC to Messaging
- Integrating Applications
- Tests are Never Enough
- The Problem with Point to Point Communication
- A Guided Tour Through Thrift
- Stability Anti-Patterns
- Metrics-Driven Development
- Testing a Producer-Consumer Design using a CyclicBarrier
- Paper Review: Generalized Isolation Level Definitions
- So you want to send a message using Apache Thrift?
- Paper Review: DryadLINQ: A System for General-Purpose Distributed Data-Parallel Computing Using a High-Level Language
- Paper Review: MapReduce: Simplified Data Processing on Large Clusters
- Paper Review: OLTP Through the Looking Glass, and What We Found There
- Getting Started with Amazon Flow Framework
- Paper Review: Hekaton: SQL Server’s Memory-Optimized OLTP Engine
- Paper Review: C-Store: A column-oriented DBMS
- Concurrency: A Primer
- Server-to-server OAuth with the Google OAuth Client Library for Java
- Paper Review: Transaction Management in the R Distributed Database Management System
- Paper Review: Concurrency Control Performance Modeling: Alternatives and Implications
- Paper Review: Granularity of Locks and Degrees of Consistency in a Shared Data Base
- Paper Review: ARIES: a transaction recovery method supporting fine-granularity locking and partial rollbacks using write-ahead logging
- Deploying a static website with rsync
- Thoughts On Google Cloud Platform Next
- Paper Review: Access Path Selection in a Relational Database Management System
- Paper Review: Eddies: Continuously Adaptive Query Processing
- Paper Review: The Gamma Database Machine Project
- Local Development with the Kinesis Client Library
- Paper Review: The Design of POSTGRES
- Paper Review: System R: Relational Approach to Database Management
- The Five Stages of NoSQL
- Paper Review: Architecture of a Database System
- Generating Java with JCodeModel
- Writing an Apache Beam Batch Sink
- Deploying a Druid Cluster with Ansible
- Paper Review: What Goes Around Comes Around
- Deploying Zookeeper with Exhibitor to AWS using Ansible
- Getting to Know Cloud Dataflow
2015 35
- Docker Step By Step: Containerizing Zookeeper
- Why Java? Tales from a Python Convert
- Including a local package as a Maven dependency
- Configuring an Upstream Remote
- Writing Repeated BigQuery records using the Java Client Library
- From JSON to a Google API Client Library object
- A Maven runner for vim-test
- Deploying Kafka to Google Compute Engine
- Kafka Quick Start Guide
- Kafka in a Nutshell
- Beginning Docker
- A Review of the Coursera Data Science Specialization
- Counting N-Grams with Cloud Dataflow
- N-gram Modeling With Markov Chains
- Modeling Natural Language with N-Gram Models
- Structuring an Application using Model View Controller
- Managed VMs and the Future of App Engine
- Introducing CloudPyPI
- App Engine Pipelines API - Part 6: The Pipeline UI
- App Engine Pipelines API - Part 5: Asynchronous Pipelines
- App Engine Pipelines API - Part 4: Pipeline Internals
- App Engine Pipelines API - Part 3: Fan In, Fan Out, Sequencing
- App Engine Pipelines API - Part 2: Connecting Pipelines
- App Engine Pipelines API - Part 1: The Basics
- Durabledict for App Engine
- Continuous Delivery Distilled
- Creating a BigQuery Table using the Java Client Library
- Deploying R Studio on Compute Engine
- Keeping App Engine Search Documents and Datastore Entities In Sync
- Halting Python unittest Execution on First Error
- Create a Google Cloud Dataflow Project with Gradle
- A pypiserver Deployment Script
- Downloading files from Google Cloud Storage with webapp2
- Querying App Engine Logs with Elasticsearch
- Parsing bash script options with getopts
2014 36
- Managing App Engine Dependencies Using pip
- App Engine MapReduce API - Part 7: Writing a Custom Output Writer
- The Bash String Operators
- App Engine MapReduce API - Part 6: Writing a Custom Input Reader
- Installing MySQL-Python on OS X Yosemite
- Automatically Resizing a Compute Engine Disk
- A Guided Tour of Google Compute Engine
- Extracting the Start Sector of a Disk with fdisk
- Packaging a Compute Engine Virtual Machine Image
- Using the Google Prediction API to Predict the Sentiment of a Tweet
- Suggested Searches with Google App Engine
- Composing Asynchronous Functions With Tasklets
- Working From Home: A Retrospective
- Converting an ndb model to a BigQuery schema
- Restoring an App Engine backup into a Big Query table
- Bypassing ndb hooks with the RawDatastoreInputReader
- Generating a C# client for an App Engine Cloud Endpoints API
- Using Basic Authentication with Google Cloud Endpoints
- Unit Testing Cloud Endpoints
- Creating RESTful APIs with App Engine Cloud Endpoints
- Running Multiple App Engine Modules Locally with dev_appserver.py
- Downloading directories of code from Github using the Github API
- How to bypass the auto_now property option during an ndb put
- App Engine MapReduce API - Part 5: Using Combiners to Reduce Data Throughput
- App Engine MapReduce API - Part 4: Combining Sequential MapReduce Jobs
- Installing lxml on OS X Mavericks
- App Engine MapReduce API - Part 3: Programmatic MapReduce using Pipelines
- App Engine MapReduce API - Part 2: Running a MapReduce Job Using mapreduce.yaml
- App Engine MapReduce API - Part 1: The Basics
- Understanding JSON Patch
- How to Version a REST API
- When to Use HTTP PUT and HTTP POST
- Stripe checkout opening in a new tab
- How REST Constraints Affect API Design
- On choosing a hypermedia type for your API - HAL, JSON-LD, Collection+JSON, SIREN, Oh My!
- Three questions that define an ideal customer
2013 7
- How to get accepted to a business plan competition
- Install node.js packages via npm with a Chef Cookbook
- Photos is the Killer Feature of Google+
- Apple has a Software Problem - Why I'll be Switching to Android
- Creating a new file or directory in Vim using NERDTree
- Submitting a Unity3d Game to the Mac App Store
- Copying from Vim to the OS X Mountain Lion clipboard
2012 2
2011 13
- Saving canvas data to an image file with JavaScript and PHP
- Using Leiningen behind a Windows proxy
- Date.now() in IE6
- The JavaScript click event and hidden input elements
- Dissecting jQuery's Fade Animation
- An Argument Against JavaScript Minification
- How to Display HTML5 Notifications
- Constants in JavaScript
- Understanding Closures in JavaScript
- Safely remove the header from the WordPress TwentyTen theme
- The future of mobile development
- A cheap home server
- And the winner is - Google Chrome!
2010 7
- How to install the real-time kernel in Ubuntu
- How to get Pulse Audio to recognize your Delta 44 (and other ICE1712 cards)
- Readability by Arc90
- Share multiple mt-daap libraries
- Mounting SAMBA shares from the command line
- How to forward root users mail to an external address
- How to monitor a RAID array in Ubuntu server