people http://nerdstein.net/ en SimplyTest.me From The Ground Up http://nerdstein.net/blog/simplytest-from-ground-up <span class="field field--name-title field--type-string field--label-hidden">SimplyTest.me From The Ground Up</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>When I took over as the project lead for SimplyTest.me, the previous lead shared three primary things with me:</p> <ol><li>The system had a non-trivial amount of technical debt and was rising more with time</li> <li>Significant changes were coming with Drupal 8, Composer, Drush, and more</li> <li>His interest was elsewhere</li> </ol><p>As part of my proposal, I promised to do what I could to revitalize this. While this effort has taken years, we have hit another major milestone in our journey: </p> <p><strong>We launched a completely new version of SimplyTest.me.</strong> We rebuilt the system from the ground up in an effort to revitalize the project. It’s time to tell the story.</p> <h1>The Old System</h1> <p>Architecturally, the SimplyTest I inherited had three basic systems: the web server front-end, the worker server backend, and a proxying system that glued everything together. Everything was manually maintained and largely custom. </p> <ul><li>The servers were hand-built and required a ton of maintenance. All of the scripts to run the system were custom. </li> <li>The worker backend was a glorified, monolithic LAMP stack that would provision and deprovision virtual hosts, databases, and hostnames on the fly. </li> <li>Cleanup routines would fail commonly on system updates, disks would fill, logs wouldn’t rotate, and the maintenance burden was high. </li> <li>Major upgrades to components or the operating system would have caused an indeterminate amount of breakage. If you tried to fix and subsequently broke any part of the system, this would impact all of the running instances. </li> <li>And, there was no failover or load balancing. </li> <li>The application was running on Drupal 7, which means it was almost three major versions behind. </li> <li>Backups did not readily exist.</li> </ul><p>SimplyTest did not have an infrastructure that afforded easy development or encouraged contribution from others in a safe and straight-forward way (without basically using the fragile production systems). Making changes often broke things and the systems would go down routinely. It was not good.</p> <p>People would complain. A lot. We tried to keep up. But, the service wasn’t stable, nor was it easy to keep up with the latest innovations our community was developing. People routinely let me know about it. They also would routinely blame SimplyTest for issues with their own projects by expecting me, the maintainer of the service, to debug their issues. I recall a vocal community member persistently accusing the system of being broken because “it works on their local system” only for us to find one of the dependent third-party assets had a broken link in their module’s library file (which they already had downloaded locally and they didn’t properly test it). </p> <p>It was an incredible effort to just keep the lights on. And, it wasn’t sustainable. It was important that we created a new future.</p> <h1>Rebuilding SimplyTest</h1> <p>While a fresh approach was desperately needed, we have finally reached a point where SimplyTest.me has been rebuilt from the ground up. We spared no opportunity to modernize the project, which allowed us to shift our attention back to serving the community. The following sections highlight our accomplishments around revamping SimplyTest.</p> <h2>Goals</h2> <p>Revitalizing the project needed to be prioritized around what our users would get value from. As an example, lowering technical maintenance or eliminating technical debt affords more time to develop the features of SimplyTest.me or more quickly introduce changes tied to new community innovation (see: Gitlab workflows in drupal.org, updated PHP version support in Core, Composer/Drush improvements, and more). Time spent working on the system would not go toward keeping the lights on, but actual value built into the project our users would benefit from.</p> <p>Increasing contribution and available contributors is a long-standing goal. Not only do I want SimplyTest to be used for lowering the technical barriers of contribution, it is the perfect platform for learning and contributing something meaningful back. We made conscious architectural decisions with an eye for contributor growth tied to technologies we felt people wanted to learn. And, revitalizing the systems happened with an eye toward a cleaner, modern architecture that would afford more straight-forward contributions without the overhead of legacy systems.</p> <p>A better, more stable service offers more value. If our users get value and they continue to get value, I believe they will help sustain the project through donations or contributions. And, they can focus on the great things Drupal offers. Put differently, if people routinely experience challenges with the service or have trouble getting value from it, this lowers confidence and they are less likely to invest. SimplyTest must seek and be in a position to drive more contribution to remain viable. As such, we hope our work to build a new SimplyTest will hopefully position it to reach its fullest potential.</p> <p>Another goal is to have SimplyTest be a showcase for the best that Drupal offers. It wouldn’t just be built <em>for</em> Drupal but <em>with</em> Drupal as well. If we found ways to make Drupal or it’s dependencies better through our efforts, we did so. This is how the ecosystem works and we wanted to be fully responsible for this.</p> <p>Any modernization would be adding value, not losing it. We aimed to have at least 100% feature parity with the old version. I’m proud to say we achieved this goal.</p> <p>Finally, we stuck to our core tenets. We remain committed to open source. The service would be and will forever be free to our users. And, our actions reflect our fundamental goal to lower the barrier of entry for those who want to use Drupal and learn about the wonderful community we’ve established. </p> <h2>Donations and Paid Labor</h2> <p>I don’t expect people to work for free. Some choose to volunteer and I’m really grateful for that.  But, when I took over, I had no money to pay for anything. I established an Open Collective to help with this. I began accepting donations. Initially, this helped pay for expenses like SSL certificates and various attempts to make development infrastructure. But, I saved up money to help pay for sponsored contributions. I was proud to offer some people work when they were out of jobs. I hope to do a lot more of this in the future.</p> <p>Most importantly, this allowed me to spend some funds toward the revitalization. The project started to get some much needed help and velocity toward our goal. I was able to pay people with specific skills to come in and do work faster and of higher quality. </p> <p>A lot of this progress was made possible by donations of small and large from both individuals and organizations. It was really cool to also see Drupal Camps, who often leverage SimplyTest for contribution days, make donations with some of their funding. And, companies like Centarro, sponsored development of specific features (the one click demos). </p> <h2>Sponsored Backend</h2> <p>Our existing worker backend was a significant source of pain and suffering. It was a hand-coded, hard to maintain, antiquated, impossible to scale platform. Even though a new application was planned, we started with a backend replacement so we could exclusively focus our time on the front-end later.</p> <p>Many requested the use of ephemeral architectural patterns. Issues were opened for analysis on a container-based infrastructure. However great the technology was to fit our needs, it was not feasible. The cost to move off of a monolith and into a cloud-based platform was high. The development and maintenance of infrastructure was not something I could do without significant learning. And, even if it was perfect for our needs, a cloud-based, containerized solution was both cost prohibitive and impractical. As such, we opened up a call for a sponsored solution. Elijah Lynn, Cameron Eagons, Greg Boggs, and I formed a committee to review proposals. We chose TugboatQA. We basically were given an out of the box, ephemeral, container-based infrastructure that was all driven through APIs and had nice abstractions for Infrastructure-as-Code and hooks to execute the specific Simplytest dynamic behaviors.</p> <p>This was basically broken down into two phases: </p> <p><em>Phase 1</em> - we used a repository-based approach for our Drupal 7 integration. We generated YAML files that had all of the infrastructure definition and commands, pushed the definition to a repo branch, and made use of the Tugboat CLI to invoke provisioning. Teardown was already included in our IaC definitions, so it automatically cleaned up!</p> <p><em>Phase 2</em> - TugboatQA made some microservice enhancements between our Drupal 7 integration and our new Drupal 9 launch. More APIs were created for provisioning and log management, allowing us to move away from the repository-driven approach and to drastically simplify this integration. It was also a really natural fit for the ReactJS front-end we created. </p> <p>This was my first time leading the project that I considered a vendor. I had a lot of hesitance tied to this decision, especially for selecting a proprietary tool. I will say, the introduction of TugboatQA was game changing for the health, maintenance, and viability of the project. Plus, the TugboatQA (and Lullabot) teams sponsored this work because they are also committed to open source. I feel this was a great decision with a lot of alignment for all parties involved. They have been fantastic partners.</p> <h2>PaaS Hosting</h2> <p>With a volunteer team and limited time/budget, you need to be very careful about what you maintain with a project like this. We learned the hard way how difficult it is to maintain your own infrastructure. In my mind, you can’t waste time reinventing the wheel. While it may seem to conflict with our open source roots, we chose a service and vendor that was closely aligned with our identity: Amazee Lagoon. We are grateful they sponsored the use of their service to help run our Simplytest Drupal 9 website. While their PaaS service is a paid offering, their product is open source. And, it had relevant features and a high degree of customizability we needed to be effective. Amazee also offered use of it’s CDN services, which help with both performance and security. Worrying less about a website affords time for us to build more value into the system. We’re fortunate to have access to this service to allow us to improve the service itself. </p> <h2>Drupal 9 Website</h2> <p>What a better way to showcase Drupal by using Drupal itself. We wanted to harness the best Drupal had to offer as part of our revitalization. We actually started our efforts with Drupal 8 when we began to create the new application, but we then upgraded to Drupal 9. We have leveraged many cutting edge features, like the Typed Data system and the web service capabilities, which help modern Drupal applications shine. We’ve been able to leverage core features and the underlying framework to create a set of services, data models, and API endpoints that pair perfectly with our React-based front-end.</p> <p>SimplyTest has also innovated significantly around the Drupal community project metadata. Because our efforts were “experience first”, we ran into challenges implementing the ideal experience in support of semantic versioning, compatibility of major versions of core within projects, and more. Major props to Matt Glaman and Benji Fisher for helping research and innovate around these challenges.</p> <h2>Fresh Design</h2> <p>Comic Sans is a sign of the nineties, and the nineties want it’s website back. We’re happy to oblige. With a totally revamped system, we needed a modern design that best represented the technical innovations under the hood. Ana Laura Coto helped with this by producing designs for us, including a new logo! This will help our experience, allow our work to shine, and best represent how cool and modern the new system actually is.</p> <h2>Updated Theme</h2> <p>Iris Ibekwe set up our initial efforts when we implemented the Drupal 8 theme. It was responsive, leveraged modern grid systems, and established build tooling with Gulp, NPM, and more. This work helped get the ball rolling toward implementing our new designs.</p> <p>A lot of time passed from when the original theme was set up and when we got the new backend fully built. Some newer tools came out that allowed us to upgrade some of the older tools and innovate further. Matt Glaman implemented Laravel Mix, which allowed for live refresh and replaced the theming framework with Tailwind CSS.  </p> <p>QED42 stepped up majorly to finish the job. Their team did a significant amount of theming work and QA. They applied some updated design revisions made by Ana Laura to address identified accessibility issues. As the backend was evolving, the theme was being completed in parallel by their team. The QED42 team got the job done and their team was a pleasure to partner with. Front-end work is one of my technical limits. I was grateful I had such great help with this area.</p> <h2>ReactJS Front-end</h2> <p>The interface for SimplyTest has a lot of conditional behavior. It’s highly interactive. This presents our users with an experience that simplifies much of the underlying Drupal complexities. Users enter a project, they pick a branch, they then only see relevant options to them based on what they want to test. Drupal has evolved a lot and putting the experience first for our users has meant a lot of work behind the scenes to abstract complexities. This work is never done, but our new ReactJS front-end is a major step forward.</p> <p>Matt Glaman created the React front-end and the connecting backend APIs from Drupal. ReactJS is a great compliment for the web services sponsored by Drupal. The React app maintains state, which can help to address conditional needs and guide users through the experience we want to offer. This was a complex task and Matt’s leadership helped make something from nothing. I am just learning ReactJS and was struggling to make the kind of progress on this we needed. Matt’s expertise was critical to connect both systems and make this a huge success. I’m far more confident that others can contribute to this part of the system and use the React app as a reference for learning (I certainly will be).</p> <h2>Automated Testing</h2> <p>We were making sweeping changes throughout the last several months. When you add in development activities in parallel, it is much easier to break things. Thankfully, automated testing was implemented throughout our process. </p> <p>As Matt was implementing the Drupal backend and the ReactJS front-end, automated testing continued to be developed at the same time. PHPUnit tests were helping with the Drupal endpoints. Cypress was used to test all of the front-end and interactivity. Having automated tests allow us to have a stable development workflow that ensures we’re less likely to break things when pushing changes.</p> <h2>Website Repository and Quickstart</h2> <p>SimplyTest is a Drupal profile maintained on drupal.org. But, our application runs like a conventional Drupal website managed by Composer. Having a repository with SimplyTest installed allows for more key outcomes. First, the repository maintains the Drupal website running SimplyTest.me in a conventional manner to other Drupal applications. This repository serves as the integration with our new PaaS hosting and it looks and feels just like a standard Drupal application (because, it is). Second, the repository is a quickstart for contributors to load the website locally with minimal work. Community members can readily contribute just like any other Drupal project. This helps save time for those who want to participate and don’t want to waste their time with all of the manual setup. We also maintain both DDEV and Lando support within this Quickstart, with some basic documentation we aim to continue to improve with time.</p> <h2>Violinist </h2> <p>Again, we don’t want to waste time with manual work if we don’t have to. Matt installed Violinist on our SimplyTest website repository, which scans Composer.json files on the main branch for Composer updates. If updates are found, Violinist creates a pull request for the update. This works for Drupal core, all of the contributed modules, and even the SimplyTest code on Drupal.org. Pull requests trigger our automated tests to get immediate feedback. And, it sounds wild, but I can basically update the site from my phone. This is immensely cool and something that comes in handy for rapidly applying security updates. </p> <h2>Modern CI/CD</h2> <p>Our new CI/CD workflow offers smaller, incremental changes we can test iteratively before deploying to production. Our workflow with Violinist, pull requests, Github Actions, and on-demand environments on Lagoon allow us to get testing feedback, deploy small changes frequently, test them before pushing to production, and deliver with high quality. We have moved from having a monolithic infrastructure that wasn’t change friendly to being able to rapidly test and deploy changes in an ephemeral, highly automated, and change-friendly infrastructure. It’s been awesome and it’s such a sharp contrast from where we were before.</p> <h2>Monitoring and Alerts</h2> <p>I leveraged the free version of Pingdom to put basic alerts on the website and worker backend when I took it over. I got alerted for outages, which were frequent before. All monitoring and alerting has been switched to the new PaaS website and leverage TugboatQA service notifications (and Linode as their vendor) that could impact our backend. I believe there are more opportunities to improve this in the future, but the basics are there.</p> <h2>Live Coding Streams</h2> <p>Not only did Matt Glaman help with development and architectural guidance, he had an idea to do live streaming sponsored by his company, Bluehorn Digital. I learned a lot from these streams and am confident many others have as well. Streams cover development, testing, issue queues, development tools, and more. It’s great having someone talk through the process the entire time to understand the details. The streams were great for smashing bugs, working on new features, diving into the architecture, and advocating and promoting SimplyTest itself. They continue to be something I look forward to and were an immense help to launching the new site.</p> <h2>Partners Program</h2> <p>Between Bluehorn Digital, QED42, TugboatQA, Centarro, and Lagoon, it is very clear SimplyTest would be in rough shape without these partners. SimplyTest would not even exist without Druid and Maloon who sponsored the legacy systems. It is equally important to say thanks and highlight their contributions to the project, so I established a partners program. For companies who continue to invest in SimplyTest, we will continue to recognize you and offer incentives as we are able. One incentive is the “first right of refusal” for sponsored SimplyTest work. Partners get first dibs when we choose to pay for enhancements or bug fixes. Please see my previous blog post on the topic to learn more about the kinds of partnerships we’re offering.</p> <h2>Social Media Presence and Talks</h2> <p>It is incredibly important to engage with the community. We sincerely want to know what you think, where we can do better, and how we can deliver the best service possible. Thanks to AmyJune Hineline, we have established a Twitter presence, we are active on our Drupal Slack channel, and we have given talks at several camps that have highlighted our plans and why we’re doing this. AmyJune routinely uses SimplyTest as part of new contributor workshops. Because of this, we see much more engagement. Users routinely file issues, send messages, offer ideas, and help us be better each day. We’ve seen donations from the community. It’s such a stark difference from when we had no presence when I took over the project. And, AmyJune has been a critical part of helping establish and build this community from basically nothing.</p> <h2>Contributors</h2> <p>There are too many people to thank that helped us get where we are today. And, this was a collection of things that led up to the big reveal of our brand new Simplytest.me application. None of it would have been remotely possible without several people and companies stepping up to help. I mentioned several people already in this post and there are countless more who cheered us on, offered advice, pitched in, made donations, and so much more. This effort is no longer “my” side project, it’s now “our” community project. Thank you, thank you, thank you.</p> <h1>Parting Thoughts</h1> <p>We have finally put SimplyTest back in a good place. This is worth celebrating. Our technology is best-in-class and is appealing for anyone to use or learn. We managed to drastically reduce the code and simplify the application, lowering the barrier of entry for SimplyTest itself. We reduced maintenance activities down to nearly zero for both the application and the underlying infrastructure to allow focus on value creation. We’ve built a community that has promises of growth. And, we have the tools in place to sustain it. In retrospect, all of these small steps have added up to something significant in the few years I’ve led the project. It truly was a team effort. I couldn’t be more excited to finally be at this point and share this with everyone. I am grateful for those who pitched in and even more happy to say, “we did it.”</p> <p>This whole thing has taught me a lot. In a lot of respects, SimplyTest is both the best and the worst of open source. It’s not only a free service but all of the code is open sourced. It’s a great example of both companies and individuals pitching in toward a common cause. But, after having led these efforts, I have seen first hand how people can treat open source maintainers when they get behind a keyboard. Some users expect a lot but fewer are willing to pitch in and make it a success. Our system remains largely volunteer-led, donation funded, and services sponsored. We’ve been highly resourceful with what we have (which is very little in the grand scheme of things). At times people just seem ungrateful. On a personal level, I wish this was more harmonious. I’d love for more help (financially or through direct contribution). I’d love for more awareness for those who expect more than we can reasonably offer. Regardless, we try to put our users' needs at the forefront of the service. We welcome the challenge to serve everyone. And, we are in a much stronger position to serve people <em>now</em> but it took so much time and effort to get there.</p> <p>Another lesson in open source is how hard it is to have a big impact without resources. Working alone requires investing a lot of time and effort outside of your day job. It’s a fast way to burn out. SimplyTest.me historically relied on volunteer labor, sponsored systems, and had no money. Druid and Maloon graciously paid for all of the web, worker, and proxy servers. But, without funds, we couldn’t pay to get help from subject matter experts when it was needed. We just had to roll up our sleeves, work hard, figure things out, and be really scrappy. We picked up the phone to call friends when it was urgently needed to keep things running. But, one can only do this so long. And, I became fully aware of why the previous maintainer decided to move on. A large portion of time was focused on incidents and “keeping the lights on” while wanting to build the future. Wholesale change was needed and it makes it even more rewarding to launch our brand new system.  </p> <p>One more side note… the largely volunteer Drupal community is an amazing example of what can be accomplished at scale. A small number of contributions by a lot of people can add up to something significant. And, yes, SimplyTest is a part of the community. But, SimplyTest certainly has not seen the vast contribution that the Drupal ecosystem benefits from. We will continue to aspire to reach and achieve the kind of scale the broader community benefits from.</p> <h1>The Future</h1> <p>We need to grow into this new project we just launched. We just shed a ton of technical debt and can finally breathe easier after a rough few years. We still have a lot to learn and improve upon, and we need to work out the bugs. It was a lot of change in a (relatively) small amount of time, but we feel confident in the decisions made and to put us in a position of success. It’s incredible what a small number of highly motivated and capable people can do with clear goals, clear strategies, and clear purpose.</p> <p>In the coming weeks, I will be publishing a quarterly roadmap talking about key objectives we wish to hit moving forward. We will start with a pause in new features to fix bugs, stabilize, and identify improvements. We will then announce a prioritized set of features which will be informed by the feedback we get.</p> <p>We thank all of you who supported the service through our transition and when the system did not live up to your expectations. We’re confident that the future is bright, and we look forward to having SimplyTest serve the needs of the community for a very long time to come.</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 09/22/2021 - 18:58</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/8" hreflang="en">development</a></div> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Wed, 22 Sep 2021 22:58:00 +0000 admin 133 at http://nerdstein.net Weekend Thoughts, 9/11/21: A legacy http://nerdstein.net/blog/weekend-thoughts-6 <span class="field field--name-title field--type-string field--label-hidden">Weekend Thoughts, 9/11/21: A legacy</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>On the 20th anniversary of 9-11, it’s hard to ignore how fleeting life is. What we accomplish during our time is up to us.</p> <p>What do you want your legacy to be? Are you fulfilling it? Do you maintain awareness toward your goals and what impact you want to have?</p> <p>While I’m most proud of my family and the legacy I will leave through my kids, we are also afforded opportunities to leave a legacy professionally.</p> <p>Building great products is an incredible opportunity to help and serve others. The trust and confidence customers place in our hands is not a responsibility we should take lightly. We need to bring urgency and passion to solving their problems and innovating on their behalf. We are trusted to do so.</p> <p>Investing in open source, and specifically efforts with <a data-attribute-index="6" href="http://simplytest.me/">SimplyTest.me</a>, reminds me that volunteer efforts also leave a legacy. It is important to help create future generations. Everyone deserves the same opportunities I have been afforded. This is especially so for those underserved and underrepresented. While tech can be a difficult and demanding career path, it is our responsibility to create opportunities for those to learn, grow, make a living, and also have impact. Open source is critical to lowering barriers and bringing an equitable, accessible foundation to build upon. All ships rise.</p> <p>Covid-19 has brought new found awareness and urgency for many to fulfill their goals in life. Many have chosen to chase their dreams, try new careers, and test an employers market at the chance of a better path ahead. While the world re-opens, many are not turning back to the jobs which didn’t have a good culture or held them back from earning a reasonable living. Employees have a ton of opportunities right now and employers need to evolve. It is overdue that our priorities evolve in such a way. Businesses doing so are thriving and many studies demonstrate that a good culture retain employees and the employees are actually more productive. It’s an environment that helps people thrive. I want this to be a cornerstone of my legacy.</p> <p>During this somber day, I hope and wish we all do our part to find and foster opportunities to establish a new and more equitable future, demand better work environments and work culture, and help ensure all people reach their goals during their time on the earth.</p> <p>Finally, don’t forget to recognize and celebrate impact when you see it. Recognize the accomplishments of your teams for the amazing work they do for customers. Cherish people who show up every day fighting for a better culture and the impact you want to see. And celebrate those who reach their goals both at and even outside of your company. Spread more good news than bad and drive the kind of culture that isn’t purely about business objectives but one that raises up the people that help businesses achieve them. People are, in fact, the most important thing a business has.</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sat, 09/11/2021 - 14:08</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Sat, 11 Sep 2021 18:08:01 +0000 admin 132 at http://nerdstein.net Weekend Thoughts, 9/4/21: Leading through change http://nerdstein.net/blog/weekend-thoughts-5 <span class="field field--name-title field--type-string field--label-hidden">Weekend Thoughts, 9/4/21: Leading through change</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Changes to teams, organization, structure, or process should be thoughtful and done with patience. Change can take time to materialize. Teams often don’t like change. Making changes too frequently often doesn’t allow a team to get past the storming, norming and performing phases and therefore doesn’t allow for the expected investment to be realized.</p> <p>And, changes are disruptive. Changes should only be executed when it’s necessary. They shouldn’t be knee jerk or reactionary. It needs to be well thought out and planned. Slow and methodical.</p> <p>Plus, we are all human. Change can be hard, even for those leading it. It can throw people off. It takes time to build trust after. People may leave or be frustrated. Looking past the human element demonstrates a lack of empathy. Good leaders lean into an opportunity to strengthen connection with those impacted. Listen with empathy. Look for opportunities to make further adjustments based on what you hear and learn.</p> <p>And finally, remind those involved in changes of their value to the organization. Changes often position people to have a different, but significant impact. Explain the “why” and how that impact allows the organization to be better.</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sat, 09/11/2021 - 14:05</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Sat, 11 Sep 2021 18:05:11 +0000 admin 131 at http://nerdstein.net SimplyTest.me Welcomes Matt Glaman http://nerdstein.net/blog/welcome-matt-glaman <span class="field field--name-title field--type-string field--label-hidden">SimplyTest.me Welcomes Matt Glaman</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>SimplyTest.me is a labor of love but it has been one of the most unique, satisfying contributions I've made to the community. Most of that labor has been dedicated toward maintaining the Drupal 7 version. Our maintenance was massively improved with the introduction of Tugboat.QA, but this year found major changes in the Drupal community with the launch of Drupal 9, the major changes to Composer workflows, and the Gitlab integration. All of these things are of high impact for Drupal and required major changes to SimplyTest. This has been especially hard to keep up with for me. Our latest incident showed the limitations of the current system, where SimplyTest.me was blocked from the Gitlab infrastructure due to updates in Drupal.org's patching workflow. Much of this pulled my attention away from our aspirations to launch a new version. Until very recently, that is.</p> <p>On a whim, I had asked Matt Glaman if he could help. He had a little bit of time over the holiday season to pitch in and this rapidly changed the course of our new implementation. Matt stands out for his deep knowledge of React combined with his knowledge of Drupal itself. Several people have pitched in on the React frontend, but it was incomplete. The backend was also only partially completed, difficult to know what was left given it wasn't yet integrated, and was largely based on Drupal 7 code with only nominal improvement. Since we implemented Drupal 7 last year, Tugboat itself made some nice improvements that also were not implemented yet. In SimplyTest, we had the chance to simplify the architecture by more direct API calls and removal of the repository-based approach we used. React itself had an opportunity to invoke Tugboat APIs in a more straight forward way for logs, progress updates, and more. In short: we needed Matt.</p> <p>Matt graciously agreed to help and at a community rate. We will be sponsoring his time through the Open Collective. Any contributions to SimplyTest's Open Collective will help us finish this effort up faster.</p> <p>Matt is an expert. He knew every part of this stack. We needed someone to come in, sort things out, and get the basics of things in place to help move this effort forward. I was able to provide answers on what needed to happen, but I wanted Matt to have the full autonomy to implement it properly. This investment now delivers brand new long requested features, sets up future contribution in new ways, helps us make huge strides toward shutting down our Drupal 7 current system, and is overwhelmingly simple.</p> <p>I want to thank Matt for making this possible. His contributions have brought a much needed jolt of energy into these new efforts. I can't wait to share this work with the community. Thanks for helping the cause, Matt! </p></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Sat, 01/02/2021 - 14:28</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Sat, 02 Jan 2021 19:28:08 +0000 admin 124 at http://nerdstein.net Finally! A website refresh http://nerdstein.net/blog/new-site-2020 <span class="field field--name-title field--type-string field--label-hidden">Finally! A website refresh</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Let me welcome you to the new nerdstein.net. I'd like to thank Ana Laura Coto for help with the design. I'd like also thank Jonathan Daggerhart for being there when I needed an assist. I am really happy to finally share this project with the world.</p> <p>This has been a long time coming. Three years. Yes, you read that correctly. Three years. Why? I prioritized learning. And, I am slow and methodical. This website is a culmination of many things I learned over a three year span.</p> <p>But, three years?!? Yep. I have a rewarding and challenging full time job at Acquia. I have a family with two young kids. This project was all done in my spare time and at my convenience. Most of my time and learning is invested in SimplyTest.me. But, this project gave me a high degree of freedom on my own timeline. I wanted to learn things well and understand things properly. I did it piece by piece. Drupal evolved a lot in three years, as well. There was a lot to learn. And, then 2020 happened (I'll hopefully blog more on that soon).</p> <p>For the rest of this blog post, I'd like to reflect on these efforts and learning.</p> <h2>From Drupal 7 to Drupal 8 and then Drupal 9</h2> <p>Drupal evolved significantly from Drupal 7 to Drupal 9. My original goal was to launch this with Drupal 8. Then life happened. Then Drupal rolled more features and made it even easier and better to launch my site. I'll share some specifics below. Regardless, Drupal has established itself as a great tool for progressive enhancements.</p> <p>One notable change on this journey is how the community adopted Composer. I recall the very basic support when Drupal 8 was launched. Major changes were made when I upgraded the site to Drupal 8.7, which totally revamped the Composer work. I did the same when Drupal 9 came out. The community made some significant progress, but I'd love to see this stabilize now. I made heavy use of Composer and it's DevOps capabilities to script some of the integrations with my design system. This area of work was not well documented, especially in moving between versions and resolving issues.</p> <h2>New server</h2> <p>I was long overdue for a tech refresh. I had the same VPS running my Drupal 7 site for over seven years. It served me well. I spun up a VPS for a few Drupal 8 sites I hosted for local non-profit orgs that couldn't afford it. My Drupal 8 development site ran there for several years. The non-profits moved on due to grant funding and poor technical support (hint: if you can't do something well, don't do it). And, that Drupal 8 server rapidly dated itself.</p> <p>I was able to shut down both VPS servers and create a brand new Ubuntu 20.04 on Linode. Linode has been a sponsor of SimplyTest.me, helping offset the cost of it's development infrastructure. I'd hardly call the experience of Ubuntu 20.04 learning; it was a breeze setting up a Drupal 9 environment. These systems have come a long way even in seven years. Shutting down the VPS servers is bittersweet. I've removed some significant tech debt but those servers were rock solid. No regerts.</p> <h2>Design Systems and Drupal Integrations</h2> <p>The biggest emphasis of learning was the front-end work of the design system. I am still so far from an expert. But, I definitely understand it now. I started with Pattern Lab. I broke down Ana Laura's design into a series of atomic components. I developed them. I learned more about SCSS and building of front-end assets. I mocked up these patterns with JSON data objects and finally built out representative pages with the pattern.</p> <p>Once the design system was done, I started on the Drupal integration. My goal was to pull as much as possible from the design system (no cheating!). Composer made it easy for me to keep the design system and theme separated. I leveraged the Components module and proceeded to site build and theme simultaneously. Some of this was challenging. It was a fight between properly structuring content, overriding Twig themes, leveraging the Components module to include pattern markup, and parsing Drupal-related data objects.</p> <p>I blogged about this several times, both in terms of the concepts I used and the architecture I leveraged. Please feel free to read more about this if you are interested.</p> <h2>Twig. All the Twig.</h2> <p>Developing Twig was hands-down the most time consuming part of this project unquestionably. I spent countless hours digging through Drupal rendered objects, raw data, attributes of that data, and much more. I tweaked the display settings, created new view modes, did more tweaks, changed more Twig, and this went on endlessly. Data objects passed to Twig were massive and nearly impossible to debug without printing keys, refreshing, and traversing deeply nested objects. The syntax changed with every different entity and then even more with Views. Yes, Drupal is incredibly powerful and extensible. But, I continue to be surprised by the developer experience around Twig. I just wish this was simpler. I know the community has developed several utility modules. I need to dig into those more.</p> <h2>Media System: image links</h2> <p>I had aspirations of contributing a composite field type module back to Drupal core. Developing this module, which never got complete, was a huge rabbit hole. I thought it would be relatively straight forward to inherit the core-provided image and link field types into one new field type. This was significantly more complex, especially when dealing with cardinality, managing data storage/schemas, and dealing with field widgets that were built atomically. This approach was rapidly becoming complex and it didn't seem like it needed to be. Then, help was on the way...</p> <p>Daggerhart shared with me the new Media entity delivered as part of the Media system in Drupal 8. I was able to create an Image Link media type that was composed of an image field and a link field. This was super easy. From this, I got all of the expected benefits: Views support, easy integration with other entities, and the perks of the new media features in Drupal. Lesson learned: spend some time figuring out what parts of Drupal can be used before diving into code.</p> <h2>Migration from Drupal 7</h2> <p>My website is quite simple. It's a basic blog. I wanted a simple way to migrate the content. Drupal offered that with it's native Drupal to Drupal migrate UI.</p> <p>Set up was simple. I was able to set up a secondary database within settings.php for my Drupal 7 database. I archived to the files directory on Drupal 7, extracted them in a specific file path, and entered that path in the UI.</p> <p>When I ran it, I got a nice confirmation page of potential issues with the Drupal 7 configuration, modules, and structure. I worked through it, ran the migration, and it basically worked. I had a few nodes that did not properly map their type. I cleaned this up through the database by manually editing the node type in the node and node revisions tables, followed up with a cache clear. I also had a few nodes that did not display the body field content. I simply re-saved the node and it worked.</p> <p>I had to run this migration multiple times over three years as I refreshed the content on my current site. The UI didn't offer a rollback (this would be a nice feature through the UI) and had a big red note of caution when running multiple migrations. I did it anyways and it seemed to work fine for me (again, with my simple use case). Buyer beware.</p> <p>To learn what happened behind the scenes, I audited all of the migration classes and configuration that were created. Kudos to those who worked on making the migration experience a positive one. I was really surprised how much was automated, how insightful it was, how smooth it went, and how easy it would have been to override the underlying config it created.</p> <h2>TugboatQA</h2> <p>As I previously shared, I wanted a tech refresh. I thought about spinning up a development server, but this isn't really a modern CI/CD workflow. Having such a positive experience with TugboatQA on SimplyTest.me, I wanted to rapidly see changes before posting them live. And, I wanted something that didn't require me to mess around with another server. TugboatQA for the win.</p> <p>Set up was straightforward. This may be potentially because I understood most of the concepts from SimplyTest.me, even though the use case couldn't be more different for my personal website. I followed the documentation and configured it within a few hours (love their IaC set up). I actually found a bug in how I implemented Composer paths, which I subsequently fixed.</p> <h2>Ported Block Type Templates module to Drupal 9</h2> <p>Again, I spend a lot of my personal time on SimplyTest.me. I still moonlight with some module maintenance, but I do a pretty poor job at this if I am being honest. I did use the Block Type Templates module I developed to have more fine grain control of block Twig. This was immensely helpful with the design system integration. But, I had to port it to Drupal 9. I also cleaned up the issue queue and added some nice features. I hope this helps others, too.</p> <h2>Future Goals</h2> <p>This website is definitely not done. I have some open issues I've logged. I need to clean up some content, fix even more styling, and finish the Tugboat implementation now that I've launched. It's done enough for me to not maintain two websites any longer. Please feel free to let me know if you find any issues.</p> <p>I also want to add more DevOps. When a PR gets merged, I want to set up a GitHub action to trigger the deployment on prod: pull updates from Git, load the config, run the database updates, and clear the cache. My confidence is a lot higher with Tugboat and my CI/CD workflow in the mix. This should be fun.</p> <p>I'll be finally adding SSL support for my site, but I'd like to do this by learning more about the edge layer. I need more research but leaning towards using CloudFlare for this.</p> <p>Pattern Lab has evolved majorly since I first set up the design system. I'll be upgrading this with time and I have the Drupal integration versioned to allow for changes like this to be done in the future.</p> <h2>Final Thoughts</h2> <p>I'm glad to finally be able to launch this thing. I learned a lot doing this. Drupal is still a fantastic option for digital experiences. It does so much. Drupal 9 brings all of the previous years of learnings, new features, great performance, modernized dev workflows, and continues to deliver a highly extensible framework. I thought a lot about developing this in something like Gatsby, but would have still wanted a FOSS backend like Drupal. It did everything I needed natively.</p></div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 12/28/2020 - 22:43</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/8" hreflang="en">development</a></div> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Tue, 29 Dec 2020 03:43:46 +0000 admin 122 at http://nerdstein.net Drupal Community Care Packages http://nerdstein.net/blog/drupal-community-care-packages <span class="field field--name-title field--type-string field--label-hidden">Drupal Community Care Packages</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p dir="ltr" id="docs-internal-guid-ff42d9bf-7fff-ff4e-fcf0-2082d265804e" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Our community has always meant more than just code. These last several months have been difficult to make the same kind of connection we have come to expect from things like in-person events. And, during this time, many of us are having to juggle new challenges, may have sick loved ones, face professional or financial uncertainty, and more. I’m choosing to do something about it.</span></p> <p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;"> </p> <p><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">I am announcing free community care packages for Drupal. I care about our community and I care about the wellbeing of all of you. I recognize this is basically nothing at a time when people are dealing with much larger issues, but I hope that even a small gesture can help to remind you that you matter. </span></p> <p> </p> <p><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">I’m extending the concept of the coffee exchange. What will be included? One-half pound of coffee (thanks to my friends at <a href="https://standingstonecoffeecompany.com/">Standing Stone</a> for help with the coffee), some stickers, and some local chocolate (thanks to my friends at <a href="https://marciaschocolates.com/">MarCia's Chocolates</a> for suggestions and help with shipping). Shipped to your door. For free. This is my way of saying thanks and recognizing what I miss the most from our pandemic times: each of you.</span></p> <p> </p> <p><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">For financial reasons, I need to keep this within the United States and to the first 30 participants. I will try to do more, if possible. <strong>I encourage others to steal this idea, </strong>especially for their own country or area. And, I would gladly accept donations to expand to a greater number of people.</span></p> <p> </p> <p><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">What do you need to do? Nothing. However, I’d love to hear your story, if you are inclined to share. I’ll release people’s stories, for those who opt-in, in a series of community spotlights on my blog to help promote the kind of connection our community affords. I believe we need these types of messages to balance the difficult and challenging news we see each day. </span></p> <p> </p> <p><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">How do you sign up? </span><a href="https://forms.gle/64Rd1sckPSYs1kan9" style="text-decoration:none;"><span style="font-size:11pt;font-family:Arial;color:#1155cc;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:underline;-webkit-text-decoration-skip:none;text-decoration-skip-ink:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">Simply fill out the form here</span></a><span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre;white-space:pre-wrap;">. I’ll remove people’s personal data once the packages get sent, which will hopefully be within two weeks.</span></p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 04/30/2020 - 16:33</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Thu, 30 Apr 2020 20:33:00 +0000 admin 119 at http://nerdstein.net A DevOps Primer http://nerdstein.net/blog/devops-primer <span class="field field--name-title field--type-string field--label-hidden">A DevOps Primer</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>I just closed about 100 browser tabs from an early year activity. While it’s embarrassing I left those tabs open so long (going on five months), I wanted to leave them open to reflect on what I learned. And, what a better way to reflect than a blog post.</p> <h1>The Soapbox</h1> <p>Bear with me for a moment. I subscribe to the philosophy that DevOps represents a line of thinking and a way of working, not a technical product. Like security, when someone says, “I’ll sell you DevOps”, it’s a scam. For those “doing” it right, you need to focus on foundational concepts built into continuous learning. This ideology has been communicated in talks and blog posts by some of our communities’ sharpest minds, including <a href="https://twitter.com/dev_meshev">Michelle Krejci</a>, <a href="https://twitter.com/geerlingguy">Jeff Geerling</a>, <a href="https://twitter.com/schwartz_cio">Mark Schwartz</a>, and more. And, in my opinion, there is a direct correlation to Agile frameworks. Concepts like retrospectives to share learnings, sprint planning to prioritize, and backlogs to organize and track work thoughtfully. Most of these ceremonies are open to the whole team to participate, so they naturally advocate for transparency and connection.</p> <p>Key point: DevOps is ongoing evolution through experience. Technical progress is just one type of outcome, but equally important are solutions involving people and process.</p> <h1>DevOps Philosophy</h1> <p>Change is at the heart of DevOps. Digital products change. People change. Organizations change. DevOps reflects a pragmatic approach to change. Many people discuss it, especially solutions. But, any solution reflects a change that is, hopefully, driven by what is learned and what can deliver better, more impactful results for actual people and real problems encountered.</p> <p>As a basis, start by evaluating what change occurs. On the surface, change can look like any of the following:</p> <ul><li>System and software updates, especially security ones</li> <li>Continuous Integration (deployments of change increments, automated/manual processes)</li> <li>Changes in the team (people leaving, people being promoted to new roles)</li> <li>Organizational changes (launching a new product, leadership transitions, exploring new markets)</li> <li>Incidents (getting hacked, services going down)</li> <li>Exploring new technology</li> <li>Sunsetting legacy technology</li> </ul><p>A mature DevOps practice is capable of adapting to change ongoing and remaining effective. An equally important philosophy is the openness and willingness to change. This is built on trust and the recognition that every team member is capable of bringing value: to allow people to raise their voices, drive change, and have impact.</p> <p>DevOps can be transformational. It can be really hard and a non-natural fit for the “command and control” models traditionally established with embedded IT departments and IT vendors. Mark Schwartz writes about this concept routinely in <a href="https://aws.amazon.com/blogs/enterprise-strategy/shu-ha-ri-detaching-from-and-transcending-command-and-control/">blog posts</a> and in his book “A Seat at the Table: IT Leadership in the Age of Agility.” Again, organizations suggesting they can just buy DevOps would be in for a rude awakening or really only purchase an incremental step relevant at that point in time only. Sure, you can purchase a two million dollar Kubernetes, cloud-based infrastructure framed as DevOps. But, what problem are you really trying to solve? Chances are, you’ll be in a position of opening up countless other problems around vendor lock-in, governance, maintenance, and enablement you never anticipated. A better place to start is in the cultural change needed to identify problems, define risk, share ideas and make smarter investments capable of having real impact now and in the future.</p> <h1>Bare Minimum DevOps</h1> <p>Now that I’ve set the context for my thoughts on what DevOps actually is, how do you do it? I’ve long wanted to make a blog post defining some bare minimum DevOps concepts. I’ve seen so many differences when I interact with a client or project. I’ve wanted to point back to something and highlight my thoughts foundationally. The range of differences reflect the varying states of learning organizations are at. And, it’s natural given many of the concepts represent years of learning how to build quality, robust digital solutions that are capable of adapting to change.</p> <h1>Case Study: SimplyTest.me</h1> <p>Remember the browser tabs and the learning I did? I was working on SimplyTest.me. As of right now, it is a perfect example of a system desperately needing some DevOps love. There has been a lot learning and needs are defined. As the project lead, I’ve long wanted to automate routine failures, establish a more easy-to-change system, and open up SimplyTest.me for broader contribution. But, the current system is very hard to do so as it’s developed. The infrastructure is highly customized, the tool is fairly complex, and, subsequently this makes it harder to change. This may make for a future blog post, but the concepts shared reflect this recent exploration for SimplyTest.me and things I’ve encountered over the years.</p> <h1>Environments</h1> <p>Change cannot and should not happen only on production systems. Any change needs prepared, tested, and then deployed to prod. At a minimum, you need both production and non-production environments. Change increments then get vetted through non-production environments before being released to production. A non-production deployment helps vet any changes made on a local system before they hit production.</p> <h1>Parity</h1> <p>Parity is a key concept for evaluating change. As an example, if you are running different versions of PHP across environments, evaluating a change increment on one environment may not match the results of what gets deployed to production.</p> <h1>Evaluation Criteria</h1> <p>If you change things, you need to establish a means for evaluating the change. This could be both manual or automated testing of a change. It could also be part of your development workflow on what needs to be tested when implementing a change. But, the key is you need to have some process defined. And, this process needs to respect both the change increment itself and some means of looking at regressions throughout a system. Because, any change made in one part of the system can unknowingly impact the rest of the system. Establishing some criterion to evaluate change may be just as important as the change itself.</p> <p>This is not confined to technical change either. When making process or organizational change, there should be some metrics and data used to measure efficacy. After all, if you are making a change, how do you really know if the change worked?</p> <h1>Source of Truth</h1> <p>Also known as the “system of record”, a source of truth is a data integrity concept. Some aspects of environments are more flexible to change than others. Most production systems maintain data (users, content, files, etc) that most likely should not change as change increments are deployed. And, non-production systems leverage production systems as the source of truth, often by synchronizing or replicating a “point in time” snapshot of the data to mirror production data before a change is evaluated. The source of truth is left untouched until the change is ready and often throughout a deployment of a change. Third party systems may be the source of truth for other enterprise functions. For example, an email server may be the source of truth for notifications sent from a system. Recognizing the differences and responsibilities of specific systems and environments help understand source(s) of truth and how they serve a larger change process.</p> <h1>Backups</h1> <p>Even with the best of intentions, changes can break things. Be prepared at any point to restore from a backup, both by rolling back changes and by restoring databases. Test this process (really… it needs to work in the most inopportune of times). Having timely and relevant backups are hugely important for restoring botched deployments, standing up systems after a security incident, and generally gives people piece of mind. Make sure you understand how to restore a backup and bonus points if both the backup and restoration processes are automated.</p> <h1>Keys</h1> <p>Identity management is a really deep and hard problem in IT. On the surface, people think identities apply only to users. But, systems need a proper way to be identified and subsequently verify their authenticity. Keys are a widely adopted approach. Often there is a public and private key, where the public key is referenced by other interacting systems. The private key is used as the verification and is owned strictly by the system. Maintaining keys is a critical way to ensure only specific systems are capable of accessing and associating a system to another (often through users and their specific permissions).</p> <h1>Secured Channels</h1> <p>When systems are interacting, one needs to be concerned with the channels in which systems communicate. Secured channels help encrypt communication. The most common of which is the use of SSL and certificates. Tools like LetsEncrypt have brought SSL to the masses, allowing for a free way to generate (and re-generate) SSL certificates capable of happening in an automated fashion. This helps mitigate the risk of someone intercepting and browsing your traffic between systems.</p> <h1>Scripting</h1> <p>One key way people apply what they have learned is through scripting things that happen routinely. Scripting also can be as simple as a Bash script to perform a routine operation in a consistent fashion or a robust development framework with conditional scripts executing routinely and on-demand. Those intimidated by scripting can start off basically by leveraging tried and true bash scripts that run non-interactive commands across any environment. You can get a long way without introducing complexities found in more robust frameworks.</p> <h1>Code Repositories</h1> <p>Code repositories are the cornerstone of DevOps. They are the source of truth for all system code, any scripts that run, and can be critical in any disaster recovery/restoration process. Code repositories maintain a record of changes and the users who made the change. Code repositories can be cloned to any environment and fetched as needed (the “D” in “DCVS”). Concepts like branches allow for changes to be staged before being merged into a branch associated with production environments. Releases can be implemented as tags that reference specific commits. And, many popular tools (Github, Gitlab) offer features, like pull/merge requests, that are advantageous within a development workflow.</p> <p>Also, code repositories maintain change events. Creating a new branch may provision a new environment (this has been made popular by CI/CD models) that allow for hands-on testing of changes before release. Merging a branch can destroy an environment and trigger a deployment to a production or non-production environment. And, tools like pull/merge requests allow for code to be reviewed. All of these events are exposed to a broader opportunity that DevOps can leverage. For example, running automated tests can occur when commits are pushed up to a branch or when a deployment to a non-production environment occurs. None of this is possible without a code repository.</p> <h1>SSH</h1> <p>When events occur and scripts need to be run, how do they run on the actual systems? SSH is the answer. SSH is the protocol used to remotely execute commands from one machine to another. I remember the days where every company had huge in-house server closets with expensive terminals to manage the servers. Now, we can purchase affordable infrastructure managed remotely, upload keys, and open terminal sessions that are directly connected to these remote machines. SSH has made much of this possible and is critical for DevOps.</p> <h1>Jenkins</h1> <p>Continuous integration (CI) tools exist to centralize and execute what you have automated. I questioned if this needed to be on the “bare minimum” list. Inevitably, you can do a lot without such a tool, but you won’t get the mileage you could otherwise. CI tools do a great job of logging execution and maintaining a history of execution. Imagine developers having to save their terminal history. Such tools help teams have a central platform where multiple users can log in, access can be control, parameters can be selected to use common scripts, and more. Tools like Jenkins, Travis CI, and CircleCI have native integration with code repositories, can help manage keys and servers, and can manage complex, conditional workflows.</p> <h1>Systems Infrastructure</h1> <p>All of the aforementioned concepts rely on an infrastructure that runs the systems. At a minimum you need at least one server for production and seperate server(s) for non-production infrastructure/environments. Backups should be maintained offline and outside of the servers.</p> <h1>Infrastructure as Code</h1> <p>While it’s not “bare minimum,” container-based, cloud technology can create a flexible infrastructure capable of provisioning and tearing down servers when change events occur. This maintains a durable, extensible infrastructure capable of responding to change. Tools like Docker can help create the definition and images needed for containers. Cloud-based platforms have APIs for creating instances as needed, managed volumes for persistent storage (logs, databases, objects/files), and monitoring needed for auto-scaling. Production infrastructure, or specific aspects of it, should be persistent. Load balancers and proxying become common when implementing this type of infrastructure, including DNS management. Again, while this may not be completely necessary, it’s certainly an appealing option for those building something from the ground up or people looking to level up an existing infrastructure.</p> <h1>Documentation</h1> <p>This may seem commonsensical, but there must be documentation. At a minimum, I look for a README in the code repository, describing how to set up a project, a technical architecture overview, a description of the infrastructure, and a brief rundown of what is found in the code repository. Non-technical users often need Google Docs or something outside of the technical repository. The most common things I’ve seen are flow charts articulating the DevOps workflows, diagrams of the systems, and high-level commentary on insight and motivations. After all, changes in teams or members on teams can be caught completely flat footed without good documentation.</p> <h1>Summary</h1> <p>As I shared, I think DevOps is sometimes a misrepresented topic because I believe it starts with a way of thinking, is often associated with transformation, and is not strictly about technical outcomes. I’ve seen variations in maturity and tried to share what I consider to be a bare minimum set of concepts people need to both practice and apply DevOps. I can’t imagine the number of browser tabs I’ve opened over the years researching this topic. Again, it’s simply not enough to purchase a product and expect the potential outcomes. What do you consider DevOps to be? What set of bare minimum concepts did I miss?</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Mon, 04/29/2019 - 22:06</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/8" hreflang="en">development</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Tue, 30 Apr 2019 02:06:10 +0000 admin 114 at http://nerdstein.net SimplyTest.me and Google Summer of Code 2019 http://nerdstein.net/blog/simplytestme-and-google-summer-code-2019 <span class="field field--name-title field--type-string field--label-hidden">SimplyTest.me and Google Summer of Code 2019</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p style="font-size:16px;"><a href="https://simplytest.me/"><u>SimplyTest.me</u></a> is a project I continue to lead and volunteer my time to. I’m driven to help lower the barrier to entry for people in our community to contribute, use Drupal, and be a part of our community.</p> <p><span style="font-size:16px;"><span style="font-size:16px;">For me to be effective, I need to keep my eyes open for unique ways to help the project. Much like our larger community, we must be opportunistic to remain sustainable. <a href="https://summerofcode.withgoogle.com/"><u>Google Summer of Code</u></a> (GSoC) is just that. I previously participated as a mentor, helping students port security-related modules to Drupal 8. I was approached by Matthew Lechleider (<a href="https://www.drupal.org/u/slurpee"><u>slurpee</u></a>) to see if there would be a fit for SimplyTest.me. And while SimplyTest.me is unique in that it is both an open source project, a set of services, and associated infrastructure, it has long been a desire of mine to have more people contributing and have SimplyTest open up career opportunities for participants. GSoC is just that.</span></span></p> <p><span style="font-size:16px;"><span style="font-size:16px;">According to the <a href="https://summerofcode.withgoogle.com/how-it-works/#timeline"><u>GSoC timeline</u></a>, student candidates are participating in the application period. For Drupal, specifically, they are not only <a href="https://groups.drupal.org/node/534703"><u>evaluating project ideas </u></a>but <a href="https://www.drupal.org/node/2415225"><u>getting comfortable with community standards and contribution</u></a>. Candidates then write up proposals for the GSoC leads and project maintainers to evaluate. Matthew summarized this perfectly by saying,</span></span></p> <blockquote><p><span style="font-size:16px;"><span style="font-size:16px;"><i>GSoC can be similar to a "choose your own adventure" type summer job</i>. <i>We provide cool bosses (mentors), a software platform with a request (Drupal/SimplyTest.me), and the option for student to build their own project plan then execute project while being paid via Google.</i></span></span></p> </blockquote> <p><span style="font-size:16px;"><span style="font-size:16px;">But, given the fairly niche nature of SimplyTest, a simple project description is hard to develop a proposal. This blog post helps expand on the project description to help clarify potential next steps.</span></span></p> <h2><span style="font-size:16px;"> </span></h2> <h2><span style="font-size:16px;">What does SimplyTest offer?</span></h2> <p><span style="font-size:16px;"><span style="font-size:16px;">Any student participating in this GSoC project would get a much broader experience than other projects potentially offer. And, while we have a current Drupal 7 based system with a highly customized infrastructure, this project will emphasize our future roadmap in a fresh, new system. This features the following modernized architecture:</span></span></p> <p> </p> <ul><li><span style="font-size:16px;"><span style="font-size:16px;">A Drupal 8 distribution</span></span></li> <li><span style="font-size:16px;"><span style="font-size:16px;">Integration with Drupal.org sponsored web service APIs</span></span></li> <li><span style="font-size:16px;"><span style="font-size:16px;">A React.JS front end application</span></span></li> <li><span style="font-size:16px;">DevOps efforts (Docker, web service APIs, infrastructure as code)</span></li> <li><span style="font-size:16px;"><span style="font-size:16px;">Integration with Tugboat QA (this is still formally TBD, but a proof of concept in the old system is near completion)</span></span></li> </ul><p><span style="font-size:16px;"> </span></p> <h2><span style="font-size:16px;">Project ideas</span></h2> <p><span style="font-size:16px;"><span style="font-size:16px;">I want to stress that we need to make progress on the new system, not the current one in place. The following serve as some high-level ideas and “current state” of known needs. I will stress that a successful project proposal should reflect the necessary research and details needed to achieve the following ideas. The links below offer further details and insights helpful for an informed project plan.</span></span></p> <p><span style="font-size:16px;"> </span></p> <ul style="font-size: 13.008px;"><li><span style="font-size:16px;"><span style="font-size: 16px;"><a href="https://www.drupal.org/project/simplytest/issues/3036569"><u>Implement Tugboat QA</u></a> - The proof of concept is in the current Drupal 7 system. A Drupal 8-based equivalent will need to be developed. This may include porting the Tugboat QA module to Drupal 8. Students should research this platform and the current proof of concept to get an idea of the work needed.</span></span></li> <li><span style="font-size:16px;"><span style="font-size: 16px;"><a href="https://github.com/nerdstein/simplytest/tree/8.x-4.x/themes/simplytest/react"><u>React.JS front-end</u></a> - The distribution will have a series of API endpoints which cache data from Drupal.org. These services may need built or enhanced to work with the new React.JS front-end, which is in progress but will likely need to be finished. Students should look at the work-in-progress Drupal 8 code base for an idea on current state.</span></span></li> <li><span style="font-size:16px;"><span style="font-size: 16px;"><a href="https://github.com/nerdstein/simplytest/tree/8.x-4.x/themes/simplytest"><u>Implementing the Drupal 8 theme</u></a> - Our distribution already has a Drupal 8 theme in place. However, it needs to be implemented with the React.JS front-end and applied more generally throughout the Drupal system (e.g. menus, header, footer, FAQ page). Students should look at the work-in-progress Drupal 8 code base for remaining efforts.</span></span></li> <li><span style="font-size:16px;"><span style="font-size: 16px;"><a href="https://github.com/nerdstein/simplytest"><u>Feature parity</u></a> - There are many <a href="https://cgit.drupalcode.org/simplytest/tree/"><u>Drupal 7 specific features</u></a> that would need to be ported for feature parity. Some current features are no longer required given the Tugboat QA integration. Students should evaluate the Drupal 7 distribution and articulate missing, but relevant features that can be accomplished in the project.</span></span></li> <li><span style="font-size:16px;"><span style="font-size: 16px;">Analytics - New mechanisms will need to be in place to develop various usage-based reports from within Drupal 8. Students can share potential approaches to achieve this goal.</span></span></li> </ul><p><span style="font-size:16px;"> </span></p> <p><span style="font-size:16px;"><span style="font-size:16px;">Please note that once we get a stable set of features, the Github repository will be moved to a 8.x branch on Drupal.org.</span></span></p> <h2><span style="font-size:16px;"> </span></h2> <h2><span style="font-size:16px;">Conclusion</span></h2> <p><span style="font-size:16px;"><span style="font-size:16px;">I look forward to seeing student proposals and am more than confident SimplyTest.me provides both a level of rigor and educational opportunities. I am also interested in potentially splitting this up into two projects: front-end and backend/DevOps. Any interested students can reach out to me via <a href="https://www.drupal.org/user/1557710/contact"><u>my contact page</u></a>. Other potential mentors have been identified that have worked on SimplyTest.me and discussions are ongoing.</span></span></p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Thu, 03/07/2019 - 13:06</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Thu, 07 Mar 2019 18:06:34 +0000 admin 113 at http://nerdstein.net My 2019 Aaron Winborn Award Nomination http://nerdstein.net/blog/my-2019-aaron-winborn-award-nomination <span class="field field--name-title field--type-string field--label-hidden">My 2019 Aaron Winborn Award Nomination</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Last year, I read Jim Birch’s blog post outlining his Aaron Winborn nomination of (now) award winning Kevin Thull. As a community, we need to do our best to celebrate accomplishments and I love that this award exists. We need to tell more of our stories regardless of who gets the award. I see no reason not to share my nomination for this year’s award publicly.</p> <p> </p> <p>Contribution takes many different forms. Our community recognizes many aspects of contribution, but I believe the spirit of the Winborn award is to “think bigger”. Community members find creative ways to have impact well beyond just commits. My nomination tries to honor this with two primary criteria: contribution and impact.</p> <p> </p> <p>I would like to nominate Nikhil Deshpande and Kendra Skeene. Yes - two people. But, they have been an inseparable force that has greatly impacted the community.</p> <p> </p> <p>Why? They own, recognize, and prioritize their collective purpose. They serve citizens through the <a href="https://digitalservices.georgia.gov/"><u>Digital Services in State of Georgia</u></a>. Everything they say and do, every investment made, every email sent is focused on the needs of all citizens or to better empower those serving citizens. Nikhil and Kendra emphasize the need for research, data, and analytics to drive citizen-first initiatives in usability and accessibility. They approach their roles with empathy. These efforts are pioneering in the public sector -- helping modernize offerings throughout the State of GA and set a model for other organizations in the public sector.</p> <p> </p> <p>And, they primarily invest in open source technologies. Drupal serves as a vehicle<a href="https://www.slideshare.net/nikofthehill/drupal-business-summit-georgiagov"><u> they adopted to deliver many of their digital services</u></a>. Their efforts have had a major impact to the Drupal community and beyond. Their team has led efforts that have pushed innovation in our community. “<a href="https://georgia.gov/blog/2017-10-12/got-questions-ask-georgiagov-alexa"><u>Ask GeorgiaGov</u></a>” connects conversational interfaces like Alexa to Drupal. The State’s Open Data portals integrated rich data visualization libraries through dashboards built from the Drupal distribution DKAN. They invest in projects and hire agencies in our community to help their team. This subsequently creates jobs and new opportunities for community members. Agencies are asked to contribute back to the community as much as possible, ensuring their investments are able to be used by everyone.</p> <p> </p> <p>What is the impact of this effort? Drupal, as a product, has innovated in new and novel ways. The tool is better able to serve <strong>all</strong> people. The Drupal community is better sustained, especially those that prioritize giving back. Other digital agencies in the government look up to and model their efforts, which drives even more impact for our community. And, people throughout the world, especially the citizens of Georgia, benefit from their refreshing investment in forward-thinking innovation.</p> <p> </p> <p>This impact has received wide praise and their approach has spread. Nikhil and Kendra are routinely recognized [<a href="https://gta.georgia.gov/press-releases/2016-11-04/gta%E2%80%99s-nikhil-deshpande-named-40-under-40"><u>1</u></a>][<a href="https://www.cio.com/article/3263659/innovation/how-the-state-of-georgia-provides-innovative-digital-services-to-citizens.html"><u>2</u></a>][<a href="https://twitter.com/GeorgiaGovTeam/status/994190245565349888"><u>3</u></a>][<a href="http://www.govtech.com/civic/NASCIO-Midyear-3-States-Take-on-User-Centered-Design.html"><u>4</u></a>] and speak at both community and public sector events. They are thought leaders that advocate for their “citizen and open source first” approach.</p> <p> </p> <p>Preston So, Director of Research and Innovation at Acquia, captures this perfectly in the following quote:</p> <p> </p> <blockquote><p>Nikhil and Kendra, and the entire Digital Services Georgia team, have been instrumental not only in advocating for open source across state and local government but also in fostering innovation in the Drupal community. Thanks to the forward-looking vision the Digital Services Georgia team has articulated over the last few years, we at Acquia Labs were able to hew to our mission of encouraging open innovation by contributing back to and maintaining the Alexa module available for Drupal 7 and 8 today. This integration has inspired governments and organizations the world over. But it is Nikhil and Kendra's commitment to open source and deep understanding of our community that truly shine a spotlight on their efforts to lock open governments worldwide and make open source just as much a first-class citizen as the Georgians they serve with devotion every day.</p></blockquote> <p> </p> <p>Both Nikhil and Kendra have done amazing things for our community and opened up new opportunities in the public sector. Imagine the scale of potential impact they would have to our community if even a few more agencies follow their lead. I thank you both for the example you’ve set, your contributions, and for leading the way in this area.</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Wed, 02/06/2019 - 09:25</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Wed, 06 Feb 2019 14:25:23 +0000 admin 112 at http://nerdstein.net The Season of SimplyTest http://nerdstein.net/blog/season-simplytest <span class="field field--name-title field--type-string field--label-hidden">The Season of SimplyTest</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Last year was spent primarily learning about SimplyTest. We did make some progress, but I think “keeping the lights on” for a system of this complexity was quite a feat after the project transfer. It’s a unique and fairly complex endeavor that bridges all elements of an open source project, a completely free service, and underlying infrastructure. I see all of the good and the bad that comes from each aspect: system maintenance, feedback from community members, customer service (Slack, Twitter, etc), system outages, and more. I recognize how valuable this service is to the community and I strive to offer the best service possible.</p> <p>I serve as the SimplyTest lead. I do most things and do not have a team. I steer both the current system (primarily for stability) and maintain the vision to help modernize, simplify, and scale SimplyTest with time. I balance my time by prioritizing impact, knowing I work full time and have a family. There are times progress stalls given time constraints and this seems to mirror much of the concerns people raise around a perceived “stagnant” system.</p> <p>There isn’t vibrant additional contribution to any aspect of SimplyTest. But, I do want to recognize and thank Greg Boggs for his help, especially with system administration. Iris Ibekwe, who developed a new Drupal 8 theme for our future front-end. Several members of my team (Jonathan Daggerhart, Ryan Bateman) at Hook 42 have helped start build out aspects of the Drupal 8 front-end with me. I welcome help and also need to do a better job of asking for it.</p> <p>There are little to no finances tied to SimplyTest. We are fortunate to have server-level sponsors (shout out to Maloon, Druid, and Linode), but we must make use of free services/tools, pay personally out of pocket, or (very recently) get reimbursed through donations. All labor has been volunteered and some sponsored by Hook 42 (thank you so much!!). I personally have paid for a new design and logo, stickers, domains, and more, long before the Open Collective was established.</p> <p>At the end of the year, I often take time to work on outside things (e.g. professional development or community work). 2018 was no exception. I had a full backlog of items I wanted to tackle with SimplyTest and wanted to share the last two months of progress.</p> <h1>Development server</h1> <p>Given the underlying complexity of the various distributed systems involved, it is incredibly hard for people to set things up on their own. This hurts contribution.</p> <p>Thanks to a generous donation from Linode, we received credit on their platform for new infrastructure. This allowed us to set up both a front-end server and a worker server to be used for development. While this is quite close to being finished, this is a huge milestone for SimplyTest to ensure we vet changes on non-production systems and foster an environment that is safe to make changes such that others can learn the system to contribute.</p> <h1>Clean up procedures</h1> <p>The setup of the new development servers required snapshots and images of the underlying infrastructure containers. Just the action of creating these caused the system to go down due to a lack of storage. This uncovered an underlying issue where spawned instances were not being properly cleaned out and the subsequent images were massive.</p> <p>Processes were developed to manually clean these out. Based on an increase in usage, the system subsequently went down several other times. This was then scripted and moved into daily cron. We are actively monitoring the disk utilization to ensure these processes hold and stabilize the system.</p> <h1>Continuous integration</h1> <p>A brand new Jenkins server was set up to afford opportunities to automate tasks in and between servers. Attempts were made to automate the creation of the development servers. But, there were many complications encountered, like the previous wildcard certificate used for the instances that was not scripted through LetsEncrypt. The storage issues ultimately prevented the automation from moving forward and the amount of technical complexity to make this a reality with the current system is likely not worth pursuing a complete solution. However, it’s nice to have this tool in place to move forward and maintain a platform for learning and rolling in automated improvements.</p> <h1>New SSL for the web frontend</h1> <p>During the creation of the development servers, the scripts leveraged to generate SSL certificates through LetsEncrypt were executed on the development servers multiple times due to both networking issues and updated configuration. Cleanup was required to remove some failed past attempts on the production system tied to certificate renewal. All of this work required the LetsEncrypt service to be invoked multiple times in a development-only capacity.</p> <p>Sadly, this effort caused us to hit the LetsEncrypt rate limit. Within a few days, the SimplyTest.me SSL certificate expired (at the most inopportune of times). While it required funding, this ended up being an opportunity for us to purchase and place a more permanent SSL certificate to minimize maintenance moving forward (LetsEncrypt has quarterly certificates). This was our first use of the expense system in our Open Collective to reconcile and publicly share the expense.</p> <h1>Monitoring</h1> <p>Given the expansion of infrastructure, it’s imperative to have monitoring in place. As a start, we’re leveraging the free offering of Uptime Robot, which now covers outages for all production, development, and CI infrastructure. There are opportunities over time to expand this for storage thresholds, proactive SSL certificate notifications, SSL expirations, and more.</p> <h1>Expanded donations</h1> <p>We’ve not done a great job of marketing our Open Collective because I believe firmly that people need to be informed of where SimplyTest is heading and can recognize what incentives come with their donations (aside from the service running).</p> <p>There is a lot of strategy involved and many ideas I wish to explore in the coming and future years (e.g. infrastructure for a modernized system and a paid internship to help those underrepresented in tech). However, several people in the Drupal community and the Drupal Association, has joined as backers. I can’t thank you all enough. I welcome others to join as backers and will work to outline these opportunities and vision moving forward.</p> <h1>Conclusion</h1> <p>I’ll continue to invest my time to make SimplyTest the best it can be. It’s a labor of love but one of the most rewarding and unique contributions we have in our community. I couldn’t be more confident in where this is heading and look forward to many vibrant years ahead for the service.</p> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span lang="" about="/users/admin" typeof="schema:Person" property="schema:name" datatype="">admin</span></span> <span class="field field--name-created field--type-created field--label-hidden">Fri, 01/18/2019 - 14:56</span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="/taxonomy/term/8" hreflang="en">development</a></div> <div class="field__item"><a href="/taxonomy/term/5" hreflang="en">drupal</a></div> <div class="field__item"><a href="/taxonomy/term/6" hreflang="en">people</a></div> </div> </div> <section class="field field--name-comment-node-blog-post field--type-comment field--label-hidden comment-wrapper"> </section> Fri, 18 Jan 2019 19:56:53 +0000 admin 111 at http://nerdstein.net