A pleasant walk through computing

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

Flatt's Favorite Development Tools 2024

CONTENTS

My Ode to Scott Hanselman

Scott, you are right, this post took so long!
I could have coded an app. I could have written a song.
But I've yearned to promote my fave tools for years
For the public to read, even if nobody cares.

You're a tool nerd for sure, an App User Supreme
Trying utils in numbers I could only (of) dream.
You pointed the way, you're a software sensei,
Here's my kata in prose, my Tao (meaning "way").

You make coding real cool
Thank you, dude, and stay well.

Scott Hanselman's 2021 Ultimate Developer and Power Users Tool List for Windows - Scott Hanselman's Blog

Why Do Tools Matter?

Let me ask you something? Could you build a house using just a hand saw, hammer, manual drill, and ruler?

Well, sure you could. But why in the world would you?

The DevOps Research and Assessment (DORA) group have conistently found that when software teams can choose their own tools they are more productive and deliver higher quality work.

"Teams that can choose which tools to use do better at continuous delivery. No one knows better than practitioners what they need to be effective."

Developers are power users. In organizations, they need to be entrusted with the security privileges to easily install and remove software. That's part of their job. Which isn't to say their tools shouldn't be audited. That's good security. But security departments should partner with developers and operations to reduce friction to developing valuable software. That's a responsible use of time and funds. Removing barriers to tool choice, along with practical security measures, is analogous to letting your skyscraper contractors use whichever tools they need while following safety protocols.

Below are most of the tools I consider essential in my kit today. They've proven their worth over years and years. The list below includes some apps for SQL data reporting that may not be applicable to your environment. I'm missing several testing tools that the QA person on a team would require. Hopefully I can update with those in the future. I also include some design and testing tools that maybe you don't need to sling code but are valuable on a team. Or maybe you should try them and see!

I'm a Microsoft stack developer and my choices reflect that.

By Requirement

While all of the tools and utilities in this article are valuable, there are some without which development can't practically be done.

Must Have

  • Visual Studio
  • Visual Studio Code
  • Git for Windows
  • PowerBI Desktop
  • SQL Server Developer
  • SQL Server Management Studio
  • PowerShell 7
  • Insomnia
  • Telerik Fiddler
  • ShareX
  • Balsamiq Wireframes

High Value

  • Everything else!

Note It was hard leaving LINQPad out of the Must Have section. I'd hate to be without it; the ROI is incredibly high. But it's not--technically--essential.

By License Type

The only types listed here are Free and Licensed. Some apps (such as LINQPad) have free versions that aren't adequate for daily, high-performance use. In those cases, they're listed as Licensed.

Licensed

  • Visual Studio
  • LINQPad
  • Balsamiq Wireframes
  • UltraFileSearch

Free

  • Visual Studio Code
  • Git for Windows
  • PowerBI Desktop
  • SQL Server Developer
  • SQL Server Management Studio
  • PowerShell 7.x
  • Notepad++
  • Azure CLI
  • Windows Terminal
  • Windows Package Manager (winget)
  • NVM for Windows
  • ShareX
  • Microsoft Remote Desktop (RDC) Manager
  • 7-zip
  • Oh-My-Posh
  • KDiff3
  • Insomnia
  • Telerik Fiddler
  • FreeCommander XE
  • Oracle VirtualBox
  • Inkscape
  • Paint.Net

By Security

Many apps require UAC to install, but don't require admin rights to run. They may also require UAC with an exe/winget installer but also have portable versions. Apps are categorized below by least-needed privilege. For example, Git for Windows need UAC for the exe installer but not for portable, so it's listed under portable. Likewise if it's non-UAC but also has a portable, then the app is listed as portable.

While portable apps are viable, I recommend using an installer--winget is ideal!--whenever possible. This makes it much easier to keep software up to date and secure.

Install UAC = true

  • Visual Studio
  • PowerBI Desktop
  • SQL Server Developer
  • SQL Server Management Studio
  • Azure CLI
  • Windows Package Manager (winget)
  • NVM for Windows
  • 7-zip
  • KDiff3
  • Telerik Fiddler
  • Balsamiq Wireframes
  • UltraFileSearch
  • Oracle VirtualBox

