56,966 blogs · [ { "id": "01a0879a-d35f-713c-802e-945f69283247", "title": "Joining AMI to work on World Models", "url": "http://www.lihaoyi.com/post/JoiningAMItoworkonWorldModels.html", "published_at": "2026-08-29T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f6870d43b", "title": "Golden Literal Testing in uTest 0.9.0", "url": "http://www.lihaoyi.com/post/GoldenLiteralTestinginuTest090.html", "published_at": "2025-07-30T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f683b2ea4", "title": "12 years of the com.lihaoyi Scala Platform", "url": "http://www.lihaoyi.com/post/12yearsofthecomlihaoyiScalaPlatform.html", "published_at": "2024-06-09T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f677bb768", "title": "ScalaSql: a New SQL Database Query Library for the com-lihaoyi Scala Ecosystem", "url": "http://www.lihaoyi.com/post/ScalaSqlaNewSQLDatabaseQueryLibraryforthecomlihaoyiScalaEcosystem.html", "published_at": "2024-01-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f67530ed9", "title": "So, What's So Special About The Mill Scala Build Tool?", "url": "http://www.lihaoyi.com/post/SoWhatsSoSpecialAboutTheMillScalaBuildTool.html", "published_at": "2023-09-18T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f66d10341", "title": "com.lihaoyi Scala: Executable Pseudocode that's Easy, Boring, and Fast", "url": "http://www.lihaoyi.com/post/comlihaoyiScalaExecutablePseudocodethatsEasyBoringandFast.html", "published_at": "2023-06-11T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f6611f76c", "title": "How I Self-Published My First Technical Book", "url": "http://www.lihaoyi.com/post/HowISelfPublishedMyFirstTechnicalBook.html", "published_at": "2021-12-13T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f65ac0db2", "title": "Reflecting on Four Years at Databricks", "url": "http://www.lihaoyi.com/post/ReflectingonFourYearsatDatabricks.html", "published_at": "2021-09-25T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f652d5031", "title": "Introducing the com-lihaoyi Github Organization", "url": "http://www.lihaoyi.com/post/IntroducingthecomlihaoyiGithubOrganization.html", "published_at": "2021-02-23T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f643bc325", "title": "From First Principles: Why Scala?", "url": "http://www.lihaoyi.com/post/FromFirstPrinciplesWhyScala.html", "published_at": "2021-02-05T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f63fbb5df", "title": "Message-based Parallelism with Actors", "url": "http://www.lihaoyi.com/post/MessagebasedParallelismwithActors.html", "published_at": "2020-12-02T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f63395b1d", "title": "The Death of Hype: What's Next for Scala", "url": "http://www.lihaoyi.com/post/TheDeathofHypeWhatsNextforScala.html", "published_at": "2020-04-10T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f62445bd4", "title": "Standardizing IO Interfaces for Scala Libraries", "url": "http://www.lihaoyi.com/post/StandardizingIOInterfacesforScalaLibraries.html", "published_at": "2019-12-28T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f61825dda", "title": "Beyond Liskov: Type Safe Equality in Scala", "url": "http://www.lihaoyi.com/post/BeyondLiskovTypeSafeEqualityinScala.html", "published_at": "2019-12-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f608c4974", "title": "How an Optimizing Compiler Works", "url": "http://www.lihaoyi.com/post/HowanOptimizingCompilerWorks.html", "published_at": "2019-11-09T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5fe46599", "title": "Working with Databases using Scala and Quill", "url": "http://www.lihaoyi.com/post/WorkingwithDatabasesusingScalaandQuill.html", "published_at": "2019-10-09T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5f33f11e", "title": "Scraping Websites using Scala and Jsoup", "url": "http://www.lihaoyi.com/post/ScrapingWebsitesusingScalaandJsoup.html", "published_at": "2019-09-28T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5ebe4d56", "title": "Simple Web and Api Servers with Scala", "url": "http://www.lihaoyi.com/post/SimpleWebandApiServerswithScala.html", "published_at": "2019-09-21T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5e2e1b43", "title": "Build your own Programming Language with Scala", "url": "http://www.lihaoyi.com/post/BuildyourownProgrammingLanguagewithScala.html", "published_at": "2019-09-11T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5d33856c", "title": "Easy Parallel Programming with Scala Futures", "url": "http://www.lihaoyi.com/post/EasyParallelProgrammingwithScalaFutures.html", "published_at": "2019-09-03T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5ca74e85", "title": "How to create Build Pipelines in Scala", "url": "http://www.lihaoyi.com/post/HowtocreateBuildPipelinesinScala.html", "published_at": "2019-08-02T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5c214c51", "title": "How to work with JSON in Scala", "url": "http://www.lihaoyi.com/post/HowtoworkwithJSONinScala.html", "published_at": "2019-06-26T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5b65bea2", "title": "How to work with HTTP JSON APIs in Scala", "url": "http://www.lihaoyi.com/post/HowtoworkwithHTTPJSONAPIsinScala.html", "published_at": "2019-06-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5aa4becf", "title": "How to work with Subprocesses in Scala", "url": "http://www.lihaoyi.com/post/HowtoworkwithSubprocessesinScala.html", "published_at": "2019-06-06T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5aa4968a", "title": "How to work with Files in Scala", "url": "http://www.lihaoyi.com/post/HowtoworkwithFilesinScala.html", "published_at": "2019-06-02T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5aa3a5d2", "title": "Compact, Streaming Pretty-Printing of Hierarchical Data", "url": "http://www.lihaoyi.com/post/CompactStreamingPrettyPrintingofHierarchicalData.html", "published_at": "2018-12-29T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f59b9e8b4", "title": "Automatic Binary Serialization in uPickle 0.7", "url": "http://www.lihaoyi.com/post/AutomaticBinarySerializationinuPickle07.html", "published_at": "2018-11-19T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f59256ad9", "title": "Fastparse 2: Even Faster Scala Parser Combinators", "url": "http://www.lihaoyi.com/post/Fastparse2EvenFasterScalaParserCombinators.html", "published_at": "2018-10-18T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f58eed6e3", "title": "Zero-Overhead Tree Processing with the Visitor Pattern", "url": "http://www.lihaoyi.com/post/ZeroOverheadTreeProcessingwiththeVisitorPattern.html", "published_at": "2018-05-26T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f58a73e4a", "title": "How To Drive Change as a Software Engineer", "url": "http://www.lihaoyi.com/post/HowToDriveChangeasaSoftwareEngineer.html", "published_at": "2018-04-25T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f57ce10bd", "title": "uJson: fast, flexible and intuitive JSON for Scala", "url": "http://www.lihaoyi.com/post/uJsonfastflexibleandintuitiveJSONforScala.html", "published_at": "2018-03-31T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5747e996", "title": "Mill: Better Scala Builds", "url": "http://www.lihaoyi.com/post/MillBetterScalaBuilds.html", "published_at": "2018-02-22T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f56deb44e", "title": "Build Tools as Pure Functional Programs", "url": "http://www.lihaoyi.com/post/BuildToolsasPureFunctionalPrograms.html", "published_at": "2018-01-16T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f56c204b2", "title": "So, what's wrong with SBT?", "url": "http://www.lihaoyi.com/post/SowhatswrongwithSBT.html", "published_at": "2017-11-19T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f56717ac1", "title": "FastParse 1.0: Past, Present & Future", "url": "http://www.lihaoyi.com/post/FastParse10PastPresentFuture.html", "published_at": "2017-10-14T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f559ef23b", "title": "uTest: the Essential Test Framework for Scala", "url": "http://www.lihaoyi.com/post/uTesttheEssentialTestFrameworkforScala.html", "published_at": "2017-09-21T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5578e102", "title": "How to conduct a good Programming Interview", "url": "http://www.lihaoyi.com/post/HowtoconductagoodProgrammingInterview.html", "published_at": "2017-08-30T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f54861bcd", "title": "Scala Vector operations aren't \"Effectively Constant\" time", "url": "http://www.lihaoyi.com/post/ScalaVectoroperationsarentEffectivelyConstanttime.html", "published_at": "2017-08-08T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f539fca18", "title": "Principles of Automated Testing", "url": "http://www.lihaoyi.com/post/PrinciplesofAutomatedTesting.html", "published_at": "2017-07-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f52cffea4", "title": "Scala Scripting: Getting to 1.0", "url": "http://www.lihaoyi.com/post/ScalaScriptingGettingto10.html", "published_at": "2017-06-13T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f5208fcb4", "title": "Warts of the Scala Programming Language", "url": "http://www.lihaoyi.com/post/WartsoftheScalaProgrammingLanguage.html", "published_at": "2017-05-27T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f51aa5fca", "title": "Re-imagining the Online Code Explorer", "url": "http://www.lihaoyi.com/post/ReimaginingtheOnlineCodeExplorer.html", "published_at": "2017-03-03T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f50ec348f", "title": "What's Functional Programming All About?", "url": "http://www.lihaoyi.com/post/WhatsFunctionalProgrammingAllAbout.html", "published_at": "2017-01-25T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f50438a2e", "title": "Implicit Design Patterns in Scala", "url": "http://www.lihaoyi.com/post/ImplicitDesignPatternsinScala.html", "published_at": "2016-12-26T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4f48ce9d", "title": "Old Design Patterns in Scala", "url": "http://www.lihaoyi.com/post/OldDesignPatternsinScala.html", "published_at": "2016-11-29T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4f054c32", "title": "Benchmarking Scala Collections", "url": "http://www.lihaoyi.com/post/BenchmarkingScalaCollections.html", "published_at": "2016-09-29T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4e52eb69", "title": "Easy Parsing with Parser Combinators", "url": "http://www.lihaoyi.com/post/EasyParsingwithParserCombinators.html", "published_at": "2016-09-08T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4e24052e", "title": "From first principles: Why I bet on Scala.js", "url": "http://www.lihaoyi.com/post/FromfirstprinciplesWhyIbetonScalajs.html", "published_at": "2016-08-10T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4df7cc7b", "title": "Scala Scripting and the 15 Minute Blog Engine", "url": "http://www.lihaoyi.com/post/ScalaScriptingandthe15MinuteBlogEngine.html", "published_at": "2016-07-30T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4d8cecef", "title": "Build your own Command Line with ANSI escape codes", "url": "http://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html", "published_at": "2016-07-02T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4ca735d1", "title": "Strategic Scala Style: Designing Datatypes", "url": "http://www.lihaoyi.com/post/StrategicScalaStyleDesigningDatatypes.html", "published_at": "2016-06-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4beda1b3", "title": "Micro-optimizing your Scala code", "url": "http://www.lihaoyi.com/post/MicrooptimizingyourScalacode.html", "published_at": "2016-05-30T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4bcd5dbe", "title": "Strategic Scala Style: Practical Type Safety", "url": "http://www.lihaoyi.com/post/StrategicScalaStylePracticalTypeSafety.html", "published_at": "2016-04-30T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4b00d23f", "title": "Planning Bus Trips with Python & Singapore's Smart Nation APIs", "url": "http://www.lihaoyi.com/post/PlanningBusTripswithPythonSingaporesSmartNationAPIs.html", "published_at": "2016-03-31T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4a282787", "title": "Diving Into Other People's Code", "url": "http://www.lihaoyi.com/post/DivingIntoOtherPeoplesCode.html", "published_at": "2016-03-15T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f4993e365", "title": "What's in a Build Tool?", "url": "http://www.lihaoyi.com/post/WhatsinaBuildTool.html", "published_at": "2016-03-04T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f49177f65", "title": "Strategic Scala Style: Conciseness & Names", "url": "http://www.lihaoyi.com/post/StrategicScalaStyleConcisenessNames.html", "published_at": "2016-02-22T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f47cb4529", "title": "Strategic Scala Style: Principle of Least Power", "url": "http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html", "published_at": "2016-02-14T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f48801034", "title": "Talks I've Given", "url": "http://www.lihaoyi.com/post/TalksIveGiven.html", "published_at": "2016-02-14T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f475e22d2", "title": "Code Reviewing My Earliest Surviving Program", "url": "http://www.lihaoyi.com/post/CodeReviewingMyEarliestSurvivingProgram.html", "published_at": "2016-01-08T00:00:00+00:00" }, { "id": "01a0879a-d35f-713c-802e-945f468c3c89", "title": "Hello World Blog", "url": "http://www.lihaoyi.com/post/HelloWorldBlog.html", "published_at": "2016-01-07T00:00:00+00:00" } ] posts Claim your blog
Back to lihaoyi.com
Blog · corpus.blog/blogs/lihaoyi.com/posts

lihaoyi.com

lihaoyi.com

2026

2025

2024

2023

2021

2020

2019

2018

2017

2016