{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Ben Shi",
  "home_page_url": "https://hbish.com/",
  "feed_url": "https://hbish.com/feed.json",
  "description": "Ben Shi is an engineering leader and pragmatic thinker writing about product, engineering, and learning at hbish.com",
  "language": "en-US",
  "authors": [
    {
      "name": "Ben Shi",
      "url": "https://hbish.com/",
      "avatar": "https://hbish.com/android-chrome-192x192.png"
    }
  ],
  "items": [
    {
      "id": "https://hbish.com/ai-makes-deep-expertise-more-valuable/",
      "url": "https://hbish.com/ai-makes-deep-expertise-more-valuable/",
      "title": "AI Makes Deep Expertise More Valuable",
      "content_html": "<p><img src=\"/media/ai-makes-deep-expertise-more-valuable.png\" alt=\"AI magnifying code and complexity\"></p>\n<p>An LLM can write a rate limiter in seconds. That is not the same as deciding how rate limiting\nshould work.</p>\n<p>Should the limit apply per user, account, token, or IP address? Is a short burst acceptable? What\nhappens when Redis is unavailable? Which endpoints need different limits, and what will customer\nsupport need to see when legitimate traffic gets blocked?</p>\n<p>The model can give sensible answers to all of these questions. It can also give answers that sound\nsensible but are wrong for the system. Unless those decisions already exist in the codebase or in\nsomeone&#39;s head, the model is filling in the gaps with guesses.</p>\n<p>Someone still has to judge those guesses. That is the bottleneck.</p>\n<p>When I know a codebase well, working with an LLM feels precise. I can describe a change in the\nabstractions the system already uses. I know when it has quietly introduced a second convention, or\nwhen a function it wrote is more complicated than the one already doing the job. A correction like\n&quot;<em>we already solve this elsewhere</em>&quot; lands because I know where the work should end up and what\nbelongs there.</p>\n<p>The model looks just as competent when I move into a domain I do not understand. That is the\ndangerous bit. It still produces tidy code, confident explanations, and tests that appear thorough.\nMy review gets vague, because I can no longer tell an unfamiliar-but-correct approach from one that\nis simply wrong.</p>\n<p>Asking for another explanation does not solve this. It gives me another version of the model&#39;s\nreasoning, but it does not give me the knowledge needed to verify it. I can keep prompting until I\nget an answer I like without getting any closer to an answer that is true.</p>\n<p>Code slop often starts here. The code compiles, the tests pass, and nobody involved can explain why\nthe solution belongs in this particular system.</p>\n<p>The model is still the bottleneck sometimes. It forgets context I gave it a few turns ago, invents\nan API that does not exist, or follows the wrong branch of an argument and keeps going. But once its\noutput is plausible enough to pass a casual review, generating more of it is easy. Deciding whether\nany of it should ship still takes someone who understands the system.</p>\n<p>With that knowledge, the questions I ask change. &quot;<em>Add rate limiting</em>&quot; becomes a conversation about\nwho might be abusing the endpoint, what breaks if the limiter fails, and what support needs to see.\nThe implementation can still come from the model, but those constraints come from understanding the\nproblem.</p>\n<p>I am not convinced that better models will make expertise less important. Stronger models handle\nmore of the mechanical work, which leaves more of the real decisions to whoever is steering them.\nThe faster the model types, the more the work shifts to deciding what should actually be built.</p>\n<p>The model can generate ten solutions before I properly understand one. If I cannot tell which of\nthem are any good, faster output just gives me a larger pile to sort through.</p>\n",
      "content_text": "LLMs can produce plausible answers quickly. The harder part is knowing which problem matters and whether the answer fits the system you actually have.",
      "summary": "LLMs can produce plausible answers quickly. The harder part is knowing which problem matters and whether the answer fits the system you actually have.",
      "date_published": "2026-08-04T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "ai",
        "coding",
        "system-design"
      ]
    },
    {
      "id": "https://hbish.com/on-being-almost-there/",
      "url": "https://hbish.com/on-being-almost-there/",
      "title": "On being almost there",
      "content_html": "<p><img src=\"/media/on-being-almost-there.jpeg\" alt=\"On being almost there\"></p>\n<p>There is a specific kind of trance that sets in when you are working with coding agents.</p>\n<p>It starts with a prompt. You hit enter, and the cursor begins to blink. Then, the text starts to\nflow. It’s a waterfall of code, logic, and structure, appearing faster than you could ever type it.\nIt feels like magic. It feels like the future.</p>\n<p>And then, it stops. You run the code. It crashes. Or worse, it runs, but the button is on the wrong\nside of the screen, or the logic handles the happy path but ignores the edge cases. The AI looks up\nat you with an optimistic look, proud of the 300 lines of code it just vomited out.</p>\n<p>It is &quot;<em>almost there</em>&quot;.</p>\n<p>This phrase - <em>almost there</em> - has become the defining slogan of this new way of building. While the\ncritics will point to the flaws as a reason to dismiss the technology, I find myself addicted to the\nimperfection.</p>\n<p><strong>The Seduction of the Near Miss</strong></p>\n<p>Why is this so fascinating? If the AI were perfect, it would be boring. If I asked for a web\nscraper, and it gave me a flawless, production-ready script in a few seconds, my role would be\nreduced to that of a middle manager. Over time, a feeling of disconnect would set in.</p>\n<p>On the flip side, if the AI were terrible, I would simply turn it off and write the code myself.</p>\n<p>AI agents live in the uncanny valley of competence. It gets the structure right. It knows the\nlibraries. It understands the intent. It just misses the execution by that final, crucial 5%. It\nwrites a beautiful function but calls the wrong API endpoint. It designs a stunning UI but uses a\nfont that doesn&#39;t exist.</p>\n<p>This &quot;<em>near miss</em>&quot; is psychologically potent. In game design and psychology, the &quot;<em>near miss</em>&quot;\neffect is known to be highly addictive. When a slot machine almost hits the jackpot, dopamine floods\nthe brain almost as much as a win does. It encourages the player to try again.</p>\n<p>With AI agents, we are seeing the intellectual equivalent of the near miss. It builds the house but\nforgets the doorknobs. It’s so close to right that the gap becomes a challenge. It taunts you,\n“<em>You’re so close. Just fix this one thing. Just one prompt</em>.”</p>\n<p><strong>The Over-Confident Junior</strong></p>\n<p>Working with coding agents feels like managing a brilliant but incredibly overconfident junior\ndeveloper. It has read every textbook in the world but has never actually shipped or debugged a\nproduction server at 2:00 AM.</p>\n<p>When it fails, it fails spectacularly. It hallucinates libraries that don’t exist. It invents\nfunctions that should exist but don&#39;t. The interesting part is that it’s believable most of the\ntime. But here lies the beauty: the errors are rarely fatal. They are usually fixable if you caught\non early enough.</p>\n<p>In the old days of coding, a syntax error was a stop sign. You had to stop, read, parse, and\ncorrect. Now, the errors are fluid. You highlight the broken function, type &quot;<em>fix this</em>&quot;, and watch\nas the agent rewrites its own logic. It is a collaborative dance. It builds the rough draft, I\nrefine the details. It lays the bricks, I point out the wall is crooked, and it instantly rebuilds\nit.</p>\n<p>This fast feedback loop is the addictive part of building in 2026. It removes the drudgery of the\nblank page but leaves the satisfaction of the fix.</p>\n<p><strong>Imperfection as a Feature</strong></p>\n<p>We often talk about AI as a tool for efficiency, but I’ve found it to be a tool for exploration.</p>\n<p>Because the AI is imperfect, I have to understand what it is doing. I can’t just blindly copy-paste\n(though many try). I have to be the architect. I have to verify its work. This forces me to engage\nwith the code on a meta-level.</p>\n<p>I am no longer writing code line-by-line; I am reviewing pull requests from a machine.</p>\n<p>The beauty of this workflow is that it lowers the barrier to creation while raising the value of\ntaste. The AI provides the raw material – often flawed, often messy – but the human provides the\ndirection and the context. The &quot;<em>almost there</em>&quot; nature of the output turns the act of building into\na game of sculpture. Slowly chipping away at a block of imperfect marble.</p>\n<p><strong>The Joy of the Almost</strong></p>\n<p>We are entering an age where &quot;<em>done</em>&quot; is a moving target. The fascination with generative AI isn&#39;t\nthat it solves our problems perfectly. It’s that it solves 90% of the problem in 1% of the time,\nleaving us with a puzzle to solve.</p>\n<p>That puzzle is the addictive part.</p>\n<p>Being &quot;<em>almost there</em>&quot; is more exciting than being finished. It is the state of potential. It is the\nfeeling that with just one more prompt, one more tweak, one more adjustment, the chaos will snap\ninto order.</p>\n<p>So, I embrace the bugs. I embrace the hallucinated libraries and the slightly-off colour palettes.\nBecause in that gap between what the agent made and what I want it to be, I find the joy of\nbuilding. I am almost there. And that is a wonderful place to be.</p>\n",
      "content_text": "The seduction of near misses with AI coding agents. Why 'almost there' is more exciting than finished, and the addictive nature of imperfect AI assistance.",
      "summary": "The seduction of near misses with AI coding agents. Why 'almost there' is more exciting than finished, and the addictive nature of imperfect AI assistance.",
      "date_published": "2026-02-28T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "ai",
        "coding",
        "productivity",
        "technology"
      ]
    },
    {
      "id": "https://hbish.com/workman/",
      "url": "https://hbish.com/workman/",
      "title": "Workman",
      "content_html": "<p>For the past few years I have been using an alternate keyboard layout as my daily driver. The\njourney to this stage have not been easy but after around 20+ hours of deliberate practice over the\nspace of 2 months I was able to touch-type comfortably. This post will talk through my experience\nlearning the Workman layout, how it eventually replaced QWERTY and an honest opinion on if its a\nworthwhile change.</p>\n<h3>What is Workman?</h3>\n<p><a href=\"https://workmanlayout.org/\">Workman</a> is an alternative keyboard layout designed by OJ Bucao that\nfocuses on comfort and ergonomics by maximising the usage of keys on the home row and at the same\ntime aimed at reducing lateral movement of fingers and wrists. It comes with some other benefits\nlike low finger travel, balanced left/right hand usage and maximise same hand utilisation.</p>\n<p><img src=\"/media/workman.png\" alt=\"Workman keyboard Layout\"></p>\n<p>My first real exposure to alternate keyboard format was around 10 years ago where I tried Dvorak,\nbut at the time I really never got the appeal of alternate keyboard layouts and very quickly gave up\nafter 30 minutes. I came across Workman in 2018, at the time I didn&#39;t give it too much attention\ngiven how my previous experience with alternate layouts have been. Workman layout showed up again in\n2020 on <a href=\"https://news.ycombinator.com/item?id=23400058\">Hacker News</a> and reading thorough some\ncomments I noticed a lot of people recommended alternative keyboard layouts to assist with fatigue\nand wrist pain (something which has been nagging me recently, and I didn&#39;t want to let it develop to\na full on RSI - Repetitive Strain Disorder). With ample time on my hand during the COVID lockdown I\ndecided to bite the bullet and learn Workman.</p>\n<h3>So how did you go?</h3>\n<p>So lets start off by saying I am by no mean slow on QWERTY, I average around 95 wpm (words per\nminute) and max out around 110 wpm for short bursts and this is from years and years of typing,\ngaming and programming on it. So my confidence in attaining the same typing speed on Workman is\nrather low from the get go.</p>\n<p>After around 24 hours of deliberate practice, I managed to achieve 60 wpm with a top speed of 75\nwpm. It&#39;s important to note I didn&#39;t completely switch over initially so I went back and forth\nbetween Workman and Qwerty until I reached around 40 wpm, this is so that I don&#39;t negatively affect\nmy productivity. This probably contributed to my slow progress overall. I have read and seem other\npeople pick up Workman in a much shorter timeframe than I have.</p>\n<p>Another thing to note here is that once I was proficient in typing in workman, learning to program\non it is a different challenge, shortcuts, macros and keybindings all needed too be either remapped\nor relearnt.</p>\n<p><img src=\"/media/workman-1.png\" alt=\"Workman Learning Result\"></p>\n<h3>Why put your self through it?</h3>\n<p>This started off more of a fun experiment and challenge for myself to learn a keyboard layout, it\nhas been on my todo list for some time. I also saw this as an opportunity to be disciplined about\nlearning something new and build a habit. I set my self a goal of practicing at least 30 minutes a\nday and initially to build a streak a month. As they say it takes a least 21 days to build a habit.</p>\n<h3>How did I go about learning it</h3>\n<p>The best resource for trying and learning new layouts is <a href=\"https://www.keybr.com/\">keybr.com</a> by far.\nIts good because the lessons goes through every character individually, it only unlock the next\ncharacter if the previous typing speed target is met. My configuration below.</p>\n<p><img src=\"/media/workman-2.png\" alt=\"keybr configuration\"></p>\n<p>The way I went about it is to set it up is to target 20 wpm per character before unlocking the next,\nthen I switched this up to 35 wpm, followed by 50 wpm. It’s important to note here, learning\nregression is a thing! Everytime a new key is unlocked, a previously learned key will regress due to\nmuscle memory!</p>\n<p>Once I hit about 50 wpm across all the characters, I start shifting over to another website called\n<a href=\"https://monkeytype.com/\">monkeytype</a>. This is where I spend about 15 minutes a day doing speed\ndrills. MonkeyType doesn’t have lessons but rather it keeps track of your tests by timing how\nquickly you can type in a set amount of time. I alternate between 30 and 120 second tests. I was\nable to go from 50 wpm to 75 wpm by doing speed drills, every now and then I still go back to keybr\nto do a few lessons to get stats on which keys I need to focus on, and redo lessons on those\nspecific characters. The keys I struggled the most with were i/o, c/v, e/f.</p>\n<h3>But you type slower than before...</h3>\n<p>While I typed somewhat slower compare to before, my wrist strains have all but gone. I am able to\ntouch-type comfortably for a long period of time. It’s important to note ergonomic != speed.\nAlternate keyboard layouts puts a lot frequently used keys in easy to reach places, like the home\nrow but the downside of this is that sometimes your fingers are overloaded since it needs to type\nconsecutive characters with the same finger where qwerty doesn’t quite exhibit the same issue for\nme.</p>\n<h3>And the verdict?</h3>\n<p>This is actually a &quot;late-post&quot;, Ive been meaning to write this back in 2024 but I am somehow posting\nthis in 2026. I think workman is a great layout, it has been my daily driver for the past 5 years,\nit’s honestly a joy to type on once you get over the learning hump. The lateral movement is low and\nmoving your fingers up/down the keyboard feels great.</p>\n<p>However earlier this year I have decide to learn a new keyboard layout, Colemak-DH. Why? The main\ncomplaint of workman I had was the higher same finger bigrams, I have not been able to type any\nfaster than 80 wpm due to this after 5 years. This lead me down a rabbit hole of alternate layouts\nonce again. I ultimately landed on Colemak-DH. I’m about 15 hours into my journey of learning this\nnew layout. I have only just started using this as my daily driver this week so it probably too\nearly to form any concrete thoughts here but one thing for sure, I’ll be committing to this and come\nback with another first hand review hopefully quicker than the 5 years it took me to write this\npost! Till then, thanks for reading!</p>\n",
      "content_text": "My 5-year journey learning the Workman keyboard layout. After 20+ hours of deliberate practice, here's my honest review and why I'm now learning Colemak-DH.",
      "summary": "My 5-year journey learning the Workman keyboard layout. After 20+ hours of deliberate practice, here's my honest review and why I'm now learning Colemak-DH.",
      "date_published": "2026-01-09T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "habits",
        "learning",
        "keyboard-layouts",
        "typing"
      ]
    },
    {
      "id": "https://hbish.com/reflecting-on-2025/",
      "url": "https://hbish.com/reflecting-on-2025/",
      "title": "Reflecting on 2025",
      "content_html": "<p>2025 is the Year of the Snake. I was born in a Snake year, and for those familiar with Chinese\nculture, there’s a concept called Ben Ming Nian (本命年). It occurs every 12 years, marking the\nreturn of your birth zodiac animal. Traditionally, this year is seen as unlucky, a time filled with\npotential setbacks and misfortunes across all aspects of life. Wearing red, including underwear, is\nthought to combat this bad luck. I’m not quite superstitious enough to follow this tradition\nconsistently, nor do I want to leave that image in your head as you read through this post.</p>\n<p><img src=\"/media/reflecting-on-2025.png\" alt=\"Reflecting on 2025\"></p>\n<h2>Work</h2>\n<p>Burnout is no joke. This has probably been the most challenging year since I joined the workforce.\nI’ve spent the past six years working on the same system with the same team in the same environment.\nThe company itself has grown many times over since I joined. Throughout this time, I’ve had six\nbosses come and go. I’ve moved between managerial and individual contributor roles, delivered on\nwhat I’d call &quot;impossible&quot; goals, and survived numerous restructures. All I can say is that this is\nexactly what you sign up for at a start-up/scale-up. I have plenty of war stories, which I’ll share\nin future posts.</p>\n<h3>AI Fatigue</h3>\n<p>Don’t get me wrong. I have dramatically increased my usage of AI this year. I’ve fully embraced AI\ncoding agents in my daily workflow and run my own n8n server to automate various aspects of my life.\nBut it’s worth mentioning how the &quot;majority&quot; are using AI. I’ve wasted countless hours reading\nAI-generated content in our company wiki, witnessed the rise of &quot;code slop&quot; from engineers, and\nperhaps most amusing — watched non-technical people submit AI conversations as deliverables or proof\nof work.</p>\n<p>Here are my principles for AI usage:</p>\n<ul>\n<li><strong>DO</strong> use AI to comprehend, summarise, and understand concepts. You can also use AI as a sounding\nboard for research and brainstorming, but apply your own critical thinking. Always check for\nhallucinations, especially if you are on the bleeding edge.</li>\n<li><strong>DO</strong> use AI as a pair programmer. If you scaffold the codebase, use AI to complete the\nimplementation. If you write the business logic, use AI to write the unit tests.</li>\n<li><strong>DO</strong> use AI to proofread and edit what you have written.</li>\n<li><strong>DO</strong> use AI as a second pair of eyes when you are truly stuck. Personally, I consider 1 hour of\nbanging my head against a problem to be the sweet spot before reaching for Copilot.</li>\n<li><strong>DON’T</strong> draft technical documentation using AI. It is usually filled with fluff, lacks proper\ncontext, and makes assumptions that do not apply to your organisation. Designing a system and\nwriting good technical documentation is a great way to reinforce your understanding and critical\nthinking skills. Don’t outsource this. Assume your readers are skilled engineers. You don’t need a\n1,000-word essay explaining how a technology works. Not only does this dilute the idea you are\ntrying to convey, but it wastes your readers’ time.</li>\n<li><strong>DON’T</strong> rely on AI as a code reviewer. It has no understanding of different phases of a program\n(compile, build, run); at best, it performs static analysis. Practice self-review—the time you\nallocate should be proportionate to the size and complexity of the change.</li>\n</ul>\n<h3>What’s Old is New Again</h3>\n<p>If you stay somewhere long enough, you realise that change comes in cycles. Around the three- to\nfour-year mark, you notice the same structures reappearing, the same ways of working, and the same\nroles. There are only so many ways you can slice and dice an organisation to improve productivity.\nTry to follow the breadcrumbs back: it is usually a prioritisation issue or a lack of\naccountability. Changing the structure doesn’t help with either. I am in my fourth role in six\nyears. You eventually reach a point where you wonder if you are part of the solution or part of the\ndysfunction.</p>\n<h2>Hobbies</h2>\n<p>I failed terribly at getting back into reading. I only finished five books this year.</p>\n<p>I lost a few indoor plants because I lost track of my watering schedule. It started to feel like a\nchore.</p>\n<p>On the bright side, I have a renewed love for building side projects (thanks to AI).</p>\n<p>I picked running back up this year, logging over 500 km. My longest run in 2025 was 17 km. I plan to\nreturn to yoga and strength training in 2026.</p>\n<h2>Productivity</h2>\n<p>I tried to become more productive this year. I experimented with a few new tools to help organise my\nlife. Here is what stuck:</p>\n<ul>\n<li><strong>TickTick</strong> – to-do lists, calendar, and habit tracking</li>\n<li><strong>Ulysses</strong> – long-form writing</li>\n<li><strong>ideaShell</strong> – audio notes</li>\n<li><strong>Apple Dictation / Gboard</strong> – voice-to-text</li>\n</ul>\n<p>I think voice will be huge in 2026. From taking notes to dictation to controlling your computer\nhands-free, I really want to see voice interfaces take off. It is still awkward to use voice in the\noffice, the accuracy drops significantly when a colleague is speaking nearby, or when you are not\ntalking loudly enough.</p>\n",
      "content_text": "Navigating burnout, AI fatigue, and organisational cycles during the Year of the Snake. Reflections on six years at a scale-up, principles for using AI without losing critical thinking skills, and experiments with productivity tools.",
      "summary": "Navigating burnout, AI fatigue, and organisational cycles during the Year of the Snake. Reflections on six years at a scale-up, principles for using AI without losing critical thinking skills, and experiments with productivity tools.",
      "date_published": "2025-12-31T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "reflection",
        "burnout",
        "ai",
        "productivity",
        "career",
        "year-in-review",
        "habits"
      ]
    },
    {
      "id": "https://hbish.com/modding-keychron-k2/",
      "url": "https://hbish.com/modding-keychron-k2/",
      "title": "Modding the Keychron K2 Mechanical Keyboard",
      "content_html": "<p>If you are mechanical keyboard user and have been on my <a href=\"https://hbish.com/uses/\">/uses</a> page you\nmay have noticed I use\n<a href=\"https://www.keychron.com/products/keychron-k2-wireless-mechanical-keyboard\">Keychron K2</a> keyboard\nas my daily driver.</p>\n<p>The K2 is a feature packed entry level mechanical keyboard that I personally rate very highly. The\nK2 have done a lot right, especially with the minimalist look, battery and the bluetooth\nconnectivity. The build quality is fairly decent for its price and the gateron switch for me felt\nsmoother that the cherry switch on my other mechanical keyboards.</p>\n<p>There are really 2 complaints I have with the KeyChron K2:</p>\n<ol>\n<li>The height - it is a tall keyboard, so your wrist may feel uncomfortable through prolonged use.\nHowever can easily be remediated with a palm rest, so not a big deal.</li>\n<li>Typing sound - while the switch is smooth to type on, the keypress itself sounds hollow and\nplasticky. Damn, not a easy fix.</li>\n</ol>\n<p>After 12 months of solid use and out of warranty, I decided to have a go at modding the K2 to see if\nI can make it sound better. I have recorded a before and after sound test so you can hear a\ncomparison.</p>\n<p>Before:</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/cAZnXS1C3Zk\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe><p>After:</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/wMfrIxf72-M\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe><p>The difference is subtle but you can definitely hear some enhancements. The sound before I did the\nmod sounded super empty and hollow, its almost like two pieces of plastic tapping on each other\n(especially when I press on the spacebar). The sound after I did the mod is much more fuller and\nsmooth, what a mechanical keyboard should sound like!</p>\n<p>So how did I go about it? Well there really there are 3 parts, to it and the get progressively more\ninvolved (may even void your warranty - you have been warned).</p>\n<h3>O-rings (took ~10 minutes)</h3>\n<p>O-rings are dampeners that you can use and fit under the keycaps. This would make bottoming out\nsound a lot more softer as the o-ring prevents the keycaps from hitting the bottom plate.</p>\n<p>This was one of the very first things I did to the keyboard after a couple of weeks of using it. Its\na low cost solution to the problem (less than $5 for 120) and can be achieve fairly quickly.</p>\n<p>The downside here is you are adding another 1-2mm to the keyboard, again not a big issue if you use\na palm rest.</p>\n<h3>Lubing the switches and stabilizers (took ~60 minutes)</h3>\n<p>Now the mod is starting to gets more technical, I would recommend you do a bit of research before\njumping in and lubing as it may damage your switches if you don&#39;t do it properly.</p>\n<p>Lubing is basically a process of adding lubricants on to high friction areas of the switch to\nsilence the switch and make it feel smoother.</p>\n<p>There are multiple ways of lubing the switches (try youtubing them), I&#39;ve opted to go with not\ndesoldering the keyboard because I don&#39;t have a switch opener and I wanted to apply the lube fairly\nquickly. If you have the newer version of the Keychron, I believe the switches are actually\nhot-swappable, you can just remove the switches and lub them individually but you&#39;ll need to learn\nhow to disassemble a switch and how to put the back.</p>\n<p>The equipments I used here are:</p>\n<ul>\n<li>a plastic friendly lubricant (\n<a href=\"https://www.keebtalk.com/t/which-lube-for-switch-lube-an-updated-guide-on-the-what-how-and-where-of-switch-lubricants/5052\">which lube to use</a>),</li>\n<li>a thin brush</li>\n<li>something to hold down the switch while you are lubing the sides of a switch.</li>\n</ul>\n<p>Here is a time-lapse of me lubing.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube-nocookie.com/embed/2kOK78kJ1C4\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe><p>You can also find lots of information and how to videos about lubing keyboard switches on youtube.</p>\n<h3>Add padding (took ~120 minutes)</h3>\n<p>The next mod I went about doing is trying to find out if there are any room in the chassis where the\nkeypress can bounce off creating that hollow sound. Luckily KeyChron has a great\n<a href=\"https://www.google.com/search?q=keychron+k2+unassemble\">disassemble guide</a> on their website. That\ngoes through exactly how to remove the PCB.</p>\n<p>As I suspected, there are heaps of room below the PCB. There is about 3-4mms under the board is\ncompletely unfilled. So we can definitely fill that area up with some foam or sound dampening\nmaterial to absorb the sound. If you still have the original box around it actually comes with a\ndecent protective foam which can be used, its actually cut to the size of the keyboard so it fits\nnicely after you trim off the edges. I also happen to have a bunch spare ones which I decided to use\nas well.</p>\n<p>One thing to remember here is to not over-stuff it with the foam and also keep it eventual spread\nout, so no lumpy areas, as that could wrap the PCB board over time and cause damage. So filling it\nup to just below the PCB rest would work well and it makes putting back the screws and lining up\nwith the ports a lot simpler. The whole process is really an trial and error to get just the right\nfit, it took me around 2 hours to complete it all.</p>\n<p>Here are some images of how I went about doing it.</p>\n<p><img src=\"/media/Keychron-K2-Modding_1.jpg\" alt=\"Keychron-K2-Modding 1\"> <em>Step 1: take all the keycaps off, remove\nthe alumium frame and remove the screws</em></p>\n<p><img src=\"/media/Keychron-K2-Modding_2.jpg\" alt=\"Keychron-K2-Modding 2\"> <em>Step 2: lift the PCB, don&#39;t take it out\nall the way, there is a connector to the battery</em></p>\n<p><img src=\"/media/Keychron-K2-Modding_3.jpg\" alt=\"Keychron-K2-Modding 3\"> <em>Step 3: filled the void with foam, don&#39;t\nfill it up to much</em></p>\n<p><img src=\"/media/Keychron-K2-Modding_4.jpg\" alt=\"Keychron-K2-Modding 4\"> <em>Step 4: applied another layer with the\nfoam that came with the box to have that neat finish</em></p>\n<h3>Jobs done</h3>\n<p>There are other things we can do to enhance how it sounds but i&#39;m pretty happy with the outcomes. It\nsounds a lot crisper than what it was and all it took was some time and spare materials which you\nmight have around the house. The only thing I had to purchase was the lube which set me back $20 and\nI&#39;ve only used about 1/4 of it. Not much for an upgraded better typing experience!</p>\n",
      "content_text": "Transform your Keychron K2's hollow sound into crisp mechanical satisfaction. A complete modding guide covering O-rings, lubing, and foam padding.",
      "summary": "Transform your Keychron K2's hollow sound into crisp mechanical satisfaction. A complete modding guide covering O-rings, lubing, and foam padding.",
      "date_published": "2020-07-15T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "modding",
        "mechanical keyboard",
        "hack"
      ]
    },
    {
      "id": "https://hbish.com/deleting-old-tweets/",
      "url": "https://hbish.com/deleting-old-tweets/",
      "title": "Deleting Old Tweets",
      "content_html": "<p>I joined <a href=\"https://twitter.com/\">Twitter</a> back in August 2007. At the time I was 18, in my final year\nof high school. I literally used twitter as an outlet to vent all of my feelings, happy or sad. I\ndropped a few f bombs here and there. I complained about various things like telcos, sydney trains\nand broken electronics. I use it to talk/meet new people, in fact I had a relationship with someone\nI met on twitter for about 4 years. I literally tweeted about anything and everything.</p>\n<p>Fast forward to 2020, we now live in a world where your past can come back and haunt you, just about\nanyone can be a detective and dig through your past. I had accumulated well over 30k tweets over the\nyears and its physically not possible to remember every one of them or every single photo I have\nposted. There is one thing for sure, the old me was dumb and naive. I actually don&#39;t mind the\nsilliness and embarrassing selfies but what I can not handle is an innocent tweet being turned into\na something more sinister. There is also an excellent TEDTalk &quot;\n<a href=\"https://www.youtube.com/watch?v=wAIP6fI0NAI\">How one tweet can ruin your life</a>&quot; by Jon Ronsons that\ntalks about this. Its well worth a watch.</p>\n<p>So how to delete tweets? You can do it manually via the UI and do it one by one or use one of the\nare many services out there that would delete your old timeline items. Most of them are on a\nfreemium model such as <a href=\"https://tweetdelete.net/\">tweetdelete</a>, <a href=\"http://twitwipe.com/\">twitwipe</a> and\n<a href=\"https://tweetdeleter.com/\">tweetdeleter</a>. Using these services requires you to sign into your\ntwitter account so please check their privacy statements before using those services. Or finally you\ncan write a script like I did.</p>\n<p><a href=\"https://github.com/hbish/delete-old-tweets\">delete-old-tweets</a> is a open-source script I wrote\nalmost three years ago to go through your twitter archives and remove the tweets from your timeline.\nYou can specify a cutoff date so any tweets before that date would be deleted from your timeline.\nYou can follow the instructions on the\n<a href=\"https://github.com/hbish/delete-old-tweets/blob/master/README.md\">README.md</a>.</p>\n<p><img src=\"/media/benshi.gif\" alt=\"Ben Shi GIF\"></p>\n<p>Why the gif? This was actually a result of a series of prank wars in the office with a former\ncolleague, the person actually dug through my twitter timeline all the way back till 2011 and found\na series of embarrassing selfies I took and stitched them together to make a :benshi: gif. While I\nwasn&#39;t very happy about it at the time, we laugh over it now.</p>\n<p>Next time you post something on the internet, just remember</p>\n<blockquote>\n<p>Once on the internet, always stays on the internet.</p>\n</blockquote>\n",
      "content_text": "Why I decided to delete 13 years of tweets and how I automated the process. A reflection on digital permanence and online identity.",
      "summary": "Why I decided to delete 13 years of tweets and how I automated the process. A reflection on digital permanence and online identity.",
      "date_published": "2020-06-07T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "programming",
        "twitter",
        "history"
      ]
    },
    {
      "id": "https://hbish.com/brief-look-at-webmention/",
      "url": "https://hbish.com/brief-look-at-webmention/",
      "title": "A Brief Look at WebMention",
      "content_html": "<p>I&#39;ve been looking for the perfect commenting solution for my blog in the last few weeks. After\ntrialing various solutions to no avail, I stumbled into the world of IndieWeb and in particular\nWebmention. This is a two part series, in the first I will go in to some details on what webmention\nis, how it works and what some benefits you may get over and above existing solutions. In the second\nI will go into how I went about implementing it.</p>\n<h3>Why existing solutions didn&#39;t work?</h3>\n<p>First, I want to talk about how existing solutions like <a href=\"https://disqus.com/\">disqus</a>,\n<a href=\"https://posativ.org/isso/\">isso</a>, <a href=\"https://utteranc.es/\">utterance</a>,\n<a href=\"https://commento.io/\">commento</a> and many others didn&#39;t quite fit what I needed.</p>\n<h4>1. Privacy</h4>\n<p>One of the most popular commenting solution out there is Disqus and it is usually the first solution\npeople recommend due to how complete it is. But then how can disqus provide such a service and all\nof its features for free? There is a famous saying &quot;if you&#39;re not paying for the product, you are\nthe product&quot;, this holds true there. While Disqus do have a paid tier, their revenue model is\npredominately ads and analytics. So would be a no from me, as I wanted to respect the privacy of all\nvisitors on my website, the same reason why you won&#39;t find Google Analytics on my website.</p>\n<h4>2. Entry Barrier for Interacting</h4>\n<p>Many solutions require the reader to sign in before interacting such as a medium account before\ngiving a clap to a medium article. Solutions like staticman and utterance require a github account\nfor users to leave a comment. These &quot;barriers&quot; creates friction and its not something I want for a\nniche blog like mine. Social login such as google, facebook and twitter are more widely available\nsince most people would have at least one of the above and they are supported on many of the\ncommenting solutions out there. But since privacy is a concern of mine, facebook and google logins\nare out. Twitter is somewhat more acceptable amongst the tech community.</p>\n<h4>3. Ease of setup</h4>\n<p>Isso and Commento are popular alternatives to Disqus, they are super lightweight and respects your\nprivacy and data. However they do require manual setup and a server to run on since they are\nself-hosted solutions. Since I&#39;ve only just decommission all my servers, spinning up another is not\nsomething I would like to entertain. Having said that if you are already running your own server the\ntwo optioned mentioned here are great options.</p>\n<h4>4. Cost</h4>\n<p>Cost, it all comes down to money at the end of the day. While I would love to pay for it and support\nthe developers on those projects, I find it super difficult to justify it for my low traffic\npersonal website whether it be hosting it on my own server or paying $5 a month for a commenting\nservice like commento.</p>\n<h4>5. Theme</h4>\n<p>Last area of consideration is theming. I&#39;ve decided to implement a theme switcher on the website,\nwhich means the comment section needs to be switch themes. From all of the solutions I&#39;ve tested\nnone of them blended into my website&#39;s stylesheet natively without heavily reliant on some\njavascript magic to manipulate the dom and add in the style or classes. This is due to how majority\nof them injects an iframe into the page after the page has loaded.</p>\n<h3>Webmention</h3>\n<p>The idea haas been around for some time check out the <a href=\"https://www.w3.org/TR/webmention/\">W3C spec</a>,\nI personally have not heard of it until I eventually stumbled upon webmention from\n<a href=\"https://www.swyx.io/writing/clientside-webmentions/\">swyx</a> and subsequently\n<a href=\"https://mxb.dev/blog/using-webmentions-on-static-sites/\">Max Bock</a>. Their implementations really\ngrabbed my attention so I decided to dive further.</p>\n<p>Let&#39;s start with a little overview webmention, directly from the\n<a href=\"https://indieweb.org/webmention\">IndieWeb wiki</a>.</p>\n<blockquote>\n<p>Webmention is a web standard for mentions and conversations across the web, a powerful building\nblock that is used for a growing federated network of comments, likes, reposts, and other rich\ninteractions across the decentralized social web.</p>\n</blockquote>\n<p>This means, no single service owns the data and your interactions are stored on various services\nwaiting to be aggregated such as twitter, mastodon and any other blogs/websites. If you are reading\nthis article then you may have noticed my webmention implementation already, if not then here is a\nscreenshot of it in action!</p>\n<p><img src=\"/media/webmention.png\" alt=\"webmention on hbish\"> <em>webmention on hbish.com</em></p>\n<p>For my website, I have &quot;claps&quot; which gets fetched directly from twitter. Any tweets with my blog\nlinks on it that receives likes will show up here because my website implements webmention protocol.</p>\n<p>The recent mentions section shows who has liked the post and comments. Because of the federated\nnature of webmention, comments can also come from multiple sources. In my case, &quot;mentions&quot; are a\ncombination of twitter replies and direct comments hosted off on another service called\n<a href=\"https://commentpara.de/\">comment parade</a> which allows no signup comments! Another benefit of\nwebmention is that traditional pingbacks from other websites can also be converted into webmention\nand displayed as mention.</p>\n<p>Obviously implementing it yourself takes time but you get much more flexibility in terms of:</p>\n<ul>\n<li>source the reactions - twitter, where I spend most of my time online</li>\n<li>theming - my recent comments fits right into all four of my website theme options.</li>\n<li>cost - free as in beer!</li>\n</ul>\n<h3>Great! How can I go about implementing it?</h3>\n<p>One thing to note before you start implementing webmention is that you can fetch the mentions at\nbuild time or during runtime (via the client). Both approaches have tradeoffs, it worth\nunderstanding them before diving in the deep end and implementing your own.</p>\n<p>If you have a high traffic website and you want the page to load quickly then you can opt for a\nbuild-time approach. The obvious tradeoff here is that your webmentions will only be updated\nwhenever you publish an update. If you want your webmentions to be updated more often, then you\nwould have to trigger your builds more regularly. This can be achieved in a few different ways,\neither by a schedule or a webhook that triggers a build whenever a interaction or mention is\nobserved. Those approach offers a good trade off between performance and freshness of your\nwebmention.</p>\n<p>The other approach is to fetch the webmentions at run-time on the client. This adds additional\noverhead to your website, as it needs to make more http calls. What you do get with the additional\nperformance hit is that your website&#39;s mentions will always receive the latest interactions. This\nmay be acceptable on a lower traffic websites like mine.</p>\n<p>So hopefully by now, you have a good understanding of webmention and some of the advantages it\nbrings. In part 2, I will be going through how I have implemented webmention, along with lots of\nresources so you can get started too! Stay Tuned (I promise it won&#39;t be a 2 year wait like my Gatsby\npost).</p>\n",
      "content_text": "Exploring WebMention as a decentralized commenting solution for static sites. How IndieWeb protocols enable social interactions without centralized platforms.",
      "summary": "Exploring WebMention as a decentralized commenting solution for static sites. How IndieWeb protocols enable social interactions without centralized platforms.",
      "date_published": "2020-05-25T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "programming",
        "webmention",
        "web technology"
      ]
    },
    {
      "id": "https://hbish.com/covid-life-update/",
      "url": "https://hbish.com/covid-life-update/",
      "title": "COVID Life Update",
      "content_html": "<p>Where do I even begin? 2020 is turning out to be one of the strangest I have ever experienced. I&#39;m\nsure I&#39;m not alone in thinking this as we all have been affected in one way or another by\n<a href=\"https://www.worldometers.info/coronavirus/\">COVID-19</a>. The invisible virus wreaked havoc throughout\nthe world, many people have lost loved ones, we were forced to stay within the bounds of our four\nwalls, the economy has also taken a huge hit and like many, I lost my job in the midst of it all.</p>\n<p>Before I start talking about where I am now in this roller coaster, let&#39;s unwind...</p>\n<p><img src=\"/media/roller-coaster.jpg\" alt=\"2020, a roller coaster\"> <em>2020 a roller coaster (caruizp - pixabay)</em></p>\n<h3>The Sea Change</h3>\n<p>Since late 2017, I&#39;ve been consulting with an AWS partner helping businesses transform their IT\noperations and assist them with their journey into the cloud. During this time I had the privilege\nto work across industries from financial services, governments to airlines. I lead those projects\nresponsible for the design and implementation of APIs and microservices. I have had my fair shares\nof WTF moments while working in consulting but that&#39;s a story for another time.</p>\n<p>After a fair amount of project work and reinventing the wheel if you will, the speed at which I\npersonally operated has started to wear on me. While the hours I worked were pretty normal, but the\nstress to deliver and keeping the clients happy were getting to me. The onboarding process, getting\nto know new people (not only within the consulting company but also clients), understanding how they\noperate and their skills all took significant effort. So imagining repeating this process every 3-6\nmonths as you start/finish the projects and moving on to another.</p>\n<p>I made an internal move to the product team towards the end of my tenure to help build out a\nplug-n-play identity and access management system. The team and the tech stack used on the project\nwere top-notch. I was not on client site anymore and rather than reinventing the wheel, we are\nmaking the wheel better, faster and strong. All perks of working on a product team.</p>\n<p>Around August of 2019, I found out a close friend of mine joined a new company and they have an open\nposition for an Engineering Manager role. At the time I didn&#39;t want to move off the tools and move\ninto management just yet. But after some careful consideration, I decided to have a chat and find\nout more about the opportunity (never turn down an opportunity). I didn&#39;t know what I was expecting,\nafter all, I have never sat in an engineering manager interview previously, all I had was my prior\nexperiences of leading engineering teams and consulting. To my surprise, the chat went super\nsmoothly and I got offered the position on the spot.</p>\n<h3>That didn&#39;t last...</h3>\n<p>A month later I found myself in unfamiliar territory as an Engineering Manager of a fintech startup\n(it still sounds a little funny when I say it out loud and introduce myself). At the time we had\nabout 12 engineers and more than half of them only started within the last 6 months. I guess you can\nsay the company was in a hyper-growth stage.</p>\n<p>I hit the ground running immediately and applied a lot of what I have learnt in the past. I also\npicked up precious knowledge on managing software teams and scaling (future posts). Everything was\ngoing along fine, the team grew to close to 20 people and I was starting to find my rhythm\nuntil...COVID-19.</p>\n<p>On 25th March, I received the unfortunate news along with the rest of the company that everyone&#39;s\nrole has been made redundant. I still remember this day vividly and I&#39;m sure everyone there would as\nwell. The news was delivered to the entire company via Zoom, since only a week prior, we were all\nasked to work from home due to the strict lockdown laws.</p>\n<p>I was shocked. Although I found out about the news earlier than the rest of the company, it didn&#39;t\nmake the news any less shocking. The worst part is watching people&#39;s reaction over a computer\nscreen. There were lots of supportive messages for the CEO and the company at the announcement. As\nthey try to seek additional funding to bring the company back from suspended animation. Like anyone\nwho has been told their job is no longer available, I updated my resume and decided to put myself on\nthe job market again.</p>\n<h3>Or did it?</h3>\n<p>I was SUPER conflicted. I had an important decision to make, whether I continue down the managerial\nroute or if I should get back on the tools. The different paths would have a different lead-time,\npreparation and steer my career in the opposite direction.</p>\n<p>The job market was dead slow at the start of April and there were a lot of companies going through\nthe same fate as mine. Companies hiring were forced to tighten spend and freeze unnecessary hires.\nIt has picked up since then as companies start to accept the status quo and begin to live with the\nfact that COVID-19 is here to stay.</p>\n<p>Around mid-April, the Australian Government announced the\n<a href=\"https://www.business.gov.au/Risk-management/Emergency-management/Coronavirus-information-and-support-for-business/JobKeeper-Payment-for-employers-and-employees\">JobKeeper</a>\nprogram, its aimed at helping employees stay in jobs and take the burden off Australia&#39;s welfare\nsystem. As a result of this, some of us were asked to come back on a part-time basis to keep the\nship going while the founders try to secure the funding. This made my decisions a lot easier and I\nwas not forced to make a career decision out of my hand.</p>\n<p>While the development team is a lot smaller now and things are still not back to normal for a lot of\nus. I am getting a lot more positive about the situation as I continue to receive news of people who\nare no longer with the company locking in full-time employment or other forms of freelance work.</p>\n<p>Working part-time also meant that I have got a lot of free time on my hands. I find myself reading\nand coding a lot more. I am waiting for the lockdown to ease further. When that happens, I&#39;m sure\neveryone will meet up and catch-up on everything over a beer or two in a pub.</p>\n<p>So that&#39;s where I am now, I&#39;m optimistic the world will start to recover and everything will\nhopefully get back to normal by the end of the year.</p>\n",
      "content_text": "Reflections on life during COVID-19 lockdown. How 2020 became one of the strangest years I've experienced and what I learned from it.",
      "summary": "Reflections on life during COVID-19 lockdown. How 2020 became one of the strangest years I've experienced and what I learned from it.",
      "date_published": "2020-05-17T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "life",
        "covid-19",
        "career"
      ]
    },
    {
      "id": "https://hbish.com/version-7-gatsbyjs/",
      "url": "https://hbish.com/version-7-gatsbyjs/",
      "title": "Version 7 - GatsbyJS",
      "content_html": "<p>I did a complete rewrite of my personal website in the last week. I abandoned CMSs all together and\nventured down using a static site generator.</p>\n<h3>Motivation</h3>\n<p>In the very beginning, I had just a simple static HTML page with a little CSS. Then I started\nwriting my own PHP to bring up dynamic content like pictures, tweets, and posts but it very quickly\nbecame unmanageable. Then came <a href=\"https://wordpress.org/\">WordPress</a>, it has work well for me for the\npast for my technology blog site (now defunct), so I decided to use it on my own personal website. I\nhave a love/hate relationship with WordPress, while there are loads of plugins and themes out there,\nthere are very few that met all my needs. So I often find myself tweaking themes, trying out new\nplugins and modify ones that don&#39;t quite meet my needs.</p>\n<p>I did try a few other CMSs but I always find myself coming back to WordPress so I decided to\nself-host WordPress and wrote my own theme from scratch. I settled on simplicity for v6, only used\nplugins that I need (<a href=\"https://wordpress.org/plugins/jetpack/\">Jetpack</a> and\n<a href=\"https://wordpress.org/plugins/hyper-cache/\">HyperCache</a>) and kept the design minimal. That worked\nwell for the past 3 years but something else was pulling me down .... WordPress. I needed a server,\nan application container in Nginx and every 3-4 months I had to upgrade WordPress for security\npatches.</p>\n<p><img src=\"/media/gatsby-development.png\" alt=\"Gatsby Development\"></p>\n<h3>Enter GatsbyJS</h3>\n<p><a href=\"https://www.gatsbyjs.org/\">GatsbyJS</a> is one of the many static site generators out there. The main\ngoal of these site generators is to remove any server-side technology from the mix and serve out\npre-rendered HTML with JavaScript and CSS, basically stuff that your browser is able to understand.\nThis means huge improvement in security (less attack vector and no admin console), reliability (no\ndependencies like a database), performances (no server rendering) and portability (I can move the\nwebsite to any host that supports HTML).</p>\n<p>Gatsby is written in React/GraphQL which is great. So it&#39;s pretty simple to get started for anyone\nwith a bit of programming experience but very easy to get bogged down in it and get\n<a href=\"https://medium.com/@ericclemmons/javascript-fatigue-48d4011b6fc4\">JavaScript Fatigue</a>. I was able\nto follow the <a href=\"https://www.gatsbyjs.org/docs/\">quickstart guide</a> and get started right away on a few\nof the <a href=\"https://www.gatsbyjs.org/starters/\">starters</a> available. Adding new features like tagging,\npagination, and comments do require some coding but that didn&#39;t bother me. The community behind it\nhas been growing very quickly so you don&#39;t have to go far to get assistance. On top of that, I was\nimpressed at how easy you can convert your site into a PWA (Progressive Web App) using\n<a href=\"https://www.gatsbyjs.org/packages/gatsby-plugin-offline/?no-cache=1\">gatsby-plugin-offline</a>,\nintroducing service workers so that you&#39;re able to make your website available without internet.</p>\n<h3>Why not X?</h3>\n<p>I have tried other solutions in the past...</p>\n<ul>\n<li><a href=\"https://getkirby.com/\">Kirby</a> is halfway between a static site generator and a CMS. The contents\nare managed in flat-files which is great but I didn&#39;t escape the horror that is maintaining a PHP\nserver stack (that was on version 1 of Kirby, I haven&#39;t tried version 2 yet).</li>\n<li><a href=\"https://gohugo.io/\">Hugo</a> is another popular static site generator written in Go and it has a\nreally big community built around it. It was able to compile my website really fast. However, it\njust didn&#39;t feel familiar enough for me especially trying to get my head around the templating\nlanguage.</li>\n</ul>\n<p>Obviously, there are more static generators out there, it is not my intention to go through and\ncompare them all, especially when I haven&#39;t used them in anger.</p>\n<h3>Conclusion</h3>\n<p>I hope this post has helped you in deciding whether you need a static site generator. In the next\npost, I will go through in more detail how I moved from WordPress and the various problems I faced\nduring the migration. And a subsequent post to go through my new blogging workflow.</p>\n<p>I&#39;m stoked that I have learned a new framework so quickly and rewrote the website from the ground\nup. Front-end development is not my forte so the website is not pixel perfect, feel free to drop me\na message <a href=\"https://twitter.com/hbish\">@hbish</a> if you see any issues or if you want to discuss any of\nthe above.</p>\n",
      "content_text": "Why I completely rewrote my personal website using GatsbyJS and abandoned CMSs for a static site generator. Version 7 brings speed and simplicity.",
      "summary": "Why I completely rewrote my personal website using GatsbyJS and abandoned CMSs for a static site generator. Version 7 brings speed and simplicity.",
      "date_published": "2018-10-15T00:00:00.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "gatsbyjs",
        "cms",
        "wordpress",
        "blog"
      ]
    },
    {
      "id": "https://hbish.com/questions-ask-choosing-new-tools-frameworks-libraries/",
      "url": "https://hbish.com/questions-ask-choosing-new-tools-frameworks-libraries/",
      "title": "Choosing between Frameworks & Tools",
      "content_html": "<p><img src=\"/media/searching-for-alternatives.jpg\" alt=\"Searching for alternatives\"></p>\n<p>New tools, frameworks and libraries pop up all the time (especially true in javascript), so how do\nyou assess whether they are the right fit for your project or organisation?</p>\n<p>To assist with the task of assessing, I ask myself the following questions (replace [x] with the\ntool/framework/library you are assessing):</p>\n<ul>\n<li>Why does [x] exist?</li>\n<li>What problem is [x] trying to solve?</li>\n<li>What can [x] do better than what we currently have?</li>\n<li>How does [x] integrate into our current process? Is it a seamless switch?</li>\n<li>Does [x] have developer support and sufficient documentation? (You can usually find these out from\nStack Overflow or Github)</li>\n<li>If [x] is not free, are there free/open source alternatives? Are the costs worth the features?\nWhat is the licensing model like?</li>\n</ul>\n<p>Of course there are many more questions to ask and it really depends on what [x] is and the problems\nit is trying to solve. Some areas to think about include:</p>\n<ul>\n<li>Performance;</li>\n<li>Scalability and Concurrency;</li>\n<li>Security;</li>\n<li>Dev activity (is it being actively maintained);</li>\n<li>IDE support;</li>\n</ul>\n<p>I did not put &#39;learning curve&#39; in here because personally I think that if [x] is useful and tick all\nthe right boxes then learning it would be worthwhile and it should be the least of your worries.\nHaving said that, learning curve could put much more weight in your assessment when you have two or\nmore close contenders and/or your team size is fairly large.</p>\n<p>If you can not answer these questions above, then you probably wont need it (for now). Either note\nit down to reassess in the future or move on and save yourself some time.</p>\n<p>I would love to hear what you think and if you think I have missed something please do let me know!</p>\n",
      "content_text": "Essential questions to ask when evaluating new frameworks and libraries for your project. A practical guide for technology selection decisions.",
      "summary": "Essential questions to ask when evaluating new frameworks and libraries for your project. A practical guide for technology selection decisions.",
      "date_published": "2016-03-20T11:26:25.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "alternative technology",
        "assessments",
        "frameworks",
        "learning",
        "libraries",
        "software development",
        "tools"
      ]
    },
    {
      "id": "https://hbish.com/musashi-eiji-yoshikawa/",
      "url": "https://hbish.com/musashi-eiji-yoshikawa/",
      "title": "Book Review: Musashi – Eiji Yoshikawa (5/5)",
      "content_html": "<p><img src=\"/media/musashi.jpg\" alt=\"Musashi - Book Cover\"></p>\n<p>This masterpiece by Eiji Yoshikawa is easily one of the best (if not the best) book I have ever\nread. A well-written fictionalisation of the intriguing life of one of the world&#39;s greatest\nswordsman of all time, <a href=\"https://en.wikipedia.org/wiki/Miyamoto_Musashi\">Miyamoto Musashi</a>. Now the book itself is BIG, 970 pages to be exact. At\nthis point I should probably point out: 1) It&#39;s my first review and 2) I&#39;m pretty bad with my\nreadings, and it took me a good 4 months to finish this book.</p>\n<p>This book opens with Musashi escaping from the <a href=\"https://en.wikipedia.org/wiki/Battle_of_Sekigahara\">Battle of Sekigahara</a> as a fugitive and continues\nwith his transformation from a brute and self-centered person to a hero of great character and\nwisdom. The book itself revolves around the themes of love, rivalry, misguided revenge and Musashi&#39;s\ndedication to the way of the samurai and lifelong learning. Musashi&#39;s life was captured by Yoshikawa\naccurately and presented elegantly in writing. The attention to the Japanese history/culture,\ncharacter relationships and social hierarchy was covered in great detail.</p>\n<p>For me, each character from this book has taught me something valuable, whether it be thinking\ncritically, training, persistence, tactics and trust. I would highly recommend it to anyone whether\nyou are reading it for the historical significance, martial arts, Japanese culture, heroics or\nportrayal of human transcendence, you will not be disappointed, and hopefully you would have\nreceived some of the learnings I got!</p>\n",
      "content_text": "Book Review: Musashi – Eiji Yoshikawa (5/5)",
      "summary": "Book Review: Musashi – Eiji Yoshikawa (5/5)",
      "date_published": "2014-05-29T14:38:50.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "book review",
        "eiji yoshikawa",
        "fiction",
        "learnings",
        "musashi"
      ]
    },
    {
      "id": "https://hbish.com/building-high-performance-java-application-lessons-learnt/",
      "url": "https://hbish.com/building-high-performance-java-application-lessons-learnt/",
      "title": "Building high performance Java application (Lessons Learnt)",
      "content_html": "<p>Whilst on training abroad last month, I had the opportunity of building an automated rates trading\nsystem in Java from scratch to compete with systems built by the other teams.</p>\n<p>Surprisingly, this opportunity has turned out to be a great learning experience for me building a\nhigh performance application. My team did well in terms of performance and here are some of the\nlessons I learnt in the 2 weeks.</p>\n<h2>1. Monetary Calculations</h2>\n<ul>\n<li>Try to use <code>long</code>/<code>double</code> instead of <code>BigDecimal</code> for monetary calculation</li>\n<li>Round result of multiplication/division calculation to the smallest currency unit</li>\n<li>Don&#39;t convert <code>double</code> to <code>BigDecimal</code>, convert using a <code>string</code> instead</li>\n</ul>\n<h2>2. Caching</h2>\n<ul>\n<li>Cache frequently used information to minimise computation</li>\n<li>If possible or too lazy to implement from scratch, use (link:\n<a href=\"https://code.google.com/p/guava-libraries/wiki/CachesExplained\">https://code.google.com/p/guava-libraries/wiki/CachesExplained</a> text: Google Guava)</li>\n</ul>\n<h2>3. Listeners</h2>\n<ul>\n<li>Keep listeners light</li>\n<li>Hand events to another part of the system for processing</li>\n</ul>\n<h2>3. Multi-Threading</h2>\n<ul>\n<li>Thread creation is expensive</li>\n<li>Use threadpools</li>\n<li>Avoid <code>synchronisation</code> where possible</li>\n<li>Have flow control to regulate the amount of threads</li>\n<li>Fork-Join in 1.7 (or (link: <a href=\"https://g.oswego.edu/dl/concurrency-interest/\">https://g.oswego.edu/dl/concurrency-interest/</a> text: jsr166) in 1.6)</li>\n</ul>\n<h2>4. Java Specifics</h2>\n<ul>\n<li>When using <code>LinkedList</code>, add/remove elements from the end</li>\n<li>Avoid <code>ConcurrentHashMap</code>, Use (link: <a href=\"https://github.com/boundary/high-scale-lib\">https://github.com/boundary/high-scale-lib</a> text:\n<code>NonBlockingHashMap</code>) instead</li>\n<li>Use LinkedBlockingQueue and ArrayBlockingQueue if you are polling for objects</li>\n<li>(link: <a href=\"https://lmax-exchange.github.io/disruptor/\">https://lmax-exchange.github.io/disruptor/</a> text: <code>Disruptors</code>) are faster</li>\n<li>Enable server flag</li>\n</ul>\n<pre><code class=\"language-bash\">java -server\n</code></pre>\n<ul>\n<li>Enable fast (link: <a href=\"https://hbish.com/blog/Java-pet-peeves-1-string-concatenation\">https://hbish.com/blog/Java-pet-peeves-1-string-concatenation</a> text: string\nconcatenation)</li>\n</ul>\n<pre><code class=\"language-bash\">java -XX:+OptimizeStringConcat\n</code></pre>\n<h2>5. Garbage Collection (GC)</h2>\n<ul>\n<li>GC can be expensive in a high throughput/low latency app</li>\n<li>Minimise object creation within loops</li>\n<li>Out-of-the-box GC options sucks! Reduce collection time and numbers by using a different\ncollection method and optimising those options ((link:\n<a href=\"https://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html\">https://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html</a> text: Oracle Doc))</li>\n<li>Static heap size</li>\n</ul>\n<h2>6. Benchmark</h2>\n<ul>\n<li>Do it regularly (if possible, at the end of every sprint in agile)</li>\n<li>Look for performance consistencies from historical benchmark</li>\n<li>Use jvisualvm and visual GC plugin</li>\n<li>Enable GC monitoring options</li>\n</ul>\n<pre><code class=\"language-bash\">java -verbose:gc -Xloggc:&lt;filename&gt;\n-XX:+PrintGCDetails\n-XX:+PrintGCDateStamps\n-XX:+PrintTenuringDistribution\n-XX:+PrintGCApplicationConcurrentTime\n-XX:+PrintGCApplicationStoppedTime\n</code></pre>\n",
      "content_text": "Lessons learned building an automated rates trading system in Java from scratch. Performance optimization insights from a real-world project.",
      "summary": "Lessons learned building an automated rates trading system in Java from scratch. Performance optimization insights from a real-world project.",
      "date_published": "2013-11-03T08:00:13.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "heap space",
        "java",
        "multithreading",
        "performance",
        "tuning"
      ]
    },
    {
      "id": "https://hbish.com/the-lets-just-code-mentality/",
      "url": "https://hbish.com/the-lets-just-code-mentality/",
      "title": "The \"Let's just code\" mentality",
      "content_html": "<p>As developers, I think the biggest mistake we make is to jump straight into coding.</p>\n<p>I have just finished a 5-week long graduate training course in London. Of which, 2 of these weeks\nwas dedicated specifically to a group project to design and implement a simple automated trading\nsystem. All the requirements have been clearly laid out along with it acceptance criteria and\npriorities.</p>\n<p>And what do you know, just like most other teams, we jumped straight into coding. We did not have\nany design or a clear understanding of the system flow. We virtually got no-where after about a day\nand a half of work, just a bunch of skeleton code that followed a MVVP (whatever that is) pattern\nsomeone in the team had thought up.</p>\n<p>After realising our mistake about a day or so later, I took charge of the technical side of the\nproject and opted a complete rewrite of what we have already got. Now this idea of a complete\nrewrite was not well received within the team for obvious reasons, but I manage to get my points\nacross. After about an hour, I was able to get the basic connections, queuing and structure of the\ncode ready.</p>\n<p>I was able to do this because while the other developers were getting their hands dirty, I spent the\nwhole time understanding the problem, drawing out potential designs and breaking components up into\nmanageable modules. We manage to get over the line in the end.</p>\n<p>Now how did this whole &quot;rewrite&quot; come about? I think it can be attributed to a few things.</p>\n<h3>1. People wanting to impress</h3>\n<p>Especially in a environment like what I was in. It is obvious that everyone there, wanted to be the\nnext superstar developer and impress at the training. I mean which graduate doesn’t think they are\nthe next big shot developer of the company? Let&#39;s face it; some grads are the most ego-driven bunch\nof people who think they can run the town (I know because I used to be like this too).</p>\n<p>What tends to happen in these cases is that they crack under pressure by taking on too much. Coding\na university assignment is very different from designing a system where you have to consider a lot\nof system qualities. You simply do not learn enough real-world examples from universities.</p>\n<h3>2. Code is like cake</h3>\n<p>Really, think about it. Developers love coding. It is their comfort zone; there is nothing they\nwould rather do than to code. Therefore there is always an innate desire to jump straight into\nimplementation before understanding the actual problem.</p>\n<p>Divvy up the cake before you eat it. Or else it might get really messy and you will need to clean up\nafterwards.</p>\n<h3>3. Death by design patterns</h3>\n<p>I think another mistake we had was opting with a design pattern early on in the project. By doing so\nwith out proper planning the system will grow in a evolutionary design environment where Martin\nFowler <a href=\"https://martinfowler.com/articles/designDead.html#PlannedAndEvolutionaryDesign\">defined</a> it as &quot;<em>The design ends up being the aggregation of a bunch of ad-hoc tactical\ndecisions, each of which makes the code harder to alter</em>&quot;.</p>\n<p>So rather than thinking of a design pattern that will encapsulate the project in what we currently\nthink the end state should be. We should take a planned designed approach where we use what we have\nat hand and come up with the simplest solution possible and at the same time be modular and flexible\nto change.</p>\n<p>This was my summary of what has happened throughout the course of my project whilst on training. I\nhave definitely learnt a lot about system design, agile and collaboration. I will have more articles\nin the coming weeks about those specific areas.</p>\n",
      "content_text": "Why jumping straight into coding is often our biggest mistake as developers. The importance of planning and understanding before implementation.",
      "summary": "Why jumping straight into coding is often our biggest mistake as developers. The importance of planning and understanding before implementation.",
      "date_published": "2013-10-29T07:58:03.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "agile",
        "coding",
        "programming",
        "software development"
      ]
    },
    {
      "id": "https://hbish.com/a-midway-checkpoint-for-2013/",
      "url": "https://hbish.com/a-midway-checkpoint-for-2013/",
      "title": "A Midway Checkpoint for 2013",
      "content_html": "<p><img src=\"/media/palmbeach.jpg\" alt=\"Palm Beach, Australia\"></p>\n<p>Checking in for first half of 2013.</p>\n<p><strong>I started at my new job</strong></p>\n<p>Starting at a new job has also being something daunting for me especially when I have worked in a\ncompletely different environment for the past 3 years. Readjusting has been a bit of a rollercoaster\nride, some days I feel great and some days I feel completely clueless but this is all part of the\nlearning experience. In the 4 months, I have learnt about the business, the people and the culture.\nThe work condition is what you would expect in a place like a global investment firm, so I would not\nbother explaining that. There are a lot of social clubs within the firm that are freely available to\nall the employees and they hold events very frequently (I am always in it for the food).</p>\n<p>I also have a technology bootcamp in London coming up later this year. I do not exactly know what to\nexpect from this trip since it will be my first time visiting Europe. I know one thing for sure\nthough! That is I&#39;m going to be bringing my camera and do a lot of touristy things.</p>\n<p><strong>I started caring about my health</strong></p>\n<p>Ever since start of uni, my fitness has dropped and I gained quite a few circles around my waist. I\nam in the process of getting rid of my bad habit of skipping breakfast and made it my goal to have\nbreakfast every day. I am also getting into the rhythm of heading to the gym at least twice a week.</p>\n<p>Boy, I really need change my sleeping patterns but I will start with fitness and eating healthy.\nBaby steps right?</p>\n<p><strong>I started networking more</strong></p>\n<p>My new job has given me the opportunity to meeting a lot more people, this also has allowed me to\nboth form new circles and extend my existing ones. I caught up with my former colleagues over lunch\na couple times already this year and not &quot;burning bridges&quot; is something I&#39;m trying very hard to\navoid. I am slowly working through my list to catch up with friends but time is hard to come by.</p>\n<p><strong>I started giving back to loved ones</strong></p>\n<p>This has been something I wanted to do for a long time but never have the time nor the opportunity\nto execute it. Until now. Last month I invited my dad and my grandmother over from China for a short\nholiday, they have never left China before and being able to visit Australia is definitely something\non their bucket list. I took some times off from work and showed them around the state and also got\nthem on a trip to Cairns (even I have not been to Cairns myself)!</p>\n<p><img src=\"/media/appiness.jpg\" alt=\"Appiness\"></p>\n<p><strong>I started participating in philanthropy work</strong></p>\n<p>Normal fund raisers and charity events just doesn&#39;t cut it for me so I decided that I want to use my\nskills for social good. I am currently participating in Aspirations program mentoring high school\nstudents, helping them to get exposure to the modern workforce and build their confidences before\ncompleting their HSC. Another event was through work where we are helping out United Way of\nAustralia and their ReadLearnSucceed program. I am creating a great dashboard to track their\nprograms progress in difference communities.</p>\n<p>And finally something I am very proud of is participating in a Charity hackathon. My team and I\nrepresented the RSL to build a mobile app that aims at raising awareness and drive donation to the\nANZAC cause. The final product came out suprisingly well and we ended up taking <a href=\"https://www.telstracrowdsupport.com/t5/SYDNEY-APPINESS-HACKATHON/Sydney-Hackathon-Winners-announced/ba-p/161076\">first place</a>! Go\nTeam Poppy!</p>\n<p>I think 2013 has been great already and the rest of 2013 is only going to go uphill from here. This\nis all I have for now. See ya at the next checkpoint!</p>\n",
      "content_text": "A mid-year reflection on 2013. Taking stock of progress, challenges, and lessons learned in the first half of the year.",
      "summary": "A mid-year reflection on 2013. Taking stock of progress, challenges, and lessons learned in the first half of the year.",
      "date_published": "2013-06-15T07:55:25.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "reflection",
        "update"
      ]
    },
    {
      "id": "https://hbish.com/decisions/",
      "url": "https://hbish.com/decisions/",
      "title": "Decisions",
      "content_html": "<blockquote>\n<p>There comes a time when the world gets quiet and the only thing left is your own heart. So you&#39;d\nbetter learn the sound of it. Otherwise you&#39;ll never understand what it&#39;s saying.</p>\n<p><small>Sarah Dessen, <cite title=\"Just Listen\">Just Listen</cite></small></p>\n</blockquote>\n<p>The quote above from Sarah Dessen&#39;s Just Listen has resonated with me ever since I saw it. As I\napproached my graduation I saw myself making a very important choice, career wise. The decision was\nfar from what I had originally imagined. I ultimately gave up a job offer I know I would thoroughly\nenjoy and opting in for a graduate position at a very reputable investment bank.</p>\n<p><img src=\"/media/bye.jpg\" alt=\"Goodbye\"></p>\n<p>Now, I cannot say whether I have made the right decision. I think there is no point in speculating\nas to what &quot;would have happened&quot; or if I would be &quot;better-off&quot; with the other job offer. Thinking\nback I realised at the time something, somehow has tempted me into moving and all the noise and\ndoubt has clouded why I made the choice in the first place.</p>\n<p>That is... <strong>to use the opportunity as a platform for change and diversify my experiences</strong>.</p>\n<p>Nearly a year down the track, the result of that very decision has brought me to where I am today. I\nlearnt a great deal about the investment industry; I met a great bunch of talented people, many of\nwhich are graduates just like myself; I learnt about discipline and how to work as a professional; I\npushed myself out of the comfort zone of being stuck in a dev heavy environment and really working\ntowards being a well-rounded person.</p>\n",
      "content_text": "When the world gets quiet and only your heart remains. Reflections on making life-changing decisions and listening to your inner voice.",
      "summary": "When the world gets quiet and only your heart remains. Reflections on making life-changing decisions and listening to your inner voice.",
      "date_published": "2013-06-12T07:53:33.000Z",
      "author": {
        "name": "Ben Shi"
      },
      "tags": [
        "career",
        "decisions",
        "job",
        "reflection"
      ]
    }
  ]
}