\n\nAppleScript: this is one of the worst programming languages I've ever used. It's been described as \"read only\" and this is pretty apt. Superficially, it looks like HyperTalk, but while HyperTalk is loosely typed (everything is internally a string or a number, and you don't need to care which), AppleScript is strongly but implicitly typed, leading to endless frustration and incomprehensible errors. This was not helped by Apple's atrociously lacking documentation (I only got anywhere with it by buying a very expensive hardcover book, whose title escapes me). Automator is a brilliant effort at exploiting the underlying system hooks that AppleScript uses, but AppleScript must rank as one of the most epic design failures of Apple's history.\n\nVisual Basic: a simply stunning achievement, Visual Basic was probably -- in a sense -- the best thing Microsoft has ever done. Just as Apple took the Xerox PARC GUI and made \"obvious\" changes to it to create something vastly more capable and better in every way, Microsoft took HyperCard and made \"obvious\" changes to it to create something better in many ways. It treated media types -- well images -- as a nearly native type. It let you build native UIs. OK it ran way slower than HyperCard, and was far less productive to code in than HyperCard (because you couldn't customize the dev environment for the project you were working on), but you could produce a professional-looking end-result, and the internal programming language was far less horrific than Authorware's. After three years of multimedia development with Authorware, I went to work for a large consulting company and started developing multimedia and \"front office\" apps using Visual Basic.\n\nHTML: the chief reason I learned HTML was to create a website for Prince of Destruction (the link is to -- essentially -- the original HTML). HTML isn't really a programming language, but it's worth mentioning as my first foray into web development. My proudest achievement with early web development was figuring out how to produce really nice animated GIFs (versus the revolting ones you usually see) exemplified by the animation in this page here. OK, nothing much to boast about -- but it was stolen quite a bit, and I got quite a few emails asking me how the frack I did it. (Hint: if you \"render clouds\" in Photoshop and your image has power-of-2 dimensions, the result will tile.)\n\nDirector/Lingo: developing multimedia with Visual Basic was a bit like teaching a dog to walk. Sure, you could do it, but... Once Director 4 came out its superiority to Visual Basic (or anything else) for multimedia development was simply overwhelming. I ended up making an end-run around my boss (who was dedicated to Visual Basic development -- not so much by temperament as company policy) and showed a mockup of a major product we were building for them in VB build in Director. Our next version was built in Director -- but not by me! Instead we hired the local Macromedia distributor's top instructor to write it, and I was only called in when performance and bugs were found to be so bad that the client was threatening to walk out. I ended up \"rescuing\" the first project and writing a new codebase for follow-up projects.\n\nToolbook: this was a simple Windows clone of HyperCard but -- as with Visual Basic -- with the \"obvious\" deficiencies fixed. It supported color natively, and its controls were native. You could produce decent looking software with it. Like HyperCard it was astonishingly stable (it's amazing how flaky tools were back then -- HyperCard and Toolbook are probably the only 90s multimedia development tools that could remotely deserve the adjective \"stable\"). We ended up developing an astonishingly rich proof-of-concept demo in Toolbook (integrated with the VB/VC client software) in a matter of one week (albeit 18h days), won a huge contract, and then promptly failed to deliver by switching to VB and Robohelp for development. (Most of my \"proof of concept\" code tends to be robust and functional enough for deployment -- I'm weird that way. I don't think the \"real\" system ever got significantly more functional than our hack demo.)\n\nJava: relatively early (as in 1996) I got interested in replacing Director et al with web technologies. I thought the web was The Future and every technology would be eventually subsumed by the Web. Ironically, I then -- stupidly -- avoided learning much about web technologies for some time -- in large part because I got burned so badly by Java. Java did one thing Object Pascal nearly did but failed to do -- it got rid of pointers while being a real language. In every other respect, Java is pretty much mediocre-at-best. From an end user's point of view it was unbelievably slow (now it's just slow to load) and ugly -- but hey, it was neat that it \"just worked\" more-or-less everywhere. From a language point of view it was a clumsy language design (OK, it was nicer than C++) but it was cool that it had a virtual machine and a lot of libraries. From a library viewpoint the libraries were terrible, but it was nice that the language and VM were there. And from a VM point of view it was a very poorly implemented VM. My first serious Java project involved implementing navigable 3D panoramas (kind of like QuickTime VR, which was our inspiration). At the time, QuickTime VR was really impressive for end-users and a royal pain in the ass to develop (pretty much par for the course for Apple 1984-2003), so we decide to hack together an alternative. Essentially -- render 360 degree panorama, scroll it within a view port, define \"hotspots\" with links in the web page and have them implemented by the \"plugin\". I developed two versions of this -- one in Java and one in Director/Shockwave. The Director version was so stupendously superior in every respect I've never used Java again. (The only \"multimedia\" features I was using were drawing a picture and drawing lines and rectangles.)\n\nGames were always my first and best reason for using computers, and one day -- out of the blue -- a guy who I'd had passing contact with while trying to find a publisher for Prince of Destruction called me and asked if I was interested in looking at a game design project. I met with him and a colleague at a conference, he showed me the project, I -- off the cuff -- gave my opinion on how I'd redesign it -- and I was hired. A few weeks later, I'm pitching my design (for which I was never paid, incidentally) to a boardroom full of strangers at a company named Garner MacLennan. It's a really nice boardroom. There are state-of-the-art 3d graphics framed on the walls, and industry awards everywhere. I've just come from work, gotten lost, and run to the meeting in a suit. I stumble in, get asked to pitch my design to prospective developers and money-people for the project. I give a 30 minute pitch -- completely unprepared (I'm working 16h days for the Big Consulting Company and I haven't heard from anyone about the project for weeks or months) -- answer a few questions, and am then, basically, dismissed.\n\nA few days later, I receive a call from a gravelly-voiced fellow who would like me to come over to Garner MacLennan for a chat. I end up having a conversation with Stewart MacLennan and Jeff (I forget his surname, but it's not Garner who had been bought out some years earlier) -- the two top guys in the company. Would I like to join them to run an interactive/games division?\n\nC/C++: I'd dipped my toes in the C/C++ world many times before, but if I was going to do hardcore game development -- or even just supervise coders -- I needed to learn C and C++. So I did. I can't say I was ever proficient or comfortable -- C++ manages to implement all the obviously needed things from Object Pascal (et al) while achieving zero elegance. We licensed a 3D library (from Virtually Unlimited -- a Swiss company that has since disappeared from the face of the Earth and even, it seems, the web) that offered both software and hardware-accelerated 3D, and which cost under $50,000 -- making it very compelling.\n\nWe built a very flexible OO game engine, and started building our game -- but we were crippled by several problems. First, it was very hard to hire decent game programmers in Australia at the time -- almost impossible, in fact. We could find them in the US, but their salary expectations were freakishly high by our standards, and US coders tend to be ridiculously specialized by Australian standards. (A typical Australian developer is used to doing absolutely everything, Americans want to be told which position in the assembly line they'll be sitting in. The US system scales better -- well, it scales period -- but it has a very high cost of entry.)\n\nChiefly, our problem was that we weren't three talented college dropouts in a garage -- that ship had sailed with Prince of Destruction (only we weren't dropouts, which itself was a disadvantage because we'd wasted several years getting college degrees) -- we had serious salaries, serious lifestyles, no desire to work 20h days, and we had something to lose -- like the $250,000/year I could bring in from corporate multimedia development with virtually no effort. So as a AAA game developer, I failed miserably. But I did ship several kids' titles -- two very successful -- and make a tidy amount of money on corporate multimedia.\n\nRealbasic: despite continuing efforts to bloat it and turn it into C++ without pointers, Realbasic remains the most elegant real language I've ever used, and the most pleasant and productive programming environment for writing desktop apps -- at least relatively small and simple ones -- I've ever seen. I've written numerous programs in RB over the years -- I was user #2 -- Andrew Barry being user #1, was a technical referee for the first edition of O'Reilly's RealBasic: A Definitive Guide, and ran the most popular RealBasic forum until Real Software finally created its own official forum.\n\nBlitz3D: every time I find out about a new 3D game development tool (that doesn't cost six figures) I'll give it a shot. Blitz3D was the first such tool that just grabbed me and didn't let go. It was Basic, but with the \"obvious\" problems fixed, and a first-class hardware-accelerated 3D engine just sitting there. I got as far as developing the basics of a space shooter and the basics of a dungeon crawler in it before Real Life took over (i.e. my corporate multimedia money tree died) and I had to get a Real Job. I never really got into BlitzMax, chiefly because proper 3D support has yet to appear, and meanwhile the stupendously superior Unity 3D came out.\n\nPHP: my wife is a Social Psychologist, and a lot of her research involves questionnaires. I think using paper questionnaires is ridiculous, so I suggested she might be better off using electronic questionnaires -- and of course it fell to me to implement them. I ended up writing RiddleMeThis for her doctoral dissertation (it's now in use at quite a few universities, and earns me \"Chinese Takeout Money\"). To handle web deployment I wanted to use the most ubiquitous possible technology with the simplest possible end-user setup. In other words, I had to pick between perl and PHP. I implemented the basic runtime in both perl and PHP, and quickly picked PHP. I know there's plenty of prejudice in both directions, but I think in the end that if you love the UNIX command line, you probably think perl is clearly superior. If you don't, you don't. I don't. Back when I first worked on RiddleMeThis, PHP4 was current, PHP3 was still common, and OO programming in PHP was a bit of a nightmare. I've recently switched to near fulltime PHP development (some of my time is spent in Realbasic and JavaScript) and am using PHP5's OO extensively -- like everything in PHP it's a lot uglier and messier than it could be, but it's not terrible. PHP is the Visual Basic of Web Development -- I've yet to find the Realbasic.\n\nFlash/ActionScript: I got a job in Web Advertising and naturally had to learn Flash and ActionScript. (Most of the ActionScript in the world is so remedial it makes you weep -- kind of like how until about 2004 the chief purpose of JavaScript was to implement rollovers.) ActionScript 2 (and 3, but I've never had to do anything much with 3) is a nice language -- very similar to JavaScript -- and the class library is quite nice, but Flash itself is horrible. (CS4 supposedly -- finally -- addresses its major shortcomings, such as its astonishingly poor drawing and animation tools (recall that it is, at its heart, a drawing and animation program -- the programming language and VM were added long afterwards), but I have, thankfully, not had to do much of anything with Flash for quite some time now.) I've wasted enough of your time if you've read this far for me to provide a litany of Flash's lousiness, but a decent examination would be longer than this ridiculously long post.\n\nPython: the reason I got into Python is that for several years my wife worked in a VR lab, and the tool they worked with was programmed in Python. As a result of this, the hairier programming problems always fell to me. I really like Python -- it's kind of close to my idea of a perfect language, except for indentation. I think that semantic indentation is perhaps the stupidest thing I've seen since C declarations. If there's a language feature guaranteed to provide ammunition with which you can blow off your own feet, take your pick. It's said that in conventional C programming 50% of code (and hence bugs) are related to memory management. In my experience, the thorniest bugs in Python are almost always related to indentation -- which is pretty sad, because Python has eliminated a lot of other common sources of bugs (including most memory management) through good language design. Oh well. (The other major failing of Python is that it's too dynamic to be easy to compile and -- frankly -- producing reasonably good interpreted languages isn't particularly hard (I've written a few interpreters in my day -- nothing major) -- producing something like Python that compiled to small, fast binary code -- now that would be cool.)\n\nJavaScript: I avoided JavaScript for a very long time, owing almost entirely to prejudice. When you first work with JavaScript there are two things that are likely to infuriate you -- or at least there were in 1998, say, when I first started messing with it -- first of all you have this huge, mostly/badly undocumented thing to code against -- the Document Object Model. That's not JavaScript's fault, it's the browser's fault. But it gets blamed on JavaScript by people who don't know better -- i.e. most JavaScript coders. The other is the absolute lack of good debugging tools. (This is somewhat, but only somewhat, addressed by modern browser debuggers such as Firefox's Firebug, and Safari's and IE8's built-in debuggers.) JavaScript debuggers were still pretty much a pipedream when I was forced to get serious about it -- I implemented a bunch of ad unit types for Fastclick.com (which never were released) and then Valueclick Media (some of which are still in use). It was very educational. Today, I'd say JavaScript is my favorite language of all time -- even better than Realbasic. Yes, it has lots of ugly stuff, but you don't need to use them. Yes, the DOM is revolting, but you don't need to look at it too often. The chief problem with JavaScript -- as with Python -- is that it won't compile to small, fast binary code. If it did it would be The Holy Grail.\n\nPerl: I first grappled with Perl when developing the online runtime for RiddleMeThis, but had to really learn it once I started writing server-code at Valueclick Media. My first example was porting PHP code I had written which dynamically generated ads from an XML feed to HTML/JavaScript to Perl. Later I would write UI code for the admin system in Perl (which made for great demos but for various reasons I think it never went live). Nothing I've seen of Perl has made me regret picking PHP for most of my web development. The things Perl programmers seem to be proudest of are things I think are basically shameful -- writing code that makes no sense when first inspected. I also think that any language -- including PHP and BASIC -- that requires you to type some special symbol (like $) in front of variable names was created by a mental cripple (I realize UNIX shell scripts fall in this category, but they have the -- partial -- excuse of being an innovative hack from yesteryear). If you need to use different special symbols for different kinds of variables, you're an even worse kind of cripple.\n\nUnity/JavaScript: Unity's scripting system is based on Mono, which itself is a \"clone\" of .NET/CLR, itself a conceptual copy of Java (specifically the Java VM and runtime libraries -- C# is the Java copy). One of the problems with Java was that the Java VM was kind of seen -- it seems to me -- as a necessary evil to make Java work rather than a fabulous product in its own right. If Sun had pushed the Java VM as the main product, and Java as merely one example of a language that ran on it among others (e.g. including a less C-like language that didn't suck) and actually worked harder to make the Java VM something worth pushing, the world would be different. As it was, Sun released Java after years of internal development and quickly Microsoft was able to build a better, faster, stronger VM. Microsoft -- the guys who normally take three versions to produce a halfway decent clone of a mediocre product. Anyway, Microsoft saw what Sun didn't -- that it was the idea of a decent \"virtual machine\" that was the valuable component of Java (not that Smalltalk et al hadn't done this before).\n\nAnyway, Unity uses Mono to support scripting, which means any Mono-compatible language can be used and what's more because the CLR lets such languages talk to each other, you can pretty painlessly mix languages in one project without even writing an API. In other words, I can write code in C#, Boo, and Unity's JavaScript and code in one language can call functions and instance objects implemented in another. Very, very cool. (See a lot of that in the Java world folks?) It's pretty clear that Unity made the early and wise decision to provide a relatively simple scripting language alternative to C#, and to do this they implemented a subscript of JavaScript they initially called UnityScript, but then renamed JavaScript (for marketing reasons, but creating much confusion thereafter).\n\nUnity JavaScript is -- simply put -- nearly as nice as regular JavaScript, with the Unity and Mono runtimes to talk to instead of the DOM, and compiled to bytecode -- i.e. running at similar speeds to Java, C#, etc. -- which is to say in the ballpark of C. This doesn't make Unity JavaScript the Holy Grail, but it does show how nice a Holy Grail language could be.\n\nObjective-C: everything I know about Objective-C and all my experience with it makes me like it. That said, I really see no reason to commit to it. Indeed, the first and only Objective-C program I've written from scratch was a mortgage calculator for the iPhone -- so I can't really claim to be either comfortable or proficient with it -- but I mention it because I am pretty familiar with it, I think I get it, and I think that of all the major \"real\" languages out there (i.e. languages that compile to native binary and can achieve C-like performance when it matters) it comes closest to being The Holy Grail. Unlike C++ or Java, it is almost as dynamic as you want it to be without resorting to special libraries, more syntax, and so forth. And it's possible to \"harden\" your dynamic code as much as you want or need to -- so you can convert a dynamically linked function pointer into a hard address to eliminate the overhead for dynamic calls -- in other words, you can be as C-like in performance as you want without massive rewriting or refactoring, or suffering the agony of strong typing everywhere. The language is also verbose -- but in a good way (i.e. a way that doesn't involve a huge amount of typing, and does tell you what's going on). C++, Java, and C# are all verbose in ways that bury what's going on in a bunch of uninformative type declarations and casting that convey no useful information (99% of the time).\n\nAlmost all of the problems with Obj-C are practical -- you can't write cross-platform software (even iPhone and Mac OS X software don't mix). You can't really write Windows or Linux software as well (unless you target GNUStep or feel like writing your own class library from scratch -- neither is terribly practical). So Obj-C remains a very attractive boutique language -- more practical than the many even more attractive and boutique languages (mostly Lisp variations) but not practical enough. If, ultimately, your software needs to run in lots of places, Obj-C isn't your friend. (I currently write utilities used interchangeably on Mac, Windows, and Linux software -- I often don't even look at the Linux versions before deploying them, but apparently they work Just Fine. Thank you Realbasic.)\n\nSo, by my count, that's well over twenty languages I've achieved \"sufficient proficiency to earn money\" with since 1977, despite being lazy and avoiding any programming for about five years. And I'm not including things like Word and Excel Macros, MaxScript, XSL, CSS, VRML, and various other pseudo-languages, that are essentially trivial for anyone with programming experience and the necessary motivation to learn (OK I did mention HTML, but I did say it's not a real programming language). I'm also not including languages I spent enough time to familiarize myself with (Lisp, Ruby), but was never motivated to build anything real with.\n\nOK, so what about Go?","$updatedAt":"2024-06-05T09:24:15.860+00:00",path:"programming-languages-i-ve-learned",_created:"2024-07-09T20:31:44.829Z",id:"1928",_modified:"2024-07-09T20:31:44.829Z","$id":"1928",_path:"post/path=programming-languages-i-ve-learned"},"page/path=blog":{path:"blog",css:"",imageUrl:"",prefetch:[{regexp:"^\\/(([\\w\\d]+\\/)*)([\\w-]+)\\/?$",path:"post/path=[3]"}],tags:["public"],source:"",title:"",description:"",_path:"page/path=blog"}}