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 am new to Taro.
I wanted to ask if the Taro Book Club Event is recorded, if yes where can I access the recordings?
As I read through some of the technical design docs / OKRs on the team, I've noticed some fellow engineers put out some really thoughtful comments (especially the more senior folks), however coming up with such feedback observations is not always super intuitive. As a new-hire junior, I'm looking to build up this skill of conducting an effective design / OKR review.
What do you usually look for / pinpoint when reviewing a design doc or OKR for a new project? How can I still provide good feedback despite not having the same level of exposure / experience?
I've never worked in big tech or Tier 1 companies but I'm aiming to grow as a engineer and would like to know and learn how different companies make such decisions?
Could you please share an example case study here? What does the entire process look like? Thank you.
I have been wanting improve my technical understanding on what I am working on:
What other steps can I take to enhance my technical influence, and then reach that senior level?
What skills are essential for becoming a proficient software engineer which helps them to thrive in any tech domain and adapt to various situations?
Could you provide a list of items that one should be mindful of to excel in real-time scenarios? For instance, focusing on learning front-end and back-end development, knowing basics of web something like that.
I am trying to start a conversation to get across my technical proficiency so that the manager is likely to recommend me for an interview at the big tech company. The company has an engineering blog that I have read, but not sure what I should ask. This is for a mid-level (ideally senior) backend role. The manager has said that if I send them a list of questions they would be open to a call to discuss said questions.
Also the company is Uber ->
We are building a separate product with in a product based company most of the features are crafted just to impress the managers.
During the demo hacks are used to adjust the situation. Though I've recently realised even the API design and system design is not scalable. They are just build so that the current UX is displayed, too much hard coupling and meaningless design.
The HTTP response is dynamic as the demos were build on web and the back -end developers are not understanding that it is difficult to handle in a strictly typed languages.
I get by saying today, I'll write clean code and do my work neatly no matter what others are doing. Though I want to know how do I communicate well with them and build solid products, so that we make something re-suable and independent and sell it not just part of the current product but in terms of public APIs like Twitter, Reddit.
Lately I feel like simply discussing in these lines creates friction, but I have to speak in gentler way to get the job done effectively :)
Can I build an android app through visual studio code or do you guys strongly recommend using android studio code instead? I was considering using VS code since that’s the platform I’m used to using and heard that it works well for android apps as well.
I recently found myself in a fortunate yet challenging situation due to a layoff. I have been granted a two-months period plus optional month(s) in lieu of severance, to secure my next job as I need a visa sponsorship. I aim to land a senior mobile developer role here in the UK, in any non-big tech company (tier 3/4). Considering the urgency of securing a visa, I am open to exploring any roles with sponsorship.
To make the most of this time, here is how I am spending my time so far, I would appreciate any input and suggestions to make the most out of this situation.
Dedicate 2 hours daily to solving easy LeetCode problems - some tier 3/4 companies do ask some easy/medium questions
Spend 2 hours daily applying for jobs on LinkedIn, Dm'ng connections, seeking referrals etc
2/3 hours Develop a side mobile app project to practice and familiarize with recent patterns - most likely needed to succeed in take-home tests.
Behaviour and system design - study and practice only when I have those rounds scheduled.
I wonder if there are any other aspects I should optimize for during this period. Are there any specific areas or resources you recommend focusing on to maximize my chances of success?
How do you keep up with everything that is happening on the team with different projects, doc designs and code reviews?
Hi guys, I found an interesting point in another thread and I don't know, what should be a correct response to it.
Here is it:
"You spent 12 hours of work on an issue and got a working solution. You submit a PR with only a day left before the sprint ends. One of your coworkers looks at your code, thinks it's good enough, but suggests a better solution you haven't thought of. What do you do?"
Especially, what if I have a bigger feature, spent one week for it and need another 3 days, if I will change my code. What would you do?
When working on a new task, I often find myself asked to estimate how long a task may take. Luckily, my team is pretty forgiving, but a critical step will be to start more accurately estimating tasks.
How do you get better at breaking down tasks to understand what needs to get done, and then giving proper estimations for how long those tasks will take?
I am good at LeetCode style problem solving and can also manage system design, but I never get interview calls when I apply through the company portals. Also recruiters barely accept LinkedIn requests and even those who accept them do not respond when reached out to for an open position.
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?
I am good at coding, and I am able to deliver features to prod. However, when it comes to technical writing, like writing software design document, coming up with state transition diagram, block diagram, I am struggling with it a lot. I am not from computer science background, so I am not well versed in coming up flow chart, sequence diagram and state transition diagram. How to improve on these areas? Because of this, I am finding it difficult to communicate my idea to principal engineers/ architects. How can I improve on this?
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.
I've hit a lot of issues pretty deep into the project's execution that hold it up. It can come as late as running the A/B test where we find a big problem that delays everything and takes weeks to solve. This messes up the initial estimates I set up.
Part of this is because I transitioned between teams recently: On my previous team, it was easier to set up components and test them early, but in this current team, it's hard to get real signal until everything is set-up and we run a full end-to-end test.
Lastly, if I hit an issue like this, how can I minimize its effect on my performance and restructure the timeline in an acceptable way?
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.
I've been asked to write a design doc for my project; Samsara even has a structure to follow for these. After I understand how the overall system works, I will tackle. I want to make sure that there's a strong storytelling element in my doc, avoiding as much jargon as possible.
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?
I am the only experienced Full Stack developer in the team and I felt that the management got a bit excited when they found out. For the first week I was asked to represent my team to the UI review committee to get the UI approval, I had little or no background of the feature but it was kind of rushed out.
Second week, I was told to write the design document of a feature which I was not aware of. I started digging deeper into it, but after 3-4 days I was told there is some other team who is working on something similar so I should stop working on it.
Third week, I was told to again start working on it but then was told to put it on hold. Within the same week I was also told to write the Engineering document for the FE development for the team, this was a bit surprising for me seeing there is almost everything custom at SF, I felt I needed some time to understand the ecosystem, it is the work in progress.
System design is a necessary process at software companies to design architectures that can be compatible with different requirements.