eli5: How do you actually make and design programs made for editing and special effects?


Programs such as Premiere Pro and Adobe, how does one actually start from scratch to make one of those?

In: 1

>Programs such as Premiere Pro and Adobe, how does one actually start from scratch to make one of those?

Could you elaborate on what you mean by that? Are you asking how you would design a special effects software as opposed to, e.g. a word processor or an engraving suite? Are you asking how software design teams are managed? Are you asking how… programming works?

Your computer today is a register machine. A register is an input or output of a CPU. Your CPU has many, some input-only, some output-only, some are both input and output. Some registers are for data only, some are for instructions only.

As a conceptual example, I would put the number 7 in register A, 5 in register B, and the “opcode” for the ADD instruction in the instruction register I. And what should show up in register A? 12. How all this actually happens at a physical level is kind of not important. Why it all happens is also kind of not important – as a software developer, I’d just read the manual on this CPU to learn how to use the ADD instruction, learning it reads from A and B and writes back to A.

Early computers were programmed directly like this. Early computers were very much thought of as electro-mechanical computation *machines*. They were programmed by physically wiring circuit paths. Data was stored on hole-punched tape. Later, so were the programs themselves.

Really, the early days of computing were quite marvelous what they were both able *and willing* to do. We joke about it, that early computers used to take up entire warehouses and when switched on, the greater LA area would *dim*, but the early pioneers and financial backers were not deterred by the magnitude of what they sought to do.

But then some genius got it in his head that he could use a more descriptive grammar. Instead of LOAD, STORE, COMP_LE, INCREMENT instructions (and by the way, these computers are all digital – they don’t know what ADD is, that’s just a mnemonic for some digital value, like 7 – instruction 7 ADDs registers A and B, and writes the result to register A), I could instead write:

int counter = 0;
while(counter <= 9) {
counter = counter + 1;

The example above is valid syntax for C, C++, Objective C, C#, Java, I think Go… There are lots of different programming languages that follow a lineage, so their syntax is similar.

So you write a document. In this new-fangled programming language idea. And with it, you describe your program and how it does what it does. And we call this document “source code”. And the source code has to follow the rules of the language. Just as you wouldn’t fly to Japan and say to the locals, “Oui! Oui!”, you wouldn’t write Haskell code in a Python program.

And that is because this text document is the data, the input for a program that will read it and translate it into those machine instructions for you! That translator program is often called a compiler. So it’s a program that takes a specific programming language source code as input, and produces a program as output. You can then run that program on the intended machine.

The first compilers were written by hand in straight machine instructions on punch cards. You could then use your programming language to write a compiler for that language, in that language. This is called bootstrapping. Sometimes it’s nice to be a C++ developer and write and modify and fix and maintain your C++ compiler in C++ itself. Again, the output is a runnable program on punch cards, or in modern day, stored on your hard drive. So now you have a compiler that can compile new versions of itself.

So if you want to write your own program, you need to first pick up a book on some programming language – Python is a very popular first language. And since we live in the future, most people follow online tutorials. Once you have an idea of how to write programs, you then need to learn about the program you want to create. If you want a program that makes 3D renders and effects, then you’re going to have to learn a shitload of calculus, trigonometry, geometry, and linear algebra. You’re going to have to learn physics in regard to light. There’s a lot of domain knowledge you’re going to have to learn before you ever commit to a single line of code, because learning programming itself won’t teach you anything about the program you want to make.

You keep breaking it down into discrete parts. Take photoshop, for example.

A program like photoshop is really a collection of many smaller programmes that work together like a toolset. For example, file management. If you work in photoshop, you want to be able to open files, save files, create files and so on. So you create a tool for doing just that.

If you open an image file, you want a tool that can display an image file. So you programme an image viewer that can display a picture. You’ll also want to be able to have some basic controls like zooming in and out and moving the visible area around while you’re zoomed in.

So now you can open and display an image. A very simple image editing tool is the paintbrush. You even have it in MS Paint. The paintbrush is nothing more than a shape like a circle, that’ll change the pixels of the image to the colour you’ve set for the paintbrush.

While we’re at it, we can add a few extra options for managing the size and shape of the paintbrush as well as the opacity.

We keep creating these distinct individual tools for doing a specific task. And we create an overall framework that collects all these tools and assigns them to buttons, menu’s, creates interdependencies and so on.

But when you get right down to it. Each of these tools is kind of like its own little programme, collectively, they form a bigger software package.