I'm a huge fan of languages that require you to explicitly export your functions (e.g. pub in Rust or export in JS). It's much easier to change than a separate header file (.h in C, .mli in OCaml) and it enables local reasoning. You can see from the definition if it's exported.