The Wiert Corner – irregular stream of stuff

Jeroen W. Pluimers on .NET, C#, Delphi, databases, and personal interests

  • My badges

  • Twitter Updates

  • My Flickr Stream

  • Pages

  • All categories

  • Enter your email address to subscribe to this blog and receive notifications of new posts by email.

    Join 4,225 other subscribers

Archive for the ‘Code Quality’ Category

During software quality courses, I always explain to avoid abbreviations and acronyms as they are very domain specific. It seems authz, authn differ. As do a11n,

Posted by jpluimers on 2021/07/07

Each time I teach or talk about software quality, I stress that you should not use abbreviations nor acronyms as they confuse people and make communication a lot harder.

This is not just because acronyms and abbreviations are domain specific, which makes it harder to switch domains, but also because it raises the level for people coping with things like wordblindness or dyslexia.

Recently, two new abbreviations seem to have popped up: authn and authz (don’t you love it that Wikipedia has links for them, but does not explain them?). At first I thought it had something to do with who authored some bits of a system. But I was wrong:

[WayBack] Ian Coldwater 📦💥✨ on Twitter: “authn == authentication authz == authorization… “

For an all-inclusion point of view, I was amazed at for instance a11n, and I am not alone:

[WayBack] Thread by @MattGrayYES: “Here’s a question: When I see people tweet about accessibility they hashtag . What links allies to accessibility? Googling didn’t help […]” #ally

Here’s a question: When I see people tweet about accessibility they hashtag #ally. What links allies to accessibility?
Googling didn’t help

Hahaha apparently it’s a11y not ally, as an abbreviation of accessibility. Is that ironic or what. How is anyone meant to know that‽

Apparently some people can’t be bothered to write the eleven letters between the a and the y, so swap it for “11”
Now I think of it, writing like that is so easy to read!
I3l f3d b7t: h2h b4s, s6s, b3n, b3k p5g a1d b3d b3s.

Add to that things like l10n or i18n, and dozens of other abbreviations and slowly your brain will start to melt until you realise it is too late.

So pick up your autocorrect, typing completion and other automation systems and lets get rid of acronyms and abbreviations.

Because we deserve better.

–jeroen

Read the rest of this entry »

Posted in Agile, Code Quality, Development, Software Development | Leave a Comment »

Twitter @Nick_Craver: “I’ve talked with so, so many new devs over the years and far too many are afraid to try because they’re afraid to fail. So do me a favor, share your failures […]”

Posted by jpluimers on 2021/02/04

Every now and then it is good to read back this [WayBack] thread by @Nick_Craver: “

I’ve talked with so, so many new devs over the years and far too many are afraid to try because they’re afraid to fafavor, share your failures.

So do me a favor, share your failures. Not just the successes. It’s not just about learning from them. Sometimes it’s just about people knowing they happen.

Reminder: you see the successes people are proud of and want to shout from the rooftops for all to see. Far, far fewer people share all the failures leading up to those successes. Yet those missteps are almost always far more numerous.

Hi, I’m a dev. I’ve caused more production outages that I can count. I’ve deleted a production database by accident. I’ve missed hundreds of bugs in code reviews. I try my best. I try to not repeat mistakes. It still happens sometimes. I still think my impact has been a net good.

[…]”

The thing about mistakes is that they do happen, and we need to learn from them. Almost always, it is useless to blame, but do your best to prevent them from happening again by doing blameless post-mortem.

We do however need to become better engineers, so this thread is relevant as well, because the impact of some is not been a net good:

[Cached] WayBack: thread by @www_ora_tion_ca: “This is wildly disingenuous, I speak as a flight instructor and major IT incident investigator. Modern software authors have the professional discipline of a cute puppy in comparison to aviation practitioners. […]”. quoting [WayBack] Alex Stamos on Twitter: “I agree with Chris. This is the kind of thinking that leads to “Why can’t we just have building codes for software? It worked to protect against earthquakes and fire!” Earthquakes and fire aren’t conscious adversaries. Try writing a standards document on how to win at chess.”

