Icon Propagating Velocities through Animation Systems


Icon Cubic Interpolation of Quaternions


Icon Dead Blending


Icon Perfect Tracking with Springs


Icon Creating Looping Animations from Motion Capture


Icon My Favourite Things


Icon Inertialization Transition Cost


Icon Scalar Velocity


Icon Tags, Ranges and Masks


Icon Fitting Code Driven Displacement


Icon atoi and Trillions of Whales


Icon SuperTrack: Motion Tracking for Physically Simulated Characters using Supervised Learning


Icon Joint Limits


Icon Code vs Data Driven Displacement


Icon Exponential Map, Angle Axis, and Angular Velocity


Icon Encoding Events for Neural Networks


Icon Visualizing Rotation Spaces


Icon Spring-It-On: The Game Developer's Spring-Roll-Call


Icon Interviewing Advice from the Other Side of the Table


Icon Saguaro


Icon Learned Motion Matching


Icon Why Can't I Reproduce Their Results?


Icon Latinendian vs Arabendian


Icon Machine Learning, Kolmogorov Complexity, and Squishy Bunnies


Icon Subspace Neural Physics: Fast Data-Driven Interactive Simulation


Icon Software for Rent


Icon Naraleian Caterpillars


Icon The Scientific Method is a Virus


Icon Local Minima, Saddle Points, and Plateaus


Icon Robust Solving of Optical Motion Capture Data by Denoising


Icon Simple Concurrency in Python


Icon The Software Thief


Icon ASCII : A Love Letter


Icon My Neural Network isn't working! What should I do?


Icon Phase-Functioned Neural Networks for Character Control


Icon 17 Line Markov Chain


Icon 14 Character Random Number Generator


Icon Simple Two Joint IK


Icon Generating Icons with Pixel Sorting


Icon Neural Network Ambient Occlusion


Icon Three Short Stories about the East Coast Main Line


Icon The New Alphabet


Icon "The Color Munifni Exists"


Icon A Deep Learning Framework For Character Motion Synthesis and Editing


Icon The Halting Problem and The Moral Arbitrator


Icon The Witness


Icon Four Seasons Crisp Omelette


Icon At the Bottom of the Elevator


Icon Tracing Functions in Python


Icon Still Things and Moving Things


Icon water.cpp


Icon Making Poetry in Piet


Icon Learning Motion Manifolds with Convolutional Autoencoders


Icon Learning an Inverse Rig Mapping for Character Animation


Icon Infinity Doesn't Exist


Icon Polyconf


Icon Raleigh


Icon The Skagerrak


Icon Printing a Stack Trace with MinGW


Icon The Border Pines


Icon You could have invented Parser Combinators


Icon Ready for the Fight


Icon Earthbound


Icon Turing Drawings


Icon Lost Child Announcement


Icon Shelter


Icon Data Science, how hard can it be?


Icon Denki Furo


Icon In Defence of the Unitype


Icon Maya Velocity Node


Icon Sandy Denny


Icon What type of Machine is the C Preprocessor?


Icon Which AI is more human?


Icon Gone Home


Icon Thoughts on Japan


Icon Can Computers Think?


Icon Counting Sheep & Infinity


Icon How Nature Builds Computers


Icon Painkillers


Icon Correct Box Sphere Intersection


Icon Avoiding Shader Conditionals


Icon Writing Portable OpenGL


Icon The Only Cable Car in Ireland


Icon Is the C Preprocessor Turing Complete?


Icon The aesthetics of code


Icon Issues with SDL on iOS and Android


Icon How I learned to stop worrying and love statistics


Icon PyMark


Icon AutoC Tools


Icon Scripting xNormal with Python


Icon Six Myths About Ray Tracing


Icon The Web Giants Will Fall


Icon PyAutoC


Icon The Pirate Song


Icon Dear Esther


Icon Unsharp Anti Aliasing


Icon The First Boy


Icon Parallel programming isn't hard, optimisation is.


Icon Skyrim


Icon Recognizing a language is solving a problem


Icon Could an animal learn to program?




