<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: hiroyone</title>
    <description>The latest articles on Forem by hiroyone (@hiroyone).</description>
    <link>https://forem.com/hiroyone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F553157%2Fc83c9b1b-94c8-43a3-83c4-84c5f1932b3e.jpeg</url>
      <title>Forem: hiroyone</title>
      <link>https://forem.com/hiroyone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hiroyone"/>
    <language>en</language>
    <item>
      <title>The Hidden Mindset and Skills of Japanese 10x Developers</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sun, 07 May 2023 14:29:17 +0000</pubDate>
      <link>https://forem.com/hiroyone/secret-mentalities-and-skills-behind-10x-japanese-developers-3aai</link>
      <guid>https://forem.com/hiroyone/secret-mentalities-and-skills-behind-10x-japanese-developers-3aai</guid>
      <description>&lt;p&gt;In this post, I reveal the undisclosed information regarding Japanese 10x developers that I had the opportunity to work with during my five-year stint in Tokyo. Furthermore, I share the valuable insights they imparted to me, which helped me improve my productivity to a similar level as theirs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;The software company I used to work for in Tokyo was distinct in two ways. &lt;/p&gt;

&lt;p&gt;Firstly, their engineers were &lt;strong&gt;full-stack developers&lt;/strong&gt; who also specialized in specific domains such as backend, frontend, machine learning, security, network, cloud architecture, sound, game, and so on. They worked on specific domains for their projects, but also possessed general knowledge and interest in other software fields. The company believed that limiting engineers by job titles would impede their growth, and having full-stack engineers would be more beneficial for projects.&lt;/p&gt;

&lt;p&gt;Secondly, the company had a &lt;strong&gt;purely flat organizational structure&lt;/strong&gt;, unlike other software companies that have hierarchical distinctions among junior, middle, senior, and staff roles. The only difference was the CTO, who was a co-founder. Although the company had 400 full-time employees and a few hundreds contract engineers, which caused some disorder and chaos, it generally functioned well.&lt;/p&gt;

&lt;h2&gt;
  
  
  How 10x developers are cultivated and discovered
&lt;/h2&gt;

&lt;p&gt;How can a completely flat and somewhat chaotic organization cultivate 10x developers, and how are these exceptional developers identified without a traditional corporate hierarchy?&lt;/p&gt;

&lt;p&gt;The full-stack software engineers at this company must survive the development of production-grade, consumer-facing web services across multiple domains, including frontend, backend, and infrastructure. The blurred lines between these domains encourage engineers to understand and seamlessly integrate the entire system flow. This results in most engineers becoming battle-tested and highly skilled after five years of work, and 10x developers typically remain at the company for over ten years.&lt;/p&gt;

&lt;p&gt;At the same time, engineers identify 10x developers solely through word-of-mouth and reputation, as many engineers work on multiple projects at once. Respect is earned not through seniority or title but through exceptional results achieved in a shorter time than their peers. In other words, 10x developers make a significant impact on projects in terms of software architecture design, coding quality and quantity, and debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traits of Japanese 10x developers
&lt;/h2&gt;

&lt;p&gt;The attributes listed below are commonly associated with Japanese software developers who demonstrate exceptional productivity and proficiency in their work. These traits are not limited to engineers within my previous company, as they are often mentioned in Japanese online forums.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Passionate about coding&lt;/strong&gt;: They write 500 to 1000 lines of code per day because they genuinely enjoy coding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Genuine geeks (Otaku)&lt;/strong&gt;: They graduate from technical high schools or colleges and are heavily influenced by the Otaku community. They are introverted and enjoy games, anime, and comics, but dislike traveling long distances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proficient in multiple programming languages&lt;/strong&gt;: They are skilled in writing code in all kinds of programming languages, including interpreted, compiled, frontend, and backend languages such as Python, JS, Java or Kotlin, Golang, Rust, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excellent problem solvers&lt;/strong&gt;: They excel not only in writing code but also in debugging problems. They are a combination of all kinds of analysts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anonymous&lt;/strong&gt;: They rarely appear in public and prefer to remain anonymous. Their real names cannot be found on their presentations or blogs, but they are active on Twitter using nicknames.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lessons I learned from Japanese 10x developers
&lt;/h2&gt;

&lt;p&gt;I have discovered two basic concepts that describe the effectiveness of 10x developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Concentration&lt;/li&gt;
&lt;li&gt;Knowledge and experience&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Routines for Concentration Enhancement
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Time Limit&lt;/strong&gt;: Instead of working all day, it's better to set specific working hours, which is 8 hours for most people. This is because when there is a time limit for a task, concentration is improved. This can be compared to body training, where trainees focus on an exercise for a specific duration, such as an hour, to achieve maximum concentration. &lt;strong&gt;Example&lt;/strong&gt;: One Japanese 10x developer arrives at the office on time and leaves on time or early if all scheduled tasks are complete. He also cleaned up his computer state and sorted out his backlogs before leaving the office so that he can straightly start working on his tasks the next day. &lt;strong&gt;Tip&lt;/strong&gt;: It's also possible to extend the working time by 10 to 15 minutes to complete one more task, similar to doing a few extra reps during a body workout to achieve maximum results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Something small, easy, and simple&lt;/strong&gt;: Begin with small, easy, and simple tasks rather than heavy and complex ones. This is similar to how one would start a bonfire by burning leaves and papers before adding wood. &lt;strong&gt;Example&lt;/strong&gt;: Japanese 10x developers usually begin their day by either addressing minor bugs or checking their Slack app. &lt;strong&gt;Tip&lt;/strong&gt;: It's recommended to divide a large task into smaller portions ahead of time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantity measurement&lt;/strong&gt;: Quantify the achievement like a game. It is good to set key quantitative metrics to measure achievements. &lt;strong&gt;Example&lt;/strong&gt;: Japanese 10x developers kept track of the number of pull requests, closed issues, cost-saving amounts, etc. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least Best Practices&lt;/strong&gt;:  Aim for results that are not necessarily considered "bad" but may be less effective or efficient. They know avoiding anti-patterns is more crucial than achieving the best solution. For instance, the best code is subjective, contextual, and hard to achieve most of the time, which slows the way of thinking and working; meanwhile, the poor code is self-evident and easy to spot. &lt;strong&gt;Example&lt;/strong&gt;: Japanese 10x developers usually receive a few coding suggestions for their pull requests. These suggestions are nice and good to accept, but none of them is a critical problem in terms of algorithm and security. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No distractions&lt;/strong&gt;: Have no distractive tasks for getting straight to work for a day. Have as little stuff to do in the morning as possible such as cooking breakfast and commuting. &lt;strong&gt;Example&lt;/strong&gt;: One of the Japanese 10x developers told me he prefers to wake up early and prepare early as fewer meetings and inquiries occur in the morning.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Knowledge and Experience gains
&lt;/h2&gt;

&lt;p&gt;All lessons below are unsurprising, but many engineers tend to forget them after a while.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Continuous learning&lt;/strong&gt;: Keep learning in addition to working hours. Technology is evolving rapidly every day, and learning is inevitable to enhance productivity in the long run. &lt;strong&gt;Example&lt;/strong&gt;: When my previous company decided to add a new cloud service provider, a Japanese 10x developer learned the related material and got the provider's cloud certificate within a month. However, he was already an expert in another cloud service and had plenty of projects using that cloud service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Just write and debug it&lt;/strong&gt;: Most software engineers start their careers by writing, testing, and debugging code which requires a few years to get handy with. As their work is approved and respected, they are more involved with high-level technical designs and discussions. But 10x developers never forgot to do the most foundational things: write code and debug it. That is because they innately like pure programming, remember their first motivation when they were young, and hate to get their skills rusty. &lt;strong&gt;Example&lt;/strong&gt;: Japanese 10x developers write 500~1000 lines of code almost every day. I was stunned by the number of new features and bug fixes they made through pull requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opportunity seeker&lt;/strong&gt;: The fast-paced technological advancements call for project and product managers to plan many new and innovative projects. These projects can be tough for developers, but they offer an opportunity to learn new skills and gain experience. &lt;strong&gt;Example&lt;/strong&gt;: Most Japanese 10x developers are nerds and introverted, so they generally avoid talking and discussing with others. But when it comes to new technical challenges and adoptions, they start raising voices and expanding their opinions, especially for cool technologies.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;The 10x developers' traits and skills explained above come from my five-year working experience in Japan. But most essay contents are paraphrased by Chat-GPT, which is probably 1000x more productive than human engineers.&lt;/p&gt;

