Monday, June 17, 2019

Some Thoughts About GNUstep

Since 2004, when as a high school junior I was first exposed to Unix-based operating systems such as Linux and Mac OS X, I've been interested in GNUstep.  GNUstep is a free, open source implementation of the OpenStep API from NeXT, which later evolved into the Cocoa API, which is used for the creation of macOS applications.  Over the years, GNUstep's mission has evolved to striving to keep up with the additions made to Cocoa in each passing version of macOS.  However, as of this time of writing, GNUstep only guarantees compatibility with up to Mac OS X 10.4 Tiger, which was released 11 years ago; the current version of macOS is macOS 10.14 Mojave, with macOS 10.15 Catalina coming out later this year.

Since GNUstep's conception in the mid-1990s, many people have envisioned a Linux desktop environment powered by GNUstep, whether that be a faithful modern-day workalike of either NeXTSTEP or macOS, or perhaps a completely different desktop environment such as Étoilé, which has its own design and UI guidelines.  However, as of 2019, this vision still remains a dream, with GTK+-based desktops such as GNOME, Mint, and Cinnamon being dominant among Linux desktop users, as well as the original Linux desktop environment: Qt-based KDE.  Some people, including myself, have lamented the fact that GNUstep's progress has been slow relative to these more popular desktops.

This is my opinion, but I believe the following are the reasons why KDE and GNOME ended up taking off while GNUstep's development has been relatively slow for the past two decades:

  1. KDE was announced in 1996 during GNUstep's infancy.  Out of all of the GUI toolkits that were available for free, open source software developers for Linux in 1996, Qt was the only one available that satisfied Matthias Ettrich's needs.  Work ended up starting on KDE, and according to Wikipedia, KDE 1.0 was released in July 1998.  Unfortunately, Qt's license at the time was incompatible with the GNU General Public License, one of the major licenses used by many free, open source software projects.  While many Linux users did not find this objectionable, other Linux users felt otherwise, which ultimately led to the announcement of the GNOME desktop project in August 1997, which was based on the GTK+ toolkit, which was based on The GIMP image editing application and which released its first stable version in April 1998.  GNOME would eventually release its first version of its desktop environment in March 1999.  However, while all of this was taking place, GNUstep was still not finished with implementing the original OpenStep API.  Had GNUstep been ready in 1996 or 1997, there's a strong likelihood that someone like Matthias Ettrich would have built a desktop around it.
  2. Cocoa is a moving target, with changes being made to the API once every year or two on average.  Unfortunately, GNUstep does not have the personnel needed to keep pace with Apple's changes, similar to how the Wine and ReactOS projects are perennially behind Microsoft Windows or how long it took Haiku, a clone of BeOS made by volunteers, to reach beta status (and BeOS has been dead for nearly 20 years!).  My understanding is that GNUstep has been developed entirely by volunteers throughout its history.  By comparison, the GNOME desktop has a long history of corporate backing, and the aformentioned Qt framework used by KDE is commercially developed.  Unfortunately, the fact that GNUstep is over a decade behind macOS in terms of compatibility with Cocoa deters developers who want to use modern, up-to-date GUI frameworks.
  3. GNUstep, being based on OpenStep, is an Objective-C framework, while GTK+ is based on C and KDE is based on C++.  When the GNUstep project started, Objective-C was considered a niche language, and even to this day Objective-C is mostly used by developers of NeXT/Apple platforms.  The pool of Objective-C developers is considerably smaller than those of C and C++ developers.  Plus, with the increased importance of the Swift programming language, there's a chance that Apple may deprecate Objective-C in favor of Swift in the future, further reducing the pool of Objective-C developers.
Even with the challenges that GNUstep faces, I'm still holding out hope that GNUstep will increase in popularity and that GNUstep will one day reach API compatibility with newer versions of macOS, which would make the framework more attractive to developers.  I also hope that the Étoilé project will get restarted in order to bring a modern GNUstep-based desktop to Linux.  Given the increased discontent that some macOS users have over the state of their platform, it would be nice if there were a similar alternative available based on GNUstep.

