<?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>DEV Community: Mark Hopson</title>
    <description>The latest articles on DEV Community by Mark Hopson (@markhopson).</description>
    <link>https://dev.to/markhopson</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%2F115268%2F2a880a3e-8318-4aaf-840e-cb94da472573.png</url>
      <title>DEV Community: Mark Hopson</title>
      <link>https://dev.to/markhopson</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/markhopson"/>
    <language>en</language>
    <item>
      <title>Should I run JVM applications inside a container?</title>
      <dc:creator>Mark Hopson</dc:creator>
      <pubDate>Mon, 01 Jun 2020 01:42:39 +0000</pubDate>
      <link>https://dev.to/markhopson/should-i-run-jvm-applications-inside-a-container-3ang</link>
      <guid>https://dev.to/markhopson/should-i-run-jvm-applications-inside-a-container-3ang</guid>
      <description>&lt;p&gt;So I made this presentation for a "tech talk" at work, but it was really to help myself better understand JVM applications - how they run and if we should use containers.  &lt;/p&gt;

&lt;p&gt;I'm pretty new to Java, so a part of this is on how the JVM works - and comparing Scala to other languages.&lt;/p&gt;

&lt;p&gt;I posted the &lt;a href="https://youtu.be/N688mgd6ipY" rel="noopener noreferrer"&gt;full video here (25 mins)&lt;/a&gt; but the slides are below with some notes.&lt;/p&gt;

&lt;p&gt;Hopefully someone finds this useful.  If you see any errors, or glaring omissions, please let me know.&lt;/p&gt;




&lt;h5&gt;
  
  
  1. JVM languages (like Java and Scala) are similar to other scripting languages (like Python and Javascript) in how it is run.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2i52zha0529xjkptm6ok.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2i52zha0529xjkptm6ok.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  2. Hypervisors (like Virtual Box) allow another operation system to run on top of your computer.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpkjl76qy693xv0didrud.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fpkjl76qy693xv0didrud.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  3. The type of hypervisors that cloud providers (like AWS) use are installed directly on their hardware, but are similar to Virtual Box.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fah8dsyz0d8rx6z6hcquw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fah8dsyz0d8rx6z6hcquw.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  4. Containers are a native Linux feature that uses "namespaces" and "cgroups" to manage isolated processes.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fopyftf34umv3r6buywoz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fopyftf34umv3r6buywoz.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  5. VMs tend to be a lot larger than containers because they include the operating system.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8an6ufxdiy0mh33xkizm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8an6ufxdiy0mh33xkizm.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  6. Containers can potentially better compute efficiency because they are able to share the same kernels.
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F80zex668ya7a6ysjpn79.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F80zex668ya7a6ysjpn79.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  7. The JVM did not "support" containers until 4 years after Docker was released.  Java is still seen as
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmde0h8vowgjqiyoy766v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmde0h8vowgjqiyoy766v.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  8. The JVM requires a different standard C library than the one packaged by Alpine (the most popular Linux distribution with containers).
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Foiz7f6y81hevddhwk0i2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Foiz7f6y81hevddhwk0i2.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h5&gt;
  
  
  9. In conclusion ...
&lt;/h5&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4z85vukw1kpemrqthtp9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4z85vukw1kpemrqthtp9.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>scala</category>
      <category>java</category>
      <category>docker</category>
      <category>aws</category>
    </item>
    <item>
      <title>3 Lessons Learned From Making An "Internal Heroku" For My Company.</title>
      <dc:creator>Mark Hopson</dc:creator>
      <pubDate>Tue, 03 Sep 2019 12:53:47 +0000</pubDate>
      <link>https://dev.to/markhopson/3-lessons-learned-from-making-an-internal-heroku-for-my-company-49hd</link>
      <guid>https://dev.to/markhopson/3-lessons-learned-from-making-an-internal-heroku-for-my-company-49hd</guid>
      <description>&lt;p&gt;2 years ago, my company reached 500+ employees.&lt;/p&gt;

