Ken Olsen writes in a Surface Mount Challenge project log on Hackaday.io:
Programming Surface Mounted Chips
A majority of my projects to date have used DIP package Attiny85, 84, and Atmega328. These are usually programmed beforehand using a ISP shield on an Arduino, or afterwards using the ISP header. My first PCB design, was in fact, a shield which could be used to program the variety of AVR chips I was using. Breadboarding up an Arduino-as-ISP circuit time every time I needed one was error-prone and frustrating.
It occurred to me that since not all projects have ISP headers, there should be some way to program the chips prior to installation. With a little googling, I found SOIC to DIP adapters which can be used to mate up with a DIP ZIF fixture. A SOIC 20 allows me to program the AVR 8-pin, 14-pin, and 20-pin packages!