Gaining global Twitter-fame in 2014, there is no doubt that many will recognise the iconic photograph of a young woman grinning as she adds the final folder to a stack of papers that looms above her. The five-foot-something tower in question was the software code responsible for landing Neil Armstrong and Buzz Aldrin on the moon back in 1969, and the lady beside it was Margaret Hamilton, one of its programmers.
A mathematician and pioneer of computer science, Hamilton was a self-taught computer programmer working for the MIT Instrumentation Laboratory when, under a contract from NASA, she became the lead software engineer on Project Apollo. Margaret went on to work on all of the manned, and several unmanned Apollo missions, before leaving in the 70s to found her own software company, Hamilton Technologies.
Half a century before our dependence on computing power firmly took hold, the lunar landing offered a true test of this burgeoning knowledge base, marking the first time that so much responsibility had been bestowed on a system entirely run on software. To understand the incredible feat of computer engineering that took us to the moon and back requires only a glimpse at the early years of software coding.
The early years…
Programming at the time of the Apollo missions was carried out using punch cards, which, as their name suggests, were long cards with strategically placed holes to encode data. The card itself was a little over 7 inches long, 3 ¼ inches tall and comprised 80 columns and up to ten rows, numbered from 0 to 9. Each column on the card represented a single character (byte) in binary format, expressed as either a hole or no hole, while each card in its entirety represented a separate instruction for the computer. In many of the early programming languages, each part of the computer instruction had to start in a certain place on the card, giving a precise location to each punched hole.
Early programmers like Hamilton and her team, would write the primary code in longhand, before punching it into the cards to be fed into the reader. As each punched card described just one instruction for the computer to perform, even simple programming tasks could require thousands of punched cards. The resulting ‘deck’ of cards, referred to as a source deck, would eventually contain a detailed description of exactly what the programme would eventually do. In order to turn this into the finished programme, the source deck must be fed into a compiler, which would read the punched code and translate it into a binary machine code that the computer could understand, writing the emerging programme to a strip of magnetic tape.
Once the computer had run the programme, it would produce a printout of the instructions it had followed, and it was then down to the programmers to check the output and make sure it was correct. Any errors or bugs would need to be tracked down and re-coded, with new cards punched to replace the incorrect ones. This process would be repeated and the programme rerun until the output was correct. In the case of the Apollo missions, the finished, bug-free programme was finally sent off to a nearby facility, where the code was hardwired by hand into core rope (an early form of Read Only Memory (ROM)) memory banks to be installed into the on board flight computers.
It is thanks to Hamilton and her team of revolutionary software engineers that not only were the Apollo Astronauts successfully returned to Earth, but that the innovators who walked behind her could make such leaps in the years to follow. From its beginnings in Turing’s decision making machine, through its early years in the depths of the NASA space programme, and to its abundance and necessity in today’s world, software programming certainly has made an incredible journey.