A pleasant walk through computing

Comment for me? Send an email. I might even update the post!

Ability, Capability, Capacity are basically the same

This is a comment on Jonathan Cutrell's Developer Tea podcast episode Skill-Building Is Not One Dimensional

Important: I love Jonathan's podcast and consider it one of my most important resources!

So with that said, to Jonathan:

While I appreciate--and agree with!--the intent of this episode, I really have to take exception to the terminology. It reached the point of redefining--or maybe "un-defining"--words. Ability, capability, and capacity all are synonymous enough to not work well for this subject and distinctions you were trying to make.

Interestingly to me, capability and capacity ("to take in") are more closely related than ability ("to hold") and capability. Here's the skinny from the apex of resources, the Oxford English Dictionary.

Able, 1382

"able, adj., adv., and n.". OED Online. June 2021. Oxford University Press. https://www-oed-com.research.cincinnatilibrary.org/view/Entry/377?rskey=TAJpgt&result=1&isAdvanced=false (accessed July 18, 2021).

Etymology
< Anglo-Norman abil, abill, Anglo-Norman and Middle French able, habile, hable, Middle French abile, abille, habille (second half of the 12th cent. in Anglo-Norman as haiable ; end of the 12th cent. in Old French in a text from Lorraine as aule , showing vocalization of medial -b- ; French habile ) (of a person) able-bodied, muscular, powerful (second half of the 12th cent. in Anglo-Norman), (of an inanimate object or fact) suitable, fit, appropriate (second half of the 13th cent.), (of a person) competent, expert (end of the 13th cent.), legally capable, entitled, or qualified (end of the 13th cent. or earlier in Anglo-Norman, frequently with reference to ability to inherit; this use is apparently not paralleled in continental French until later (1390 with reference to ability to sue, 1461 with reference to ability to inherit)), (of a ship) seaworthy (c1440 or earlier in Anglo-Norman), (of a person) intelligent, clever (1555) < classical Latin habilis easy to handle, easily dealt with, suitable, fit for a purpose, in post-classical Latin also vigorous (5th cent.), worthy (1448 in a British source) < habēre to hold (see habit n.) + -ilis -il suffix. In senses A. 3a and A. 4 (which are apparently not paralleled in French) after classical Latin habilis. Compare Old Occitan abil (14th cent.), Catalan hàbil (1490 as †àbil ), Spanish hábil (late 14th cent.; also †abil ), Portuguese hábil (15th cent. as †abile , †aville ), Italian abile (end of the 13th cent. or earlier; also †habile ). Compare later habile adj. 4 and see discussion at that entry, and also unable adj. and later inhabile adj.

Abil, Habil, "to hold", suitable, fit

  1.  

    1. In predicative use, with for (in early use also with to). Capable of, having sufficient strength or power for; ready for, fit to cope with. Now chiefly Irish English.

    2. In predicative use, with infinitive or without complement: having the means, capacity, or qualifications to do something; having sufficient power; in such a position that a particular action is possible; worthy, qualified, competent, capable.

    Since very late Middle English or early modern English, to be able (to) has been used (with all tenses of to be) as an alternative to or replacement for can and could (see can v.1 II.) in contexts relating to ability and possibility, and is now chiefly so used. In standard English since that period can has lacked an infinitive, present participle, past participle, and gerund; to be able (to) is used to replace this verb in compounds with other auxiliaries (especially supplying a future tense and perfect tenses) and in non-finite constructions. Occurrence of a passive verb in the to-infinitive is relatively unusual, being generally limited to contexts in which to be able conveys potentiality, permission, or likelihood rather than active power. See also unable adj. 1a.

  2. Now Scottish, Irish English (northern), and Newfoundland.

    1. Of a person, the body, etc.: having general physical strength; vigorous, powerful, muscular. Cf. able-bodied adj.

    2. Of a thing (esp. a boat): strong, substantial, well built.

  3. Of a person, an achievement, etc.: having or showing general intelligence, skill, or aptitude; talented, clever. Cf. ability n. 6, habile adj. 4.

Capable, 1571

"capable, adj. and n.". OED Online. June 2021. Oxford University Press. https://www-oed-com.research.cincinnatilibrary.org/view/Entry/27354?redirectedFrom=capable (accessed July 18, 2021).

Etymology
< French capable (= Provençal capable), < late Latin capābil-em (in early theological use: see Du Cange), irregularly < Latin capĕre to take. The regular formation would have been capibilis; perhaps capābilis was influenced by capax: Beda Lib. de Orthogr. has ‘capax, qui facile capit; capabilis, qui facile capitur’ (Du Cange); so Augustine, but Cassiodorus c575 has it in the active sense = capax, as in the modern languages.

