AboutBuilding software to make the electric utility industry .05% less shitty
SkillsC#, Java, Kotlin, TypeScript, Python, etc etc etc
Joined devRant on 1/9/2020
Do all the things like ++ or -- rants, post your own rants, comment on others' rants and build your customized dev avatarSign Up
From the creators of devRant, Pipeless lets you power real-time personalized recommendations and activity feeds using a simple APILearn More
Slowly working it up now, actually.
An annually updated, unbiased, multiple source application that engineers can use to check salary offers vs their skills, to make sure they don't get shortchanged. Intended to work for the entire planet (that we have data for).18
"Lawsuit Alleges Facebook Favors H-1B Visa Workers and Other Temporary Visa Holders over U.S. Workers"
And no one was surprised. Not that this will make a dent in the labor arbitrage problem, but at least it's evidentiary confirmation it's happening. If it goes through it'll likely mean a slough of follow-on lawsuits for the thousands of companies doing the exact same thing, and a cottage industry to find new creative ways to continue being predatory assholes.
I progressively became more right over the course of 30 years. At the point where I was contextually right more often than not, I determined that to be "good." Then I kept getting better, just in case.9
If you start your communique by saying anything in the vein of, "we have an immediate need for," I will not be replying to your email, linkedin ping, friend request on Instagram or semaphore frantically waved from the tallest hill in view. You are trying to sell something to me, I am not desperately longing to do something for you. If you don't work for me, you have no capacity to represent my interest.
Tldr; developers cede the power in the relationship to recruiters and other middlepersons at their own peril.8
1. Hit everything you do. You will learn more faster. Don't accept things at face value, care about why things work.
2. Study and experiment constantly. Be aware of your surroundings and what is going on. If you're not ready with a solution when a power vacuum appears, you will always be a grunt. Or worse, eventually a manager who everyone hates because you constantly tell the people who report to you how "back in your day," your code was amazing, there were no bugs and your shit doesn't stink.
3. Be honest with yourself: If you just want to keep your nose to the grindstone and make manager so you don't have to code anymore:
Quit. Stop now. Do not pass go, do not become a cancer on the industry.
Go get a job as a PM, you'll have a better career and you won't be the weak link holding everyone else back.
Tl;dr When the shit goes down, you better be ready.1
- you don't like math
- you don't like study
- you don't read documentation
- you throw out the manual
- you like to punch a clock
- you dislike books and reading
- you don't ever work more than 8 hours
- you can't tolerate the occasional weekend work day
- you fold under pressure
- you aren't good at crunch time
- you can't do on-call without committing seppuku
- you don't have attention to detail
- you aren't interested in technology
- you're not good at explaining things
- you can't deal with change
- you're not excited by the prospect of extreme variety
- you don't have the ability to focus
- you can't deal with ego without resorting to violence
- you can't deal with someone calling your baby ugly
- you can't discriminate between fact and opinion
And many, many more23
November brings .Net 5, for anyone who cares about that, and after listening to my husband watch Ignite "reveal" advertising container, and all the enterprise virtue signaling therein, I am now to the point where the only thing I can think is "Fuck you Microsoft, and Fuck .Net 5."
During a 30 minute speech, the director of the dotnet platform commits the following flagrant faux pas:
1. Introduces tons of visual studio easy buttons for shit we already do, no mention of VS code support.
2. Shows tools that anyone other than the most insular enterprise mouth-breather have been using for no less than 6 years
3. Gives absolutely no credit to the Open Source community projects backing the features he's showing
4. Shows nothing but mono-cloud integration, makes no mention of any other cloud targets for new features
5. Acts like "deploy your app the cloud from IDE" is something anyone should be doing in 2020
6. Showed an API repl that is pathetic compared to httpie when it was in alpha
7. Showed blazor loading from cache and said "Look at how instantaneous it is" (if you ignore the 5mb of cached payload it took to run the hello world demo)
8. Shows Project Tye, presenting it as a new groundbreaking xyz, fails to mention helm already exists
What's absent is what is most offensive:
- acknowledgment of community contribution
- no linux/mac tools, entirely windows-centric (which jives with my prediction of second-class citizenship for the people who contributed to .net core the most)
- cross-cloud capabilities
- bash/zsh (again with the untermensch relegation)
Fucking microsoft back to their old bullshit.24
There's little irritations that happen when working with clients over time that let you know that they're stuck in the past and definitely not the kind of client you want to have long term.
My personal favorite example:
"Can we put an icon that shows the weather on the banner of the website?"
Note: I don't make "websites," information portals, content pieces, etc.
It doesn't to matter what type of application it is; time tracking, HR, mortgage application, industrial control system, etc. I don't know why, but every single client I've ever had where I've been saddled with one or more people who have no business being anywhere near the term "stakeholder" asked for this stupid, banal, 1995 web portal fuckery. Their shitty little mushroom stamp contribution wasting everyone's time.
What's worse, they want it be prominent in the screen real estate. It can't just be a responsibly sized waste of space like the screenshot's top example (from a company whose entire business is weather, nonetheless). No, it has to be the busiest fucking thing in the control space, as in the example inferior.
Or maybe I'm just wrong and people desperately want to know if the sky is going to piss on them if they leave the cave.
Anyone else have a pet peeve in regards to recurrent, pointless functionality?2
Structure: decades of programming in too many languages to enumerate. I lean functional, but only when the language doesn't fight it. No matter what I'm doing, my code is immutable in practice, if not paradigm.
Syntax: No one thing in particular. I code differently depending on the language.
When I start learning a language, I'll find the standard style checker and create a project where I write an example of every single rule.
The end result is generally a quick intro to the language and a bonus understanding of the hot sports opinion in said language. I call this an ocean boiler.
I lean heavily into autoformatting because I've worked on too many projects to care, and I have a general expectation that something which is important enough to make a code standard is important enough to be enforced in tooling. I'd rather spend my time solving problems that thinking about stylistics.5
And if you don't know, now you know
"Microsoft will adopt Google Chrome's controversial Manifest V3 in Edge"
They finally got him. Couldn't get him on drug charges, couldn't get him on murder, so they fall back on old faithful: tax evasion
Side note: It's hard to find a picture of johnny boy without guns or nsfw material.24
Primitive streams. Their need to exist is a monument to legacy failure.
OrElse and AndAlso short-circuiting operators. The language designers were too fucking lazy to process logic, so they give specific keywords for those cases.
Random Hebrew error messages
Eval. It can be used responsibly, but most of the times you see it it's because someone fucked up.
Lack of Tuple destructuring in argument specification. Tuples were added, and pattern matching was added, and it's been getting better. The gear grinding starts with how Tuple identity assignment in arguments is handled. Rather than destructuring into the current scope, it coalesces the identity specification into a dot property of whatever the argument name is. This seems like an afterthought given they have ootb support for ignore characters.
This will probably be remedied in the next version or two, but Tuple identity forwarding between anonymous scopes normalizes to arrays of union types, because tuples compile to typeless arrays. It's irritating because you end up having to restate the type metadata in functional series even when there is no possibility for any other code branch to have occurred.13
It looks like Olognion is shutting down due to the intersection of !money and !ads. I kind of feel like we could keep this site alive with a combination of a static site generation and/or some crowdfunding.
Subscribed to CBS all access just for Picard and Lower Decks. Made the mistake of clicking on the Comedy Central icon by accident.
Two minutes later: email ad in my inbox advertising the Daily Show and Comedy Central.
Fuck you CBS. Double fuck you Viacom.4
The solution for this one isn't nearly as amusing as the journey.
I was working for one of the largest retailers in NA as an architect. Said retailer had over a thousand big box stores, IT maintenance budget of $200M/year. The kind of place that just reeks of waste and mismanagement at every level.
They had installed a system to distribute training and instructional videos to every store, as well as recorded daily broadcasts to all store employees as a way of reducing management time spend with employees in the morning. This system had cost a cool 400M USD, not including labor and upgrades for round 1. Round 2 was another 100M to add a storage buffer to each store because they'd failed to account for the fact that their internet connections at the store and the outbound pipe from the DC wasn't capable of running the public facing e-commerce and streaming all the video data to every store in realtime. Typical massive enterprise clusterfuck.
Then security gets involved. Each device at stores had a different address on a private megawan. The stores didn't generally phone home, home phoned them as an access control measure; stores calling the DC was verboten. This presented an obvious problem for the video system because it needed to pull updates.
The brilliant Infosys resources had a bright idea to solve this problem:
- Treat each device IP as an access key for that device (avg 15 per store per store).
- Verify the request ip, then issue a redirect with ANOTHER ip unique to that device that the firewall would ingress only to the video subnet
- Do it all with the F5
A few months later, the networking team comes back and announces that after months of work and 10s of people years they can't implement the solution because iRules have a size limit and they would need more than 60,000 lines or 15,000 rules to implement it. Sad trombones all around.
Then, a wild DBA appears, steps up to the plate and says he can solve the problem with the power of ORACLE! Few months later he comes back with some absolutely batshit solution that stored the individual octets of an IPV4, multiple nested queries to the same table to emulate subnet masking through some temp table spanning voodoo. Time to complete: 2-4 minutes per request. He too eventually gives up the fight, sort of, in that backhanded way DBAs tend to do everything. I wish I would have paid more attention to that abortion because the rationale and its mechanics were just staggeringly rube goldberg and should have been documented for posterity.
So I catch wind of this sitting in a CAB meeting. I hear them talking about how there's "no way to solve this problem, it's too complex, we're going to need a lot more databases to handle this." I tune in and gather all it really needs to do, since the ingress firewall is handling the origin IP checks, is convert the request IP to video ingress IP, 302 and call it a day.
While they're all grandstanding and pontificating, I fire up visual studio and:
- write a method that encodes the incoming request IP into a single uint32
- write an http module that keeps an in-memory dictionary of uint32,string for the request, response, converts the request ip and 302s the call with blackhole support
- convert all the mappings in the spreadsheet attached to the meetings into a csv, dump to disk
- write a wpf application to allow for easily managing the IP database in the short term
- deploy the solution one of our stage boxes
- add a TODO to eventually move this to a database
All this took about 5 minutes. I interrupt their conversation to ask them to retarget their test to the port I exposed on the stage box. Then watch them stare in stunned silence as the crow grows cold.
According to a friend who still works there, that code is still running in production on a single node to this day. And still running on the same static file database.
Parents were awesome. Super supportive, gave me every opportunity. They were open-minded loving people who eschewed personal vice and property to give us a start. They never once abused any of us, and in a family with three girls, we were encouraged to break the mould. We were shown that women could be more than just support to our spouses and baby factories, and more than part time labor in family enteprise.
Thusly my ascendance to a life as an engineer was assured and fully supported by these wonderful people whose folkright earnestness never once inhibited their progressive encouragement of our success as human beings, not just professionals.
And if you believe that, I have a bridge for sale in San Francisco you might be interested in.
I wrote on this topic before it was cool 😋
2020 seems to be the year of the "dev who has never seen scale."
TypeA -> "Here's a reasoned explanation for a change I think we should make. Here is the current deficiency analysis, here is the desired resolution, here is the course of action and all calculations leading to the resolution + data. This will have x,y,z beneficial result according to our operational metrics."
TypeD -> "Those were words. Why do you need that? Change is bad, learning is worse. This will just slow me down, development speed is all that matters; there is no chance that a poorly considered/factored/checked design could ever require a ground up rewrite or fuck us utterly in the long term. Why do you make my life harder? We could x -> y -> zBUTI haven't done the math and I really don't see the benefit in x, so z is pointless. What even is scale?"
The consequences of the war caused by the ever-widening gap between engineers and developers is low key terrifying.12
Between plague and smoke, spending way too much time indoors. Localised co2 got pretty high in the office my husband and I share and opening the windows is dicey during giant spider season even before the wildfires.
So as a result, I'm starting a little indoor garden in each room. The succulent are going to be hydro, and the prayer and snake plant will get soil so I have some place to dump my coffee grinds other than the rose garden. In the next month or so we also want to set up some living moss panels to help control the nitrogen balance.
And of course, obligatory rpi sensor suite and irrigation is inbound as well. That'll be a shared project. 😸48
While reviewing a PR from one of our newer FE devs, I ended up spending more time than I would like mulling over its composition. The work was acceptable for the most part; the code worked. The part that got me was the heavy usage of options objects.
When encountering the options object pattern (or anti-pattern, at times) in complex scenarios, I have to resist the urge to stop whatever I'm doing and convert it to the builder pattern/smack them in the head with a software design manual. As much as I would like to, code janitor is one of the least valuable activities I engage in daily, and consistently telling someone to go back to the drawing board for work that is functional, but not excellent is a great way to kill morale. Usually, I'll add a note on the PR, approve it, add a brown bag or two on that sort of thing, and make attendance mandatory for repeat slackers. Skills building and catharsis all rolled up in a tiny ball of investing in your people.
Builders make things so much cleaner; they inform users what actions are available in a context; they tend to be immutable, and when done well, provide an intuitive fluent interface for configuration that removes the guesswork. As a bonus, they're naturally compositional, so you can pass it around and accumulate data and only execute the heavy lifting bits when you need to. As a bonus, with typescript, the boilerplate is generally reduced as well, even without any code generation. And they're not just a dumping ground for whatever shit someone was too lazy to figure out how to integrate into the API neatly.
They're more work in js-land, sure; you can't annotate @builder like with Lombok, but they're generally not all that much work and friendlier to use.9
Conversation between my husband and myself.
H: I ordered a game for the switch last week. It was delayed by USPS, and it looks like I got a partial refund due to it being late.
Moi: That's your mail privilege at work.
H: Did you really just make a mail pun? *Snerk*
Moi: This is why we work. ♥️5
This day I have received the most glorious news in e-pistolary form. For some years, I was suffering in support of a client who was, well, insufferable. My presence there paralleled the divine comedy in both essence and fact.
I opened the missive, expecting another plea to bail them out of whatever clusterfuck they found themselves in. Instead, what I found was something truly magical.
I hope this finds you well. I'm not sure if you remember a few years back, we were trying to decide between IBM Cloud and AWS. Well, after years of battling FF*, we're finally moving ahead with AWS. He failed one too many times to deliver anything visibly. After you left, there was no one left he could use to steal credit, ideas, and work.
FF is still pushing to have them use IBM cloud as a "warm backup" in the event "AWS fails." We will see where that goes.
I figured you'd like to know; you were the void in the wilderness for a long time. I don't want to think about how much time we could have saved if we had just listened.
This event represents a personal victory, albeit belated, over a few peoples' absurd amount of privilege. Towards the end, I was vicious about my contestation to the insanity of adopting a desperate hedge attempt-as-cloud offering from a failing company. Some examples:
// cloud 'strategy meeting'
Moi: What cloud platform are we looking at using?
FF: We're looking at IBM cloud and AWS as a second.
Moi: Why is that? I understand you're obligated to rep your offering first, but that decision doesn't seem to have the customer's best interest at heart.
FF: IBM cloud is a market leader; AWS isn't as good.
Moi: I see. I mean, that's the tech equivalent of the company's fleet management considering monkeys on tricycles as a strong competitor to service trucks, but I get what you mean.
// steering meeting
Director: Who can we look to as an example? Who is currently using the IBM cloud?
Moi: No one; they account for a single-digit portion of the actual cloud market. Their long game to sell you a "Hybrid Cloud," which means put some front end payload in a CDN, and buy n-frame units of IBM z servers for the DC with IBM gateway appliances acting as connective tissue. So it's not the cloud at all, really.
Director: How does it compare in cost?
Moi: It's generally 40% more expensive than other clouds, and it only goes higher as you option their software.
Director: What about Watson? I hear Watson is good?
Moi: It's a brand name. Most of the "Watson" product is just a facade on top of FOSS products like Spark, Hadoop, Elasticsearch, etc.
Director: Those were words. They sounded good. FF say it's good tho so we'll believe him because we're from the same city.
Moi: *deletes Director from LinkedIn*
Moral of the story: Never trust a vendor that only recommends their products.
*FF = FatFuck - an embarrassingly rotund individual whose girth is roughly equivalent to his height. He shit his way into an IBM architect position in his mid-20s purely due to winning the visa lottery. He had fake hair glued to his head for his wedding to hide his male pattern baldness; his arrange-married wife undoubtedly cries herself to sleep after sex.
**PeeEm - the then project manager, now portfolio manager of some satellite projects. An overall decent human being, capable.9
Only Jilano cares about this:
Sped up a little bit, but hey, it has Mega in it, so I'm all good.6
Article in Seattle Times this morning detailing the "Legacy of Bill Gates Sr." who recently passed away.
I haven't read it, but I assume it's basically "Owner of the bill-gates-contrib repository."3
Local coffee shop/tech book store says what we're all thinking.
This is pretty on brand. They're my favorite local book store. If you're ever in town, definitely visit.
Having some thoughts as I sit here, trapped in the house by equal parts coronavirus and a layer of smoke drowning out the sun. The smoke is a bit of an annual thing; every year, some irresponsible jerk will go out and put their convenience and enjoyment over everyone else's quality of life.
It's a bit different this year since coronavirus has given people cabin fever. Those same people who lose their minds after weeks of isolation and suffering the indignity of wearing a mask headed out into the wilderness for recreation in record numbers.
The result is record wildfires.
Where I'm at, it's mostly coming from the eastern part of our state. The area is typified by being on the mountain range's dry side, more rural, less densely populated. Towns have burned, people lost their homes, millions of acres of land will likely burn before it's over. It happens every year; people pack up, head out into the wilderness, and cause devastation due to a simple lack of common sense or regard for the consequences of their actions.
On the west side, we see the fallout in the form of days without sunlight and abysmal air quality. We also see it in cost; we will unquestionably and without hesitation contribute to eastern recovery efforts. The western half of the state will cover almost all of the damage in both taxes and recovery aid. Our local ethos demands it.
The mountains form a kind of natural barrier, both cultural and environmental. The fact that few people cross the mountains by choice is symbolic of that divide. Those who enjoy greenery and lakes and thriving vibrant nature prefer the west, as we have them in abundance. People who have a strong appreciation for distance between themselves and other humans prefer the east, as it affords them cheaper land and few urban environments.
Here's to hoping people learn from this in 2021.17
Re-instantiating the interesting bits from the other thing:
Time complexity of unsorted array equality operations. Go!23
I don't always listen to music while coding, but when I do, it's because things are absolutely unmitigably fucked and it's going to take some herculean effort to unfuck it.
I have this thing I've done for more years than my kids have been alive when shit really hits the fan and I need to show the staff the old lady can still lay waste.
Step 1: put on "the playlist," which consists of only the most aggressive 90s marilyn manson songs.*
Step 2: put on the headphones, which are noise cancelling and super bassy
Step 3: pound a monster (blue, obv)
Step 4: get super manic
Step 5: get in the zone and destroy several features or a flotilla of bugs in a single night
Step N: make absolute fucking magic
Step N+1: call in sick the next day and sleep til noon
What's your hero process?
*Content has less to do with it than the headspace I've come to associate with it and the fact I can't get drowsy with the constant aggression.13