Install UAC = false

  • Visual Studio Code
  • Oh-My-Posh

Portable

  • Git for Windows
  • PowerShell 7
  • LINQPad
  • Notepad++
  • Windows Terminal
  • ShareX
  • Microsoft Remote Desktop (RDC) Manager
  • Insomnia
  • Ditto
  • FreeCommander XE
  • Inkscape
  • Paint.Net

By Category

These categories are kind of loose, but helped me understand my own tool use.

Development

  • IDEs and Editors
    • Visual Studio
    • Visual Studio Code
    • LINQPad
    • Notepad++
  • Version Control
    • Git for Windows
  • Terminals and Shells
    • PowerShell 7.x
    • Windows Terminal
    • Oh-My-Posh
  • Software Management
    • Window Package Manager (winget)
    • NVM for Windows
  • Diff and Merge
    • KDiff3
  • Debugging
    • Insomnia
    • Telerik Fiddler
  • Other
    • Azure CLI
    • Microsoft Remote Desktop (RDC) Manager

Design

  • Balsamiq Wireframes
  • Visio
  • Inkscape
  • Paint.Net

Testing

  • Oracle VirtualBox

Data

  • PowerBI Desktop
  • SQL Server Developer
  • SQL Server Management Studio
  • Oracle IDE of some kind

General Utilities

  • 7-zip
  • Ditto
  • UltraFileSearch
  • Ditto
  • FreeCommander XE

Documentation and Support

  • ShareX

The Tools

Visual Studio

https://visualstudio.microsoft.com/downloads/

UAC: Y
COSTS: Free | Individual 45/user/mo | Enterprise 240/user/mo
INSTALLATION: exe, winget

DESCRIPTION

Visual Studio has provided perhaps the best IDE for decades. Not using it for most Microsoft stack development would be like not designing skyscrapers using computer-aided design.

Visual Studio Code

https://code.visualstudio.com/download

UAC: N
COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

Several years ago Microsoft went from having the world's simplest text editor--Notepad--to creating one of the best text editors available on any platform. VS Code out of the box includes amazing features including file comparison and Git support. Its tens of thousands of extensions let you be super-productive.

Git for Windows

https://gitforwindows.org/

UAC: Y (exe, winget) N (zip) COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

Git is the de facto version control system today and Git for Windows is the must-have tool for Windows users.

PowerBI Desktop

https://www.microsoft.com/en-us/download/details.aspx?id=58494

UAC: Y
COSTS: Free
INSTALLATION: exe, winget,

DESCRIPTION

If you're creating PowerBI reports, you need this application.

SQL Server Developer

https://www.microsoft.com/en-us/sql-server/sql-server-downloads

UAC: Y
COSTS: Free
INSTALLATION: exe, winget

DESCRIPTION

When developing against a SQL database there are two local choices: Developer or Express. Developer is the superior choice because it includes all the same features as SQL Server, letting you develop with parity.

SQL Server Management Studio

https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms

UAC: Y
COSTS: Free
INSTALLATION: exe, winget

DESCRIPTION

There are other really good SQL tools, but SSMS is still the best overall.

PowerShell 7.x

https://learn.microsoft.com/en-us/powershell/

UAC: Y (exe, msi, winget) N (zip, msixbundle, dotnet) COSTS: Free
INSTALLATION: exe, msi, winget, zip, msixbundle, dotnet

DESCRIPTION

There's a version of PowerShell that's pre-installed in Windows called, naturally, PowerShell for Windows. But the latest version of PowerShell--version 7--is what you want to use. It has new features and is cross-platform. It's also what's used by Azure DevOps Pipelines, so if you're writing PowerShell scripts for ADO you want to use the same version.

LINQPad

https://www.linqpad.net/

UAC: Y (exe, winget) N (zip)
COSTS: Free | Individual 125/major ver | Team 10-user 850/major ver
INSTALLATION: exe, winget, zip

