Skip to content

Commit a9ceb20

Browse files
committed
Add missing pages
1 parent e258e02 commit a9ceb20

File tree

3 files changed

+188
-2
lines changed

3 files changed

+188
-2
lines changed

blog/2010/dns-aliasing.html

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<title>DNS aliasing: panacea?</title>
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<meta name="description" content="">
8+
<meta name="author" content="">
9+
<meta name="keywords" content="">
10+
<meta name="generator" content="JBake">
11+
12+
<!-- Le styles -->
13+
<link href="../../css/bootstrap.min-3.3.7.css" rel="stylesheet">
14+
<link href="../../css/asciidoctor.css" rel="stylesheet">
15+
<link href="../../css/base.css" rel="stylesheet">
16+
<link href="../../css/prettify.css" rel="stylesheet">
17+
18+
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
19+
<!--[if lt IE 9]>
20+
<script src="../../js/html5shiv.min.js"></script>
21+
<![endif]-->
22+
23+
<!-- Fav and touch icons -->
24+
<!--<link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
25+
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
26+
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
27+
<link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">-->
28+
<link rel="shortcut icon" href="../../favicon.png">
29+
</head>
30+
<body onload="prettyPrint()">
31+
<div id="wrap">
32+
33+
<!-- Fixed navbar -->
34+
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
35+
<div class="container">
36+
<div class="navbar-header">
37+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
38+
<span class="sr-only">Toggle navigation</span>
39+
<span class="icon-bar"></span>
40+
<span class="icon-bar"></span>
41+
<span class="icon-bar"></span>
42+
</button>
43+
<a class="navbar-brand" href="../../">iNCo5.com</a>
44+
</div>
45+
<div class="navbar-collapse collapse">
46+
<ul class="nav navbar-nav">
47+
<li><a href="../../index.html">Home</a></li>
48+
<li><a href="../../about.html">About</a></li>
49+
<li><a href="../../feed.xml">Subscribe</a></li>
50+
</ul>
51+
</div><!--/.nav-collapse -->
52+
</div>
53+
</div>
54+
<div class="container">
55+
<div class="page-header">
56+
<h1>DNS aliasing: panacea?</h1>
57+
</div>
58+
59+
<p><em>18 June 2010</em></p>
60+
61+
<p><p>One tool that seems to be underused, at least in most corporations I’ve worked at, is the trusty DNS alias (called a CNAME record). Pretty much everybody understood the value of using DNS names as opposed to IP addresses (with some minor, unmentionably dull exceptions) but it wasn’t until I was at Sprint that I saw use of aliases. Even at that, they were just beginning to make use of them, having built a great many interdependent systems without the use of aliases, which is, as we shall see, problematic for just about everyone. So, from here, I will assume that you, the reader, are not so poorly configured as to have servers directly addressing each other by IP address. If you do, fix that problem first; come back to this when you’re done.</p>
62+
<p>What happens when you build a number of multi-tier applications? You start to see a proliferation of interconnected servers, with applications, databases, services, etc. all communicating with each other. What’s the problem? Change. Change becomes very difficult. The reason is that as the number of systems grow, it becomes increasingly difficult to know exactly which servers each application depends on. In fact, addressing systems by a single host name is really no different than using IP addresses in a multi-tier scenario.</p>
63+
<p>Let’s try a hypothetical scenario. If I have a dozen database servers, say <code>db01 - db12</code>, what happens when I want to build a new server and use it as a replacement for the existing <code>db-08</code>? Well, in order to migrate existing applications, we will have to rename the existing <code>db08</code> and name the new server <code>db08</code>. This is a bad idea. The alternative, typical way is not much better: alter the configuration of every system that depends upon <code>db08</code> to point to the new <code>db13</code>. Particularly if configuration changes require restarts for your applications, you can see that downtime is more or less inevitable.</p>
64+
<p>Now, if you had chosen to do what I propose, which is to use DNS aliases, not only do you not suffer the problems I described, you also gain certain advantages. But I guess at this point I should digress with an example of a DNS aliasing scheme, so that the situation is clear. With aliasing, the goal is to name systems according to their business or application function. So if we have, say, a payroll application, we can use “payroll” as an alias for the server hosting payroll. Now certainly a database will be needed, so we might call it something like <code>payroll-oltp</code>, and perhaps have a separate <code>payroll-olap</code> for reporting purposes. We can also assume that this is a legacy system with a newly-built web front-end, which we can call <code>payroll-web</code>. Now, it is quite possible that all four of these aliases could point to one and the same server: this does not matter for my hypothetical scenario. The point is, each application should have its own unique set of aliases.</p>
65+
<p>Now that we have our aliases set up, what happens if we decide our database is too slow? Well, assuming we can do real-time replication, we set that up and then simply alter the DNS alias to point to the new server, and (assuming no application restarts are necessary) things will continue to function as normal. Obviously I’m oversimplifying, but the point is that you have separated your application’s resource concerns from your physical hardware implementation. Your application’s configuration has been decoupled from your DNS configuration.</p>
66+
<p>I should also point out that clients (users) can also benefit from aliasing. If you have hundreds of users connecting to <code>http://swds19/</code> to access an application and you decide to migrate it to <code>http://swdx30/</code>, not only do you have to tell the users, they have to update any bookmarks they have. Any documentation containing this information, such as training materials, would also need to be changed. By using a well-thought-out alias, you protect yourself against change and avoid confusing and frustrating your users. Should you continue to use your standard naming convention to address each server? Absolutely. However, those types of names are for administrators, not for applications, and most certainly not for users. Under my proposed schema, every host should have a minimum of 2 names: a conventional name for sysadmins, and a meaningful alias for an application or its end users.</p>
67+
<p>By now you must be saying, aren’t there some drawbacks to this? Well, it does mean a little administrative overhead to manage the DNS records. It also means you have to actually think in order to choose good aliases. (Choosing bad ones may come back to haunt you.) Particularly if you have a robust development/QA lifecycle, there may be more administrative work, since you have many more systems to work with. Yes, there is some overhead with this strategy, but I think in most situations it will more than pay for itself over time.</p>
68+
<p>Remember: choose an alias based on the function the system is intended to perform. It is perfectly fine to have many aliases pointing to the same system. Going back to the database scenario, if we have 15 applications that all use the same database server, yes, that means we would have 15 DNS aliases. It also means we can move any of those 15 databases and the only hard work is dealing with the individual database in question. Change is inevitable, but it doesn’t always have to be painful. Changing CNAME records is pretty easy compared to most alternatives. It’s not a panacea, but it solves a lot of problems before they become problems.</p></p>
69+
70+
<hr />
71+
72+
</div>
73+
<div id="push"></div>
74+
</div>
75+
76+
<div id="footer">
77+
<div class="container">
78+
<p class="muted credit">&copy; 2017 | Mixed with <a href="http://getbootstrap.com/">Bootstrap v3.3.7</a> | Baked with <a href="http://jbake.org">JBake v2.5.1</a></p>
79+
</div>
80+
</div>
81+
82+
<!-- Le javascript
83+
================================================== -->
84+
<!-- Placed at the end of the document so the pages load faster -->
85+
<script src="../../js/jquery-1.11.1.min.js"></script>
86+
<script src="../../js/bootstrap.min-3.3.7.js"></script>
87+
<script src="../../js/prettify.js"></script>
88+
89+
</body>
90+
</html>

