Learn how humanity progressed from early counting tools to modern programming languages and artificial intelligence.
A beginner-friendly journey showing how humans moved from early calculating tools, to number systems, to electronic computers, to programming languages, and finally to AI. While this is a non-coding course, some programming concepts and code examples will be demonstrated to help illustrate how computers and software work. Students will be encouraged to explore optional hands-on exercises and deeper study on their own if they choose.
One of the most valuable aspects of this course is the opportunity to learn alongside other educators and technology-curious students. Through the private Telegram group, participants can ask questions, share insights, discuss classroom applications, and benefit from the experiences of others working through the same material. Alumni may remain in the community, creating an ongoing network of support and collaboration where new students can learn from past participants and continue exploring how computing and artificial intelligence are reshaping education and society.
There will be no formal certification or final grades. Optional quizzes and exercises may be provided to reinforce learning and help students gauge their understanding. What I want students to take away from this course is a memorable, practical understanding of key terms, concepts, and historical developments that they can use and relate to in their careers, classrooms, and everyday discussions about technology.
This section explains what a normal course week looks like, how daily assignments are
handled, and what kinds of live help may be available.
The full course outline is available from the start so you can see where we are headed.
Detailed lessons, downloads, and assignments are released one week at a time to help you
stay focused and avoid information overload.
New weekly direction begins. Students review the week introduction, watch or listen to material, and complete the first small assignment on their own time.
Students continue with the next lesson and assignment by reading some kind of documents. This could be in the form of PDF, a Web page, a text file, a source code file or any combination. But the focus of this course is steady daily progress without requiring everyone to be online at the same time.
Midweek work continues with another focused lesson, practice task, or reflection question tied to the course outline.
Students build on the earlier lessons and prepare questions for the optional live Q&A or recorded support material.
The week wraps up with a review assignment, checkpoint, or summary activity so students can see what they learned before moving forward.
The course is planned at $25 per week. Coursework is assigned daily, Monday through Friday, and students complete it in their own time.
A live question-and-answer meeting may be offered once per week. Attendance is optional, and recordings will be made and shared when possible.
Additional live help may be arranged when needed using chat, voice, video, or desktop sharing for troubleshooting and deeper explanation.
From Stone Age counting aids to early analog and mechanical machines, students see how
humans
created tools to extend memory, counting, measurement, and prediction. Charles Babbage, the
first major name in computer science, designed four calculating machines. His fourth design,
the Analytical Engine (1837), was very conceptually close to a modern computer, although it
was
never completed.
Long before electricity, humans created tools that extended memory, automated calculation,
and predicted complex systems. Modern computers are the latest expression of this ancient
desire to mechanize thought.
Tally sticks, the abacus, astrolabes, slide rules, and the Antikythera mechanism show that computing began long before electronics.
Students learn that computing is not just modern programming; it is the long human effort to automate counting, comparison, and decision-making, often used in navigation, surveying, and timing celestial or seasonal events. This section includes a more detailed look at the astrolabe, circular slide rule, and the evolution of clocks up to pendulum clocks.
Optional expansion can include analog fire-control computers, navigation tools, and mechanical calculators. Examples include submarine and U-boat torpedo calculators, missile trajectory calculators, and bombsights. The textile industry also used programmable machines such as the Jacquard loom (1804) for weaving cloth, rugs, and carpets.
Mechanical analog, mechanical digital, electrical analog, and electrical digital systems. How are values and states stored in each type? How are values input and output? This study also covers the development of clocks up to Babbage, just prior to electrical and later crystal-controlled clocks.
Example prompts: What was the Antikythera (100 BC) mechanism, and why do people call it an ancient computer? What were the Pascaline (1642) and Curta (1948) mechanical calculators?
This section explains why humans use different number systems and why electronic
computers settled so strongly on binary representation. It also explains the
numbering systems commonly used in programming languages.
Computers do not understand numbers the way humans do.
They store patterns, and we decide what those patterns mean.
Students compare decimal, Babylonian base-60, Roman numerals, and other counting systems to see that number representation is a design choice. Humans use base 10, while everyday systems often use mixed bases such as 12 inches per foot, 24 hours per day, 60 minutes per hour, 360 degrees in a circle, and 5,280 feet in a mile. Other civilizations used systems such as Roman numerals, Babylonian base-60, and Mayan base-20. Fictional aliens might use base 3, 52, or 77. Computers primarily use base 2 (binary), while programming languages often use base 16 (hexadecimal), base 10 (decimal), and occasionally base 8 (octal).
Students learn bits, bytes, binary, hexadecimal, simple conversions, and how numbers and characters are represented inside a computer. Binary can be compared to a combination lock with only two positions on each tumbler. A byte has eight tumblers, giving 256 possible combinations. This section also explains number storage and simple arithmetic. How negative numbers are stored Two's Compliment. Data sizes Bit, Byte, Kilobyte, Megabyte, Gigabyte, Terabyte.
Optional topics include signed numbers, floating-point representation, error correction, ternary computer experiments (such as the Soviet Setun in 1958 and Setun-70), and why binary became dominant. Mainframe storage in words, double words etc.
Students can connect number systems to logic gates, digital electronics, ASCII, Unicode, color codes, file sizes, and memory addresses. This section also explores electronic components that represent on/off states, including relays, transistors, and voltage levels, as well as components such as capacitors that can store information. Tapes, Disk, Optics, SD.
Example prompts: Show me step by step how decimal 255 becomes FF in hexadecimal. Show me a side-by-side table of decimal, binary, and hexadecimal values from 0 to 16. What kinds of computers exist other than the CPUs we commonly use? What are biochemical, optical, DNA, atomic, and quantum computers? What is a quantum computer, and will it replace conventional computers?
Students learn the basic machine model: a processor following instructions, memory holding values, and a clock coordinating the work.
This week explains the core ideas that make all computers work. Relays, vacuum tubes, transistors, and integrated circuits evolved into modern processors. Once a machine can store data (memory), make decisions (if/else), repeat instructions (jumps and loops), and perform calculations (expressions and variables), it becomes capable of universal computation. This property is called Turing completeness. We trace the historical development of computing from Charles Babbage's mechanical designs, to Ada Lovelace's insight that machines could manipulate symbols, to Alan Turing's theoretical foundations and wartime work, to John von Neumann's stored-program architecture, and finally to the 8-bit personal computers of my early days that introduced computing to millions of people. We then work our way from the 1980s to today.
Students learn CPU, RAM, storage, input, output, and clock cycles; what a program is made of; commands (instructions) or statements; loops and branching; decisions; expressions; variables; and algorithms. Briefly: machine language vs. assembly language vs. C vs. higher-level languages. Machine subroutines are used to repeat code. Machine subroutines can also function as routines that return values. 4-bit, 8-bit, 16-bit, 32-bit, and 64-bit architectures. Clock speeds: 1970s - kilohertz (kHz) 1980s - megahertz (MHz) 1990s - hundreds of megahertz 2000s - gigahertz (GHz) 2010s to today - multicore processors.
Optional topics include registers, flags, interrupts, and the differences between subroutines, functions, procedures, and methods. Larger architectures may use 128-bit, 256-bit, 512-bit, or even 1024-bit registers for specialized operations. Could a CPU be designed to process fewer bits per clock cycle? Yes. In principle, a 2-bit or even 1-bit CPU is possible. A 1-bit processor is essentially a serial processor, and such designs have existed.
Relay logic began in industry to control automated machinery. This has continued into the computer age as PLC (Programmable Logic Controller) programming. Students can connect this section to CompTIA A+, PC hardware, motherboard diagrams, embedded systems, and troubleshooting. Ask: What was the architecture of the Apollo Guidance Computer used during the moon landings?
Example prompts: Explain how a CPU executes one instruction step by step using a simple pretend computer. Explain caches, pipelines, memory maps, and simple CPU diagrams. What is bytecode, and what are virtual machines? What is Java bytecode and the Java Virtual Machine? Java has bytecode, but do all virtual machines have "bytecode"? Show me simple examples of Java bytecode. Show me simple examples of machine language. Show me simple examples of assembly language. What's the difference between an algorithm, a program, and a subroutine?
This section introduces the native language of the CPU and the human-readable
assembly language layer that sits just above machine code. The goal is to
bring together many of the core Turing and von Neumann concepts introduced
in previous sections and show how they are implemented in actual computer
instructions.
Topics include instructions, opcodes, operands, registers, flags,
interrupts, branching, looping, jumping, decisions, arithmetic and logic,
input, processing, output, memory, the Program Counter, the stack,
subroutines, simulated functions, and addressing modes.
By the end of this section, students should have a clear conceptual
understanding of how a processor executes instructions one step at a time
and how all higher-level languages ultimately reduce to these same
fundamental operations.
Early programmers worked very close to the machine. Programs were entered
through front-panel switches, plugboards, punched cards, paper tape, and
later assembly language. Regardless of the medium, the programmer was still
specifying a sequence of basic instructions for the computer to execute.
At the lowest level, nearly every instruction set can be broken into a small
set of fundamental operations:
Load data
Store data
Perform arithmetic and logic
Compare values
Make decisions (conditional branching)
Repeat operations (loops)
Call subroutines
Handle input and output
Stop or halt
The earliest computers had relatively small and simple instruction sets.
ENIAC (1945), for example, was programmed by setting switches and rewiring
cables.
EDSAC (1949) and early IBM systems began using stored programs, where
instructions
were kept in memory and could be changed without rewiring the machine.
When we enter the age of microprocessors and calculators, the same ideas
appear on a
smaller scale. The first commercial microprocessor, the Intel 4004, was
originally
designed for calculators. It was followed by:
4-bit processors (early 1970s, calculators and controllers)
8-bit processors (mid-1970s to 1980s: MOS Technology 6502, Zilog Z80, Intel
8080)
16-bit processors (late 1970s to 1980s: Intel 8086)
32-bit processors (1980s through 2000s)
64-bit processors (mainstream consumer systems by the 2000s and 2010s)
That progression describes the consumer and small-business market, but
larger
organizations had powerful systems long before desktop computers became
common.
In the 1960s and 1970s, governments, universities, and large businesses
relied on
minicomputers and mainframes such as the IBM System/360, DEC PDP-8, and DEC
VAX-11/780.
These systems often featured larger word sizes, more registers, and more
sophisticated
input/output capabilities than consumer machines.
Some specialized systems used very large word sizes—128 bits, 512 bits, or
even
larger—particularly in vector supercomputers such as the Cray-1. In these
machines,
a “512-bit register” often meant a vector register holding many values at
once rather
than a single ordinary integer.
As architectures grew more capable, instruction sets often became larger and
more complex. This
design philosophy became known as CISC (Complex Instruction Set Computer).
The Intel x86
is a classic example, with a large instruction set and decades of backward
compatibility.
In the 1980s, researchers revisited a simpler design philosophy called RISC
(Reduced Instruction Set Computer). Systems such as MIPS, SPARC, and later
ARM emphasized smaller, simpler instructions that could be executed very
efficiently.
Whether a computer is mechanical, vacuum tube, transistor, or modern
silicon,
the central idea remains the same: a computer executes a sequence of simple
instructions to move data, process it, make decisions, and produce output.
Everything from calculator chips to smartphones to AI systems is built on
that same fundamental model.
Students will learn the fundamental concepts of machine language
and assembly language, including opcodes, operands, registers, flags,
labels,
jumps, branching, simple memory access, and the relationship between
assembly language and the underlying machine instructions executed by the
CPU.
Examples will be kept deliberately simple. This is a non-coding course;
the objective is not to teach the syntax of any particular assembly
language, but
to reveal the concepts that all assembly languages and instruction sets have
in common.
To that end, I will frequently use pseudo code, mock assembly language, and
simplified
diagrams that emphasize ideas over technical detail.
Students may also “play computer” on paper, manually stepping through
instructions and
updating registers, memory, and output as software engineers often do on
whiteboards around
the world. This exercise helps make the fetch-decode-execute cycle concrete
and understandable.
Where useful, I may demonstrate examples using 8-bit assembly language from
classic home
computers such as the Commodore 64, whose 6510 processor provides a clean
and historically
important example of a simple instruction set. Emulators for most popular
historical computers
are readily available for Windows, Linux, and macOS.
I will also refer students to the excellent online Little Man Computer
Simulator, which
provides a highly simplified educational computer for experimenting with
machine language concepts.
Finally, I may demonstrate selected examples on an IBM System/370 emulator.
The IBM
System/370 represents a historically significant large-scale computer
architecture and
offers students a glimpse into the assembly language used on business,
government, and
university mainframes during the 1970s and beyond. I will also provide some
deep dive examples
for some PC apps that can be made to run at the console, similar to console
commands.
The goal of this week is to help students understand that all software—from
C and Java
to modern operating systems and artificial intelligence systems—ultimately
reduces to a
sequence of simple instructions executed one step at a time by a machine.
Code that runs directly as machine code, or as compiled native code,
generally runs most efficiently on a computer because all interpreter
overhead has been removed. The processor executes the instructions directly
rather than first translating them at runtime.
In theory, you could write all of your software in assembly language and
produce some of the fastest and smallest programs possible. In practice,
however, it would take an enormous amount of time to develop programs of any
significant size or complexity, which includes most software written today.
Assembly language is powerful, but it is also tedious to write, debug, and
maintain.
This is why higher-level languages came into being. Languages such as
FORTRAN,
COBOL, C, C++, Java, and Python were developed to make software easier for
humans
to read, write, debug, and maintain. Although these languages may introduce
some
overhead, they greatly increase programmer productivity and make it possible
to build the large and sophisticated systems we rely on today.
JIT, or just-in-time compilation, is where higher-level language code is
converted into machine code while the program is running.
This can happen from a scripting language down to machine code, or from
bytecode down to machine code.
Inline code is where small sections of code, such as simple loops or
frequently used operations, are expanded directly into machine code to
improve efficiency.
In some languages and runtime systems, code that runs often can be
recompiled and optimized more than once to reach greater efficiency.
I will provide some code for simple keyboard input, screen output, and file
read/write operations for both Windows and Linux.
I will also recommend compilers and may provide video demonstrations.
This is meant to demonstrate making simple console commands.
Usually this is done with C, not assembly language.
Assembly language will be used only to help students fully grasp the machine
itself and how it works internally.
Look into various electronic controllers and embedded computing
platforms. To name a few: Phidgets, Pyboard, ESP32, Arduino, and the PLC
(Programmable Logic Controller) systems we mentioned in previous study.
Phidgets supports a wide variety of programming languages, including Java,
Python, C#, and others. Pyboard is designed primarily to run Python through
MicroPython. ESP32 can be programmed in C, C++, MicroPython, and
JavaScript-based
environments. Arduino is most commonly programmed in a simplified form of C
and C++.
Although these platforms are typically programmed in higher-level languages,
all of them ultimately execute machine instructions specific to their
processors.
In principle, you can study and program most of them in assembly language,
although
I have not yet explored that in depth myself.
Among these devices, you will find a wide range of processor architectures,
including 8-bit, 16-bit, 32-bit, and 64-bit systems.
The Raspberry Pi is a single-board computer rather than a simple
microcontroller.
It can be used as a controller, but it is also capable of functioning as a
full
desktop or server computer. Modern Raspberry Pi models use ARM processors
and
support both 32-bit and 64-bit operation. They typically run Raspberry Pi
OS,
an ARM version of Linux.
Of all of these, take a look at the ATmega328P used in the Arduino Uno.
This 8-bit microcontroller is small, inexpensive, and has a simple,
well-documented
assembly language, making it an excellent platform for learning how
computers work
at the machine level.
The PIC16F84 is another classic 8-bit microcontroller with a very small
instruction set. It became one of the most popular devices for learning
embedded programming and assembly language during the 1990s.
I could have introduced these simple controllers in the next section, and I
may
move them there later. Most of these platforms are commonly programmed in C
or C++.
However, I wanted to show you a variety of processors and controllers that
you
can explore in assembly language if you desire.
C shows how programming moved above raw assembly language while still staying close enough to the machine to reveal how memory and system behavior work. In machine language and assembly, programs are written as sequences of instructions and subroutines. In C, programs are organized into statements, functions, and libraries of reusable functions. Although C is built entirely around functions, it is not a functional programming language. Instead, it is a procedural language designed for the classic von Neumann computer architecture, where instructions operate on data stored in memory.
C grew out of the need to build Unix and other portable
systems software without rewriting everything for every
machine.
Java came along about 25 years later and achieved a very high
degree of portability through the Java Virtual Machine (JVM).
Carefully written ANSI/ISO C is also highly portable, though
not to the same extent as Java.
Carefully written ANSI/ISO C: often 80-95% portable.
Typical practical C code: often 60-90% portable.
OS-specific or hardware-specific C code: much lower.
BCPL (Basic Combined Programming Language)
BCPL was created in 1966 by Martin Richards at the University
of Cambridge. It was designed as a simple, portable systems
programming language and directly inspired the B programming
language.
B Programming Language
B was developed around 1969 by Ken Thompson at Bell Labs.
It was a simplified version of BCPL used to help create early
versions of the Unix operating system. B lacked built-in data
types, and its limitations led Dennis Ritchie to develop C in
1972.
C Programming Language
C was developed in 1972 by Dennis Ritchie at Bell Labs as an
improved version of B. It added data types, pointers, and
structures, making it powerful enough to rewrite much of the
Unix operating system in a portable high-level language.
C went on to become one of the most influential programming
languages ever created and has been used to implement large
portions of many operating systems, including Unix, Linux,
Windows, macOS, iOS, Android, and countless embedded systems
and microcontrollers.
if, while, for)gcc input-source-file.c -o output-executable-file.
The executable file is then run from the command line.
type command or Notepad to view the file contents.
Syntax is the grammar of a programming language, and it must
be exact. If the syntax is incorrect, the compiler will
generate an error message showing what it did not understand,
along with a line number and other helpful information.
A semantic error, also called a logic error, occurs when the
code is syntactically correct but does not produce the intended
result. In other words, "You did what I told you to do,
computer—not what I wanted you to do!"
Compiled languages report errors detected during compilation,
such as syntax errors and type mismatches. Both scripting
languages and compiled programs can also experience runtime
errors while executing.
#define)constenuminline#ifdef, #ifndef)<stdio.h> and <stdlib.h>#include directiveRelated languages and shell scripting. Shell scripts are used to automate system tasks that you would normally perform manually at the command line.
csh)bash)
Students are encouraged to study operating systems and
command-line environments, including Unix, Linux, DOS,
Windows, and PowerShell. It is also helpful to learn the
structure of Linux and Windows file systems and how programs
interact with files, directories, and devices.
The world of system commands is a useful parallel study
because operating systems provide hundreds of small programs
that can be run from a command line. These commands can be
grouped into categories such as navigation, file management,
text processing, networking, process control, and software
development.
Both Unix/Linux and Windows provide command-line environments
where commands are entered in a similar way. A C console
application follows the same model as any system command: it
accepts parameters, reads input, performs work, and produces
output.
A main takeaway from this course should be that the command
line has never gone away. Despite graphical user interfaces,
software engineers and system administrators continue to use
the command line extensively.
Objects are introduced as a way to package data and behavior into reusable parts that make larger programs easier to organize.
Simula and Smalltalk helped introduce object-oriented ideas before C++, Java, C#, and many later languages spread them widely.
Students learn classes, objects, fields, methods, encapsulation, and the basic idea of modeling real or imaginary things in code.
Optional topics include inheritance, polymorphism, interfaces, composition, design patterns, and when OOP can be overused.
Students can compare objects to assembly lines, parts catalogs, blueprints, machines, vehicles, games, and business records.
Example prompt: Explain objects using cars, tools, or building blocks before showing code.
Students compare major modern languages and learn that different languages solve different problems in different environments.
Languages evolved for operating systems, business software, games, web pages, enterprise servers, mobile apps, and scripting.
Students compare compiled, interpreted, and hybrid execution models using JavaScript, C++, C#, and Java as examples.
Optional topics include bytecode, virtual machines, JIT compilers, garbage collection, runtimes, and language ecosystem tradeoffs.
Students can connect languages to web browsers, desktop apps, Android apps, servers, game engines, and cloud platforms.
Example prompt: Compare Java, C#, C++, and JavaScript in plain English for a beginner.
This section connects traditional programming ideas to artificial intelligence, showing both continuity and major differences.
Students see the path from early symbolic AI and expert systems to machine learning, neural networks, transformers, and modern LLMs.
Students learn basic AI vocabulary: algorithms, data, training, inference, models, neural networks, tokens, and pattern recognition.
Optional topics include GPUs, CUDA, transformers, embeddings, model limits, hallucinations, and the difference between tools and intelligence.
Students can study ethics, bias, critical thinking, automation, jobs, AI-assisted learning, and how to use AI without surrendering judgment.
Example prompt: Explain how a neural network is similar to and different from traditional programming.
These policies are intended to keep the course professional, transparent, and low-risk for students, parents, and the instructor. This page is general information and should not be treated as legal advice.
This course may collect basic information needed to operate the class, communicate with students, and provide course access.
Information that may be collected:
Personal information is used only to operate the course, provide support, communicate with students, and maintain records when needed. Personal information is not sold. Students may request removal from the course and deletion of stored information, subject to legal, accounting, and legitimate recordkeeping requirements.
Live Q&A sessions may be recorded and shared with enrolled students. By participating in a live session, students consent to the recording of their voice, image, screen sharing, and chat messages. Students who do not want to appear on camera should keep cameras off and may participate by chat when available.
Course recordings and student contributions are intended for enrolled students only unless additional written permission is obtained.
Testimonials, public excerpts, student comments, screenshots, or clips from live sessions will not be used publicly for marketing without separate permission from the student or, when applicable, a parent or guardian.
Refund terms will be stated clearly at the time of registration. For an initial small-course launch, a simple written refund policy is given before accepting payment.
If students under 18 participate, a parent or guardian should register, approve participation, and consent to any recordings.
Extra caution will be used when collecting personal information from minors or sharing any content involving minors.