My biggest faults:

Read the rest of this entry »

Posted in Agile, Code Quality, Development, Software Development | Leave a Comment »

Naming is hard so look at this list when you will name things: Approved Verbs for Windows PowerShell Commands

Posted by jpluimers on 2020/04/29

Naming is number # in the Programmers’ hardest tasks so when you have to name things, read [WayBack] Approved Verbs for Windows PowerShell Commands.

It is guidance on naming schemes and lists of appropriate nouns and verbs to use in names.

–jeroen

From twitter:

$PARAMETERS = get-command | where-object {$_.CommandType -eq "Cmdlet" } | select Parameters
$PARAMETER_KEYS = foreach ($P in $PARAMETERS)
{
  foreach ($K in $($P.Parameters | select keys))
  {
    $K.Keys
  }
}
$PARAMETER_KEYS | sort-object -unique

Resulting in this list with PowerShell 5.1.18362.752 on Windows 10.0.18363.815:

AccessMode
Action
Activity
Add
AddToHistoryHandler
Adjust
After
Alias
AliasDefinitions
AliasesToExport
All
AllMatches
AllowClobber
AllowRedirection
Amended
AnsiEscapeTimeout
Any
AppDomainName
Append
AppendPath
ApplicationArguments
ApplicationBase
ApplicationName
ArgumentList
Arguments
As
AsBaseObject
AsCustomObject
AsHashTable
AsHtml
AsJob
AsSecureString
AssembliesToLoad
Assembly
AssemblyName
AsString
Attachments
Attributes
Authentication
Author
Authority
AutoRemoveJob
AutoSize
Average
BackgroundColor
BaseDirectory
Bcc
Before
Begin
BellStyle
BinaryPathName
BindingVariable
Body
BodyAsHtml
Bound
BreakAll
Breakpoint
BriefDescription
BufferSize
CancelTimeout
CanonicalName
CaseSensitive
Category
CategoryActivity
CategoryReason
CategoryResourceFile
CategoryTargetName
CategoryTargetType
Cc
CContains
CEQ
Certificate
CertificateThumbprint
CGE
CGT
Character
ChildJobState
ChildPath
Chord
CimNamespace
CimResourceUri
CimSession
CIn
Class
CLE
CLike
ClrVersion
CLT
CMatch
Cmdlet
CmdletsToExport
CNE
CNotContains
CNotIn
CNotLike
CNotMatch
CodeDomProvider
Colors
Column
Command
CommandLine
CommandName
CommandType
CommandValidationHandler
ComObject
CompanyName
CompatiblePSEditions
CompilerParameters
Completed
CompletionQueryItems
Component
Compress
ComputerName
ConfigurationName
ConfigurationTypeName
Confirm
ConnectionUri
Container
ContainerId
Contains
Content
ContentType
Context
ContinuationPrompt
Copyright
Count
Credential
CssUri
Culture
CurrentOperation
Date
Day
Days
DcomAuthentication
Debug
Debugger
DefaultCommandPrefix
DefaultDisplayProperty
DefaultDisplayPropertySet
DefaultKeyPropertySet
Definition
DefinitionName
DefinitionPath
Delay
Delimiter
DeliveryNotificationOption
DependentServices
DependsOn
Depth
Descending
Description
Destination
DestinationPath
Detailed
DifferenceObject
DingDuration
DingTone
Directory
DirectRead
DisableKeepAlive
DisableNameChecking
DisplayError
DisplayHint
DisplayName
DomainCredential
DomainName
DotNetFrameworkVersion
Drive
DriveLetter
DscResourcesToExport
EditMode
EnableAllPrivileges
EnableNetworkAccess
Encoding
End
EntryType
EnvironmentVariables
EQ
ErrorAction
ErrorId
ErrorPopup
ErrorRecord
ErrorVariable
EventArguments
EventId
EventIdentifier
EventName
Example
Examples
Exception
Exclude
ExcludeDifferent
ExcludeProperty
ExecutionPolicy
Expand
ExpandProperty
Expression
ExtraPromptLineCount
File
FileList
FileName
FilePath
FileVersionInfo
Filter
FilterScript
First
For
Force
ForegroundColor
Format
FormatsToProcess
FormatTypeName
Forward
Fragment
From
FromSession
Full
FullyQualifiedModule
FullyQualifiedName
Function
Functionality
FunctionDefinitions
FunctionsToExport
GE
Global
GroupBy
GroupManagedServiceAccount
GT
Guid
HasMoreData
Head
Header
Headers
Height
HelpInfoUri
Hidden
HideComputerName
HideTableHeaders
HistoryNoDuplicates
HistorySavePath
HistorySaveStyle
HistorySearchCaseSensitive
HistorySearchCursorMovesToEnd
HostProcessInfo
Hour
Hours
IconUri
Id
IdleTimeout
IdleTimeoutSec
IgnoreWarnings
IgnoreWhiteSpace
Impersonation
In
Include
IncludeChildJob
IncludeEqual
IncludeExtent
IncludePortInSPN
IncludeScriptBlock
IncludeTotalCount
IncludeUserName
Independent
Index
InDisconnectedSession
InFile
InformationAction
InformationVariable
InheritPropertySerializationSet
InitializationScript
InputObject
InstanceId
Is
IsAbsolute
IsNot
IsValid
ItemType
Job
JobName
Keep
Language
LanguageMode
Last
LastStatus
LE
Leaf
LicenseUri
Like
Line
List
ListAvailable
ListenerOption
ListImported
LiteralName
LiteralPath
LoadUserProfile
LocalCredential
Locale
Location
LogName
LT
Match
MaxConcurrentCommandsPerSession
MaxConcurrentUsers
MaxConnectionRetryCount
MaxIdleTimeoutSec
Maximum
MaximumHistoryCount
MaximumKillRingCount
MaximumReceivedDataSizePerCommand
MaximumReceivedDataSizePerCommandMB
MaximumReceivedObjectSize
MaximumReceivedObjectSizeMB
MaximumRedirection
MaximumSize
MaximumVersion
MaxMemoryPerSessionMB
MaxProcessesPerSession
MaxSessions
MaxSessionsPerUser
MaxTriggerCount
MemberDefinition
MemberName
MemberType
Message
MessageData
MessageResourceFile
Method
Millisecond
Milliseconds
Minimum
MinimumVersion
Minute
Minutes
Mode
Module
ModuleInfo
ModuleList
ModulesToImport
ModuleVersion
Month
MountUserDrive
Name
Namespace
Native
NE
NestedModules
NewerThan
Newest
NewName
NoClobber
NoCommonParameter
NoCompression
NoElement
NoEncryption
NoEnumerate
NoMachineProfile
NoNewline
NoNewScope
NoNewWindow
NoQualifier
NoRecurse
NoServiceRestart
NotContains
NotePropertyMembers
NotePropertyName
NotePropertyValue
NotIn
NotLike
NotMatch
NoTypeInformation
Noun
NoWait
Object
Off
OlderThan
Online
OnType
OpenTimeout
OperationTimeout
Option
Options
OUPath
OutBuffer
OutFile
OutputAssembly
OutputBufferingMode
OutputMode
OutputModule
OutputType
OutTarget
OutVariable
OverflowAction
Paging
Parameter
ParameterName
ParameterResourceFile
ParameterType
Parent
ParentId
PassThru
Path
PathType
Pattern
PercentComplete
Persist
PipelineVariable
Port
PostContent
PowerShellHostName
PowerShellHostVersion
PowerShellVersion
PreContent
Prefix
PrependPath
Priority
PrivateData
Process
ProcessIdleTimeoutSec
ProcessName
ProcessorArchitecture
ProjectUri
Prompt
PromptText
Property
PropertyNames
PropertySerializationSet
PropertyType
Protocol
Proxy
ProxyAccessType
ProxyAuthentication
ProxyCredential
ProxyUseDefaultCredentials
PSDrive
PSEdition
PSHost
PSProvider
PSSession
PSVersion
PutType
Qualifier
Query
Quiet
Raw
RawData
ReadCount
ReadOnly
RecommendedAction
Recurse
RedirectStandardError
RedirectStandardInput
RedirectStandardOutput
ReferencedAssemblies
ReferenceObject
Refresh
Registered
Relative
ReleaseNotes
RemainingScripts
Remove
RemoveFileListener
RemoveListener
Repair
RepeatHeader
Replace
RequiredAssemblies
RequiredGroups
RequiredModules
RequiredServices
RequiredVersion
Resolve
Restart
RestorePoint
RestorePointType
RetentionDays
ReturnResult
Role
RoleDefinitions
RollbackPreference
Root
RootModule
RunAs32
RunAsAdministrator
RunAsCredential
RunAsVirtualAccount
RunAsVirtualAccountGroups
Runspace
RunspaceId
RunspaceInstanceId
RunspaceName
SchemaVersion
Scope
Script
ScriptBlock
ScriptsToProcess
Second
Seconds
SecondsRemaining
SecondValue
SecurityDescriptorSddl
Sender
Separator
SerializationDepth
SerializationMethod
Server
Session
SessionName
SessionOption
SessionType
SessionTypeOption
SessionVariable
SetSeed
ShowCommandInfo
ShowError
ShowSecurityDescriptorUI
ShowToolTips
ShowWindow
SimpleMatch
Skip
SkipCACheck
SkipCNCheck
SkipLast
SkipNetworkProfileCheck
SkipRevocationCheck
SmtpServer
Source
SourceId
SourceIdentifier
SourcePath
Stack
StackName
Start
StartupScript
StartupType
State
Static
Status
Step
Stream
Strict
StringData
StringSerializationSource
Subject
SubscriptionId
Sum
SupportedCommand
SupportEvent
SyncWindow
Syntax
System
Tags
Tail
TargetObject
TargetTypeForDeserialization
TemplateContent
TemplateFile
TextFormatType
ThreadApartmentState
ThreadOptions
ThrottleLimit
Timeout
TimeoutSec
TimeToLive
Title
To
ToSession
TotalCount
Trace
TransactedScript
Transcript
TranscriptDirectory
TransferEncoding
TransportOption
Type
TypeAdapter
TypeConverter
TypeData
TypeDefinition
TypeName
TypesToProcess
UFormat
UICulture
Unbound
Unique
UnjoinDomainCredential
Unsecure
UpdateTemplate
Uri
UseBasicParsing
UseCulture
UseDefaultCredential
UseDefaultCredentials
UseNewEnvironment
UserAgent
UserDriveMaximumSize
UserName
UseSharedProcess
UseSSL
UseTransaction
UseUTF16
UsingNamespace
Value
ValueOnly
Variable
VariableDefinitions
VariablesToExport
Verb
Verbose
Version
View
ViMode
ViModeIndicator
Visibility
VisibleAliases
VisibleCmdlets
VisibleExternalCommands
VisibleFunctions
VisibleProviders
VMId
VMName
Wait
WarningAction
WarningVariable
WebSession
WhatIf
Width
WindowStyle
Word
WordDelimiters
WorkgroupName
WorkingDirectory
Wrap
WriteEvents
WriteJobInResults
WsmanAuthentication
Xml
XPath
Year

