Like helping to find a bug, discussing about how to setup an application for a certain use case or anything like that? Answering questions on Stack overflow is an example but is that the best way?
Generally the best way to help out is to do a thing that's needed and that you can figure out how to do. Your list includes a bunch of good options, and I've been thanked for doing all those things at one point or another. Some common growth paths include:
- Using the software
- Encountering bugs, problems, or small opportunities for improvement.
- Discussing those informally in forums and helping people find workarounds.
- Identifying some of those issues as common things other things experience as well, so filing bugs for them with clear explanations and links to related forum discussions.
- Reading source code to better understand bugs.
- Discussing potential fixes in developer bug threads (or in GitHub or whatever).
- Submitting small fixes for simple bugs as pull requests.
Another path might be:
- Using the software and reading forums/docs for help.
- Answering basic questions on forums, looking to old threads and relevant docs.
- Learning about common questions.
- Writing blogs or forum posts about common questions.
- Submitting improvements to official docs to clarify common areas of confusion.
There are other paths as well, the main thing is to use a thing so you learn about it and then use that knowledge to make it a little easier for the next person. Good luck!
Another user posted the blog where they discuss their speedup techniques: https://tailscale.com/blog/more-throughput/
It's likely that the kernel version can use similar techniques to surpass the performance of the userspace version that tailscale uses, but no one has put in the work to to make the kernel implementation as sophisticated as the userspace one.