Icon Pure Depth SSAO


Icon Synchronized in Python


Icon 3d Printing


Icon Real Time Graphics is Virtual Reality


Icon Painting Style Renderer


Icon A very hard problem


Icon Indie Development vs Modding


Icon Corange


Icon 3ds Max PLY Exporter


Icon A Case for the Technical Artist


Icon Enums


Icon Scorpions have won evolution


Icon Dirt and Ashes


Icon Lazy Python


Icon Subdivision Modelling


Icon The Owl


Icon Mouse Traps


Icon Updated Art Reel


Icon Tech Reel


Icon Graphics Aren't the Enemy


Icon On Being A Games Artist


Icon The Bluebird


Icon Everything2


Icon Duck Engine


Icon Boarding Preview


Icon Sailing Preview


Icon Exodus Village Flyover


Icon Art Reel




Icon One Cat Just Leads To Another

ASCII : A Love Letter

Created on Sept. 3, 2017, 12:38 p.m.





What Does Programming Feel Like?

Most people don't imagine much when they picture the world of programming. It’s one thing to imagine a programmer friend enjoying a take-away and some television in the evening, but imagining what he or she does all day at work is somehow (for most people) still an unknown. It's clear what a programmer does in a physical sense (presses keys on a keyboard, clicks the mouse, etc.), but it isn't clear what it is like to actually be a programmer - what does programming feel like?

If this is something you want to understand, perhaps a good place to start is with the main tool used by programmers: programming languages. Using a programming language is like writing down the specific tasks you want the computer to perform at a very precise level (for example adding two numbers). Very roughly, programming languages are half-way between natural languages (such as English) and mathematics. Like natural languages they have structure and a vocabulary. And like mathematics they are very concise and specific, and use many weird and unusual words and symbols for which the meanings have to be learned. But once you know a programming language, the process of actually commanding the computer is surprisingly simple. You don't need to learn how to use any complex software: all you do is write your program in a text file and open it with another program. That program reads what you have written and performs the tasks encoded by it.


This makes things a bit more clear until you realize there is no single programming language - there are thousands, and programmers typically learn dozens of programming languages over their careers. The time it takes to learn a new programming language can vary greatly. If the programmer already knows any similar languages it could take a weekend. If the language is particularly weird and complex it might take years. And while the most popular programming languages are often taught at university, some programming languages are so obscure that they are only known by a handful of people on the planet. The internet has archived hundreds of ancient programming languages - their users long since moved on to bigger and better things, retired, or in some cases, simply died. If you start learning one of these languages today, you may well be the world number one expert by tomorrow.

The richness of this spectrum is one of the many things that makes programming fascinating. It isn't uncommon for programmers to learn new languages in their spare time for fun - and many have dedicated their lives to studying existing languages, and even to developing their own! Programming language theory is one of the most interesting parts of programming - and half a century since their invention, they remain the most flexible, powerful instrument in the toolbox of a programmer.

For all these reasons, just being a programmer isn't enough to define your experience, and what programming languages you speak is considered a significant question in the programming community. It's like asking what country a person is from - it gives a quick insight into their background, many of their thoughts, their opinions and their experiences. And, just like natural languages, programming languages influence the people who speak them - they introduce an implicit culture and a world-view, because it's programming languages that give programmers the vocabulary to describe problems they encounter in the world and, more importantly, the potential solutions.


So people tend to identify with certain languages more than others, which leads to an amplification effect. People flock to the language that most accurately suits them, homogenizing the culture, and reducing the diversity of the group. This further alienates people with slightly differing opinions. Borders are drawn, nations grow, and flags are raised.

These factions have been known to engage in "religious wars" - endless debates across the chat rooms and bulletin boards of the internet - echoing the same arguments and insults about languages and the programmers who use them into the void for all eternity. Reading them is a bizarre experience - half theoretical debate between particle physicists, half childhood argument over which is better, Ferrari or Mercedes. Some people take programming languages very seriously.