&lt;p&gt;Cheers to 10x developers and the cutting-edge AI technology (^_^*)bbb&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>devops</category>
      <category>career</category>
    </item>
    <item>
      <title>Priority vs Outputs: why 10x developers are valuable in software development projects</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Fri, 07 Apr 2023 15:25:36 +0000</pubDate>
      <link>https://forem.com/hiroyone/priority-vs-outputs-why-10x-developers-really-matter-in-software-development-project-2dgf</link>
      <guid>https://forem.com/hiroyone/priority-vs-outputs-why-10x-developers-really-matter-in-software-development-project-2dgf</guid>
      <description>&lt;h2&gt;
  
  
  Unexpected Project Failures
&lt;/h2&gt;

&lt;p&gt;Until recently, I was working at a large software vendor in Japan for five years, in which we offered web/tech solutions to many non-tech clients.&lt;/p&gt;

&lt;p&gt;There, I observed several big projects that endlessly continued without seeing a single product release  and the candidate release date kept postponed for a few times even though the team consists of &lt;strong&gt;experienced project managers, product owners, and average developers.&lt;/strong&gt; Weird!&lt;/p&gt;

&lt;p&gt;I was lucky to witness another type of project which managed to release new products and features even though &lt;br&gt;
the team only had an inexperienced manager who was also a former developer but had one 10x developers as well as other middle-level developers. Their project management had some mess and the overall quality of the product experience had room for sophistication, but they kept making progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observing these two different types of project's outcomes left me with an important lesson to learn, whose value and practices are still worthy of attentions in most projects nowadays.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I compared these two types of projects attentively and gave thoughts on what characteristics had a significant impact on better progress. In the end, I found two keywords which are surprisingly related.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opposite of prioritization
&lt;/h2&gt;

&lt;p&gt;To begin with, can you answer the following question with confidence?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quiz: What is the opposite of prioritization in the context of a software development project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I guess most people would never thought about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short Answer: Outputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Outputs here mean the amount of technical design, implementation, and testing you have attained in a certain period of time: namely, one day, one month, or one quarter.&lt;/p&gt;

&lt;p&gt;It would be surprising for you to know these two keywords are correlated in the context of software development and actually mean the opposite. But I guarantee that achieving high outputs will lead projects to finish.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Prioritization, Prioritization, Prioritization, BUT...
&lt;/h2&gt;

&lt;p&gt;I bet you have encountered the situation where a project manager repeatedly emphasised the importance of prioritizing tasks - sorting out the tasks in the urgent order. &lt;/p&gt;

&lt;p&gt;And for the sake of &lt;em&gt;better prioritizations&lt;/em&gt;, more communications were encouraged among project managers, engineers, and stakeholder. Hence, teams increased the number of meetings to once or twice every day.&lt;/p&gt;

&lt;p&gt;Prioritization has pros but also cons! It is not a silver bullet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Prioritization makes a team focus on finding critical problems for users, identifying why these problems occurred, and quickly fixing them with a few lines of code in an urgent manner. This type of management style is suitable for already released and maintenance products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The problem with this prioritization-centered approach appears vividly when a lot of new features are to be developed, and more foundational work is needed with a lot of effort. But both prioritized task executions and solid foundational work are hard to achieve simultaneously for the following reasons.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prioritized tasks vs development order
&lt;/h3&gt;

&lt;p&gt;Tasks sorted by prioritization are often less efficient for development productivity because prioritized tasks pay more attentions to something that are visible to users/stake holders, while it would be actually easier for developers to start with the foundational part.&lt;/p&gt;

&lt;p&gt;I prepared an intuitive illustration of pyramid construction below, a visible analogy to software construction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnransbgaidsk73ah0bv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnransbgaidsk73ah0bv5.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can imagine, constructing from visible parts requires more efforts for each block and is not robust. It may even sounds ridiculous but this is often a reality.&lt;/p&gt;

&lt;p&gt;On the other hand, constructing pyramid from the foundation can make more progress with the same effort, but would be less satisfactory to users. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sctxs22d8i8yy6vvofq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sctxs22d8i8yy6vvofq.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a result, for the same amount of effort, construction from the foundation can be 12 blocks ahead of construction from what are important to users.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Context Switching Cost
&lt;/h3&gt;

&lt;p&gt;Frequent prioritizations must come with the context switching of tasks for developers, but it comes with a high cost, as many experts have already suggested (e.g. &lt;a href="https://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/" rel="noopener noreferrer"&gt;this article&lt;/a&gt;). Developers outputs will decline sharply if their priority tasks are changing even a few times a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Development Mindset
&lt;/h3&gt;

&lt;p&gt;Priority-focused teams tend to forget the value of foundational work and only do minor fixes on the surface to solve urgent problems. But the system internals becomes messier with the accumulated temporary fixes, which deteriorate the long-run productivity and extensibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Manager A&lt;/strong&gt;: &lt;em&gt;Documentation is of course important but we don't have time to fix this document now. It is not prioritized.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineer Lead B&lt;/strong&gt;: &lt;em&gt;Such a feature is desired for the safe delivery of this service but we are short of hands and cannot spare time for it now.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When conversations like the above are heard in your project, that is an indicator that the importance of the foundational work is ignored and the product's development productivity is impaired in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why outputs of work is important in a project?
&lt;/h2&gt;

&lt;p&gt;So how can we handle the other type of development?; there is no strict deadline for each task, but the entire roadmap is heavy and long because a lot of new features are to be integrated into the product. &lt;/p&gt;

&lt;p&gt;As you may know, the more components are involved in one product, the more fine integrating works are needed. Interface adjustments get severer, integrated testings get to be more important, more integrated documentations are desired as well.&lt;/p&gt;

&lt;p&gt;That is why &lt;strong&gt;MAX OUTPUTS Strategy&lt;/strong&gt; comes into play. Contrary to the frequent prioritizations, the project focuses on the amount of outputs team members produce each day. e.g., pull requests, issue tickets, and design documents.&lt;/p&gt;

&lt;p&gt;Since there is no strict deadline, members can focus on laying the groundwork for the product - building the components from the bottom layer one by one, which makes the product robust and stable in the long run.  &lt;/p&gt;

&lt;p&gt;While the main motivation for prioritized work is urgency, the essential motivation for this type of development is &lt;strong&gt;development tempo&lt;/strong&gt;, which sets the basic amount of outputs produced everyday. Because tasks have somewhat similar traits in terms of volumes, qualities, and flows, developers aim to attain the same quantity of outputs everyday.&lt;/p&gt;

&lt;p&gt;For the sake of &lt;strong&gt;MAX OUTPUTS&lt;/strong&gt; of team members, more quiet working time is introduced. Each member focuses on their assigned development tasks and they are encouraged to produce more outputs. Hence, teams tend to show their work by commit logs, pull requests, or testing outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 10x developers are valuable in software development project
&lt;/h2&gt;

&lt;p&gt;The above comparison between prioritization and output makes it easier to understand why an inclusion of 10x developer matters to the overall progress of a project.&lt;/p&gt;

&lt;p&gt;A lot of software development are actually expected to develop new features rather than just maintenance the service. And thus output of the project is relatively more important than fine prioritizations. &lt;/p&gt;

&lt;p&gt;As I said in the beginning, I saw some large projects fail, which put emphasis on prioritizing tasks and fixing some hot issues appearing on the surface but ignored the importance of building the vast volume of (foundational) works for the project. I believe that this happened because these project managers did not have large software development experience in the past.&lt;/p&gt;

&lt;p&gt;At the same time, I also witnessed the participation of 10x developers in a project often solved the project stagnation. They are skilled and mostly quiet in team meetings. They solely focus on adding features and fixing bugs to reduce the issue tickets. They are also good at scaffolding the foundation on which other developers can build components safely, smoothly, and neatly. Yet, their values are often underrated because they prefer hiding behind others and keeping their contribution as secret as possible.&lt;/p&gt;

&lt;p&gt;The below picture is another pyramid analogy with 10x developer to project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgoshzwmaaz2lqrurgfo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgoshzwmaaz2lqrurgfo.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What can we do as a project?
&lt;/h2&gt;

&lt;p&gt;It is impossible to suddenly hire 10x developers tomorrow, but it is possible to kick off the following strategies to achieve similar results 10x developers bring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognise among team members that output is as important as prioritization in a software development.&lt;/li&gt;
&lt;li&gt;Set no meeting day once or twice a week. &lt;/li&gt;
&lt;li&gt;Avoid bringing urgent tasks to developers.&lt;/li&gt;
&lt;li&gt;Encourage working early or late for developers so that they can secure more quiet time to focus on development. &lt;/li&gt;
&lt;li&gt;Encourage developers to keep &lt;strong&gt;their development tempo&lt;/strong&gt;. Split tasks into small pieces and set the goal for weekly achievement. E.g., the number of solved issue tickets and pull requests.&lt;/li&gt;
&lt;li&gt;Have morning stand-ups among developers to share their outputs yesterday.&lt;/li&gt;
&lt;li&gt;Visualise the outputs of members. Simple bar graphs or line graphs are good enough to show members' progress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These team-wide &lt;strong&gt;MAX OUTPUT&lt;/strong&gt; practices will enhance the team's overall progress and software stability in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importance-Urgency Matrix for Engineers
&lt;/h2&gt;

&lt;p&gt;Planning the allocation of outputs based on the importance and urgency of tasks matters in real projects. The diagram below illustrates how much percentage of outputs should be allocated to each task type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3myhgj8qp6o4yzzj5vz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3myhgj8qp6o4yzzj5vz.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can imagine, enhancing the outputs of Not Urgent &amp;amp;&amp;amp; Important tasks plays a vital role in the future landscape of the project; The more systemic automation brought from these important works, the less urgent tasks team members will face and thus can spend more time on more development and testing of important features. And the positive spiral will continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2t7awmgmxacehvc6bmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2t7awmgmxacehvc6bmm.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading my article.&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>project</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why 10x developers really matter in software development project</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Mon, 06 Mar 2023 07:08:33 +0000</pubDate>
      <link>https://forem.com/hiroyone/why-10x-developers-really-matter-in-software-dev-project-pn2</link>
      <guid>https://forem.com/hiroyone/why-10x-developers-really-matter-in-software-dev-project-pn2</guid>
      <description>&lt;h2&gt;
  
  
  Unexpected Project Failures
&lt;/h2&gt;

&lt;p&gt;Until recently, I was working at a large software vendor in Japan for five years, in which we offered web/tech solutions for many non-tech clients.&lt;/p&gt;

&lt;p&gt;There, I saw several projects that endlessly continued without seeing a single product release  and the candidate release date kept postponed for a few times even though the team consists of experienced project managers, product owners, and average developers.&lt;/p&gt;

&lt;p&gt;I was lucky to observe another type of project which managed to release new products and features even though &lt;br&gt;
the team only had an inexperienced manager who was also a former developer but had one 10x developers as well as other middle-level developers. Their project management had some mess and the overall quality of the product experience had room for sophistication, but they kept making progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observing these two different types of project's outcomes left me with an important lesson, whose value and practices are still worthy of attentions in most projects nowadays.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I compared two projects carefully and gave thoughts on what characteristic had significant impact on the progress. In the end, I found two keywords, which are surprisingly related.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opposite of prioritization
&lt;/h2&gt;

&lt;p&gt;To begin with, can you answer the following question with confidence?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quiz: What is the opposite of prioritization in the context of a software development project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I guess most people would never thought about it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer: Outputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Outputs here mean the amount of technical design, implementation, and testing you have attained in a certain period of time: namely, one day, one month, or one quarter.&lt;/p&gt;

&lt;p&gt;It would be surprising for you to know these two keywords are correlated in the context of software development and actually mean the opposite. But I guarantee that achieving high outputs will lead projects to finish.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Prioritization, Prioritization, Prioritization, BUT...
&lt;/h2&gt;

&lt;p&gt;I bet you have encountered the situation where a project manager repeatedly emphasised the importance of prioritizing members' tasks - sorting out the tasks in the urgent order. &lt;/p&gt;

&lt;p&gt;And for the sake of &lt;em&gt;better prioritizations&lt;/em&gt;, more communications were encouraged among project managers, engineers, and stakeholders, and hence teams increased the number of meetings, to once or twice every day.&lt;/p&gt;

&lt;p&gt;Prioritization has pros but also cons!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;These teams are good at finding a problem from users' perspectives, identifying why the problem occurred, and quickly fixing it with a few lines of code in an urgent manner. Thus this type of development style is suitable for patching already released and maintenance products.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The problem with this approach appears when a lot of new features are to be developed, more foundational work is needed with a lot of efforts. But both prioritized task executions and solid foundational work are hard to achieve simultaneously for the following reasons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prioritized tasks vs development order
&lt;/h3&gt;

&lt;p&gt;Tasks sorted by prioritization are often less efficient for productive developments because prioritized tasks focus more on something that are visible to users/stake holders while it would be easier for developers to start with the foundational part.&lt;/p&gt;

&lt;p&gt;I prepared an intuitive illustration of pyramid construction below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qq05tgwsqldhx79je05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2qq05tgwsqldhx79je05.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, constructing pyramid from the foundation can make more progress with the same effort, but would be less satisfactory to users. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3qmbm7kgwpuh6fswono.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3qmbm7kgwpuh6fswono.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Switching
&lt;/h3&gt;

&lt;p&gt;Frequent prioritizations must come with the context switching of tasks for engineers, as many experts already suggested it like in &lt;a href="https://contextkeeper.io/blog/the-real-cost-of-an-interruption-and-context-switching/" rel="noopener noreferrer"&gt;this article&lt;/a&gt;. Engineers outputs will decline sharply if their priority tasks are changing even a few times a month.&lt;/p&gt;

&lt;h3&gt;
  
  
  Development Mindset
&lt;/h3&gt;

&lt;p&gt;Priority-first people tend to ignore hard work and end up only doing minor fixes on the surface to solve the urgent problem. But the system internals become messier with the accumulated temporary fixes which deteriorate the long-run productivity and extensibility.&lt;/p&gt;

&lt;p&gt;Project Manager A: &lt;em&gt;"Documentation is of course important but we don't have time to fix this document now. It is not prioritized."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Engineer Lead B: &lt;em&gt;"Such a feature is desired for the safe delivery of this service but we are short of hands and cannot spare time for it now."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When conversations like the above are heard in your project, that is an indicator that the importance of the foundational work is ignored and the product's development productivity is impaired in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why outputs of work is important in a project?
&lt;/h2&gt;

&lt;p&gt;On the other hand, the other type of development has the opposite characteristics; there is no strict deadline for each task, but the entire roadmap is rather heavy and long because a lot of new features are to be integrated to the product. &lt;/p&gt;

&lt;p&gt;As you may know, the more components are involved in one product, the more fine integrating works are needed. Interface adjustments get severer, integrated testings get to be more important, more integrated documentations are desired as well.&lt;/p&gt;

&lt;p&gt;That is why &lt;strong&gt;MAX OUTPUTS Strategy&lt;/strong&gt; comes into play. Contrary to the frequent prioritizations, the project focuses on the amount of outputs team members produce each day. e.g., pull requests, issue tickets, and design documents.&lt;/p&gt;

&lt;p&gt;Since there is no strict deadline, members can focus on laying the groundwork for the product - building the components from the bottom layer one by one, which makes the product robust and stable in the long run.  &lt;/p&gt;

&lt;p&gt;While the main motivation for prioritized work is urgency, the essential motivation for this type of development is the &lt;strong&gt;development rhythm&lt;/strong&gt;, which sets the basic amount of outputs produced everyday. Because tasks have somewhat similar traits in terms of volumes, qualities, and flows, developers aim to attain the same quantity of outputs everyday.&lt;/p&gt;

&lt;p&gt;For the sake of &lt;strong&gt;MAX OUTPUTS&lt;/strong&gt; of team members, more quiet working time is introduced. Each member focuses on their assigned development tasks and they are encouraged to produce more outputs. Hence, teams tend to show their work by commit logs, pull requests, or testing outputs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 10x developers really matter in software development project
&lt;/h2&gt;

&lt;p&gt;The above comparison between prioritization and output makes it easier to understand why an inclusion of 10x developer matters to the overall progress of a project.&lt;/p&gt;

&lt;p&gt;A lot of software development are actually expected to develop new features rather than just maintenance the service. And thus output of the project is relatively more important than fine prioritizations. &lt;/p&gt;

&lt;p&gt;As I said in the beginning, I saw some large projects fail, which put emphasis on prioritizing tasks and fixing some hot issues appearing on the surface but ignored the importance of building the vast volume of (foundational) works for the project. I believe that this happened because these project managers did not have large software development experience by themselves.&lt;/p&gt;

&lt;p&gt;At the same time, I also witnessed the participation of 10x developers in a project often solved the project stagnation. They are skilled and mostly quiet in team meetings. They solely focus on adding features and fixing bugs to reduce the issue tickets. They are also good at scaffolding the foundation on which other developers can build components safely, smoothly, and neatly. Yet, their values are often underrated because they prefer hiding behind others and keeping their contribution as secret as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  What can we do as a project?
&lt;/h2&gt;

