requiem for effective engineering (2022.12 mixtape)
- Spotify: https://open.spotify.com/playlist/1Rrhziva29xypzeZM80SKc?si=14d809146ae448d0
- YouTube: https://www.youtube.com/playlist?list=PLSUh6oJ5ZotXfSaWywi-bZqNKAsfApbX1
4h9m
4h9m
I was a Staff Engineer at Twitter’s Build/Bazel Migration team. After two incredible years, November 17 was my last day (I took the voluntary separation offer and resigned, not that it matters). Twitter has been a special place to work for, for its culture of excellence, diversity, and outpouring of care for all the people that made Flock the Flock. I am grateful that I got the opportunity to experience that firsthand, and be part of it.

Here’s a quick retrospective on my last two years. Info available here are based on publicly available talks and data. Just from our team 10+ members left Twitter after the buyout, so I’ve sprinkled this post with links to their LinkedIn profiles both current and former.
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.8.0. This is the eighth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.8.0-RC1. This is the eighth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.
sbt 1.8.0 is a small release focused on upgrading scala-xml to 2.x. In theory this breaks the binary compatibility in the plugin ecosystem, but in practice there’s already a mixture of both 1.x and 2.x.
If you encounter a conflict in plugins, try putting the following in project/plugins.sbt:
ThisBuild / libraryDependencySchemes += "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always
I’m happy to announce sbt 1.7.3 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.7.3
See 1.7.0 release note for the details on 1.7.x features.
I’m happy to announce sbt 1.7.2 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.7.2
See 1.7.0 release note for the details on 1.7.x features.
testQuick task #6903 by @gontardsbt new by default to use Giter8 0.15.0diagnosticCode and diagnosticRelatedInforamation (sic) to InterfaceUtil.problem(...) #7006 by @ckipp01diagnosticCode to BSP #6998 by @ckipp014h2m
I’m happy to announce sbt 1.7.1 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.7.1
See 1.7.0 release note for the details on 1.7.x features.
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.7.0. This is the seventh feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.
Download the official sbt runner from cs setup, SDKMAN, or download from https://github.com/sbt/sbt/releases/tag/v1.7.0.
The sbt version used for your build is upgraded by putting the following in project/build.properties:
sbt.version=1.7.0
This mechanism allows that sbt 1.7.0 is used only for the builds that you want.
scopt 4.1.0 is released. To try new scopt 4.1.0:
libraryDependencies += "com.github.scopt" %% "scopt" % "4.1.0"
scopt 4.1.0 is cross published to the following build matrix:
| Scala Version | JVM | JS (1.x) | JS (0.6.x) | Native (0.4.x) |
|---|---|---|---|---|
| 3.x | ✅ | ✅ | n/a | ✅ |
| 2.13.x | ✅ | ✅ | ✅ | ✅ |
| 2.12.x | ✅ | ✅ | ✅ | ✅ |
| 2.11.x | ✅ | ✅ | ✅ | ✅ |
scopt is a little command line options parsing library. See https://eed3si9n.com/scopt4 or readme for the details on how to use scopt.
3h53m
I released Eval 0.1.0. Eval evaluates Scala 3 code. It’s a Scala 3 port of Eval class used in sbt.
package example
import com.eed3si9n.eval.Eval
import com.eed3si9n.eval.EvalReporter
import java.nio.file.Paths
@main def main(): Unit =
val eval = Eval(
backingDir = Paths.get("/tmp/classes"),
mkReporter = () => EvalReporter.store
)
val result = eval.evalInfer("2")
println(result.tpe)
println(result.getValue(this.getClass.getClassLoader))
The above prints:
Int
2
Jar Jar Abrams 1.8.1 and sbt-assembly 1.2.0 are released.
Jar Jar Abrams is an experimental extension to Jar Jar Links, intended to shade Scala libraries.
sbt is simple, in a sense that it has a few concepts like settings and tasks, and it achieves a wide variety of things. An idea popped into my head today that could simplify sbt further. I don’t have an implementation on this yet.
I’m happy to announce sbt 1.6.2 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.6.2
See 1.6.0 release note for the details on 1.6.x features.
In the context of sbt, Bazel, and likely many other build tools, the term test could encompass various levels, and it’s useful to disamgibuate this, especially when we want to configure pre- and post-hooks and parallel execution. In other words, what do we mean when we say “test”?
There are four levels to test:
The top-most level is the test command that the build tools provide to the users.
I’m happy to announce sbt 1.6.1 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.6.1
See 1.6.0 release note for the details on 1.6.x features.
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.6.0. This is the sixth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.
The headline features of sbt 1.6.0 are:
I’m happy to announce sbt 1.5.8 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.5.8
Hi everyone. On behalf of the sbt project, I am happy to announce sbt 1.6.0-RC2. This is the sixth feature release of sbt 1.x, a binary compatible release focusing on new features. sbt 1.x is released under Semantic Versioning, and the plugins are expected to work throughout the 1.x series. Please try it out, and report any issues you might come across.
The headline features of sbt 1.6.0 are:
I’m happy to announce sbt 1.5.7 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.5.7
I’m happy to announce sbt 1.5.6 patch release is available. Full release note is here - https://github.com/sbt/sbt/releases/tag/v1.5.6
I’m hacking on a small project called sudori, an experimental sbt. The initial goal is to port the macro to Scala 3. It’s an exercise to take the macro apart and see if we can build it from the ground up. This an advanced area of Scala 2 and 3, and I’m finding my way around by trial and error. This is part 3.
It’s been a while since I wrote part 2, but in between I’ve written intro to Scala 3 macros, which is sort of a sudori prequel.
Starlark is a dialect of Python, originally designed as a configuration language for the Bazel build tool. Currently there are implementations in Go, Java, and Rust. As far as I know, the main Java implementation of Starlark has only been available as Bazel’s source repo on GitHub.
Since it would be convenient to have a binary distribution, I’ve forked the repo, and published it as "com.eed3si9n.starlark" % "starlark" % "4.2.1" (com.eed3si9n.starlark:starlark:4.2.1) on Maven Central. The code is the same as Bazel 4.2.1.
Here’s a quick tutorial of how to test your project on JDK 17 using Ólaf’s olafurpg/setup-scala. As the starting point we’ll use the following setup, which is documented in Setting up GitHub Actions with sbt:
name: CI
on:
pull_request:
push:
jobs:
test:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
java: 11
jobtype: 1
- os: ubuntu-latest
java: 11
jobtype: 2
- os: ubuntu-latest
java: 11
jobtype: 3
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Setup
uses: olafurpg/setup-scala@v13
with:
java-version: "adopt@1.${{ matrix.java }}"
- name: Build and test
run: |
case ${{ matrix.jobtype }} in
1)
sbt -v "mimaReportBinaryIssues; scalafmtCheckAll; +test;"
;;
2)
sbt -v "scripted actions/*"
;;
3)
sbt -v "dependency-management/*"
;;
*)
echo unknown jobtype
exit 1
esac
shell: bash
Let’s say for jobtype 3 we’d like to use JDK 8, and for jobtype 1 and 2 we’d like to test on JDK 17. sbt-ci-release uses jabba to grab the JDKs, and at the moment the openjdk 17.0 distros are not available on jabba yet. However, Eclipse Adoptium fka AdoptOpenJDK does have the binary available, so we can use the custom JDK mode to use it as follows:
Macro is a fun and powerful tool, but overuse of the macro could cause harm as well. Please enjoy macros responsibly.
What is macro? A common explanation given is that a macro is a program that is able to take code as an input and output code. While it’s true, it might not immediately make sense since Scala programmers are often familiar with higher-order functions like (map {...}) and by-name parameter, which on the surface it might seem like it is passing a block of code around.