Skip to main content

How I work: The Tools I Use

·882 words·5 mins

From time to time I get a question of what tools I use for what jobs. Here the tools I use to get things done:

Language Specific #

PurposeC++PythonJuliaRust
Compiler/Interpetergcc/clangpython:quick,ipython:longjuliarustc,cargo
Profilerperf/FlameGraphs + perftracecprofile:function, line_profiler:lineBenchmarkTools.jlcargo
DebuggerGDB + mpigdb*c++, pdb*c++ Debugger.jl:default,Cathulu.jl:metaprogramming*c++ rust-gdb
Build SystemCMake,(meson, bazel) + m?? + mPkg.jl, BinaryBuilder.jl + mcargo + m
Sanitizersasan, msan, tsan, ubsan*c++*c++*c++, cargo
Cachesccachesccache
LSPclangdpyrightLanguageServer.jlrust-analyzer
Refactoringclang-tools-extra +custom libtooling/clang-tidy(comby) ??(comby) ??(comby) ??
TestingGoogle Testunittest/(py-test)Test.jlcargo
DocsDoxygensphinx(Documenter.jl)cargo
DistributionContainer,spackContainer,spackContainer,spackContainer,crates.io,spack

Language-Agnostic #

PurposeTool
Server DistroCentOS
Workstation DistroFedora
FilesystemBTRFS:Fedora, ZFS:Centos
DesktopKDE Plasma
ScreenshotsSpectacle
Container EngineDocker/Podman
Configuration ManagementAnsible
Development Package Managerspack
Desktop Softwareflatpak:desktop-apps, dnf:system-software
Source Controlgit
Source Code Splunkingsourcetrails:exploration??, ag/rip-grep:search, LSP:editor, ?? (sourcegraph)
PDF ViewerOkular
Web BrowserFireFox
File BrowserDolphin
File TransferGlobus
Text Editorneovim
Terminalkonsole
Shellbash
Promptstarship
diff/git diff Tooldifftastic
find Toolfd-find
grep Toolag/rip-grep
Disk Usage dudust
catbat
cdzoxide
Multiplexerneovim
Backuprestic:non-zfs, zfs:default
VPNtailscale
CIJenkins/Gitlab:hosting, Dagger:abstraction
Text CollaborationSlack:work,Discord:home,Email:other
Video CollaborationZoom
EmailGMail/Outlook
SlidesGoogle Slides, Beamer:math-heavy
DocumentsGoogle Docs:Default, Overleaf:Publications
Diagram EditingDraw.io:refine, d2/graphviz:quick
PlottingPlots.jl:static, Makie.jl:interactive
Bitmap Image EditingGimp
Vector Image EditingInkscape
Print Layout Editing (e.g. Posters)Scribus
Video EditingKdenlive
Audio EditingArdour:edit, pipewire:foundation, Carla:live
Task ManagementWhiteboard:home, a paper journal:travel, Reminders:notification
Time ManagementActivity Watch:Desktop, Screentime:Mobile
CalendaringGoogle Calendar
JournalingVimwiki:default, a paper journal:travel, Good Notes:sketching, Drafts:mobile
PasswordsKeepassXC
MusicPlex
CitationsZotero
RSSFeedly
PodcastsOvercast
BlogHugo

Gaps #

There are a few places where I see gaps in the current ecosystem of development tools

  • A build system for Python with good support for native extensions that produces pip install-able packages. There is not an easy way to build native extensions for python with complex C/C++ dependencies that is scalable and consistent. See also pypackaging-native. Python would learn a lot from Julia here in terms of ease of use. I personally don’t find Anaconda to be the answer here because you can’t use pip the blessed installer for python to install packages from it you have to use conda (which is/was very slow) or better yet the faster compatible mamba but both still behaves poorly once conda-forge is used.
  • Refactoring tools for any language that isn’t Java or C++. Comby may be that tool, but I am also hopeful for tools built on top of treesitter.
  • Sourcetrails was one of my favorite tools for exploring large software projects giving me ability to quickly visualize system dependencies. Sourcetrails has been abandoned because it was A) too hard to maintain and B) for whatever reason couldn’t find a good funding model. I hope that a tool that could fit some of these needs could be built from either LSP servers generically.

Monorepo/Package management tools for maintaining large multi-language applications. The ideal tool would be able to

  • support C++, Python, Julia, Rust, and other languages well
  • isolate builds from system dependencies by building in a sandbox for reproducible builds
  • An escape hatch to import system dependencies
  • help with coordinated package releases (bumping versions, refactors, rebuilds)
  • execute builds in parallel at least locally, but preferably distributed as well and coordinate between packages (i.e. make’s jobserver)
  • rebuild things only when needed

Bazel, Pants, and Spack are the tools that are closest, but each lacks a key feature to really solve this for me.

I’ve admired tools like warp.dev from afar because they are MacOS only. I think there is room for an improved terminal like software with improved auto-completion, contextual documentation, intelligent folding/scroll-back, collaborative tools, and more sophisticated graphical capabilites has a place. Tools like Jupiter notebooks address some of these, but are really heavy weight but also don’t embed things like vim easily. Terminal’s like kitty are closer, but feel like they lack some polish compared to Warp or my current terminal editor Konsole.

Comments #

  • I find I use the C++ tools even for languages like Python and Julia because they allow me to get down to the native code that is being run and understand the stack issues there.
  • I avoid ZFS on Fedora because Fedora runs too new a kernel for ZFS with Fedora to be really reliable.
  • CMake especially its complex scoping rules and string based typing leave things to be desired. Meson is pleasant, but since CMake is ubiquitous and at least last time I tried, meson’s CMake integration was imperfect for complex dependencies such as LLVM. Bazel WORKSPACE files are verbose even for simple multi-language processes but is getting better with bzlmod. Bazel also makes it hard to use system provided packages or to install things using UNIX package conventions. Spack requires the package definition to be seperate and has to be used with a language specific build tool.

Changelog #

  • 2023-03-14 initial version

Key #

  • / can be used interchangeable
  • , used in addition to for a specific sub purpose
  • + tool I developed on top of these
  • () runner up/under evaluation/contextual
  • ?? looking for a replacement
  • no tool needed
  • *c++ I also use the C++ tools here
  • : context
Author
Robert Underwood
Robert is an Assistant Computer Scientist in the Mathematics and Computer Science Division at Argonne National Laboratory focusing on data and I/O for large-scale scientific applications including AI for Science using techniques of lossy compression, and data management. He currently co-leads the AuroraGPT Data Team with Ian Foster. In addition to AI, Robert’s library LibPressio, allows users to experiment and adopt advanced compressors quickly, has over 200 average unique monthly downloads, is used in over 17 institutions worldwide, and he is also a contributor to the R&D100 winning SZ family of compressors and other compression libraries. He regularly mentors students and is the early career ambassador for Argonne to the Joint Laboratory for Extreme Scale Computing.