So when programmers want to communicate code with each other, choosing a common programming language can be difficult. When the code doesn't actually need to be run by a computer, often the choice is a language called "pseudocode" - a kind of Esperanto of the programming world, an abstract and flexible amalgamation of the most common elements of programming languages, packaged up in a sensible clear syntax to try and ensure there is minimum confusion.

Often, this, combined with a bit of mathematics, is enough to get the point across, but not always. Just how Esperanto is undeniably a euro-centric global language, pseudocode would be classed by programmers as an "imperative" (a style of programming) global language. There are plenty of communities who won't speak it. Similarly, it doesn't matter to a monolingual Chinese speaker if you speak Esperanto or French: they're not going to understand, and (perhaps more to the point) half of the information would be lost in translation anyway.

Part of the reason for the explosion of programming languages is explained simply by the frenzied rate of technological development that has swept the modern world. With the progress that has been made in so many fields it is easy to forget that programming, in its current form (a tool that is likely to dominate the future of humanity for many hundreds of years to come), all but didn't exist 50 years ago.


This explosion is what tech journalism typically covers. We hear a lot about new machines, new businesses, and new personalities, but we hear very little about the quiet cultural revolution that has been happening alongside the development of programming and computer science driven by the common experience which all programmers share - a muffled eruption taking place in dark bedrooms, in basements and offices. An eruption of geeks, outcasts, gays, socialists, hippies and anarchists, nerds and losers. Much of it has been faceless - echoing only in its own spaces, propagating to the outside world slowly via the internet. On the outside it looks bizarre and frantic and impossible to decipher, but on the inside you will find a number of things that have come to unite programmers. A sense of generosity and selflessness, a love of clever and playful things, a wish to remain faceless or anonymous, an absence of financial motivation and an overarching longing to be accepted. These remain the same regardless of the programming language being spoken.

And there is a good reason to sit up and take notice of this culture which has rumbled away quietly. Just like its technological counterpart it will play a large role in the future of humanity. It will become mainstream: programming will be taught in high school like English and mathematics, and the experiences of the programmer today will be the model for the experience of many millions of children to come.

Because programming has no logo this has all crept up on people. While some logos have been adopted by a few fringe groups: Tux the penguin, Gnu the Gnu, the Glider from The Game of Life, these represent smaller groups of programmers - speakers of certain languages and users of certain tools.

If we are interested in showing people how it feels to be a programmer, then this logo is what we should be looking for. We need to know what aesthetic symbols represent us as programmers - the objects that demonstrate our common experiences and bring us together regardless of faction and creed. These are the stones left over from the destruction of the tower of babel and each one, to me, is a precious artifact.

In this archaeological dig, the most significant stone that has been turned over so far are the set of symbols called "ASCII".

ASCII stands for "American Standard Code for Information Interchange", and roughly it is an agreed set of symbols, and the encoding for those symbols, that allows programmers and computers to communicate textual data. It was developed in the 1960s but has stuck around a long time since then.

There are 95 printable characters specified by ASCII (including the space character). 52 of these characters are the alphabetic characters, 10 are the numerals, and the other 33 are various miscellaneous symbols that largely hold their place thanks to a number of different historical circumstances.


Most lay-people may have never used, or even seen, many of the symbols in ASCII before. Characters such as 'pipe' |, 'tilde' ~, 'hash' #, and 'at' @ might all seem very odd things to include (although the latter two are more familiar to people these days thanks to Twitter). Equally many lay-people may be just as surprised at some of the omissions. People in the UK might be wondering where the 'pound sign' £ is (which sits above the 3 key on our keyboards)?

