Programming vs. Achievement Hunting

Last night, in my continuing saga of playing Fallout 76, I finished all the main quest lines, and turned my attention to one of the first side quests that you’ll run into when starting the game. You meet a robot who is a Fallout version of a Boy Scout leader which starts a mission to become a “tadpole” scout. Turns out that this “mission” is really composed of about 9 parts, each of which has about 7-10 other parts, and you probably won’t even notice that the game adds a tracker for all of these steps in an obscure place without telling you, leaving you to wonder how to accomplish these things.

Many of the steps require things you’ll need to acquire that I still don’t have at level 190. At least one requires an item that is a rare drop in an infrequent event which I can’t solo. So there’s that. For reference, you unlock the 5th legendary perk slot of only 6 at level 200. So, even by the game’s standards, it would seem I’m fairly well along the path, yet I have a long way to go to finish something that started when I was in single-digit levels.

The point of this exercise is to acquire a better backpack. Like other MMO’s, you’ll be spending about half your time in inventory management, in some form or another. After leveling up, getting a few key perks, and grinding for some critical upgrades to your gear, an extra 45 pounds of carrying capacity goes much, much further than it normally would, so this is a really nice thing to try to obtain. The good news is that you only have to complete 3 of the initial badges to obtain it, and they can be any you feel like fooling with, but there are only about 5 that you can do without being, well, apparently a much higher level than me.

The “bad” news — or, the expected news, given that we’re talking about an MMO — is that completing three “tadpole” badges unlocks a whole new series of achievements in order to obtain “possum” badges. About 19 of them. All with 8-12 steps each. Many of which require… you guessed it… things you’ll need to acquire that I still don’t have, and have no idea how long they will take to obtain.

One thing that has become clear is that it’s time to launch a nuke. There are about 3 achievements that relate to it. I saw someone else comment on a forum that they didn’t do it till level 200. I get it now. I tried it once, and realized what a slog it is, and quickly set it aside. The mission continuously generates enemies until you traipse back and forth around the level and find the thing and unlock the other thing and finally enter a code. Normally, you would have to get the code by killing special enemies in the overworld and collecting the parts, but, thankfully, these codes are game-wide for a particular time period, and people figure them out and put them on a web site. Soloing this mission will require extreme sneaking to just avoid as many bad guys as possible, and I’ve got the perks and the Stealth Boys to try it now. I just wish I could stumble on a team that had some level-1,000 guy who was doing it to start the Scorchbeast Queen encounter, and just get the achievement by osmosis. But so far, no good.

So the net-net of all of this is that I’m trying to tick off about 300 different to-do’s off my list, in as efficient a manner as possible, to speed things up. You know… Do this while on the way to do that while using this and eating that and picking up these things to craft these other things… You get the idea.

A surprising amount of this activity is taken up with taking pictures of various creatures with the in-game camera. (As opposed to using the game’s photo mode for other achievements.) What I’ve noticed is that taking a picture of some animals now counts for multiple achievements, between the various “badges,” and the game’s “overworld” baseline achievements, which means I’m probably going to just walk around parts of the map where I can run into a bunch of particular kinds of creatures to photograph in one area. Oh, and be on the lookout for rare plants and mining deposits exclusive to that region.

Anyway, the point of writing this down is to note how similar this exercise feels when I’ve finished a major sub-project in my professional life, and start looking over my backlog in Pivotal Tracker, and trying to prioritize my next tasks. I realize that I’m looking over the list for ways to combine activities and push the lowest-hanging fruit to the top of the queue. And, suddenly, it dawns on me why, despite so many frustrations, I’m still drawn to MMO’s, and, at the same time, why they often feel like work to me.

Caring about Costs is Cool

But costs aren’t just about the bottomline, they’re also a measure of efficiency. I have a distinct distaste for waste. Money spent on the frivolous or the ill-considered is money that can’t be spent elsewhere. Like an engine drinking too much oil just to run. Tight tolerances (but not too tight!) are a joy in themselves.

