System design is the process of determining the optimal high-level technical approach to a problem. It's a staple in both the interview process and actually doing your job as a software engineer. We have created a video series to act as a system design primer for software engineers.
I'm not sure exactly how to phrase this, but to give an analogy, I love card games (ex: Legends of Runeterra, Race for the Galaxy, Hearthstone, etc). There are a fixed set of rules and a fixed set of cards. I can "grind" games and get better by noticing patterns, picking up new strategies or tactics by playing against a diverse set of players. The outcome of an interaction is usually idempotent (i.e. card 1 interaction with card 2).
In real life, things are quite complicated. Asking a certain question in a certain way to person 1 and person 2 may give wildly different responses, and may even depend on your mood, their mood, your tone, time of day, etc. It's super messy and unpredictable.
I also feel a similar way about system design. The nearly infinite possibility of inputs, outputs, TPS, throughput, scenarios make it difficult to reapply the same set of rules to different scenarios. This is just talking about one component, when we bring in N components, the interaction gets very complicated and the "rules" change" case by case. I'm sure it gets better with practice, but I also feel I have a limited opportunity to learn or practice these on the job.
Has anyone found a way to structure these learnings in terms of a repeated "grind", because oftentimes I feel overwhelmed and don't know where to start. This is a complicated question, so answers regarding either a) soft skills or b) system design separately I will treat as valid answers.
I would like to understand how can I drive an effective Tech discovery session (just had a PRD walkthrough) with the team (remotely working) before we start writing a detailed system design document. The engineers are mostly L4 and are still learning how to effectively collaborate instead of full blown meeting.
I'm pretty good at leetcode (was able to pass some 3 to 5 rounds of interviews), I got good at by practicing and continuous learning. Now I want to be good at software engineering in general like debugging, building components, understanding complex things/systems, etc. I see one of the suggestions is to improve on fundamentals of software engineering, how do I do that? and What action items can I follow consistently? Any concrete suggested steps will be great instead of just some general bullet points. Thank you all.
Say you want to research on a topic for resolving an issue and want to share with the team by creating a Google Doc. How does one master the skill of creating an high quality Doc?
My Senior team member, top performer, is super solid at creating Google Docs and churns out one great doc almost every week. He said he just focuses on just dumping out the thoughts in the first go and fixes them later on. But I feel his velocity in getting that doc out or completely the research on it is very fast. So clearly there is something that I am not understanding.
So I am looking for opinions from experts on Taro :)
As a mid-level (not senior yet) SDE, what are the core skills I should be consistently developing to grow my career, not only for promotion within the company, but also for personal growth, and to get ready for diverse opportunities years ahead?
I know we have covered lots of topics, like DS & Algo for interviews in case you suddenly get laid off and you are looking for opportunities, communicate well with colleagues to make impact, and manage up to avoid getting into PIP, System Design skills.... But is there a list of Soft AND Hard skills that are core to a engineer's career in long term?
I am a Backend Engineer at a Platform Team.
Our team currently owns 9 micro services which serve as a platform which other teams use through the company.
5/9 of these services are actively being worked on and the rest are just running without any changes/ enhancements.
I have been working for the past 8 months on one of the services but haven’t had much exposure to others.
I want to learn about the others, how the data flows between them and how the overall system design is. I am just going through tons of design RFCs and reading code but with little understanding.
My primary motivation is to
How can I better understand at the service level?
I am a senior software engineer working primarily in Python. I consider myself a pretty good coder, being able to solve problems and deliver software on time at the necessary SLA. I understand and have worked with the major Python web frameworks such as FastAPI, Flask, and Django.
But I see a lot of things lacking in myself. I am not able to handle algorithms very well, nor am I able to efficiently use design patterns.
I see that all of these skills are part of FAANG interviews and much sought after.
I also understand that there is Leetcode, HackerRank, CodeSignal and that help better ability.
What is the best way one can upskill self given the many options?
So a few days ago I was assigned to design the architecture for a small feature, which I presented to the team on a meeting. During that meeting, a colleague of mine implied that he was directly involved with crafting the design which wasn’t the case indeed. How would you guys handle this? Personally, I believe just for a single case it doesn’t make it a reason to address it, but if it gets repeated it might need some careful consideration.
I'm an E5 at a Big Tech company. There are several loud, opinionated, dominant personalities on my team. Some of them are E6. They often talk over each other as well as the rest of the team, so the rest of the team rarely contribute to discussions anymore. When a teammate (E5) presented his RFC to our team today, the dominant personalities started questioning his design decisions and talked over him when he tried to defend them. My teammate looked so discouraged and beaten down at the end of that meeting. When I brought this up to my EM in a 1:1, he said it's a people problem -- people are not being respectful. I asked my EM if he could coach those people, but he said he prefers to invest in people like me who are interested in learning & growing.
Amazon is well-known for its design doc reviews, which appear to be small-scale system design reviews. However, I'm having trouble understanding them, let alone recommending modifications.
I'm aware of Alex Xu's Byte by Byte go course, but I'm skeptical using it as it's specifically for interview preparation. I want to learn for the workplace. I can definitely look at blog posts and current design documentation, but I'd prefer something more structured. How can a novice learn system design and grow to the advanced/intermediate level? What books or resources would you suggest?
I've seen multiple E6s point out flaws in others' proposals, but don't offer any alternatives of their own. What's a good way to navigate this? This is extra tricky when we're on the same team and they're the designated code reviewer for my work.
Example: I ran into a limitation with a 3rd-party SDK. I proposed 2 options as workarounds, but an E6 rejected both options due to their limitations. When I asked him for his recommendation, he could not provide any alternatives but still insisted that I find a solution without any limitations. Thankfully an E7 on another team helped me by providing a viable workaround after 3 E6s were stumped by this problem. What should I do if I'm not lucky enough to have an E7 help me next time?
is a nice series explaining what is wanted and talks about further iteration, but how can this happen in parallel or complementary if there is an environment that is doing SCRUM by the book?
I am mostly concerned about the time for meetings, since the ideal in this project is to make the engineers who will develop somewhat part of the design process to increase agency and accountability.
An E6 and I recently joined an existing team and are working with an E6 who has all the historical context on the project's requirements/limitations in his head. The PM is brand new to the team and the company. The EM and designer are also fairly new. The newer E6 often proposes architectural directions that the more tenured E6 shoots down due to this context. Is there a good way to extract all this context from the more tenured E6? I feel like we're often throwing things on the wall and just seeing what doesn't get shot down -- things get shot down more often than not, unfortunately. The more tenured E6 said it'll take too long to document all the context.
I have realised over the years that I have gained good amount of technical knowledge but I lack great communication skills (in terms of expressing my thoughts). This was okay till I was working as software engineer as my task involved more of coding work which does not require explaining things to large audience. Now as a Senior Engineer my task revolves around making design choices, explaining pros/cons of selecting an approach etc. I realised that even though I am confident on my technical approach, I sometimes fail to express myself and the approach in the right way during the discussion which led to times when my approach is discarded and others as selected as they express themselves better. I need some suggestions on how to improve on this aspect as this will be crucial part going forward in my career.
When software design tasks are given, I spend way too much time in keep looking for other wikis or resources to get information about similar problems.
I don't know when to reach out to senior engineers to get their input because I don't want them to think that I know nothing and how I even got this job. Even after some research, sometimes I can't choose an option over others despite listing pros and cons. I keep thinking about the designs all day and night till the design is finalized. How to take a break and allocate time when solving ambiguous problems?
I'm an E5 iOS at a Big Tech company. I'm in the process of switching teams. While they're figuring out the paperwork, I've been invited to their roadmapping and architectural discussions.
The 2 E6s are dominating the discussions. The E6 iOS has been on the project since its inception a year ago and has all the context; the E6 backend has been helping out our team with the discussions and may eventually join our team. I'm the newest team member so I have the least context. The E6 backend's proposals usually sound like great ideas to me, but the E6 iOS often shoots them down and provides historical context on why those are bad ideas.
In my 1:1, my manager asked me why I'm not participating in the discussions. When I told him I don't have context, he told me to participate anyway. How do I participate effectively when I don't have context?
I am working on a side project. I may use GCP or AWS for it.
tldr of the system : Create a web ui to process input files and generate a tabular output giving the link to the dashboard .
I have a bunch of files generated , about 2GB in size in total , Account ID is the high level directory and inside each account there 50 log files each having specific content .
I want to create a UI using Angular framework . Using the UI I will upload the files to GCS /AWS S3 . Then the backend should trigger complex backend scripts, written will be written in Python or Java and then output file is generated. Using the output file a dashboard with few images embedded is generated.
In the end the UI should have a table which should indicate status of processing to COMPLETE and in another column show point to url of the dashboard.
I want to deal with least amount of security work as I want to avoid studying Oauth 2.0 authentication .
Few additional questions , non-system design questions =>
After a certain experience there's a certain expectation from Senior Software Engineers, I think because in the beginning of my career I wasn't involved in Development and hence despite being of experience 10 years I think I may not have the design skills required to work independently on a feature.
That said, I am going through LLD questions on YouTube, to understand more about designing from scratch, while I am doing I thought if there's a way to get me upto speed even more. The reason I am asking is because apart from doing Leetcode daily I would like to spend some time daily on design aspect as well.
In summary, I want to work independently, and for that am learning from the internet. I am wondering if that's it or there's something more I can do in my free time to become better developer. Any actionable items would be great.
I was watching the system design playlist and while it's good it feels like it's frontend oriented. My question here is that let's say that we get a big epic to work on, where we have to do something similar of what is already implemented in the application, but this time we have to do something else on that similar line. The main point I want to emphasize is that we normally have screenshots from the product design side and we have to come up with models and apis and everything else(considering there are more than 10 apis to build).
What is the best way to proceed in such situations?
For my current project, I have 2 broad options for the infra/platform to support the feature:
There's also the option of trying to do both, benchmarking them against one another, and then choosing the better one. However, I don't think we'll have the time to do that.
All this being said, any thoughts on which technology to go with?
The applications our current team develop are targeted for individual users only and most of our projects are centered around building complex business logic rather than scale. So there is less scope to gain experience on concepts such as parallel processing, concurrency, caching or similar. What are my options to become really good at these skills if I am not working on these on a day-to-day basis?
I started my career in a mid-level startup that was on the verge of IPO. I contributed a lot. Learnt a lot in terms of how to deliver big scale features relatively quickly, work within sharp deadlines, owning features and products. I was a high performer.
After 2 years of working in that company, I decided to switch to Big Tech for better compensation. While Snap is not exactly a Big Tech company, this is what I had in mind when switching.
I immediately started adding value in terms of delivering features and owning products. However, since I come from a mid-level startup, my soft skills are very weak. I am an excellent programmer, but I struggle writing Technical Design Docs. I deliver features quickly, but I don't know how to contribute to the spec sheets and writing launch emails, holding engineering sessions, efficiently using 1:1s. It feels like in my previous company, delivering features on time, writing quality code was enough to be a high performer, but seems like Big Tech requires a lot more. My manager's ex-Amazon, so he values tech docs a lot, and I feel like I am missing a huge opportunity here by not being good at them.
How do I adapt better to this work environment ?
The leadership principle is as follows:
Leaders are obligated to respectfully challenge decisions when they disagree, even when doing so is uncomfortable or exhausting. Leaders have conviction and are tenacious. They do not compromise for the sake of social cohesion. Once a decision is determined, they commit wholly.
How do I get better at technical design review and presentations? I go into these tech review meetings and get a ton of questions from senior engineers that aren’t directly related to the project and the raw volume of questions derails the whole thing. It always feels like something is missing. What should the preparation phase of a project look like?
Adding on to this, I do go into these meetings with a technical design document. Ideally people will comment on that well before the meeting, so we can get more of the discussion done async. However, people often don’t have time so they don't do this, making the tech review meeting the first time they see the tech planning materials, hence all the questions.
I learned that my whole team is kind of new (Salesforce acquired this product), and they have just started contributing to the core platform. There are currently a lot of approvals necessary to merge front-end code into the system. This is rough as there's many epics connected to front-end work, and there is not a single senior person in the team which can take charge of looking into the high level architecture, following best practices, and doing better planning to release the code to prod.
I am the only full-stack Staff engineer here, and this is why my EM wants me to create a master front-end tech spec for the team. As an example of something this doc can cover: At Salesforce, there are multiple ways to communicate with the back-end API, each of which has their pros and cons but that information is scattered - We can consolidate that info into this doc.
Given that I haven't written any front-end code here at Salesforce, this task seems hard and I'm unsure how to do this without looking stupid.
My whole team is engaged in a design exercise for the system we will build in subsequent quarters. Since I joined 2 months ago, I don’t feel I’m able to meaningfully contribute. I also feel weak with system design questions during interviews. How can I improve here?
For the past 3 months, the primary activity on my team has been to debate and discuss the architecture design of the large system our team will be developing in Q3. It feels like we’re in gridlock and I don’t see a clear path to a decision. How can we move forward productively?
System design is a necessary process at software companies to design architectures that can be compatible with different requirements.