blog/2014/role-based-thinking.html

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8"/>
5+
<title>Role-based thinking – an experiment</title>
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
7+
<meta name="description" content="">
8+
<meta name="author" content="">
9+
<meta name="keywords" content="">
10+
<meta name="generator" content="JBake">
11+
12+
<!-- Le styles -->
13+
<link href="../../css/bootstrap.min-3.3.7.css" rel="stylesheet">
14+
<link href="../../css/asciidoctor.css" rel="stylesheet">
15+
<link href="../../css/base.css" rel="stylesheet">
16+
<link href="../../css/prettify.css" rel="stylesheet">
17+
18+
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
19+
<!--[if lt IE 9]>
20+
<script src="../../js/html5shiv.min.js"></script>
21+
<![endif]-->
22+
23+
<!-- Fav and touch icons -->
24+
<!--<link rel="apple-touch-icon-precomposed" sizes="144x144" href="../assets/ico/apple-touch-icon-144-precomposed.png">
25+
<link rel="apple-touch-icon-precomposed" sizes="114x114" href="../assets/ico/apple-touch-icon-114-precomposed.png">
26+
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="../assets/ico/apple-touch-icon-72-precomposed.png">
27+
<link rel="apple-touch-icon-precomposed" href="../assets/ico/apple-touch-icon-57-precomposed.png">-->
28+
<link rel="shortcut icon" href="../../favicon.png">
29+
</head>
30+
<body onload="prettyPrint()">
31+
<div id="wrap">
32+
33+
<!-- Fixed navbar -->
34+
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
35+
<div class="container">
36+
<div class="navbar-header">
37+
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
38+
<span class="sr-only">Toggle navigation</span>
39+
<span class="icon-bar"></span>
40+
<span class="icon-bar"></span>
41+
<span class="icon-bar"></span>
42+
</button>
43+
<a class="navbar-brand" href="../../">iNCo5.com</a>
44+
</div>
45+
<div class="navbar-collapse collapse">
46+
<ul class="nav navbar-nav">
47+
<li><a href="../../index.html">Home</a></li>
48+
<li><a href="../../about.html">About</a></li>
49+
<li><a href="../../feed.xml">Subscribe</a></li>
50+
</ul>
51+
</div><!--/.nav-collapse -->
52+
</div>
53+
</div>
54+
<div class="container">
55+
<div class="page-header">
56+
<h1>Role-based thinking – an experiment</h1>
57+
</div>
58+
59+
<p><em>12 November 2014</em></p>
60+
61+
<p><p>I have <a href="../2010/dns-aliasing.html">previously written</a> about the importance of thinking in terms of functional behavior rather than merely in terms of capability. That is, why we are doing something is at least as important as how we are doing it. Now, maybe I’ve been overdoing the whole Scrum thing lately (not likely), but I’ve started thinking more in terms of roles when I formulate tasks for my team. My old way of thinking (which I still frequently fall back into) goes something like this:</p>
62+
<blockquote>
63+
<p>We have a lot of technical debt. We need to remove unused dependencies from our build. We need to improve our test coverage. We need to improve our release process. We need to be able to onboard new team members more easily. We need a more robust continuous integration environment. We need to make troubleshooting easier for production support. We need to fully externalize our application configuration. We need to minimize the impact of poor change management on the part of our upstream dependencies….</p>
64+
</blockquote>
65+
<p>There’s nothing wrong with working through a task list such as this, but it does have shortcomings. First, it (often) leads us to prioritize personal preference over team productivity. When each team member pursues these types of activities in isolation, the outcome is not always generalizable and so the impact is dampened.</p>
66+
<p>Second, it is difficult to justify these activities from a business perspective. The way I formulated the descriptions, there are no real quantifiable outcomes. While the objectives all sound good, we have to ask, what is the opportunity cost here? What are the tangible benefits to the team members who aren’t engineers? What are the benefits to the stakeholder the team is trying to serve?</p>
67+
<p>Finally, these sorts of to-do lists are often very difficult to estimate against. How do we know when is a task done? Which parts of the task have highest priority? The answer, typically, is when the person who completes the task is happy with the result. That’s not very well-structured, and in fact it smells like an anti-pattern. (Like when engineers write acceptance tests. But I digress.)</p>
68+
<p>So, my experiment, (which is ongoing, so I don’t have outcomes to report), is to take the concept of a user story and extend it to the various functional roles within our team. So there will be “role stories” but they can be formulated as typical user stories, and I will refer to them as user stories throughout. This concept is actually not unusual, or shouldn’t be, but I’ve only seen hints of this thinking on teams that I’ve worked with. I’m describing it here for my own benefit and because I assume many other teams out there fail to take a structured approach to self-organizing. (Certainly true of most of the teams I have worked on.)</p>
69+
<p>So the first user stories from my example would belong to the build manager. <em>As a build manager I need to remove unused dependencies from our modules…</em> etc. By formulating the tasks in this way, we can not only improve the quality of the product (which will benefit the stakeholder), we allow team members to have input into the tasks that they are assigned. It is a mechanism to address stressors and productivity inhibitors. This improves morale, and, done correctly, improves competence.</p>
70+
<p>The next story would be for the quality assurance role. It would go something like this: <em>as the quality assurance owner, I want to improve our test coverage so that defects raised by testers are reduced by at least 50%. Acceptance criteria will be branch coverage of 80% in the following problem modules: …</em> Of course, if the testers continue to raise defects, the issue would need to be revisited. Presumably the team would agree that this story makes sense, and would be able to break it down into small tasks, which should always be done.</p>
71+
<p>The next problem, facilitating team growth, is one that has been a struggle for most teams I’ve worked on. For that reason, I tend to think that it’s a difficult problem to solve. It can often be decomposed into small tasks and the burden shared among multiple members of the team, which I see as an upside. As a team member, I want to assist new team members by reducing the time it takes them to begin being productive without impacting the delivery of the sprint backlog. I’ll know this is possible when we have an accurate deployment diagram, a project overview guide, and a workstation setup guide.</p>
72+
<p>Where this thought experiment starts to get interesting is when we think about maintaining the “product” of these user stories. (Something the product owner really should care about.) So when a backlog shows a story like, <em>as a product user I need to be able to search for widgets</em>, we see that there are implied user stories (role stories!) that exist in parallel. That is, <em>as an engineer I need to create a Maven project that exposes an HTTP-based search API</em>, and also, <em>as a build manager I need to add new projects into our continuous integration environment</em>, and of course <em>as a test designer, I need to write functional tests against all HTTP-based services using <a target="_blank" href="http://www.soapui.org/">SoapUI</a></em>. (You do test your code, right?) So the interesting property of this thought experiment is the natural decomposability of user stories into tasks, and those tasks are themselves a sort of user story (role story, in my terminology). Add stories for a technical writer, deployment manager, and production support team and you’ve avoided a lot of technical debt.</p>
73+
<p>The other point that must be mentioned, thought it is obvious, is that the tasks associated with these stories may be completed by the same person. One person may perform multiple functional roles. For example, a tech lead may often function as an engineer, team growth facilitator, build manager, documentation maintainer, etc., possibly all within the same day.</p>
74+
<p>Functional decomposition, which is really all I’m talking about, helps to narrow the scope of a task in order to make it manageable. Whether we’re writing use cases, user stories, software, or documentation, functional decomposition is an important tool that is often ignored yet very valuable.</p></p>
75+
76+
<hr />
77+
78+
</div>
79+
<div id="push"></div>
80+
</div>
81+
82+
<div id="footer">
83+
<div class="container">
84+
<p class="muted credit">&copy; 2017 | Mixed with <a href="http://getbootstrap.com/">Bootstrap v3.3.7</a> | Baked with <a href="http://jbake.org">JBake v2.5.1</a></p>
85+
</div>
86+
</div>
87+
88+
<!-- Le javascript
89+
================================================== -->
90+
<!-- Placed at the end of the document so the pages load faster -->
91+
<script src="../../js/jquery-1.11.1.min.js"></script>
92+
<script src="../../js/bootstrap.min-3.3.7.js"></script>
93+
<script src="../../js/prettify.js"></script>
94+
95+
</body>
96+
</html>

feed.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
<atom:link href="https://nathansgreen.github.io/feed.xml" rel="self" type="application/rss+xml" />
77
<description>JBake Bootstrap Template</description>
88
<language>en-gb</language>
9-
<pubDate>Tue, 23 May 2017 11:37:48 -0500</pubDate>
10-
<lastBuildDate>Tue, 23 May 2017 11:37:48 -0500</lastBuildDate>
9+
<pubDate>Tue, 23 May 2017 11:42:01 -0500</pubDate>
10+
<lastBuildDate>Tue, 23 May 2017 11:42:01 -0500</lastBuildDate>
1111

1212
<item>
1313
<title>Unit Tests as Experiments</title>

0 commit comments

Comments
 (0)