Source: Caring about costs is cool

I’ve been a fanboy of DHH for many, many years. Yes, he created Ruby on Rails, which I’m still enamored with, 14 years later, so we have that in common, and as someone who’s made a living using it for the past 10 years, that’s a big deal. However, he’s one of only a couple of people “on the internet” with which I agree with on almost everything, and I’ve never really understood why until this post.

Of course I’ve known that he was an F1 driver, but you can probably drive those cars without understanding the engineering concept of correct tolerances in an engine. That he intuits this premise deeply enough to draw this analogy is the key I was missing to understand my fascination with him.

I may be a programmer (and system administrator, and network engineer, and database architect), but I’m a mechanical engineer at heart. It’s how my mind works. I see how things are related and interconnected. I tell everyone I work with the same thing: I’m awesome at seeing the trees, but pretty bad at seeing the forrest. I’ll give you options; you make the decisions.

Being a physical engineer, whether mechanical or civil or electrical or aeronautical or nuclear, isn’t just a vocation; it’s a way of thinking about the world and how it works. In this way, I think our thinking lines up really well, and I think that leads to thinking basically the same way about most everything else.

It’s a theory, anyway.

Mastodon

Dark Mode

mastodon (this link opens in a new window) by mastodon (this link opens in a new window)

Your self-hosted, globally interconnected microblogging community

So I’m just now realizing that Mastodon is a Rails 6.1 application. I just looked over the Gemfile, and it includes a lot of the usual gems, notably cocoon, right at the end. I have a love/hate relationship with this particular gem.

I love how it solves the problem it addresses. It’s an ingenious solution, and a clever implementation. Also, its author is also very supportive, and has done a lot of work to document it well and answer questions, on GitHub and StackOverflow. I dislike the fact that the form markup sort-of-has-to-be so fiddly for non-trivial cases, but I accept that tradeoff for preventing round trips to the server for interactions with subforms.

What I hate is that Rails has never introduced a feature to do what this gem does. I get it, but I hate it. Really, I guess the only way to prevent a round trip is to make this sort of self-HTML-form-markup-generating code in Javascript, and Rails isn’t about Javascript. In that respect, I actually appreciate that the team has NOT tried to include this approach out of the box. I just wish there were a way to have my cake and eat it too.

Hopefully, my next app will be Rails 7, and free of jQuery, not just by default, but also on principle. Unfortunately, this means I won’t be able to use cocoon, but maybe someone will remove the jQuery requirement by then. Maybe I should do it.

Also, maybe this is finally the impetus that will get me to try Mastodon.

Don’t Get Involved with Things you Can’t Fix, and You Can’t Fix Stupid

Twenty-odd years ago, I was involved in a Product Data Management system implementation. This is just part of a much larger story, but the salient point from the epic saga is that I worked for a psychopath, and he tried hard at making my life difficult. I never figured out why. I think it was because he blamed me for something my previous boss did to his project. Anyway, we’ll get back to him later.

I was operating as a sysadmin, tasked with ingratiating the main admin from France to install an application on our servers, here in the US. At the time, corporate IT had just made it policy that no one but them could have root on machines hosted in their data center. On Unix (as opposed to Windows), I didn’t mind. That works just fine. However, the other admin had made getting root his #1 requirement. I told him of the policy. He didn’t relent. So I tried to elevate the coming train wreck with my management and everyone in corporate IT, hoping that something could be worked out before he arrived.

The guy shows up, shakes my hand, and asks me for the root password. I get on the phone with the main Unix admin. They finally relent, and allow me (because I’ve known them for 6 years by that point) to sudo to root to setup all the prerequisites.

The other admin is furious, tells us he can’t do anything until he gets root, and goes back to his hotel. Next day. Big meeting. Everyone on the phone. Group in one office, corporate IT in theirs, admin from the hotel, boss in the UK. I ask: “Michael, what specific commands do you need to run as root?” He says — get this — “You get in your car, and you turn the key, and it starts up. You don’t know how; it just works.”