Posted in Agile, Algorithms, Code Quality, Development, Software Development | Leave a Comment »

Software quality: economics of formality

Posted by jpluimers on 2019/11/06

Interesting read: [WayBackSoftware quality: economics of formality

At one time formal methods were thought to be the only hope for software development. That did not turn out to be the case.

Via: [WayBack] Software quality is better in practice than in theory. Formal methods improve software quality, but at a high cost that is sometimes worthwhile and some… – Jeroen Wiert Pluimers – Google+

Comment there:

Pedro Marcal:

+Jeroen Wiert Pluimers +John Cook , I think that when a code has been in service for even a short time, we can divide the code into two classes. The first is that part that has been executed at least once. The other code has never been executed. The latter code has an error rate that may be measured as a function of the language used. In the old days Fortean had a bug in every seven lines. C used to be 100 to 200 lines. We set up instrumentation to determine the number of lines tested in the first class and found that it was a linear function of the new bugs found. This was a good way to ensure a high quality code.

Related:

–jeroen

Posted in Agile, Code Quality, Development, Software Development | Leave a Comment »

Writing solid code the NASA way. – Lars Fosdal – Google+

Posted by jpluimers on 2019/08/29

via [WayBack] Writing solid code the NASA way. – Lars Fosdal – Google+, I bumped into [WayBack] How To Code Like The Top Programmers At NASA — 10 Critical Rules:

Do you know how top programmers write mission-critical code at NASA? To make such code clearer, safer, and easier to understand, NASA’s Jet Propulsion Laboratory has laid 10 rules for developing software.

The rules:

  1. Restrict all code to very simple control flow constructs – do not use goto statements, setjmp or longjmp constructs, and direct or indirect recursion.
  2. All loops must have a fixed upper-bound. It must be trivially possible for a checking tool to prove statically that a preset upper-bound on the number of iterations of a loop cannot be exceeded. If the loop-bound cannot be proven statically, the rule is considered violated.
  3. Do not use dynamic memory allocation after initialization.
  4. No function should be longer than what can be printed on a single sheet of paper in a standard reference format with one line per statement and one line per declaration. Typically, this means no more than about 60 lines of code per function.
  5. The assertion density of the code should average to a minimum of two assertions per function. Assertions are used to check for anomalous conditions that should never happen in real-life executions. Assertions must always be side-effect free and should be defined as Boolean tests. When an assertion fails, an explicit recovery action must be taken, e.g., by returning an error condition to the caller of the function that executes the failing assertion. Any assertion for which a static checking tool can prove that it can never fail or never hold violates this rule (I.e., it is not possible to satisfy the rule by adding unhelpful “assert(true)” statements).
  6. Data objects must be declared at the smallest possible level of scope.
  7. The return value of non-void functions must be checked by each calling function, and the validity of parameters must be checked inside each function.
  8. The use of the preprocessor must be limited to the inclusion of header files and simple macro definitions. Token pasting, variable argument lists (ellipses), and recursive macro calls are not allowed. All macros must expand into complete syntactic units. The use of conditional compilation directives is often also dubious, but cannot always be avoided. This means that there should rarely be justification for more than one or two conditional compilation directives even in large software development efforts, beyond the standard boilerplate that avoids multiple inclusion of the same header file. Each such use should be flagged by a tool-based checker and justified in the code.
  9. The use of pointers should be restricted. Specifically, no more than one level of dereferencing is allowed. Pointer dereference operations may not be hidden in macro definitions or inside typedef declarations. Function pointers are not permitted.
  10. All code must be compiled, from the first day of development, with all compiler warnings enabled at the compiler’s most pedantic setting. All code must compile with these setting without any warnings. All code must be checked daily with at least one, but preferably more than one, state-of-the-art static source code analyzer and should pass the analyses with zero warnings.

–jeroen

PS: twitter comment

“All code must compile with these settings without any warnings” – I absolutely agree with this. It really annoys me to find code which people have shipped which generates warnings. They’re there for a reason and should be fixed! 👍

Posted in Agile, Code Quality, Conference Topics, Conferences, Development, Event, Software Development | Leave a Comment »

 
%d bloggers like this: