- Published on
Software Engineering
- Authors
- Name
- Aaron Lee
Software Engineering
This is a blog post about software engineering and how I learned it. I hope readers will find it useful and helpful in their own learning journey.
About
I am a software engineer with a passion for distributed systems and cloud infrastructure. I like to understand how to design and build scalable and reliable systems.
How I learned Software Engineering
I learned software engineering by working on various projects that I found interesting. In middle school, I started with Java and worked on a robotics project. I also played around with self hosting Minecraft servers as well as other games. In high school, I continued to work on some smaller projects and picked up web development with HTML, CSS, and JavaScript. In college, I joined a robotics organization and continued to learn about software engineering concepts as well as design patterns. I also joined the CS club and went to a few hackathons.
Career
During college, I had several internships and worked on various projects. I started at MemVerge. The following summer I worked at ServiceNow as a Quality Assurance Engineer Intern. I was also hired to work part time during the school year. Later, I was hired to work at X, the Moon Shot Factory, on their Everyday Robotics team. After I worked at DigitalOcean as a Software Engineer Intern. Since graduating, I have been working at DigitalOcean as a Software Engineer.
I've worked with a variety of technologies and languages across these companies. Currently, I am using Go but I like to learn about Rust and Zig in my free time.
What I've learned
I've learned a lot about software engineering and I'm still learning. The internships really set you up to learn about modern software engineering practices and designs. I actually continued to do a master's degree in Computer Science with a depth in distributed systems. A lot of focus from distributed systems relies on several concepts:
- Concurrency
- Availability
- Consistency
- Partition tolerance
These are just a few of the concepts that I've had to learn about while working at DigitalOcean. As you scale your application and clients, you need to think about these concepts and how they apply to your application. It's crucial to keep your application highly available so you have higher uptimes. It's also crucial to handle retries and failures gracefully so you don't have a single point of failure in your application. Another crucial concept is about idempotency. You need to make sure you don't process the same request multiple times.
A popular solution to this is to use a queue to process requests. This way, you can deduplicate requests and process them one at a time. You can also use a deterministic system to generate IDs for each request so you can detect duplicates. Several products have launched due to this problem. For example, there is Amazon SQS which under the hood uses a queue as well as a workflow system to process requests. Netflix has Conductor and Uber has Cadence. Maxim Fateev is a Co-Founder of Temporal which is a workflow system for durable execution. He has taken upon his learnings at Amazon and Uber while developing those products to create Temporal.
We use Temporal at DigitalOcean to help ensure requests are processed reliably and durably. They are used across a wide variety of our products such as Spaces, Databases, and Load Balancers.
Conclusion
I hope this blog post was helpful and informative. If you have any questions, please feel free to reach out to me.