In our room, we all just looked at each other in disbelief. First of all, he was talking to a bunch of mechanical engineers who happened to fall into implementing a PDM project. We all understood exactly how cars work. Second of all, everyone on the call would expect “the expert” at installing the application stack to be able to answer the question.

It was clear there was no arguing about it further, and the project had to get done so that he could shuffle off back to France, so they gave him root, and he did his thing from the hotel, and never spoke to me again.

After all the nonsense, you know what the problem was? The application server was configured to run on port 80, out of the box. That’s it! It assumed it would be running on the standard, privileged port. We could just as easily have configured it to run on port 8000, or port XYZPDQ. It didn’t matter! We had a load balancer running on port 80 in front of it. It could have been any port we wanted! Our “expert” admin couldn’t understand that, and my fearless management wouldn’t hold him accountable for such an elementary understanding of what he was doing.

In the weeks after, I realized that my boss had made me the scapegoat with upper management for the situation, because I was the one that tried to head this disaster off at the pass. Since I had sent emails, and talked about it, apparently I was the one who was causing the problem. This was just one of the many conflicts with my psychopathic boss. I had to learn a lot of hard lessons about politics over the 3 years on that project, but this one backfired in the most unexpected way.

Unfortunately, I had basically the same sort of thing happen again a few years ago. I tried to warn my management that IT was telling me something really, really stupid, and that it was going to come to a head in a spectacular way. But they couldn’t understand anything I was telling them, and trusted that IT knew better than I did. The problem is that IT didn’t want me to be working on the project. They felt they should have been the ones to “get the business” to develop it, and were actively trying to slow me down. Unfortunately, I didn’t learn what else to do in this situation except continue to try to educate the people who are looking at me like I’m crazy. Anyway, maybe I’ll blog that one 20 years from now.

37signals Dev — Vanilla Rails is plenty

In our example, there are no fat models in charge of doing too many things. Recording::Incineration or Recording::Copier are cohesive classes that do one thing. Recording::Copyable adds a high-level #copy_to method to Recording’s public API and keeps the related code and data definitions separated from other Recording responsibilities. Also, notice how this is just good old object orientation with Ruby: inheritance, object composition, and a simple design pattern.

Source: 37signals Dev — Vanilla Rails is plenty

This is an “implementation” of my guiding philosophy of programming:

If you truly understand the process you’re trying to implement, the code will “fall out.”

This article is discussing adding a Rails concern for making ActiveRecord objects copyable and “incineratable,” and then implementing these operations in PORO models. That’s great, but this sort of redirection is only needed to commonize the human-to-machine naming that might be used for different classes in the application. (There’s probably a term for this, but conceptualizing the terminology used in classes and methods is an art unto itself.)

I don’t think I’ve ever written a concern, but, then, I’ve never written a Rails application (out of at least a dozen and a half now), with 500 classes, which would inevitably have some overlap in their “business” functionality. My current app is the most complex thus far, and it only has 52.

If you don’t have that situation, you don’t need this level of abstraction, and, and — and here’s the important part — if you do have that situation, you will find yourself starting to write duplicated code. When this happens, as a programmer, your “spidey sense” should start tingling, and telling you there’s another level of abstraction to implement.

And that’s what I mean about the code “falling out” of implementing the actual process of what you’re trying to program.

I suppose there’s a case to be made here that you might wind up with duplicated code on a large codebase, simply because one programmer didn’t know what another programmer had done, but these kinds of things will happen. Refactoring the duplication, once discovered, is just part of the job.

The Case for C# and .NET. It has been interesting as I’ve shifted… | by Charles Chen | ITNEXT

