December 27, 2016

"How To Learn Programming"

Filed under: philosophy, programming, software development — Benjamin Vulpes @ 8:28 a.m.

Don't worry, I'm not going to give you any useful pointers. As a matter of fact, if you read this and walk away completely deflated and as though I've torn the inspiration to make a career change from your hands, we'll both be better off. I'll have fewer kids working for starvation wages and reinventing all of JavaScript every year and a half saturating my marketplace, and you'll be spared all sorts of personal tribulations and the crippling insanity that comes of intimacy with modern computing1. You shouldn't learn Python, you shouldn't learn Ruby (let's be real, you were just going to use Rails anyways), you definitely shouldn't learn JavaScript, and if you value the power of independent thought, also avoid products of the cube farm like Java and Swift/Objective-C2.

That said, since you're here and reading this nonsense, I'm going to go out on a limb and assume that you're not of the brain-dead crab-pot postulators of such pap as "there's no such thing as wide variance in human ability at a broad spectrum of tasks, all competence can be traced to genetic predisposition to competence at the task in question", are in fact a smart cookie willing to work your ass off for meagre dopaminergic rewards in the short term, and have a passing interest and some amount of learned skills that make you, as the numbskull linked above might say, "good at computers". Perhaps someone even told you that you might eke great piles of loot food credits from Capital's demand for more Labor to turn its ever-multiplying cranks of complexity. None of that will be enough: you'll need tenacity, a solid dose of ability to pretend that some things are true while pretending some other completely contradictory things are also true, a healthy disregard for public opinion (if you want to preserve your sanity), and a historical bent so that you may at least work to build the leg up on the rest of the market that is grokking the historical reasons behind why Android sucks so fucking bad. Moreover, you'll need practical reasons to soldier through the nonsense, like a fearless leader or the promise of untold wealth. Pure fun or "joy of it" will get you precisely nowhere, when it wears off and the slog proper begins.

"Programming", as the touchscreen-using public knows it, consists nearly entirely of building soi-disant "apps". This domain decomposes into an enumerable set of subdomains: browser user-interface development ("webapps", "javascript apps", "single-page applications", "mobile-first websites", and more recently "React", "Elm", "Vapor" and other friends. Same old show, new cast of characters.), server-side development ("microservices", "Django", "Docker", "Rails", "Node.js"), and (generously) "operations" ("DevOps", "NoOps", "ContainerOps"), and "native" development ("React Native", "Atom", "Balompagus", "Objective-C", "Swift", "Java")3. In-browser UI development reduces to "some JavaScript that draws shit on the page and talks to backend services", "backend services" reduces to "a thin layer of glue code that handles HTTP requests, retrieves data from a data store (typically SQL4, although there are very fun mistakes to make in this domain as well), and then transmutes that data into a response to the original HTTP request". "Native development" reduces to "figuring out how the fuck to imitate AirBnB's latest nightmare of complexity with the fewest lines of code and most adherence to how Apple or Google want you to build that kind of "experience" (gag) on their respective platforms.

Building "experiences" (barf)5 in the browser is an unmitigated disaster. You can't really understand how miserably fucked up building "apps" (as the public call anything with buttons on a screen at which they can paw with their grease-coated sausages6) in the browser is, you must understand where browsers came from and how they evolved into the shitshow you haul around in your pocket every day. In the beginning, there was plain text. Then, some people structured that text, wrapping paragraphs in <p> (known as "markup") to indicate that they should be styled as paragraphs, using other markup for eg lists, and so on and so forth7.

So take a step back and think about what your browser is trying to do under the hood: take some text, marked up with various tags, apply some visual rules to it with CSS, and then execute COMPLETELY ARBITRARY CODE to oh you know maybe rearrange the ordering of lists, or replace your cursor with a spinning dick blowing loads whenever it draws over the character V or T, or oh I know pre-validate that you put a credit card number into that form input so that we can save ourselves a round trip to our servers from the user's browser. That's totally a good reason to shoehorn an impossibly bad programming language into the browser, mhm.

Fast-forward a decade. Web sites are passé, and people want at the very least "responsive" websites, and ideally "mobile first experiences" (drink). This means that the website that once needed to render nicely and quickly at 600x800 and maybe a few larger monitors now needs to look good on the 15" Macbook Pro Retina monitor (a monster of pixels, owned by everyone involved in "experience design", that no actual customer owns and yet whose pixel-count drives ~all design considerations in the industry), the Nexus Pucksell with its trapezoidal screen, the iPhone 7XXL with nearly the same number of pixels as the 15" Macbook Pro Retina but that uses an entirely different user interface built around poking at buttons drawn on a screen rather than pointing and clicking with a mouse and typing with a keyboard, and miscellaneous 4-year old Android phones that the User Experience expert in question has around from his last job but doesn't use any more except when he wants to make his devs lives miserable. On small budget projects.

It gets worse: because everyone involved in web dev was fathered by the kinds of neutered not-thinkers that women in America must settle for and the women aren't smart enough to have the children sired by actual quality sperm that didn't come from their meal ticket out of some perverse adherence to the local traditions of Beer, Monogamy, and Sports, your website won't even feel slow to the average cell phone user until you serve over a dozen megabytes (That's rather a lot of bytes. The last time I checked, the CH homepage clocked in at a trivial sub-30 kilobytes [kilo, mega, do recall the SI names for orders of magnitude from your elementary education, don't you?]) of uncompressed JS and CSS that you probably aren't even serving to clients anyways. This means that there is zero pressure for people to build lightweight websites anymore, which pretty much guarantees that nobody building websites is even going to think about the repercussions (either performance or security!) of pulling in a library to trim whitespace off the beginning of strings. For example.

So that's "the frontend". A soul-killing hodgepodge of 3 "programming languages" (HTML for the text and its structure, CSS for an approximation of what it should look like, and JS for responding to user input like clicks and taps), executed all together by "The Browser" and differently by each browser. Obviously (or perhaps not obviously, I have no idea how much you know about how your apps work), these things running in the browser have to get their data from somewhere. That somewhere are your "backend services".

"Backend services" are, well, Wordpress in other languages. All systems evolve until they can send mail, and all programming languages evolve until they reproduce a Wordpress-like Content Management System (CMS). They're of variously (I hesitate to say "great", but maybe) "less heinous than the alternatives" (will suffice) quality, where "the alternatives" are the poor Drupal framework. Which you don't want to use, unless you have some amount of cause to use it and Jesus fuck surely there's a programming language you like more than PHP, right? Anyways, all that WP does is respond to requests for web pages with data from its database wrapped up in HTML. Maybe with some CSS. JS if you hired someone to make a modal or a carousel or some other Web 3.14 inanity happen to your website (which, don't. It'll break in a year and you'll be out another 3k. Plus they always look horrible). Funny story, I recently heard tell of a Wordpress plugin that pulled in an entire JavaScript framework to render a modal. Does it serve that JS on all pages or just the ones where its modal is active? Was the JS compressed? GOOD QUESTIONS, KIDDO.

I digress. Backend services respond to HTTP requests with data from the database. Sometimes they write data to the database. Sometimes they poke other backend systems. Generally, though, they're "the pure function of the server: glorious, stateless, and without any user-interface cruft", to paraphrase a man who taught me much. Backend systems, eschewing as they do the complexities of managing user interface state are far simpler systems to build and maintain that clicky-pointy-tappy UI's. Every language used in serious force for web development (some languages are not, believe what you may) features one of these mega frameworks in which other web devs have encoded their knowledge and best practices around building web applications. In Python one has Django, and in Ruby one has Rails. PHP has Yii, and I hear that PHP is an entirely adequate(ly) object-oriented programming language these days, so who knows maybe that's a thing the budding webdev might consider using, except for how don't.

Finally, there is the wasteland of "native application development". Once upon a time this was just "software development" after the phrase was bastardized to mean "software running on consumer desktops" and not "missile control systems", but the poor notion's been degraded even further to now signify any drawing of buttons on a screen by any old monkey anywhere. It's not like she cares about the degradation, she's just happy to be with someone who can pay for dinner and maybe a kid. "You're a software developer too! Don't listen to what those mean guys on the internet say, I love you and that's all that matters." Not that any of us could afford to educate a kid in this America, but fuck I digress again.

"Native App Dev" is a glorious term for reading through Apple and Google's documentation for how to build list views and swiping image carousels on iOS and Android and then copying code from Stack Overflow that you can sorta-kinda beat into doing what the designer on staff has demanded, all naïve of the actual engineering constraints in play. Building UIs in this fashion is mostly configuration, if you can keep your designers on a tight leash and force them to design things that fit into the (admittedly inane) touch paradigms of the two platforms.

Building apps in the browser sucks, but at least a million people are out there sorta willing to lend the five brain cells they have left after playing in rock bands through their forties in resolving your problems with JavaScript and `undefined'. Plus it's sorta this weak Lisp Machine knockoff where you can kinda look at ("inspect") the web page and Chrome or Firefox will make a cursory attempt to tell you why the p tag doesn't have the spacing you might want it to have. Moreover, once your "browser apps" grow in complexity to the point where you're maintaining user state and redrawing things based on what you want to show them...well, at first you'll want to use a framework like React to get you 90% of the boilerplate you don't know that you need yet but the odds are solid that in two or three years you'll look back at whatever you built and curse fluently at the time you wasted using bloated toolkits. Nevermind that the only reason you built "apps" of the scale you did on your first dabblings is because all of the hard stuff was handled for you. Granted, you'll have a better notion of how badly those libraries handled it and with opinions and assholes in hand you'll set out to begin another cycle of the Great JavaScript Circle of Life where someone who's only ever built UI's in the browser with JS finally gets fed up with it all and decides to write the One True Frontend Framework to Solve All Everything That Sucks About Building UIs In The Browser. Hopefully you read this first and realize that contributing to the Circle of JS/Life is not actually a worthy use of your time.

Building apps for iOS and Android is no better; you're stuck in the hell that is Other People's IDEs (Integrated Development Environment, handling compilation and code browsing and documentation and autocompletion and all the civilized niceties that Emacs provides poorly and only after extreme customization). Java has the advantage of a compiler over JavaScript8, but it's pretty easily tricked and moreover Java the language is pretty repulsive to the aesthetically-inclined. Objective-C has over Java has a C-like syntax? And is tangentially related to the Legacy of Steve Jobs? I suppose there's the hot new jam of Swift, and if you bite off that mountain of lurking WTF let me know what you find; all I learned in building Swift apps is that Apple apparently can't ship a compiler/IDE toolchain that doesn't require regular restarts9.

Backend systems are the refuge of those inadequate for the task of building end-user interfaces, and of people who recoil from the notion of building user interfaces (due to aforementioned insanity in technology choices). "Nope", one guy demonstratedly capable of building iOS and Android systems told me one time, "I simply will not build mobile applications." One wonders "why" for approximately five minutes, and then realizes that a high-performing backend dev in the SV-driven market pulls down just about as much as your typical high-performing frontend dev -- and without all of the insanity of user interface development (the "technology" choices are bad enough, but have you ever met a self-styled user-experience visionary?). This odd confluence of the derpiest and some of the sharper knives (in the sense that they have a stiff internal resistance to dumb shit, and a nose for finding it) breeds such monstrosities as Rails (grasshopper, explaining the ways in which Rails development wears on my will to live is beyond the scope of this piece, but let it suffice to say that I recently saw the following line of code and recoiled in horror: `authenticates-with-sorcery!'). Most appealingly, you get to work with sane-ish linuxes, and your systems remain stable while the suckers working in the browser and on iOS and Android chase every single operating system release with if not actual slavering excitement then full-bore Stockholm syndrome.

However, despair not. There are other "kinds" of "programming"! You could configure SharePoint websites for any of a million small/medium business with SharePoint websites. This will also make you a Microsoft stoolie, and unfit for civilized company. Also you'll be stuck with the same problems. SalesForce idem, although I don't think you have to buy the Microsoft party line to hack on their shit. You could get a plain-Jane analyst job, and then apply your not-insignificant thinker to solving business problems with technology, and nobody would tell you which languages you had to use. Shit, I know options houses with Excel spreadsheets that take an hour to run, and that's after hand-optimization.

Or you could move into the "embedded" space, and compile programs in whatever language to run on tiny devices in the "Internet of Things". Making software to run on smaller and smaller chips is an excellent career bet for the next decade, as corporate focus moves from the "one person, one device, one chip" model to a rat-king of devices infiltrating every aspect of American life.

If you're really ambitious, you could even shoot for an actual auto-didact's "Computer Science" degree. Just keep in mind that if you do this correctly, you'll not "learn programming" nearly as much as you'll learn about theories of computation. Two litmus tests: if you write a single line of code in your first semester, you got scammed; and if you don't know the lambda calculus and its combinators by the end of the third semester, idem.

The point that I apparently need at least one more glass of wine to get out is that you'll need to pick a project to "learn programming" in the context of. If you know statistics, pick up a book on what's called "Machine Learning", but is really just applied statistics, and start working through the exercises. If you've already got the hang of physics and the related mathematics, consider writing a simple physics simulator. If you want to see the results of your work, consider building a simulation of agents controlling physical objects in a simulator someone else built, like in the game development program Unity.

If you have utterly no fucking idea where to start, consider buying a Raspberry Pi and beating it into a robotic cat feeder. You might not ever finish the project, but you'll either learn how to learn how to work with the linux shitshow or you'll flunk out of computer-related auto-didactery 101.

The point is that one cannot "learn programming" quite so simply as asking "how do I learn programming". Rather, you must have a place you're trying to get to, whether that's making more money than you otherwise might or solving problems that are just too tedious to solve properly in Excel.

In any case, you really shouldn't "learn programming". The world doesn't need more programmers, and you don't need to wreck your head on the shoals of Von Neumann and his band of merry mongols. If you insist, though, I'll be here. Don't expect me to help, though, this ain't Stack Overflow.

  1. You either go batshit nuts and move to a cave, hook up with crypto-terrorists like The Bitcoin Foundation, or retreat into the soft embrace of Dunning-Krugerism telling yourself that "this is fine, man", surrounding yourself with other middling schmucks all the while merrily self-deluding yourselves into the kind of complacency that makes crushing a six pack in front of The Game so damned seductive for the typical American male. []
  2. The joke's on you if you think you're "just going to learn Swift...". There are a few decades of internal Apple API's that'll need rewriting before you don't accidentally absorb some Objective-C on your way to Swift "mastery". The joke's on me if you write your app in Objective-C and then come crying for help. []
  3. Pop quiz: which of this paragraphs parenthetical appellations did I make up? []
  4. Another of those hoary old languages that refuse to die because they're just so miserably adequate for the tasks to which humans put them. []
  5. The degree and earnestness with which people lie to themselves about their work ("user experience visionary", "Full-stack JavaScript engineer", "Rails guru"), is a strong proxy for the quality of the work they produce, its utility to the market, and in precisely which market they hawk their goods and services. []
  6. True story: the extremely large iPhones exist to capture the bariatric market. []
  7. There was a whole pile of crazy around documents referring to other documents, semantically organizing the world's knowledge, it got as full-bore tin-woman as you might expect with very bad results). Eventually, some well-intentioned asshole (funny how it always goes the same exact way. Every. Single. Time. ) in search of a solution to some specific problems but not smart enough to evaluate the implication of his design on the world then applied a healthy dose of Cascading Style Sheets (henceforth CSS) to the Hypertext Markup Language (henceforth HTML) and turned browsers, which until that point had not done a whole lot to style the web pages shown to users into a so-bad-it-came-out-the-other-side-into-amusingly shitty knockoff of InDesign (This is unfair to CSS. Inline styling was a thing, and picking the right resolution of technical accuracy for a good read is hard.). To compound all of the above, someone decreed (this would have been at the height of the Browser Wars) that their company needed something other than the Java applets that were a) in use and b) causing all sorts of havoc at the time (It may sound crazy to someone "learning programming" in the dusk of 2016, but people loaded and executed Java code into their browsers "once upon a time". That you don't find this a laughably bad idea on its face should start to give you an idea of the yawning chasm of crazy you'll have to eat if you want to "learn programming".) . Thus was born JavaScript, a crime for which many are liable and will likely only discharge their debts by providing entertaining deaths []
  8. Now that you mention it there are comtranspilers for JavaScript that turn a sane-ish language into valid JavaScript. There's PureScript, TypeScript, ParenScript, and ClojureScript JUST TO NAME A FEW. One could in theory compare the different $LANG_THAT_TRANSPILES_TO_JS but by the time you got through the top three entries on your list the JavaScript "community" would have moved onto another one and showstopper bugs would emerge in the three you tested and do you begin to understand why I think that opening your wrists might be a better use of time than "learning programming"? []
  9. It's so bad that I actually got into the habit of preemptively quitting Xcode because its auto-completion backend would crash and never notify me. The easy and humiliating solution was simply to restart Xcode whenever it failed to complete symbols I was typing. And yes, before you ask, I'd quit Xcode regularly expecting the autocompletion framework to work again on reboot only to discover that I'd mistyped the symbol prelude. Such is the cost of shitty tooling. []

September 26, 2016

Socialist Trolley Problem

Filed under: philosophy — Benjamin Vulpes @ 11:30 p.m.

You stand by a switch that can send a trolley careening down one of two tracks. You can't stop the trolley and you can't affect what is down the track in any way other than to throw the switch.

There are 100 people tied to track A, and 99 people tied to track B. None can escape. The switch is currently set so that the train will fly down track A, killing everyone tied to that track.


Some of the people are straddling tracks A and B, and you have no idea whether your trolley will amputate their legs or decapitate them, or how many will suffer which injuries. Furthermore, there are unknowable external effects to both throwing the switch and not throwing the switch, effects whose scale of lethality may dwarf the number of people tied to both tracks put together (both in integer deaths and aggregate micromorts). Additionally, you've never even seen these people, you just read about their existence and the risks to it on Reddit.

Do you throw the switch?

September 19, 2016

The Hilarious Unprofitability of Uber

Filed under: capital equipment, philosophy, shartups, software development — Benjamin Vulpes @ 2:29 a.m.

As far as I can tell, Uber and friends have spent an extraordinary amount of money demonstrating that mobile devices are a phenomenal sales channel for traditional businesses directly into millenial pockets. Oh, and to illuminate incontrovertibly Silicon Valley's downright perverse aversion to operating capital equipment.

Uber sets prices unilaterally on both the demand and supply sides of the market for just-in-time butt delivery, controls 'fleet' eligibility criteria, suffers none of the friction of operating its own capital equipment, doesn't eat any depreciation charges, will finance chumps"driver partners" lease of the cars, and can even arrange for operators to rent cars from Enterprise and yet they still cannot make any money. What, as we say, dat? Could Uber be competing to own the vertical and horizontal in a space and failing to bite off an element of the business model that profitability is predicated on the ownership of? Fans of business-gore, like myself, live for moments of fail like this.

Controlling both the cost of goods sold and the price at which those goods are sold ranks right up there with "not letting the employees walk out with your cash" in terms of business fundamentals, and while some degree of authority over these two knobs is important for running a business, normally they're set by a combination of corporate authority and market dynamics, eg the price of similar goods and services, and suppliers ongoing pricing exercises with their goods and services. Uber suffers none of these ugly real-world interferences in their pricing: customers simply ask to be picked up at a place and dropped off at another place, the app does so, and then at the end conveys a price. Pricing, as far as the customer is concerned, is not merely opaque but actually unknowable until services have been rendered in full1, and as (Uber claims...) fares go mostly directly into driver pockets this sets the payout price as well. Uber will gladly provide an estimate, and many-a-website claims to have deep insight into the fee structure, but the fact remains that they slam the numbers around at will, nominally in service of sliding around on the price elasticity manifold.

Intriguingly, the subsidies that apparently account for a large fraction of the company's losses don't even show up in markedly lower prices than traditional cab companies, at least in my entirely un-statistical sampling of a few trips up and down Sandy Boulevard this summer in various traffic situations. Given the whole "disrupt disrupt disrupt" thesis that the application of software can2 make order of magnitude improvements in profitability, how is it that Uber is neither profitable, nor do they deliver services for a tenth what everyone else charges?

That's not all, though! Uber is also willing to help schmucks3 finance the very vehicles they're going to depreciate shuttling app users around. Cursory research indicates interest rates in excess of 20%, so almost definitionally Uber appears intent on leasing vehicles to the least responsible folks around4. Get this though: the billion-dollar line of credit for leasing vehicles to Uber operators is not intended to be a profit center. Some short time after I found that gem out, I began to wonder if they intend to make money or if the whole show is an elaborate way to burn a pile of money to offset wins from other portfolio companies while keeping friends and family employed.

Operating capital equipment is complicated, and Silicon Valley (as demonstrated through Uber's behavior) hates it. The challenge may be stated as: "operate everything for as long as possible, constantly balancing maintenance costs against replacement costs". Cars, unfortunately for the consumers and Uber's vehicle drivers, are not generally designed as capital equipment, but as fashion items. My environmentalist friends love to lament the forced waste of the fashion and technology industries, and how planned obsolescence and ever-changing fashions ensure that American consumers must routinely upgrade both their computers and their clothing to continue deploying the impression of being au courant5 and for the manufacturers to keep on with the making-of-money, but their eyes slide right over the same exact dynamics in the consumer automobile industry. For one example of the difference between designing capital equipment for the road and designing consumer equipment for the road, consider that a consumer car that's been driven for 100,000 miles is worth veeeery little (perhaps a tenth of its MSRP), and a Freightliner Cascadia with 600,000 miles on it goes for just under a quarter of MSRP. There are hints that the Tesla Model T can hit 300,000 miles without much wear and tear, but they're entirely anecdotal and its "refueling technology" renders it entirely useless for the task of JIT butt-schleppment.

Perhaps not even bothering to manage consumer-grade vehicles operated on busted roads by the wonderful people who have the time and inclination in their lives to drive vehicles around to make ends meet is the only way that Uber even makes sense as a business model. On the other hand, grow up, buy real equipment, hire and train labor, and actually run a business instead of a pile of servers.

Just an idea.

  1. This is amusingly similar to the market practice of many freelance software development organizations and individuals, wherein the potential customer is told that a thing is "So easy! Right up our alley! We do this all the time! You'll have it in 2 weeks!", and then two months and sixty thousand dollars later, the customer realizes they've been fleeced by con artists well-practiced in the art of delivering just enough to keep the mark convinced that delivery in full is just around the corner of another ten grand. I attribute a large part of my abject failure to stuff cubicles with commodity labor and churn out software all day long to how willing I am to tell people that there's no way my or any other team can shit out a responsive mobile banking "web app" with all those features in six weeks, that that other feature is a piece of braindamage your sales team only determined that it wanted after a potential customer (no doubt one of the smaller who won't even buy your system in the end after jerking you around for months during the sales cycle) casually asked if your thing did whatever, and that shit dog are we even going to talk about how much friction there's going to be collaborating with a 12-hour offset team that owns the server-side? So yeah let's just say four months and a half million dollars, and we still won't have bitten off the dumb shit at the bottom at that point. Hey, buddy, did we kill that deal yet? []
  2. Computronium, particularly in the context of user-interface development and the current environment of Apple-flavored C, Google-flavored Java and the traditional hell of HTML CSS and JS all executed together to make buttons happen in browsers, is dangerous shit, not to be touched by children or individuals not trained to shoot creeping complexity in the face at first sight. If a business operator isn't careful, designers and developers can waste untellable fortunes building egotronic affordances that don't make any sense either from the user's perspective, or the perspective of designing within the UI toolkit's paradigm to reduce complexity, and that will never feel right anyways because it disregards entirely how UI widgetry is built for the target platform (oh and I'm just talking about pathologies I've seen in working for one platform. Shit gets even more unruly and out of hand if people try to make sensible UI's for wildly divergent base operating systems. As one example of sanity, when one ports Civ from DOS to Mac, it comes pre-baked with its own menu system, so porters don't have to struggle with "how do I best express this application's basic thesis to Mac users when it was written for Windows?", instead the app carries all of its own UI widgetry along with it. This is a downright sensible approach, because it neatly carves off the entire discussion of how best to design for $OPERATING_SYSTEM's inane conceits. It's also a very tough sale, except if you import the cost of writing your UI layer in the browser hell, in which case nobody will mind that it's nonsensical and impossible to maintain.). A few quarters of this kind of behavior is guaranteed to drain budgets and emit entirely unmaintainable code. []
  3. "Why do you keep insulting Uber drivers, Benjamin? They're nice people just like you!" Because if you are pulling less than thirty dollars an hour to both be busy and cover the depreciation of your vehicle, you are failing to price approximately the whole world into your cost basis. Keep in mind that Uber imposes pretty strict "must be newer than" requirements on vehicles in their 'fleet', which entirely rules out operating the capital equipment after it's depreciated off the books, a topic worth thinking about in some small amount of detail. []
  4. Yes, yes. "Credit scores aren't people, Benjamin!" Sure, whatever. While some people with bad credit may be victims of the paint-by-numbers governance of the US population, the vast majority are actually bad credit risks. If the king demands that you show up for church every Sunday or be ineligible for crown subsidies, your options are to a) do it, b) kill the king and take his money and c) not show up. Know, though, that the latter two options aren't going to set you up for good loan terms. Getting upset at the insanity of your local power structure and opting out means you opt out. Just because nearly-anonymous-credit-approval-by-the-numbers is stupid doesn't mean that one may ignore it without repercussions. []
  5. As of approximately a year and a half ago, I cooled my wardrobe by a few hundred K to contain a formal outfit and an informal outfit. The formal outfit is a black suit, and the informal outfit consists of a particular brand of black V-neck t-shirt that I've already somehow managed to get differently-fitting versions of despite buying the same brand, same model every time, black Levi 511s, and a pair of black ankle-height shoes (in the spirit of maximizing the clothing's lifespan, there's also an outfit for the 10 miles of "vigorous bicycling" (to quote one calorie-tracking app of no particular note) between the office and the house, but that's cobbled together and not holistically designed. It's for sweating in, not for coordinating with the rest of the family.). Minimizing cognitive overhead is a lifestyle optimization. Some days, I'm tempted to place an order for a pallet of MREs and live off of that at the office. It'd be not just a reduction in the cost of figuring out where to lunch (which is always complicated by deferring the eating until my blood glucose levels drop below the 'useful human' level), but also vastly cheaper than eating lunch in downtown Portland! I'm milking this cheap-ass-motherfucker schtick to great effect in many aspects of my life. Highly recommended, especially if you're the hardworking-yet-broke, but-somehow-stupid-enough-to-be-family-having type like myself. []

September 15, 2016

Enlightened Self Interest and Dishwashing Optimizations

Filed under: la vida pobre, philosophy — Benjamin Vulpes @ 9:36 p.m.

I wash the dishes in my house. The chore suits my domestic arrangement well, as I vastly prefer having my food cooked to cooking it myself, and I can typically knock out a day's worth of dishes in under twenty minutes. It's a valuable "active meditation" for me, much like yoga. The difference being that the forty minute bike ride into and out of the city each day has completely eaten up my allocated time for exercise, I like my yoga sessions to go for something on the order of an hour and a half, and just cannot summon the fucks to do yoga regularly anymore.

Anyways, the dishes. On those infrequent events where my little family ventures to a friend's house for dinner (and even less frequently, stay long enough past the child's bedtime to observe the friends' dishwashing practice), and those more frequent events where the friends congregate in our little cottage ("Baby it's a cottage, not a hovel! An adorable cottage, a ten minute walk from the river!") , I like to note the various processes my friends use to do dishes and their various strengths and weaknesses. Since I do this particular chore on an ironclad schedule of every fucking day, I have spent a fair amount of cycles on optimizing the work, and I'm going to share some of the optimizations I've found with you! Aren't you lucky.

A few principles that drive my dish-cleaning practice:

  • Minimize dirty dish lifetime on usable surfaces
  • Keep the dishwasher empty and ready for loading at all times
  • Use the machine to do as much work as possible
  • Minimize time spent washing dishes
  • Have the right tools
  • Optimize hardware choices for dish-wash-ability

Because I am a tightfisted jew, I've emplaced my family in a tiny cottage with a tiny kitchen. When shopping around for the new place, I was dead-set on finding a house with a garbage disposal, or "garburator" as our sorry ("Sorry!") neighbors to the North call them, but eventually relented and traded the garburator for a hood over the stove, as: cleaning dishes is simply messy work, and if I can ease the cook's job on the smoke side of things, well shit who knows what marvelous new dishes she'll crank out, thereby improving my life rather more dramatically than having the garbage disposal would. The other factor that shifted out from underneath my original list of "must-haves" was that we eventually elected to live waaaay out in Milwaukie (technically an unincorporated part of Oak Grove, but this digression threatens to spiral out of control into real-estate insider baseball if I keep on in this vein), which unlike Portland and in the same fashion as other civilized places does garbage pickup once per week and so disposing of food waste into the trash can.

"What?!" I hear you ask, "Portland does garbage pickup at a frequency of less than once per week?!" Why of course, friend! In a laudable (but not lauded!) attempt to reduce the amount of landfill mass the city produces, some glorious socialist of mayorhood past determined that henceforth the city shall provide tiny little compost buckets, which shall live on citizens' counters to receive disposition of food waste. The state decreed that citizens shall empty those (now particularly stinky, on account of only having warm decomposing food matter in them) buckets into the yard debris bins which are collected weekly, and that collection of refuse sent to an industrial composter. The incentive the governors fell upon to get people actually using their harebrained scheme dovetailed perfectly with their goals to reduce landfill: drop garbage pickup from once per week to every other week.

The whole charade is an excellent example of how the slow-motion socialist takeover has robbed my generation of even knowing that they've been robbed. Not only have the services delivered been halved, but it's sold on the premises of "composting is better than landfill" and "we've reduced our landfill flux by thus and such amount (by halving services)". No shit, I could more than halve the carbon output of the metro area, just by taking away the cars of the bottom 50% of earners, and before you go off on me for "omfg but that's precisely regressive taxation!!" consider that the cost of garbage takeaway is a vanishing fraction of household budget for the wealthy, and for the impoverished Greshamite a thing to consider very carefully in the monthly cashflow allocation. The wealthy can simply spend another impossible-to-see-from-orbit fraction of their wealth to have the larger garbage cans delivered and emptied, while the poor (and barely-middle-class like myself) had to decide if we're going to spring for the larger can or simply live with fewer pickups.

The tiny kitchen in my hovcottage basically demands cleared counters for any sort of serious cooking project—there's barely room to turn around, much less spare square inches for dirty dishes. To that end, an important principle of dish-doing (and in fact living a sanitary, tidy, well-groomed life) is to keep the counters clear for use. So: whenever I find myself at loose ends for ten minutes (eg in the middle of a conversation, taking an interruption while the lady puts the child to sleep), the first task I turn to is to push more dishes through the cleaning pipeline, ideally all the way into the dishwasher.

On the topic of the dishwasher, there are two mandates from heaven regarding its use: 1) keep the dishwasher empty, and 2) use it as heavily as possible.

