1. 5
  1. 5

    I really don’t get the love for HyperCard. I used it when I was younger and I thought it was a silly, error prone thing that existed halfway between “real” programming and creating a document. I know you can do complicated things in HyperCard, but you shouldn’t. And while it could teach some programming concepts, I always felt like it did a much worse job of it than just teaching someone BASIC at the time, or teaching someone HTML/CSS/JS today.

    I think people with nostalgia for HyperCard have an unrealistic view of it. I have nostalgia for QBASIC, but I realize it was objectively a piece of crap and I would never bemoan the fact that some new programming tool is not QBASIC. I feel like the HyperCard worshippers need to adopt the same view; it’s ok to have nostalgia for the tool of your youth but very silly to bemoan that nobody has recreated it.

    1. 5

      I was playing with HyperCard in an emulator recently, and for >90% of what I do, I honestly much prefer it even today to HTML/CSS/JS. Well, with a bit of updating of the UI and such. The only reason I use the web stack is because I have to for deployment, since that stuff is built into browsers, not because I consider it to be particularly good, and certainly not because it’s in any way less error-prone. Even getting really simple things to work in this mess of a programming environment is highly error-prone.

      1. 7

        An important thing that HyperCard offered was that there were useful things it could accomplish without any code. It’s an on-ramp to motivate beginners.

        It’s worth noting that HyperCard came at a time when BASIC and Logo had recently ceased to be viable as on-ramps, both because they no longer came bundled with computers and there was a high barrier to learning about and acquiring software pre-web, and because by that point everything needed to be GUI to hold anyone’s interest.

        And I think it’s worth expanding on the GUI point. People eventually made several GUI BASICs meant for learning (I remember ChipmunkBasic), but they really never got to the point that even an expert could make what looked like a polished, professional app with a reasonable amount of time investment. Wrapping platform-native widgets has this problem to this day, even in frameworks meant for professional use, and these early efforts had much worse UX than what we see today in Qt or Tk.

        HyperCard took a very interesting stance here; it made no attempt to provide all the UI capabilities that native apps had, but provided a polished experience with a subset of the widgets and a uniformly-sized window that “stack” creators could fill with whatever image they wanted to provide their controls with labels and logical groupings. That modality also made it easy to add decorations, and that outlet for visual creativity probably helped its popularity a lot. The end result was that HyperCard stacks didn’t look or feel at all like native apps, but they had a consistency of their own. It is much like the role the web has today.

        1. 5

          Well said. I was deep into Hypercard as a middle schooler, and it colored a lot of my later programming interest.

          I thought its packaging and sample stacks were fascinating, with several examples of real, serious applications such as property parcels viewers and interactive databases. It was clearly thinking forward to client/server applications, and I’m reminded of it when reading the 1996 Steve Jobs interview about WebObjects being able to create such things on the web:

          For example, it took Federal Express four months to build its Web site – using WebOjects, you could build that same site in four hours.

          [Mr. Jobs then showed us the Chrysler Corporation Web site that the NeXT team built with WebObjects and an Oracle 7 database. During this demonstration, Mr. Jobs searched the site for several specific models of cars, at different price ranges, in different colors, and sorted in different ways, and each time he was instantly presented with a Web page that included all the cars he had requested. He also showed how the NeXT team had built a custom function into the site that allows customers to calculate their own financing options and identify which dealers have the exact models they are looking for.]

          Jobs: It takes your request, parses it in WebObjects, grabs all the data, and dynamically builds it into a Web page for you to browse. The way we set up the car financing feature is that it actually sends an OLE call to another Windows computer that launches an Excel spreadsheet that does the calculation for you, and then OLE messages the information back and shoves it onto the Web page. You can’t possibly do this in a static environment. I would think that this site is, what, an order of magnitude or two more dynamic than any other Web site out there right now. Wouldn’t you agree?

          1. 2

            Visual Basic and Delphi were both simple-onramp programming languages with very effective drag and drop GUI builders on Windows, frequently not even needing code. I’ll grant you that cross-platform has never worked, but many polished, professional apps at, e.g., banks are still VB under the hood.

            1. 3

              I agree with those points, and I didn’t mean to suggest that HyperCard was unique in being well-loved. It was certainly unique on the Mac, and, like many young people at the time, I didn’t have a choice about what operating system to use because “my” computer was shared by the entire household.

              1. 1

                How easy were Visual Basic and Delphi for non-programmers though? By that, I mean how much could you really build without knowing any programming concepts? UI is only one part of the equation - I’d argue that gluing everything together still needs some programming knowledge. Yes, maybe less than building the same application in C, but you still need to understand quite a lot to build even a simple application.

                VB, in the form of VBA, is a great stepping stone language though - those who start off wanting to do more with, eg, Microsoft Office macros, can move to VBA and then to full-blown VB.

          2. 2

            HyperCard, Visual Basic, qbasic and the like fit into a place where nontraditional programmers could nevertheless create meaningful programs that solved real problems. I’m pretty confused why you’d call qbasic an objective piece of crap but then recommend people learn html, css, and js, too. Did easy to use coding tools bite you as a child?

            1. 4

              In a way they did. QBASIC taught me some bad programming practices because of the way it is designed. A better designed system for learning would start instilling good habits from the very beginning. Now granted HTML/CSS/JS have a lot of terrible pitfalls in them, and because of that they aren’t ideal either.

              For me being “easy to learn” is too low of a bar, especially for the way some people revere HyperCard. It should be easy to learn and teaching solid programming habits instead of instilling terrible ones that people will then have to unlearn.

              1. 12

                But you’re assuming people want to learn good practices while programming. Many people don’t, they just want to solve their problem and not think about the code anymore.

                I don’t like it either, but there was a huge amount of VB out there that mostly-sorta worked that kept businesses going. I’d call that a success even if it was rotten code.

                1. 2

                  I guess it’s a difference of philosophy and what we value. If something is an unmaintainable nightmare, even if it “works” I don’t consider that good. Because somebody has to deal with that nightmare. It’s causing misery and aggravation even if the business owner gets to ignore it.

                  Maybe I’m sensitive to that because most of the applications I maintain are total nightmare crap written by deranged baboons.

                  1. 4

                    I don’t think we are that different. Most of my current/former coworkers would probably call me too much of a hardass about code quality. But that’s OK, because it’s my job.

                    Other people might have things that benefit from programming but it isn’t their full time job. It’s OK that they aren’t using dependent types and microservices. They aren’t interested in that stuff. That’s fine with me! Business culture is remarkably good at adapting to poor workflows, all the way down to “email this excel file around and yell when you are changing it so no one else does.”

                    For those situations, even a little bit of programming provides an immense amount of leverage. That is what’s important! Those sorts of jobs are typically super hacky messes that fall over if you look at them the wrong way. If that part of their workflow starts to hinder their growth, well, they can bring in a ‘Real Programmer’ to sift it out.

                    As for your situation: I couldn’t deal with always maintaining other people’s poor code. I care too much about building things well to be able to do that well. I much prefer to start projects off well and grow them into something that is easy to modify/extend later on, and move onto the next project.

                    1. 1

                      I used to think that code quality was an in unto itself, but the more I’ve had to to code that I get paid for (and hence code whose main objective is to do its job) the more I think that that’s a counterproductive worldview.

                      I can think of a lot of TI-Basic programs I wrote. Total garbage, single character var names…still helped me do my homework.

                      Modern languages–and their ecosystems and communities, dear god!–seem to be a lot harder.

                  2. 16

                    Even assuming for a minute that the purpose of QBASIC/HyperCard/VB/etc. were to advance you pedagogically towards Idris and Agda, I’d propose to you that the good things that they taught you – how to type in a program, how to debug errors, what a loop is, what a variable is, the fact that a computer can be made to work for you rather than as a mere object of media consumption, vastly, stunningly, and overwhelmingly outweigh any temporary bad habits you may have picked up along the way. The score is like, a billion to three.

                    What is a precocious 10 year old to do today, in the absence of a usable and approachable computer manipulation language preinstalled on his computer, his friends' computers, their friends' computers? Install linux, fight through systemd, resolve all the nonsense of maintainers holding upstream packages captive, install python, figure out which of easy_install, pip, wheel, egg, and whatever is the paradigm today, figure out she accidentally installed python3 so no programs actually run, uninstall, clean up after apt breaks systemd-logind-gnome3-login-manager-d-bus-d-kernel-dbus-d, and then start writing programs using, say, emacs in evil mode?

                    “objectively”, as you say so fervently, we’ve lost something important. Call me a “bemoaner” if it somehow makes you feel better, but don’t let’s pretend that kids, busy parents, businesspeople, artists, musicians, and other people too busy to pick through monad tutorials aren’t also a key and important and vital constituency of computing.

                    1. 4

                      The score is like, a billion to three.

                      I get your point but the score is more like 10 to 7. I agree the good outweighs the bad, and if you read my previous comments you’ll see I say it’s ok to have affection for the tools you learned with but what I object to is how people treat HyperCard as if it’s some holy grail of computing. It’s not.

                      What is a precocious 10 year old to do today, in the absence of a usable and approachable computer manipulation language preinstalled on his computer, his friends' computers, their friends' computers?

                      That would be where Swift Playground steps in. Hopefully it does a better job of teaching good practices while still being approachable.

                      1. 19

                        I have 30 years of professional software engineering experience and am sitting at a fully configured mac laptop. Let’s do this.

                        1. apple-space ‘swift’. It offers me the dictionary definition, a link to the SWIFT protocol, and a link to apple’s website.
                        2. I try to click on ‘swift’ and the search results actually change under my cursor, and the thing I click on before I can stop is ‘Apple Watch Simulator’, which opens up a blank apple watch simulator window underneath my current window. Find it, close it.
                        3. I apple-space swift again. Now the simulator is at top, but one second later, it changes to the apple swift page. I click on that successfully.
                        4. Chrome lets me know that apple’s HTTPS protocol isn’t secure by crossing out the https and putting a broken lock up there in the URL bar. Super helpful. Lots of action I can take there.
                        5. Read the page. Lots of marketing superlatives. Swift Playground for ipad, but not for a desktop computer, apparently? Near the bottom, it tells me to install xcode. No link, no instructions. As it happens, I do have the multiple gigabyte xcode download installed and have successfully enrolled in the apple developer program ($99/year) and have correctly set up my provisioning profile already, as well as run ‘xcode-select’ to pick my command line tools up. But I’ve never run swift before, and apparently it’s easy, because the Swift page says “playgrounds in Xcode make writing Swift code incredibly simple and fun. […] The LLDB debugging console in Xcode includes an interactive version of the Swift language built right in.” Oh fuck yeah, what says ‘fun and engaging’ like the motherfuckin' LLDB debugging console! Let’s DO this!
                        6. open xcode. Wait patiently (with no cursor change) while xcode lurches into existence and doesn’t even open up a window, just changes the title bar.
                        7. File -> New -> Playground. A window opens prompting me for a location. Ominously, above it, a blue bar starts creeping: “Processing symbol files.” What’s a symbol file and who would care, and why would my computer fans start working like crazy for minutes trying to “process” them?
                        8. I create a ‘playground’. I see a black window, apparently an editor, with a preloaded twee comment ‘//: Playground - noun: a place where people can play’, and ‘import Cocoa’ (what is cocoa?) and ‘var str = “Hello, playground”. After a minute or so, without explanation, a sidebar pops up on the right which shows “Hello, playground” in white. What is it there for?
                        9. The icons on the top of the window are a stack of blue lines, a venn diagram, a switcheroo arrow pair, a box with a line on the left, a box with a line on the bottom, and a box with the line on the right. The icons on the top left are four boxes with haphazard connections, a greyed out unclickable left chevron, a greyed out unclickable right chevron, and MyPlayground with a document icon, which is the only comprehensible piece of UI. Apparently that bar is supposed to be a tab bar or something of that type, and MyPlayground is the one item on the tab bar. OK. The icons at the bottom of the window are a CD eject button and a blue play button.
                        10. I hit the blue play button. It changes to a stop button with a little pulldown icon that does nothing but provide a tooltip, then back to play, and nothing happens.
                        11. I add ‘print str’ after the var declaration. A tiny red circle with a white circle inside it appears next to that line, with no error message or feedback, and a tiny little brown arrow appears where I may have made a syntax error. Hovering over the brown arrow does nothing. Hovering over the red circle does nothing. Clicking on the red circle causes the error messages to finally actually show up: “consecutive statements on a line must be separated by ‘;’”. THIS IS NOT ACTUALLY THE PROBLEM. I AM NOT MAKING CONSECUTIVE STATEMENTS, I HAVE INSTEAD TRIED TO USE PRINT WITH THE WRONG CALL SYNTAX.
                        12. I fix the syntax. Now it’s time to write some code! I have an urgent business process. My process involves opening up a file and reading from it, and printing out any addresses that are in Iran, because I am an import-exporter of electronic goods and services and cannot ship there. Let’s DO this.
                        13. I type ‘var f = open(’ and immediately Swift appears to offer me the various forms of open as an autocomplete helper as an IDE should. Here’s what I see: http://imgur.com/W4lJaWK
                        14. OK, I have no fucking idea what a darwinctrune_t tolowerl(__darwinctrunet, locale_t) is or how it will help me stay out of trouble with the export regimes, but that String parameter looks good.
                        15. I finish out the line: ‘var f = open(“/tmp/testfile”)’. There. That looks like the right way to do it. Uh oh. After a delay, a little red stop sign with an exclamation point appears (but no error message or diagnostic). I click on it.
                        16. The actual error appears: “cannot invoke ‘open’ with an argument list of type ”(String)“. Wait, why did it offer me type String as my first choice in the autocomplete if I can’t do it that way?
                        17. Oh, it turns out what I thought was autocomplete was ACTUALLY OFFERING ME EVERY FUCKING TYPE ON THE ENTIRE SYSTEM BECAUSE IT COULD NOT INFER THE EXPECTED TYPE OF THE FIRST ARGUMENT OF OPEN? The scroll box turns out to be hundreds of lines long. What the.
                        18. Out of desperation, highlight the word ‘open’ and right click, expecting to get a definition or some help with it. Options include ‘open in Assistant Editor’ (what on earth would that be), ‘Reveal in Project Navigator’ (what), ‘Reveal in Symbol Navigator’, and, hilariously, ‘Show in Finder’. Maybe it’s ‘Reveal in Symbol Navigator’, because I happen to know that computer function calls involve symbolic manipulation. Right click on that.
                        19. The following sidebar silently opens: http://imgur.com/MC0DgMQ

                        This thing is the most abject failure I think I’ve witnessed in the last several years, and I’m currently writing node.js and using mongodb because my client has mandated it.

                        1. 1

                          Are you for real dude? Come on. I don’t even know where to begin with this.

                          1. 6

                            Try list item 1, and work down from there.

                            I think that @felixgallo has a totally reasonable observation here, though it’d be more reasonable to start in a web browser and pull up a console, or a terminal and pull up bash.

                    2. 1

                      what bad practices did it teach you? i had qbasic as a second language (bbc basic was my first) and i found both dialects excellent for learning. i also learnt a lot about writing maintainable code from my basic days; it’s certainly possible, and even easy, to write spaghetti code, but that doesn’t mean spaghetti code is all the language supports.