├── .github └── workflows │ └── deploy.yml ├── .gitignore ├── Makefile ├── README.md ├── docs ├── behavioral.md ├── coding.md ├── glossary.md ├── index.md ├── system-design.md └── troubleshooting.md ├── mkdocs.yml ├── poetry.lock └── pyproject.toml /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: deploy mkdocs 2 | 3 | env: 4 | python-version: 3.10.4 5 | poetry-version: 1.1.13 6 | 7 | on: 8 | push: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | deploy-doc: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - name: Check out source repository 17 | uses: actions/checkout@v2 18 | - name: Set up Python ${{ env.python-version }} 19 | uses: actions/setup-python@v2 20 | with: 21 | python-version: ${{ env.python-version }} 22 | - name: Install poetry ${{ env.poetry-version }} 23 | uses: abatilo/actions-poetry@v2.1.1 24 | with: 25 | poetry-version: ${{ env.poetry-version }} 26 | - name: Poetry cache 27 | id: poetry-cache 28 | uses: actions/cache@v2 29 | with: 30 | path: ~/.cache/pypoetry/virtualenvs 31 | key: ${{ runner.os }}-python-${{ env.python-version }}-poetry-${{ env.poetry-version }}-lock-${{ hashFiles('poetry.lock') }} 32 | - run: poetry install 33 | - run: poetry run mkdocs gh-deploy --force 34 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .git 2 | .venv 3 | .python-version 4 | 5 | site -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: docs 2 | docs: 3 | poetry run mkdocs serve -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Software Engineer Interview Preparation Kit 3 | 4 | After years of doing interviews (as a candidate mainly) I decided to revisit all my notes about interview, collect them and generate from them a guide to help me and others to prepare for tech interviews. 5 | 6 | So this guide aims to be an high level path to follow when preparing for tech interviews. 7 | This is not the usual "Cracking the < X > interview". Just a set of tips and advices to help you prepare for Software Engineer related interviews. 8 | 9 | I used [MkDocs](https://www.mkdocs.org/) with the [material theme](https://squidfunk.github.io/mkdocs-material/) to generate a static website hosted on [GH Pages](https://pages.github.com/) 10 | 11 | You can find it at this url: https://softwarebloat.github.io/software-engineer-interview-prep-kit/ 12 | 13 | This is just a starting point that will be updated with new experiences. 14 | Please feel free to open issues or PR (to propose new tips or whatever) so we can discuss about it :) -------------------------------------------------------------------------------- /docs/behavioral.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | Behavioral interviews are always challenging to me. 3 | It's something that really can't have a wrong or right answer. It really depends by what the company/people is looking for and 4 | what's the culture of it. 5 | 6 | 7 | 8 | ## Advices 9 | 10 | As I said, I find it hard to prepare to such interviews. 11 | It's not something technical that you do or don't know. And sometimes (in my experiences) even a wrong word/phrase could cause a negative outcome of the interview 12 | 13 | !!! tip 14 | If it's available, go to the carrer page of the company to know more about its culture. 15 | Take down some note about it and try to match those with you experience examples 16 | 17 | Usually, the best thing to do is to talk about a very specific example and don't speak in general 18 | 19 | !!! check "Good" 20 | Let me tell you about that time I help my team mates solving a production bug in our user registration service: 21 | . . . 22 | 23 | !!! failure "Bad" 24 | I always try to help people when they need something 25 | 26 | And having some specific examples of different situations you had in your carrer/life, will help a lot in answering those questions. 27 | 28 | For every story you had, try to point out key elements from this 6 categories that usually are questions that could be asked: 29 | 30 | - Challenges 31 | - Mistakes/Failures 32 | - Enjoyed 33 | - Leadership 34 | - Conflicts 35 | - What you'd do differently 36 | 37 | ### Example Questions 38 | Here you can find a couple of examples of questions that companies could ask (online you can find many, many more). 39 | By the way, it's impossible to prepare to all possible questions. There are too many. 40 | Instead, try to think and write down some really good examples from your carrer like moments where you handled **negative feedback** or you were **collaborative**, etc... 41 | 42 | !!! question "Examples" 43 | - Why *this company*? 44 | - What are you looking for? 45 | - Something from your carrer you are very proud of> 46 | - A time you had to show disagreement? 47 | - Something you regretted later? 48 | - A time you introduced a new practice in the team which proved to be beneficial 49 | 50 | Again, those are just to have an idea but don't focus too much preparing answer for those questions but rather on examples. 51 | 52 | ## Questions 53 | At the end of the interview, you should have time to ask some question on topics you are interested in. 54 | Here's some examples of questions you could ask after a Behavioral interview: 55 | 56 | !!! question "" 57 | - Are you happy with your work/life balance? 58 | - What's your typical day at work? 59 | - One thing that you like about working in `` and one that you don’t 60 | - being in a squad working on a specific area, are you able to have different challenges over time? 61 | 62 | 63 | ## Resources 64 | 65 | __Reads__: 66 | 67 | - [Cracking the Coding Interview](https://www.goodreads.com/book/show/55014663-cracking-the-coding-interview) 68 | -------------------------------------------------------------------------------- /docs/coding.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | 3 | Now, almost all the Software Engineer interviews has a Live Coding step. 4 | Usually you can choose the programming language you are more comfortable with, but it could depends by the company 5 | 6 | 7 | ## Advices 8 | 9 | Some say that you have to prepare solving tons of "hard" problems on leetcode. But this really depends from company to company. 10 | Could be true for example for __FAANG__ companies but not for others. 11 | 12 | So, besides training your __Algorithms__ and __DS__ knowledge, you should also focus on things like communication. 13 | 14 | Be used to explain your thought process. Don't be afraid of ask questions or even feedbacks. 15 | Feel free to make a decision but always explain it. 16 | 17 | !!! tip 18 | Of course you don't have to talk __ALL THE TIME__, take some time for thinking and breathing, but definitely communicate your ideas, what you intend to do, which problems you think you might run into, and so on. 19 | 20 | ## Topics 21 | You can find all the related info about Algorithms and Data Structure in platform like Leetcode. 22 | I don't see the need to deeply talk about them here at the moment 23 | Take a look at the [Resources](#resources) section for some content 24 | 25 | ## Questions 26 | At the end of the interview, you should have time to ask some question on topics you are interested in. 27 | Here's some examples of questions you could ask after a Live Coding interview: 28 | 29 | !!! question "" 30 | - It’s the infra/software self-hosted or do you use some cloud provider, or both? 31 | - Do you have “on call”? How does it work? 32 | - How do you handle the sw fragmentation 33 | - Do you need to align with other squads? If yes, how do you do that? 34 | 35 | 36 | ## Resources 37 | 38 | __Platforms__: 39 | 40 | - [LeetCode](https://leetcode.com/) 41 | - [BinarySearch](https://binarysearch.com/) 42 | - [Exercism](https://exercism.org/) 43 | - [HackerRank](https://www.hackerrank.com/) 44 | - [AlgoExpert](https://www.algoexpert.io/product) 45 | 46 | __Reads__: 47 | 48 | - [Cracking the Coding Interview](https://www.goodreads.com/book/show/55014663-cracking-the-coding-interview) 49 | - [Daily Coding Problem](https://www.goodreads.com/book/show/44151058-daily-coding-problem) 50 | - [SW Eng Interview Prep](https://orrsella.gitbooks.io/soft-eng-interview-prep/content/) 51 | 52 | __YouTube Channels/Playlists__: 53 | 54 | - [MIT 6.006 Introduction to Algorithms, Fall 2011](https://youtube.com/playlist?list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 55 | - [HackerRank Algorithms](https://youtube.com/playlist?list=PLI1t_8YX-ApvMthLj56t1Rf-Buio5Y8KL) 56 | - [HackerRank Data Structure](https://youtube.com/playlist?list=PLI1t_8YX-Apv-UiRlnZwqqrRT8D1RhriX) 57 | -------------------------------------------------------------------------------- /docs/glossary.md: -------------------------------------------------------------------------------- 1 | # Glossary 2 | Here you can find some key arguments of computer science that usually could be asked in interviews 3 | 4 | !!! warning 5 | This list is intended as a starting point to brush up on some topics and not as a complete resource that cover every aspect of a specific topic. 6 | If you do not know any of the topics presented, please read more elsewhere. 7 | 8 | ## API Gateway 9 | separate business logic from common operations like: 10 | Authentication, Authorization, DDoS protection, routing, serve static response, caching responses, load balancing, A/B testing 11 | 12 | 13 | ## Authentication vs Authorization 14 | In simple terms, authentication is the process of verifying who a user is, while authorization is the process of verifying what they have access to. 15 | 16 | ## Automation (CI/CD) TODO 17 | 18 | ## Availability 19 | Is the time a system remains operational to perform its required function in a specific period. 20 | 21 | 22 | ## Bloom Filter 23 | A __Bloom filter__ is a data structure designed to tell you, rapidly and memory-efficiently, whether an element is present in a set. 24 | The price paid for this efficiency is that a Bloom filter is a probabilistic data structure: it tells us that the element either definitely is not in the set or may be in the set. 25 | 26 | 27 | ## CAP Theorem 28 | CAP stands for: _Consistency_, _Availability_, _Partition tolerance_ 29 | This theorem states that any distributed system can only achieve 2 of these 3 properties. 30 | 31 | !!! info 32 | since almost all useful systems do have _network-partition tolerance_, it’s generally boiled down to __Consistency VS Availability__. 33 | 34 | ## CDN 35 | Stands for __Content Delivery Network__ (CDN) refers to a geographically distributed group of servers which work together to provide fast delivery of Internet content. 36 | 37 | __Benefits__: 38 | 39 | - Improving website load times 40 | - Reducing bandwidth costs 41 | - Increasing content availability and redundancy 42 | - Improving website security(DDoS mitigation) 43 | 44 | ## Cache 45 | Caching is the mechanism of storing data in a temporary storage location, usually in memory, so that requests to the data can be served faster. 46 | 47 | Caching improves performance by decreasing page load times, and reduces the load on servers and databases. 48 | __Cache hit__: return response without ask data to server or db 49 | __Cache miss__: request sent to the server or db to fetch result. Result is than cached to the temporary storage and returned to the client 50 | 51 | ### Cache invalidation methods 52 | When data is updated in the database, then that data has to be refreshed in the cache as well. This is called cache invalidation. 53 | 54 | | Method | Description | 55 | | --------------------------------- | ----------------------------------------------------------- | 56 | | `Write-through cache` | Data is written to the cache and database at the same time. | 57 | | `Write-around cache` | Data is written to the database writing to cache. Data is written to cache when a request results in a 'cache miss', at which point data is retrieved from the database, written to cache, and sent back to the client. | 58 | | `Write-back (Write-behind) cache` | Data is written to the cache without writing to the database. Data is written to the database asynchronously. | 59 | 60 | ### Eviction algorithms 61 | First In First Out (__FIFO__) 62 | Last In First Out (__LIFO__) 63 | Least Recently Used (__LRU__) 64 | Least Frequently Used (__LFU__) 65 | Least Frequent Recently Used (__LFRU__) 66 | 67 | 68 | ## Consistent Hashing 69 | Is a hashing technique such that when a hash table (key map to the machine) is resized, only n/m keys need to be remapped. 70 | 71 | | Key | Description | 72 | | --- | --------------- | 73 | | N | number of keys | 74 | | M | number of slots | 75 | 76 | 77 | ## DNS 78 | The __Domain Name System__ (DNS) is the phonebook of the Internet that maps domain names to IP addresses. 79 | 80 | ## Database (TODO) 81 | Which use? (SQL vs NoSQL) 82 | Scaling (vertical vs horizontal/sharding) 83 | 84 | ### Sharding: 85 | Is the act of splitting a db into 2 or more pieces called shards. 86 | Popular sharding strategies: 87 | 88 | - based on client’s regions 89 | - based on the type of data stored (user data in one shard; payments data stored in another) 90 | - based on the hash of a column (only for structured data) 91 | 92 | ### DB Replication 93 | Backup 94 | Vertical Scaling VS Horizontal Scaling 95 | 96 | 97 | ## DoS 98 | Is typically accomplished by flooding the targeted machine or resource with superfluous requests in an attempt to overload systems 99 | 100 | ## Eventual Consistency 101 | > A consistency model which is unlike Strong Consistency. 102 | 103 | In this model, reads might return a view of the system that is stale. 104 | An eventually consistent datastore will give guarantees that the state of the database will eventually reflect writes within a time period (seconds or minutes) 105 | 106 | 107 | ## Gossip protocol 108 | Is a communication protocol that allows state sharing in distributed systems. 109 | he protocol enables each node to keep track of state information about the other nodes in the cluster, such as which nodes are reachable 110 | 111 | 112 | ## HTTP 113 | __HTTP__ (Hypertext Transfer Protocol) is an (application layer) protocol designed to transfer information between networked devices. 114 | A typical flow over HTTP involves a client machine making a request to a server, which then sends a response message. 115 | 116 | 117 | ## HTTP Error Codes 118 | 119 | | Error Code | Description 120 | | ---------- | --------------------------------------- | 121 | | __1xx__ | indicates an informational message only | 122 | | __2xx__ | indicates success of some kind | 123 | | __3xx__ | redirects the client to another URL | 124 | | __4xx__ | indicates an error on the client’s part | 125 | | __5xx__ | indicates an error on the server’s part | 126 | 127 | ## HTTP Methods 128 | | Method | Description | 129 | | ---------- | ----------------------------------------------------------------------------------------------------------- | 130 | | `GET` | requests a representation of the specified resource. Requests using GET should only retrieve data. | 131 | | `HEAD` | asks for a response identical to a GET request, but without the response body. | 132 | | `POST` | submits an entity to the specified resource, often causing a change in state or side effects on the server. | 133 | | `PUT` | submits an entity to the specified resource, often causing a change in state or side effects on the server. | 134 | | `DELETE` | deletes the specified resource. | 135 | | `CONNECT` | establishes a tunnel to the server identified by the target resource. | 136 | | `OPTIONS` | describes the communication options for the target resource. | 137 | | `TRACE` | performs a message loop-back test along the path to the target resource. | 138 | | `PATCH` | applies partial modifications to a resource. | 139 | 140 | 141 | ## HTTPS 142 | __Hypertext Transfer Protocol Secure__ (HTTPS) is the secure version of HTTP. 143 | Technically speaking, HTTPS is not a separate protocol from HTTP. 144 | It is simply using __TLS/SSL__ encryption over the HTTP protocol. 145 | 146 | HTTPS occurs based upon the transmission of TLS/SSL certificates, which verify that a particular provider is who they say they are. 147 | 148 | ## JWT (TODO) 149 | 150 | ## LoadBalancer 151 | reduces individual server load and prevents application servers from becoming a single point of failure forwarding traffic only to “health” services. 152 | It could use different algorithms to do so like Round Robin or load-aware balancers 153 | 154 | ### Algorithms 155 | 156 | | Method | Description 157 | | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | 158 | | `Least Connection Method` | Routes request to the server having the least number of active connections. | 159 | | `Least Response Time Method` | Routes request to the server having the least number of active connections and lowest average response time. | 160 | | `Round Robin Method` | Routes request to the first available server and then moves it to the end of the queue. | 161 | | `Weighted Round Robin Method` | Routes request to the first available server having the highest weight. Each server is assigned a weight, an integer number, based on its processing capacity. | 162 | 163 | 164 | ## Message queue vs message broker 165 | A __message queue__ is a data structure, or a container - a way to hold messages for eventual consumption. 166 | A __message broker__ is a separate component that manages queues. 167 | Brokers: Kafka, RabbitMQ, SNS/SQS 168 | 169 | 170 | ## Monitoring (TODO) 171 | 172 | ### Logging (TODO) 173 | Levels: Debug -> Info -> Warn -> Error 174 | 175 | ### Metrics (TODO) 176 | 177 | ### Tracing 178 | The goal of tracing is to follow a program’s flow and data progression. 179 | Tracing allows you to see how you got there: which function, the function’s duration, parameters passed, and how deep into the function the user could get. 180 | 181 | ## Pulling vs streaming (websockets) 182 | ### __Short polling__ 183 | client continuously makes call to the server to retrieve data 184 | 185 | | :green_circle: Pros | :red_circle: Cons | 186 | | ------------------------------- | ------------------------------ | 187 | | you can have a stateless server | tons of requests to the server | 188 | 189 | 190 | ### __Long polling__ 191 | client makes the request to the server. 192 | The server can respond with the data requested or, if not ready/presents, it will keep open the connection to respond to the client when ready. 193 | 194 | | :green_circle: Pros | :red_circle: Cons | 195 | | --------------------------------- | ------------------------------------------------- | 196 | | not overload server with requests | you tie up a connection between client and server | 197 | 198 | 199 | ### __Web sockets (TCP)__ 200 | open a connection between client and server and keep it open in both ways 201 | 202 | | :green_circle: Pros | :red_circle: Cons | 203 | | ---------------------------------------------------- | ------------------------------------------------- | 204 | | server is in control to when send data to the client | a connections is opened between them the all time | 205 | 206 | 207 | 208 | ## REST 209 | __REST__ is an _architectural style_, or design pattern, for APIs. 210 | REST stands for __REpresentational State Transfer__. It means when a RESTful API is called, the server will transfer to the client a representation of the state of the requested resource. 211 | A resource can be any object the API can provide information about 212 | 213 | 214 | ## Rate limiting 215 | Is used to control the rate of requests sent or received. 216 | It can be used to prevent DoS attacks, or limit api usage. 217 | 218 | 219 | ## Redundancy 220 | Consists in a duplication of components of a system that tries to increase the reliability of this system. 221 | 222 | ## Reliability 223 | Is the probability a system will fail in a given period. 224 | A distributed system is considered reliable if it keeps delivering its services even when one or several of its software or hardware components fail. 225 | 226 | redundancy has a cost to achieve such resilience for services by eliminating every single point of failure. 227 | 228 | 229 | ## SLA - Service-Level Agreement 230 | The agreement you make with your users. 231 | Typically make guarantees on a system’s availability. 232 | 233 | ## SLO - Service-Level Objective 234 | The objectives your team must hit to meet that agreement. 235 | Usually about specific metrics like uptime or response time. 236 | 237 | 238 | ## Scalability 239 | is the capability of a system, process, or a network to grow and manage increased demand. 240 | 241 | | Scaling Type | Description | 242 | | ------------------------------------------ | ------------------------------------ | 243 | | :material-dots-horizontal: `Horizontal` | :material-server: More machines | 244 | | :material-dots-vertical: `Vertical` | :muscle: More power | 245 | 246 | ## Stateful (TODO) 247 | dedicated storage 248 | 249 | ## Stateless (TODO) 250 | shared storage 251 | 252 | ## TCP vs UDP 253 | __UDP__ is faster than __TCP__ but less reliable. 254 | __TCP__ establish connection via “handshake” (SYN -> SYN-ACK -> ACK) 255 | __TCP__ indicates and confirms the order in which order packets should be received. UDP does not. 256 | 257 | Because of that, UDP is much faster but could lose packets (datagrams). 258 | So applications that use UDP must be able to tolerate errors (loss and duplication). 259 | 260 | So UDP is commonly used in time-sensitive communication where occasionally dropping packets is better than waiting (like voice and video application or online gaming and DNS servers) 261 | 262 | 263 | ## TLS 264 | __TLS__ uses a technology called public key encryption: 265 | there are two keys, a public key and a private key, and the public key is shared with client devices via the server's SSL certificate. 266 | 267 | When a client opens a connection with a server, the two devices use the public and private key to agree on new keys (TLS handshake), called session keys, to encrypt further communications between them. 268 | 269 | 270 | ## Thread vs Process 271 | __Processes__ are basically the programs that are dispatched from the ready state and are scheduled in the __CPU__ for execution 272 | A process can create other processes which are known as Child Processes. 273 | Process is isolated (doesn’t share memory with other process) 274 | 275 | __Thread__ is the segment of a process (a process can have multiple threads) 276 | Threads are faster and share memory 277 | 278 | 279 | ## pub/sub 280 | Is a messaging model that consists of __publishers__ and __subscribers__. 281 | Publishers __publish__ messages to topics (also called channels) without knowing who will read those messages. 282 | Subscribers __subscribe__ to topics and read messages coming through those topics. -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # Welcome 2 | 3 | In this "preparation kit" i'm trying to explain how to prepare and how to deal Software Engineering interviews based on my experiences (it is originated out of my own personal notes while preparing for such interviews) 4 | 5 | Usually an interview for a Software Engineer role consists of multiple steps. 6 | The following are some of them that you could expect (not necessary all in one interview process): 7 | 8 | - HR call 9 | - Take home project (Optional) 10 | - First tech interview usually a live coding session 11 | - System Design interview 12 | - A second live coding session 13 | - Behavioral interview 14 | - Troubleshooting 15 | 16 | Now, the process really depends by the company, but we could say that usually we have: 17 | 18 | - A first call with the HR to understand the role and have first impressions 19 | - A Tech interview that could consists of theory or coding live sessions or even both 20 | - A final round that usually consists of multiple steps: 21 | - System Design 22 | - Troubleshooting 23 | - Coding Session 24 | - Behavioral 25 | 26 | But, as I said, this really depends from company to company 27 | 28 | 29 | ## Phase One 30 | Usually, every interview starts with a round of presentations of the participant. 31 | Preparing a presentation of yourself beforehand will help you a lot on focusing on what to say 32 | 33 | !!! tip 34 | The presentation doesn't have to be necessary the same every time. 35 | You could/should prepare a slightly different one for every kind of interview you have: 36 | Something more focused on your tech life in a Coding or System Design interview or something about your hobbies in a behavioral interview. 37 | This is up to you :smiley: 38 | 39 | ## Phase Two 40 | Study the company that you applied for. 41 | Often the majority of the companies has a "life at company" website or section where you can learn a lot about 42 | the company culture, interview process and more. 43 | 44 | Take notes about things that you think are important and that match some of your experience so you can talk about it in the interviews. 45 | 46 | ## Phase Three 47 | The last minutes (10/15) of an interview is usually dedicated to allow the interviewee to ask questions about the company, the team, the role, etc... 48 | 49 | So don't get caught unprepared and prepare some questions on topics that you are interested in learning more about or of which you are interested in an opinion from an insider! 50 | 51 | !!! tip 52 | Take advantage of the [Phase Two](#phase-two) to understand which kind of question to do. 53 | Also, asking the same question to different people (if you'll have more interviews) in the same company could be very useful 54 | 55 | __Questions examples__: 56 | 57 | - Are you happy with your work/life balance? 58 | - What's your typical day at work? 59 | - One thing that you like about working at and one that you don’t 60 | -------------------------------------------------------------------------------- /docs/system-design.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | 3 | System Design interview questions are quite challenging. 4 | They are open ended questions with the objective to design an architecture for a software system. 5 | 6 | The questions are usually very big scoped and vague and there is no certain pattern to follow. 7 | 8 | The meaning of this kind of interviews is to evaluate the interviewee on how he/she analyzes a vague problem and how solves the problem step by step 9 | 10 | 11 | ## Advices 12 | 13 | Don't rush and try to be organized and structured. 14 | Explore the problem and ask questions to clarify the use cases. 15 | Do some quick analysis and if needed try to do some estimation 16 | 17 | If you are particularly strong in one area, try to direct the conversation towards that! (e.g.: DB choice) 18 | 19 | 20 | Try to divide the process into __4 steps__: 21 | 22 | 1. Understand the problem and establish design scope 23 | - Propose high-level design and get buy-in 24 | - Design deep dive 25 | - Wrap up 26 | 27 | #### Example Questions 28 | To better understand the problem and gather requirements, we should ask some questions related to the problem we are facing. 29 | 30 | !!! question "Examples" 31 | - Which functionality are we designing? 32 | - Is it an MVP? 33 | 34 | - Who will use the system? 35 | - How will the system be used? 36 | - How many users do we expect to use the system? 37 | - Where are they located? Globally? Nationally? 38 | 39 | - Do we know how many reads per second? 40 | - How much data is queried per second? 41 | - How many {data/image/video/resource} are processed per second? 42 | 43 | - Should the design minimize the cost of Development? 44 | - Should the design minimize the cost of Maintenance? 45 | 46 | Back of the envelope estimation 47 | 48 | 49 | #### Follow up Questions 50 | Once you finished your design, the interviewer could ask some followup questions like: 51 | 52 | !!! question "" 53 | - what if we want to add functionality? 54 | - What will you improve? 55 | 56 | Usually this doesn't mean that we should redesign our application but it's just a way to have more discussions about it, understand how you solve those challenges and your knowledge. 57 | 58 | !!! tip 59 | Generally speaking, you could improve an application by adding things like: 60 | 61 | - multi Availability Zones (to improve availability and redundacy) 62 | - [monitoring/observability](../glossary/#monitoring) 63 | - [CDNs](../glossary/#cdn) 64 | 65 | ## Topics 66 | Be prepared to talk about things like __DB__ choice, __cache__, __async__ vs __sync__ processing, __REST__, __Load Balancers__, etc 67 | Some of the most commong topics are pointed out in the [Glossary](../glossary) 68 | 69 | !!! question "Some Common Problems" 70 | - Design a URL Shortening service 71 | - Designe Instagram 72 | - Design Twitter 73 | - Design Youtube/Netflix 74 | - Design an API Rate Limiter 75 | - Design a messaging app 76 | 77 | ## Questions 78 | At the end of the interview, you should have time to ask some question on topics you are interested in. 79 | Here's some examples of questions you could ask after a System Design interview: 80 | 81 | !!! question "" 82 | - It’s the infra/software self-hosted or do you use some cloud provider, or both? 83 | - Do you have “on call”? How does it work? 84 | - How do you handle the sw fragmentation 85 | - Do you need to align with other squads? If yes, how do you do that? 86 | 87 | ## Resources 88 | 89 | __Reads__: 90 | 91 | - [ByteByteGo Blog](https://blog.bytebytego.com/) 92 | - [System Design Interview - An Insider's Guide](https://www.goodreads.com/hu/book/show/54109255-system-design-interview-an-insider-s-guide) 93 | - [System Design Interview – An Insider's Guide: Volume 2](https://www.goodreads.com/book/show/60631342-system-design-interview-an-insider-s-guide) 94 | - [Cloudflare Learning Center](https://www.cloudflare.com/it-it/learning/) 95 | - [System Design Primer](https://github.com/donnemartin/system-design-primer) 96 | - [Interviewing.io - A Senior Engineer's Guide to the System Design Interview](https://interviewing.io/guides/system-design-interview) 97 | 98 | __YouTube Channels/Playlists__: 99 | 100 | - [System Design Interview](https://www.youtube.com/c/SystemDesignInterview/videos) 101 | - [System Design by Gaurav Sen](https://www.youtube.com/playlist?list=PLMCXHnjXnTnvo6alSjVkgxV-VH6EPyvoX) 102 | - [System Design by Narendra L](https://www.youtube.com/playlist?list=PLkQkbY7JNJuAhePp7E_WSpfFqjQp6RniV) 103 | - [IBM Technology](https://www.youtube.com/c/IBMTechnology) 104 | -------------------------------------------------------------------------------- /docs/troubleshooting.md: -------------------------------------------------------------------------------- 1 | ## Intro 2 | The Throubleshooting interview it's something "weird" that not all the companies do and it's something hard to prepare. 3 | But preparing for system design could help you. 4 | 5 | Usually it's an open ended question such as: 6 | 7 | !!! example "" 8 | two hours ago, we started getting alerts that ~5% of our customers cannot see ads 9 | 10 | Starting from there, you have to ask questions to retrieve more info, as if we were playing D&D. 11 | The goal here is to understand how you tackle problems and your reasoning process to get to the solution (but usually it is not mandatory to reach the end). 12 | 13 | 14 | ## Advices 15 | As we said, we should ask clarifying questions 16 | Imagine you are in a real situation and just explain what you would do, where would you search for clues, what would you look for, etc... 17 | 18 | The important thing is to show good thinking, good analytical skills, general knowledge of how different software systems work, and that you know how to deal with problems and try to solve them. 19 | 20 | 21 | ## Topics 22 | Preparing for [System Design](../system-design) will help you with the Troubleshooting interview. 23 | So be prepared to talk about things like: 24 | 25 | - Accessing Servers 26 | - Viewing Logs 27 | - Tracing and Metrics 28 | - Unix Commands 29 | - Distributed Systems 30 | 31 | 32 | #### Example Questions 33 | 34 | !!! question "Examples" 35 | - is it a distributed system? Do we have multiple regions? 36 | - What’s the infrastructure? (k8s?) 37 | - What Does the system look like? (services, dependencies, dbs, etc) 38 | - have we released a new version recently? 39 | - do we have __logs__ and are they searchable? 40 | - can we look at fields of alerting metrics? 41 | - does it affect all clients or a specific one? (mobile, desktop, etc) 42 | - is the problem global or a small area? (maybe it’s only one region or zone) 43 | - maybe it’s just one replica? 44 | - service/kernel/system version? Is it the same for every replica? 45 | - Do we have tracing? -> easier to form hypothesis 46 | - Do we know which host and timestamp to look at? 47 | 48 | 49 | ## Resources 50 | - [UNIX and Linux System Administration Handbook](https://www.goodreads.com/book/show/8772005-unix-and-linux-system-administration-handbook) -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Software Engineer Interview Preparation Kit 2 | site_url: https://softwarebloat.github.io/software-engineer-interview-prep-kit/ 3 | 4 | repo_url: https://github.com/softwarebloat/software-engineer-interview-prep-kit 5 | repo_name: softwarebloat/software-engineer-interview-prep-kit 6 | nav: 7 | - index.md 8 | - System Design: system-design.md 9 | - Coding: coding.md 10 | - Troubleshooting: troubleshooting.md 11 | - Behavioral: behavioral.md 12 | - Glossary: glossary.md 13 | 14 | theme: 15 | icon: 16 | logo: fontawesome/solid/laptop-code 17 | name: material 18 | palette: 19 | - scheme: default 20 | toggle: 21 | icon: material/weather-night 22 | name: Switch to dark mode 23 | primary: blue 24 | accent: light blue 25 | - scheme: slate 26 | toggle: 27 | icon: material/weather-sunny 28 | name: Switch to light mode 29 | primary: indigo 30 | accent: blue 31 | 32 | markdown_extensions: 33 | - pymdownx.critic 34 | - admonition 35 | - pymdownx.details 36 | - attr_list 37 | - pymdownx.emoji: 38 | emoji_index: !!python/name:materialx.emoji.twemoji 39 | emoji_generator: !!python/name:materialx.emoji.to_svg 40 | - tables 41 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "click" 3 | version = "8.1.3" 4 | description = "Composable command line interface toolkit" 5 | category = "main" 6 | optional = false 7 | python-versions = ">=3.7" 8 | 9 | [package.dependencies] 10 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 11 | 12 | [[package]] 13 | name = "colorama" 14 | version = "0.4.4" 15 | description = "Cross-platform colored terminal text." 16 | category = "main" 17 | optional = false 18 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 19 | 20 | [[package]] 21 | name = "ghp-import" 22 | version = "2.1.0" 23 | description = "Copy your docs directly to the gh-pages branch." 24 | category = "main" 25 | optional = false 26 | python-versions = "*" 27 | 28 | [package.dependencies] 29 | python-dateutil = ">=2.8.1" 30 | 31 | [package.extras] 32 | dev = ["twine", "markdown", "flake8", "wheel"] 33 | 34 | [[package]] 35 | name = "importlib-metadata" 36 | version = "4.11.4" 37 | description = "Read metadata from Python packages" 38 | category = "main" 39 | optional = false 40 | python-versions = ">=3.7" 41 | 42 | [package.dependencies] 43 | zipp = ">=0.5" 44 | 45 | [package.extras] 46 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 47 | perf = ["ipython"] 48 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] 49 | 50 | [[package]] 51 | name = "jinja2" 52 | version = "3.1.2" 53 | description = "A very fast and expressive template engine." 54 | category = "main" 55 | optional = false 56 | python-versions = ">=3.7" 57 | 58 | [package.dependencies] 59 | MarkupSafe = ">=2.0" 60 | 61 | [package.extras] 62 | i18n = ["Babel (>=2.7)"] 63 | 64 | [[package]] 65 | name = "markdown" 66 | version = "3.3.7" 67 | description = "Python implementation of Markdown." 68 | category = "main" 69 | optional = false 70 | python-versions = ">=3.6" 71 | 72 | [package.extras] 73 | testing = ["coverage", "pyyaml"] 74 | 75 | [[package]] 76 | name = "markupsafe" 77 | version = "2.1.1" 78 | description = "Safely add untrusted strings to HTML/XML markup." 79 | category = "main" 80 | optional = false 81 | python-versions = ">=3.7" 82 | 83 | [[package]] 84 | name = "mergedeep" 85 | version = "1.3.4" 86 | description = "A deep merge function for 🐍." 87 | category = "main" 88 | optional = false 89 | python-versions = ">=3.6" 90 | 91 | [[package]] 92 | name = "mkdocs" 93 | version = "1.3.0" 94 | description = "Project documentation with Markdown." 95 | category = "main" 96 | optional = false 97 | python-versions = ">=3.6" 98 | 99 | [package.dependencies] 100 | click = ">=3.3" 101 | ghp-import = ">=1.0" 102 | importlib-metadata = ">=4.3" 103 | Jinja2 = ">=2.10.2" 104 | Markdown = ">=3.2.1" 105 | mergedeep = ">=1.3.4" 106 | packaging = ">=20.5" 107 | PyYAML = ">=3.10" 108 | pyyaml-env-tag = ">=0.1" 109 | watchdog = ">=2.0" 110 | 111 | [package.extras] 112 | i18n = ["babel (>=2.9.0)"] 113 | 114 | [[package]] 115 | name = "mkdocs-material" 116 | version = "8.3.4" 117 | description = "Documentation that simply works" 118 | category = "main" 119 | optional = false 120 | python-versions = ">=3.7" 121 | 122 | [package.dependencies] 123 | jinja2 = ">=3.0.2" 124 | markdown = ">=3.2" 125 | mkdocs = ">=1.3.0" 126 | mkdocs-material-extensions = ">=1.0.3" 127 | pygments = ">=2.12" 128 | pymdown-extensions = ">=9.4" 129 | 130 | [[package]] 131 | name = "mkdocs-material-extensions" 132 | version = "1.0.3" 133 | description = "Extension pack for Python Markdown." 134 | category = "main" 135 | optional = false 136 | python-versions = ">=3.6" 137 | 138 | [[package]] 139 | name = "packaging" 140 | version = "21.3" 141 | description = "Core utilities for Python packages" 142 | category = "main" 143 | optional = false 144 | python-versions = ">=3.6" 145 | 146 | [package.dependencies] 147 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 148 | 149 | [[package]] 150 | name = "pygments" 151 | version = "2.12.0" 152 | description = "Pygments is a syntax highlighting package written in Python." 153 | category = "main" 154 | optional = false 155 | python-versions = ">=3.6" 156 | 157 | [[package]] 158 | name = "pymdown-extensions" 159 | version = "9.5" 160 | description = "Extension pack for Python Markdown." 161 | category = "main" 162 | optional = false 163 | python-versions = ">=3.7" 164 | 165 | [package.dependencies] 166 | markdown = ">=3.2" 167 | 168 | [[package]] 169 | name = "pyparsing" 170 | version = "3.0.9" 171 | description = "pyparsing module - Classes and methods to define and execute parsing grammars" 172 | category = "main" 173 | optional = false 174 | python-versions = ">=3.6.8" 175 | 176 | [package.extras] 177 | diagrams = ["railroad-diagrams", "jinja2"] 178 | 179 | [[package]] 180 | name = "python-dateutil" 181 | version = "2.8.2" 182 | description = "Extensions to the standard Python datetime module" 183 | category = "main" 184 | optional = false 185 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 186 | 187 | [package.dependencies] 188 | six = ">=1.5" 189 | 190 | [[package]] 191 | name = "pyyaml" 192 | version = "6.0" 193 | description = "YAML parser and emitter for Python" 194 | category = "main" 195 | optional = false 196 | python-versions = ">=3.6" 197 | 198 | [[package]] 199 | name = "pyyaml-env-tag" 200 | version = "0.1" 201 | description = "A custom YAML tag for referencing environment variables in YAML files. " 202 | category = "main" 203 | optional = false 204 | python-versions = ">=3.6" 205 | 206 | [package.dependencies] 207 | pyyaml = "*" 208 | 209 | [[package]] 210 | name = "six" 211 | version = "1.16.0" 212 | description = "Python 2 and 3 compatibility utilities" 213 | category = "main" 214 | optional = false 215 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 216 | 217 | [[package]] 218 | name = "watchdog" 219 | version = "2.1.9" 220 | description = "Filesystem events monitoring" 221 | category = "main" 222 | optional = false 223 | python-versions = ">=3.6" 224 | 225 | [package.extras] 226 | watchmedo = ["PyYAML (>=3.10)"] 227 | 228 | [[package]] 229 | name = "zipp" 230 | version = "3.8.0" 231 | description = "Backport of pathlib-compatible object wrapper for zip files" 232 | category = "main" 233 | optional = false 234 | python-versions = ">=3.7" 235 | 236 | [package.extras] 237 | docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] 238 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] 239 | 240 | [metadata] 241 | lock-version = "1.1" 242 | python-versions = "^3.10" 243 | content-hash = "26ab3ac62cec567766751c49351942e76b60809e6c2a38fb443a8a04b7bfffd9" 244 | 245 | [metadata.files] 246 | click = [ 247 | {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, 248 | {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, 249 | ] 250 | colorama = [ 251 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 252 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 253 | ] 254 | ghp-import = [ 255 | {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, 256 | {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, 257 | ] 258 | importlib-metadata = [ 259 | {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"}, 260 | {file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"}, 261 | ] 262 | jinja2 = [ 263 | {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, 264 | {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, 265 | ] 266 | markdown = [ 267 | {file = "Markdown-3.3.7-py3-none-any.whl", hash = "sha256:f5da449a6e1c989a4cea2631aa8ee67caa5a2ef855d551c88f9e309f4634c621"}, 268 | {file = "Markdown-3.3.7.tar.gz", hash = "sha256:cbb516f16218e643d8e0a95b309f77eb118cb138d39a4f27851e6a63581db874"}, 269 | ] 270 | markupsafe = [ 271 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, 272 | {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, 273 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, 274 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, 275 | {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, 276 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, 277 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, 278 | {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, 279 | {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, 280 | {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, 281 | {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, 282 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, 283 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, 284 | {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, 285 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, 286 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, 287 | {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, 288 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, 289 | {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, 290 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, 291 | {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, 292 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, 293 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, 294 | {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, 295 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, 296 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, 297 | {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, 298 | {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, 299 | {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, 300 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, 301 | {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, 302 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, 303 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, 304 | {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, 305 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, 306 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, 307 | {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, 308 | {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, 309 | {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, 310 | {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, 311 | ] 312 | mergedeep = [ 313 | {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, 314 | {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, 315 | ] 316 | mkdocs = [ 317 | {file = "mkdocs-1.3.0-py3-none-any.whl", hash = "sha256:26bd2b03d739ac57a3e6eed0b7bcc86168703b719c27b99ad6ca91dc439aacde"}, 318 | {file = "mkdocs-1.3.0.tar.gz", hash = "sha256:b504405b04da38795fec9b2e5e28f6aa3a73bb0960cb6d5d27ead28952bd35ea"}, 319 | ] 320 | mkdocs-material = [ 321 | {file = "mkdocs-material-8.3.4.tar.gz", hash = "sha256:467040e9c93fada45f78398336595158ed5f398e49291186e2cfc2f3e8b1973e"}, 322 | {file = "mkdocs_material-8.3.4-py2.py3-none-any.whl", hash = "sha256:04db519908cd2bee450b0d2bdad3ac365d788e774528dd37f11e2ce3586d8e13"}, 323 | ] 324 | mkdocs-material-extensions = [ 325 | {file = "mkdocs-material-extensions-1.0.3.tar.gz", hash = "sha256:bfd24dfdef7b41c312ede42648f9eb83476ea168ec163b613f9abd12bbfddba2"}, 326 | {file = "mkdocs_material_extensions-1.0.3-py3-none-any.whl", hash = "sha256:a82b70e533ce060b2a5d9eb2bc2e1be201cf61f901f93704b4acf6e3d5983a44"}, 327 | ] 328 | packaging = [ 329 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 330 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 331 | ] 332 | pygments = [ 333 | {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, 334 | {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, 335 | ] 336 | pymdown-extensions = [ 337 | {file = "pymdown_extensions-9.5-py3-none-any.whl", hash = "sha256:ec141c0f4983755349f0c8710416348d1a13753976c028186ed14f190c8061c4"}, 338 | {file = "pymdown_extensions-9.5.tar.gz", hash = "sha256:3ef2d998c0d5fa7eb09291926d90d69391283561cf6306f85cd588a5eb5befa0"}, 339 | ] 340 | pyparsing = [ 341 | {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, 342 | {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, 343 | ] 344 | python-dateutil = [ 345 | {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, 346 | {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, 347 | ] 348 | pyyaml = [ 349 | {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, 350 | {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, 351 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, 352 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, 353 | {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, 354 | {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, 355 | {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, 356 | {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, 357 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, 358 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, 359 | {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, 360 | {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, 361 | {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, 362 | {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, 363 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, 364 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, 365 | {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, 366 | {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, 367 | {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, 368 | {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, 369 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, 370 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, 371 | {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, 372 | {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, 373 | {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, 374 | {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, 375 | {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, 376 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, 377 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, 378 | {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, 379 | {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, 380 | {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, 381 | {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, 382 | ] 383 | pyyaml-env-tag = [ 384 | {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, 385 | {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, 386 | ] 387 | six = [ 388 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 389 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 390 | ] 391 | watchdog = [ 392 | {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a735a990a1095f75ca4f36ea2ef2752c99e6ee997c46b0de507ba40a09bf7330"}, 393 | {file = "watchdog-2.1.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b17d302850c8d412784d9246cfe8d7e3af6bcd45f958abb2d08a6f8bedf695d"}, 394 | {file = "watchdog-2.1.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee3e38a6cc050a8830089f79cbec8a3878ec2fe5160cdb2dc8ccb6def8552658"}, 395 | {file = "watchdog-2.1.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:64a27aed691408a6abd83394b38503e8176f69031ca25d64131d8d640a307591"}, 396 | {file = "watchdog-2.1.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:195fc70c6e41237362ba720e9aaf394f8178bfc7fa68207f112d108edef1af33"}, 397 | {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bfc4d351e6348d6ec51df007432e6fe80adb53fd41183716017026af03427846"}, 398 | {file = "watchdog-2.1.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8250546a98388cbc00c3ee3cc5cf96799b5a595270dfcfa855491a64b86ef8c3"}, 399 | {file = "watchdog-2.1.9-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:117ffc6ec261639a0209a3252546b12800670d4bf5f84fbd355957a0595fe654"}, 400 | {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97f9752208f5154e9e7b76acc8c4f5a58801b338de2af14e7e181ee3b28a5d39"}, 401 | {file = "watchdog-2.1.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:247dcf1df956daa24828bfea5a138d0e7a7c98b1a47cf1fa5b0c3c16241fcbb7"}, 402 | {file = "watchdog-2.1.9-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:226b3c6c468ce72051a4c15a4cc2ef317c32590d82ba0b330403cafd98a62cfd"}, 403 | {file = "watchdog-2.1.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d9820fe47c20c13e3c9dd544d3706a2a26c02b2b43c993b62fcd8011bcc0adb3"}, 404 | {file = "watchdog-2.1.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:70af927aa1613ded6a68089a9262a009fbdf819f46d09c1a908d4b36e1ba2b2d"}, 405 | {file = "watchdog-2.1.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed80a1628cee19f5cfc6bb74e173f1b4189eb532e705e2a13e3250312a62e0c9"}, 406 | {file = "watchdog-2.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9f05a5f7c12452f6a27203f76779ae3f46fa30f1dd833037ea8cbc2887c60213"}, 407 | {file = "watchdog-2.1.9-py3-none-manylinux2014_armv7l.whl", hash = "sha256:255bb5758f7e89b1a13c05a5bceccec2219f8995a3a4c4d6968fe1de6a3b2892"}, 408 | {file = "watchdog-2.1.9-py3-none-manylinux2014_i686.whl", hash = "sha256:d3dda00aca282b26194bdd0adec21e4c21e916956d972369359ba63ade616153"}, 409 | {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64.whl", hash = "sha256:186f6c55abc5e03872ae14c2f294a153ec7292f807af99f57611acc8caa75306"}, 410 | {file = "watchdog-2.1.9-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:083171652584e1b8829581f965b9b7723ca5f9a2cd7e20271edf264cfd7c1412"}, 411 | {file = "watchdog-2.1.9-py3-none-manylinux2014_s390x.whl", hash = "sha256:b530ae007a5f5d50b7fbba96634c7ee21abec70dc3e7f0233339c81943848dc1"}, 412 | {file = "watchdog-2.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:4f4e1c4aa54fb86316a62a87b3378c025e228178d55481d30d857c6c438897d6"}, 413 | {file = "watchdog-2.1.9-py3-none-win32.whl", hash = "sha256:5952135968519e2447a01875a6f5fc8c03190b24d14ee52b0f4b1682259520b1"}, 414 | {file = "watchdog-2.1.9-py3-none-win_amd64.whl", hash = "sha256:7a833211f49143c3d336729b0020ffd1274078e94b0ae42e22f596999f50279c"}, 415 | {file = "watchdog-2.1.9-py3-none-win_ia64.whl", hash = "sha256:ad576a565260d8f99d97f2e64b0f97a48228317095908568a9d5c786c829d428"}, 416 | {file = "watchdog-2.1.9.tar.gz", hash = "sha256:43ce20ebb36a51f21fa376f76d1d4692452b2527ccd601950d69ed36b9e21609"}, 417 | ] 418 | zipp = [ 419 | {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, 420 | {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, 421 | ] 422 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "software-engineer-interview-preparation-kit" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["SoftwareBloat"] 6 | 7 | [tool.poetry.dependencies] 8 | python = "^3.10" 9 | mkdocs-material = "^8.3.4" 10 | 11 | [tool.poetry.dev-dependencies] 12 | 13 | [build-system] 14 | requires = ["poetry-core>=1.0.0"] 15 | build-backend = "poetry.core.masonry.api" 16 | --------------------------------------------------------------------------------