6 ms·
A great way to become a cynic and pessimist about programming is to get a computer engineering degree. Once you understand computers at the gate & flip-flop le
by gpcz 13y ago
A great way to become a cynic and pessimist about programming is to get a computer engineering degree. Once you understand computers at the gate & flip-flop level, you realize that most of what people argue about on the Internet is window dressing.
- choult 13y agoClearly, then, you're not a true cynic until you understand how transistors work at the quantum level...
- StavrosK 13y agoWeird, I got an engineering degree, learnt about gates and flip-flops and transistors at the quantum level and still think discussions about tools have merit. Just because there are levels below the one you're using doesn't mean you shouldn't use it.
- michaelochurch 13y agoExplain this. I'm not disagreeing or challenging you. This is interesting and I'd be curious to hear more. What happens at the gate level that makes language-level concerns less interesting? To me, I think that low-level and high-level computing are fundamentally different in terms of their concerns. You can get multiplier-type effects with successes at the low level (if you're really expert) and that's what pushes Moore's Law, innovations in GPU technology, etc. However, making computers useful to other people (including programmers who, working day-to-day, can't possibly understand all the moving parts) involves an entirely separate set of concerns. What I think is "just window dressing" is a lot of the business mediocrity that gets dressed up as "scaling" or actual computer science (to the ignorant). The Business tends to overvalue parochial, shallow, and not very transferrable knowledge while undervaluing genuine computer science (much less mathematics). But there is junk at the low (make some mediocre product built with shitty technology 10% faster) and high (business bikeshedding) levels of abstraction.
- gpcz 13y agoWhat I believe low-level computing teaches you is that fundamental computation hasn't changed (architectural or system-level) for decades. We've had Lisp (and its associated software improvements) since the late 50s, protected memory and multitasking since the late 60s (OS/360), virtualization and security since the early 70s (VM/CMS, Bell–LaPadula Model), GUIs/networking since at least the mid-70s (Xerox PARC), and formal computer security models since the mid-80s (Rainbow series). In the last few decades we've seen some dramatic improvements in semiconductor miniaturization, a couple architectural improvements (just off the top of my head, ASLR, W^X, and the Pentium's RISC-to-CISC design, though there are some others), and then mostly a lot of integration (computer+phone, computer+car, computer+plane, etc) and software craftsmanship based on principles developed decades ago. I'm not knocking craftsmanship (we all pay the bills practicing it), but due to design decisions made decades ago (such as the security nightmare that is Von Neumann architecture) we base software quality on how few mistakes individual artisans make rather than design systems that prevent artisans from making mistakes.
- michaelochurch 13y agoThanks. That's an excellent reply. What alternatives to the Von Neumann architecture would you want to see, and what are the major differences? Why do you think VN machines "won", given their deficiencies?
- gpcz 13y agoThere are two major competitors to the Von Neumann architecture, and then a few speculative ones. The most popular one is Harvard architecture, where code and data are in separate memories (improves security and performance, but makes loading code difficult). Most modern processors operate like a Harvard architecture machine when they are running directly from cache, but they act like Von Neumann machines when they have access to RAM. This means that they get some of the performance benefits, but you need hacky things like W^X to get (partially) the security benefits. The other one is dataflow architecture, which involves representing programs as a digraph where nodes represent instructions. Data flows through edges from one instruction to the next non-deterministically. This was popular research material in the late 70s and early 80s, but there were efficiency concerns. IBM (and Von Neumann) also dabbled with making computers that resembled neural networks, but VN passed away before he could dedicate a lot of time to it. AFAIK IBM's neural computer is still in research phase. I'd say Von Neumann machines "won" for a few reasons. First, Von Neumann consulted for IBM in the department that developed their first commercially-sold computers, so he got a lot of creative control. Second, as Hennessey and Patterson wrote in Computer Architecture: A Quantitative Approach, advocates of Von Neumann computers regarded HA machines as reactionary, implying there was even some religion back then. Third, Von Neumann architecture machines are significantly easier to load programs into. My guess is that a combination of business/political concerns on IBM's part in the 50s and 60s combined with momentum and switching costs is the main reason VN machines continue to win.
- rom16384 13y agoNot quite. One thing that is easy to miss is that "more is different" [1], that is, although we might understand the elementary components of a system, when these interact in a large number new phenomena can emerge (e.g. phase transitions). [1] P. W. Anderson, https://www.sciencemag.org/content/177/4047/393.extract https://www.sciencemag.org/content/177/4047/393.extract
- tinco 13y agoI'd disagree with you. I have a CS degree, and knowing the basics of Computer Architecture doesn't do anything to people participating in debates over software development tools. If anything it should make you realize that tooling is very important, as you get to experience first hand the enormous increases of potency each abstraction level gives you, from electronic gates to bit codes to asm to C to Smalltalk or Lisp. If any of those levels opened up your eyes to the power of tools, why wouldn't it open your eyes to many other technologies? Some good fundaments for your arguments make sure you can build a good opinion. I like Ruby because its object model is near perfect, I like C# because it's got one of the most powerful syntaxes out there, I like Haskell because of the incredibly pure functional style and I like Javascript because it runs in the browser (of course I write CoffeeScript so I don't have to deal with some of its failures). Do I think these technologies could be better? Yes, but that doesn't mean they're window dressing, and it doesn't mean I'm not optimistic about them. Also, I'd definitely argue the crap out of anyone who dares to disagree ;)