<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title></title>
  <subtitle></subtitle>
  <id>https://www.endpointdev.com/blog/tags/culture/</id>
  <link href="https://www.endpointdev.com/blog/tags/culture/"/>
  <link href="https://www.endpointdev.com/blog/tags/culture/" rel="self"/>
  <updated>2022-03-21T00:00:00+00:00</updated>
  <author>
    <name>End Point Dev</name>
  </author>
  
    <entry>
      <title>Code Reviews</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2022/03/code-reviews/"/>
      <id>https://www.endpointdev.com/blog/2022/03/code-reviews/</id>
      <published>2022-03-21T00:00:00+00:00</published>
      <author>
        <name>Kevin Campusano</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2022/03/code-reviews/20220219-194926-sm.webp&#34; alt=&#34;Winter scene with pine trees behind snow on tall grasses around a winding stream crossed by a primitive bridge of 8 logs, below blue sky with white clouds&#34;&gt;&lt;/p&gt;
&lt;!-- Photo by Jon Jensen --&gt;
&lt;p&gt;Last week, a few End Point team members and I came together to prepare a presentation on code reviews for the whole company. We went through the basics of &amp;ldquo;what&amp;rdquo;, &amp;ldquo;why&amp;rdquo;, and &amp;ldquo;how&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;We also, and perhaps most interestingly, made several recommendations that we&amp;rsquo;ve discovered after years of doing code reviews in a variety of teams and project sizes. A series of &amp;ldquo;lessons learned&amp;rdquo; so to speak.&lt;/p&gt;
&lt;p&gt;I thought it&amp;rsquo;d be useful to capture that discussion in written form. Let&amp;rsquo;s start with the basics.&lt;/p&gt;
&lt;h3 id=&#34;what-is-a-code-review&#34;&gt;What is a code review?&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/code_review&#34;&gt;Wikipedia&amp;rsquo;s article on code reviews&lt;/a&gt; says that a code review is&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A &lt;strong&gt;software quality assurance&lt;/strong&gt; activity in which &lt;strong&gt;one or several people&lt;/strong&gt; check a program mainly by viewing and &lt;strong&gt;reading parts of its source code&lt;/strong&gt;, and they do so &lt;strong&gt;after implementation&lt;/strong&gt; or as an interruption of implementation.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;That is a precise but frankly wordy way to say &amp;ldquo;having somebody look at the code you&amp;rsquo;ve written&amp;rdquo;. This definition, however, touches on a few aspects that give us good insight into what code reviews are and what their purpose is.&lt;/p&gt;
&lt;p&gt;First up, it tells us that code reviews are a software quality assurance activity. That is, their main goal is to make sure that the code that&amp;rsquo;s being produced is of good quality.&lt;/p&gt;
&lt;p&gt;Second, it tells us that they are carried out by one or several people, revealing that code reviews are a team exercise. It&amp;rsquo;s the opposite of coding in isolation. Coding becomes a communal task, with input from other team members.&lt;/p&gt;
&lt;p&gt;It also tells us, maybe unsurprisingly, that the main focus of the review is the code itself. As the main deliverable artifact of the software development process, we should strive to make it as good as possible.&lt;/p&gt;
&lt;p&gt;Finally, it tells us when code reviews should happen: when implementation is done, or there&amp;rsquo;s a logical interruption of it. Meaning, once a feature is done, a user story is complete, a bug fixed. That is, when there&amp;rsquo;s a cohesive chunk of code that has been written.&lt;/p&gt;
&lt;h3 id=&#34;why-should-we-do-code-reviews&#34;&gt;Why should we do code reviews?&lt;/h3&gt;
&lt;p&gt;So why are code reviews important? They provide many benefits.&lt;/p&gt;
&lt;p&gt;First and foremost, code reviews can help improve the code&amp;rsquo;s internal quality. Productive discussion around an implementation can help improve maintainability and readability of the code when reviewers, with a fresh set of eyes, spot the potential for such improvements where the original author may have missed them.&lt;/p&gt;
&lt;p&gt;Also, and just as important, external quality of the code can be improved. Reviewers can help find bugs or other types of defects like security and performance issues.&lt;/p&gt;
&lt;p&gt;Code reviews can also serve as a knowledge sharing tool. Code written by team members of more seniority or who are more knowledgeable about the code area, business domain, or a specific tool or library, can be exemplary for other team members. They can learn from the code when conducting reviews. This has the added perk that it reduces the situations where a single person holds all the knowledge of a given system component or code area. Likewise, code review feedback provided by such an expert can have the same effect.&lt;/p&gt;
&lt;p&gt;Another great benefit they can bring to the table is the distribution of code ownership among all of the team members, not only the author of the code in question. When projects have strong code review habits, the code becomes something that the whole team is producing, as every line that gets to production has been seen by, and incorporated input from, many of the members of the team. Everybody owns and can feel proud of the final product.&lt;/p&gt;
&lt;p&gt;Finally, reviewers can sometimes just come up with better and/or simpler solutions than the ones the original author implemented. They can come up with these given their fresh perspective and maybe their experience with similar problems in other domains. Code reviews allow for these to be incorporated before the time comes to ship the code.&lt;/p&gt;
&lt;h3 id=&#34;what-should-reviewers-look-for&#34;&gt;What should reviewers look for?&lt;/h3&gt;
&lt;p&gt;Simply put, reviewers should look at every aspect of the code and offer suggestions for improvements where they see fit. &lt;a href=&#34;https://google.github.io/eng-practices/review/#look_for&#34;&gt;Google&amp;rsquo;s recommended practices&lt;/a&gt; compile a somewhat comprehensive list of the elements that reviewers should look for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design:&lt;/strong&gt; Is the code well-designed and appropriate for the system?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functionality:&lt;/strong&gt; Does the code implement the requirements correctly?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complexity:&lt;/strong&gt; Could the code be made simpler? Is it understandable?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests:&lt;/strong&gt; Does the code have correct and well-designed automated tests?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Naming:&lt;/strong&gt; Are clear names for variables, classes, methods, etc. being used?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments:&lt;/strong&gt; Are the comments clear, useful and necessary?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style:&lt;/strong&gt; Does the code follow the project’s style guide?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; Did the relevant documentation also get updated? Any public interface documentation or OpenAPI files for example.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When it comes to code style, something to note is that this is where tools like linters are prettiers can be implemented to reduce human labor. Early in the project, if the team decides on the style, such a tool can be setup to automate the process of making sure that all code that gets written complies with the style guide. Some code repositories even allow for such tools to be automatically run upon every push. This makes style guide compliance not even a concern for the reviewers, because the tooling always makes sure that the code does comply.&lt;/p&gt;
&lt;h3 id=&#34;who-should-review-codewho-should-ask-for-their-code-to-be-reviewed&#34;&gt;Who should review code?&lt;br&gt;Who should ask for their code to be reviewed?&lt;/h3&gt;
&lt;p&gt;Everybody in the team should be regularly reviewing code and having their code reviewed. Regardless of seniority or experience in the specific project area, domain, framework, or language. More &amp;ldquo;junior&amp;rdquo; team members benefit from reviewing code by learning new techniques, principles, technologies, and the code base itself. More &amp;ldquo;senior&amp;rdquo; team members can provide valuable input that improves the code base and other team members&amp;rsquo; skills.&lt;/p&gt;
&lt;p&gt;We also have to realize that the distinction between &amp;ldquo;junior&amp;rdquo; and &amp;ldquo;senior&amp;rdquo; is often blurry. Most teams have people with a variety of skill sets and experience; so everybody has the ability to offer good insight. One can always be a &amp;ldquo;senior&amp;rdquo; in one aspect of the project, and a &amp;ldquo;junior&amp;rdquo; in another.&lt;/p&gt;
&lt;p&gt;Even if a single reviewer can be good enough, it is beneficial to include as many reviewers as possible, lest we fall into the trap of overloading a small number of individuals by having them be in charge of most or all of the reviews. Also, like I mentioned before, two great benefits that code reviews offer are knowledge sharing and code ownership. The more people you have regularly reviewing code, the bigger they impact will they have in these two aspects.&lt;/p&gt;
&lt;p&gt;That said, it is always better to have somebody more experienced in the area of the code that&amp;rsquo;s changing be among the reviewers.&lt;/p&gt;
&lt;h3 id=&#34;when-should-code-be-reviewed&#34;&gt;When should code be reviewed?&lt;/h3&gt;
&lt;p&gt;As Wikipedia&amp;rsquo;s definition revealed, it is ideal for code reviews to be done when implementation is done on a feature; before merging the new code into the main development branch. Most modern software development that uses a Git-based code repository uses something like GitHub&amp;rsquo;s &lt;a href=&#34;https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests&#34;&gt;Pull Request&lt;/a&gt; mechanism. (GitLab uses Merge Request instead of Pull Request: same concept, different terminology.)&lt;/p&gt;
&lt;p&gt;The developer creates a Pull Request when they are done implementing a feature or fixing a bug. The PR compiles all the changes (a series of commits) and turns them into a nice digestible package. This adds great visibility to the changes and makes them very easy to review before merging. Ideally, no patch makes it into the system without first being reviewed.&lt;/p&gt;
&lt;p&gt;Code reviews can also happen before the implementation is done. Maybe the developer wants to get the team&amp;rsquo;s input on a specific function, method, class, component or approach. If the developer asks for it specifically, it can happen at any point in their development process.&lt;/p&gt;
&lt;h3 id=&#34;some-recommendations&#34;&gt;Some recommendations&lt;/h3&gt;
&lt;p&gt;Now that we&amp;rsquo;ve gone over the basics, let&amp;rsquo;s discuss some recommendations and pitfalls to avoid, inspired by our experience in conducting code reviews over the years.&lt;/p&gt;
&lt;h4 id=&#34;keep-pull-requests-to-a-manageable-size&#34;&gt;Keep pull requests to a manageable size&lt;/h4&gt;
&lt;p&gt;Bigger patches make code reviews harder to perform because of the sheer volume of code that the reviewers need to work through. More code to read makes it tempting to skim over it rather than reading in depth, and makes it hard to gain a thorough understanding of the changes and offer good insight.&lt;/p&gt;
&lt;p&gt;So we feel like it is best to keep them as small as possible. This desire to keep things small may need to affect the overall software development process upstream. For example, making sure user stories or change requests are granular enough so that they can be fulfilled with a reasonable amount of code changes. Consider splitting bigger features into smaller, bite-sized issues to make this possible.&lt;/p&gt;
&lt;h4 id=&#34;make-the-pull-request-cohesive&#34;&gt;Make the pull request cohesive&lt;/h4&gt;
&lt;p&gt;PRs are better when their size is manageable, but also we need to make sure that they contain all they need to allow the reviewers to understand them completely and as a whole. There&amp;rsquo;s no need to split the changes artificially (for example, between back-end and front-end) if ultimately, they need to be pushed together to fulfill the requirement that&amp;rsquo;s being worked on, and leave the system in a working state.&lt;/p&gt;
&lt;h4 id=&#34;if-you-would-like-a-preliminary-review-ask-specific-questions&#34;&gt;If you would like a preliminary review, ask specific questions&lt;/h4&gt;
&lt;p&gt;Sometimes we want to get early reviews even before the implementation is complete or we&amp;rsquo;re at a logical interruption point. For such cases, a good practice is to come to the reviewers with a specific question that we&amp;rsquo;d like them to focus on.&lt;/p&gt;
&lt;p&gt;It can waste time if the intent of the review is not explicitly communicated: The reviewer could mistakenly do a thorough review and leave feedback on tiny details of code that&amp;rsquo;s not yet ready and not even address the specific larger aspects that the developer wants help with.&lt;/p&gt;
&lt;h4 id=&#34;pair-programming-has-the-first-code-review-baked-in&#34;&gt;Pair programming has the first code review baked in&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Pair_programming&#34;&gt;Pair programming&lt;/a&gt; can expedite the review process by closing the code review feedback loop, compressing it to its fastest form. In pair programming, code effectively gets reviewed as soon as it is written, bit by bit.&lt;/p&gt;
&lt;p&gt;If the team has more than two developers, though, there&amp;rsquo;s still great value in having the other team members, the ones not involved in the pair programming activity, review the code. They will approach it later with fresh eyes and without the shared mental context the pair had.&lt;/p&gt;
&lt;h4 id=&#34;code-reviews-work-well-asynchronously&#34;&gt;Code reviews work well asynchronously&lt;/h4&gt;
&lt;p&gt;In general, don&amp;rsquo;t make code reviews a synchronous process. Publicly available Git repository cloud hosting services like GitHub and GitLab include great tools for reviewing pull/​merge requests. We should use them to their full potential. There&amp;rsquo;s no need for a conference call or an in person meeting where everybody blocks a chunk of time to dedicate it to reviewing a PR. Everybody can do it on their own at their convenience.&lt;/p&gt;
&lt;p&gt;But if a member of the team is new to the process of reviewing code, it can be good to work through a few pull requests at the same time, together, till they get the hang of it.&lt;/p&gt;
&lt;h4 id=&#34;give-code-reviews-high-priority&#34;&gt;Give code reviews high priority&lt;/h4&gt;
&lt;p&gt;Give code reviews a high priority within your daily tasks. It is counterproductive to let pull requests sit for a long time when a few minutes to an hour of our time can mean that a user story/​ticket can move forward through the process. If you work by organizing your increments via sprints, remember that the goal is to complete the most stories as a team. Reviewing a pull request is actively supporting that goal, even if it isn&amp;rsquo;t one of the stories/​issues you&amp;rsquo;re working on yourself.&lt;/p&gt;
&lt;h4 id=&#34;make-sure-your-prs-get-the-attention-they-need&#34;&gt;Make sure your PRs get the attention they need&lt;/h4&gt;
&lt;p&gt;Don&amp;rsquo;t just &amp;ldquo;fire and forget&amp;rdquo; a pull request. If it happens that any of our patches are taking too long to be seen by other people, we don&amp;rsquo;t just abandon them and think that they are somebody else&amp;rsquo;s problem now, that our work is done. In these cases we should feel free to reach out to the reviewers and bring the PRs to their attention.&lt;/p&gt;
&lt;p&gt;To this end, we should leverage all the communication tools available, even outside of the code repository or code review tool, by chat, phone, issue tracking system, etc.&lt;/p&gt;
&lt;h4 id=&#34;get-as-many-reviewers-as-you-can&#34;&gt;Get as many reviewers as you can&lt;/h4&gt;
&lt;p&gt;A single reviewer on a pull request can be enough. However, it is always beneficial to try to get as many eyes as possible onto a change. It improves ownership and it allows for more effective knowledge sharing. It also has the potential for more improvements on the code base, as more people, with varying strengths, look at the code and offer their feedback.&lt;/p&gt;
&lt;p&gt;Also try to avoid having a single person be the gatekeeper of merges. Like I said, everybody can and should participate in the activity of code reviews. Sometimes having a gatekeeper this may be desirable if, for example, CI/CD is in place in such a way that merges produce automatic production deployments. But we can always try to make sure that code that reaches the gatekeeper is already reviewed by other team members by the time it does. That way we avoid overloading them and eliminate the bottleneck or single point of failure.&lt;/p&gt;
&lt;p&gt;GitHub, GitLab, and similar tools provide settings to limit which users can commit to certain branches. If a process like that is needed, it can be done with help of such tools while still having PRs that many team members can review and discuss.&lt;/p&gt;
&lt;h4 id=&#34;dont-let-the-perfect-be-the-enemy-of-the-good&#34;&gt;Don’t let the perfect be the enemy of the good&lt;/h4&gt;
&lt;p&gt;If the PR isn&amp;rsquo;t &amp;ldquo;perfect&amp;rdquo; or not &amp;ldquo;as good as it could be&amp;rdquo;, but it does not worsen the code base, and implements the changes competently, maybe there&amp;rsquo;s no need to block it. Code reviews are important, but it also is important to try to maintain momentum of delivery and avoid making developers feel nitpicked. So consider that when reviewing. There is a balancing act between deadlines, paying off and incurring technical debt, and what is &amp;ldquo;good enough&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In the same train of thought, it is useful to clearly label code review comments. Specifying whether the reviewer considers each comment as a question, a simple nitpick, or an actually important change.&lt;/p&gt;
&lt;h4 id=&#34;top-down-imposition-of-process-is-often-inconvenient&#34;&gt;Top-down imposition of process is often inconvenient&lt;/h4&gt;
&lt;p&gt;Code reviews don&amp;rsquo;t need to include a ton of software process overhead. Regardless of your process style, it can be a very lightweight practice and done at the developers’ discretion. It can be as simple as sending a diff file to a fellow developer and asking them for feedback. The tools available today make them very accessible and easy to do.&lt;/p&gt;
&lt;p&gt;As such, they can become very effective when the team itself manages and conducts them; as opposed to having it come to them as a predetermined specific process from management. Even a practice as beneficial as code reviews can be soured by a bad, overly strict, or dogmatic implementation.&lt;/p&gt;
&lt;h3 id=&#34;thats-all-for-now&#34;&gt;That&amp;rsquo;s all for now&lt;/h3&gt;
&lt;p&gt;At the end of the day, the concept of code reviews is simple: To have somebody else look at our code, in hopes that what eventually makes it to production is as good quality as possible.&lt;/p&gt;
&lt;p&gt;In this article we&amp;rsquo;ve discussed many more aspects to clearly explain the promise of code reviews. We&amp;rsquo;ve given some details on how to conduct them, who is involved, and what benefits we can get from them. We also captured a series of recommendations that we have learned through experience.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re not into the habit yet, hopefully this article convinced you to give it a try!&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Engineering Is Not Just About the Cool Stacks</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2021/05/engineering-is-not-just-about-the-cool-stacks/"/>
      <id>https://www.endpointdev.com/blog/2021/05/engineering-is-not-just-about-the-cool-stacks/</id>
      <published>2021-05-25T00:00:00+00:00</published>
      <author>
        <name>Afif Sohaili</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2021/05/engineering-is-not-just-about-the-cool-stacks/scaffolding.jpg&#34; alt=&#34;&#34;&gt;
