Pluralsight Tech Blog http://www.skateqld.org.au/?page=tech-blog/ Recent content on Pluralsight Tech Blog Hugo -- gohugo.io en-us Fri, 21 Jun 2019 00:00:00 +0000 Code Smell: Too Much Edge Case Handling http://www.skateqld.org.au/?page=tech-blog/code-smell-too-much-edge-case-handling/ Fri, 21 Jun 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/code-smell-too-much-edge-case-handling/ Recently my team was working on an API endpoint that had an edge case. The happy path was to simply insert a record. But in rare cases, that record might already exist. The way we had structured the logic, handling this case was slightly tricky. It ended up representing about half of our logic and made the endpoint harder to test. When chatting with our architect about the best way to handle this edge case we received a surprising answer. Improving the User Experience by Scaling Experimentation http://www.skateqld.org.au/?page=tech-blog/improving-the-user-experience-by-scaling-experimentation/ Fri, 07 Jun 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/improving-the-user-experience-by-scaling-experimentation/ At Pluralsight we strive to be deliberate in everything we do, especially when it comes to the product experience. Long-time readers of this blog have no doubt heard about Directed Discovery, our framework for user-centered design pioneered by Nate Walkingshaw. Product managers (PMs) have leveraged it for years to discover unmet needs and delight customers. Recently, as our data infrastructure has matured at Pluralsight we’ve examined how quantitative data gathering could be done more within Directed Discovery. Blogging as Code http://www.skateqld.org.au/?page=tech-blog/blogging-as-code/ Fri, 24 May 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/blogging-as-code/ You may have noticed that our blog recently got a facelift. While redesigning front end sites is fairly common, in our case, this represented a bigger change. We noticed that we weren’t treating our blog with the same principles we apply to the rest of our work. And so we embarked on a journey to find a better way, which lead to our current implementation. Where We Came From When we launched our tech blog in 2016, we wanted to create a way for Pluralsight engineers to share the things we were learning with the world. Moving to .NET Core: HttpModules to Middleware http://www.skateqld.org.au/?page=tech-blog/converting-http-modules-to-middleware/ Fri, 10 May 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/converting-http-modules-to-middleware/ Quite often, we need to inject custom behavior into the request processing pipeline. There are a number of ways to do this in a .NET Framework project, depending on where in the pipeline your behavior needs to take place, and how that behavior affects the rest of the pipeline. One of the most versatile ways to inject behavior was by building a custom HttpModule. While powerful, HttpModules are hard to test, and don’t integrate well with the rest of the code for your project. Learn a New Language! http://www.skateqld.org.au/?page=tech-blog/learn-a-new-language/ Fri, 26 Apr 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/learn-a-new-language/ Nowadays, the world around us is littered with calls for learning to program. They tell me if I learn to code it will change my life. A quick google search will give you a list of the numerous benefits of learning to code. If you’re like me, you may think, “I know how to code. I have been working as a software engineer for a while now. I am already an expert in my language/framework of choice. Different Types of Unit Tests http://www.skateqld.org.au/?page=tech-blog/different-types-of-unexam/ Fri, 12 Apr 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/different-types-of-unexam/ There are lots of different types of tests. There are lots of different types of automated tests. In this post we’ll talk about unit tests, specifically a few different types of unit tests and when you might want to use each. We’ll be using examples in C# using Nunit. Example Code We’ll use some example code for parts of the discussion in this post. This code takes a username and password and, assuming they match the stored username and password, will generate a signed JWT for the user and store it in a cookie. On Beyond Frameworks: Architecting for a Changing Reality http://www.skateqld.org.au/?page=tech-blog/on-beyond-frameworks/ Thu, 28 Mar 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/on-beyond-frameworks/ In my last post, I discussed the general pros and cons we found when moving from .NET Framework to .NET Core. In future posts, we’ll discuss some of the specific technical challenges we faced, and how we worked around them. Before we get too technical in our look at migrating to .NET Core, however, let’s take a moment to review the architectural choices we made before we tried to switch frameworks. Temporary Development Environments http://www.skateqld.org.au/?page=tech-blog/temporary-development-environments/ Fri, 15 Mar 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/temporary-development-environments/ Recently I joined the core team of an open source project called Sample Programs in Every Programming Language. The goal of the project is to provide a growing collection of simple programs in every programming language along with articles that explain each implementation. I quickly found that the languages which I use commonly were mostly complete, but was happy to see opportunities for languages which I am learning, but for which I have not had an opportunity to develop a full project. No Perfect Architecture http://www.skateqld.org.au/?page=tech-blog/no-perfect-architecture/ Fri, 01 Mar 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/no-perfect-architecture/ What sort of software architecture should you be implementing? When looking at industry trends, blogs, conference talks, and the like, it is easy to think that other companies have everything figured out. You’d be forgiven for wanting to copy the success that others are having. But there is no perfect architecture. Everything is a set of tradeoffs; there are only good and bad fits for a context. Context Matters I often hear people argue for the adoption of a technology or practice on the basis that “[insert successful company] does it. .NET Core: The Good, the Bad, and the Ugly http://www.skateqld.org.au/?page=tech-blog/dotnet-core-the-good-the-bad-and-the-ugly/ Fri, 15 Feb 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/dotnet-core-the-good-the-bad-and-the-ugly/ This past summer, we converted one of our production webservices from WebApi2 to .NET Core. It was a fairly involved process and ended up taking us a few months. Since it was the first time we had created a production dependency on .NET Core, we moved very deliberately, taking extra time to make sure that we had lots of testing and monitoring in place. As a result of that learning, when we transitioned a second webservice to . Destroy Your Development Environment http://www.skateqld.org.au/?page=tech-blog/destroy-your-development-environment/ Fri, 01 Feb 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/destroy-your-development-environment/ Many development environments require a fair amount of manual setup. It takes a while and is not the sort of thing you’d want to do every day. This type of setup has caused me a great deal of pain over the years. Teams I have worked with have put in varying degrees of effort to ensure their documentation is accurate. Some have even automated part or even all of the setup. Testing HTTP Calls http://www.skateqld.org.au/?page=tech-blog/testing-http-calls/ Fri, 18 Jan 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/testing-http-calls/ Making HTTP calls to get resources or call APIs is a staple of software development. But if you do not properly abstract the request construction and response handling from the HTTP library that you use, it can be extremely difficult to test. Here’s an example of some HTTP-related code we might find in C#: public User GetThatUserData(string userId) { var httpClient = new HttpClient(); var url = $"https://example.com/api/users/{userId}"; var response = httpClient. Getting Size and Position of an Element in React http://www.skateqld.org.au/?page=tech-blog/getting-size-and-position-of-an-element-in-react/ Fri, 04 Jan 2019 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/getting-size-and-position-of-an-element-in-react/ Introduction Getting the size and position of elements in React is not a great story. Each option I researched has at least one gotcha. I’ll share the best options I came up with and explain pros and cons of each. First let’s take a look at the basic way to get an element’s size and position in React. Getting the Size and Position You can use Element.getClientRects() and Element.getBoundingClientRect() to get the size and position of an element. Managing Technical Debt http://www.skateqld.org.au/?page=tech-blog/managing-technical-debt/ Fri, 21 Dec 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/managing-technical-debt/ Technical debt is a widely known metaphor which helps us think about how technical issues hurt our ability to deliver business value via software systems. But knowing the concept is different from actually managing technical debt. Unfortunately, many software teams know that they have technical debt, but don’t know what do to about it. Left unchecked, the “interest” on a team’s debt can exceed their ability to pay. The technical issues get in the way of delivering value; development slows while costs rise. Testable Javascript: Pure Functions http://www.skateqld.org.au/?page=tech-blog/testable-javascript-pure-functions/ Fri, 07 Dec 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/testable-javascript-pure-functions/ My Testing Journey The first program I wrote was on a TI-83 in high school. I wasn’t trying to write clean code. I was just trying to get it to work. I’ve since learned the value of testing. It has made my life so much easier. However, as I became more and more disciplined about writing tests, I then had the problem that I had a LOT of tests that were hard to maintain. Finish What You Start http://www.skateqld.org.au/?page=tech-blog/finish-what-you-start/ Fri, 23 Nov 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/finish-what-you-start/ I love starting hobby projects. However, I seem to hate finishing them. The GitHub description for one of my personal projects from over a year ago reads “Work in Progress: I swear I’ll finally finish this project.” It’s thrilling to set out to build something new. The initial momentum is exhilarating. Functionality starts sprouting up everywhere, progress is made, the end is in sight. Until it isn’t. Somewhere along the way, something happens, the momentum is lost, and the project is either abandoned - or the finish point becomes a perpetually dangling carrot. Practice Matters http://www.skateqld.org.au/?page=tech-blog/practice-matters/ Fri, 09 Nov 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/practice-matters/ Origami I recently gave a presentation titled “What I Learned About Software Development from Origami”. Originally it was just going to be a fun way to combine two seemingly unrelated interests of mine. But I ended up getting a valuable learning out of it. I shared a lot of pictures of origami, but the image below ended up being key to the presentation. You’ll notice this picture has two origami boxes. Finding a Community of Professionals http://www.skateqld.org.au/?page=tech-blog/finding-a-community-of-professionals/ Fri, 26 Oct 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/finding-a-community-of-professionals/ You’ve just stopped being a study group. You’ve become something unstoppable. I hereby pronounce you a community. Jeffery Winger (Community s01e01) I recently had the opportunity to speak at a local developer conference, Big Mountain Data and Dev. While preparing my talk, I was struck by how important the communities I belong to have been for me. I first learned about Pluralsight while attending the local Software Craftsmanship meetup, and without the relationships that I developed there, I probably wouldn’t be working here today. Tightening Feedback Loops http://www.skateqld.org.au/?page=tech-blog/tightening-feedback-loops/ Fri, 12 Oct 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/tightening-feedback-loops/ Feedback is the information we get back from the world in response to doing something. Without feedback, there is no way to know whether we are accomplishing our goals. In software development, there are many opportunities to use feedback to improve. Perhaps the most obvious one is getting feedback from our users, but there are many others that come before we can get our software in front of customers. Training QA staff to become developers http://www.skateqld.org.au/?page=tech-blog/training-qa-staff-to-become-developers/ Fri, 28 Sep 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/training-qa-staff-to-become-developers/ In a previous post, Jon talked about living in a world without QA. If you read that, you might be wondering: what do I do with my existing QA folks? One idea is to train them to become developers. Having started my software career in QA and transitioning from QA to dev myself, I will explore some ideas about how to do that in this post. I’ve broken the ideas into three categories: attitude, practice, and principles. System Architecture: Quality Attributes http://www.skateqld.org.au/?page=tech-blog/system-architecture-quality-attributes/ Fri, 14 Sep 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/system-architecture-quality-attributes/ When designing the architecture for an application or system of interrelated applications, it is essential to identify which quality attributes of the system are most important to the users, developers, and owners. Often this is done implicitly based on the experience and preferences of the various people participating in the project. When quality attributes are selected with intention and purpose, they help guide the design of the system. At Pluralsight, the quality attributes we focus on have evolved as the company has evolved. Pluralsight Engineering: How We Work http://www.skateqld.org.au/?page=tech-blog/pluralsight-engineering/ Fri, 31 Aug 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/pluralsight-engineering/ As engineers, how we work is important. At Pluralsight, our engineering culture and engineering practices have been carefully created and nurtured by our founders, leaders and an engineering team who care deeply about the craft of software engineering. We are particularly passionate about delivering value to our customers, and we are shaping our engineering practices to deliver amazing customer experiences. We aspire to create a workplace that engineers want to be part of. Continuous Feedback http://www.skateqld.org.au/?page=tech-blog/continuous-feedback/ Fri, 17 Aug 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/continuous-feedback/ I was sitting in a business communication class one night after work, while I was working on my MBA. Our professor played a TED talk by Mike Robbins on authenticity. Mike tells a story about a time he was facilitating a meeting at a bank that wasn’t going well because there wasn’t trust in the room. He stopped the meeting and led an exercise where everyone was challenged to be vulnerable and share with the group how they were feeling. Running Node.js in Production http://www.skateqld.org.au/?page=tech-blog/running-node.js-in-production/ Fri, 03 Aug 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/running-node.js-in-production/ Like every company working with products on the web one of the languages we use at Pluralsight is Javascript. While nearly every product engineering team uses Javascript in some form we also have around 12 of 33 teams using Node.js. Other popular languages at the company include C# and Python. This post will focus specifically on Node.js and the experience of deploying the runtime in production over the past few years. Living in a World Without QA http://www.skateqld.org.au/?page=tech-blog/living-in-a-world-without-qa/ Fri, 13 Jul 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/living-in-a-world-without-qa/ At Pluralsight our development teams do not have dedicated QA people. We also don’t have a dedicated QA team that is separate from the development team. Why do we do that? How does it work? Does No QA Mean No Testing? Quite the contrary! Not having dedicated QA people means that testing is the responsibility of the whole team, not just a few members of the team or a completely separate team. Avoiding Secondary Work http://www.skateqld.org.au/?page=tech-blog/avoiding-secondary-work/ Fri, 29 Jun 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/avoiding-secondary-work/ An important lesson I’ve learned at Pluralsight is that when we let ourselves get too busy we create additional work for ourselves. This additional work is a form of non-valuable meta-work which I refer to as secondary work. It gets in the way of doing the work that actually delivers value. Why do we let ourselves get so busy? Because we believe that if we are not busy then we must be wasting time and money. Imagining a Smarter Pluralsight http://www.skateqld.org.au/?page=tech-blog/imagining-a-smarter-pluralsight/ Fri, 15 Jun 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/imagining-a-smarter-pluralsight/ What does it mean to be a software engineer on a machine learning team? I couldn’t answer this question when I joined Dev-asauraus-rex, the first dedicated machine learning team at Pluralsight. I immediately hit the books as soon as I knew what our team’s problem space was going to be. I started watching Pluralsight courses on machine learning, refreshing my knowledge of calculus and statistics, and listening to podcasts. As I was drinking from the firehose of knowledge, I kept uncovering even more questions. Shu Ha Ri http://www.skateqld.org.au/?page=tech-blog/shu-ha-ri/ Fri, 01 Jun 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/shu-ha-ri/ There are various ways to think about people gaining and improving skills. One such way is called Shu Ha Ri. It comes from martial arts, but the underlying idea can be applied to other domains as well. Many other much smarter people than I (such as Martin Fowler and Alistair Cockburn) have already given their take on Shu Ha Ri. I would encourage you to read their words as well. Cryptographic Hashing Functions http://www.skateqld.org.au/?page=tech-blog/cryptographic-hashing-functions/ Thu, 03 May 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/cryptographic-hashing-functions/ What is a hashing function? A hashing function is a one-way function that takes some input and returns a deterministic output. The output is often referred to as a digest, a hash code, or simply a hash. Hashing functions have many uses in software. In essence, they are a tool for taking input of arbitrary length and producing a fixed length output. They are used in hash tables to provide constant time lookup. Reducing Risk by Deleting Code http://www.skateqld.org.au/?page=tech-blog/reducing-risk-by-deleting-code/ Fri, 20 Apr 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/reducing-risk-by-deleting-code/ One of my favorite activities as a software professional is to delete code. Over time, I’ve learned that this is one of the best things I can do because the ideal amount of code is no code at all. If you can deliver value without writing any code, you avoid the development and maintenance costs. And there won’t be any software bugs! A fantastic example of this comes from Pragmatic Dave Thomas1. Property-based TDD http://www.skateqld.org.au/?page=tech-blog/property-based-tdd/ Wed, 18 Apr 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/property-based-tdd/ Property-based testing is a type of testing that uses randomly generated inputs to test an attribute or characteristic of the subject under test. You can contrast this with the more traditional example-based testing approach, where you provide specific test cases for your subject under test. Typically, TDD is done using example-based testing. What happens when we use property-based testing in a TDD workflow? The tools I’m going to use are . A Remote Developer Team http://www.skateqld.org.au/?page=tech-blog/a-remote-developer-team/ Fri, 06 Apr 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/a-remote-developer-team/ I’ve never met my teammates in person. It’s an odd situation made possible by advances in telecommuting / remote work / distributed teams. Despite working with my fellow developers for a few months — at the time of writing — we’ve never had occasion to shake hands. Some Background All three of us began work at Pluralsight in offices with co-located teams. Through team changes and office closures, we found ourselves together on a distributed team stretching the full width of the continental United States. Modern Comments http://www.skateqld.org.au/?page=tech-blog/modern-comments/ Fri, 09 Mar 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/modern-comments/ I recently read a blog post arguing that comments are an important part of code, and the people who claim otherwise are missing out. While I tend to fall on the opposite side of the argument, I would certainly agree that there is a time and a place where comments in code make sense. More interestingly, I realized that I haven’t seen many explanations of why comments are sub-optimal, and when they are still important. Leaning into Eventual Consistency http://www.skateqld.org.au/?page=tech-blog/leaning-into-eventual-consistency/ Fri, 23 Feb 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/leaning-into-eventual-consistency/ Distributed systems are hard. They have a lot of moving parts with complex interactions and are inherently multi-threaded. To make them work, there is often some form of eventual consistency at play. Embracing this can make software development easier. But to embrace it, you may have to first convince yourself that many applications do not need strict consistency. This is not the normal mindset of a software developer. When data is changing, we tend to think that our users are always getting the latest values. Broadening Our Horizon http://www.skateqld.org.au/?page=tech-blog/broadening-our-horizon/ Fri, 09 Feb 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/broadening-our-horizon/ The programmer, like the poet, works only slightly removed from pure thought-stuff. He builds his castles in the air, from air, creating by exertion of the imagination…The magic of myth and legend has come true in our time. One types the correct incantation on a keyboard, and a display screen comes to life, showing things that never were nor could be. Fred Brooks; The Mythical Man Month We work in a unique industry. Managing for Autonomy http://www.skateqld.org.au/?page=tech-blog/managing-for-autonomy/ Fri, 26 Jan 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/managing-for-autonomy/ Autonomous teams are becoming increasingly prevalent in our culture, with 81% of the Fortune 10001 deploying some form of a “self-directed” team model in parts of their organization. As Dan Pink writes in his book Drive, autonomy is one of the key contributors to individual motivation. We all want to have control, rather than feeling like pawns without volition or choice. Behavioral science studies have linked autonomous motivation to greater conceptual mastery, better grades, enhanced persistence, higher productivity, less burn out, and greater levels of psychological well being. Hack Day at Pluralsight http://www.skateqld.org.au/?page=tech-blog/hack-day-at-pluralsight/ Fri, 12 Jan 2018 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/hack-day-at-pluralsight/ You’ve heard the phrase before, maybe even attended one, but what really is a hack day? What does a hack day look like at Pluralsight? Can I really work on whatever I want? Could I really create something revolutionary like Gmail, or Post-It notes? While no two hack days are the same, we’ll look at one of the longest and shortest days you can spend at work while not working. Forms of Temporal Coupling http://www.skateqld.org.au/?page=tech-blog/forms-of-temporal-coupling/ Fri, 01 Dec 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/forms-of-temporal-coupling/ Coupling is an important concept in software development because it limits the ability of software to change. Temporal coupling is a kind of coupling where code is dependent on time in some way. It is particularly insidious because it is hard to detect unless you know what you are looking for. There are three different forms of temporal coupling I’ve encountered over time. Sequencing The first form of temporal coupling is when there is some kind of ordering; one thing must happen before another. Patterns of an Eventually Consistent Bounded Context: Out of Band Healing http://www.skateqld.org.au/?page=tech-blog/eventually-consistent-patterns-out-of-band-healing/ Fri, 03 Nov 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/eventually-consistent-patterns-out-of-band-healing/ When working in a distributed system, your overall system is comprised of discrete components. These components can have different names, e.g. microservices or sub-systems. I’m going to call these discrete components “bounded contexts”, a term borrowed from Eric Evan’s book Domain Driven Design1. Sometimes these bounded contexts have the need to be eventually consistent2. This series of articles is an attempt to catalog common patterns that I’ve encountered when working with eventually consistent bounded contexts. Using systemd-notify with nodejs http://www.skateqld.org.au/?page=tech-blog/using-systemd-notify-with-nodejs/ Fri, 20 Oct 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/using-systemd-notify-with-nodejs/ What is systemd-notify and why is it helpful? Many teams at Pluralsight use systemd for application process management. When systemd starts a process, it needs to know if the process started successfully. The most simple way to do this is for systemd to wait for a bit after starting the process (perhaps 10 seconds) and simply check that the process is still running. Since you generally can’t predict exactly how long your service will take to successfully start up, this is error prone. Architecture and Architects http://www.skateqld.org.au/?page=tech-blog/architecture-and-architects/ Fri, 06 Oct 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/architecture-and-architects/ The software industry has always held a basic assumption that architecture is important. By association, the role of architect has always been esteemed important. But unfortunately, it isn’t always clear what architecture is or what an architect’s job should be. Are architects even needed, or can you just have great development teams? If they are needed, what should they be doing? Do they need to sit in ivory towers? If you don’t have people with the title “architect” do you still need people effectively doing that job? Technology Decision Delegation http://www.skateqld.org.au/?page=tech-blog/technology-decision-delegation/ Fri, 08 Sep 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/technology-decision-delegation/ In order for a technology organization to deliver products in support of a company’s mission, decisions about which technology to use and how to use it must be made regularly. Creating a strategy for making these decisions is a problem for many organizations. For small organizations, decisions are often made by seeking consensus through group discussion. As organizations grow, new strategies have to be adopted. One common, though flawed, strategy is for those early members to retain decision-making authority for the entire organization. A Perpetual Greenfield http://www.skateqld.org.au/?page=tech-blog/a-perpetual-greenfield/ Fri, 25 Aug 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/a-perpetual-greenfield/ Leave Your Legacy So you’ve started that new greenfield project. Your project directory is empty; you get to lay the foundation. With your architecture on the whiteboard, you pick your favorite tech stack and then set off to the feature-building races. Your customers are thrilled with the feature throughput; everything is polished and delivered at or ahead of schedule. Then, a degradation occurs. Maybe you’ve introduced an inheritance model that is becoming hard to work with. API Categorization http://www.skateqld.org.au/?page=tech-blog/api-categorization/ Mon, 07 Aug 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/api-categorization/ APIs are an integral part of our distributed system here at Pluralsight. We use them to communicate between and within bounded contexts. One of our engineering team mottoes is “Be Explicit.” To that end, we have a categorization system for the APIs we build and publish. This helps us know what the API is for and who should (and who shouldn’t) be using it. We have two orthogonal categories for APIs. A Day in the Life of a Pluralsight Developer http://www.skateqld.org.au/?page=tech-blog/a-day-in-the-life-of-a-ps-dev/ Fri, 30 Jun 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/a-day-in-the-life-of-a-ps-dev/ Pluralsight is different from most engineering organizations (I say without any real data). We are structured differently, from what makes up a team to how we deploy code. Let’s jump in and walk through a typical day in the life of a developer at Pluralsight. For the sake of simplicity, I will go through the day according to developers in the same time zone as our headquarters: MT (Mountain Time). Immutable Objects in C# http://www.skateqld.org.au/?page=tech-blog/immutable-objects-in-csharp/ Fri, 16 Jun 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/immutable-objects-in-csharp/ You may have heard about the benefits of immutable objects, especially from the functional programming crowd. But creating and working with immutable objects in a language like C# can be tricky. Traditional approach The usual way to do this is to create a constructor that takes all the data and assigns it to read-only properties. Luckily, making our properties truly read-only is now easier in C# 6 and no longer requires a backing field. Mob Programming http://www.skateqld.org.au/?page=tech-blog/mob-programming/ Fri, 02 Jun 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/mob-programming/ When I joined Pluralsight, I knew going in that it was going to be a different kind of company. They were already practicing things that I’d been learning about and struggling to implement in my prior company, like TDD and continuous delivery. But I didn’t realize just how different my day-to-day work would be until I found that my team was doing something called mob programming. Every day I came to work, sat down near four other developers, and we worked together on a single computer connected to two 80-inch TVs on the wall. What kind of test am I writing? http://www.skateqld.org.au/?page=tech-blog/what-kind-of-test/ Fri, 02 Jun 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/what-kind-of-test/ In pursuit of a robust test suite One common problem that I see in test suites is confusion about what each test should cover. This confusion often leads to tests that are either too broad or too focused to accomplish the goal of their creator. When writing a test, it is important to think about what kind of test it will be and the constraints that make that type of test effective. Dogma, Pragmatism and the Rule of 3 http://www.skateqld.org.au/?page=tech-blog/dogma-pragmatism-and-the-rule-of-3/ Fri, 26 May 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/dogma-pragmatism-and-the-rule-of-3/ So There I Was A few colleagues and I were happily coding away in our daily mob, writing a service that was responsible for listening to messages and persisting them to a database. We eventually arrived to this: public void HandleMessage(AddressUpdated message) { var address = new Address { Street = message.Street, City = message.City, State = message.State, Zip = message.Zip }; addressCache.Save(address); } Being the pattern junky that I sometimes am, it occurred to me that we need a mapper for mapping the AddressUpdated message to the Address model that we are persisting to the database. System Architecture: Messaging Business Events http://www.skateqld.org.au/?page=tech-blog/system-architecture-messaging-business-events/ Fri, 07 Apr 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/system-architecture-messaging-business-events/ Why did we get started with messaging? When we started on our journey towards bounded contexts, we wanted to maintain the small-team, focused, feel that we had enjoyed with as a single team supporting a monolith. One strategy we adopted was to limit our dependencies between the teams and, by extension, the different bounded contexts. We did not want to introduce temporal runtime coupling between components developed by different teams because that would reduce the autonomy of these teams and limit our ability to develop the products that we wanted to develop in the ways we wanted to develop them. Switching Databases http://www.skateqld.org.au/?page=tech-blog/switching-databases/ Thu, 23 Mar 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/switching-databases/ In the summer of 2014, Pluralsight suffered a significant outage when our primary database failed. After recovering from the immediate problem, we decided we should migrate to a completely different database to improve performance and availability. Though it took some time to complete, the transition was surprisingly simple thanks to a powerful pattern. Repository Pattern The repository pattern separates data structures from how they are persisted. A repository exposes a generic interface that hides any database details. Continuous Code Reviews http://www.skateqld.org.au/?page=tech-blog/continuous-code-reviews/ Fri, 17 Mar 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/continuous-code-reviews/ Code reviews are generally accepted as good thing in software development. Some of the benefits include improving quality, sharing knowledge of a system, and promoting collective code ownership. But how you perform a code review matters. Herding multiple people into a single room where code is projected on a screen can be a boring (and expensive) process. Tools for managing code reviews have improved things dramatically. We can now review code asynchronously. Removing Null from C# http://www.skateqld.org.au/?page=tech-blog/maybe/ Mon, 27 Feb 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/maybe/ Null references can be a source of subtle bugs in software. Maybe is a tool that, while deceptively similar, provides much greater safety. Let’s look at an example of retrieving a document from a database. First, with code that uses null. public class AccountRepository { public Account Find(string id) { /* ... */ } } // ... var account = accountRepository.Find("user-name"); Console.WriteLine(account.FirstName); By calling the Find method on the AccountRepository, we get back a reference to an account. Password Security http://www.skateqld.org.au/?page=tech-blog/password-security/ Tue, 14 Feb 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/password-security/ In an era where password breaches are all too common, it’s easy to be concerned about what companies do with user passwords. Unfortunately, in most cases it’s a black-box scenario where we can only guess at what’s going on under the hood based on clues like character or length restrictions. Sometimes it’s clear when there’s a problem (like when “forgot password” emails your password back to you), but other times there isn’t any way to know for sure. Extreme to Lean: A Pluralsight Journey http://www.skateqld.org.au/?page=tech-blog/extreme-to-lean/ Mon, 23 Jan 2017 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/extreme-to-lean/ How does Pluralsight development work? How does it compare to other tech companies? Are certain processes considered ‘best’ for me and my job? While I cannot answer these questions fully, I can share my experiences transitioning to working for Pluralsight as a software craftsman and how my views have changed during that process. I aim to show a small snapshot into the bigger picture of finding the work environment that best suits you. What Does Deployment Look Like at Pluralsight? http://www.skateqld.org.au/?page=tech-blog/what-does-deployment-look-like-at-pluralsight/ Mon, 19 Dec 2016 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/what-does-deployment-look-like-at-pluralsight/ It’s hard for code to provide value unless it’s accessible by users. If our code doesn’t provide value, why are we writing it? The way we get code into our production environments at Pluralsight has changed over time and varies somewhat from team to team, but getting code where users can get value from it is something that’s important to us at Pluralsight. So how does code get from a development machine to a production machine at Pluralsight? Leading with Learning http://www.skateqld.org.au/?page=tech-blog/leading-with-learning/ Fri, 02 Dec 2016 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/leading-with-learning/ At Pluralsight, we are very proud of our company culture. It’s truly an amazing place to work. One of the most amazing parts about our culture is the mission behind all we do: creating progress through technology that lifts the human condition. Our new values of creating with possibility, being committed to something bigger, being accountable for excellence, seeking context with intention and being our word drive our passions and lift us higher. System Architecture: Bounded Contexts http://www.skateqld.org.au/?page=tech-blog/system-architecture-bounded-contexts/ Fri, 02 Dec 2016 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/system-architecture-bounded-contexts/ Microservices architectures are currently highly fashionable. The question of how small a microservice can be is asked regularly. Is micro even small enough? Can we build pico-services? At Pluralsight, we have chosen to go a different direction. We are focusing on team size. In order to maximize throughput, how big should a team be? One pair of developers? Ten pairs of developers? For the time being, we have settled on two to three pairs of developers with a Product Manager, a UX Specialist and a DevOps Engineer. Team Responsibility http://www.skateqld.org.au/?page=tech-blog/team-responsibility/ Fri, 02 Dec 2016 00:00:00 +0000 http://www.skateqld.org.au/?page=tech-blog/team-responsibility/ What does it mean for a team to be responsible? What should a team be responsible for? How should teams be structured? In our careers, we’ve experienced pain when the answers to those questions have been ill-defined. At Pluralsight we have tried to do better, learning from the community and our own past experiences. All the Right People The first key thing we do is to structure our teams so they include all the people needed to go from an idea all the way into production.