The first is a hard efficiency requirement, and a prerequisite to making progress on dishes at the drop of a hat, with a minimal amount of faffing about. If the whole effort is judged not by dishes returned to the cabinets (which it won't be, "out of sight, out of mind" and all that), but rather on the time between the transition into the dirty state and the transition off the counter, whether that be into the dishwasher or back into the cabinet, then optimizing for that case demands that one keep the dishwasher unloaded or running at all times.

The second mandate, "use the dishwasher as heavily as possible" is significantly more floppy and subject to interpretation. At the highest level, it means "wash nothing by hand that the machine can wash for you". In practice it must be construed situationally: if the thing is 1/3 full and the person clearing the dish pipeline doesn't anticipate more loads coming through, run that fucker and empty it! Odds are that the next meal is going to blow clean through that remaining 2/3rds capacity leaving one with dishes to clean by hand. Number and size of pots and pans to clean also affects optimal dishwasher use: you don't want to waste precious rackspace on a single giant pot (which may well interfere with your top rack spray arm as well!), so clean that shit by hand!

Minimizing time spent doing dishes is the fundamental cost function to apply. A large pot takes approximately as much time to clean thoroughly by hand (give or take a baked on sauce) as 3-4 plates, if you have your tooling well dialed. Therefore, if you can stick 6 plates into the space that a pot would otherwise occupy, you should clean the pot by hand and wash the plates in the dishwasher.

As far as tools go, the selection I've found most useful consists of a flexible ceramic scraper, a chain mail scrubber, soap and sponges, and scouring pads. One pass with a putty scraper should be adequate to get more-or-less anything off the surface, a brisk scrubbing with a chain mail scrubber (strive to purchase capital equipment that will last, it'll save you the headache and opex inherent in depending on consumable tools) should remove the small bits impractical to pop off with the scraper, and a final pass with a sponge and generous helping of soap will clean the surface and (if you're doing it right) get the rest of the bits off. A scouring pad is a useful addition to remove the most persistent films and baked-on greases.

Picking dishes that can survive heat and water and soap is another optimization route. For me, this means regular conversations with The Procurement Department about the unsuitability of various household items for cleaning in the dishwasher, and the unconscionable impact such devices have on the time it takes to "do the dishes". EVERYTHING MUST GO IN THE DISHWASHER AND THAT MUST BE FINE. At least until I hire a dishwasher for my house.

Until such a day as the children are large enough to do the dishes themselves (at to my stringent requirements at that) and I can deploy my human assets against the problem, I will continue to lust after commercial dishwashers like the Noble Warewashing UH30-E. Dishwasher duty cycle is the largest single component in my dish-processing flow, and if I could get that down to a 2 minute run instead of a 40 minute run (granted, the dishwasher in this rental is old and slow, but I've never used a consumer dishwasher that didn't take at least 30 minutes per large, moderately-soiled load), holy shit the time I'd save.

At the end of the day, I try to treat dishwashing as any other industrial process. There is capital equipment involved, and it should be operating more-or-less continually. There are resources (counter space, primarily in my case), for which contention must be minimized. I want to keep the high-quality meals coming out of the kitchen, and so I do my damnedest to set my dearest chef up so that her job in making us food is as easy as my job in loading the dishes—everything the lady needs to make me happy should be ready for her use.

Enlightened self interest! An important princple in the humble domestic sphere.

January 23, 2016

The measure of a state is its ability to deny benefits to outsiders

Filed under: philosophy, sovereignty games — Benjamin Vulpes @ 12:00 a.m.
The measure of a state is its ability to deny benefits to outsiders

her: it would appear the police aren't allowed to enforce street camping laws:

me: 2016! feefees always trump everything. especially such mundane concerns of the privileged as public health and safety. this is classic 'who could have known' overnice horseshit. raaa

her: The 3rd comment down1 is a good question though: where are they supposed to go?

me: i can't even see the comments. historically, 'elsewhere'. recently, 'projects'.

her: Sigh.

me: most recently, 'anywhere man muh riiiights'.

her: We don't have enough projects2.

me: the universe does not provide an answer to every problem.

her: There is a serious lack of beds in Portland.

me: yeah i mean supply is down and demand is up. most people can only think 'better get the government involved'.

her: Who else is going to provide need based housing?

me: the universe does not guarantee a solution to things that humans perceive as problems.

her: Who said anything about the universe? There are government agencies staffed with human beings who are tasked with coming up with solutions to these problems as they arise. Those people are failing. The universe doesn't have anything to do with it.

me: your side of this argument is predicated on the notion that there is a solution to the problem of people who cannot afford a roof over their heads. i am gently suggesting that perhaps there is no solution. put another way, there will always be more organisms than can survive off of the free energy in a system.

her: but you are wrong about that. Other cities elsewhere have been able to put roofs over homeless people's heads.

me: is it a sustainable3 practice over 100 years? 200? do not confuse a point in time for a steady-state.

her: We do have a bussing problem. Maybe it's something as harsh as asking these people if there if they were put on a bus in Boise or Spokane, and if they say yes buying them a ticket back there4. Utah implemented housing first, treatment second, and they don't have street fires

me: roadies also don't particularly want to live in utah for obvious reasons. roadies want to live in portland, for obvious reasons.

her: If Portland were dealing only with Portland's homeless, the infrastructure would probably be adequate.

me: there is no such thing as 'only Portland's homeless'. for as long as people can get here by greyhound or train and for as long as our voters continue to increase the budget for housing them, they will continue to arrive.

her: Wtf you don't know anything about how people become homeless do you? There is totally such a thing.

me: how are you to keep the others out, though?

her: That is a very good question

me: this is the classic problem of identifying 'the deserving poor'. dates back to like the 1700s with absolutely no solution, and leads in fact to criteria like 'deserving poor don't do drugs' which leads to fascist control of state charity distributions.

her: It probably has a really harsh answer. Like in order to qualify for benefits you have to show that you received mail here sometime in the past 5 years or something.

me: right? ultimately it comes down to a thing you and i have spoken of before, the problem of 'unlimited downside'. which is to say that i am happy to support my ski-bum kid, but not yours. because if yours, then hers, and then infinity. this is the road to socialism, and why it is such a very miserable curse upon the world.

her: And I want to help homeless people who are from Portland or have established themselves as part of the community, but I don't want to do that job for Boise or Spokane

me: right?

her: Or Redlands. Or Reno.

me: i actually came up with a nifty formalism for this

her: Ja?

me: 'the measure of a state's sovereignty and quality of life therein is the degree to which it can deny benefits to outsiders'

her: Oof

me: 'harsh answer', as you said. but imho, you came to the right conclusion on your own. which, relatedly, why benlandia does not even recognize outsiders as citizens.

So: if you live a place, and its governers routinely fall all over themselves to give your money away to randos passing through, you live in a socialist hellhole like me. If you live in a place, and the first reaction to randos driving through and attempting to contribute is "nope, and do it correctly if you try again", you live in The Most Serene Republic of Bitcoin, just like me.

The models are mutually exclusive. Pick a side before it's picked for you.



I agree with you… However, since there isn't enough shelter place for the homeless population, where are they supposed to go? Just wondering.


I couldn't agree more. It's trivial to short-circuit the liberal desire to improve the world: "Look, let's just build a bunch of concrete towers with tiny rooms, and pipe water, soylent and internet to them. Perhaps even give them Netflix accounts for entertainment: Netflix can write the accounts off as charitable donations, it's not like providing entertainment costs anything these days."




Actually, you just put them on the bus will they or nil they. Perhaps a gasenbusen?

Older Posts »