offlinemark
I'm Mark. This is my blog where I share thoughts on life, art, and computers.
OS / kernelEssays / personalC++Engineering management / careers
- Posts
- 187 from 11 Oct 2013 to 28 Oct 2026
- Posting
- monthly (18 in the last year)
- Kind
- personal blog
- Feed
- https://offlinemark.com/feed/
2026 15
- My advice for aspiring software developers
- My OSdev Roadmap
- How learning compounds
- libc++ is surprisingly hard to use for my kernel
- Libraries for freestanding C++
- What I learned from yoga
- How to sharpen the saw
- Devtools update 2026: Ghostty, just, flash.nvim, and more
- How to ask for feedback at work
- What to know about GPLv2 vs GPLv3
- How to be a more effective professional engineer
- Are you practicing, or just maintaining?
- WIP: Integers, safe arithmetic, and handling overflow (lab notes)
- osdev journal: The virtual memory unit test experiment
- Review & tips for Chaos Communications Congress
2025 16
- 75 lessons on life, art, and making things happen
- How to level up your life
- Exploit your unfair advantages
- osdev journal: bootloaders and booting (grub, multiboot, limine, BIOS, EFI)
- osdev journal: Gotchas with cc-runtime/libgcc
- Idea pools: A simple AI metaphor (WIP)
- Tips for networking
- VIM tips + lab notes
- Diminishing returns of worrying
- How to be consistent and achieve success
- Tips for going to conferences alone
- How to do custom commands/targets in CMake
- Pure GNU Make is (unfortunately) not enough
- Show and tell: Suicide C Compiler
- You are the first advocate for your art
- What you’re doing vs. What you should be doing
2024 36
- How to build traction for your creative endeavor
- 7 steps towards learning something
- Find your own bugs
- Why I use 5 different git clients
- Toxic minimalism
- It’s worth writing, even if someone else covered the topic already
- Learning kernel development on hard mode
- Don’t be afraid to reinvent yourself
- Removing dates from post URLs
- Release it and move on to the next
- x86 kernel development lab notes
- You don’t even need to be successful
- Writing is like exercise
- 6 months of live-streaming
- WIP: Humans need variety
- How I live-stream programming
- WIP: We grow old because we stop making art
- To have good ideas, stop auto-rejecting your ideas
- Creative pitfall: You don’t need to innovate in every area
- It’s not enough to have good ideas
- How to learn everything
- You need your own workshop
- Getting into reading again by playing offense
- I like WordPress
- Be your most authentic self (and write about whatever you want)
- WIP: Fame is a hamster wheel
- 3 weeks of GTD
- What I learned in my 20s
- gardenOS Update 2: 12 weeks of streaming
- Advice for learning the dark arts
- What is mastery?
- gardenOS Update 1
- The astonishing cost/benefit asymmetry of a four-day work week
- Resources for learning systems programming
- Turtles all the way down
- Tip: When you’re learning a new programming language, look up prominent open source projects and copy their style
2023 67
- Even if people already know the plot, they appreciate the way you tell the story
- Accept the constraint and deal with the consequences
- Creative potential energy
- Unpublished content is like cash under your mattress
- Learn to build your own tools
- Life is a business; life is a game; life is art
- Art/Artist Fit
- Personal projects are like free weights
- Creativity is like gardening
- A lot of my friends have been sucked up into UFOs lately
- The difference between computer science and computer engineering
- Memory is an abstraction
- Sometimes, you just need to be willing
- Reflections on learning to write
- Learning on your own pales compared to spending time with experts
- Back to basics: FIFOs (Named Pipes) and simple IPC logging
- Why you feel stupider than ever, despite being smarter than ever
- WIP: Asking for help in the age of AI
- Everyone’s career sounds more impressive than yours
- Dimensions of life happiness
- Dimensions of job happiness
- Software engineers must learn to write
- How I create so much content
- I started a podcast
- Resolving git conflicts perfectly every time (using diff3)
- WIP: What’s the deal with memory ordering? (seq_cst, acquire, release, etc)
- KPTI: The virtual memory 101 fact that’s no longer true
- You don’t need to load code into RAM to execute it
- SerenityOS Day 1: Debugging the piano app
- Do you need to learn how to implement a red-black tree?
- 4 basic multithreading & lockfree programming exercises
- Mutexes, atomics, lockfree programming
- How the hardware/software interface works
- How to be happy
- It will never be easier than right now
- TIL: Debugging microcontrollers may require hardware breakpoints
- WIP: Business models can have significant technical impact
- TIL: ARM64 doesn’t include conditional instructions
- What cured my writer’s/publisher’s block
- How to not feel dumb around “smart” programmers
- Distance between application programming and standard library programming
- “What could go wrong” considered harmful
- Core devs are not necessarily product experts
- WIP: Reflections on audience building
- Goal: Become a pro systems programmer
- Runtime polymorphism cheat sheet
- Smartphone anxiety
- AI Predictions
- The nice part about working for big companies
- Pitfalls with fork() in real-time contexts
- Why we get busier as we get older
- Experiment: Categories for my posts
- Task queues, Redis, Python, Celery, RQ
- 3 years of Timestamps
- Syscall ABI compatibility: Linux vs Windows/macOS
- Tip: Have two checkouts of the repo
- WIP: “Interesting” is in the eye of the beholder
- Why do computers reboot multiple times during an update?
- What’s with the name?
- How to enable colored compiler output with CMake + VSCode
- WIP: Should everyone be a leader?
- Save all the code you write
- Pick an impressive project, then checkout to the first commit
- Why I enjoy hanging out with entrepreneurs
- Why I write in public
- A takeaway I often get from exploit writeups
- Can we have non-atomic std::shared_ptr in C++?
2022 4
2021 11
- My audio development journey
- “Menu reference” shaped solutions
- I get asked why I’m into C++ and not Rust.
- git diff can natively detect code movement
- Linux Internals: How /proc/self/mem writes to unwritable memory
- The tradeoffs in using -Weverything
- Surgical formatting with git-clang-format
- What you should know before taking your gap year (and lessons from mine)
- How to pick a market that will make you money
- Open source licensing for supervillains
- An actionable framework for yearly goal planning
2020 26
- Evergreen tweets
- How to set up a business email for free
- Tips for reading the Linux kernel
- Tips for effective technical presentations
- How to manage your time like a millionaire
- Double fetches, scheduling algorithms, and onion rings
- Taking a gap year and working at a fast food restaurant
- What they don’t tell you about demand paging in school
- Tips for submitting your first Linux kernel patch
- How to set up a minimal Linux kernel dev environment on Ubuntu 20.04
- The “Early Stage Founder” Card
- Admitting defeat
- 3 Key Habits I Used to Learn Chinese
- The downside of a novel product
- Don’t sleep on Google Sheets for backend infra!
- Realizing that you are the end of line
- Don’t confuse std::move and std::forward
- Getting bit by unique_ptr
- You can use /proc/*/mem to bypass memory protections
- Read bits are not enforced for memory mappings
- macOS has a native memory leak checker
- How to set up an ARM64 playground on Ubuntu 18.04
- 3 Life Skills I Learned From Indie Hackers
- Advice for finding mentorship
- People hate surveys, but like being interviewed
- Taking responsibility for lost sales