&lt;p&gt;It is impossible to suddenly hire 10x developers tomorrow, but it is possible to kick off the following strategies to achieve similar results 10x developers bring.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recognise among team members that output is as important as prioritization in a software development.&lt;/li&gt;
&lt;li&gt;Set no meeting day once or twice a week. &lt;/li&gt;
&lt;li&gt;Avoid bringing urgent tasks to developers.&lt;/li&gt;
&lt;li&gt;Encourage working early or late for developers so that they can secure more quiet time to focus on development. &lt;/li&gt;
&lt;li&gt;Encourage developers to get the development rhythm. Split tasks into small pieces and set the goal for weekly achievement. E.g., the number of solved issue tickets and pull requests.&lt;/li&gt;
&lt;li&gt;Have morning stand-ups among developers to share their outputs yesterday.&lt;/li&gt;
&lt;li&gt;Visualise the outputs of members. Simple bar graphs or line graphs are good enough to show members' progress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These team-wide &lt;strong&gt;MAX OUTPUT&lt;/strong&gt; practices will enhance the team's overall progress and software stability in the long run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importance-Urgency Matrix for Engineers
&lt;/h2&gt;

&lt;p&gt;Planning the allocation of outputs based on the importance and urgency of tasks matters in real projects. The below diagram illustrates how much percentage of outputs should be allocated to the each task type.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjl0nlr5p0mtvfj1jkazp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjl0nlr5p0mtvfj1jkazp.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can imagine, enhancing the outputs of Not Urgent &amp;amp;&amp;amp; Important tasks plays a vital role in the future landscape of the project; The more systemic automation brought from these important works, the less urgent tasks team members will face and thus can spend more time on more development and testing of important features. And the positive spiral will continue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2t7awmgmxacehvc6bmm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2t7awmgmxacehvc6bmm.png" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for reading my article.&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Only using the iPad as my main machine, here's a review of software development experience</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sun, 03 Jul 2022 03:14:02 +0000</pubDate>
      <link>https://forem.com/hiroyone/only-using-ipad-for-my-main-machine-and-review-software-development-experience-4i4m</link>
      <guid>https://forem.com/hiroyone/only-using-ipad-for-my-main-machine-and-review-software-development-experience-4i4m</guid>
      <description>&lt;h1&gt;
  
  
  Motivation
&lt;/h1&gt;

&lt;p&gt;I’ve been using the iPad exclusively as my main computing machine since June 2022. (This post is, of course, written on my iPad.)&lt;/p&gt;

&lt;p&gt;Before then, I relied heavily on a Macbook Pro 13-inch at my previous office and didn’t have my home computer for the last two years after I gave my one to my friend’s son who aspired to study online.&lt;/p&gt;

&lt;p&gt;I do serious software development with Python, Typescript, Kotlin, Golang, and Rust. And thus, I was wondering if I could do serious web development with the iPad.&lt;/p&gt;

&lt;p&gt;After a quick online research, I found that even programming seems possible on the iPad with its keyboard as well as well-known touch-screen creative activities. So, I bought and tried using the iPad for light development and learning experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Spec Details
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;11-inch iPad Pro Wi-Fi 128G&lt;/li&gt;
&lt;li&gt;Magic Keyboard (Not Smart keyboard)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 13-inch screen was a bit too heavy to carry, and Smart Keyboard was too thin for a heavy typing workload. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75fpquob401uhpj62pda.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75fpquob401uhpj62pda.jpeg" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened in the first month?
&lt;/h2&gt;

&lt;p&gt;1st week: programming seems impossible!! Just watch  Youtube!&lt;br&gt;
2nd week: a code fix is possible, but serious devevelopment is not.&lt;br&gt;
3rd week: entire software development works with cloud IDEs and cloud services! AWS, GCP, Gitpot! &lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stateless! No dependency and data are left in the local computer!&lt;/li&gt;
&lt;li&gt;It is so lightweight that I can be anywhere with it! I flew to a couple of vacation places and enjoyed coding at hotels and cafes.&lt;/li&gt;
&lt;li&gt;The touch screen is terrific when I want subtle and interactive maneuvers. For instance, I showed my journey map to my friends.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;p&gt;Need to know alternative tricks to local machine development.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No terminal (use virtual machine such as ec2 and gce)&lt;/li&gt;
&lt;li&gt;No local Git (use cloud machine or Working Copy)&lt;/li&gt;
&lt;li&gt;Limited local IDEs (Gitpod, Stackblitz, Code Server)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overall
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Coding is definitely possible&lt;/li&gt;
&lt;li&gt;Serious software development is limited due to the heavy reliance on cloud IDEs and cloud services. You need to bear with its inconvenience in exchange for lightweight device benefits.&lt;/li&gt;
&lt;li&gt;This setup is not recommended for beginners. It is better to learn computer basics with standard computers. &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cloud IDE articles
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://coder.com/blog/a-guide-to-writing-code-on-an-ipad" rel="noopener noreferrer"&gt;A guide to writing code on an iPad&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.partech.nl/nl/publicaties/2020/05/we-tried-10-online-code-editors#" rel="noopener noreferrer"&gt;We tried 10 online code editors&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ipad</category>
      <category>webdev</category>
      <category>programming</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Don’t prioritize speed for e2e testing but consider smarter test schedules</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Mon, 27 Jun 2022 01:33:43 +0000</pubDate>
      <link>https://forem.com/hiroyone/dont-prioritize-speed-for-e2e-testing-but-consider-smarter-test-schedules-17f3</link>
      <guid>https://forem.com/hiroyone/dont-prioritize-speed-for-e2e-testing-but-consider-smarter-test-schedules-17f3</guid>
      <description>&lt;p&gt;End-to-end(e2e) testing such as by Cypress and Playwright is considered slow compared to unit/integrated testings such as by Jest.&lt;/p&gt;

&lt;p&gt;In this post, however, I would like to argue that a few devOps practices can dodge this slow performance issue in the devOps cycle and the developers can take fully advantage of e2e based quality assurance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is the slow performance considered an issue, by the way?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Testing performance is usually considered significant because developers want to include it in the CI/CD cycle, which should get completed as fast as possible.&lt;/p&gt;

&lt;p&gt;It usually takes more than 30 secs to execute one e2e testing for one web page. And thus, it would take more than 5 mins when e2e testing covers more than 10 pages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common CI/CD pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a pull request on a feature branch&lt;/li&gt;
&lt;li&gt;Build/compile the application&lt;/li&gt;
&lt;li&gt;Run tests&lt;/li&gt;
&lt;li&gt;Merge the new branch to the main branch&lt;/li&gt;
&lt;li&gt;Deploy the new application to servers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Due to the popularity of the above CI/CD pattern, front-end developers struggle to include e2e testing in Step 2. However, it means that the testing tightly binds with its development &amp;amp; deployment flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problems&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Every new push to the remote repository runs entire new tests. Too much waste of computing resources.&lt;/li&gt;
&lt;li&gt;New development/refactoring/configuration easily breaks some of the tests. And we want to fix broken tests at a different time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Run entire tests only in specific situations
&lt;/h2&gt;

&lt;p&gt;Include static test (eslint/prettier) and unit test (Jest) in Step 2, but not entire e2e tests.&lt;/p&gt;

&lt;p&gt;Of course, it is necessary to run prepared e2e tests before releasing the application to the production environment. But Git tags usually come into play for controlling a production release these days. In fact, the Github action supports &lt;a href="https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on" rel="noopener noreferrer"&gt;tag based actions&lt;/a&gt;. Thus, we can separate the CI/CD phase and the production release phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run e2e tests for only affected parts
&lt;/h2&gt;

&lt;p&gt;We can search modified files by git commands on a feature branch and run e2e tests to these files only on push to the remote repository.&lt;/p&gt;

&lt;p&gt;So, for example, if a developer modified pageA.js, pageB.js and pageC.js, the CI/CD pipeline runs pageA.jstest.js, pageB.jstest.js and pageC.jstest.js&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git ls-files | -I % /bin/bash -c '&amp;lt;test-command&amp;gt; %test.js;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or you can manually run tests regarding the affected pages and upload the test results to the pull request description as a part of the internal regulations. &lt;/p&gt;

&lt;h2&gt;
  
  
  Run all tests in parallel
&lt;/h2&gt;

&lt;p&gt;Most e2e automation tools such as Cypress and Playwright support running tests in parallel. &lt;/p&gt;

&lt;p&gt;Each test should not be too lengthly because parallel processing mechanism is file-based. If the test file length is more than 200 lines, it would be wise to split the test file into two.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Split your e2e testing into interactive testing and scenario testing</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sun, 01 May 2022 08:59:21 +0000</pubDate>
      <link>https://forem.com/hiroyone/split-your-e2e-testing-into-interactive-testing-and-scenario-testing-mi7</link>
      <guid>https://forem.com/hiroyone/split-your-e2e-testing-into-interactive-testing-and-scenario-testing-mi7</guid>
      <description>&lt;p&gt;I have been confronted with end-to-end(e2e) front-end testing in my enterprise project for the last couple of months and found a few practical tips worth developers' attention before starting their front-end testing. Let me share one of them in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Split your e2e testings into interactive testing and scenario testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Interactive testing (or integrated testing)&lt;/strong&gt; means any behavioral testing within a specific page, such as opening/closing a modal window and binding input data. &lt;/p&gt;