To take

  1.  

    1. Able to take in, receive, contain, or hold; having room or capacity for. Const. of, for, or infinitive. Obsolete.
  2.  

    1. absol. Able to hold much; roomy, capacious.
  3. Able or fit to receive and be affected by; open to, susceptible:

  4. Able to be affected by; of a nature, or in a condition, to allow or admit of; admitting; susceptible. Const. of, also absol.

  5.  

    1. Having the needful capacity, power, or fitness for (some specified purpose or activity). Const. of; formerly also infinitive.

Capacity, 1481

"capacity, n.". OED Online. June 2021. Oxford University Press. https://www-oed-com.research.cincinnatilibrary.org/view/Entry/27368?redirectedFrom=capacity (accessed July 18, 2021).

Etymology
15th cent. capacyte , < French capacité , < Latin capācitāt-em , noun of state < capāx , capāci- able to take in:

Able to take in

  1.  

    1. Ability to receive or contain; holding power. Obsolete (in general sense).

    2. capacity for heat, capacity for moisture, etc.: the power of absorbing heat, etc. capacity of a conductor: see quot.

    3. The power of an apparatus to store static electricity; also = capacitance n. Also attributive, denoting an apparatus which gives additional capacity, as capacity cage, capacity earth.

    4. The largest audience that a place of entertainment can hold; a situation in which a theatre, cinema, etc., is full; spec. in to capacity: with all available room occupied; hence in general use, full; to the limit.

    5. In industry: the ability to produce; equivalent to ‘full capacity’.

  2. Mental or intellectual receiving power; ability to grasp or take in impressions, ideas, knowledge.

  3. Active power or force of mind; mental ability, talent.

  4. gen. The power, ability, or faculty for anything in particular. Constr. of, for, or infinitive.

  5. The quality or condition of admitting or being open to action or treatment; capability, possibility.

Solutions to Error "Unable to connect to Web Server IIS Express"

Issue

IIS Express will occasionally not be able to start on a particular port with this error.

Unable to connect to Web Server IIS Express

In some cases, it's because another app is using that port. But often the reason is that Hyper-V has reserved one or more of the ports. To see which ports are currently excluded/reserved, run this command.

Note: all commands are in PowerShell 7 and should be run as Administrator

netsh int ipv4 show excludedportrange protocol=tcp

The result may look something like this.

Start Port    End Port
----------    --------
     50000       50059     *
     54675       54774
     54840       54939
     54940       55039
     55040       55139
     55140       55239
     55329       55428
     55429       55528

As far as I can tell, Hyper-V doesn't have a known port range it will attempt to use and work around. So, the solution is to exclude the individual ports your projects require.

You can check which ports the apps use by looking at the launchSettings.json files (assuming .NET Core). Be sure to include both the HTTP and SSL ports. Let's say, across all your projects, IIS Express will need to run on ports 44431,44435,54700,54701.

  1. Disable Hyper-V
    dism.exe /Online /Disable-Feature:Microsoft-Hyper-V
    
  2. Restart when prompted
  3. Run this script, substituting your ports
    $ports = 44431,44435,54700,54701
    
    foreach ($port in $ports) { 
        netsh int ipv4 add excludedportrange protocol=tcp startport=$port numberofports=1 
    }
    
  4. Reenable Hyper-V
    dism.exe /Online /Enable-Feature:Microsoft-Hyper-V /All
    
  5. Restart when prompted

Troubleshooting

Error: The process cannot access the file because it is being used by another process.

If you get this error when running netsh to exclude the port, the port is already excluded. It's a confusing error message.

Windows could not start the Hyper-V Virtual Machine Management service on Local Computer. Error 0x8007000e: Not enough memory resources are available to complete this operation.

If you attempt to start the Hyper-V Virtual Machine Management service and get this error, it can be caused if the Hyper-V Host Compute Service is Disabled. Open Services and set that service as Manual.

References

Configuring Iterations for Teams in Azure DevOps

I don't know how much guidance Microsoft gives on creating Iterations. This is my approach.

The Basics

Here's the Azure DevOps structure, regardless of usage:

|_Process [Work items defined]
  |_Project(s) [Iterations defined]
    |_Team(s) [Board defined, Iterations selected]
      |_Area(s) 
        |_Work Item(s) [assigned to Area and Iteration]