DESCRIPTION

There are a few tools I always pay for because they save me (and my client or employer) ten times over. One of those is LINQPad. In truth, I only occassionally use it for database querying. I mostly use it for code prototyping, debugging, and utilities. I'd estimate using this tool saves me a couple hundred hours a year. You need to buy a license to get Intellisense and other features. It's a bargain.

Notepad++

https://notepad-plus-plus.org/downloads/

UAC: Y (exe, winget) N (zip) COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

Nowadays I use VS Code for most of my text editing. But Notepad++ still has features that make it valuable to install. For example, it has excellent search-in-files where results are output to a separate pane. I've also found it integrates better into Git as the default editor for things like git commit --amend

Azure CLI

https://learn.microsoft.com/en-us/cli/azure/

UAC: Y
COSTS: Free
INSTALLATION: winget, msi

DESCRIPTION

Sometimes you can gain real automation benefits by writing command line tools. Accessing Azure Portal and Azure DevOps via a CLI is very helpful. Here's one use case: A script that runs a batch of DevOps pipelines.

Windows Terminal

https://learn.microsoft.com/en-us/windows/terminal/

UAC: N
COSTS: Free
INSTALLATION: winget, zip, msixbundle

DESCRIPTION

When Microsoft decided to finally create a professional terminal they delivered in spades. Windows Terminal can run many shells--command, PowerShell, Bash--in a modern tabbed interface. In Windows 11 it has offically replaced the ancient command prompt.

Windows Package Manager (winget)

https://learn.microsoft.com/en-us/windows/package-manager/winget/

UAC: Y
COSTS: Free
INSTALLATION: msixbundle

DESCRIPTION

Winget is apt-get for Windows. It's Microsoft's answer to Chocolaty. It's built into Windows 11. And it's categorized by Microsoft as a developer tool. It's the easiest way to install and upgrade local software, saving developers hours of time. It reduces friction to keeping software up-to-date, which is great for security. For onboarding, a simple script can be created that allows setting up a development machine in 20 minutes instead of two (or more!) hours.

In short, winget is a great productivity tool fully supported by Microsoft.

NVM for Windows

https://github.com/coreybutler/nvm-windows

UAC: Y
COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

Developing apps using Node has a drawback: by default you can only have one version installed at a time. The solution is Node Version Manager (nvm) for Windows. This mighty tool needs to run with Admin privileges because it installs and switchs the currently active Node version. It's a critical, time-saving tool for situations like upgrading versions.

ShareX

https://getsharex.com/

UAC: Y (exe, winget) N (zip)
COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

You can pay for SnagIt and get an adequate experience. Or you can not pay for ShareX and customize your experience to be super-efficient. The time to learn this tool is well worth it. I use screen shots every day for writing documentation, creating bug reports, posting questions to other developers. Taking and editing screen shots should be as frictionless as possible. No other tool I've used does it better. You can even perform decent OCR and make short screen recordings and GIFs (very helpful for training). ShareX probably saves me a hundred hours a year.

Microsoft Remote Desktop (RDC) Manager

https://learn.microsoft.com/en-us/sysinternals/downloads/rdcman

UAC: N
COSTS: Free
INSTALLATION: winget, zip

DESCRIPTION

Sometimes you only have to log into one or two servers using Remote Desktop. But other times you need to log into quite a few and bounce back and forth between them. That's when RDC Man, from the venerable Sysinternals (part of Microsoft), is your friend. It's just a way of launching and organizing RDP sessions, but man is it helpful!

7-zip

https://www.7-zip.org/download.html

UAC: Y
COSTS: Free
INSTALLATION: exe, msi, winget

DESCRIPTION

Windows has Zip decompression built in. But 7-zip is still the tool to install when you regularly deal with compressed files. And developers deal with compressed files all the time. It's the best utility for the job, plus the 7z compression is amazing.

Oh-My-Posh

https://ohmyposh.dev/

UAC: N
COSTS: Free
INSTALLATION: exe, winget, powershell

DESCRIPTION