Tuesday, June 11, 2019

My 2019 Mac Pro Disappointment and Thoughts of a New Operating System


I believe that Apple's announcement of the 2019 Mac Pro at the 2019 Apple Worldwide Developers Conference has finally brought much clarification regarding Apple's position on the Mac.  During the years of 2016 and 2017, Mac users like myself felt that Apple has abandoned the desktop Mac market, particularly for pro users.  After all, the Mac Mini went for years without a refresh after the 2014 model was released, and the previous-generation Mac Pro hadn't been updated since its release in 2013.  But after years of silence, Apple finally broke its silence in April 2017 by doing something that hasn't been done since unrealized murmurs of a PowerBook G5 back in 2004 and 2005 before the Intel switch occurred: Apple announced that a new, modular Mac Pro was in the works and that it would be released at a later date.  2017 and 2018 did not come with any Mac Pro product releases other than a drop in price for the 2013 Mac Pro, but it did come with the release of the iMac Pro and the long-awaited refresh of the Mac Mini.  Finally, on June 3, 2019, Apple finally announced the highly-anticipated new Mac Pro model, which is a user-serviceable, upgradeable, and expandable tower computer that is reminiscent of the Power Mac G5 and the 2006-2012 Mac Pro.


While I believe that this announcement has shown that Apple is still committed to the Mac and that Apple is willing to make very powerful machines for its most technologically demanding customers, I also believe that the new Mac Pro is a disappointment for some Mac users (including myself), and that the implicit statements that Apple is making about its Mac product line has some unfortunate implications for users such as myself.

For about two decades, Apple sold entry-level Power Macintosh and Mac Pro models at the inflation-adjusted price point of $2,500-$3,000.  The Power Macintosh and the Mac Pro were (and still are) Apple's models that provide user-serviceability, upgradability, and (with the exception of the 2013 "trash can" Mac Pro) internal expandability.  Starting with the 2008 MacBook Air and the 2012 Retina MacBook Pro, Macs gradually became less user-serviceable.  RAM started to get soldered onto the motherboard, and batteries became more difficult to replace.  This then started to spread to Apple's consumer desktops: the 2014 Mac Mini has soldered RAM, and many models of the iMac also have soldered RAM.  The 2016 MacBook Pro was the first Mac to have soldered storage, making it impossible to remove the storage device from the computer, which is important for data recovery.  The 2018 Mac Mini thankfully no longer has soldered RAM (although RAM installation must still be done by an Apple-authorized repair center), but it has soldered storage.  Users who wanted user-serviceability and upgradability were pointed to the Mac Pro, Apple's only model that offers these things.