There's always a top-level "iteration" with the name of the project, which can't be changed. This is confusing because everything in the iteration tree is called an iteration, but in fact you should think of the tree as folders of iterations.

You configure iterations at the project level (Project Settings > Boards > Project configuration). However, a Team chooses which iterations it uses. In other words, adding iterations to the project does not add them to all teams.

While initially confusing, this gives a lot of flexiblity in the project. Everyone can be on the same sprint cycle, or individual teams can be on their own cycle.

The Most Common Configuration I Recommend

Here's how I'd set up a project that has one or two teams, which should be all that are on an Agile-based project anyway.

Notice I do not use the root level for the product backlog. Unfortunately, Microsoft doesn't help enough in setting this up.

Baskets-R-Us Website
|_Product Backlog
  |_Sprint 2021-04-16
  |_Sprint 2021-04-30

Why "product backlog"? In Team configuration > Iterations, there are two settings: Default iteration, Backlog Iteration.

Default Iteration means "when I create a new work item, which iteration is it assigned to?" The default is @CurrentIteration. This is wrong! New work items should not be automatically added to the current sprint: that's contrary to Scrum thinking. Instead, I set Default iteration to the team's product backlog iteration.

Likewise, Backlog iteration means "When we look at our backlog, which iteration is at the root?" That should be, of course, the product backlog iteration. That's why I keep the naming clean.

Both teams on this project would use the same product backlog and iterations. The teams would have independent boards and work items because by default a team has its own area.

The result is that, in sprint planning, everyone would work from the same product backlog. Assuming Scrum, the project (product) should have a single Product Owner and Scrum Master shared by the two teams. When work items are assigned to iterations, they're also assigned to the team's area, allowing each team to filter for its work items in its boards.

Naming Iterations

Where organizations often go astray is naming.

Here's one way iterations might be organized for multiple teams. Again, notice my naming.

Baskets-R-Us Website <== root level folder
|_ eCommerce Product Backlog
  |_2021-04-07
  |_2021-04-30
|_Social Media Product Backlog
  |_2021-04 05-16
  |_2021-04 19-30

In this case, the teams within the project are working very independently. They don't share a backlog, instead each team maintains its own.

Yet Another Approach

Here's another--arguably better--way to organize multiple teams on a single Scrum-based project where the teams want to use their own sprint cycles. On a single project with just a couple of team. That's probably not a good idea. Keep the teams working as closely together as possible on the same project.

This rule of thumb doesn't apply on teams across projects, who shouldn't be constrained in how they independently work. They not only should have separate DevOps projects, but should be allowed to have their own process template.

Baskets-R-Us Website <== root level folder
|_Product Backlog
  |_ eCommerce Sprints
    |_2021-04-07
    |_2021-04-30
|_Social Media Sprints
    |_2021-04 05-16
    |_2021-04 19-30

Given this organization, both teams would set their default and backlog iterations to "Product Backlog." The clear naming will help them find their iterations.

The fact that it's harder to work with the sprints might be a clue that the teams should share an iteration cycle.

The Wrong Way

Some organizations (believe) they want all employees and teams to use the same process, and even share the same backlog and board. This can be done in Azure DevOps, but frankly I think it's anti-Agile, anti-productive, and there's plenty of evidence to back me up.

Really, don't do this. It encourages a top-down, tightly-coupled, bureaucratic culture.

If you're determined, here's how you might do it by taking advantage of the little-used (for good reason) Areas feature.

Using multiple Areas should be reserved for really complex projects

Remember, work items are assigned to an Area and Iteration. What we're doing here is inverting (and subverting) the Azure DevOps structure by turning Areas into Projects.

|_MRU Process [THE Monsters-R-Us Process]
  |_Monsters-R-Us Project [The ONLY project in the entire company]
    |_MRU Team [EVERYONE including vendors. Iterations defined here. Backlog/Board defined here]
      |_Area - MRU Website
        |_Work Item(s) [assigned to Area and Iteration]
      |_Area - MRU Mobile Applications
        |_Work Item(s)
      |_Area - MRU Developer Experience
        |_Work Item(s)
      |_Area - Internal DevOps Improvements
        |_Work Item(s)

What this allows:

  • Any employee can be assigned work in any area
  • All work items are in a single, monolithic backlog that can be filtered by area
  • Single, monolithic board that can be filtered by area or person

I'm sure someone will say Tags can be used for categorization and filtering. That's true, but adds complication.

Wrap Up

Azure DevOps is a quite capable suite of features that will work for many types of organizations. Because of that, it can be challenging to understand how to configure well.

Hopefully, this helps you along toward your own success.