&lt;a href=&#34;https://unsplash.com/photos/P6bOdzRk7TY&#34;&gt;Photo&lt;/a&gt; by &lt;a href=&#34;https://unsplash.com/@gett_urban&#34;&gt;Di&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a developer, I love finding new shiny pieces of tech that can help me develop web applications better. To me, it is one of the best parts of the job: Pick up a new programming language, a new database, a new standard, etc., and build cool things with it. But recently, I had the chance to reflect on my experience working on a boring stack at one of my previous workplaces, and it was actually a lot better than I expected.&lt;/p&gt;
&lt;h3 id=&#34;my-journey&#34;&gt;My journey&lt;/h3&gt;
&lt;p&gt;I used to work at a company where the teams are free to decide the tech stacks that best fit their requirements, so a wide range of modern tools were used there to solve the problems at hand. Within just 2 years of joining the company, I switched teams four times and touched everything from Java, Scala, Akka, Terraform, AWS ECS, Serverless, API Gateway, AWS Lambda, AWS DynamoDB, React, Gatsby, Vue, Nuxt, TypeScript, Flowtype, and many other tools that really helped advance my technical skills.&lt;/p&gt;
&lt;p&gt;But in late 2018, my manager invited me to assist a “less popular” team in the company. The team handled a myriad of complex products that are quite old. The team’s tech stack was not the shiniest compared to the other teams in the company; the products are developed using Java, a language I generally do not prefer due to its verbosity. We just shipped JAR files to the platform’s marketplace, so there were no web services to maintain and hence it didn’t challenge or sharpen our operations skills. The frontend JavaScript code was largely built with jQuery as it came bundled with the platform we are building on top of.&lt;/p&gt;
&lt;p&gt;As a developer who loves shiny tools, this team should have been a dreadful one to be in. But to my surprise, as I reflect upon it, it was actually the team that gave me the highest work satisfaction. It was satisfying because there were a lot of problems to solve, and most of the time the harder problems to solve are not the tech stack: &lt;strong&gt;the apps work, and customers are paying&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Instead of talking about moving from Java to Kotlin or from jQuery to React, our team spent the time brainstorming ideas on how to increase code quality, how to ensure discipline and follow good principles when crafting software, how to improve our developers’ workflow and processes, and how to best share knowledge and contexts that we had just acquired for future team members. Each problem solved gave me that dopamine boost that made me feel good.&lt;/p&gt;
&lt;p&gt;Below are some of the things we did to solve these problems.&lt;/p&gt;
&lt;h3 id=&#34;problem-1-code-quality&#34;&gt;Problem #1: Code quality&lt;/h3&gt;
&lt;p&gt;The products the team were handling had been suffering from some quality degradations in recent years, and these ultimately led to more bugs and regressions, which then leads to an increase in customer complaints, and that leads to us working under pressure, which then leads to even more quality degradations, and the vicious cycle repeats.&lt;/p&gt;
&lt;p&gt;When this started to happen, what did we do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We slowed things down.&lt;/strong&gt; Instead of having individual engineers work on multiple tickets in parallel, we held more pair programming sessions and reduced the number of tickets in progress to help incorporate collaboration earlier and gain feedbacks on the implementation strategy sooner. At the same time, pairing sessions also helped get the newer engineers up to speed faster. We introduced more quality gates for pull requests to be able to be merged into &lt;code&gt;main&lt;/code&gt;. We agreed as a team to scrutinize them harder, e.g. if you do not have tests among the changes, just consider the pull request rejected. We also required all team members to approve the changes. We worked with product managers to slow down shipping new features and instead having more bugs fixed. Hence, the health of the codebases got better and better and the products got more and more stable each day.&lt;/p&gt;
&lt;p&gt;We also held a brown-bag meeting reinforcing SOLID design principles to everyone in the team. Knowledge sharing like this helps bring everyone onto the same page while pairing and reduce the long discussion threads on pull requests.&lt;/p&gt;
&lt;h3 id=&#34;problem-2-context-sharing&#34;&gt;Problem #2: Context-sharing&lt;/h3&gt;
&lt;p&gt;Members of a team come and go, and that is true for all teams. Complex apps like the ones we were maintaining are usually full of legacy decisions that the newer team members will not have the knowledge of if no deliberate efforts were made to ensure that those contexts get shared. So, we took steps to mitigate this by including the contexts in commit messages. We also encouraged writing our findings in the Jira tickets and in the pull request descriptions on GitHub, but we preferred Git commit messages for documenting decisions related to the commit, because Git is the system that is least likely to change. We might switch from Jira or from GitHub to some similar services, so contexts would be lost when that happens, but it is very unlikely that we would switch from Git for version control.&lt;/p&gt;
&lt;p&gt;We also started a knowledgebase to contain information that should be shared within the team, including onboarding instructions, development gotchas, legacy contexts, etc. This helps distribute the knowledge to everyone and reduce blockers on specific team members. We also made a habit of documenting a discussion that happens offline, often in our internal communication channels or in our internal knowledgebase.&lt;/p&gt;
&lt;h3 id=&#34;problem-3-developers-workflow&#34;&gt;Problem #3: Developers’ workflow&lt;/h3&gt;
&lt;p&gt;Improving our process was also a focus. One of the first things we did was rewrite our Jenkins CI/CD pipeline to adopt multibranch pipeline, allowing us to build and test feature branches before they were merged into the &lt;code&gt;main&lt;/code&gt; branch.&lt;/p&gt;
&lt;p&gt;We also automated several tasks that we identified as repetitive, from as small as notifying everyone that there is a new pull request open on GitHub, to automatically running compatibility checks for all of our products once the platform we were building on released a new beta version. We constantly looked for areas we could automate better and discussed them in our weekly retrospectives.&lt;/p&gt;
&lt;p&gt;We also tuned our workflow to better organize our capacity around all the demands that we are getting: from our customers, our roadmaps, and our improvements bucket. We adopted Classes of Service (CoS) to achieve that. CoS is an approach in which you decide different treatments to different types of work. This means the capacity we have is flexible depending on the demand of each type of work.&lt;/p&gt;
&lt;p&gt;For example, we introduced a collapsible task buffer called Intangible that holds work whose value customers do not experience directly, such as upgrading Node.js version, etc. It is collapsible in the sense that the developers in this CoS can be reassigned to other CoS should we deem more capacity is required there. Note that CoS (or any other system for that matter) is not without its pros and cons, so be sure to tweak it to fit your circumstances should you consider adopting it.&lt;/p&gt;
&lt;h3 id=&#34;not-all-problems-are-tech-but-all-tech-has-problems&#34;&gt;Not all problems are tech, but all tech has problems.&lt;/h3&gt;
&lt;p&gt;Sometimes, we identify ourselves through our favorite tech stack.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hey, I’m a JavaScript developer.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hey, I’m a Ruby developer.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And that is not wrong per se, but this particular experience of mine serves as a reminder that the essence of software engineering goes deeper than just the tech — it is to solve problems through software. And that is what we do at End Point.&lt;/p&gt;
&lt;h3 id=&#34;reference&#34;&gt;Reference&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://devopedia.org/solid-design-principles&#34;&gt;SOLID Design Principles&lt;/a&gt; at Devopedia&lt;/li&gt;
&lt;li&gt;Classes of Service:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://medium.com/servicerocket-eng/on-classes-of-service-cos-a-more-pragmatic-approach-towards-squad-formation-ec93e3a80dfb&#34;&gt;On Classes of Service (CoS), a more pragmatic approach towards “squad formation”&lt;/a&gt; by Yuen-Chi Lian at ServiceRocket&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.thoughtworks.com/insights/blog/predictability-and-classes-service&#34;&gt;Predictability and Classes of Service&lt;/a&gt; by Leonardo Campos at ThoughtWorks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </content>
    </entry>
  
    <entry>
      <title>End Point Security Tips: Securing your Infrastructure</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2020/02/end-point-security-tips/"/>
      <id>https://www.endpointdev.com/blog/2020/02/end-point-security-tips/</id>
      <published>2020-02-05T00:00:00+00:00</published>
      <author>
        <name>Charles Chang</name>
      </author>
      <content type="html">
        &lt;img src=&#34;/blog/2020/02/end-point-security-tips/image-4.jpg&#34; alt=&#34;phishing key on keyboard&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://flic.kr/p/24YXTiY&#34;&gt;Photo&lt;/a&gt; from &lt;a href=&#34;https://www.comparitech.com/blog/information-security/common-phishing-scams-how-to-avoid/&#34;&gt;comparitech.com&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;implement-security-measures-to-protect-your-organization--employees&#34;&gt;Implement Security Measures to Protect Your Organization &amp;amp; Employees&lt;/h3&gt;