I do most of my Git work at the command line. I take advantage of aliases and the power that Visual Studio and VS Code don't have. The smartest thing I did a couple of years ago was install Oh-My-Posh so I can, at a glance, know the status of my repo. Just this utility has saved me from making dumb mistakes that would have cost me hours of time. I'd be foolish not to use it.

KDiff3

https://download.kde.org/stable/kdiff3/?C=M;O=D

UAC: Y
COSTS: Free
INSTALLATION: exe, winget

DESCRIPTION

I'll admit right now I've never used Beyond Compare. I should evaluate it, for sure. In the meantime, what other file diff/merge tools are out there? VS Code does a good job and can be called from the Git CLI. Visual Studio's diff/merge isn't quite as good in my opinion. WinMerge--another free tool--is nice but doesn't open well from Git CLI. But it does compare folders, which VS and Code don't. And then there's KDiff3. It's hard to find the latest version of this tool, so use the link above. What I like about KDiff3 above the other tools is:

  • Opens quickly from Git CLI
  • Has the clearest 3-way merge experience
  • Shows character diffs
  • Has a good folder diff

Honestly, no tool magically resolves Git merge conflicts. They're all taking their best guess. So find a tool or two you like.

Insomnia

https://github.com/Kong/insomnia
https://insomnia.rest/

UAC: N
COSTS: Free | |Individual 5/mo | Team 12/user/mo INSTALLATION: exe, winget, zip

DESCRIPTION

Postman is the big name tool for testing web services (e.g. REST APIs). But I . . . kind of . . . don't like it. Insomnia just seems like a tool focused on making the work easier, not selling me licenses. In fact, to use it for free, download from GitHub, install choosing local, and use the local scratch pad. I admit, that path is a little hidden, but it's a great way to try out the tool long term.

For QA departments, Postman may be a smarter tool and maybe it's good for developers, too. But I'd give Insomnia a fair chance.

Telerik Fiddler

https://www.telerik.com/download/fiddler

UAC: Y
COSTS: Free
INSTALLATION: exe, winget

DESCRIPTION

I don't reach for Fiddler every day. But on those days I need to know exactly what's going on with my web app traffic, I could either guess for hours or I can run Fiddler and know if a few minutes. It's an essential tool for that reason.

Ditto

https://ditto-cp.sourceforge.io/

UAC: Y (exe, winget) N (zip)
COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

A utility I didn't know I needed until I had it, Ditto was demonstrated to me by a colleague a couple of years ago. I'm amazed how often I use it, not only for simple cases (I copied something to the clipboard ten minutes ago and have since copied over it. Ditto lets me get that previous copy) but for some power-user situations. I've used it to make several dozen entries where I needed to use three or four different copy-paste operations. A real time-saver!

Balsamiq Wireframes

https://balsamiq.com/wireframes/desktop/

UAC: Y
COSTS: Trial | Individual 129/maj ver | Cloud 2 project 90/year, 20 project 490/year (unlim users)
INSTALLATION: cloud, exe, msi, winget (To install w/o UAC, VC Redist must already be installed)

DESCRIPTION

I love Balsamiq. I've used it for years. It's delightful. It's keyboard-centric, making it quick to create wireframes. The results are, by design, low-fidelity, which signals to customers and users "this is not the final design." The cloud version has collaboration features (which I haven't used). Most of all, the company has made it a joy to use.

UltraFileSearch

https://www.ultrafilesearch.com/

UAC:Y
COSTS: Trial | Individual 25/maj ver | Team(5) 20/user/maj ver
INSTALLATION: exe, msi, zip

DESCRIPTION

You can search for files and folders in Windows. You can even power search--sort of--using arcane commands. Or you can use a dedicated file search tool. VS Code has some capability in this regard, but UltraFileSearch is one I like a lot. It's worth paying for. I'm always suprised just how much I have to search source code. Visual Studio doesn't cut it for refined searching.

I also like FreeCommander's file search.

FreeCommander XE

https://freecommander.com/en/summary/

