<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Pooya Amini on Medium]]></title>
        <description><![CDATA[Stories by Pooya Amini on Medium]]></description>
        <link>https://medium.com/@self2grow?source=rss-203a584aebef------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*gpQ2_ZjqyqsdU95CS815ew.jpeg</url>
            <title>Stories by Pooya Amini on Medium</title>
            <link>https://medium.com/@self2grow?source=rss-203a584aebef------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 13:10:51 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@self2grow/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Punishing for Pleasure? My Experience with Amazon Customer Service]]></title>
            <link>https://medium.com/geekculture/punishing-for-pleasure-my-experience-with-amazon-customer-service-eeb911680404?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/eeb911680404</guid>
            <category><![CDATA[company-culture]]></category>
            <category><![CDATA[amazon]]></category>
            <category><![CDATA[customer-service]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Mon, 14 Aug 2023 08:41:50 GMT</pubDate>
            <atom:updated>2023-08-14T08:41:50.117Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KiihoRr6YiRiEkOLFAx1FQ.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/SundryPhotography?mediatype=photography">Sundry Photography</a> from istockphoto</figcaption></figure><blockquote>I’m extremely sorry that the associate made a false promise. Could you please help me with the associate’s name? We do not encourage such behaviour and a strict action will be taken against the associate.</blockquote><p>Here is the response I received from Amazon’s customer service, following a false promise by another agent about refunding my Prime membership. Each time I read the response, I can’t help but feel really disappointed, as both a customer and a former employee of the company. At the beginning I thought that it was just a non-professional agent but when I take a look at my past experiences, and after hearing similar stories from friends, I really wonder:</p><blockquote>Is promising punishment a deliberate strategy to make customers feel guilty, preventing them from pursuing their rights?</blockquote><p>To provide some context, I had an annual Prime membership with Amazon. However, due to reasons that are not relevant to this discussion, I decided to cancel it. I was seeking a refund for the unused portion of the subscription. The initial agent I spoke to promised me a full refund for the entire membership — a promise that didn’t entirely surprise me, given my past experiences with Amazon’s usually benevolent customer service.</p><p>Several days passed without any trace of the refund in my account and this led me to contact the customer service team again. After being transferred multiple times between various agents, the final one delivered strange the news that the previous agent had made a “false promise.” Here are the issues that surfaced from this situation:</p><h3>1. Misleading Promises</h3><p>The first agent made a promise they couldn’t keep. This forced me to chase them down again, wasting my time on something that should have been a one-and-done deal. Sure, people make mistakes. I get it. But this wasn’t really my actual problem. In the world of customer service, the first impression you get from the beginning can really shape how you feel about the whole thing. When promises are broken, it’s not just an inconvenience. It can seriously damage your faith in the company. You will always question whether you can trust the info they’re giving you.</p><h3>2. Employee Punishment as a Means to Customer Satisfaction?</h3><p>The next thing that bugged me much more was when the agent promised to take <strong>“strict action”</strong> on his coworker. This had me wondered why I would feel better knowing someone was getting in trouble because of a simple mistake? Threatening employees with strict actions for small errors dramatically increases the pressure, potentially leading to even more mistakes instead of addressing the real issue at hand. When I have an issue, I want it sorted out, not to hear about how someone’s getting punished. The guilty agent could probably have been found out internally, but the customer service rep decided to frame it as them trying to please me by disciplining the agent. It seemed like they got the idea of customer satisfaction all wrong, and frankly was too extreme.</p><h3>3. The Guilt Imposed on the Customer</h3><p>The most bothersome part of my entire experience was that after all this, instead of feeling a relief of a resolved issue, I was left with feeling of guilt. I started thinking that my follow-up has jeopardized the first agent’s career. It dawned on me that just by trying to get a simple issue fixed, someone could end up in serious trouble. I mean, come on, after chatting with customer service, the goal is to feel heard, valued, and confident that everything’s been taken care of. The last thing you’d expect is to be on a guilt trip, wondering if you caused some harm to the person on the other end of the line.</p><p>But what made me wonder even more was that this wasn’t a one-time thing. I had déjà vu from a similar experience last year with Amazon Fresh. I received a torn bag of frozen blueberries, and when I asked for a refund, the agent told me they’d flag the delivery driver for messing up. And there I was, again drowning in guilt and discomfort. I remember I was almost begging the agent not to punish the driver until the agent let the punishment part go.</p><h3>Tactical Guilt Gaming or Company’s Culture of Blame?</h3><p>Looking at the bigger picture and given how often this has been happening, it’s got me wondering two possibilities. On one hand, this could be a sign of inadequate training for agents or maybe it’s a company culture that leans more towards penalizing than understanding. Those familiar with Amazon’s work environment know how stressful it can be, especially during on-calls when dealing with external customer-related issues. For customer service agents who frequently handle unhappy or even angry customers, the pressure is even more dreadful, and under such stress, mistakes are inevitable.</p><p>On the other hand, is this Amazon’s new strategy? Loading customers with guilt, making it feel like some indirect way of telling us to back off without actually saying it?</p><p>What do you think?</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=eeb911680404" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/punishing-for-pleasure-my-experience-with-amazon-customer-service-eeb911680404">Punishing for Pleasure? My Experience with Amazon Customer Service</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Prompt Engineering: The Future of AI Job Market or Just a Trend?]]></title>
            <link>https://ai.plainenglish.io/prompt-engineering-the-future-of-ai-job-market-or-just-a-trend-fb8ac8631b0f?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/fb8ac8631b0f</guid>
            <category><![CDATA[chatgpt]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Fri, 05 May 2023 06:17:15 GMT</pubDate>
            <atom:updated>2023-05-05T06:17:15.416Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*h2arzRyqIHkD4Zp79rS9GQ.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/fr/@jupp?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Jonathan Kemper</a> on <a href="https://unsplash.com/photos/MMUzS5Qzuus?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>ChatGPT was released to the public on November 30th, 2022, and it marks the start of a new era in AI. Large Language Models (LLMs) have become really popular and many companies are trying to use AI to improve their operations. Industries like tech, publishing, accounting, and legal already experienced a significant impact, with many more industries likely to be affected soon. Generally, the industries working with a vast amount of information is going to be the most impacted by this trend.</p><p>Following such growing demand for AI, the ability to properly feed AI models with information has become as important. That’s where “Prompt Engineering” comes in — a new type of job to ensure the AI models are fed with the right “prompts” to satisfy business requirements. But does prompt engineering play a key role in the future of AI job market?</p><h3>What is prompt engineering?</h3><p>Prompt engineering refers to the process of writing concise, comprehensible, and effective prompts that direct an AI system towards a specific outcome or decision. This is done by providing the AI model with a sequence of input prompts that enable it to recognize patterns and connections in data and generate predictions based on that information. Generally, I see two primary objectives for prompt engineering:</p><p>The first objective of prompt engineering is to <strong>devise text-based inputs that can guide the AI model more effectively.</strong> Prompt engineers provide the model with various inputs and then evaluate the output. If the output does not meet the expected level of precision, prompt engineers collaborate with developers to fine-tune the model. For instance, the model may be required not to use any any <a href="https://simonwillison.net/2023/Feb/15/bing/">aggressive tone</a> or avoid expressing any political viewpoint, and it must also be safeguarded against threats like <a href="https://learnprompting.org/docs/prompt_hacking/injection">prompt injection</a>.</p><p>In the second scenario, different industries engage prompt engineers to<strong> write text inputs that will provide the optimized results while meeting domain requirements.</strong> For example, in the healthcare industry, it is critical that the AI model does not leak any personal or confidential information. Another example is developing efficient prompts to get the most out of the model while utilizing the fewest number of tokens to minimize the cost of utilizing the AI model.</p><h3>What skills are required for a prompt engineer?</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PrBM_ffOR7-HnMM9Okjubg.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/ipopba?mediatype=photography">ipopba</a> on <a href="https://www.istockphoto.com/">istockphoto</a></figcaption></figure><p>There are essential skills that a prompt engineer should have:</p><ol><li><strong>A deep understanding of linguistics:</strong> without a profound understanding of human language, it can be challenging to work effectively with language models. Prompt engineers need to be really good at understanding the little details in language, like slang, idioms, and sayings. By being able to pick up on these nuances, prompt engineers can create prompts that work well in different situations and industries.</li><li><strong>A good understanding of how LLMs are structured: </strong>this involves having a grasp of the underlying technology that powers LLMs. With this knowledge, prompt engineers can make informed decisions and quickly adapt their prompts to improve the AI model’s performance. Keeping up-to-date with the latest advancements in LLM technology can also help prompt engineers stay ahead of the curve and create more effective prompts.</li><li><strong>Domain-specific knowledge:</strong> prompt engineers who understand the specific domain can create prompts that are not only linguistically accurate but also relevant to the industry’s specific requirements. For example, in the legal industry, prompts need to be precise and unambiguous and leave no room for ambiguity. On the other hand, in creative design, prompts should be designed to inspire exploration and the discovery of fresh ideas. Therefore, it is crucial for prompt engineers to have domain-specific knowledge to create prompts that achieve the desired results in different industries.</li><li><strong>Familiarity with computer security :</strong> Prompt engineers must have a thorough understanding of security engineering to ensure that LLM systems are safe to adversarial attacks, including prompt injection. They must be able to spot vulnerabilities that may arise during the prompt testing process, and work closely with security engineers to design models that can withstand malicious attacks while maintaining accuracy and consistency.</li></ol><p>A simple Google search yields many courses and resources about working with ChatGPT and LLMs in general. Some of these resources mention prompt engineering in their outlines, but they only cover the basics of creating effective text inputs. However, a few resources go beyond that and provide more comprehensive knowledge on the subject.</p><p>One such resource is <a href="https://learnprompting.org/">Learn Prompting</a>, which offers open-source courses on communicating with artificial intelligence and covers both the fundamentals and advanced topics of prompt engineering. Additionally, DeepLearning.AI provides a <a href="https://www.deeplearning.ai/short-courses/chatgpt-prompt-engineering-for-developers/">short course</a> on prompt engineering for developers. As AI continues to grow and evolve, we can expect to see more resources that provide essential prompt engineering skills.</p><h3>The Potential Future of Prompt Engineering in AI Job Market</h3><p>Prompt engineering is becoming more and more popular in the AI job market. Many experts view prompt engineering as the future of AI development, as there is a growing need for human input to interact with and control these sophisticated systems. The increasing complexity of AI models requires prompt engineers to continuously adapt and acquire new skills to create effective prompts. Despite these changes, the need for prompt engineers is not expected to diminish any time soon.</p><p>A <a href="https://www.businessinsider.com/chatgpt-experience-wanted-by-employers-hire-study-2023-4">report by Business Insider</a> shows that almost a third of business leaders plan to hire prompt engineers this year and</p><blockquote><strong>some companies are even willing to pay prompt engineers with no tech background up to $335,000 a year.</strong></blockquote><p>These are the folks who train AI chatbots to give the best possible results. Lots of workers are already using ChatGPT to make their jobs easier, whether that’s writing code, coming up with marketing copy, or creating lesson plans.</p><p>The report adds that prompt engineering is a really important skill to have if you want to work in AI development. And it looks like demand for prompt engineers is only going to keep going up in the future!</p><p>People who are fans of prompt engineering say that it makes AI systems easier to use and more user-friendly. And that, in turn, can make them more efficient and effective. When users are able to interact with and control these systems more easily, they can get better results from them.</p><h3>Criticism of Prompt Engineering</h3><p>Despite its growing popularity, Some experts are worried that relying too heavily on prompts could lead to bias in AI systems.</p><p>Sam Altman, a high-profile figure in the tech industry, has said that prompt engineering is just a phase in the bigger goal of making machines understand human language more naturally.</p><blockquote>In a <a href="https://www.youtube.com/watch?v=WHoWGNQRXb0&amp;ab_channel=Greylock">2022 interview with Reid Hoffman</a>, the founder of LinkedIn, Altman said that he didn’t think we’d still be doing prompt engineering in five years.</blockquote><p>Another concern is that prompt engineering may be overhyped and not as essential as some claim.</p><p>While some experts have criticized prompt engineering for its potential to introduce bias into AI systems and questioned its long-term relevance, <strong>I’m optimistic about prompt engineering because it’s fundamental in enabling AI systems to understand human language and interact effectively. </strong>Without well-crafted prompts, AI models can’t identify patterns or make reliable predictions. So prompt engineering is essential to make sure AI systems produce meaningful results across all industries. Plus, prompt engineering is always improving, with new techniques and tools to create more effective prompts.</p><p>In fact, in my opinion, prompt engineering skills will become a must-have for everybody to do their regular work, similar to how Google search is widely used today. However, as the complexity of AI systems increases, prompt engineering skills will remain sophisticated, and there will always be a need for prompt engineers.</p><p><em>More content at </em><a href="https://plainenglish.io/"><strong><em>PlainEnglish.io</em></strong></a><em>.</em></p><p><em>Sign up for our </em><a href="http://newsletter.plainenglish.io/"><strong><em>free weekly newsletter</em></strong></a><em>. Follow us on </em><a href="https://twitter.com/inPlainEngHQ"><strong><em>Twitter</em></strong></a>, <a href="https://www.linkedin.com/company/inplainenglish/"><strong><em>LinkedIn</em></strong></a><em>, </em><a href="https://www.youtube.com/channel/UCtipWUghju290NWcn8jhyAw"><strong><em>YouTube</em></strong></a><em>, and </em><a href="https://discord.gg/GtDtUAvyhW"><strong><em>Discord</em></strong></a><strong><em>.</em></strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=fb8ac8631b0f" width="1" height="1" alt=""><hr><p><a href="https://ai.plainenglish.io/prompt-engineering-the-future-of-ai-job-market-or-just-a-trend-fb8ac8631b0f">Prompt Engineering: The Future of AI Job Market or Just a Trend?</a> was originally published in <a href="https://ai.plainenglish.io/">Artificial Intelligence in Plain English</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Surviving Layoffs: How to React When You Have Not Been Laid Off]]></title>
            <link>https://medium.com/geekculture/surviving-layoffs-how-to-react-when-you-have-not-been-laid-off-d9942f9d30f6?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/d9942f9d30f6</guid>
            <category><![CDATA[job-interview]]></category>
            <category><![CDATA[layoffs]]></category>
            <category><![CDATA[career-advice]]></category>
            <category><![CDATA[job-search]]></category>
            <category><![CDATA[unemployment]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Mon, 16 Jan 2023 16:02:23 GMT</pubDate>
            <atom:updated>2023-01-16T16:02:23.622Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Sw1jPFgDFNdRZL-lowj74g.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/PRImageFactory?mediatype=photography">PRImageFactory</a> on <a href="https://www.istockphoto.com/">iStockPhoto</a></figcaption></figure><p>Layoffs are an unfortunate reality of the current IT industry, which may not be a desirable topic to begin the new year with. As companies struggle to adapt to the economic challenges resulting from the pandemic, many are faced with difficult decisions, including implementing layoffs. Even major tech companies such as Meta and Amazon, which had hired significant numbers of employees during the pandemic, have had to let go of a significant portion of their workforce, including some of my colleagues and friends. Unfortunately, layoffs have remained a reality in early 2023 (<a href="https://tech.co/news/tech-companies-layoffs">updated list of tech lay offs</a>), and there is no clear indication of when the trend of layoffs will decrease.</p><p>Although layoffs may seem daunting, it’s a natural part of any career and even many industry leaders have experienced it at some point. However, it’s important to stay informed about industry trends and be prepared for the possibility of layoffs in the future.</p><h3>Keep calm and don’t panic</h3><p>I recall the feeling of dread that overcame me when I was laid off some years ago. However, by speaking with some friends who had gone through similar experiences, I was able to manage my stress and stay grounded during that difficult time. Even if you are not affected, it’s natural to feel stressed and tempted to work harder to protect your job security, but remember that other decisions outside of your control also contribute to layoff decisions. These can include the company’s overall financial situation, the specific needs of the business, and even factors such as company culture and politics. While continuing to do your job well and being a valuable member of your team is important, remember that your job security is not solely determined by your performance. Instead of panicking and overworking, take a rational approach and focus on what you can control, such as preparing for potential job loss, staying informed about the company’s situation, and exploring opportunities for professional development and advancement.</p><h3>Stay positive and don’t blame others</h3><p>I have also seen examples where individuals have directed negative language towards leaders and placed blame on others for the current situation. Even if you have not been affected by the layoffs within your company, it is understandable to feel angry and upset after a layoff, especially if you knew the individuals who were affected. However, it’s important to remember that blaming others and cursing leaders will not improve the situation and can actually create a negative atmosphere for everyone involved. This negative environment can further exacerbate the company’s situation.</p><h3>Show empathy to colleagues who were let go</h3><p>It’s important to remember that those who have been affected by layoffs are going through a difficult time and may need support and understanding. Try to reach out to your colleagues, especially the junior ones, who have been impacted to see how they are doing and offer any assistance or support they may need. This will help them to feel more supported and valued during this challenging period. Make contact to your professional network and see if there are any job openings that they may be a good fit for your laid off colleagues.</p><p>Remember that showing sympathy and support for your laid off colleagues is not only the right thing to do as a human being, but it can also be beneficial for your career. It allows you to gain insight into their job search progress, including potential job opportunities. This information can be useful if you are also considering a job change in the future.</p><h3>Develop a plan for financial security</h3><p>Building a financial safety net is important for protecting yourself and your family from financial insecurity in the event of a layoff. Having a safety net in place can provide a cushion of savings or other resources that can help you maintain your standard of living in case of job loss. This includes things like an emergency fund, investments, or other savings that can help you pay your bills and expenses if you are unable to find a new job right away. To build a financial safety net, it is important to focus on saving money and reducing debt. This may involve cutting back on unnecessary expenses, such as dining out or subscriptions you don’t use, and creating a budget to help you manage your money more effectively. Additionally, paying off high-interest debt, such as credit card balances, can help you free up more money to save for your safety net.</p><h3>Freshen up your interview skills</h3><p>While there is no need to panic and spend excessive time on interview preparation, it is important to refresh your interview skills. This can include researching common interview questions, enhancing your technical knowledge, and familiarizing yourself with the company and position you might plan to apply for. Having strong interview skills helps you stand out among other candidates and increases your chances of getting the job. Additionally, updating your resume and LinkedIn profile can also be a good way to make yourself more visible to potential employers. It is always a good idea to be ready for any unexpected job search opportunity that might come your way.</p><h3>Conclusion</h3><p>In summary, it’s important to remember that even if you are not currently affected by layoffs, it’s still a good idea to be prepared for potential changes in the job market. This can include staying informed about the company’s situation, identifying signs that your job may be secure, and building a contingency plan. Implementing these measures can enhance your capability to overcome any obstacles that may arise in the job market. Additionally, it’s important to stay calm and positive, and to continue engaging and being productive at work. Remember to always be vigilant and to continue developing your strategies, so you’re always ready for any uncertainty that may arise.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d9942f9d30f6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/surviving-layoffs-how-to-react-when-you-have-not-been-laid-off-d9942f9d30f6">Surviving Layoffs: How to React When You Have Not Been Laid Off</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Left Amazon after 7.5+ years; Here is my honest review.]]></title>
            <link>https://medium.com/geekculture/left-amazon-after-7-5-years-here-is-my-honest-review-48c86d7a03e1?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/48c86d7a03e1</guid>
            <category><![CDATA[amazon]]></category>
            <category><![CDATA[workplace]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Fri, 11 Nov 2022 05:02:47 GMT</pubDate>
            <atom:updated>2022-11-14T20:15:35.637Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iiOnjn_ZymZZFUFI7YSI7g.jpeg" /><figcaption>Amazon Office — Vancouver</figcaption></figure><p>I left Amazon to pursue other opportunities to fuel my career growth. When I joined Amazon Vancouver, the office was small with less than 200 employees. At the time I decided to leave, Amazon Vancouver had offices in multiple buildings incorporating thousands of employees. On my last day with the company, more than 97% overall of Amazon employees were hired after me. Both Amazon and myself experienced growth simultaneously.</p><h3>TL;DR</h3><p>I joined during one of the darkest times at Amazon. Thanks to the New York Times<a href="https://www.nytimes.com/2015/08/16/technology/inside-amazon-wrestling-big-ideas-in-a-bruising-workplace.html"> controversial article</a> in 2015 (one year after I joined), Amazon started some internal changes to improve the work environment. I came on board as a junior engineer and left as a senior. Looking back on my time as an Amazon employee, I do realize that I had made a lot of mistakes on the job. However, I’m happy that at least I can now recognize what I did wrong and avoid making the same mistakes again over time. To cut the story short, it’s hard for me to think of specific times where I felt indifferent regarding Amazon. My emotion toward the company was basically either love or hate. Based on my personal experience, I would like to share some of the things that I liked the most about Amazon and what I think could be improved or changed altogether.</p><h3>What I liked a lot about Amazon</h3><p>These are some of the reasons I enjoyed while working at Amazon. The company possesses many positive traits that can be beneficial to the growth and development of your career and expertise.</p><h4>The ultimate ownership</h4><p>One thing I really loved about working at Amazon is that you are not simply assigned a task to follow blindly. Instead, you are responsible for owning a project from start to finish. In some instances, you are only given a vague description of what needs to be done. Therefore, you have to communicate with many people to clarify the problem. Then, you follow suit by preparing a design, talk to more people, and revise the plan till you reach the final consensus. Afterwards, you can continue with implementation, testing, and a launch plan. Even after the completion, you continue watching the project to make sure it has been a successful feature.</p><p>Even as an engineer, you are expected to evaluate if a project really makes sense and make the necessary adjustments to create a path for successful implementation.</p><h4>Engineering Excellence</h4><p>Many services at AWS (Amazon Web Services) are pay-as-you-go. This means that the customers are only charged whenever their services are running reliably. Consequently, AWS receives nothing if the services are not running as expected. A similar situation exists for the retail website as customers cannot purchase efficiently if any of the dependent services are not working properly. So, it’s not hard to imagine that engineering excellence should be a key factor in any feature launches at Amazon.</p><p>That’s why as an engineer, you should always prioritize keeping engineering excellence in mind. For every feature launch, you need to have enough code coverage, reliable tests, proper metrics and alarms, an effective dashboard, and last but not least a detailed runbook to reduce the possibility and effects of potential issues.</p><h4>A lot of learning resources</h4><p>A wide range of learning materials are available internally at Amazon to help you ramp up quickly and resolve almost every possible issue in a short space of time. There is a Youtube-like channel for internally sourced and created educational videos, a stack-overflow type website in which engineers can seek help from their peers, and an efficient searching system that looks for anything inside wikis, emails, or codes to name a few.</p><h4>Your [technical] voice is heard regardless of your seniority</h4><p>In engineering discussions, what you say matters more than your level. In my “customer obsession” training class for the new hires, I was always encouraging them to challenge others’ decisions, especially if there was no clear rational reason behind them. I have been also advising them to not accept things just because they were expected to. In many meetings such as special design review sessions, I’ve seen many occurrences in which a junior asks challenging questions from a senior and the senior had to present a meaningful answer. No engineer should respond in a way that gives the impression that they are always right because they have seniority. They should be open to discussion, no matter their level.</p><h3><strong>Things that could be changed (in my opinion)</strong></h3><p>Amazon has some great initiatives but there are some aspects that I believe could be improved or changed for the better. Especially when it comes to creating a more efficient and happy workforce, Amazon could prioritize their human resource a bit more.</p><h4>Promotion is a game, you should know how to play it</h4><p>I guess this is not limited to Amazon and is valid for many other large corporations. At Amazon, you should have enough stories for almost all leadership principles and have enough supporting senior people to back your stories. As your rank goes up, it’s harder to be promoted. If your manager is new, your colleagues are juniors, or the team’s projects are not impactful enough, it’s much more difficult for you to move up.</p><p>It’s not about what you like to do or how well you do your job. It’s about finding the right team with the right projects. If you are missing a story for a leadership principle, you need to talk to your manager to find a project to address that. If you need a feedback provider, you also need to somehow connect to a senior with a plan to get feedback later. Sometimes, if you are lucky that you get into the a right environment from the beginning, all of these things happen naturally. However, in most cases, you need to pre-plan well before the promotion dates.</p><h4>Amazon pays more attention to the customers than employees; A lot more!</h4><p>In most of our product decisions at Amazon, we were considering our customers as the highest priority. Although there were some cases in which I believed that the business needs were put ahead of customer requirements, in general, customer needs are assumed as the highest priority. Even when dealing with tickets, we were always looking for customer-originated ones to take care of before anything else.</p><p>Customer care is important, but on the other hand, the pressure always falls to the employees’ shoulders. You would face hard times if customers were not happy, for whatever reason. On-calls could be especially frustrating without getting paid extra or receiving acknowledgement for being up all the night to work on operational issues. I have seen talented people left just because of on-call frustrations.</p><p>I remember a time when I asked a VP visiting our office about the possibility of benefits for on-calls (like extra paid hours for extra time you spend during your shift). I received the response of “if you do your on-calls perfectly, the Amazon stock goes up and you would benefit from it.” I don’t know how it can be justified these days when the stock prices are dramatically falling down.</p><h4>There is always something against you in the Leadership Principles</h4><p>While many companies stick to a couple of values to define their culture, Amazon leadership principles are ever increasing. At the time I joined, Amazon had 12 principles vs. the 16 principles they currently have. These principles have been part of the Amazonians’ daily communication whether you want to raise or destroy someone. For example, it’s not uncommon to hear things like “you need to show better bias for action” or “thanks for your bias for action”.</p><p>In the annual peer review, you have to choose at least one leadership principle as an area for the improvement. Managers are always equipped with a large selection of contradictory-like principles if they want to use them against an employee. For instance, if you deliver a feature under a very tight deadline (which naturally is delivered with limitation due to time pressure), a manager might say that you are good at delivering results and bias for action, while another can claim that you need improvement on “Insist on highest standards”.</p><p>I believe that a large number of cultural items can be deliberately misused to get the most out of an employee while promising the least in return. For instance, sometimes they can be vague like “Always Right” , or can also be contradictory like “Bias for Action” and “Insist on highest standards”</p><h4>Amazon pushes you to the last, not necessarily to the best</h4><p>When I joined Amazon, I had a week to complete the boot camp and the ramp-up process. On the second week, I got a real task. I should confess I really enjoyed “getting my hands dirty” as quickly as possible. However, the expectation from the new hires quickly increases over time to make sure that the employees can catch up to the Amazon-expected speed in no time at all.</p><p>New recruits often struggle to work faster to keep up with pace of the company which can affect the quality of their work. The best sentence to describe the situation is the one I was told when joining the Alexa team, “Drink water from the hose” meaning you need to learn a lot and work hard at a really fast pace.</p><p>To ensure that employees always “meet the bar”, every quarter, each manager would give the names of the 10% bottom performers to the HR or has to bring some proof to show if nobody is reported. Then, HR would ask the manager to present plans for the people on the list. If manager puts them in a mentorship program (which is usually the case), the employee then works closely and officially with the manager in a 2-month program. During this program, the employee cannot switch teams or take leave of absence. In the worst-case scenarios, the employee might enter a more serious 3-month performance program (like PIP) with harsher consequences which can lead to termination of contract. Unfortunately, I’ve seen many new hires end up in one of these plans in the first few months and quickly go under a huge amount of stress.</p><p>With such high expectations in the mentorship programs, many employees are pushed to their limits and not always to their best potentials. I remember during a design phase of a project, my manager assigned a colleague to help, however, he was in one of the programs which required him to deliver more code. In that situation, he was so stressed and desperately asked me to add some coding tasks to the project. I ended up asking him to write some integration test codes to satisfy the program needs, although I really needed him more for preparation of the design doc. After a couple of months, he ended up moving to another company despite them providing a lower income.</p><p>Another instance I recall is during one of the Amazon Prime days. The on-call from one of the Prime teams made a mistake causing the customer to not be able to purchase for a while. I don’t know if he was punished by his manager or whether the whole incident was considered an honest mistake. What I heard from his colleagues was that he took the next day off and was thinking of committing suicide by jumping from the Lions Gate bridge!</p><p>Even managers can be affected by the high-paced environment. I’ve seen managers who did their best to alleviate some of the pressure experienced by employees. Yet they still ended up being crushed and left Amazon. New and less senior managers often get dealt the most stress because they have to experience the pressure from both engineers and higher managers.</p><h4>On-calls kill your life, unless you choose your team wisely</h4><p>Picture going to bed at 12am, getting paged at 1am, fixing the issue, going to bed (again) at 2am, only to get paged at 3:30am. It sounds very exhausting, however, this is a familiar story for many Amazonians who experienced on-calls at Amazon. Some teams suffer from a significant amount of operational issues causing terrible frustration for the on-calls. They are usually so overwhelmed with list of new features that they can barely spend time on operational excellence to make the mandatory on-call shifts more tolerable.</p><p>You have to choose the right team from the beginning to ensure that you can professionally grow in that team. Being on a team that works proficiently and having colleagues who can stand up to the challenges the team may encounter can make a huge difference.</p><h3>Final thoughts</h3><p>It’s hard to make a generic statement about a very large company like Amazon. Factors like managers, colleagues, and projects to name a few can have huge positive or negative impacts on your career. Therefore, these factors don’t necessarily relate to or can’t be generalized to Amazon as a whole.</p><p>In a nutshell, Amazon is a great engineering company with a lot of highly impacting and technically challenging projects. This really helps employees to learn top-notch concepts at a very quick pace. However, it comes with a price, which can affect other aspects of life such as your health, or relationships with loved ones if the situations are not managed properly.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=48c86d7a03e1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/left-amazon-after-7-5-years-here-is-my-honest-review-48c86d7a03e1">Left Amazon after 7.5+ years; Here is my honest review.</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[8 Simple Steps To Handle Conflicts Like a Leader]]></title>
            <link>https://medium.com/better-programming/8-simple-steps-to-handle-conflicts-like-a-leader-694475f6b768?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/694475f6b768</guid>
            <category><![CDATA[leadership]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[management]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Thu, 18 Aug 2022 15:16:06 GMT</pubDate>
            <atom:updated>2022-08-18T15:16:06.350Z</atom:updated>
            <content:encoded><![CDATA[<h4>And getting the most out of your teams</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mI0FiWpoCTTer8ItfH4DDw.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/Pemika?mediatype=photography">KTStock</a> on <a href="https://www.istockphoto.com/">iStockPhoto</a></figcaption></figure><p>In both our work and personal lives, conflicts are inevitable. Some common sources of conflict include opposing positions or views, competitive tensions amongst colleagues, or even jealousy. Power struggles, ego, pride, performance inconsistencies, and compensation issues are also areas where conflict can arise. Sometimes, a conflict simply occurs because someone is having a bad day.</p><p>It’s important to distinguish between disagreement and conflict. In a workplace, disagreements can help you to assess situations from different perspectives. But if not properly managed, disagreement can quickly convert to a destructive conflict.</p><p>As a leader, you should prioritize developing skills that prepare you to handle any form of conflict in a professional manner. Here are eight simple steps to handle conflicts like a leader:</p><h3>1. Communicate Face to Face</h3><p>Communication is key when it comes to resolving disputes. However, text-based communication such as emails, instant messages, or notes may not diminish the conflict. On the other hand, it can also potentially escalate the situation due to misunderstanding. Body language, tone, and eye contact are important communicative cues that help people better understand each other. Try to book a meeting in a safe space to discuss the issues at hand. If the parties involved cannot meet at the same location, a virtual conference call is your closest alternative.</p><h3>2. Be a Good Listener</h3><p>Conflicts consist of two or more persons. Everyone has a voice, opinion, and way of perceiving problems. You also have your own prejudgment of the circumstances. It is important to remain objective when listening to your colleagues and gather as much information as possible. This can be achieved by:</p><ul><li>Listening to what is being said before reacting</li><li>Not interrupting when the other person is speaking</li><li>Making sure you understand what is being said by rephrasing and repeating the points made</li><li>Asking questions to clarify your understanding of the situation further</li></ul><p>Sometimes conflicts occur because people feel like their voices aren’t being heard. Encouraging open communication and giving colleagues a platform to voice their concerns can significantly impact conflict resolution.</p><h3>3. Identify the Areas of Conflict</h3><p>Before moving forward on any resolution, you must have a firm understanding of the conflict. You can then prioritize which areas need urgent resolution. Identify the disagreements, and discuss the unmet needs of both parties that have caused the conflict. Finding out what can be compromised or agreed upon is also important to work on a solution. Summarize the points and ensure that both parties can reach a mutual understanding of what the problem is based on your assessments and investigation. This should be accomplished before moving on to any further resolution and may be a lengthy process.</p><h3>4. Gather Information</h3><p>Ensure that there is enough information to identify the conflict. Sometimes, the lack of information may be the source of the conflict. As such, you should then plan how and where to get more information to make a better decision. This can involve looking for deep underlying issues. For example, talking to other colleagues to find out how they feel about the conflict or in what ways it affects them can provide valuable insight and feedback.</p><h3>5. Find Short- and Long-Term Solutions</h3><p>It’s not uncommon to meet engineers who try to find the perfect solution. However, most of the time, that solution is cost-effective and not practical. Differing views will also come with different proposed solutions. Each party may think they have the best approach. It would be wise to break up the solution into phases to avoid confusion and chaos.</p><p>Short-term goals should be quickly agreed upon to address urgent concerns. In other words, the solution may not be achieved in one fell swoop but may require work over time. In my experience, I noticed that people are more likely to agree on a good enough (vs. perfect) solution for the short-term solution, and consequently, a common consensus can be reached more quickly.</p><p>Every a short-term goal reached, however, can alleviate much of the stress and tension caused by the conflict leading to more constructive discussion about the longer-term goal.</p><h3>6. Assign Responsibility</h3><p>Solving conflict takes time and commitment. Each involved party has to work on finding a good enough solution that benefits everyone involved. Each person should contribute to different areas to improve the situation. They may have to take steps to rectify the issues that they are facing. Setting common goals that align with the company objective or determining ways each colleague can work together is beneficial in the long term. This gives each person time to fix discrepancies and reasonably reach common ground. Taking responsibility also boosts accountability and makes each person more dependable as they work towards a sustainable solution.</p><h3>7. Present a Tangible Agreement</h3><p>When a solution or method is agreed upon to mitigate conflict, it should be written down and sent to the stakeholders to ensure that everyone has a mutual understanding of the agreed approach. Documenting each phase of conflict resolution is vital to prevent future occurrences and provide tools to resolve similar issues quickly. This makes it easier to follow through on your plan and make adjustments as needed.</p><h3>8. Evaluate the Solution Over Time</h3><p>As a leader, you should closely observe and point out progress made over time that shows a positive outcome of the proposed approach. Being actively involved, guiding colleagues, and keeping communication open will help with the long-term success of the solution. You can also keep looking for ways to make the solution work better or be more efficient over time. Changes may occur, roles are often switched around, and balance may be thrown off, which can affect your plan. Keep a ‘let’s work out a solution’ attitude when faced with adversity in the workplace.</p><h3><strong>Conclusion</strong></h3><p>In conclusion, everyone faces conflict at various times in their home or work life. Therefore, one must be well equipped to deal with conflict when it appears. Finding a solution may not be instantaneous. Most likely, it will consist of several meetings, back and forth correspondence, and brainstorming before an appropriate resolution can be found. How you handle conflict also helps with future proofing against the same problem. Good conflict resolution should provide insight and expertise on managing situations professionally when issues arise.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=694475f6b768" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/8-simple-steps-to-handle-conflicts-like-a-leader-694475f6b768">8 Simple Steps To Handle Conflicts Like a Leader</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Study Plan to Land Senior Software Engineer Positions at Meta, Google, and More]]></title>
            <link>https://medium.com/better-programming/study-plan-to-land-senior-software-engineer-positions-at-meta-google-and-more-cd5362dda84?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/cd5362dda84</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[interview]]></category>
            <category><![CDATA[jobs]]></category>
            <category><![CDATA[careers]]></category>
            <category><![CDATA[interview-preparation]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Mon, 09 May 2022 15:58:45 GMT</pubDate>
            <atom:updated>2022-05-16T04:01:43.429Z</atom:updated>
            <content:encoded><![CDATA[<h4>My 3-month plan to better prepare for Sr. Software Engineer interviews.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HSY4FKxw0M7jlre9zKXLjA.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/Rawpixel?mediatype=photography">Rawpixel</a> on <a href="https://www.istockphoto.com/">iStockPhoto</a></figcaption></figure><p>First, I have to mention that this preparation plan is based on my own experience and might not necessarily work for others, however, there are general recommendations that can be beneficial to anyone interested in the process.</p><h3>TL;DR</h3><p>Here’s a little background story about myself. I worked at Amazon for 7.5+ years. At the time of my departure from the company, more than 97% of Amazonians were subsequently hired. The decision to leave came as a result of wanting to look for opportunities elsewhere, explore new challenges, and increase my total income. I was a semi-active interviewer at Amazon, but apart from that, I haven’t prepared for technical interviews in several years. After a couple of months of preparation and interviews with some software companies, I received multiple offers. Then, after some negotiations, I signed an offer and accepted a senior engineer position at Meta (formerly Facebook).</p><h3>Determine if you are really a senior engineer</h3><p>If you do a quick Google search, you’ll find many articles talking about the definition of seniority for software engineer positions. However, years of experience don’t necessarily translate to a seniority level. For example, if you have done any of the following, consider yourself a senior engineer:</p><ul><li>Led a project with a larger scope than your immediate team which included a large amount of communication with external teams.</li><li>Are familiar with System Design concepts and independently designed a semi-complicated system.</li><li>Your code is clean, well-documented, and with proper test cases.</li><li>Mentored other engineers/interns. Mentorship can have different forms and range from reviewing others’ code, active participation in design meetings, or setting up learning sessions to fully mentoring engineers from the beginning till the ramp-up goal is reached.</li><li>Proactively look for ways to solve a problem without being told</li></ul><p>Personally, I consider the above items to be the basic or the minimum requirements a senior engineer should possess. If you are missing one or more of the above items in your experience, you should actively plan to gain that valuable experience before applying for any senior position. Landing a senior position at other companies also requires a preparation strategy as well as consistency and commitment. Here is a breakdown of what my preparation plan looked like.</p><h3>Before Preparation</h3><h4><strong>1. Determine how much preparation you need</strong></h4><p>The first step I took was solving <a href="https://leetcode.com/explore/interview/card/top-interview-questions-easy/">popular easy questions</a> on LeetCode without timing how long it took to solve each problem. I solved about 70% of the questions without paying attention to the time. This also provided a great refresher course for certain data structures like PriorityQueue (Heap) that I never used in my daily job. Based on the outcome, I noticed that at least 3 months were required for me to pass the onsite interviews.</p><h4>2. Find out the target companies</h4><p>It’s important to research and compile a list of companies that you want to apply for. For each company, I read descriptions for available positions to determine if they were aligned with my interests and check whether I met the requirements. This step can be also done weeks before your preparation and gives you a better idea of what to expect from certain companies and positions.</p><h3>Week 1–4, Before phone interviews</h3><h4>1. Focus on Algorithms/Coding</h4><p>In my former position, I was already designing large-scale systems. The challenging part is the coding questions that required more time for practice. In terms of the difficulty of the questions, I spent 20% of my time on easy, 70% on medium, and 10% on popular, hard questions (e.g. <a href="https://leetcode.com/problems/word-ladder-ii/">Word Ladder 2</a>, <a href="https://leetcode.com/problems/alien-dictionary/">Alien Dictionary</a>, <a href="https://leetcode.com/problems/minimum-window-substring/">Minimum Window Substring</a>, and <a href="https://leetcode.com/problems/word-break-ii/">Word Break 2</a>). Again, I didn’t time myself but made sure I thoroughly did my best to solve the problems before jumping to the solutions. To make more use of the limited preparation time, I created a <a href="https://medium.com/geekculture/10-mistakes-to-avoid-when-preparing-for-coding-interviews-275766a6b92d">10 Not-To-Do list</a> when solving questions on LeetCode.</p><p>Another strategy was booking mock interview sessions on <a href="https://techmockinterview.com/">TechMockInterview</a> to better understand which areas I needed to improve from a professional’s point of view. I booked coding sessions with Google and Meta interviewers which ended up being quite beneficial.</p><h4>2. Apply for the positions</h4><p>I applied to my targeted positions during the first 2 weeks. The response time varied with some companies responding in a matter of days, some in 1–2 weeks, a few never responded and others sent rejections within the resume evaluation phase.</p><p>During this period, I took the initiative to set up the phone screening around the 6th week with the recruiters. Once the phone screening dates were finalized, I created a doc for each company and gathered all coding, system design, and behavioral questions I could via searches on Glassdoor, LeetCode discussion section, and preparation materials that those companies had provided.</p><h3>Week 5–6: Final preparation for phone screens</h3><p>The phone screens are heavily focused on coding and perhaps a few behavioral questions. It’s good practice to have a margin of at least 2–3 days between each interview and use it for reading the company-specific docs mentioned in the previous section. This time, I timed myself during the coding preparations.</p><p>An important but commonly overlooked part is the behavioral questions. A company like Snap mentions that one of the must-know questions would be “Why Snap?” and fair enough this was the first question asked. I also gathered a list of behavioral questions and tried to answer each precisely in a <a href="https://en.wikipedia.org/wiki/Situation,_task,_action,_result">STAR</a> manner.</p><h3>Week 7–12: OnSite Preparation</h3><p>I managed to pass all the phone screens except for one. Ironically, it was the same interview I felt most confident about. It’s important to note that you will encounter disappointments during the process. However, instead of trying to analyze the reasons behind any rejection, it’s more feasible to shift your focus to the rest of the interviews that you have lined up.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*y7TwupwaoWMPeYNHYOlQHQ.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@linkedinsalesnavigator?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">LinkedIn Sales Solutions</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><h4>1. System Design</h4><p>For the senior position interviews, you should expect at least one system design round. This plays a significant role in determining your seniority level in the final offer. Note that</p><blockquote>If you do a commendable job in coding but perform mediocre in the system design round, they might reject you or offer an intermediate position.</blockquote><p>If you consider yourself a senior engineer based on the minimum requirements previously mentioned, then you should be familiar with basic system design concepts and have led design sessions in your current position. For system design, I studied the following materials:</p><p><a href="https://www.youtube.com/channel/UCn1XnDWhsLS5URXTi5wtFTA">Tech Dummies</a> Youtube Channel: His videos are based on his research on many technical blogs. The designs that he explains are very close to the architecture of real-world services. Some videos might look lengthy but there are many concepts to be learned (e.g. Count–min sketch) from watching the videos.</p><p><a href="https://www.youtube.com/channel/UCRPMAqdtSgd0Ipeef7iFsKw">Gaurav Sen</a> Youtube Channel: The explanation style of this particular channel is very close to what is expected in a system design interview. One downside for me, however, was that he sped up the voice on some videos which may be a little frustrating to some viewers.</p><p><a href="https://www.educative.io/courses/grokking-the-system-design-interview">Grokking the System Design Interviews</a>: My personal preference is videos over text so the tutorials were a task for me to endure. Also, they are highly focused on gathering a lot of numbers and calculations which isn’t truly necessary. Unless you are specifically asked about something like the number of needed servers, you simply just need a rough idea about the scale of the system from the gathered numbers. For instance, you should know whether storing data in memory is a feasible option considering the requirement or if you need another way or even a hybrid approach to store your data. It’s solely dependent on the question and the interviewer’s preference.</p><p>I followed a very simple structure in my system design interviews unless the interviewer wanted to lead me in a different direction. In a nutshell, these are the methods that worked for me:</p><ul><li>Clarifying questions, gathering functional, and non-functional (e.g. availability, consistency, latency, durability, numbers related to the usage of the system, etc.): 10 mins</li><li>API Design: 5 mins</li><li>High-level design (most of the cases following a micro-service architecture): 10 mins</li><li>Data Model (e.g. table designs): 5 mins</li><li>Answering follow-up questions or going into details of a component: 10–15 mins</li></ul><h4>2. Coding</h4><p>Regardless of your position, the software engineer interviews are heavily focused on coding. You should expect on-site questions to be somewhat more difficult than phone screens. At this stage, more focus should be placed on timing.</p><p>During my preparation, I noticed <a href="https://myinterview.guru/6-concepts-you-must-know-to-pass-coding-interviews-e655aad756d4">6 really popular topics</a> in the questions asked by the interviewers. I spent extra time pursuing the relevant questions to these topics.</p><p>There are also algorithms/concepts that are highly recommended to review in case they appear in hard questions, these include Dijkstra shortest distance, Bellman-Ford, Prim algorithm on MSP, Fisher-Yates Shuffle, Quick Select, Graph Coloring, Interval Tree, and Segment Tree.</p><h4>3. Behavioral</h4><p>Never underestimate the importance of behavioral questions. Failure in this section is a failure in the interview regardless of your performance in the technical part. At Amazon, I saw many candidates (although they performed well in the technical part) got rejected solely because they didn’t provide acceptable scenarios in the behavioral section.</p><h4>4. Mock Interviews</h4><p>There are some mock interview platforms online. As mentioned before I used TechMockInterview.com and was quite happy with it. Before the onsite round, I booked a couple of more sessions with Google/Meta interviewers and received valuable feedback on my performance. It should be noted that their questions were more interesting and more challenging than what played out in my real-life interviews. They were so efficient that I felt more stressed in the mocks compared to the real interviews! This is why having mock interviews with friends or sessions with professional services are essential to assess your performance in real interview situations.</p><h3>Negotiations and Final Offer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8lKDJjoqRNfDTtffPo0-ng.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@nullplus?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Razvan Chisu</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>My personal goal was to get multiple offers from the companies I admired and wanted to work for. Multi-offer situation gives you more power to negotiate and choose your happy path more confidently. In the end, getting a good position is not all about the money. It’s about what makes you feel satisfied in the new role. If you turn down an offer just because another company offered you a higher salary, you might end up working in a role you don’t like. This could potentially lead to working in an environment that is frustrating and misaligned with your career goals. Think deeply about what you want (growth opportunity, work-life balance, learning new tech stacks, etc.) and negotiate until you reach a final decision that presents the closest representation of your expectations.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cd5362dda84" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/study-plan-to-land-senior-software-engineer-positions-at-meta-google-and-more-cd5362dda84">Study Plan to Land Senior Software Engineer Positions at Meta, Google, and More</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Run a Successful Team Brainstorming Session]]></title>
            <link>https://medium.com/better-programming/how-to-run-a-successful-team-brainstorming-session-2ae4fa6e2bb0?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ae4fa6e2bb0</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[career-advice]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Mon, 07 Feb 2022 17:11:07 GMT</pubDate>
            <atom:updated>2022-02-07T17:11:07.884Z</atom:updated>
            <content:encoded><![CDATA[<h4>Tips on how to schedule and run an effective brainstorming session</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VvVTVWmTfS3SetMymLU20A.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@reddalec?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Redd</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>All of us, officially or unofficially, have participated in a brainstorming session at some point. When you discuss weekend activities with some friends and everybody shares ideas, you are brainstorming to ensure that your weekend is well-planned. Brainstorming is a mechanism that allows everyone to share ideas in a common forum that allows everyone to reach a consensus. As Vincent Van Gogh once mentioned:</p><blockquote>Great things are done by a series of small things brought together.</blockquote><p>This exemplifies what brainstorming brings to the table. It helps to figure out a new direction or confirms the current direction or pathway that’s already panning out. Whenever you don’t know many aspects of a problem but you need to make a prompt decision, brainstorming can help to make up your mind by collecting and trimming ideas from other people with diverse backgrounds. For, instance, if you plan to implement new mechanisms in your service for better user engagement, you might decide to brainstorm with your colleagues. In this article, I try to bring some guidelines to better organize the brainstorming sessions in your company.</p><h3>Benefits of a brainstorming session?</h3><p>Before planning for any session, think about how the various ways brainstorming can help. Some of the major benefits of brainstorming include:</p><p>Boosts group morale: When brainstorming, every individual’s ideas are brought to the table in a setting that makes everyone feel welcome to share. This leads to people in the group feeling that they’re valuable and that their insights are going to be useful.</p><p>Creative thinking: Brainstorming inspires and nurtures creative thinking. In a great brainstorming session, you can ask questions and immediately receive random ideas. The momentum and ease at which ideas flow can spark many different perspectives to deal with the topic at hand. It’s important to take note of all the ideas generated in a session.</p><p>Lots of diverse ideas: This can sometimes be difficult because what we want to focus on is not just the quality of the idea, but the number of ideas that arise. This could be hard, especially when you or others want to be ‘right’. <em>Brainstorming is not about who is right, it’s not about who has the best or worst ideas, it’s about getting all of the ideas out there.</em> When the brainstorming session is completed, then the team can review the ideas and start harvesting the most suitable proposals to be able to come to a consensus as a group.</p><h3>What to do before hosting the session?</h3><h4>Allow people to prepare</h4><p>People are more creative, and generate better ideas, when they have a head start working on their own. This preparation can be accomplished in a couple of different ways.</p><ul><li>Send out emails with documents to review: Before the session, send out relevant documents to view via email so participants can read them, ahead of time.</li><li>Email the agenda early: You want to make sure people know what to expect from the time that they are dedicating to this process. Therefore, emailing the meeting agenda or giving a breakdown of the meeting goals can be helpful.</li></ul><p>These two simple tasks can be good practice whether the grain production is being done in person or virtually.</p><h4>Set a clear goal</h4><p>Sometimes, the goals get confusing and people are not sure what they are supposed to achieve at the end of the session. Something like “we need to create the next generation of our current product” is too vague for a brainstorm. People won’t know how to prepare, the discussion will go all over the place, and it is unlikely anything actionable will result. A better approach to a big problem is to start with an organized framework or have a set list of sub-problems to discuss.</p><h4>Invite the right people</h4><p>When inviting people to a brainstorming session it’s vital to make sure that they are people who are invested in the success of the session. In other words, don’t invite guests just because they’ve got a big reputation. Invite participants who have a deep interest in the topic or have working experience with matters related to your quest.</p><p>Essentially, you want to identify with the people you are inviting and that they are people who can impact the outcome These individuals can be stakeholders, subject matter experts, engineers, or designers to name a few.</p><p>You should also aim to keep spaces limited. The reason for this is because when you get too many voices and opinions involved it can create excessive noise. This can cause the team to lose sight of the goals you are trying to accomplish and be counterproductive.</p><h3>What to do at the beginning of the session?</h3><h4>Choose a reliable facilitator</h4><p>In a brainstorming session, you will need some form of mediation. This job is usually tasked to a facilitator. The person chosen for this role should have experience in brainstorming, be organized, and most importantly, be unbiased. A good facilitator will ensure that the session runs smoothly, take account of participation and meter the exchanges so that everyone gets a fair chance to shares their ideas.</p><h4>Introduce everyone</h4><p>Before getting into any discussions, you should conduct introductions. It is not only just for courtesy but an important part of any brainstorming session, especially in a virtual environment. Everyone should know who they are talking to. If it’s a new group, you may not know each other at all. Just saying “My name is Steve and I’m a product manager,” is not very meaningful and doesn’t give a clear insight into what someone’s purpose is. Everyone needs to know what is the actual contribution of each person to the topic of the session.</p><p>One popular method to get the ball rolling is to have icebreakers. If the group members are meeting for the first time or are unfamiliar with each other, icebreakers are great to allow them to get to know each other better. Brainstorming has a degree of vulnerability attached. You are trying to open yourself up to suggest ideas that may be kind of stupid and that’s fine Silly ideas can sometimes lead to incredible breakthroughs, but you have to be willing to be vulnerable with that group of people.</p><h4>Think about smaller groups</h4><p>Divide people into smaller groups when it comes to brainstorming highly technical areas. Or when you have to brainstorm areas where there’s an overload of information that makes it difficult to filter through what you need to achieve. Small groups allow members to take a big or complicated idea and break it down into something more concrete and specific. The key is then to bring those groups back together again later on and review what was learned to fine-tune the findings.</p><h3>What to expect during the session</h3><h4>Choose a proper technique</h4><p>Even after introductions are completed, if people are new to each other, it’s better to start with an open conversation, typically with a time limit. This allows everyone to set the pace for the meat of the discussion and feel each other out. At the end of the conversation, the facilitator might find one of the below approaches (or a combination of some) better than another depending on the group:</p><p>Brainwriting: Allow some time to write your ideas on pieces of paper with a time limit (typically 5 mins) to warrant that your opinions are not influenced by others. Facilitators can then collect the pieces of paper.</p><p>Starbursting: As an alternative to writing the suggestions, ask questions instead. Why should we charge for this? Why can’t it be free? Is there a better tool? Is there someone else that can help us? The advantage is to evaluate the topic from different aspects. For example, we might ask why we are doing it in this way. The answer might be because it’s been always like this for years.</p><p>Round robin: Give one idea at a time as a method to collect ideas one by one. This creates a more inclusive and supportive environment where everyone gets a chance to be heard.</p><p>There is a wide range of <a href="https://www.indeed.com/career-advice/career-development/brainstorm-exercise">other techniques</a> that might be helpful depending on the subject and the involved people.</p><h4>Write everything down</h4><p>Use a whiteboard or digital board to capture and display the ideas that are given. List everything as it comes and proceed to trim down the ideas later. If you don’t have access to a large whiteboard, take a photo, before erasing it to add the new ideas.</p><blockquote>Never criticize or purposefully remove any ideas!</blockquote><p>Everything should be written down. This method allows the output of the session to consist of the most favored ideas or particular themes that came up and need to be highlighted. Additionally, the output should address any highly creative and innovative ideas that stand out, even if they were not voted on to any great extent.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YqSKsTxlHPURy0AqexYiqg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@perloov?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Per Lööv</a> on <a href="https://unsplash.com/s/photos/brainstorming?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><h4>Wrap up the session</h4><p>After the meeting is complete, there is still a lot to be done. Brainstorming helps you get ideas, but you are then faced with choosing the best approach as well as implementing the most suitable suggestions. To keep things simple, consider the following:</p><ul><li>Assign tasks appropriately — Does the task require a second opinion or require more data?</li><li>Set due dates for follow-up meetings.</li><li>Assign a point of contact if a person is blocked for gathering data, for instance.</li><li>Send an email about the dates, copies of data, or relevant information that is necessary for moving forward.</li></ul><h3>What should be done after the session?</h3><h4>Schedule a follow-up conversation (if needed)</h4><p>Some ideas may take more time to understand or be discussed thoroughly. Therefore, it may be necessary to schedule a follow-up “immediately” to make sure that they are managed. If a solution is not finalized and needs further discussion it is important to get it underway as soon as possible to avoid delays and prevent problems that can affect deadlines or delivery dates.</p><h4>Email the result</h4><p>After the session has concluded, send an email containing recognition and acknowledgment of the meeting and the result. Make sure that it gets the visibility of upper management to get their ongoing support. All participants should receive copies of the meeting agenda, minutes or notes, the list of ideas documented, and any requests for follow-up or clarification.</p><p>You should also thank your group members for their time, expertise, and contribution to the brainstorming. Showing appreciation leads to building better relationships and networks that can be a great asset for future brainstorming sessions!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ae4fa6e2bb0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/how-to-run-a-successful-team-brainstorming-session-2ae4fa6e2bb0">How to Run a Successful Team Brainstorming Session</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Make Code Reviews More Efficient]]></title>
            <link>https://medium.com/better-programming/how-to-make-code-reviews-more-efficient-5a4d2be47ad8?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/5a4d2be47ad8</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[work]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[software-development]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Mon, 24 Jan 2022 16:47:49 GMT</pubDate>
            <atom:updated>2022-01-24T16:47:49.934Z</atom:updated>
            <content:encoded><![CDATA[<h4>Through efficient CRs, we want to catch potential issues without hindering the process of deploying the code to the production</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZtrAag-ywlYrtmUcMOvFDA.jpeg" /><figcaption>Photo by <a href="https://www.istockphoto.com/portfolio/gorodenkoff?mediatype=photography">gorodenkoff</a> on <a href="https://www.istockphoto.com/">iStockPhoto</a></figcaption></figure><p>The simple goal of a code review (CR) is to ensure that the code is in a better state after the review. Through efficient CRs, we want to catch potential issues without hindering the process of deploying the code to production. Studies have shown that peer reviews are generally more effective than testing at finding software defects. In his book, <a href="https://www.amazon.com/Code-Complete-Second-Steve-McConnell/dp/0735619670">Code Complete</a>, Steve McConnell affirms that software testing as a standalone method has proven to display limited effectiveness:</p><blockquote>… software testing alone has limited effectiveness. The average defect detection rate is only 25 percent for unit testing, 35 percent for function testing, and 45 percent for integration testing. In contrast, the average effectiveness of design and code inspections are 55 and 60 percent.</blockquote><p>The CR author is the ultimate owner of the change. He/she is also responsible for ensuring that the change is error-free and aligned with the team policies. The author should do the best to send a clean, correct, and well-tested code to the reviewer and should not solely rely upon others to detect issues.</p><p>If you do a quick online search, you will find excellent CR best practices like the one by <a href="https://google.github.io/eng-practices/review/reviewer/">Google</a>. In this post, I’ll provide my take on what to consider for an efficient code review.</p><h3>Who Should Review the Code?</h3><p>CR is a learning opportunity for both the author and the reviewers. Consider adding these people as your code reviewers:</p><ul><li><strong><em>Domain experts</em></strong> — It’s clear that a person with domain knowledge will have more context. They also need less time to look at new revisions compared to a less-experienced reviewer. Thus, saving time as a team.</li><li><strong><em>New engineers </em></strong>— Reading the code is a great opportunity for new hires to learn the code base and understand what code styles are being followed in the team. It can help them to understand the service underlying logic quickly and can be beneficial when writing their own code or during their on-call shifts.</li><li><strong><em>Someone better than you!</em></strong> — Try to find people that have more expertise than you and get their opinion on your code. Sometimes, they can recommend a new design logic, a library or design, for instance, that makes your code better to perform and understand.</li></ul><p>Note that people will have personal preferences and different people may come up with different non-blocking comments. Therefore, keeping a low number of reviewers on a CR could reduce excessive back-and-forth amongst different people.</p><h3>What to watch in the CRs?</h3><p>You should review the code with several key questions in mind to retain focus. For instance, you might evaluate the code to answer the following:</p><h4><strong>Code Correctness</strong></h4><ul><li>Is the code functioning as it should? Are there any ambiguous requirements? Are there unwritten requirements that you need to contemplate? Does it activate a suitable response when things fail?</li><li>Are there any bugs or errors?</li><li>Did side effects occur because of the change?</li><li>Are there sufficient unit/functional rests to cover the change?</li></ul><h4><strong>Clarity</strong></h4><p><strong><em>Simplicity:</em></strong> The code should be easily understood even with a quick scan. Especially at 3 am in the morning, when the on-call gets paged and wants to find the issue quickly! Are you using cascaded calls? Are the names clear? For example, if you are using a Java lambda, think about if it’s even necessary. Lambda often makes the code cleaner and easier to understand.</p><pre>Arrays.sort(arr, (s1,s2) -&gt; s1.length() — s2.length());</pre><p>However, it can quickly become a complex and difficult-to-understand code block if <a href="https://www.vitavonni.de/blog/201603/2016030101-stop-abusing-lambda-expressions---this-is-not-functional-programming.html">too many cascaded logics</a> are introduced.</p><pre>Stream&lt;Pair&gt; allFactorials = Stream.iterate(<br>  new Pair(BigInteger.ONE, BigInteger.ONE),<br>  x -&gt; new Pair(<br>    x.num.add(BigInteger.ONE),<br>    x.value.multiply(x.num.add(BigInteger.ONE))));<br>return allFactorials.filter(<br>  (x) -&gt; x.num.equals(num)).findAny().get().value;</pre><p><strong><em>Style:</em></strong> As part of a CR, you are assessing if the code is consistent with the surrounding ones. In many IDEs, you can set a specific code style (indentation, remove unused imports, documentation, etc.) to be applied automatically on the code. If you are a Java developer, take a look at the <a href="https://google.github.io/styleguide/javaguide.html">Google Java Style Guide</a> for comprehensive best practices documentation.</p><p><strong><em>Brevity:</em></strong> Each function or method should be brief and straightforward in its expected intent and limited to a “page” (a few dozen lines of code) at most. Instead of putting multiple independent changes (e.g. multiple unrelated fixes) into a single CR, consider splitting the change into multiple ones.</p><blockquote>Every CR should essentially have a single goal.</blockquote><p>Single responsibility makes the code easier to review and much easier to roll back if a specific functionality is problematic. If the CR is serving a big goal, think about breaking it down into individual, self-contained sub-goals.</p><p><strong><em>Documentation:</em></strong> Consider if the code is appropriately documented for someone else to comprehend and maintain. Are the comments easy to understand? Does it add value to the surrounding code? Do the functions have clear intent? Would a few comments outlining a description of expectations help?</p><h4>Design</h4><p>In most scenarios, the CR might affect either low-level or high-level design. When reviewing the code, try to answer the following questions:</p><ul><li>Is the design sensible? (with changes or without)</li><li>Do the changes mesh well with the existing design? (e.g. do new responsibilities belong to the changed entity?)</li><li>Will any changes reveal weaknesses in the existing design? (e.g. simple behavior changes that require complex code changes to fix)</li><li>Does the change fully cater to all of the features / issue’s requirements? Is there any uncertainty or doubt with regard to the interpretation of the requirements that could create issues in production?</li><li>Is there adequate room to apply an enhanced design pattern? For example, if a method has a large number of inputs, can a builder pattern for improved clarity and extendibility be applied?</li></ul><h4><strong>Backward Compatibility</strong></h4><ul><li>Is the code backward compatible with pre-existing API?</li><li>Is it backward compatible with the pre-existing configuration?</li><li>Are there backward-incompatible changes that aren’t really required?</li><li>If there are backward-incompatible changes, how can they be managed in terms of package builds, deployment, and communication?</li></ul><h4><strong>Reuse</strong></h4><ul><li>Does the package contain duplicated code?</li><li>Are there any local functionalities that should be in a shared library?</li><li>Can any code be completely removed or replaced with existing libraries to boost efficiency?</li></ul><h4><strong>Config or Constants</strong></h4><ul><li>Does behavior activate random constant values that ought to be configurable?</li><li>Are there magic numeric or staring constants found or repeated in the code?</li><li>Are there default values available for all config settings?</li><li>Is the behavior of the configuration setting properly documented?</li></ul><h4><strong>Performance</strong></h4><ul><li>Does anything indicate that there is premature optimization?</li><li>Are there obvious performance or efficiency problems that are not deemed important to address?</li><li>Does the code take longer to perform even if most of the additional time is spent blocking?</li></ul><h4><strong>Dependencies</strong></h4><ul><li>Are there novel external dependencies being implemented that could potentially introduce a brand new availability or operational risk?</li><li>Is each new library dependency compulsory? Are existing dependencies indispensable? Is it possible to solve the issue in a simpler way?</li><li>Are there other “lighter-weight” dependencies that could be utilized instead?</li></ul><h4><strong>Failure</strong></h4><ul><li>Is the code able to garbage return values from any library code that’s called?</li><li>Will the code handle edge cases?</li><li>Does the code handle just the happy path or does it also handle all the error conditions?</li><li>Is there transparency and a reliable strategy to handle exceptions?</li></ul><h4><strong>Logging and metrics</strong></h4><p>The code should have ample logging mechanisms so that in case of an issue, it’s easy to evaluate and troubleshoot the problem quickly. Always ensure that a sufficient amount of information is being logged. However, keep in mind that over-logging, in turn, can trigger security concerns (e.g. confidential information such as customers’ email addresses in logs) or performance issues (a large amount of I/O caused by a significant amount of unnecessary logging).</p><p>For the metrics, try to determine if the code is being used with performance metrics. This includes items such as rate of calls, type and latency to name a few. Do metrics exist around all remote calls leaving the process and host? How are you able to pick up on stress/load/deviations?</p><h4><strong>Security</strong></h4><p>Try to evaluate if the code violates any data handling policy. Is the current code exposed to any security threat? For example, if the code handles user inputs, is the code secured against <a href="https://www.sqlshack.com/sql-injection-detection-and-prevention/">SQL Injection</a>?</p><h3><strong><em>What information should be included in a CR request aside from the code?</em></strong></h3><p>A CR request isn’t only about the code. Essentially, it contains all relevant meta-data and code reviewers’ discussions that can be used as references in the future. I recommend putting data into a CR request that include:</p><ul><li>References (ticket number, wiki doc, design doc, etc.)</li><li>Descriptions of changes: Highlight major touchpoints (again, imagine that something goes wrong at 3 am and somebody wants to see if your change is related).</li><li>Alarm and metrics pending configuration</li><li>How the testing is instrumented</li><li>Any specific considerations such as deployment order, backward compatibility, or dependencies)</li></ul><h3>How to Efficiently Add Your Comments</h3><p>A reviewer should be ready to differentiate between blocking and non-blocking issues. Blocking issues would be things that prevent a CR from being shipped. Non-blocking issues specialize in more subjective matters and may well be discussed to achieve consensus, or addressed in follow-up CRs. Note that although in theory a CR with only non-blocking comments can potentially be shipped (since it won’t cause production problems), it doesn’t mean non-blocking comments are to be ignored.</p><h4><strong>Blocking issues</strong></h4><p>Most blocking issues are things that affect production and tend to be objective. For example:</p><ul><li>CR violates one or more of the “author guidelines” listed above</li><li>Code bug</li><li>Any potential performance issue</li><li>One-way door decisions</li><li>Missing critical tests in production code</li><li>Having insufficient comments</li></ul><h4><strong>Non-blocking issues</strong></h4><p>Non-blocking issues are mostly subjective opinions that require a consensus. Keep in mind that different people have varying styles of executing things. Therefore, there will be several different solutions. Some examples of non-blocking comments are:</p><ul><li>Code enhancement proposals</li><li>Refactoring suggestions</li><li>Code maintainability discussions</li><li>“You can also change this” type of things. Everyone is part of the team. If you want to make a change without waiting for the CR submitter to get back to you, in addition to commenting in people’s CR, you can go ahead and do it yourself!</li></ul><h4><strong>Comments</strong></h4><p>To make comments more effective and save back-and-forth time, try to have a clear action item that the author could work on. Some examples are:</p><ul><li>“Have you investigated X?” in addition to “Other options exist”</li><li>“How about renaming to Y?” in addition to “The name needs clarification”</li><li>“Move A to B and make C call D” in addition to “This should be refactored”</li></ul><p>If a subject requires a lot of back-and-forth dialogue, rather than having a long thread of comments, do the review in-person and only put the end result in the comments.</p><h3>How should the author handle the comments?</h3><p>Receiving non-blocking comments doesn’t mean they can be ignored. An author needs to respect others efforts with feedback:</p><ul><li>Take time to put together a formidable reply to reviewers’ feedback, regardless of blocking or non-blocking, to reach a consensus.</li><li>Always reply to comments that lack clarity or instigate drawn-out discussions as soon as possible (especially before you publish the new revision), to avoid publishing a 3rd revision based on comments from the 1st revision.</li><li>Follow-up offline with a reviewer to address any lack of comprehension in their comments and summarize the resulting outcome in the CR for other reviewers.</li><li>Update the CR title and description of messages when publishing new revisions.</li><li>If you received your required approvals but somebody else commented on the CR without approval, follow up with him/her to determine if the concerns were addressed.</li></ul><p>Happy coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5a4d2be47ad8" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/how-to-make-code-reviews-more-efficient-5a4d2be47ad8">How to Make Code Reviews More Efficient</a> was originally published in <a href="https://betterprogramming.pub/">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 Concepts You Must Know to Pass Coding Interviews]]></title>
            <link>https://myinterview.guru/6-concepts-you-must-know-to-pass-coding-interviews-e655aad756d4?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/e655aad756d4</guid>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[coding-interviews]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[interview-preparation]]></category>
            <category><![CDATA[interview-questions]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Wed, 29 Dec 2021 17:21:05 GMT</pubDate>
            <atom:updated>2022-01-14T19:04:59.865Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xHa7TwoWhgTKb2sdNEWsQw.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@thisisengineering?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">ThisisEngineering RAEng</a> on <a href="https://unsplash.com/s/photos/coding?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>As an active interviewer, I can say that the complexity of interview questions has increased over the past couple of years. These days there are many preparation resources and candidates are more prepared. Consequently, wrong or right, the expectation of the interviewers has increased. Companies like Facebook/Meta expect you to solve 2 coding questions in less than 45 minutes.</p><p>In this article, I gathered the most popular concepts/algorithms that a large number of interview questions are based on. You need to fully understand these concepts to be able to implement the related coding questions in a reasonable amount of time. Obviously, there are many other concepts that you need to be aware of to successfully pass coding interviews but put the ones here on top of your list.</p><h3>1. Topological Sort</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/267/1*Qy26tD-57ukCTNSSyGqL4A.png" /></figure><p>In a Directed Acyclic Graph (DAG), topological sort puts vertices in linear order so that one vertex comes before another one. Many coding problems can be presented through a DAG. If you identify dependencies between items that require operations in a specific order, topological sort immediately should come to mind. A very popular problem is <a href="https://leetcode.com/problems/course-schedule-ii/">course schedule 2</a> in which courses are prerequisites of another and you need to find a correct order to complete all courses. When working on topological sort problems remember:</p><ul><li>Topological sort is not possible if the graph has a cycle. For instance, if you need to complete course A to take B, B to take C, and C to take A, there is no way that you can take any of the courses. Confirming the possibility of cyclic dependency is one of the first questions to ask the interviewer and most of the time you have to plan for cycles in the graph.</li><li>A popular mistake among candidates is the assumption that the graph is connected. This can lead to mistakes in the code. For example, in the course schedule, some courses might have no dependency and are not present in the dependency list respectively.</li></ul><p>A simple topological sort implementation involves two maps, one to store a list of all items (value) dependent on each item (key) and the second to count the number (value) of dependencies for each item (key). A sample implementation can be found <a href="https://myinterview.guru/leetcode-210-course-schedule-2-644adda54cd">here</a>.</p><p>Popular related questions: <a href="https://leetcode.com/problems/course-schedule-ii/">Course schedule 2</a>, <a href="https://leetcode.com/discuss/interview-question/1031933/amazon-onsite-sde2-package-dependencies">Order of packages to compile</a>, <a href="https://leetcode.com/problems/alien-dictionary/">Alien dictionary</a></p><h3>2. Binary Search</h3><p>At a first glance, the binary search looks very simple but you are amazed by a significant number of binary search interview questions specially in the Google interviews. The tricky part is to identify a problem as a binary search one. In the simplest form, you are given a sorted array to find the existence of a specific item. However, in a real interview, you need to first convert the problem to an array of sorted items to be able to apply the binary search. If there are multiple possible numeric answers <strong>in a specific range</strong> and you want to find the most optimal solution, the naive approach is to examine every single possibility and choose the best one. In this scenario, think about if binary search can be beneficial. An example is the <a href="https://www.geeksforgeeks.org/number-days-tank-will-become-empty/">number of days after which tank will become empty</a>. At first, you need to find the minimum and maximum possible values and update the upper and lower bounds in your search till you reach a final optimal answer (or find out that there is no answer).</p><p>Popular related questions: <a href="https://leetcode.com/discuss/interview-question/1647058/Google-or-Virtual-Onsite-or-Relay-Stations">Relay Stations</a></p><h3>3. Working with Intervals</h3><p>There is a set of problems such as <a href="https://leetcode.com/problems/meeting-rooms/">Meeting Rooms</a> involving time intervals. In these types of questions, you need to find out at what periods of time, there are interval conflicts. Usually, you should have the intervals sorted first through one of the below ways to find the points in which the conflicts take place:</p><ul><li>Regular sort techniques (e.g. Arrays.sort() in Java).</li><li>Min/Max heap.</li><li>Self-balancing tree data structure like TreeMap in Java.</li></ul><p>popular related questions: <a href="https://leetcode.com/problems/meeting-rooms-ii/">Meeting Rooms 2</a> , <a href="https://leetcode.com/problems/merge-intervals/">Merge Intervals</a>, <a href="https://leetcode.com/problems/car-pooling/">Car Pooling</a>, <a href="https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/">Minimum Number of Arrows to Burst Balloons</a>, <a href="https://leetcode.com/problems/my-calendar-i/">My Calendar 1</a> &amp; <a href="https://leetcode.com/problems/my-calendar-ii/">2</a> &amp; <a href="https://leetcode.com/problems/my-calendar-iii/">3</a>.</p><h3>4. Heaps (Priority Queues)</h3><p>Heap is a simple data structure but it can solve interesting problems in the real world as well as coding interviews. Two main heap structures are min heap (min element at the root) and max heap (max element at the root). Most important things to remember about heaps:</p><ul><li>Insertion in a binary heap is O(log n) but finding an element is still O(n) since you need to examine all the items. Keep in mind that heaps don’t necessarily give an advantage when you are trying to search for an element.</li><li>The elements are not in order in a heap. You only know that the top element is the min element in min-heap or max element in max-heap. In order to find the next element, you need to delete root (O(log n)) first.</li></ul><p>Heaps are specifically good if you need to know the top K elements specially in a stream of data without a need to know their specific order. A very popular example is to <a href="https://leetcode.com/problems/find-median-from-data-stream/">find the median from a data stream</a> in which you need to keep the first [almost] half of data in a max-heap and the second half in a min-heap. Here, you actually don’t need to know the order of elements in the first or second half but you only need to know the max element of the first half and min element of the second half to calculate the median.</p><p>Related Questions: <a href="https://leetcode.com/problems/top-k-frequent-elements/">Top K elements</a>, <a href="https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/">Kth smallest element in a sorted matrix</a></p><h3>5. Sliding window</h3><p>I should confess that this is my least favorite must-know concept since it involves extra care when working with pointers and it’s easy to miss edge cases. On the other hand, this technique efficiently reduces time complexity for complex problems.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/356/1*IVO74ESXf7k7vWSuS3Lcyg.png" /></figure><p>A general pattern like what we see in the <a href="https://myinterview.guru/leetcode-76-minimum-window-substring-42906bda738b">minimum window substring</a> requires two pointers. The first one greedily expands the space till it meets the problem requirements (e.g. in min-window-substring to find a substring containing all the matching characters) and the second one to reduce the space as much as possible to ensure that an optimized solution is reached.</p><p>Related Questions: <a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">Longest Substring Without Repeating Characters</a>, <a href="https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/">Longest Substring with At Most K Distinct Characters</a>, <a href="https://leetcode.com/problems/permutation-in-string/">Permutation in String</a></p><h3>6. Graph Traversals (DFS/BFS)</h3><p>I’m really surprised that many candidates still struggle with Depth-first-search (DFS) and Breadth-first-search(BFS) implementations. If you are going to rock any coding interview, you must know graph traversal algorithms by heart and be able to distinguish their differences. In many graph traversal problems, it doesn’t make a huge difference to use either DFS or BFS as they have the same time/space complexity. However, keep the below in mind:</p><ul><li>If you need <strong>information related to a level</strong> like the <a href="https://leetcode.com/problems/find-largest-value-in-each-tree-row/">max item in each row</a> or <a href="https://leetcode.com/problems/binary-tree-level-order-traversal/">printing a tree level by level</a>, BFS is your best option. On the other hand, if you need <strong>information related to branches/paths</strong> like <a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/">maximum path sum</a> try to solve with DFS.</li><li><strong>Shortest Paths</strong>: If the problem involves the shortest distance to an origin, BFS is the best option because it examines all the neighbors level by level. If you reach an element in a BFS, it has the shortest distance to the origin.</li><li><strong>Puzzles</strong>: If the problem involves exhausting all the solutions like in <a href="https://leetcode.com/problems/word-search/">Word Search</a>, using DFS or <a href="https://en.wikipedia.org/wiki/Backtracking"><strong>backtracking</strong></a> is better since it goes deep to find every possible option, and sometimes like in Word Search the first find is enough. Backtracking and DFS are closely tied together and you can find that there are many different opinions about their differences. But here for simplicity let’s consider backtracking a technique that uses DFS on a reduced problem space.</li><li><strong>Memory Usage</strong>: Although both algorithms have the same space complexity but they have different memory usage pattern. If the graph/tree is very wide, you need to consume a significant amount of memory in BFS. On the other hand, if the graph/tree is too deep, in DFS you need to store a large number of items in the stack memory because of recursive calls. Also, since the DFS uses the stack for recursive calls, it’s a high chance that you get a StackOverflow exception if the stack capacity is small.</li><li><strong>Graph vs. Tree</strong>: A Tree is a simplified version of a graph. Trees are connected graphs in which a node always has a single parent (except root) and there is no cycle. Both time/space complexity of BFS/DFS traversals for trees are O(n) considering n as the number of nodes. In graphs, however, the time complexity of traversal is O(V+E) where V is the number of nodes and E is the number of edges. In the worth case scenario where a graph is complete (E=V*(V-1)/2) we need to visit all nodes and edges. If we consider n as the number of nodes, the worst-case time complexity becomes O(n²). Further, to avoid getting stuck in a cycle, in the BFS/DFS traversal, we need to mark elements as visited which is not needed in a tree traversal.</li></ul><p>Popular related questions: A lot! In most of the graph problems :-)</p><p>Good luck and happy holidays!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e655aad756d4" width="1" height="1" alt=""><hr><p><a href="https://myinterview.guru/6-concepts-you-must-know-to-pass-coding-interviews-e655aad756d4">6 Concepts You Must Know to Pass Coding Interviews</a> was originally published in <a href="https://myinterview.guru/">My Interview Guru</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Properly Deal with “Technical Debts”]]></title>
            <link>https://medium.com/geekculture/how-to-properly-deal-with-technical-debts-f0841ff92fb3?source=rss-203a584aebef------2</link>
            <guid isPermaLink="false">https://medium.com/p/f0841ff92fb3</guid>
            <category><![CDATA[career-advice]]></category>
            <category><![CDATA[software-development]]></category>
            <category><![CDATA[technical-debt]]></category>
            <category><![CDATA[best-practices]]></category>
            <dc:creator><![CDATA[Pooya Amini]]></dc:creator>
            <pubDate>Thu, 09 Dec 2021 01:01:08 GMT</pubDate>
            <atom:updated>2021-12-09T01:01:08.722Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JUhHUwh7enN6oXp4zYCpVQ.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@paramir?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Ehud Neuhaus</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>Technical Debt can be defined as a gap between making a change [almost] perfectly (flawless architecture design, using good programming practices and standards, updating the documentation, testing the changes thoroughly, etc.) and making a change work as quickly as possible with a few resources available.</p><blockquote><strong>Remember that technical debt is a metaphor and not a scientific concept. Analogous to “monetary debt”, technical debt is not necessarily a bad thing and sometimes it’s required to move a project forward, however it MUST be managed properly.</strong></blockquote><p>Think about an example of buying a house. If you want to wait to have enough cash to buy a property, you need to wait for a long time. Given the current resources, you can get a mortgage and buy a house now and pay it off over the time. You end up paying more in the end but there might be advantages like if the house price goes up.</p><p>Respectively In a software environment, there is value in releasing a feature at a particular time. If we are aware of a technical debt and discuss its pros/cons, it might be good to release the software sooner in order to get some advantages. However, you should manage the technical debt and do not allow it to slip. In the example of buying a house, you will get bankrupt if you decide to buy a car and then a boat while you haven’t calculated the economic risks. For software development, you cannot ignore the debt because the next cycle you might not be able to release another feature efficiently. But how to ensure that we properly manage our technical debts?</p><h3><strong>1. Identify your debt</strong></h3><p>There is no specific tool to run on a project to identify its underlying technical debts, however, some tools like smart IDEs can flag some potential debts in the project code. On the other hand, “outdated wiki” is not something that can be caught by automated tools. Here are some samples of technical debt indicators that you can identify in your daily communications:</p><ul><li>Don’t worry about the documentation at the moment!</li><li>It’s ok for now, we will refactor it later.</li><li>//TODO: this should be fixed before release.</li><li>I know if I touch that code everything will break.</li><li>It’s good enough, we will finish the testing in the next release.</li></ul><p>You might find similar statements like above in your current role that indicate a possible technical debt (please add your examples to the comment section).</p><h3><strong>2. Estimate the costs and risks</strong></h3><p>For every technical debt, there is a trade-off between immediate benefit and potential future cost. Carefully assess the potential risks of the debt before making the final decision. “Not updating a wiki” might not seem a significant risk at a first glance but imagine a scenario in which you add a critical feature but skip spending a couple of hours on updating the playbook wiki with instructions on how to deal with production issues. In case of a failure, the on-call person cannot quickly mitigate the issue or even worse might add up more problems during his/her shift.</p><h3><strong>3. Communicate and make the decision</strong></h3><p>Once the technical debt is identified and the associated cost/risk is assessed, the team need to decide if they really want to add that debt to their system. More importantly, they need to decide how to keep track of the debt and what steps to take in order to pay it off.</p><h3><strong>4. Keep track of technical debts</strong></h3><p>Regardless of how you plan to log your technical debts, try to document the below information:</p><p><strong><em>Description:</em></strong> What, where, why (e.g. I didn’t write the wiki because I wanted to spend time on the release and test cases.)</p><p><strong><em>Principal:</em></strong> Cost of doing the work (how much time you saved by not doing that, updating the wiki maybe it’s an 8 hr job)</p><p><strong><em>Interest:</em></strong> What happens if the work doesn’t get done and the amount of extra work if this causes the problem later. Also, document the probability that this will cause problems later.</p><h3><strong>5. Plan for paying off your debt</strong></h3><p>The feature is released successfully, you well documented the debt, and everybody looks happy. Great! Now, how do you plan to pay it off? It should not remain as a low-priority item in your backlog. As the debt owner, you need to actively keep track of the action items to ensure that the debt is addressed in a timely manner.</p><h3>Conclusion</h3><p>Technical debt is not necessarily a bad thing and if properly added to the system can be beneficial to the business and the customers. The challenge however is to efficiently assess the pros and cons and more importantly to manage and keep track of it. Adding debts on top of each other without a concrete resolution plan increases the cost and risk to the business over the time.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f0841ff92fb3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/geekculture/how-to-properly-deal-with-technical-debts-f0841ff92fb3">How to Properly Deal with “Technical Debts”</a> was originally published in <a href="https://medium.com/geekculture">Geek Culture</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>