&lt;p&gt;In this post, I’ll address what I believe are the three important initiatives every organization should implement to protect your organization and employees:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Train employees on security culture.&lt;/li&gt;
&lt;li&gt;Implement the best technical tools to aid with organizational security.&lt;/li&gt;
&lt;li&gt;Implement recovery tools in case you need to recover from a security breach.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;habits-of-a-security-culture&#34;&gt;Habits of a Security Culture&lt;/h3&gt;
&lt;p&gt;Train everyone in your organization on these fundamentals:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The only time you should be requested to reset your password by email is when you initiate it. There are rare exceptions to this rule, such as when accounts are compromised and providers request all users reset their passwords, but those events should be publicly announced. Staff can confirm with security personnel before acting on such requests.&lt;/li&gt;
&lt;li&gt;If you are asked to reset your password, it will typically be after you successfully logged into a website and the old one has expired.&lt;/li&gt;
&lt;li&gt;If you receive an email and do not know the sender, do not trust the contents or open attachments. Get advice from security personnel if needed.&lt;/li&gt;
&lt;li&gt;If you think the email is from your bank, keep in mind that banks do not ask their clients for private information via email.&lt;/li&gt;
&lt;li&gt;If you think the social security office emailed you to obtain your personal information, keep in mind that they do not initiate or solicit private information via email.&lt;/li&gt;
&lt;li&gt;Companies should not solicit private information unless you initiate first.&lt;/li&gt;
&lt;li&gt;Online retailers should not ask for your private information unless you initiate first.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;a-security-concern-going-phishing&#34;&gt;A Security Concern: Going Phishing!&lt;/h3&gt;
&lt;div style=&#34;float: right; padding: 20px;&#34;&gt;&lt;img src=&#34;/blog/2020/02/end-point-security-tips/image-1.jpg&#34; alt=&#34;phishing fraud&#34; align=&#34;right&#34; hspace=&#34;10&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://flic.kr/p/2gLaNqk&#34;&gt;Photo&lt;/a&gt; by &lt;a href=&#34;https://www.epictop10.com/&#34;&gt;Epic Top 10 Site&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;One of the more common ways to steal someone’s private information is through phishing. Phishing is like fishing: you try to catch something. In this case, the ‘fish’ is your data. Someone with malicious intent sends you email to attempt to get you to click on the link, picture, content, etc. within the email. Once you click the link or content within the email, it might take you to a website to enter or reset your password, even ask for your social security number or other personal information. The person with malicious intent would use the information collect to open accounts, purchase items online or resell your personal data. The links within the phishing email might even redirect you to a fake website that mimics a real website to collect your personal data. The goal is to confuse the email recipient into believing that the email message is legit in its attempt to collect personal information from the user.&lt;/p&gt;
&lt;h4 id=&#34;phishing-exercises&#34;&gt;Phishing Exercises&lt;/h4&gt;
&lt;div style=&#34;float: left; padding: 20px;&#34;&gt;&lt;img src=&#34;/blog/2020/02/end-point-security-tips/image-2.jpg&#34; alt=&#34;phishing attack&#34; hspace=&#34;10&#34;&gt;&lt;p&gt;&lt;a href=&#34;https://flic.kr/p/x9zZ4A&#34;&gt;Photo&lt;/a&gt; by &lt;a href=&#34;https://www.flickr.com/photos/christiaancolen/&#34;&gt;Christiaan Colen&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;One way to help the staff better their understanding of a phishing email is to practice phishing exercises by setting up an experiment to see which users would click on your test phishing email. If the user clicks on the experiment phishing email, the email administrator would notify the compliance officer and he or she would re-train the staff on how to properly differentiate real emails from phishing emails. Phishing exercises make a great activity for the employees to avoid the email scams and exert more caution in the future.&lt;/p&gt;
&lt;h3 id=&#34;essential-security-tools&#34;&gt;Essential Security Tools&lt;/h3&gt;
&lt;h4 id=&#34;firewall&#34;&gt;Firewall&lt;/h4&gt;
&lt;p&gt;A firewall should be a mandatory technology for all consumers or businesses. This is basically your main door. The office or organization’s technology is what the firewall is protecting. When you sit in your office working on the computer, just imagine that you are in a fort surrounded by walls. If someone needs to come in, they must be given permission by a gatekeeper to enter the fort. The firewall is very similar. The firewall allows network traffic to go in and out of the office based on the configuration set by a network engineer. The engineer determines what network traffic comes into the office and goes out.&lt;/p&gt;
&lt;p&gt;Companies typically test their firewall with penetration tests and network scans to determine if there are any security concerns after implementing the firewall. The testing of the firewall verifies that good security practices are implemented and the firewall is setup properly and securely.&lt;/p&gt;
&lt;p&gt;Some hardware firewall devices to consider include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.watchguard.com/wgrd-products/rack-mount/firebox-m270-m370&#34; target=&#34;_blank&#34;&gt;WatchGuard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cisco.com/c/en/us/products/security/firewalls/index.html&#34; target=&#34;_blank&#34;&gt;Cisco Firepower&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.ui.com/unifi-routing/unifi-security-gateway-pro-4/&#34; target=&#34;_blank&#34;&gt;UniFi Security Gateway Pro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;network-assessment--internal-threat-protection&#34;&gt;Network Assessment &amp;amp; Internal Threat Protection&lt;/h4&gt;
&lt;p&gt;Why is security vulnerability testing necessary? Many organizations have legacy servers, or desktops/​laptops with operating systems that are no longer supported. For example, outdated Microsoft Windows XP and 7 can be compromised by malware while browsing the Internet due to &lt;a href=&#34;https://www.pcworld.com/article/3400698/nsa-warns-that-bluekeep-vulnerability-in-windows-xp-and-windows-7-is-especially-dangerous.html&#34;&gt;the BlueKeep vulnerability&lt;/a&gt;. Systems that are not patched could expose your organization to be infected with malware such as ransomware which would hold your data ransom until you pay to unlock the data.&lt;/p&gt;
&lt;p&gt;Security vulnerability testing typically results in a report outlining problematic areas such as outdated operating systems, private data that does not belong on a file server, such as social security or credit card number (personally identifying information, or PII). If PII is needed for the organization to operate, then higher security standards and an encryption system to store the private data is needed. The security vulnerabilities testing could also check if your environment is HIPAA or PCI DSS compliant if those security standards apply to you.&lt;/p&gt;
&lt;p&gt;Some security vulnerability testing technology includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rapidfiretools.com/products/network-detective/&#34; target=&#34;_blank&#34;&gt;Rapid Fire Tools Network Detective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rapidfiretools.com/products/cyber-hawk/&#34; target=&#34;_blank&#34;&gt;Rapid Fire Tools Cyberhawk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;enterprise-antivirus-systems&#34;&gt;Enterprise Antivirus Systems&lt;/h4&gt;
&lt;p&gt;Antivirus software is the last line of defense if malware enters your computer. The antivirus itself would not protect you 100% from being infected by malware or virus but if you have multiple layers of security in place, then the chances are much lower that your organization’s systems would not be compromised. A company called &lt;a href=&#34;https://www.av-comparatives.org/tests/business-security-test-2019-march-june/&#34;&gt;AV-Comparatives assessed some of the popular antivirus software&lt;/a&gt; in the market.&lt;/p&gt;
&lt;p&gt;The battle with malware is endless. Case in point: The &lt;a href=&#34;https://techcrunch.com/2019/05/12/wannacry-two-years-on/&#34;&gt;WannaCry&lt;/a&gt; malware affected over 200,000 machines across the world and spread quickly. Security researchers quickly realized the malware was spreading like a computer worm, across computers and over the network, using the Windows SMB protocol.&lt;/p&gt;
&lt;p&gt;New variants of viruses and malware are developed every day, so the antivirus companies are also daily hard at work developing a way to block and remove malware.&lt;/p&gt;
&lt;p&gt;Some antivirus software includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.webroot.com/us/en/business/smb/endpoint-protection&#34; target=&#34;_blank&#34;&gt;Webroot Antivirus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.broadcom.com/products/cyber-security/endpoint/end-user&#34; target=&#34;_blank&#34;&gt;Symantec Endpoint Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;web-filtering-technology&#34;&gt;Web Filtering Technology&lt;/h4&gt;
&lt;p&gt;Web filtering technology blocks websites that are malicious or deemed not appropriate to visit from an organization’s network. For example, websites for gambling could be blocked to reduce employee distractions, but also to reduce access to sites popularly infected with malware, reducing the possibility of malware coming into your network.&lt;/p&gt;
&lt;p&gt;There are many competitors out there in this competitive market, and some vendors offer free proof-of-concept testing with their product before you make a big investment. Take a look at:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.forcepoint.com/product/url-filtering&#34; target=&#34;_blank&#34;&gt;Forcepoint Web Filtering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.webtitan.com/webtitan-gateway/&#34; target=&#34;_blank&#34;&gt;Web Titan Gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;data-loss-prevention&#34;&gt;Data Loss Prevention&lt;/h4&gt;
&lt;p&gt;Employees’ and businesses’ private information is sensitive and should be protected. Businesses, whether audited or not, should always protect their employee private information. 20 years ago paper was used to store private information and locked in a file cabinet, but in 2020 most private information is stored digitally. How do companies keep private information from leaving their office?&lt;/p&gt;
&lt;p&gt;Physically you probably can’t stop someone from walking out with private information, but digitally there is technology called digital loss prevention (DLP) that can help keep confidential information from leaving the office. For example, if someone in the office decides to copy private information onto USB storage, or tries to send a social security number or credit card information via email, this can often be prevented. Prepare your business with solutions tailored for regulations involving personal information using DLP software.&lt;/p&gt;
&lt;p&gt;Some DLP solutions to consider include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.forcepoint.com/product/dlp-data-loss-prevention&#34; target=&#34;_blank&#34;&gt;Forcepoint DLP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.broadcom.com/products/cyber-security/information-protection/data-loss-prevention&#34; target=&#34;_blank&#34;&gt;Symantec Data Loss Prevention&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;email-filtering&#34;&gt;Email Filtering&lt;/h4&gt;
&lt;p&gt;Probably one of the easiest and oldest methods to infect or phish someone is via email. There are multiple mechanisms email filtering uses to stop malicious emails: SPF and DKIM, blacklists, etc. On top of these configurable items, email filtering software vendors often release updates throughout the day to block the latest known malware or spam based on heuristics.&lt;/p&gt;
&lt;p&gt;Cloud email services such as Microsoft Office 365 are for many businesses superior to on-premise email servers due to having all the bells and whistles to proactively protect your email environment, such as spam &amp;amp; virus filtering, and email archiving for retention purposes. If you need email encryption to protect sensitive emails, this feature is also available.&lt;/p&gt;
&lt;p&gt;The distinct advantage of using hosted email service is that the cost is predictable and includes maintenance, so your email administrators do not have to worry about updating the email server software or hardware.&lt;/p&gt;
&lt;p&gt;Email filtering technology available includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.microsoft.com/en-us/security/business/threat-protection/office-365-defender&#34; target=&#34;_blank&#34;&gt;Microsoft Defender for Office 365&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.forcepoint.com/product/email-security&#34; target=&#34;_blank&#34;&gt;Forcepoint Email Filtering&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.spamtitan.com/email-filtering-service/&#34; target=&#34;_blank&#34;&gt;SpamTitan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;two-factor-authentication-2fa&#34;&gt;Two Factor Authentication (2FA)&lt;/h4&gt;
&lt;p&gt;Companies like Duo (owned by Cisco) and Google’s two-factor authentication technology are great tools to implement to improve your overall security. Beyond the usual user name and password, your smartphone or a hardware token are used to authorize the access to a website, an application, or a network. This technology is now well-established and available in most online services, and can be added to your own custom business applications.&lt;/p&gt;
&lt;p&gt;Some starting points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://duo.com/product/multi-factor-authentication-mfa&#34; target=&#34;_blank&#34;&gt;Duo Multi-Factor Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.google.com/landing/2step/&#34; target=&#34;_blank&#34;&gt;Google Authenticator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;vpn-virtual-private-network&#34;&gt;VPN (Virtual Private Network)&lt;/h4&gt;
&lt;p&gt;Virtual private network technology allows businesses to provide secure access to office systems or applications to employees who travel or work from a remote location. That is important so that data traveling to and from the source, and many details of traffic patterns, are encrypted, so that the data cannot be captured and decrypted. VPN solutions have been around for years and are an important tool to securely and safely protect data in transit.&lt;/p&gt;
&lt;h4 id=&#34;password-reset-systems&#34;&gt;Password Reset Systems&lt;/h4&gt;
&lt;p&gt;Why are self-service password reset systems necessary, and are they secure? They eliminate many manual password assignment mistakes, keep passwords private to the user alone, and allow an organization to integrate two-factor authentication to securely reset user passwords, such as Active Directory for Windows, or other single sign-on password. Onboarding is needed for each user, which is done by sending them an email with a link to register.&lt;/p&gt;
&lt;p&gt;The password reset system could be an internal system only available to your organization. Another possibility is to access the system via VPN or even through a proxy server in the DMZ to allow password reset from anywhere.&lt;/p&gt;
&lt;p&gt;Some password reset systems include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.manageengine.com/products/self-service-password/&#34; target=&#34;_blank&#34;&gt;ManageEngine ADSelfService Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://docs.microsoft.com/en-us/azure/active-directory/authentication/concept-sspr-howitworks&#34; target=&#34;_blank&#34;&gt;Azure AD Self-Service Password Reset&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;recovery-tools&#34;&gt;Recovery Tools&lt;/h3&gt;
&lt;h4 id=&#34;data-and-system-backupsdisaster-recovery&#34;&gt;Data and System Backups/​Disaster Recovery&lt;/h4&gt;
&lt;p&gt;Data backup and disaster recovery practice is a critical component for a business to speed up the process of recovery if malware attacks your systems or if a system becomes inoperable.&lt;/p&gt;
&lt;p&gt;If you are attacked by ransomware and all the critical systems and desktops are compromised and rendered useless, then the only way to recover is from backups. At that point, the disaster recovery preparation you made will be well worth what you invested into it. If you did not have an adequate backup or disaster recovery plan, your organization or company would have to start from scratch and rebuild all systems and desktops which could take weeks if not months to recover from. The lost wages, and possibly clients, due to unavailable systems and desktop to operate, probably would cost you far more than preparation does. The more options you have, the better the chances that you will get out of your bind and not prolong the situation.&lt;/p&gt;
&lt;p&gt;Some backup solutions I have worked with have the flexibility to mix and match to fit your configuration needs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.acronis.com/en-us/products/cloud/cyber-protect/backup/&#34; target=&#34;_blank&#34;&gt;Acronis Backup Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.rubrik.com/solutions/backup-recovery&#34; target=&#34;_blank&#34;&gt;Rubrik&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://azure.microsoft.com/en-us/services/backup/&#34; target=&#34;_blank&#34;&gt;Azure Backup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Acronis Cloud Backup allows you to back up to local storage, the cloud, and off-premise, recover a system using a USB drive, back up Office 365 emails, or backup VMware or Hyper-V environments. It also allows you to recover a single file if needed.&lt;/p&gt;
&lt;h3 id=&#34;additional-security-recommendations&#34;&gt;Additional Security Recommendations&lt;/h3&gt;
&lt;h4 id=&#34;ssltls-certificates&#34;&gt;SSL/TLS Certificates&lt;/h4&gt;
&lt;p&gt;What are SSL and TLS? SSL is outdated and replaced by TLS, but people often still use the familiar SSL name. They are an encryption system to keep sensitive information sent across the Internet encrypted so that only the intended recipient can access it.&lt;/p&gt;
&lt;p&gt;When an SSL certificate is validated, the transmitted data is not only unreadable by anyone except for the intended server, but you are relatively well assured you are communicating with the organization you expected and not with a malicious intermediary. Read more details in &lt;a href=&#34;https://www.sslshopper.com/why-ssl-the-purpose-of-using-ssl-certificates.html&#34;&gt;SSL Shopper’s Why SSL?&lt;/a&gt; article.&lt;/p&gt;
&lt;p&gt;SSL certificates were historically used primarily for higher-security web servers, but now are commonly used on almost all web servers. They are also used for other remote server access, B2B server-to-server communication, VPN access, email systems, etc.&lt;/p&gt;
&lt;h3 id=&#34;recent-destructive-incidents&#34;&gt;Recent Destructive Incidents&lt;/h3&gt;
&lt;p&gt;These incidents from just a few weeks in fall 2019 show that we have a long way to go in protecting our technology usage:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nbcnewyork.com/news/local/long-island-schools-hacked-district-forced-to-pay-88000-in-ransom/1491924/&#34; target=&#34;_blank&#34;&gt;Long Island Schools Hacked; District Forced to Pay $88,000 in Ransom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.nbcnewyork.com/news/local/ny-school-delays-start-of-year-after-ransomware-attack/1990459/&#34; target=&#34;_blank&#34;&gt;NY School Delays Start of Year After Ransomware Attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.newsweek.com/tortoiseshell-hacker-hire-military-heroes-fake-website-1461320&#34; target=&#34;_blank&#34;&gt;Veterans Targeted by Hackers Through Fake Military Heroes Hiring Website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.zdnet.com/article/hackers-target-transportation-and-shipping-industries-in-new-trojan-malware-campaign/&#34; target=&#34;_blank&#34;&gt;Hackers Target Transportation and Shipping Companies in New Trojan Malware Campaign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://inc42.com/buzz/hacking-routers-webcams-printers-are-the-most-searched-keywords-on-the-dark-web/&#34; target=&#34;_blank&#34;&gt;Hacking of IoT – Internet of Things (webcams, security cams, printers, home routers)&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;speak-with-us&#34;&gt;Speak With Us!&lt;/h3&gt;
&lt;p&gt;Keeping up with security can be a full-time job. If you need professional consulting on security tools and implementing them, &lt;a href=&#34;/contact/&#34;&gt;contact&lt;/a&gt; our team today.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Reviewing the Code</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2019/11/reviewing-the-code/"/>
      <id>https://www.endpointdev.com/blog/2019/11/reviewing-the-code/</id>
      <published>2019-11-26T00:00:00+00:00</published>
      <author>
        <name>Kürşat Kutlu Aydemir</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2019/11/reviewing-the-code/review_magnifier.png&#34; alt=&#34;Magnifying glass&#34;&gt;&lt;/p&gt;
