In Defense of Verbosity
Today, Pubsub brought me Jeff’s post, “In Defense of Verbosity.” In it, he talks about (and praises) the fine expressive balance that Monad allows you to walk between terseness, and verbosity.
In an interactive session (where you care only about the output,) terseness is your friend. Take, for example, the following command that finds the 10 most referenced DLLs in running processes:
gps | select id -exp modules | group filename | sort count -des | select -f 10
That’s easy to type, but a bear to understand. If this command will die along with your history buffer, then you’ve done no harm – and saved yourself typing to boot. If you plan to enshrine this in a script, though, you need to be considerate of the poor sap that will have to eventually maintain that script. More often than not, that poor sap is you.
So, yes, Monad supports verbosity:
## Get all of the processes
$processes = get-process
## For all of the processes, expand out their Modules.
## This works like a SQL join. If you have a process object with
## ID=1234, Modules={Filename=ntdll.dll, Filename=gdi32.dll}
## then we get pseudo objects like this:
## ID=1234,Filename=ntdll.dll
## ID=1234,Filename=gdi32.dll
$allModules = $processes | select-object Id -expand Modules
## Group the results by Filename (module file name, that is)
$filenames = $allModules | group-object Filename
## Then pick the top ten.
$topTen = $filenames | sort Count -descending:$true | select -first 10
write-object $topTen
A similar philosophy holds for all programming languages, and even more importantly so. In programming, your code doesn’t vanish along with your history buffer. It becomes a maintenance task as soon as you finish writing it. How difficult a maintenance task? Well, that’s up to you.
By the way, Jeff:
[terse shorthand is often more difficult to read than terse code. This is an intentional trade-off, though, as the time spent to capture information is far more precious than the time spent to post-process it.]
[Edit: Monad has now been renamed to Windows PowerShell. This script or discussion may require slight adjustments before it applies directly to newer builds.]