&lt;p&gt;That's when we noticed the process for creating and managing systems was slowing down our productivity.&lt;/p&gt;

&lt;p&gt;In particular, our SRE team was overwhelmed with developer requests since everything (from provisioning resources to granting access) required their assistance and sign-off.&lt;/p&gt;

&lt;p&gt;We wanted to restore our development velocity by empowering teams so they didn't have to rely on the SRE team constantly.&lt;/p&gt;

&lt;p&gt;That's when we decided to build a self-serve infrastructure portal to help teams be more autonomous.&lt;/p&gt;

&lt;p&gt;This portal would empower teams to create and manage their own repo's, CI/CD pipelines, compute services, and other resources.  Something like an internal Heroku.&lt;/p&gt;

&lt;p&gt;We released this portal company-wide 18 months ago.  Since then, we've launched more than 300 services.&lt;/p&gt;

&lt;p&gt;Here's are 3 lessons I learned.&lt;/p&gt;

&lt;h1&gt;
  
  
  Journal Every Single Task
&lt;/h1&gt;

&lt;p&gt;Every SRE task must have a ticket.  This needs to begin before anything is automated.&lt;/p&gt;

&lt;p&gt;In the beginning, our goal was to automate common manual tasks performed by the SRE team, and make these tasks self-serve.&lt;/p&gt;

&lt;p&gt;For example, an SRE would be required for tasks like deploying a system, or creating a Github repo - these are examples of what we wanted to automate.&lt;/p&gt;

&lt;p&gt;But finding these common tasks (beyond the painfully obvious ones) proved difficult because of the invisible nature of software.  I rambled about this in &lt;a href="https://medium.com/hackernoon/how-toyota-guides-the-evolution-of-our-infrastructure-and-makes-me-appreciate-jira-bcb766822a3e"&gt;another post&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;How can you figure out what to automate if you don't know what tasks the SRE team performs, and how often they perform them?&lt;/p&gt;

&lt;p&gt;And no, you cannot rely on anecdotal evidence or memory.  There needs to be something tangible that can be used to make objective, data-driven decisions.  &lt;/p&gt;

&lt;p&gt;That's why it's important to have a process for handling incoming SRE requests.  Every task, no matter how small, must be recorded (we used Jira tickets) so they can be counted and reviewed later on.&lt;/p&gt;

&lt;p&gt;That means developers can no longer ask their favourite SRE for a small favour without a written request or "ticket".  Same applies to product managers with an urgent business request.&lt;/p&gt;

&lt;p&gt;These SRE tickets are crucial because they reveal what an effective infrastructure portal looks like for your organization.&lt;/p&gt;

&lt;h1&gt;
  
  
  Have A Vision Of Your Ideal Architecture
&lt;/h1&gt;

&lt;p&gt;It's not enough to just to automate the most common manual tasks that currently exists.&lt;/p&gt;

&lt;p&gt;You should have an opinion on what is the most effective architecture for your business.&lt;/p&gt;

&lt;p&gt;Individual teams (usually) don't pay attention to the design choices of the rest of the company. &lt;/p&gt;

&lt;p&gt;However, in order for a software company to scale efficiently, technological complexity and breadth must be controlled.  This helps provide 2 main benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the opportunity to develop, and leverage existing, expertise and tooling within the company&lt;/li&gt;
&lt;li&gt;a common development environment that improves developer resourcing flexibility among teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There should be an opinion of what an ideal architecture looks like for your company and business - not just for a subset of development teams.&lt;/p&gt;

&lt;p&gt;For us, we decided that event-driven microservices (EDM) would be best, and that has influenced the tooling we have pursued.&lt;/p&gt;

&lt;p&gt;For example, once when we noticed many teams needed a state-store for their services, we automated the provisioning of Kafka topics before considering databases.&lt;/p&gt;

&lt;p&gt;This doesn't mean that EDM is the best design choice for your company (that's up to your business).  But what ever that choice is, it should guide your vision for what processes you make self-serve.  This will strongly influence how your teams build and construct new systems  &lt;/p&gt;

&lt;p&gt;So don't just automate how systems are currently being built, but balance satisfying existing needs with a vision of what the ideal should be.&lt;/p&gt;

&lt;h1&gt;
  
  
  Self-Serve &lt;em&gt;And&lt;/em&gt; Self-Organizing
&lt;/h1&gt;

&lt;p&gt;Once teams have the ability to freely build and create, they will.  &lt;/p&gt;

&lt;p&gt;It's likely that if your self-serve portal is successful, more people will begin using it to provision resources (and more frequently too). &lt;/p&gt;

&lt;p&gt;This means resources (such as repo's, CI/CD pipelines, services, etc) will be created more frequently.  And the more "things to keep track of", the more important it'll be to have a strategy to organize everything.&lt;/p&gt;

&lt;p&gt;For your company to operate smoothly, &lt;em&gt;everyone&lt;/em&gt; should be able to answer (or find the answer) to these questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What resources (or services) are available?&lt;/li&gt;
&lt;li&gt;What resources (or services) does this service depend on? &lt;/li&gt;
&lt;li&gt;Which service does this resource belongs to?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having a naming or tagging strategy is vital for the long term hygiene of your infrastructure.&lt;/p&gt;

&lt;p&gt;In our experience, we found that having a "registry" to track resources was useful, but this might not be necessary for everyone.&lt;/p&gt;

&lt;p&gt;But all this is a means to an end.  The most important question having a organization strategy serves to answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who is responsible for this resource (or service)?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer to this should always be a single person (even for a shared resource) - usually a Team Lead.&lt;/p&gt;

&lt;p&gt;Accountability is vital in a self-serve environment.  It doesn't mean that someone will be "punished" if something goes wrong (a common misinterpretation), but it does mean we need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who governs changes to this resource?&lt;/li&gt;
&lt;li&gt;Who should be notified if this resource is unresponsive?&lt;/li&gt;
&lt;li&gt;Who is monitoring this resource's cost?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Being able to answer these questions help enable a self-serve type of infrastructure to remain as effective on &lt;a href="https://dzone.com/articles/defining-day-2-operations"&gt;day-2&lt;/a&gt; as day-1, and avoid turning your infrastructure into spaghetti.&lt;/p&gt;

&lt;p&gt;Our self-serve portal proliferated our resources, and it would be impossible for any single person or team to keep track of everything. So just like how we distributed many SRE duties across teams, we decided to do the same with how we organized ourselves by including auditability and ownership in all our automation.  &lt;/p&gt;

</description>
      <category>devops</category>
      <category>architecture</category>
      <category>microservices</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Architecture diagrams for Github README.md?</title>
      <dc:creator>Mark Hopson</dc:creator>
      <pubDate>Thu, 09 May 2019 13:28:38 +0000</pubDate>
      <link>https://dev.to/markhopson/help-architecture-diagrams-for-github-readme-md-1pl7</link>
      <guid>https://dev.to/markhopson/help-architecture-diagrams-for-github-readme-md-1pl7</guid>
      <description>&lt;p&gt;Does anyone have a recommendation for a tool that can make architecture diagrams (flowcharts) like the one found here?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/donnemartin/system-design-primer"&gt;https://github.com/donnemartin/system-design-primer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ideally, I would like the diagrams to be hosted somewhere, instead of attaching them to an Issue as described here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/14494747/add-images-to-readme-md-on-github"&gt;https://stackoverflow.com/questions/14494747/add-images-to-readme-md-on-github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, this might be asking a lot, but it would be nice to have these images (preferably SVG) remain editable (similar to a Visio diagram) that I can put Auth in front of (since I would like to use it for my company too).&lt;/p&gt;

&lt;p&gt;Does something like this exist?&lt;/p&gt;

</description>
      <category>help</category>
      <category>github</category>
    </item>
  </channel>
</rss>