&lt;p&gt;On the other hand, &lt;strong&gt;scenario testing&lt;/strong&gt; ensures successful page transitions and data consistency between pages. For example, a purchase scenario testing starts from the Top page a user enters to the Thanks page where the same user exits.&lt;/p&gt;

&lt;h3&gt;
  
  
  1st Reason: Avoid Flaky Results
&lt;/h3&gt;

&lt;p&gt;There are two main motivations for splitting these two tests. We can &lt;strong&gt;avoid flaky results&lt;/strong&gt; and &lt;strong&gt;separate SSR and CSR pages.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, it would be too challenging to avoid flaky (unstable) behaviors if you mix both interactive and scenario testing into one extensive testing.&lt;/p&gt;

&lt;p&gt;In general, scenario testing tends to be flakier than interactive testing because it involves page transitions and data transfers, while interactive testing involves only one or a few components.&lt;/p&gt;

&lt;p&gt;Moreover, it is usually not until the finished phase that the scenario testing starts to pass stably. In contrast, interactive testing will pass as soon as developers finish implementing a few components, and they are less susceptible to external data and web services. &lt;/p&gt;

&lt;h3&gt;
  
  
  2nd Reason: Mock data v.s. Real data
&lt;/h3&gt;

&lt;p&gt;Lastly, interactive testing goes better with mock data because we want to test a variety of component behaviors including both normal and edge cases. Most e2e testing framework supports such API response interceptions. &lt;br&gt;
On the other hand, scenario testing fits better with real API data as data consistency is the key part. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive Testing → Mock Data&lt;/li&gt;
&lt;li&gt;Scenario Testing → Actual API Data&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3rd Reason: Separate SSR and CSR pages
&lt;/h3&gt;

&lt;p&gt;Secondly, interactive testing within a specific page can test SSR behaviors, while scenario testing across pages can test CSR behaviors. Developers cannot be ignorant of these differences, or runtime behaviors would fail in untested situations.&lt;/p&gt;

&lt;p&gt;Decoupling into two types of testing enables us to run these tests independently, helps us develop e2e testing in a predictive manner, and analyze the cause of testing failures. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing Directory Structure&lt;/strong&gt;&lt;br&gt;
It is more maintainable to have the same folder path and file names in the in the testing folder as the routes/pages folder.&lt;/p&gt;

&lt;p&gt;For instance, &lt;code&gt;cypress/integrations/top.spec.js&lt;/code&gt; tests all interactive cases in the Top page.&lt;/p&gt;

&lt;p&gt;And interactive testings are stored under the &lt;code&gt;integrations&lt;/code&gt; folder (instead of &lt;code&gt;interactive&lt;/code&gt; folder) because Cypress has this folder by default.&lt;/p&gt;

