Around 7-8th grade in school, I was primarily interested in astronomy. Back then, my goal was to become an astrophysicist. In 9th grade, I moved to a different school where my main focus was math, programming, and geography.
We quickly learned how to convert between numerical systems with different bases, and after that, we jumped to the Pascal programming language. Back then I didn't believe mortal humans can write programs and send instructions to the computer. It was so exciting for me to be able to control what the computer does.
This fascination with how you can turn your ideas into reality just by having internet and a computer made me go for software engineering major in college.
I try to keep my setup as minimalistic as possible so it's portable across different machines.
For a lot of years, I used to code primarily in vim. Back then type systems weren't really a thing in web development so vim was providing me everything I needed. I've probably spent a couple of weeks or maybe months combined in tuning my vimrc.
For the past 2-3 years, for development, I'm mostly using VSCode because of the great support for TypeScript and Go. I'm working on a macOS with iterm2 and tmux. I still often use vim to edit code, config files, or readmes quickly.
My favorite theme is Nord, I'm using it everywhere - VSCode, vim, iterm2. I'm frequently using Bazel for building projects with different stacks.
Text editor and theme
I'm working on a lot of development tooling recently. The programming languages I use daily are TypeScript and Go. Often I write Starlark, a dialect of Python used for configuring and writing extensions for Google's build tool Bazel.
Previously, when I was working on my startup, I was primarily using TypeScript (with Angular & React), Go, and Postgres.
I'm probably a bit biased since I'm working on Angular, but I'm really excited about what we're developing right now, both on framework and tooling side.
On the framework side, we're working on shipping Ivy. That's a new rendering and a compiler (all of this backward compatible for application developers), which will enable a lot of exciting features. For example, we're working on a technique which will let us bootstrap parts of the application incrementally after server-side rendering.
Since we want to allow developers to ship fast Angular applications from end-to-end, we're working on an automated deployment from the CLI. This will enable best practices depending on the archetype of the users' application. Imagine, as a developer, you run 'ng deploy', and your application figures out what's the best deployment strategy for itself, consuming analytics data to provide personalized loading experience for your users.
For my startup we were using mostly gitflow and we were quite happy with it.
Now at Google things vary between projects. It strongly depends where we host the project. For example, the projects which are only developed internally (let's say GMail) differ from the external ones (e.g. Angular CLI).
Most of my projects use monorepos. This makes it much easier to share protocol schemas, CI configuration, and make my build incremental.
For example, by having my code in a monorepo a build tool, such as Bazel, can very effectively decide which tests to rerun on a change. It can share this knowledge between the client and the server-side of an application. For example, if I update an endpoint in my RESTful API, Bazel can run only the affected integration tests in the front-end.
I'm focused on learning more theoretical computer science. Currently, looking at incremental computations and category theory.
I'm trying to follow what's going on in machine learning as well, especially on the intersection between ML and programming language design and tooling.
Probably this would be codelyzer. It provides a framework for static code analysis of Angular applications. Currently, it has over 700k weekly downloads and I believe I balanced well between the scope of the project and development time.
A lot of developers nowadays focus a lot on learning APIs. APIs change very often and it's extremely hard to stay current. Investing in this direction can make an engineer obsolete very easily when a new, trendy technology comes out.
Math on the other side does not change that often. It's almost certain that it'll stay the way it is for our entire lifetime. IMO, investing in computer science and figuring out how to use it elegantly in practice is what will help a lot of folks in the long term.
A few introductory books that I can recommend are Algorithms by Robert Sedgewick and Kevin Wayne, Types and Programming Languages Benjamin C. Pierce, and Structure and Interpretation of Computer Programs by Gerald Jay Sussman and Hal Abelson.
At Google the biggest challenge we're facing is the scale on which we need to operate. There are thousands of projects, thousands of engineers, and billions of lines of code.
To build and run CI on that scale, we have a very strict and well-designed pipeline. Almost all of our source code is in a monorepo, with well-defined dependencies between the different projects so that Bazel can figure out the dependency graph and perform the most optimal build.
There's a lot more that could be said on this topic. For further reading, I'd recommend you to look at the article "Why Google Stores Billions of Lines of Code in a Single Repository".
I'd encourage folks to look at our latest improvements in the Angular CLI and give us feedback! We've been working hard to help developers ship fast applications by default and there's much more work we're planning to do in this direction.