UAC: Y (exe, winget) N (zip)
COSTS: Free (x32) | Individual 20/year ver (x64)
INSTALLATION: exe, winget, zip

DESCRIPTION

One day awhile back I got tired of having a half dozen File Exporer windows open. Really tired. So I evaluated most of the "explorer replacements" out there and, while several were good, only one let me do everyting I wanted: dual-pane for files, tabs, a pane for favorites, and a pane for the tree.

FreeCommander does much more than file management, but just being able to have one window where I can easily switch folders? It's amazing how much it streamlines my work. It also has a really good file search (though I like UltraFileSearch a little better for power use), batch file renaming, and customizable tool bar where, for instance, I have a button to launch VS Code in the currently selected folder.

Oracle VirtualBox

https://www.virtualbox.org/

UAC: Y
COSTS: Free
INSTALLATION: exe, winget

DESCRIPTION

Back in the day--decades ago--I fell in love with VMWare Workstation. It was the first app that let you install an operating system inside an operating system. It was--and is--magical. But VMWare is now a behemoth. Filling the desktop user's need is VirtualBox. What good is it to a developer? Simply, it's a relatively quick way to test software simulating a regular user's machine. This can be critical for debugging. In fact, I used it while compiling this guide to test every software installation!

Inkscape

https://inkscape.org/

UAC: Y (exe, winget) N (zip)
COSTS: Free
INSTALLATION: exe, winget, zip

DESCRIPTION

By all means, pay huge amounts of money to Adobe if you're a professional corporate designer. But if you only occassionly need to create sophisticated vector graphics, Inkscape is legend. It takes some effort to learn--it doen't hold your hand--but it's worth the time.

Paint.Net

https://getpaint.net/download.html

UAC: Y (exe, winget) N (store, zip)
COSTS: Free | Individual 10/maj ver
INSTALLATION: exe, winget, store, zip (github)

DESCRIPTION

To repeat myself, by all means feed the Adobe leviathan. Photoshop is king. But for most developers, Paint.Net is plenty for basic photo retouching. It's a great tool.

Git Demand Flow

The Issue

Plenty of research says using a trunk-based version control merge/branch strategy is highly effective. But what if a team isn't ready for this?

  • The trunk-based strategy expects that every commit to main is ready for production (assuming it passes all automated tests).
  • If a commit isn't ready for production, a great technique is to hide the change behind a feature flag.

Our team has this situation:

  • Commits need to be tested on demand.
  • But only some of those commits will be deployed to production right away.

For example, we may be working on a larger feature that--for various reasons--has to be released all together. For now, we cannot use feature flags and we can't easily add more discrete testing environments.

Git Flow seems like a solution, but it still expects to merge point-in-time commits into main.

Here is an approach we're trying. It maintains two independent--but related--branches: test and main. Release branches feed main.

Rules

  • No PRs to test or main without a story
  • Latest test can always be deployed to Test
  • A PR to test must be QA-ready
  • Latest main can always be deployed to Production
  • A PR to main must be production-ready

Work flow

I was tempted to use feature branches for longer-lived changes. But we already link stories to features, so using a feature branch in Git seems unnecessary.

It would also require lots of rebasing and forced pulls, the combination of which is asking for trouble.

Besides branching and merging, the flow below refers to tagging stories, moving them into columns, and triggering pipelines. We use Azure DevOps for all of this. You can ignore that stuff if you want, it's not required for the branch/merge strategy.

What matters most is we

  • PR into test
  • Cherry-pick into release
  • PR into main

Flow

  1. Developer begins coding for a story in a branch, e.g. clf/198222-improve-customer-grid-performance
  2. When the story is ready for QA:
    1. Tag story as Deployable
  3. When QA requests testing one or more stories:
    1. PR: merge clf/198222-improve-customer-grid-performance into test
    2. Tag test branch commit to trigger pipelines
    3. Remove Deployable tags
  4. When stories are fully tested
    1. Move to UAT Done
    2. If deployable to production, tag as Deployable for next release
    3. Move Deployable to Deploy Doing
    4. Branch from main to release/[datetime]. Cherry pick story commits into release branch.
    5. PR: merge release/[datetime] into main
    6. Tag main branch commit to trigger pipelines
    7. Delete story branches
    8. Delete Deployable tags
    9. Move to Deploy Done

