jhillyerd
Remote: Yes
Willing to relocate: No
Technologies: Primarily Go; also have experience with Rust, Python, Java, JavaScript, Elm, Nix
LinkedIn: https://www.linkedin.com/in/jhillyerd/
CV: Upon request
Email: james at hillyerd dot com
My recent experience is in back-end development, but I am a generalist software engineer. I love working with platform technologies; Linux, containers, automation, orchestration (nomad & k8s), CI/CD, NixOS, etc. At Google I worked on a distributed application that handled a million requests per second, but I've also worked at startups with no customers.
Perhaps something like heroku buildpaks (https://github.com/railwayapp/nixpacks ?) would help devs get on the Nix train.
If you want to learn about containers, distributed workloads, etc, then Nomad is a great option that is easy to learn/adopt piecemeal.
It's really targeted for intranet use though, I wouldn't recommend exposing anything other than the SMTP port to the internet.
Complexity increases when you want one vimrc with many plugins to work on Windows, Linux and OS X, and both in your work and home environments.
I'm not arguing that Amp is the answer. I don't think I'd stick with vim as my daily driver if I couldn't customize it, and have the plugins I do.
Website: https://www.inbucket.org/ GitHub: https://github.com/jhillyerd/inbucket
Inbucket was my first project in Go, and I have been slowly adding to it ever since.
You would have to raise the minimum version in your module spec to get a newer version of the dependency.
1. Capitalization rules vary by language, I remember struggling with camel cased naming in Java in some scenarios. I also thing the example given is bad, User.user is a poor name in any language.
2. Structs w/ implicit interfaces. I like this feature of Go, and it's never bitten me in the way the author describes. I never liked having to declare them in Java. And there is an easy way to ensure your particular type implements an interface in Go.
3. I prefer not having exceptions, and linters will tell you when you are not checking returned errs. I do wish Go would offer tools to reduce the amount of if err != nil {} blocks, particularly in IO heavy code.
4. Go's build system is very easy to understand compared to something like Makefiles or Maven. I don't consider a few conventions "magic." I have mixed feelings about init(), but I think it's much better than trying to come up with thread-safe alternatives to compile regexp, etc.
5. Naming. Writing unit tests from an outside perspective (package xyz_test) will help you pick better names, and you will run into less conflicts. In Java you see hideous combinations of Abstract, Singleton, Factory, etc. I much prefer Go's concise/pragmatic naming style.
6. I don't do much code generation, can't comment.
7. I do miss ternary sometimes, but I have seen it abused with very long statements in other languages. I would note that "else" has become a code smell in Go, it's more normal to assign a value and then change it.
8. Sorting. I like that not everything needs to be an object in Go. Having to add a few extra lines of code the rare occasion I need to make something sortable is much better than a project full of Java class/getter/setter boiler plate for what should have been a struct.
9. Yes, dependency management is a mess. No argument. Looking forward to dep becoming official.
10. I do sometimes miss generics, but I started writing Java before it had generics so I can live without them :P. I think they can lead to readability problems when overused.
11. append is a bit confusing, but hiding how it works should be considered "magic." linters will help you here.
The only time I run into issues is when a command expects manipulate environment variables via bash syntax.
I think the fish documentation WRT to scripting could be much better, but the language is more elegant than bash or PowerShell IMHO.