• 2025-10-13 : Lateral joins

    Lately I’ve been making use of lateral joins, which simplify (and in some cases optimize) a few common query patterns. Lateral joins are joins where the right side of a join can reference columns ...

  • 2025-08-21 : Will AI replace programmers?

    There has been a lot of doom and gloom about software development in recent years. Computer science, long one of the most in-demand majors in the job market, is seeing above-average unemployment ra...

  • 2025-06-20 : Building Postgres on macOS

    I recently decided to check out Postgres hacking, and ran into a few issues when trying to build on an ARM Mac. The basic three-step of: ./configure make make check each has a problem that needs...

  • 2025-06-19 : Finding when a line was deleted

    git blame is a very useful tool for finding out when a line in a file was added or changed. I mostly use it through Magit, and it’s helped identify when a regression was introduced on many occasion...

  • 2025-06-16 : What Actually Destroys Employment: A Multifaceted Analysis

    Employment destruction is a complex issue driven by technological advancements, economic imbalances, and structural changes in industries. While technology is often cited as the primary culprit, it...

  • 2025-05-31 : Compile-time vs. runtime with C++ templates

    I’ve been brushing up on C++ via the excellent Learn C++ online resource, and found templates to be one of the most interesting aspects of the language1. Templates are C++’s implementation of gene...

  • 2025-04-04 : SQL query planning

    I’ve been working my way through The Red Book, a reference collection of seminal database papers with commentary by the most prominent researchers of the past few decades. One of the most interesti...

  • 2025-03-01 : Generating classes in Clojure

    I rarely use the gen-class facility in Clojure, but when I do, I usually trip over one issue or another. After finally spending some time to read the documentation and peruse source code, I’ve got ...

  • 2025-02-06 : Better angels of our tariffs

    President Trump’s recent announcement of 25% tariffs on Canada and Mexico (and 10% additional levies on China) has set off apoplectic reactions from the financial press. The Wall Street Journal bla...

  • 2024-12-12 : All the wrong numbers

    One commonly cited reason for the Democrats’ defeat in the latest election is the poor economy. In the lead-up to the vote, 90% of voters rated candidates’ economic positions as “very important” or...

  • 2024-11-15 : The price of incoherence

    Donald Trump’s decisive victory in the 2024 elections capped a long redemption arc that began with his defeat in 2020. After 2016 the Democrats had written him off as a morbid curiosity and the pro...

  • 2024-10-08 : The many definitions of retirement

    As the global population ages, the dependency ratio, i.e. number of elderly relative to the working-age population, rises inexorably. This has led many governments to forecast severe shortfalls in ...

  • 2024-08-11 : The ultimate rerun

    In this election year, illegal immigration has once again cropped up as one of voters’ top concerns. Through fiscal 2023, 3.2 million illegal aliens are reported to have entered the country. Even t...

  • 2024-07-08 : Virtual threads

    Java 21 saw virtual threads, which is part of the concurrency-focused Project Loom, graduate to platform release. I decided to check it out and learned a few things about Java concurrency along th...

  • 2024-06-22 : No children of men

    The decline of global fertility has been a persistent phenomenon for several decades, yet every once in a while media loves to make new hay about it. In 2014 we saw stories about how South Koreans...

  • 2024-05-31 : Does debt matter?

    Rising global debt has been a problem for decades. The IMF recently noted that debt has again risen in 2023. A decline in 2022 was due to an arithmetic effect–as countries returned to norma...

  • 2024-04-07 : Poverty and disorder

    In the minds of many, poverty is the source of all sins. Problems as diverse as violent crime, drug abuse, mental illness, and divorce are all laid at the feet of poverty. This single explanation ...

  • 2023-10-04 : Stack ranking and decimation

    Earlier this year, Blizzard's World of Warcraft Classic development lead Brian Birmingham was terminated over protesting the practice of stack ranking. Stack ranking, pioneered by legendary GE CEO...

  • 2023-04-10 : Whiplash and the cult of sacrifice

    One of my favorite films of recent years is Whiplash, the directorial debut of Damien Chazelle. It's about a jazz drummer student's obsession with becoming the next "great" like Charlie Parker and...

  • 2023-03-08 : Semantic vs. date versioning

    A very popular versioning scheme in software development is semantic versioning (semver), in which versions take a MAJOR.MINOR.PATCH format. These elements have the following semantics: MAJOR v...

  • 2022-10-18 : Putin's political constraints

    When Russia began its military buildup on the Ukrainian border from late 2021 to early 2022, the United States loudly and publicly warned Ukraine and the Europeans that a full-scale invasion was i...

  • 2022-07-04 : The Sino-Russian delusion

    This July 4th, I originally wanted to write a piece about How Americans Think, but realized that, though I'd been chewing on it for some time, such a broad topic requires a lot more hammock time t...

  • 2022-06-20 : The Identity Stack

    A few years ago Dilbert cartoonist Scott Adams began espousing the idea of a "talent stack", which caught my attention in the context of a sea of attempts to explain then-candidate Donald Trump's ...

  • 2020-11-04 : Après Trump, l'Orban

    The 2020 US presidential election has proven to be a close race, but one which incumbent Donald Trump seems likely to lose. The presumed victor, Joe Biden, will face a GOP-controlled Senate and sl...

  • 2020-08-10 : The decline of black political power

    Protests and riots in the aftermath of George Floyd's death have made "Black Lives Matter" a widely-known public slogan. Social media campaigns quickly arose for people to "show solidarity"1, whil...

  • 2020-06-13 : Cryptography

    Over the past few weeks I've been looking into cryptography, an area of computer science I've not had the chance to explore much before. I decided to start by taking a Coursera specialization on I...

  • 2020-04-25 : Dynamics of insufficient demand

    For most of human history we've dealt with economic problems of insufficient supply. There was never enough land, labor, money, or whatever other resource was necessary for production, leading to ...

  • 2020-03-29 : Coronavirus and globalism

    The Wuhan Coronavirus epidemic that started in China's Hubei province early this year has made its way across Europe and the United States. Countries that seemed to dodge the crisis, like Turkey, ...

  • 2020-01-04 : China vs. India

    For as long as I've paid attention to economics, there have been op-eds comparing India to China, invariably lamenting India's lesser economic development but ending with a flourish of "optimism" ...

  • 2019-12-22 : What's wrong with 996?

    Some months back, a website called 996.ICU caught the Chinese internet by storm, eventually also garnering the attention of Western media. The website, hosted on a GitHub repo that quickly became ...

  • 2019-12-14 : The return of big government

    Republicans love tax cuts, and Donald Trump, being a businessman, was happy to go along with that. The move to reduce corporate tax rates to the middle of the OECD pack was enough to make the US t...

  • 2019-11-22 : Datomic is simple made easy

    I've recently begun evaluating Datomic for a project at work. Though the product has been around for over 7 years, it's the first opportunity I've had to investigate it in depth1. Having had some ...

  • 2019-10-26 : Size and risk taking

    I recently came across news that Ubisoft, the large game publisher, saw its shares tank after poor sales of its latest game. Big publishers and their games coming under withering criticism is n...

  • 2019-09-19 : An adventure in resizing partitions

    Recently I began working with some VirtualBox VMs. My Asus Zenbook, which comes with 256 GB of SSD dual-booted with Windows and Fedora, soon found its Fedora installation aching for more disk spac...

  • 2019-08-22 : The end of PC corporatism

    It's often been said after the Cold War that the left won on the cultural issues and the right on the economic ones. The normalization of rock and roll (devil's music), for example, was a win for ...

  • 2019-07-12 : Is it genius or just plain dumping?

    Uber lost $1 billion the quarter after IPO. Lyft lost $1.1 billion (on far less market share). Didi lost $1.6 billion in 2018, despite having a near-monopoly on the Chinese market, and swiftly ann...

  • 2019-06-07 : The Strange Obsession With 5G

    There's a strange obsession with 5G these days that, as far as I can tell, has little to do with the technology itself. The US is banning not only Huawei 5G equipment but preventing US companies f...

  • 2019-03-01 : The Coming IT Crunch

    The NY Times recently published an article on the surging enrollment in computer science programs at universities across the country. If the numbers are to be believed1, enrollment doubled between...

  • 2018-04-28 : Data Really IS the New Oil

    Google proudly announced in 2017 that they're using 100% renewable energy. Facebook swiftly followed. Ironic, then, that The Economist likened them to oil companies the very same year, popularizin...

  • 2018-04-08 : The Road to Cyber Serfdom

    The technology industry is under attack. While corporations have always been targets of regulations and lawsuits, what's happening today is notable due to the sheer number of directions the attack...

  • 2018-03-16 : Code BEAM 2018

    I've just wrapped up the Code BEAM 2018 conference. This is the renamed Erlang and Elixir Factory, which I'd attended in 2017. The format is exactly the same; it's simply been re-branded to match ...

  • 2018-03-04 : Technology needs genuine diversity

    I've previously written a critique of where technology in general and the tech industry in particular has gone terribly wrong. In short, technology today is focused on wasting the user's time inst...

  • 2018-01-28 : Technology shouldn't waste your time

    Something's rotten with modern technology. Not just the tech industry, with its moralizing SJWs, (apparently) rampant sexual harassers1, and post-parody products2, none of which has anything to do...

  • 2018-01-05 : A look at Julia

    I first came across the Julia programming language while in university, back in 2012. As a math and engineering major, I'd been exposed to MATLAB and R, specialized programming languages focused o...

  • 2017-11-30 : Quantum computing is real

    Tonight I had the pleasure of visiting Rigetti Computing, a quantum computing start-up in Berkeley, for a Lisp at the Frontier of Computation meet-up. While I'm always happy to attend a talk on Li...

  • 2017-09-25 : Augmented reality

    I just went to an augmented reality meetup at the Google Launchpad with a friend. A quick recap of the topics discussed and my own thoughts: Sivan Iram of Lumus presented on waveguide technolog...

  • 2017-09-14 : Too big a language, too small a language

    I've recently been looking into some Lisp classics, namely: Paradigms of Artificial Intelligence Programming (PAIP), by Peter Norvig The Art of the Metaobject Protocol (AMOP), by Kiczales, Riv...

  • 2017-07-13 : Corman Lisp

    I had the pleasure today of attending a Common Lisp / Clojure meetup at Factual SF. The talk was given by Roger Corman, creator of Corman Lisp, on his personal history with Lisps. It was equal par...

  • 2017-06-21 : Success begets success

    "Sports teaches values" is an old (yet true) cliché. Of all the lessons that sports teaches, the most important is perhaps: Success begets success This is a common catch-22 people tend to ...

  • 2017-05-20 : Observations on Ruby

    I recently had to interview a candidate who used Ruby, so I prepared a question and implemented a solution in Ruby. Before I could tackle the problem itself, however, I had to first learn Ruby, a ...

  • 2017-05-06 : Tech is tyrannical

    The Greek philosopher Aristotle believed there were three types of government: One-man rule Monarchy, tyranny Elite rule Oligarchy, aristocracy Mass rule Polity, democracy Though...

  • 2017-04-15 : RSI and the Kinesis

    A few weeks ago, I purchased a Kinesis Advantage II keyboard in an attempt to find a keyboard that could ward off repetitive strain injury (RSI). I'd never paid RSI much thought until I started...

  • 2017-04-08 : Just-in-time education

    Here's a programming metaphor that I just thought of: Our current model of education is ahead-of-time (AOT) education. We should explore just-in-time (JIT) education instead. Just as progr...

  • 2017-03-25 : Java appletviewer

    I had a tough time today trying to view Java applets in the browser. Chrome started deprecating support for NPAPI (the API supporting plugins like Java applets) all the way back in 2013, and Fi...

  • 2017-03-18 : Clojure with-redefs gotcha

    The with-redefs macro in Clojure is one of the most problematic. The description says: binding => var-symbol temp-value-expr Temporarily redefines Vars while executing the body. The tem...

  • 2017-02-25 : Put aside the math

    In my latest attempt to understand what a monad is and why it's useful, I've come much further than previous attempts by doing one thing–putting aside the math. That's right–for t...

  • 2017-02-20 : A good night's sleep

    As I've gotten older, I've begun to increasingly notice the negative impact that poor sleep has on my physical and mental conditions. Physically, poor sleep leads to tiredness and slow reaction...

  • 2017-02-12 : Decompiling Java classfiles in Emacs

    Working with Clojure, I've often run into situations in which I've needed to decompile Java classfiles. This is especially true when working with packages that break backward compatibility1 (I'm l...

  • 2017-02-05 : Are you one of us?

    Interviews are hard for both the interviewer and the interviewee. The interviewee's challenges are well-understood and easy to sympathize with; the interviewer's less so, but are no less serious. ...

  • 2017-01-28 : The rerise of nationalism

    Trump the nationalist The election of Donald Trump and the swiftness with which he has implemented policies has surprised and angered many–primarily those who hadn't a clue what his appea...

  • 2017-01-21 : Prediction vs. analysis

    Since earliest history, mankind has wanted to know what the future holds. Entire civilizations have been built around the ruler's supposed ability to gain insight into future events. Many oracles,...

  • 2017-01-14 : Technology, economics, and law

    There's an interesting observation about machine learning (ML) algorithms: as data and system size increase, choice of algorithm matters less. With large enough data sets, many algorithms have sim...

  • 2017-01-07 : Better is better

    Richard P. Gabriel's Worse is Better is an influential article about why Lisp and its ecosystem, despite many advantages, never became very popular. By the mid-1990's, Lisp Machine manufacturers w...

  • 2017-01-01 : Progress isn't linear

    The best advice I've ever heard regarding success is simply Finish what you start The simplicity is deceiving; sticking with something to the end, however that's defined, is very hard to d...

  • 2016-12-24 : Machine learning and math

    Machine learning is a hot field these days–just about every big company is investing heavily in ML research and development. It's a far cry from the immediate aftermath of the AI winter, a ...

  • 2016-12-17 : Instant gratification

    A feature I really enjoy in CIDER, Emacs' Clojure interactive development environment, is the overlaying1 of evaluation results next to the form being evaluated. Normally, the evaluation result...

  • 2016-12-10 : Collaboration in open source

    The emacs-devel mailing list recently lit up with a new controversy, as it is wont to do from time to time, regarding a proposal for a "portable dumper". Jonathan Corbet kindly wrote up a summary ...

  • 2016-12-03 : Clojure/conj 2016

    I traveled with Funding Circle to Clojure/conj 2016 in Austin, Texas this past week. My first Clojure conference had been Clojure West in Seattle, Washington back in in April 2016, to which I had ...

  • 2016-11-26 : A shallow dive into Erlang

    Concurrency is increasingly important for a simple reason: Moore's Law is reaching its limits. That is, the number of transistors on a processor can no longer double every two years, due to fundam...

  • 2016-11-19 : Coders at work

    I've recently been reading Peter Seibel's Coders at Work, a collection of interviews with some of the best programmers alive today. Having enjoyed Seibel's Practical Common Lisp, I had high expect...

  • 2016-11-12 : The merits of assembly

    Today, I went to a workshop on low-level programming at Bradfield CS, a nontraditional computer science school located in downtown San Francisco. The instructors, Oz and Myles, are sharp people...

  • 2016-11-05 : Laziness and chunking in Clojure

    Surprises with side effects One of Clojure's more surprising behaviors is the interaction between functions like map 1 and functions with side effects2. Let's map a side-effecting function li...

  • 2016-10-29 : The churn of being cutting edge

    One reason that technology is a young man's game1 is that there is constant churn in the sector. Not progress or advancement, necessarily–just rapid change. The only stable technologies are...

  • 2016-10-22 : Beyond programming

    The rise of the DevOps role over the past few years has been meteoric. Entire companies now exist to serve this niche, and, by all accounts, DevOps personnel are in very high demand1. Wikipedia...

  • 2016-10-15 : Different strokes for different folks

    A few months ago, I began working for Funding Circle, an online marketplace for small business loans. It's been an interesting experience, but a big culture shock in terms of the company's approac...

  • 2016-10-08 : Do it yourself

    For the past few days I've been reading Paul Graham's classic On Lisp, a book I've wanted to read for a long time but, until now, lacked both the Common Lisp chops to understand it and the time to...

  • 2016-10-01 : The mythical software engineer

    Revisiting The Mythical Man Month recently, I am reminded of a bygone era in software development: an era in which documents were carefully formatted, ties were worn, and people who wrote software...

  • 2016-09-24 : Don't be a hacker

    I've recently been working on improving the help functions for Emacs (e.g. describe-variable). The particular file I've been looking at is [[https://github.com/emacs-mirror/emacs/blob/master/lisp/...

  • 2016-09-17 : JVM garbage collection

    Now that I'm programming Clojure professionally, I wanted to learn more about Java and the JVM. Much of the work we do involves Java interop with third-party libraries. Creating thin wrappers a...

  • 2016-09-10 : StumpWM

    Tiling window managers (WMs) are beloved by hackers everywhere. Not being a hacker, I never paid them much attention, but my experience with the Haskell-based XMonad a while back was positive enou...

  • 2016-09-03 : WiFi passwords--or, why Linux is a hassle

    I recently had to reconnect to a wireless network that I have not connected to in a long time. Fortunately, though I had long forgotten the password, the computer still remembered it. Not wanting ...

  • 2016-08-26 : Batteries, the next frontier

    I recently purchased a 13-inch ASUS UX305FA ultrabook. I've long had an ASUS G75VX, a 17-inch gaming laptop which also serves as a phenomenal workstation replacement, but I've become convinced tha...

  • 2016-08-20 : Self-driving cars and local economies

    Over the past few days, I have been driving from Madison, WI to Fremont, CA–a journey of over 2,100 miles. I am writing this from a motel room near Reno, NV, though I will have finished my ...

  • 2016-08-12 : Crowdfunding and open-source

    Open-source ideals Many software developers idealize "open-source"1 software. Software that is open-source is considered higher-quality, more trustworthy, and even morally superior. I tend to...

  • 2016-08-06 : Holding the line

    Monday, August 1st was my last day at my current job. I've worked at Epic for just over three years, and it's time to move on to other opportunities. I may write up a summary of my experiences ...

  • 2016-07-30 : Category theory

    As I've been learning some Haskell with the excellent Learn You a Haskell for Great Good!, I've come across category theory, which is the theoretical mathematical foundation of Haskell, in much th...

  • 2016-07-23 : Haskell vs. practical languages

    The Functional Programming in Scala course I'm taking from Coursera has stimulated a (renewed) interest in Haskell. For lovers of functional programming, Haskell is the language other functiona...

  • 2016-07-16 : Reactive programming

    I'm currently taking the Functional Programming in Scala course from Coursera, which covers a bit of functional reactive programming (FRP). While the course is excellent overall, the material on f...

  • 2016-07-09 : Property-based testing

    I've recently been introduced to property-based testing, which takes a different approach to testing programs than the better-known unit tests. With unit tests, the programmer must come up with...

  • 2016-07-02 : Pattern matching

    I've long had a vague idea of what pattern matching is, but never really appreciated why it is a desirable feature in programming languages. We recently covered the topic of pattern matching in th...

  • 2016-06-21 : Functional programming in Scala

    I recently signed up for the Functional Programming Principles in Scala specialization on Coursera. Learning from Martin Odersky, an expert in the field of functional programming (and the creator ...

  • 2016-06-18 : Starting Emacs from IntelliJ IDEA

    I'm a big Emacs user, but Emacs is still not up to par with "real IDEs" when it comes to doing project configuration, code analysis, refactoring, etc., which take up much more time than text editi...

  • 2016-06-11 : It's good to be lazy

    As part of my attempt to introduce good programming practices to my team at work, I created a presentation on good API design. It draws heavily on material covered by Parse CTO Kevin Lacker's talk...

  • 2016-06-04 : Why functional languages are great

    Functional programming languages are great. As a math major, I'm used to functions never having side effects. In a functional programming language, inputs and outputs are explicit–there's n...

  • 2016-05-30 : Basics of an LLC

    Taking John Sonmez's advice on treating your career like a personal business, I have been researching LLCs and some basic information on setting them up. 1 What are LLCs? LLCs, or limited-lia...

  • 2016-05-29 : The 70/30 rule

    I recently came across SimpleProgrammer.com, a blog by John Sonmez providing advice for working programmers on improving both their professional and non-professional lives. John also has a YouTube...

  • 2016-02-13 : The problem with tutorials

    An issue I've noticed is that, with technology in particular, students are taught the wrong way to do things before they are taught the right way. Then they are expected to do things "the right wa...

  • 2016-02-09 : Default editor in GNOME

    Here's a quick tip: you can change the default text editor in GNOME (and likely any Free Desktop) by creating a defaults.list file in ~/.local/share/applications/. I'm using Emacsclient through...

  • 2016-02-05 : Split PDF files by bookmarks

    Sejda is a Java library and command line utility for manipulating PDF files. It's the best solution I've been able to find for a free, CLI utility that can split PDF documents by bookmarks. The...

  • 2016-02-03 : Getting an Apress subscription

    Recently, I purchased an Apress Access subscription for $199.00. It's a pretty steep price for subscribing to a single publisher, but I bit the bullet for several reasons: Apress publishes soli...

  • 2016-01-22 : Software as a team sport

    A major difference between working on projects at school and at work is that work projects compel you to understand that software development is a team sport. As with any team sport, it's impor...

  • 2016-01-20 : To understand anything

    Working on a large codebase is hard. The only way that our monkey brains can handle the task of understanding tens (if not hundreds) of thousands of lines of code is by breaking it down into small...

  • 2013-02-23 : Using WordPress to power your entire website

    Until yesterday, I had my blog set up at the subdomain www.blog.tianxiangxiong.com, but nothing at the site root, www.tianxiangxiong.com. However, this subdomain simply pointed to the files at my s...

  • 2012-10-05 : Being too clever with LaTeX files

    After several years of using LaTeX for various reports and lab write-ups, I feel that I've got a pretty comfortable set-up going. This is a far-cry from freshman year, when I spent entire nights in...

  • 2012-05-17 : Using Python with Emacs

    After trying to build my website using HTML, PHP, and the Bluefish Editor for a while, I decided to learn to use a modern web application framework. Of the two popular choices I know of, Django an...

  • 2012-04-30 : Syntax highlighting on Wordpress.org blog

    Syntax highlighting on Wordpress.org blog requires a plug-in, while syntax highlighting on Wordpress.com is built-in. Different plug-ins use different methods for highlighting code. Some use the p...

  • 2012-04-25 : Migrating to a new host, twice in a week

    A few days ago, I had migrated my blog from Wordpress.com to my personal domain. I used 000webhost.com as my free host. Since my experience with them was not at all positive, I won't post a link he...

  • 2012-04-19 : Getting the latest version of TeXLive on Fedora 16

    In line with Fedora's (and many other Linux distributions') design philosophy, all installed packages should be managed centrally through yum. This is great in principal, because it allows all soft...

  • 2012-04-19 : Customizing Gnome 3.2 on Fedora 16

    Here are some useful extensions to improve your Gnome 3.2 experience. All extensions can be found at https://extensions.gnome.org/ Alternative Status Menu (by gcampax) Replaces GNOME Shell Status...

  • 2012-04-08 : Getting Dell WLAN 1397 Wireless card to work with Fedora 16

    So I decided to dual-boot my computer with Linux. I've been mildly aware of wireless card problems with Linux before, but I never would have thought that it would be this difficult to get things to...

  • 2011-07-16 : Getting Started with WinForms in C++/CLI

    Opening a new Visual C++ WinForms project, the first object we see is the designer, which represents a blank form. The designer can be used to add/delete controls, move controls around, and change ...

  • 2011-07-16 : Using .ico files in Visual Studio 2008

    Today I was putting the finishing touches on my little Student RecordKeeper project when I ran into a very peculiar problem. I had set an ErrorProvider object to show a star icon for several textbo...

  • 2011-06-30 : Fun with Windows Forms

    I'll be using this blog to record my progress in building a Schedule/Grade Recorder using WinForms in C++/CLI. I have been working on this project for 3 weeks and it has been both a frustrating an...