Wrap Up

This flow seems like it will succeed in keeping both test--and especially main--branches clean until we're ready for trunk-based development.

Better Bugs and Stories

Why?

Written communication is hard. Bugs and stories too often lead to people having to unnecessarily ask someone to explain what's been written because it's vague. There's such a thing as too much detail, but too little, unclear information is more common.

This article doesn't cover all about writing good user stories or bugs. It focuses on a few practices that I've found help the most.

Bugs

The most important parts of a bug report are A) the steps to reproduce the problem, and B) clarity of what the problem is.

There are many audiences for bugs: the user who's reporting, the developer who's fixing, the product manager or business analyst who's communicating the bug from the user to the team.

All of these audiences have different mental models of the application and often assume others know what they do. How do we make sure the steps are clear? Here's one tip I like.

Write the repro steps as if you were training a new employee

Here's how the initial user (who could be a developer or product owner, really anyone) might initially desribe a bug.

Help! When I search for a customer it should show me the last modified date but isn't.

Clarifying this bug may require a few messages or, ideally, watching the person do the work. The bug report might end up like this.

TITLE: Solaris Activium Search not showing last modified for Nevada customers

REPRO STEPS
1. Open Solaris Activium
2. Choose Menu > Search > Customer Search
3. Enter last name "Calypso", first name "Bernard" and Search. Note she lives in Nevada.

Expected: A last modified date within the last few years
Actual: 0000-00-00

4. Enter last name "Chattergee" first name "Parag" and Search. Note he lives in Maine.

Actual: 2019-03-24

[screen shot]

MORE INFORMATION
They're only seeing this happen with customers who are in Nevada, but 
haven't tested all states.

ACCEPTANCE CRITERIA
(optional if obvious from the bug.)

Last modified date is shown for customers in all states.

What helps the person who opens the bug?

  • Which system/app is involved?
  • What are the exact steps the user performed?
  • What was expected? What was actually seen?
  • Sometimes a screen shot helps

"Exact steps the user performed" is important. Often someone familiar with the application will try to reproduce the problem but using different steps, leading to "I can't reproduce" confusion.

Note that while the user might consider the bug fixed if Nevada customers show last modified, the developer should have realized other states could be affected, leading to the more thorough acceptance criteria.

Stories

Stories, aka "user stories," are used for planning. They should contain the least detail necessary to understand what the story's about and how to know it's done. They promote conversation. A story will likely change as it gets closer to release.

There are several techniques to help define the story's value. A common one is the template "As a [Role], I [need/want], because [value]. Here's an example.

TITLE: Implement Solaris Activium login reset 

VALUE
As a User, if I've forgotten my password I want a 
way to easily reset it so I can quickly get back to work.

MORE INFORMATION
Today, if a user forgets her password she has to submit a support 
ticket. Reviewing the last six months of help desk data, it takes 
an average of four hours for the password to be reset. These users 
often have deadline-based work, so those delays have a serious cost.

DEVELOPER NOTES
[jj] I think we can do this using the standard forgot password pattern.

ACCEPTANCE CRITERIA
The new flow is

*   User clicks "forgot password" on login page.
*   User enters email address and submits.
*   Email arrives in under a minute with link to reset.
*   Link opens a page to enter the new password twice. Password is validated.
*   After submitting valid password, user is immediately taken into app.

The key elements above are:

  • We know who, what, and why, stated as simply as possible
  • We understand the business value, probably a result of discussion with the user and developers
  • Developers can capture key discussion points.
  • The story is testable, and the test is simple.

Wrap Up

Hopefully this is useful. What both bugs and stories boil down to are:

  1. What are we trying to do?
  2. Is it clear to everyone?
  3. How will we know it's done?

Concise, clear sentences make a big difference. This all takes practice but pays for itself quickly.

   Older