Japanese people also lack their own symbol to denote money. They solved this problem by having Japanese software draw the ASCII 'backslash' character \ as a yen symbol ¥ on screen - a decision that has caused endless interesting side effects, such as file paths on Japanese versions of Windows gaining a very expensive look (e.g. C:¥Windows¥Microsoft.NET¥Framework¥').


Programmers, unlike lay people, will know all these ASCII symbols well. This is because programming languages almost exclusively use ASCII symbols to represent code. Programmers typically type hundreds or even thousands of these symbols every day and no single symbol goes without use, but programmers are just as confused about the choice and provenance of the symbols. For example, much programming involves mathematics. Why then are there symbols for 'plus' +, 'minus' - (a borrowed hyphen) and 'equals' =, but not for multiplication or division? Programmers are forced to use 'asterisk' * to represent multiplication and 'forward slash' / to represent division.

The simple reason for the selection of symbols (which anyone who is a little older than me will have already guessed) is that almost all of the ASCII symbols derive directly from the symbols that were on standard American typewriters of the day - a time when programming still didn't really exist and most typewriters were used only for accountancy and admin.

This at least explains the 'at' symbol @ and the 'hash' symbol #. 'At' @ was originally intended as a shorthand to signify the price various goods were bought at (e.g. '4 tables @ $128'), and 'hash' # was used to represent identifying numbers (e.g. 'shipment #512').

The typewriter also explains another group of symbols that were originally meant to be typed over the top of previous symbols. On a typewriter the backspace key doesn't erase the previous character but literally moves the paper backward by the width of a space. This explains the accent characters ^, ~ and ` that were placed over other letters. It also explains why the division symbol is missing - previously an approximation was achieved by typing the hyphen character - and then the colon : character on top (for multiplication the x character was used). This also explains 'underscore' _. Bold characters could be printed on a typewriter by directly printing the same character two or three times on top of itself but italics were impossible. 'Underscore' was introduced so underlined text could be used as an alternative. On a computer you can't type one symbol on top of another so these things no longer make any sense. The accent symbols can no longer be written on top of other characters and instead take up the space of a full character on their own. Programmers use underscore more like a hyphen - to conjoin words when leaving a blank space would change the meaning of the program (e.g. slots_num).


It is interesting that as many of these characters have completely lost their original context and meaning they have gained an entirely new purpose in writing code. For example 'pipe' | is used to chain a series of commands, and 'tilde' ~ means to flip the binary representation of a number. Even more interesting is that programmers have been forced to combine symbols in creative ways, for example putting 'hyphen' - next to 'greater than' > to make 'arrow' ->, putting 'hash' # next to 'exclamation mark' ! to make a symbol called 'she-bang' #!, or putting two 'greater than's > next to 'equals' = to make an obscure symbol called 'monadic bind' >>=. These are just a few examples from thousands.

The ASCII symbols are a set of symbols that all programmers have close experience with. And they are more than just a set of symbols - they are the words with which all programmers have learned to speak and the symbols that every programmer has dealt with working long into the night. No single programming language, but rather ASCII represents the common language of programming culture - the silent, subtle communication that has built so much and allowed thousands of programmers from around the world to slowly, independently, construct a new tower of babel.

My most recent project has been a collaboration with a close poet friend of mine on a book of code poetry: a collection of poems written in the source code of several different programming languages.

Just like programming culture, the collection is intended to be fun and clever. Each poem is also a valid program, producing an output that visually represents the content of the poem. The code is hidden in the poem, the poem is hidden in the code, and the whole thing can be read by both human and machine.

Also, like programming culture in general, this collection is intended to be generous, providing an fun, personal, and colorful exploration of the medium. Some people might enjoy delving deeper into this collection but you don’t have to be an expert to appreciate it. The book can just as easily be read as a series of nonsense poems - a surface-level abstract presentation of immediate feelings and thoughts.


So although programmers will be the people who I hope understand it the best and appreciate this collection the most, it is also a collection for those who are not programmers but who want to know what the future will be like. Because the common experience of programmers will soon be the common experience of everyone, and if you are interested in a preview of the aesthetic world which at the moment is still secret, but very soon, will be all unavoidable, this collection provides it.

I've often teased my girlfriend by saying I was going to get a tattoo of the 95 printable ASCII characters. Her reaction is always the same - an expression which says both "please don't", and "you massive nerd" at the same time. So unofficially, I like to think of this collection as my missing love letter to ASCII - a thank you note to those 95 weird little symbols that have ended up representing my life and the life of many others like me.

github twitter rss