With some regularity the question of whether or not anyone can program comes up. It irks me that this is positioned as a black-and-white matter, as if there is some kind of bit that flips that determines whether or not someone can program or not.
Of course it isn’t that simple. The question of how good someone can theoretically learn how to program is almost entirely divorced from how well they actually can. It’s for the most part a function of determination rather than innate skill.
And then there is the whole question of what ‘programming’ is anyway. By some definitions everybody can and by some definitions almost nobody can. To make it easier to figure out what you consider to be programming I’ve made a handy little list in ascending order of what I think is easy and what I think is complex. For the record, I think that all of these except the first are programming. Programming to me is defined as making some agent perform a task, no matter whether or not that agent is a computer or simply another person.
The list below is just a sample of all the possible ways in which you could program, and possibly you don’t agree with the order (if so I’d like to know why!).
(0) doing everything, even repetitive tasks manually
(1) instructing another person to perform a simple task (ie: make coffee)
(2) setting your alarm clock
(3) programming your video recorder to record a show a week from now
(4) keyboard macros to ease repetitive data entry tasks
(5) static websites, html & basic css
(6) spreadsheets with simple formulas
(7) industrial control using ladder diagrams
(8) instructing another person to perform a complex task (ie: replace a worn out clutch on a car)
(9) spreadsheets with macros and/or programs
(10) simple business applications using databases and maybe some kind of forms interface, strictly storage and retrieval
(11) simple smartphone application
(12) 2d game programming
(13) basic dynamic websites, mostly CRUD, some simple business logic, small audience
(14) complex smartphone application (say with a server side back-end)
(15) basic dynamic websites, mostly CRUD, complex business logic and/or large audience
(16) scientific programming using a graphical toolkit (such as matlab)
(17) Industrial control using microcontrollers
(18) complex application software
(19) 3d game programming
(20) variations on existing programming languages
(21) most scientific programming
(22) 3d game engines
(23) computer science research, development of new algorithms
(24) file systems
(25) operating systems
(26) network stacks
(27) design of programming languages