It has been interesting as I’ve shifted out of .NET ecosystem which I’ve worked with on the server side (and some stints of desktop…

Source: The Case for C# and .NET. It has been interesting as I’ve shifted… | by Charles Chen | ITNEXT

There are a couple of takeaways from this article. He talks about it from the perspective of a fan of .NET. I see strong points in favor of Rails as well.

First and foremost, I want to talk about speed. As a fan of Rails, I hate it when critics bring up the speed of Ruby, because I have to acknowledge that there is a definite, unavoidable penalty there. And why shouldn’t there be? It’s the interpreted nature of Ruby that makes ActiveRecord in Rails so dang flexible and easy to use. But I came to using Rails after about 10 years of using PHP, and it was painful to compare page load speeds in apps I rewrote from PHP to Rails. However, the relative productivity of the Rails stack made it a no-brainer over PHP for me.

In this article, the author compares some particular benchmark amongst various languages typically used for web application development. Here, he’s pointing out how slow Javascript is compared to .NET. But what I want to point out is that Ruby’s performance is often discussed in the context of using Java, and there’s basically no difference.

Further speed point here: https://benhoyt.com/writings/count-words/

Another thing to point out is the package mess. From the top graph, above, you can see the explosion of dependencies in the Javascript stack. Comparatively, it dwarfs everything else. Combine that with this graph, below, and the situation gets even worse. Sure, by this, you can see that .NET stack wins this race, but it’s also interesting to me that Rails clearly comes in second, especially when you also consider that it has zero critical vulnerabilities.

Over and over, Ruby and Rails gets dissed, these days, as somehow being unuseful, for a variety of reasons. I find those reasons specious. Over and over, when you dig into the rationale behind those reasons, you find out the situation is better than people give it credit for being. Rails continues to be a strong contender in the web application development world. Lots of big players continue to use it, despite how critical the HN crowd is about it. Even if it weren’t suited for those big, commercial web platforms, it would still continue to dominate in writing small, focused, line-of-business CRUD apps, and I continue to find it amazingly powerful to work with.

If I were to criticize the Rails stack, my first point of contention would be the Turbolinks thing. I’ve been sort of forced into using Ag-Grid as a drop-in Javascript data table widget, and, despite a lot of effort, I can’t find a way to make it play nice with Turbolinks.

The Problematic Black Box Nature of Neural Networks and Deep Learning – Brightwork Research & Analysis

Neural networks and deep learning are normally black box systems. This black box nature of neural networks leads to problems that tend to be underemphasized in the rush to promote these systems.

Source: The Problematic Black Box Nature of Neural Networks and Deep Learning – Brightwork Research & Analysis

I find this article absurd. If I were to create a neural network, the very second thing I would program into it would be the capability for it to log WHY it did the thing I programmed it to do. Are you really telling me that the tools available to us right now are incapable of this?

LinkedIn? In My GitHub? It’s More Likely Than You Think

Outlook Integration with LinkedIn

I didn’t much care when Microsoft bought LinkedIn, because no one actually likes LinkedIn. What little usefulness it has exists only because there’s nothing else in the space. A Facebook for work. Really? That’s boring squared. Who cares? But when Microsoft bought GitHub, I was really disappointed. I felt it was “unwarranted.”

Linus Torvalds wrote Linux, and changed the world. Despite never being able to make a dent in desktop usage, it destroyed what little progress Windows was making on the server side compared to Unix and minis, and now runs basically everything that isn’t a desktop (or an Apple device).

Then Linus changed the world again, and wrote git. Except for the absolute biggest repositories (e.g., Microsoft Windows, or, say, Oracle), it quickly ate all other source code management software, paid or free. And then Microsoft patched git to handle their codebase, and uses it now as well.

GitHub was one of the first big Ruby on Rails apps to prove the framework’s viability at scale; a huge platform success that didn’t involve either Microsoft or Oracle.

So, from my perspective, GitHub — hosting git repos using Rails running on Linux and MySQL — represented everything in the software world that was NOT MICROSOFT.

And then Microsoft threw a couple billion at the founders, the government shrugged their shoulders at such a “small” acquisition, and GitHub, like so many before, became another head on the software world’s biggest hydra. I actually felt a little betrayed by the founders, if I’m being honest. I hate the M&A activity that’s destroying our economy, capturing our government, and producing a new feudal-like aristocracy, but I suppose, of all the companies that had the resources to give the founders their exit, a DOJ-chastened Microsoft wasn’t the worst possibility. Certainly better than Oracle or Salesforce.

Now I see this tomfoolery in the updated version of Outlook, which my corporate laptop just self-installed. Uh, no thanks? In fact, I can’t imagine something I want less than this, but Microsoft is always surpassing themselves, so I’ll just give it time. I would complain about jamming more “stuff” into an already over-stuffed application, but Outlook may be the software world’s poster child for bloat at this point, so what’s another useless “social” add-on?

I’m saying all of that to say this: I fully expect GitHub to get some sort of LinkedIn integration like this in the near future as well. “Link your professional software portfolio with a click of the button!” it will say, as if you can’t stick a link in there already. And then it will build a graph of user data behind the scenes for only-God-knows-what further marketing purposes.

I also expect that there will be some linkage between GitHub and Azure Devops. I had been thinking that Microsoft would simply phase out Devops for GitHub. Devops has never been particularly interesting as a product. However, a thoughtful person on Twitter — “There are dozens of us!” — disabused me of that notion. I’m sure he’s right: Microsoft certainly has too many paying customers for Devops to do anything drastic with it now, and it has become another lame-duck victim of Microsoft’s own success, destined to limp on forever because of backward compatibility. But I’m certain that they’re not just going to leave these two, so-closely-related silos sitting right beside each other with no connection, and I’m also certain I won’t like it when they finally do something.

“How do you define ‘unwarranted?'”

UPDATE: A comment on HN pointed out that Microsoft already has “boss ware” in the form of “Workplace Analytics,” and it’s bundled in Office365. Ticking this box, then, will allow them to associate a real person with a user in your company’s “analytics.” Will they rank people for recruiters based on this data? Will they provide a report for companies who are considering you for a job? Sounds like a perfectly valid, dystopian business opportunity to me. Right up their alley. I wouldn’t put it past them.

Reselling gig work is TikTok’s newest side hustle

Resellers buy gig work for as cheap as $5 to resell for profit

Source: Reselling gig work is TikTok’s newest side hustle

Yes, you can make money by looking for opportunities to match up supply and demand, and legitimately take a cut of the transaction. I didn’t read the whole thing, but I doubt that they talk about the flip side of this “work.”

I read a classic Hacker News comment by a person who claimed that they were employed by 3 or 4 companies at any given time, and sent all of their work to 3rd-world countries, to be done by contractors. They “did nothing,” and collected multiple salaries. Except that… they didn’t “do nothing” at all. Managing all of this work would be a lot of work in and of itself.

See, in either the case of using TikTok to work the arbitrage, or in misrepresenting yourself as an employee (and not a outsourcing firm), this takes real work. You have to constantly be hustling. Not only that, but in doing all of these things, you’re going to frequently be getting mixed up, caught in the middle, and have people (from both sides) getting mad at you. You have to the special kind of person — e.g., a psychopath — for this to not affect you, if you want to do this sort of thing for any length of time. So this is hardly some sort of quick and easy way to get rich doing nothing.

Unseen Effort – The Daily WTF

The only downside to working for him was his disdain toward open source solutions. Anita couldn’t use any NuGet packages whatsoever; everything had to be built from scratch. She learned a ton while making her own JSON parsing library and working out OAuth 2.0 authentication.

Source: Unseen Effort – The Daily WTF

At the bottom of the article, there’s an in-line advertisement for a product which wraps NuGet with permissions. What a perfect way to deliver an ad. Is the whole story fake, in order to deliver it? And what a perfectly “corporate” product, to further exacerbate developer frustrations in large company environments.

Please don’t tell my company (Initech) about the existence of this product. I think there are several mid-level managers who would experience actual arousal at the thought of implementing it.