However, when Apple announced the 2019 Mac Pro, it announced a starting price of $5,999, which is double the $2,999 starting price of the previous-generation Mac Pro, making it the highest-priced entry-level Power Macintosh or Mac Pro since the mid-1990s.  For users of previous-generation entry-level Mac Pro models (like myself; I own an entry-level 2013 Mac Pro that I bought in April 2017 after Apple discounted its price), this news is disappointing since $5,999 is a tremendous leap from $2,999.  I was prepared for a $2,999 or even $3,499 announcement, but not for a $5,999 one, which is well beyond my budget for a computer.  Unfortunately, I'm left with the following options when it is time to upgrade, none of which are appealing for me:
  • Sacrifice user-serviceability and upgradability by purchasing a Mac Mini or iMac.  However, user-serviceability and upgradeability are very important for me.  I would like to take advantage of falling prices over time in order to upgrade my computer whenever its necessary over time instead of having to guess my anticipated needs for the next few years and having to buy the upgrades up front at today's prices, not to mention that Apple charges a considerable sum for upgrades.  Moreover, non-serviceability precludes easy repair and easy data recoverability.
  • Scrimp and save for a 2019 Mac Pro.  Don't get me wrong; the 2019 Mac Pro is an excellent machine.  I would love to have one if I had the money.  But $6,000 is steep for a personal computer even on a Silicon Valley computer scientist's salary.
  • Switch to Windows 10 or Linux.  After the controversial 2016 MacBook Pro was released, I actually promptly purchased a refurbished ThinkPad T430 at Fry's for less than $150 in order to reacquaint myself with Windows, which I haven't used regularly since the Windows XP days.  My assessment of Windows 10 is that while its technical underpinnings are solid and its Windows Subsystem for Linux had made it possible for me to do Unix-style programming on Windows (which is one of the reasons why I use macOS: the fact that it is Unix underneath), unfortunately I find the interface gaudy (and the fact that my ThinkPad had a 1366x768 screen didn't help matters since Windows 10's interface seems to be optimized for high-resolution displays), and I find the advertisements, telemetry, and mandatory updates very annoying.  I also tried various Linux distributions, including KDE Neon and Linux Mint (which I currently use).  While I can be productive in Linux, I still find myself missing macOS.  I miss programs like Dictionary.app and Photos.app, and a recent update to Linux Mint 19 has somehow made Japanese text input no longer work with Firefox (although it works with other applications).  I prefer the various Linux desktops like MATE and KDE to Windows 10, but I love the Mac's attention to detail, especially when it comes to font rendering.  I can make do with either Windows 10 or Linux, but I find myself more productive in macOS.  I find that macOS provides a more polished, more consistent, less buggy, and far less annoying experience than Windows 10 or Linux.
  • Build a Hackintosh.  While I find the prospect of using macOS on PC hardware intriguing, unfortunately this is a non-starter for me.  I don't want to sound sanctimonious, but as a professional in the tech industry, I want to respect software licenses, even though I feel that users should be able to have the freedom to install whatever operating system they want on their hardware.  Also, for users who have no qualms with violating the macOS EULA, there are other challenges such as getting iCloud and iPhone integration to work properly on Hackintoshes, and there's also the prospect of Apple rendering Hackintoshing extremely difficult or impossible to do in the future through the use of Apple's T2 chip, which has been included in every Mac that has been redesigned since 2017 with the introduction of the iMac Pro.
Given these options, I'll express a lament about the state of personal computing these days: you can legally have a polished OS tied to restrictive hardware (unless you have $5,999 to shell out for a Mac Pro) or an unpolished OS running on a wide variety of hardware with varying degrees of freedom regarding user-serviceability, upgradeability, and expandability.  However, you can't have both (unless you want to build a Hackintosh): a polished OS running on the hardware of your choice.