&lt;!-- Photo from https://pixabay.com/illustrations/magnifying-glass-search-to-find-1019982/ --&gt;
&lt;p&gt;Code review is analysis of source code of a software project by reading the code itself or sometimes using automated tools to analyze it, and it is part of the Software Quality Assurance (SQA) activities which define the quality assurance of the whole software development lifecycle.&lt;/p&gt;
&lt;p&gt;As we go through the flow of a code-review, we’ll understand what to assure by doing code review. Code review lifecycle covers the guidelines and the code review process itself.&lt;/p&gt;
&lt;h3 id=&#34;code-review-guidelines&#34;&gt;Code review guidelines&lt;/h3&gt;
&lt;h4 id=&#34;preparing-for-code-review&#34;&gt;Preparing for code review&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pick the right reviewers. The reviewer should be an experienced software architect. Sometimes, less experienced groups can join the review team. Communication is also important, since frequent round table code review meetings with the developers are not usually productive.&lt;/li&gt;
&lt;li&gt;Let authors annotate the code before review indicating which files have precedence for review. Annotation by the developers to orient the reviewer so they know where changes have taken place and where to review is a good practice.&lt;/li&gt;
&lt;li&gt;Request code review. Requesting code review just before testing is another good practice.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;tips-for-reviewer-during-the-code-review&#34;&gt;Tips for reviewer during the code review&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Review small pieces of code at a time, for instance around 400 lines of code.&lt;/li&gt;
&lt;li&gt;Review for around 60 minutes at a time.&lt;/li&gt;
&lt;li&gt;Set goals and metrics.&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&#34;https://en.wikipedia.org/wiki/SMART_criteria&#34;&gt;SMART criteria&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Specific: target one area clearly and precisely.&lt;/li&gt;
&lt;li&gt;Measurable: quantify progress toward success by using metrics.&lt;/li&gt;
&lt;li&gt;Actionable: ready to start and possible to accomplish.&lt;/li&gt;
&lt;li&gt;Relevant: connected to what’s being done, considered, and/or resourced.&lt;/li&gt;
&lt;li&gt;Timely: occurring at a favorable or useful time and opportune.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Measure inspection rate and defect rate.&lt;/li&gt;
&lt;li&gt;Use checklists.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;code-review-flow&#34;&gt;Code review flow&lt;/h3&gt;
&lt;p&gt;Regardless of what programming language is used to develop, code review should cover the following common areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maintainability&lt;/li&gt;
&lt;li&gt;Reusability&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Bug analysis&lt;/li&gt;
&lt;li&gt;Knowledge sharing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other practices can also be reviewed, like extensibility or OOP (Object Oriented Programming) software design patterns. These depend on possible future plans and the nature of the software being developed.&lt;/p&gt;
&lt;h3 id=&#34;an-example-checklist-for-java-projects&#34;&gt;An Example Checklist for Java projects&lt;/h3&gt;
&lt;p&gt;I’d like to share a checklist below that I used for a project recently. I didn’t add my comments on the checklist items. The comments should be added to each item and if there are important details in the code, they should be added in the detailed report indicating the code blocks with the comments.&lt;/p&gt;
&lt;h4 id=&#34;clean-code--general&#34;&gt;Clean Code &amp;amp; General&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Use solution-problem domain names&lt;/li&gt;
&lt;li&gt;Classes should be small&lt;/li&gt;
&lt;li&gt;Functions should be small&lt;/li&gt;
&lt;li&gt;Do one thing&lt;/li&gt;
&lt;li&gt;Don’t repeat yourself (avoid duplication)—reusability&lt;/li&gt;
&lt;li&gt;Explain yourself in your code&lt;/li&gt;
&lt;li&gt;Use exceptions rather than return codes, nulls&lt;/li&gt;
&lt;li&gt;Configurable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;security&#34;&gt;Security&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Minimize the accessibility of classes and members&lt;/li&gt;
&lt;li&gt;Avoid excessive logs for unusual behavior&lt;/li&gt;
&lt;li&gt;Release resources (streams, connections, etc.) in all cases&lt;/li&gt;
&lt;li&gt;Validate inputs&lt;/li&gt;
&lt;li&gt;Validate outputs&lt;/li&gt;
&lt;li&gt;Make public static fields final&lt;/li&gt;
&lt;li&gt;Authorize and authenticate&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;performance&#34;&gt;Performance&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Avoid excessive synchronization&lt;/li&gt;
&lt;li&gt;Keep synchronized sections small&lt;/li&gt;
&lt;li&gt;String concatenation&lt;/li&gt;
&lt;li&gt;Avoid creating unnecessary objects&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;extensibility&#34;&gt;Extensibility&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Make it easy to add enhancements with minimum changes&lt;/li&gt;
&lt;li&gt;Components should easily be replaceable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;scalability&#34;&gt;Scalability&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Consider large user base and data&lt;/li&gt;
&lt;li&gt;Can be deployed in distributed systems&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;a-few-possible-checklist-item-comments&#34;&gt;A few possible checklist item comments:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;For naming checklist items, the below code piece complies with the conventions as it uses the solution domains as packaging name.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;package&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;com.google.search.common&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;On the other hand, the following line would violate the Java package naming conventions since its letter capitalizations and domain usage are inconsistent.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;package&lt;/span&gt;&lt;span style=&#34;color:#bbb&#34;&gt; &lt;/span&gt;&lt;span style=&#34;color:#b06;font-weight:bold&#34;&gt;COM.google_search.common&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sometimes a very long line of code could be used which usually violates the readability standards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Or sometimes a variable used in a class scope in a concurrently run singleton Java object violates thread safety and could be a security issue.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;static-code-analysis&#34;&gt;Static Code Analysis&lt;/h3&gt;
&lt;p&gt;Reviewing is viewing the software by reviewer and the reviewers’ own comments and best practice notes will be used as the final output.&lt;/p&gt;
&lt;p&gt;There are also static code analysis tools like PMD for Java which generally checks the code for bugs and clean code. This static code analysis, usually attached to the final code review report of the reviewer, is most helpful for an overview of the code.&lt;/p&gt;
&lt;p&gt;Sometimes software development IDEs also provide best practices while writing the code. I like the PyCharm IDE’s smart clean code suggestions for Python, for example.&lt;/p&gt;
&lt;h3 id=&#34;automated-code-review&#34;&gt;Automated Code Review&lt;/h3&gt;
&lt;p&gt;Automated testing is subject to measurable reports and static code analysis. Static code analysis tools can be scheduled for code checking and reporting.&lt;/p&gt;
&lt;p&gt;Testing the code as a preparation for code review is another process that can be automated and already part of the SDLC processes. Some overlooked issues, like releasing resources and concurrency issues, can be also checked by automated tests and can be reported as automated code review results.&lt;/p&gt;
&lt;h3 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;I have outlined the general code review cycle of a project.&lt;/p&gt;
&lt;p&gt;Depending on the programming language and the architecture of the software to be developed there can be additional best practices like functional, non-functional, OOP design principles, etc.&lt;/p&gt;
&lt;p&gt;Reviewers may extend or lessen their checklist items according to future plans, architecture or review request coverage.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Work philosophy canon</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2018/05/work-philosophy-canon/"/>
      <id>https://www.endpointdev.com/blog/2018/05/work-philosophy-canon/</id>
      <published>2018-05-07T00:00:00+00:00</published>
      <author>
        <name>Jon Jensen</name>
      </author>
      <content type="html">
        &lt;img src=&#34;/blog/2018/05/work-philosophy-canon/pexels-photo-306534-sm.jpeg&#34; width=&#34;770&#34; height=&#34;348&#34; alt=&#34;people sitting on couch reading on tablet and laptop&#34;&gt;
&lt;h3 id=&#34;shared-culture&#34;&gt;Shared culture&lt;/h3&gt;
&lt;p&gt;Having some shared culture is important for working together well, and we can build that culture on familiar terminology, understanding, experiences, stories, and ideas.&lt;/p&gt;
&lt;p&gt;To help give all of us at End Point some common reference points, we have collected a set of valuable articles and books that we encourage everyone to read.&lt;/p&gt;
&lt;p&gt;Some of these have been standard reading at End Point for more than a decade, while others have been added over the years since we began doing this. Some are short and simple, others more in-depth. Our list is intentionally general, mostly avoiding specific technologies that only a subset of us use.&lt;/p&gt;
&lt;p&gt;No one article or book can be entirely authoritative for all situations, but each gives us more of the wisdom out there to consider and judiciously apply where it fits.&lt;/p&gt;
&lt;h3 id=&#34;slow-and-steady&#34;&gt;Slow and steady&lt;/h3&gt;
&lt;p&gt;When new employees start at End Point, we ask them to read the articles during their first week or two, and the relevant books within roughly their first year.&lt;/p&gt;
&lt;p&gt;Reading only a little at each sitting and spreading the reading out over time allows the ideas to sink in gradually and be incorporated into our work, rather than overwhelming with new information that cannot all be absorbed at once.&lt;/p&gt;
&lt;h3 id=&#34;for-everyone&#34;&gt;For everyone&lt;/h3&gt;
&lt;p&gt;Because we work in the software development industry, it is important that not only technical people such as developers, database experts, and system administrators be part of the shared culture. Everyone else at End Point including designers, project managers, sales, marketing, etc. should also be familiar with these articles and the terms and concepts they discuss:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://jsomers.net/blog/speed-matters&#34;&gt;Speed matters: Why working quickly is more important than it seems&lt;/a&gt; by James Somers&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://nohello.net/en/&#34;&gt;Please don’t just say hello in chat&lt;/a&gt; originally by Brandon High at nohello.com&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://blog.codinghorror.com/learn-to-read-the-source-luke/&#34;&gt;Learn to Read the Source, Luke&lt;/a&gt; by Jeff Atwood—​practical reasons free software and open source matter, and why actually using the source code matters&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.gnu.org/philosophy/free-sw.html&#34;&gt;What is free software?&lt;/a&gt; by the Free Software Foundation and Richard Stallman&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://opensource.org/osd&#34;&gt;The Open Source Definition&lt;/a&gt; by the Open Source Initiative&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20201030161227/https://www.toolbox.com/tech/data-management/blogs/joshs-rules-of-database-contracting-062707/&#34;&gt;Josh’s Rules (of Database Contracting)&lt;/a&gt; by Josh Berkus&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2008/08/on-excellence/&#34;&gt;On excellence&lt;/a&gt; by Ethan Rowe—​about ownership, taking responsibility for the problem at hand&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/blog/2010/10/conventions/&#34;&gt;Conventions to know&lt;/a&gt; by Jon Jensen—​little but important things that ease communication in our work&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20180112070447/https://thecleverconsultant.com/how-to-sell-consulting-services-without-being-salesy/&#34;&gt;Selling Without Being Salesy&lt;/a&gt; by Jason Parks&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.startuplessonslearned.com/2008/11/five-whys.html&#34;&gt;Five Whys&lt;/a&gt; by Eric Ries (covered in more depth in his book &lt;a href=&#34;http://theleanstartup.com/book&#34;&gt;The Lean Startup&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://alanstevens.us/post/130828292006/softwareisamess&#34;&gt;Software Is a Mess and I Feel Fine&lt;/a&gt; by Alan Stevens&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://boringtechnology.club/&#34;&gt;Choose Boring Technology&lt;/a&gt; by Dan McKinley&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://basecamp.com/books/getting-real&#34;&gt;Getting Real&lt;/a&gt; book by 37signals (now Basecamp)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;for-developers&#34;&gt;For developers&lt;/h3&gt;
&lt;p&gt;These articles and books are targeted primarily at developers but enlightening for everyone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.cl.cam.ac.uk/~mgk25/iso-time.html&#34;&gt;A summary of the international standard date and time notation&lt;/a&gt; by Markus Kuhn&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://adminzen.org/&#34;&gt;The Admin Zen&lt;/a&gt; by Michael Prokop—​in true DevOps fashion, this system administration advice applies to development too&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/&#34;&gt;Things You Should Never Do, Part I&lt;/a&gt; by Joel Spolsky—​don’t rewrite things from scratch (almost never, anyway)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/michaeljones/on-commit-messages&#34;&gt;On Git Commit Messages&lt;/a&gt; by Michael Jones; to get a feel for the long history of others sermonizing on the same worthwhile topic, see also:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://chris.beams.io/posts/git-commit/&#34;&gt;How to Write a Git Commit Message&lt;/a&gt; by Chris Beams&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://who-t.blogspot.com/2009/12/on-commit-messages.html&#34;&gt;On commit messages&lt;/a&gt; by Peter Hutterer&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html&#34;&gt;A Note About Git Commit Messages&lt;/a&gt; by Tim Pope&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://mislav.net/2014/02/hidden-documentation/&#34;&gt;Every line of code is always documented&lt;/a&gt; by Mislav Marohnić; see also &lt;a href=&#34;http://www.philandstuff.com/2014/02/09/git-pickaxe.html&#34;&gt;The git pickaxe&lt;/a&gt; by Philip Potter&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://designbygravity.wordpress.com/2009/10/23/how-to-read-other-peoples-code-and-why/&#34;&gt;How to Read Other People’s Code—​and Why&lt;/a&gt; by Christopher Schanck&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://web.archive.org/web/20190626055515/http://www.w2lessons.com/2011/04/you-dont-know-javascript.html&#34;&gt;You don’t know JavaScript&lt;/a&gt; by Michael Woloszynowicz—​the lessons apply to most technologies&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pragprog.com/titles/tpp20/&#34;&gt;The Pragmatic Programmer&lt;/a&gt; book by Andy Hunt and Dave Thomas (see the &lt;a href=&#34;/blog/2020/10/the-pragmatic-programmer-20th-anniversary-edition/&#34;&gt;write-up on the new 20th anniversary edition by Jon Jensen&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://pragprog.com/titles/pad/practices-of-an-agile-developer/&#34;&gt;Practices of an Agile Developer&lt;/a&gt; book by Venkat Subramaniam and Andy Hunt—​kind of a sequel to The Pragmatic Programmer (see the &lt;a href=&#34;/blog/2006/06/review-practices-of-agile-developer/&#34;&gt;review by Ethan Rowe&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;any-others&#34;&gt;Any others?&lt;/h3&gt;
&lt;p&gt;We are always on the lookout for other readings that are helpful, so feel free to leave a comment with your favorites!&lt;/p&gt;
&lt;p&gt;(Updated in early 2021 with articles on Git commit messages and history spelunking, and Choose Boring Technology.)&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>On excellence</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2008/08/on-excellence/"/>
      <id>https://www.endpointdev.com/blog/2008/08/on-excellence/</id>
      <published>2008-08-21T00:00:00+00:00</published>
      <author>
        <name>Ethan Rowe</name>
      </author>
      <content type="html">
        &lt;p&gt;The interwebular collective cup runneth over with blog articles addressing the subject of what makes good software engineers good. It is a topic about which many opinions are expressed. What is less commonly addressed, however, is the possibility that the very qualities that make for good software engineers may also make for good technical leaders, good managers, and just good coworkers, period.&lt;/p&gt;
&lt;p&gt;At End Point, we toss the term “ownership” around quite a lot, in a variety of contexts. When a particular task or responsibility goes from one person to another, we mention “ownership” when we need to communicate the significance and scope of the responsibility in question. The term may apply to a software engineering task, in which “owning” the problem means taking responsibility for all aspects of the engineering work, across the software stack, from prototyping to full development to deployment. It may also apply to a managerial or leadership role, for which “ownership” implies responsibility for all parties involved on a given project, task, or team, with the “soft” issues of human beings mattering at least as much—​and probably more—​as the “hard” issues of machines, software, etc.&lt;/p&gt;
&lt;p&gt;Ultimately, ownership comes down to this: taking complete personal responsibility for all aspects of the problem at hand.&lt;/p&gt;
&lt;p&gt;The owner does not wait helplessly for guidance from others; rather, the owner pushes things to a conclusion, and if guidance is truly necessary the owner pushes for it repeatedly until guidance is received. The owner does not put hard or potentially unpleasant things off, but instead embraces them and addresses them immediately. The owner does not limit him- or herself to a narrow comfort zone: he is not afraid to go to different parts of the software stack, she does not hesitate to call the business person to have difficult discussions about scope creep or design flaws or difficult tradeoff decisions. The owner never allows for the actions of others to serve as an excuse, and never regards any aspect of the task to be only somebody else’s problem. The owner treats the deliverable as a reflection of him- or herself. The owner looks objectively at the deliverable and does not shy away from criticism, instead embracing it for the learning opportunities that can come from reflection and analysis.&lt;/p&gt;
&lt;p&gt;In other words, to act with ownership is to act as if all aspects of the project or duty are important and are the owner’s responsibility. That does not mean acting with ownership requires personally doing everything; owners can and should delegate as appropriate. But delegation does not mean that the responsibility is now somebody else’s problem: the owner engages in regular communication with the involved parties, and keeps the task or project in question on track. The owner understands that it still ultimately belongs to him or her. Furthermore, the owner recognizes ownership in others, appreciates it for what it is, expresses gratitude and respect for it, and does not feel threatened by it.&lt;/p&gt;
&lt;p&gt;In our work, this kind of ownership is the root of excellence. The domain of ownership may vary wildly between individuals, but the degree of ownership exhibited directly correlates to the excellence the individual demonstrates within that domain. Ownership applies to everything, whether it means writing the most reliable, maintainable code possible, designing the most scalable systems, or ensuring that everybody on your team is productive and happy. If you are an owner, you understand this: there are no excuses, and it’s up to you. Furthermore, to make it happen, the owner also understands: at some point, the talking ends and the doing begins.&lt;/p&gt;
&lt;p&gt;Ownership for a given problem may be granted to a particular individual. With a team of people, formal identification of a problem’s owner is necessary for operational clarity. However, such ownership is ultimately little more than a formality: true ownership can only be taken, and never granted. This model is at the heart of any meritocracy, and is true to the general principles of free software development.&lt;/p&gt;
&lt;p&gt;Critically, ownership is part of an oral tradition, a cultural phenomenon. Ownership breeds excellence across teams. It spreads as people naturally admire it and emulate it when they encounter such excellence first-hand. It is never complete; no one individual with a full schedule will successfully display ownership across the board on all issues. We fall down sometimes. We overextend ourselves. We have to pick our battles. But part of ownership is recognizing mistakes so that we can do better.&lt;/p&gt;
&lt;p&gt;It is my distinct pleasure to have witnessed such ownership, on numerous occasions. I’ve seen a coworker leap into system-wide problems—​on systems this coworker ordinarily has little or nothing to do with—​and not rest until every aspect of the system is in order and all members of the team involved with the support of that system understand exactly what it is that needed to be done. I’ve seen another tackle fiendishly difficult technical problems involving complex data modeling or hairy lock management in Postgres, pushing through all the roadblocks until success was achieved, no matter how challenging the problem and no matter how much investigation and mental gymnastics were required. Yet I’ve seen the same people show the same dedication and caring for work done on much smaller systems, on less interesting problems, in less dramatic scenarios. This is a small sampling from countless examples.&lt;/p&gt;
&lt;p&gt;In my experience, the only proper response to such excellence is admiration, and it inspires a desire to emulate these fantastic coworkers to be similarly excellent and to earn their respect.&lt;/p&gt;
&lt;p&gt;Again: it’s a cultural phenomenon. People do not learn this by reading books. Reading about it, and talking about it, are essential for understanding. Ultimately, though, doing is all that matters.&lt;/p&gt;
&lt;p&gt;In the liner notes to his &lt;a href=&#34;https://www.amazon.com/Keith-Jarrett-Blue-Note-Recordings/dp/B000024JEX&#34;&gt;Live at the Blue Note box set&lt;/a&gt;, the great pianist Keith Jarrett thanks his illustrious colleagues (Jack DeJohnette and Gary Peacock) for reminding him that “the only standards worth having are the highest ones.” What more need be said?&lt;/p&gt;

      </content>
    </entry>
  
</feed>
