Take coding academies the vast majority of them don't even cover basic math they try to abstract everything and teach you basically how to "paint" or "construct" with words and a compiler. Code academy graduate do not come out from their 6 week crash course with grasp on even basic mathematical principles and tools that are used for programming, and 'autodidacts' aren't much better.
Sure there will be prodigies that teach themselves "real" computer science rather than how to build web apps using JavaScript and RoR, but those are the same people that could be prodigies in any other field as well.
You get coders these days that don't have a basic grasp on what arrays or matrices are. what is a vector, or what is a binary expression tree is, not because they are dumb but because they don't know algebra.
The basic "coder" is a 21st century handyman building a landing page is not much different than building a porch and while it might be painful to hear building a porch probably requires more thinking than building a landing page these days.
You can teach yourself programming however you want but you would be at best a "skillful" operator unless you are truly a unique individual with prodigy level self learning capabilities and extremely high intelligence. But if you just learned a "language" (rather than programming and computer science fundamentals) you are also a pretty useless crank you are just more employable in the current job market just like a guy who thought himself how to fix a car 50 years ago was.
I actually learned all of that much later, not through programming, but by trying to understand physics. I watched all of the Leonard Susskind videos over the course of about 18 months while using stuff like Khan Academy and wikipedia to learn the math that I didn't understand as I was going. Once started digging into symmetry groups, I stumbled onto abstract algebra, discrete math, and so on. I wouldn't say I understand quantum mechanics much better than I did before I started, but I learned a lot of math while failing to understand physics.
It really wasn't until I started playing around with haskell that I even started making the connection between those mathematical structures and programming and discovered category theory. I had sort of thought I was learning two mostly unrelated things and haskell sort of blew my mind.
I wouldn't say that there are any such tools, not the kind that the average programmer has to have explicit knowledge of. In fact, that's one of the misconceptions I have to steer people away from, the idea that programming requires lots of math. Obviously there are applications of programming that require a lot of math - AI, proof assistants, 3D graphics, image processing, etc - but if you're just working on business apps then you don't need to know any math at all.
Source: started as an autodidact, got a 4 year CS degree, am a professional programmer now.
Programming is more of a tool these days, if you study math/physics you learn programming not to develop software but if only to work with matlab.
At the end programming can be classified as a general purpose skills not unlike using any other tool or any other daily skill, it's harder to define because programming is considerably more bigger than the average skillset.
One of the reason I like to equate it to being a handyman is because handymen also have a wide range of skills and specializations some are better electricians, some are better plumbers some are better builders but the ally share a pretty similar core toolkit (some pun intended).
I am pretty well aware that for the most day to day "mundane" programming task math isn't needed, it really depends on what you end up doing.
Self taught programmers are often exceedingly good at the first bit and exceedingly bad at the second bit. This often changes as they get experienced, especially if they get landed with maintaining code that they have written and take that job seriously. The truism "the other person will be you in six months" really bites.
Having said this the best programmer I know was a physicist, he was good when he interned for me, and is now a key contributor to a number of significant open source projects, producing lucid effective code.
My feeling is that programming is closer to architecture than to many other engineering and science disciples. Both architecture and software operate in an intersection of human-scale concerns, design and engineering. That leaves "wiggle room" for autodidacts to bring a vision that originates from the human end of the spectrum.
[1] Wikipedia's list of autodidact architects: https://en.wikipedia.org/wiki/List_of_autodidacts#Architects
Autodidact programmers/coders can do most of the low hanging fruits in computer science these days, they aren't that different than mechanics or handymen, every profession has a lot of wiggle room, you won't find a guy who thought himself how to fix cars as a primary engineer on a new jet engine usually unless that guy is simply a genious. And you usually won't find self taught programmers working on things that require a lot of interdisciplinary knowledge primarily mathematics and physics, you would also rarely find them in the cutting edge of the field doing things like machine learning and AI.
And to do the low hanging fruits you really do not need much experience, or knowledge these days you need to have an average intelligence, some grasp on the "rules" of a programming language and the ability to use google - you don't need more than that to build a landing page or even considerably more "complex" things that aren't really that complex once you break them up especially considering the availability of information and full examples online.
Your attitude is needlessly condescending towards programmers who don't work on something that you arbitrarily define as cutting edge.
You mention that architects benefit from a network of specialized engineers. That's really no different from what happens in software. The machine learning engineer is not automatically on some kind of unattainable pedestal compared to the UI expert -- they're professionals working towards the same goal.
The truth of the matter is that unless you have a very good fundamental knowledge of computer science and primarily math there are things that you cannot tackle as "programmer" unless you are a unique case. A self though programmer is also unlikely to be working on optimizing databases or search engines, compression, driver/os architecture, various algorithms such as video and audio compression and many other things.
I don't claim to be able to do those things and I don't mind thinking of myself as a 21st century mechanic or handyman because in the end I know that my capabilities based on my knowledge and experience are limited.
A formal education is a starting point towards gaining that understanding, but it's not the only possible entry. (Who would you rather have working on the Linux kernel: someone who has been following development for 10 years and has read most of the source code, or someone fresh out of school with a CS degree?)
Maybe you're selling yourself short by assuming you wouldn't be able to do those things?
False dichotomy. I'd rather have a CS major who has 10 years of experience and has read most of the source code. There's some pretty complex stuff in there: http://cstheory.stackexchange.com/questions/19759/core-algor....
Indicative example. I was writing code to characterize the datastream from an instrument. It was a compiler of sorts: the end user could write some domain-specific language file to specify certain metadata to observe, e.g. power spectrum in a certain band, etc. These could be reused by other users so one could have a global standard for some state of the instrument. So, I decided on a hash table to store these user-written rules since it was a constant time lookup, and the characterization program ran real time while the instrument was running. Talking with a senior physicist who only wrote Fortran 77, he asked me why I didn't just use an array since "everything ends up being an array, anyway."
There are some things that one may not pick up just from practical experience.
A chemical engineer designs a plant, but plumbers and pipe fitters (and others) are the ones who actually build the plant.
It's very strange to pretend that a certain class of people involved in designing software are the "real professionals", and the rest are just plumbers.
Software gets built automatically these days. I make a design in a high-level language and click "Build" in my IDE, and that's the construction step. It can be repeated as many times as needed -- changing a line of code and rebuilding is the equivalent of tearing down a cathedral and reconstructing it from scratch just to change the position of one stone. In the world of bits, that's a perfectly reasonable thing to do.
Some 50-60 years ago, there used to be professions of actual "software construction workers": punch card operators, magnetic core memory weavers... But those jobs were automated away.
If I copy&paste a line of PHP, it's certainly not a great feat of design. But it's still design, just as dropping in a wall element in AutoCAD is design rather than actual construction.
Calling a group just plumbers is to me condescending: it's a trade that requires creative thinking, knowledge, experience, and a willingness to (literally) deal with other people's sewage. Plumbers are the real MVP. But the same is fairly said for other professions and trades (excepting that, one hopes, the sewage is figurative). There is a difference between those who are self-taught or taught on the job versus those educated in academia, and there are many situations when it's useful or important to be able to distinguish between the two groups. The difference in training doesn't speak to the quality of work, but it does speak to expected capabilities.
To begin with, computer science theory is more akin to what you describe as "actually building the plant" in the sense that it's concerned with the details of algorithms rather than how to design software. Some schools make an honest attempt of the latter but it is in my opinion I haven't seen much useful come out of it. There's simply no replacement for reading other people's code.
Let's also not pretend that academic merits guarantee anything in itself. I've worked with people who couldn't reason about even the most trivial data structures or complexity who somehow had solid degrees in that very subject. How they went about that I do not understand.
I doubt you can reliably tell an autodidact programmer from a formally trained one. Computer science is much too young, and although we want to see us as just another math heavy engineering discipline, that's not all there is to it.
However, you are not pushing frontiers in computer science. That's the key issue here: the physics autodidacts all think that they have an idea that can blow away several hundred years of well-tested scientific theory.
CERN and every single particle accelerator in the world can run only because Einstein's theory is taken into account.
GPS timekeeping works only because Einstein's work is taken into account.
Categorization of most autodidacts as useless cranks is a bit extreme. Perhaps you didn't read through to the last paragraph of the article:
"I still get the occasional joke from colleagues about my ‘crackpot consultant business’, but I’ve stopped thinking of our clients that way. They are driven by the same desire to understand nature and make a contribution to science as we are. They just weren’t lucky enough to get the required education early in life, and now they have a hard time figuring out where to even begin..."
I think you missed the point of the article. Most of these "cranks" are people trying to learn. They are excited about science and are trying to reconcile the bits of knowledge they have been able to accumulate from often-terrible sources (poor quality education system[1], mass media, "science journalism" that leaves out the science).
Carl Sagan discusses this type of person in the beginning "The Demon Haunted World", where he talks about a cab driver who was really excited to meet "that scientist guy" (Sagan). The cab diver's excitement faded quickly when Sagan's answers about his pseudo-scientific questions tended to be "sorry, that doesn't exist". Sagan also observed that the cab driver was almost completely ignorant of the actual discoveries of modern science.
"[He] had heard virtually nothing of modern science. He had a natural appetite for the wonders of the Universe. He wanted to know about science. It's just that all the science had gotten filtered out before it reached him. Our cultural motifs, or educational system, our communications media had failed this man. What the society permitted to trickle through was mainly pretense and confusion. It had never taught him how to distinguish real science from the cheap imitation. He knew nothing about how science works."[2]
I commend Sabine Hossenfelder for finding a creative way to approach the difficult task of teaching people even when they seem like a "crank". This is important work because a successful democracy depends on the people having sufficient education. Instead of calling people "cranks", try to see things from their point of view and try to point them on a proper path towards a proper understanding science. Ignoring or insulting "cranks" leaves them isolated and ignorant; teaching them how to use a "baloney detection kit"[3] and maybe their enthusiasm can be reorientated to real science.
[1] http://www.nytimes.com/2014/07/27/magazine/why-do-americans-...
[2] https://books.google.com/books?id=Yz8Y6KfXf9UC&pg=PT22
[3] http://rationalwiki.org/wiki/The_Fine_Art_of_Baloney_Detecti...
Sort of like the people who think computer "hacking" is like what you see in movies?
I credit the compiler as The Great Filter for autodidactism working so well with programmers. It's good to have a tight feedback loop.
That's an interesting idea, I've noticed over 30 years of programming that in general the programmers who learned programming using compilers (particularly the more 'pedantic' ones) are generally more rigorous than the ones who learned with interpreted languages.
I've also noticed that (again a horrible generalisation) that the ones who learned with compilers are more likely to check return values and such even interpreted languages.
Personally, I've always preferred 'simple' languages that have insanely pedantic compilers over interpreted languages (which is somewhat amusing since I spend my life writing Python, PHP and Javascript) particularly ones with strong typing as most errors I make are simple assumptions that foo is TypeA and it ended up TypeB.
http://i.imgur.com/0Ou29x3.png
The Compiler is Cruel, but Fair.
Imagine if I didn't recover, but instead continued building more constructs onto the false foundation for days, weeks or months.
But, no, your point is, it doesn't really matter what crazy theory you have about how computers work, because running code is the ultimate arbiter of success. If you can't pass the compiler, you can't even start.
neat.
I imagine this is true for many trades. One can be an effective autodidact carpenter. An effective autodidact musician. An effective autodidact writer.
It's interesting to consider which trades being an autodidact is seemingly most difficult in. Being an autodidact doctor or surgeon seems a major stretch, regulatory issues aside. Being an autodidact civil architect or even mechanical engineer seems difficult as well, though no doubt possible for some. Perhaps the worse the consequences of mistakes (doctor, surgeon, architect) and the higher the bar of knowledge to be effective (mechanical engineer in advanced spaced, doctor, etc) the less likely autodidacts are to be effective. This reconciles well with programming being a feasible autodidact field -- consequences are neither as dire as being a surgeon nor failures as clear to see and measure as being an architect, and it doesn't take a great deal of knowledge to get started and be productive in programming.