What would it take for a new competing operating system to emerge, one that is not restricted to a particular vendor's hardware and yet is polished?  Unfortunately it will take a very large amount of work in order for it to be at par with even Windows 10 and desktop Linux distributions.  Below are the most formidable problems such an effort will bring:
  • There's the classic chicken-and-egg problem of software availability and user adoption: developers are less likely to develop for a new platform unless they're convinced it will attract a significant amount of users, and users are less likely to adopt a new platform if there are no software tools available for them to do their desired tasks.
  • There's the sheer amount of time and resources needed to create a modern operating system from the ground up.  All of our modern desktop operating systems (macOS, Windows 10, desktop Linux distributions) were evolved over many decades.  I believe the last semi-successful example of a consumer OS being built from scratch was BeOS, which was built in the 1990s; I say "semi-successful" because it did gain a cult-following among the users it attracted but it ultimately failed in the marketplace.  Apple's Taligent and Copland projects, both from the 1990s, were radical attempts to build new consumer operating systems from the ground-up, but they were never finished despite the amount of resources these projects were given.
  • Obtaining hardware support for a new operating system is challenging.  Many hardware vendors do not publicly provide the documentation needed for independent developers to write device drivers supporting their hardware, and many vendors are only willing to provide closed-source drivers for popular operating systems (see the chicken-and-egg problem above).  It is possible to perform reverse-engineering to create device drivers, but this is difficult to do with complex hardware and sometimes requires substantial resources.
  • Even though the rise of the Web and mobile computing has made platforms less important today than they were in the 1990s, there is still a need for native software, and there's also still a need to interact with dominant file formats and protocols.  Part of the reason why desktop Linux (and even the Mac for that matter) has struggled for adoption is compatibility with certain, more popular software packages.  Consider how long projects like GIMP and LibreOffice have existed and how they still struggle against more dominant products like Adobe Photoshop and Microsoft Office, respectively.  Part of these struggles include dealing with the files created by dominant software packages, which are often encoded in proprietary formats.  And projects that work specifically on application interoperability, whether at the source or binary level, tend to struggle.  Consider the long struggles of projects such as Wine (a Win32 compatibility layer for Unix-like operating systems), ReactOS (a Windows clone), and GNUstep (a reimplementation of the Cocoa API used in macOS, which is derived from the OpenStep API from the NeXT era).  Now, Windows and macOS are moving targets and thus those aforementioned projects will continue to need to play catch-up and with fewer resources than their corporate counterparts, but unfortunately it took a long time for projects like FreeDOS (a FOSS clone of MS-DOS) and Haiku (a FOSS clone of BeOS) to become mature enough to be useable, largely due to the small amount of resources these projects have relative to the resources that were available to develop the original systems.
  • If the new operating system is commercial, then how do we develop a sustainable business model, especially in a world where people expect software such as operating systems to be free?  If the new operating system is open source, then how do we attract and retain developers?
Now, it is possible to mitigate some of these concerns by building on the work of others.  For example, we can use Linux or one of the BSDs in order to avoid having to write an operating system kernel and also to dramatically reduce the number of drivers that would have to be written.  In fact, this is what Google and Apple did to create Android and macOS, respectively; Android uses a modified Linux kernel, while macOS, derived from NeXTSTEP, was built on Carnegie Mellon University's Mach microkernel and 4.3BSD (later upgraded to FreeBSD in the Mac OS X days).

Another way of decreasing the amount of time needed to embark on such an effort is to take advantage of computer science research that was not available in previous decades.  For example, Viewpoints Research Institute worked on a project named STEPS that sought to dramatically reduce the amount of lines of code necessary to write a full-fledged operating system by using domain-specific languages to write various subsystems.  An implementation of an operating system inspired by the STEPS project may encourage the rapid development of useful applications for it in a style similar to STEPS, thus potentially revolutionizing software development.

I've been thinking a lot about another canceled Apple project from the 1990s called OpenDoc, which was an attempt to make GUI application development more component-based rather than monolithic, which is similar to the Unix philosophy of using small utilities that interact with each other using pipes and I/O redirection.  The ultimate realization of a component-based GUI would be the Smalltalk environment from Xerox PARC, where everything in the environment is an object that can be manipulated by other objects in the system.  I read an insightful comment from the Hacker News forum (https://news.ycombinator.com/item?id=13573373) that states that the Linux desktop might have been more competitive had it embraced an OpenDoc-like style of component-based software instead of trying to fight Microsoft, Apple, Adobe, and other major software companies head on by building large, monolithic software packages like LibreOffice and GIMP.

The challenge with component-based GUIs, though, is maintaining a common standard of UI conventions across components.  UI consistency across applications is one of the strongest suits of macOS, and this is also true of its ancestors: both the classic Mac OS and NeXTSTEP.  For example, although the pipes-and-redirection approach of Unix command-line utilities works very well, unfortunately there isn't a lot of consistency between Unix tools, with argument flags often differing between utilities despite having similar meanings (for example, whether to use -r or -R to recursively search a directory tree depends on the tool).

Despite these challenges, I believe the time is ripe for a polished desktop operating system that serves as a competitor to macOS, Windows 10, and desktop Linux distributions.  This OS should attract users who are dissatisfied with today's current OS offerings and who desire consistency, usability, and reliability.