&lt;p&gt;Here is a sample folder directory if you choose Cypress.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cypress
 ├ integrations
 | ├ top.spec.js
 | ├ search.spec.js
 | ├ product.spec.js
 | ├ cart.spec.js
 | └ order.spec.js
 |
 ├ scenarios
 | ├ purchase
 | ├ inquiry
 | ├ cancellation 
 | └ content-reader
 |
 ├ plugins
 ├ fixtures
 └ others (downloads, screenshots, etc.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is it. I hope this tip will help you plan your e2e testing. &lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Don't develop your web apps with full SSR but use hybrid SSR/CSR approach!</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sat, 16 Apr 2022 12:14:18 +0000</pubDate>
      <link>https://forem.com/hiroyone/dont-develop-your-website-with-full-ssr-but-consider-hybrid-ssrcsr-approach-976</link>
      <guid>https://forem.com/hiroyone/dont-develop-your-website-with-full-ssr-but-consider-hybrid-ssrcsr-approach-976</guid>
      <description>&lt;p&gt;Nowadays, many frontend web apps are using Nodejs based frameworks such as &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Nextjs&lt;/a&gt; or &lt;a href="https://nuxtjs.org/" rel="noopener noreferrer"&gt;Nuxtjs&lt;/a&gt;. But some of their large-scale web apps are suffering performance issues. Here, I am going to explain one of the system design topics frontend engineers would face.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson: Don't develop your web apps with full SSR but use hybrid SSR/CSR approach&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First of all, You can learn the concepts of SSR, CSR, SSG, and ISR in the following article.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/pahanperera/visual-explanation-and-comparison-of-csr-ssr-ssg-and-isr-34ea"&gt;Visual Explanation and Comparison of CSR, SSR, SSG and ISR&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Furthermore, full Server-side rendering (Full SSR) is to generate web content on the server at every request time. On the other hand, most frameworks also support a hybrid SSR/CSR approach, which produces web contents on the server at the first request time but generates other pages on user browsers via internal page navigations.&lt;/p&gt;

&lt;p&gt;Some people would consider that the full SSR is better than hybrid SSR/CSR for security, performance, and SEO reasons as long as they can bear the increasing server cost. But this is almost surely false because Nodejs, the base of Nextjs and Nuxtjs runtime, is a single-threaded application.  &lt;/p&gt;

&lt;p&gt;It would be best to read this official article to learn how Nodejs takes advantage of single-threading.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/en/docs/guides/dont-block-the-event-loop/" rel="noopener noreferrer"&gt;Don't Block the Event Loop (or the Worker Pool)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In short, a single-threaded application is precisely like an excellent director. A Nodejs director can receive tons of tasks from clients (browsers) one after another, give instructions to his backend workers, and receive the task outcomes. Unfortunately, he is not a good worker, and it isn't nice to assume he can do both direction tasks and backend work. Thus, any computation-intensive jobs such as full SSR or large JSON parsing would lead to the tremendous latency of the entire application response.&lt;/p&gt;

&lt;p&gt;You can also read a well-written story from Maaspteh about his struggle with making his full-SSR web app performant. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.ah.technology/nodejs-and-react-ssr-the-need-for-foul-play-30c0f795e72a" rel="noopener noreferrer"&gt;NodeJS and React SSR, the need for foul play&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is safe to assume that hybrid SSR/CSR applications with moderately optimized code can produce 100 to 200 requests per second at the stress testing, but the full SSR site can bring out only 16 to 50 requests per second. Alas!&lt;/p&gt;

&lt;p&gt;Instead, you should fully take advantage of the nature of single-threaded applications in the following way.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use SSG/ISG rendering for mostly static but potentially frequently updated pages. Nextjs strongly supports &lt;a href="https://nextjs.org/docs/basic-features/pages" rel="noopener noreferrer"&gt;this idea&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Make use of lazy loading and conditional rendering for above-the-fold contents. Especially, be aware of components with a large DOM size like accordion menus and dynamic recommendation contents. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a final note, you could try using full SSR for specific pages whose visuals change almost entirely from the previous page, as the browser would be too slow to parse, render, and re-style the new DOM trees. In such a case, a developer just need to change internal links such as &lt;a href="https://nextjs.org/docs/api-reference/next/link" rel="noopener noreferrer"&gt;next/links&lt;/a&gt; to the standard &lt;a&gt; tag.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>nuxt</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Restructuring Frontend Testing Pyramid: alternative to Unit/Integration/E2E approach</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sun, 20 Mar 2022 16:03:57 +0000</pubDate>
      <link>https://forem.com/hiroyone/frontend-testing-no-more-unitintegratione2e-categorizations-and-priorities-5358</link>
      <guid>https://forem.com/hiroyone/frontend-testing-no-more-unitintegratione2e-categorizations-and-priorities-5358</guid>
      <description>&lt;p&gt;Many web developers prefer to use such traditional terminology as &lt;strong&gt;Unit / Integration / End-to-End testings&lt;/strong&gt; in their projects as these terms are still so familiar in the old-school software engineering fields. &lt;/p&gt;

&lt;p&gt;But shall we keep using these distinctions when component-oriented frontend frameworks are so predominant nowadays?&lt;/p&gt;

&lt;p&gt;Let me compare the old-school testing pyramid with the new pyramid and prioritize testings based on cost performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The old-school testing pyramid&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa59r7l4g8fm95n9moedv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa59r7l4g8fm95n9moedv.png" alt="New Frontend Testing Pyramid" width="735" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unit Tests:&lt;/strong&gt; The meaning of "Unit" is so ambiguous in the context of frontend development. Does it mean testing a UI component, or a bigger component like a todo table, or even an individual page? Many people readily imagine different things, especially for those who are from backend and infrastructure teams.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration Tests:&lt;/strong&gt; Again, The meaning of "Integration" is also unclear for the frontend development. Does it mean interactions among components or data consistency across pages?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;End-to-End Testing:&lt;/strong&gt; It is hard to tell from what end to what end people are talking about. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The restructured frontend testing pyramid
&lt;/h2&gt;

&lt;p&gt;Let me reconstruct the frontend testing pyramid based on the test types and their priorities for modern framework development.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y1ipmh3te6h6pqvwcop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5y1ipmh3te6h6pqvwcop.png" alt="New Frontend Testing Pyramid" width="782" height="830"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also prepared the table version with classic testing names.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpylobvvttv8qain7wq49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpylobvvttv8qain7wq49.png" alt="Testing Table" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Quality Checks
&lt;/h3&gt;

&lt;p&gt;The naming of "Static Testing" makes sense by itself, but what it actually does is analyze code in the repository and identify poorly written code. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft59mqia757s852tjv5sn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft59mqia757s852tjv5sn.png" alt="Linter Check" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no doubt that this test produces the most significant value for the cost. All developers need to do is just add syntax rules (&lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;) and format rules (&lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt;) at the beginning of the project. &lt;em&gt;Javascript and even Typescript are innately susceptible to runtime errors&lt;/em&gt;, but enforcing these coding rules in the build process amazingly captures most coding errors in the compile errors like Java or Golang.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interaction &amp;amp; Scenario Testing
&lt;/h3&gt;

&lt;p&gt;What developers call "Integration Testing" in the frontend context consists of two types of testing - interactions and scenario.&lt;/p&gt;

&lt;p&gt;Interaction testing is to ensure the quality of interactive features in a specific page, such as data binding in radio buttons, click events, and input validations. &lt;/p&gt;

&lt;p&gt;Scenario testing is to secure data consistency and transitions across pages. For example, an online shopping experience comprises views from the search page, product page, cart page, checkout page, and a thanks page. Aside from testing each interactive feature, it is valuable to guarantee that users can accomplish a typical shopping experience.&lt;/p&gt;

&lt;p&gt;I highly prioritize Interaction and Scenario Testings to Logic (Unit) Testing because focusing on actual user experience solves the most problems users would face and most errors found in Logic Testing can be covered by Interaction and Scenario Testings👍&lt;/p&gt;

&lt;p&gt;There are a few automation tools for these purposes, but my recommendation at this moment is &lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;, which is battle-tested and easy to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a6ltrlt5n355zyxmt6r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a6ltrlt5n355zyxmt6r.png" alt="https://docs.cypress.io/guides/getting-started/writing-your-first-test" width="596" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Testing
&lt;/h3&gt;

&lt;p&gt;This name is already self-explanatory, and developers just need to run &lt;a href="https://developers.google.com/web/tools/lighthouse" rel="noopener noreferrer"&gt;Lighthouse&lt;/a&gt; or its &lt;a href="https://github.com/GoogleChrome/lighthouse-ci/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;CI&lt;/a&gt; to kickstart. Typical performance tools check speed, SEO, accessibility and other best practices for web.&lt;/p&gt;

&lt;p&gt;These optimizations are usually easier to handle in the middle or the end of the project. Thus, I set the performance testing to a lower priority.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9o95wo2n8mp0x2gzrouh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9o95wo2n8mp0x2gzrouh.png" alt="Lighthouse Score" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Logic Testing
&lt;/h3&gt;

&lt;p&gt;Some components or functions have complex rules in them, thus, testing its logic (by tools like &lt;a href="https://jestjs.io" rel="noopener noreferrer"&gt;Jest&lt;/a&gt;) makes sense. This is part of the Unit Testing, but the name sounds too ambiguous, as explained before. &lt;/p&gt;

&lt;p&gt;Rather than intensively testing logic, it is wiser not to bring and develop complex rules to the frontend development in the first place. Only acceptable are presentation logics, and backends should handle all complicated logic for the applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Visual Testing
&lt;/h3&gt;

&lt;p&gt;Many developers call "UI Testing" but Visual Testing sounds more evident for checking component and page stylings.&lt;/p&gt;

&lt;p&gt;I put this testing to the lowest priority but it depends on project goals. In my case, stylings are more robust under the scoped-component development with React/Vue and the Inverted Triangle CSS architecture. &lt;/p&gt;

&lt;p&gt;In large projects, developers are encouraged to collaboratively work with UI designers and exchange opinions about component and page stylings with tools like &lt;a href="https://storybook.js.org/" rel="noopener noreferrer"&gt;Storybook&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I emphasized the following points in this article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicit testing names compared to the old-school testing names&lt;/li&gt;
&lt;li&gt;More priority on interaction and scenario testing based on cost performance&lt;/li&gt;
&lt;li&gt;Automation Tools for each testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hope this article was helpful to other developers!&lt;/p&gt;

</description>
      <category>testing</category>
      <category>javascript</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to troubleshoot CORS Preflight / Options errors in 2022</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sat, 05 Feb 2022 05:51:25 +0000</pubDate>
      <link>https://forem.com/hiroyone/how-to-troubleshoot-cors-preflight-options-errors-in-2022-5ek9</link>
      <guid>https://forem.com/hiroyone/how-to-troubleshoot-cors-preflight-options-errors-in-2022-5ek9</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reference this original &lt;a href="https://i.ibb.co/PgcSMds/How-to-troubleshoot-CORS-errors-1.png" rel="noopener noreferrer"&gt;flow chart&lt;/a&gt; I created for this post.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32e8ozjrn0cywasq1kb6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F32e8ozjrn0cywasq1kb6.png" alt="https://i.ibb.co/PgcSMds/How-to-troubleshoot-CORS-errors-1.png" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Introduction: What is CORS? What is preflight? What is the Options method?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;The CORS&lt;/code&gt; stands for the Cross-Origin Resource Sharing. It matters when a currently viewed website is trying to fetch a resource like JSON from another web server (cross-origin) because browsers restrict cross-origin HTTP requests initiated from scripts.&lt;/p&gt;

&lt;p&gt;As a safety precaution, before sending the original request, browsers send a cross-origin server a so-called &lt;code&gt;preflight request&lt;/code&gt; whose headers include both the HTTP method and headers that will be used in the original request. The preflight request uses the HTTP &lt;code&gt;OPTIONS&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;For more precise definitions and related discussions, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" rel="noopener noreferrer"&gt;The official document&lt;/a&gt; is the best.&lt;/p&gt;

&lt;p&gt;The rest of this post discusses common situational questions and answers to solve them. &lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Question 1: &lt;code&gt;Options&lt;/code&gt; request is sent to the backend dev-server, but the response status code is 405 (Method Not Allowed). What should the frontend do to resolve the issue?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Cross-Origin Request Blocked: The Same Origin Policy disallows
reading the remote resource at https://cors-2022.com. (Reason: XXX).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Answer 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can adopt one of the two choices below.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ask the backend to handle the option method. A preflight request is inevitable and appropriate for security reasons in some situations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consider the possibility of switching from a preflight request to a simple request. Simple requests don't trigger a CORS preflight.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To make your request simple, you need to satisfy all of the conditions written &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Question 2: The backend-dev team prepared a server stub auto-generated by &lt;a href="https://swagger.io/tools/swagger-codegen/" rel="noopener noreferrer"&gt;Swagger Codegen&lt;/a&gt; for our frontend-dev team. But I see some CORS errors related to the options method.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can adopt one of the last three choices below.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;(&lt;strong&gt;Don't&lt;/strong&gt;✋) Modify the server stub implementation manually. It would be a poor choice because a server stub can no longer be auto-generated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suppose that your app is made from Vue or React. Then, use framework built-in proxy features such as the React Dev Server Proxy (See &lt;a href="https://medium.com/bb-tutorials-and-thoughts/react-how-to-proxy-to-backend-server-5588a9e0347" rel="noopener noreferrer"&gt;this post&lt;/a&gt;) or &lt;a href="See%20[this%20post](https://www.stackhawk.com/blog/vue-cors-guide-what-it-is-and-how-to-enable-it/)"&gt;Vue Proxy&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use a general proxy tool like &lt;a href="https://github.com/Rob--W/cors-anywhere" rel="noopener noreferrer"&gt;CORS Anywhere&lt;/a&gt;. This proxy manipulates the request header to temporarily circumvent the CORS protection.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use a browser extension such as &lt;a href="https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf" rel="noopener noreferrer"&gt;Allow CORS &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>security</category>
    </item>
    <item>
      <title>How to Review Pull Requests 3x faster</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sun, 30 Jan 2022 14:23:17 +0000</pubDate>
      <link>https://forem.com/hiroyone/review-pull-request-3x-faster-then-10x-faster-n8e</link>
      <guid>https://forem.com/hiroyone/review-pull-request-3x-faster-then-10x-faster-n8e</guid>
      <description>&lt;p&gt;&lt;strong&gt;How much time do you spend on average for reviewing a pull request - 3min, 10mins, or 30mins?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even experienced programmers spend between 10 mins to 30 mins on average to review a pull request from their colleagues on some project. &lt;/p&gt;

&lt;p&gt;Throughout various enterprise projects (Typescript, Python, Golang, Java), I reviewed more than 100 pull requests and learned to review a pull request 3x faster and more accurately, and then get even faster with automated tool's help.&lt;/p&gt;

&lt;h2&gt;
  
  
  No.1: Use a pull request template
&lt;/h2&gt;

&lt;p&gt;Have you ever thought the following in your heart?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changes are made and what are not?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where are the relevant documentation for functional requirements, specifications, and designs?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The solution to the above challenges is easy, but many newbie projects miss it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a pull request template!!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It ensures that every pull request has the necessary information in sorted order.&lt;/p&gt;

&lt;p&gt;At least, it's good to include the following points.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Description
2. A list of Changes
3. Future todos
4. Screenshots or movies
5. Test Cases and results
6. How to review your code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check &lt;a href="https://github.com/hiroyone/pull-request-template-example" rel="noopener noreferrer"&gt;my repository&lt;/a&gt; for a complete pull request template.&lt;/p&gt;

&lt;h2&gt;
  
  
  No.2: Don't review business logic but prepare a test for it
&lt;/h2&gt;

&lt;p&gt;Have you seen the following comments?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I tried your new feature on my local PC, but it did not work.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;&lt;code&gt;I checked your code, and the logic in line XX should be the opposite of the specification.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That would be generous but also too much consuming to guarantee business logic by manually checking the coding counterpart.&lt;/p&gt;

&lt;p&gt;For example, look at the following control flow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (condition1) {
  //  10 lines of code here
} else if (condition2) {
  //  20 lines of code here
} else if (condition3) {
  //  20 lines of code here
} else {
  //  20 lines of code here
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To review the above code, you need to go back and forth between the pull request and documentation 3 or 4 times.&lt;/p&gt;

&lt;p&gt;And the real problem of this code is not about the logic but many if/else statements.&lt;/p&gt;

&lt;p&gt;Anyway, it is more efficient to use (automated) testings to assure functional qualities of your code.&lt;/p&gt;

&lt;p&gt;The procedure is so simple.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Write test cases to a test sheet
2. Review if test cases are sufficient
3. Write corresponding test code
4. Run the test program in every pull request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are many automated testing frameworks in every programming language and CI/CD tools in code hosting platforms. &lt;/p&gt;

&lt;h2&gt;
  
  
  No.3: Configure a linter and a formatter properly
&lt;/h2&gt;

&lt;p&gt;Have you seen the review comments like the below?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;This variable should be a camelCase.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or &lt;/p&gt;

&lt;p&gt;&lt;code&gt;This JSON object should be indented.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Any project with comments like the above fails to introduce a syntax checker and a code formatter properly.&lt;/p&gt;

&lt;p&gt;For instance, ESLint and Prettier are the de fact standard for javascript/typescript development. So it is important to configure eslintrc and prettierrc files properly.&lt;/p&gt;

&lt;p&gt;Furthermore, it is also crucial not to allow exceptions without rationals. Think carefully about why a violated lint rule improves/secures your code, and your code could still be an exception.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The above No.1, No.2, No.3 practices make pull request reviews 3x faster than not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It should take between 3 mins to 10 mins for a meaningful review.&lt;/p&gt;

&lt;p&gt;You should only focus on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Readability&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Abstraction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A useful rule of thumb is to keep every file less than 200 lines in the repository.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But how can you spend even less time for pull request review?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is an automated code quality review tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  No.4: Use Code Quality Review tool
&lt;/h2&gt;

&lt;p&gt;A good Code Quality Review tool makes pull request reviews another 3x faster, so it is 10x from the beginning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codeclimate.com/" rel="noopener noreferrer"&gt;Code Climate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codebeat.co/" rel="noopener noreferrer"&gt;Codebeat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sonarqube.org/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I prefer to use Codebeat because it gives a sufficient static code analysis, rich CI/CD supports, a managed service. Moreover, it allows us to focus only on poor but easily fixable code on their Quick Wins panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F922w24dc8j00avhbzhjh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F922w24dc8j00avhbzhjh.png" alt="Image description" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, SonarQube is more configurable in-depth and would be helpful in the advanced project requirement.&lt;/p&gt;

&lt;p&gt;I recommend two articles for detailed tool comparisons.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.netguru.com/blog/comparison-automated-code-review-tools-codebeat-codacy-codeclimate-scrutinizer" rel="noopener noreferrer"&gt;Comparison of Automated Code Review Tools: Codebeat, Codacy, Codeclimate and Scrutinizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/devgurus/continuous-code-quality-and-automated-code-review-tools-aa911dd1b263" rel="noopener noreferrer"&gt;Continuous code quality and automated code review tools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading, and good luck with your review!🙌&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>codenewbie</category>
      <category>github</category>
    </item>
    <item>
      <title>How I cracked the Google Cloud Professional Machine Learning Engineer Certification Exam</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sat, 29 Jan 2022 07:57:48 +0000</pubDate>
      <link>https://forem.com/hiroyone/how-i-cracked-the-google-cloud-professional-machine-learning-engineer-certification-exam-2cin</link>
      <guid>https://forem.com/hiroyone/how-i-cracked-the-google-cloud-professional-machine-learning-engineer-certification-exam-2cin</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a5ggkphklsh9ptoiwh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1a5ggkphklsh9ptoiwh0.png" alt="Image description" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Cloud launched the Professional Machine Learning(ML) Engineer Certification Exam on Oct 15, 2020🎉 (Not beta but GA version)&lt;/li&gt;
&lt;li&gt;I passed the exam as one of the first test-takers on Oct. 17 in Tokyo, Japan.💪&lt;/li&gt;
&lt;li&gt;Many exam questions were centered around practical use cases, not just about GCP service understanding.&lt;/li&gt;
&lt;li&gt;Also, many test questions were beyond the scope of GCP services; Pure ML problems were asked.&lt;/li&gt;
&lt;li&gt;To cover the exam, it is good to have a robust &amp;amp; comprehensive understanding of ML problems and solutions: ML foundations, major ML models, feature engineering, Tensorflow, model understanding tools, GCP services, Deep Learning technology.&lt;/li&gt;
&lt;li&gt;Knowledge gained from &lt;a href="https://cloud.google.com/certification/data-engineer" rel="noopener noreferrer"&gt;the Professional Data Engineer Certification&lt;/a&gt; is partially but definitely helpful to this ML exam.&lt;/li&gt;
&lt;li&gt;Compared with the Professional Cloud Architect and 
the Professional Data Engineer Certifications I passed previously, I am certain that this exam is way more difficult, practical, and advanced, requiring both GCP service familiarity and ML domain expertise.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A list of recommended articles concerning this exam
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://deploy.live/blog/google-cloud-professional-machine-learning-engineer-certification-preparation-guide/" rel="noopener noreferrer"&gt;Google Cloud Professional Machine Learning Engineer Certification Preparation Guide by Dmitri Lerko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@jmoniz0/my-notes-on-google-cloud-machine-learning-engineer-exam-280eab80f8ab" rel="noopener noreferrer"&gt;My notes from Google Cloud Machine Learning Engineer exam by João Serra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/pulse/my-take-professional-machine-learning-engineerbeta-exam-parth-mehta/?trackingId=MR7dR%2BiDR7aXRIeR3yTMhA%3D%3D" rel="noopener noreferrer"&gt;My take on Professional Machine Learning Engineer(Beta) Exam
Google Cloud Professional Machine Learning Engineer Certification Now in Beta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@robertf99/craving-for-ml-my-reflection-on-gcp-professional-machine-learning-engineer-exam-7007848468fc" rel="noopener noreferrer"&gt;My Reflection on GCP Professional Machine Learning Engineer Certification Exam&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@robertf99/craving-for-ml-my-reflection-on-gcp-professional-machine-learning-engineer-exam-7007848468fc" rel="noopener noreferrer"&gt;Craving for ML: My Reflection on GCP Professional Machine Learning Engineer Exam&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;Google Cloud Professional Machine Learning Engineer Certification Exam was launched on Oct 15, 2020🎉 (Not beta but GA version)&lt;/p&gt;

&lt;p&gt;I passed the exam as one of the first test-takers on Oct. 17 in Tokyo, Japan. I wanted to be the first Japanese who passed this unprecedentedly hard exam, requiring all GCP, ML, and programming skills (let alone English proficiency).&lt;/p&gt;

&lt;h2&gt;
  
  
  About me
&lt;/h2&gt;

&lt;p&gt;I already passed two other GCP exams in the past: Professional Cloud Architect and Professional Data Engineer Certifications, whose expertise was definitely helpful to this ML exam.&lt;/p&gt;

&lt;p&gt;Also, I've already had some preliminary knowledge and experience in machine learning and programming.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Worked as an ML engineer in the Japanese IT industry for the past few years.&lt;/li&gt;
&lt;li&gt;Won second place in a mid-size public ML competition in 2018.&lt;/li&gt;
&lt;li&gt;Completed Python fundamentals, Pandas, Numpy, NLP, Matplotlib, and others on-line in six months before starting my career.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Preliminary Step: &lt;a href="https://www.coursera.org/learn/python-machine-learning" rel="noopener noreferrer"&gt;Data Science and ML fundamentals in Python&lt;/a&gt; (100hrs)🤖&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.coursera.org/specializations/machine-learning-tensorflow-gcp" rel="noopener noreferrer"&gt;Tensorflow&lt;/a&gt; (20hrs)&lt;/li&gt;
&lt;li&gt;Input Data Pipeline, Models Trainings, Evaluation Metrics, &lt;a href="https://blog.tensorflow.org/2018/03/introducing-tensorflow-model-analysis.html" rel="noopener noreferrer"&gt;Model Analysis Tool&lt;/a&gt;📊, CPU/GPU/TPU&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.coursera.org/learn/gcp-big-data-ml-fundamentals" rel="noopener noreferrer"&gt;GCP Solutions&lt;/a&gt; (100hrs)&lt;/li&gt;
&lt;li&gt;ML Models: pre-trained AI solutions → AutoML → Custom Model → Kubeflow Pipeline&lt;/li&gt;
&lt;li&gt;ML Preps: AI Notebooks, Data Labeling Service, Data Loss Prevention&lt;/li&gt;
&lt;li&gt;Big Data: BigQuery, Cloud Storage&lt;/li&gt;
&lt;li&gt;ETL: Dataflow, Composer, Datafusion, Pubsub
and so many others😊
&lt;a href="https://www.coursera.org/learn/feature-engineering?specialization=machine-learning-tensorflow-gcp" rel="noopener noreferrer"&gt;Feature Engineering&lt;/a&gt; (20hrs)

&lt;ul&gt;
&lt;li&gt;Categorization/Discretization&lt;/li&gt;
&lt;li&gt;Feature crosses&lt;/li&gt;
&lt;li&gt;Sparse data&lt;/li&gt;
&lt;li&gt;Embedding&lt;/li&gt;
&lt;li&gt;Memorization &amp;amp; Generalization&lt;/li&gt;
&lt;li&gt;Data leakage
&lt;a href="https://www.coursera.org/specializations/deep-learning" rel="noopener noreferrer"&gt;(Deep learning) training issues and best practices&lt;/a&gt; (100hrs)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;DNN/CNN/RNN, Wide and Deep Model, Autoencoder&lt;/li&gt;

&lt;li&gt;Overfitting/Underfitting: L1&amp;amp;L2 Regularizations, Dropouts&lt;/li&gt;

&lt;li&gt;Fast Computation: Stochastic Gradient Descent, Mini-batch&lt;/li&gt;

&lt;li&gt;Fast Gradient Descent: Adam (Momentum &amp;amp; RMS Props &amp;amp; learning rate decay)&lt;/li&gt;

&lt;li&gt;Vanishing Gradient: ReLu&lt;/li&gt;

&lt;li&gt;Exploding Gradient: Lower learning rate&lt;/li&gt;

&lt;li&gt;Internal Covariate Shift: batch normalization&lt;/li&gt;

&lt;li&gt;Dead Relu: Leaky Relu&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As described above, there are a wide variety of ML subjects to cover in addition to GCP ML services, and I found that this exam was still hard to solve. That is why I felt that this exam is way harder than other GCP certification exams.&lt;br&gt;
According to &lt;a href="https://googlecloudcertified.credential.net/" rel="noopener noreferrer"&gt;the Google Cloud Certified directory&lt;/a&gt;, there are 156 registered people who passed the ML exam in the world, three months after its launch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggaetb3ntxs58qpc5jc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggaetb3ntxs58qpc5jc7.png" alt="Image description" width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am happy and proud of myself for passing this tough exam, but I may have just lucked out.😂&lt;/p&gt;

&lt;p&gt;Good luck to you too!👼&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best Practices for reviewing Pull Requests in projects</title>
      <dc:creator>hiroyone</dc:creator>
      <pubDate>Sat, 22 Jan 2022 12:13:11 +0000</pubDate>
      <link>https://forem.com/hiroyone/essential-pull-request-review-strategies-4ko4</link>
      <guid>https://forem.com/hiroyone/essential-pull-request-review-strategies-4ko4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Are you really confident in reviewing your colleague's code when they submit a pull request to you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you proudly answer the crucial qualities you should look into in the code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To be honest, I had been not confident at all for a long time. I was so afraid and overwhelmed to see pull requests with massive, unstructured lines of code changes submitted by a diverse level of other software engineers, even though I had already gained confidence in my programming skills.&lt;/p&gt;

&lt;p&gt;However, I started to review my colleague's pull request in a million-dollar enterprise project which was so large and challenging. I have done more than 100 code reviews intensively in a couple of months and discovered solid insights into essential perspectives every reviewer should have in a practical and sustainable way.&lt;/p&gt;

&lt;p&gt;I am happy to share them below. &lt;/p&gt;




&lt;h2&gt;
  
  
  No.1: Traceable and Revertible Pull Requests
&lt;/h2&gt;

&lt;p&gt;Pull requests should be traceable and revertible after your review so that we can analyze, debug, or even revert code commits long days after we find a bug in a program.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt; try to discover all kinds of bugs&lt;/p&gt;

&lt;p&gt;Catching all kinds of bugs with human eyes is too much time-consuming and almost impossible. Business logic functionalities should be guaranteed by (automatic) testings rather than manual code reviews.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt; prepare a crystal-clear pull request template&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Description

Please write a summary of the changes in this pull request.

Fixes # (issue)

## Changes

Please write a list of this PR's changes here.

## Todos

Please write a list of future changes here.

## How can we see the results or reproduce them?

Please attach screenshots or videos so that reviewers can easily confirm what features are implemented.

## How Has This Been Tested?

Please describe the tests that you ran to verify your changes.

- [ ] Unit test
- [ ] Integration test
- [ ] End-to-end test
- [ ] System test

## How do you want others to review your code?

- [ ] Commit by commit
- [ ] Entire diff
- [ ] Others

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is from &lt;a href="https://github.com/hiroyone/pull-request-template-example" rel="noopener noreferrer"&gt;my repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What about the pull request size? Shouldn't it be small?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, but there is no way to enforce this systemically. It is already too late when an inexperienced programmer posts a large pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  No.2: Address bad code only!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Don't&lt;/strong&gt; pursue the best implementations on every bit of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do&lt;/strong&gt; comment only on poorly implemented code that impairs the robustness of the repository's structure. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt;&lt;br&gt;
The best code is subjective, contextual, hard to prove most of the time. The poor code is self-evident and easy to spot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples of Bad Code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicated code&lt;/li&gt;
&lt;li&gt;More than two nested something (functions, objects)&lt;/li&gt;
&lt;li&gt;Misleading variable names&lt;/li&gt;
&lt;li&gt;More than ten function arguments&lt;/li&gt;
&lt;li&gt;Hard-coding: mixes of logic and data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Examples of So-So code&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verbose function name&lt;/li&gt;
&lt;li&gt;Less popular or outdated programming syntax&lt;/li&gt;
&lt;li&gt;Non-conventional variable name but it still makes sense (e.g. &lt;code&gt;addMore&lt;/code&gt; instead of &lt;code&gt;readMore&lt;/code&gt; )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is good to avoid an unnecessary dispute with your colleagues on tiny code performance or styles. A few disagreements over minor things with colleagues would ruin the relationship and the atmosphere in a long-run project. &lt;/p&gt;

&lt;p&gt;Nonetheless, experienced programmers tend to pursue the best implementations and occasionally enforce them because that is how they improved their programming skills in the past.&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>codequality</category>
      <category>github</category>
      <category>template</category>
    </item>
  </channel>
</rss>
