488 karma · joined April 2, 2022
The truth is on most teams one or two people who are closest to the task have enough context to estimate, and probably only after they spent some time starting or prototyping the task.
Those people can give a reasonable estimate, in time not some strange point system.
Sometimes the estimate is wrong and that’s ok.
It’s fine to have a meeting catching everyone else up on the context but those pther people still likely don’t have enough to give an accurate estimate and shouldn’t be involved in estimation
For example, the Wall Street journal pricing is pretty wild (8 dollars a month for the first 3 months then jumps to much higher) so I use a virtual card which expires right before the planned price hike.
For other services I like to either use a virtual card with a single transaction limit, or just buy the service and cancel right away which typically is equivalent to just paying for a month
Some of those things can be improved but inherently strapping a computer to your face is just not a great experience.
I definetly get use out of mine - I’d say 5 hour a week is a sweet spot - and it’s cool working in novel places like a garden or by a river, but full time doesn’t seem feasible
And I’d rather work in a codebase where the owners are constantly doing such refactors than not.
We are fixing it up by refactoring - many through adding abstractions.
I’m sure code with bad abstractions can scale poorly, but I’m not clear how code without abstractions can scale at all.
If you have a good job with a good PPO plan, this healthcare is just incredible. You are free to see any doctor you want, including specialists without any gatekeeping.
Want to see the best orthopedic surgeon in the world who just fixed Lebron James's knee? Make a call and get an appointment within a few weeks paying a 30 dollar fee. Want to see 10 more orthopedic surgeons to get 2nd, 3rd and 4th opinions? Same process.
Decide to have a surgery? Sure! Sign up to have that done in a few weeks, eventually paying $250 out of pocket for the whole experience, including overnight hospital stays and physical therapy.
Having spent some good time hanging out in facebook groups for my condition with international patients, its pretty much always evident that they dont have this kind of freedom in picking their doctor, getting a surgery quickly, and also often lack cutting edge and modern treatments that are offered in the states.
I totally understand that this system is very unfair, and there is whole subset of people that have no access to care, but it should be noted that if you are in the top 50% of society financially, and especially if you have a difficult health condition you manage there is no healthcare system better in the world to do that then the USA.
Source - work at a FANG which engineers exclusively via remote video call.
So for me, on average, 99% of mail goes right from USPS to the trash - in fact, I would probably pay a few dollars a month for a service which would automatically trash that 99% of mail for me.
That has me asking - what is the point of USPS these days? Is it just packages?
What I do see every day is "oh yeah, this method / file is pretty big, lets add one more thing to it anyways, I dont have time to refactor", and things grow and grow out of control.
I think one basic, and yet rare ability of a professional software engineer, and the skill that should separate you from a hobby programmer, is writing your code in a way which can scale and grow. The strategy for this cannot just be "let me put everything in one file, class, method and lets just see what happens".
That can be an OK first draft approach, but there needs to be a second step. And ultimately, if you set the architectural pattern of "big hairball", everyone else will happily follow it since its not their fault the architecture is like that - they are just adding one more thing. That can be OK for a first draft, but you will have to go back and introduce architecture and modularity at some point, or watch the project collapse under the weight of its own mess.
Once you see enough of those failures, you can start sensing basic patterns for introducing modularity, boundaries and structure to a project, to its modules, and to its classes and methods. As you keep flexing that muscle, in my experience, the "this code is best written as a huge single method" approach basically never seems like a good idea anymore.
This is a good pattern for some cases, like the public members of a package. However, I love that I don’t need to do this for every class I write.
And if you do use this approach, at least swift will emit a compile error if your protocol and implementation signatures don’t match.
ObjC will happily compile if your header is missing an implementation and crash at runtime.
However, its predecessor UIKit is mostly imperative and it takes a lot of manual code to keep the UI reflective of the underlying data model. For this reason I find many IOS apps, and especially apple’s own, to be always mildly broken.
Programming in UIKit is like programming in JQuery, or maybe Backbone at best.
SwiftUI brings us to the modern age of react (but with less capabilities and more bugs)
IOS developers though tend to be pretty resistant to such “modern” paradigms. If you read the rest of the discussion on this post, you fill find that even using Swift, let alone SwiftUI is still a very debated issue.
Maybe the grass is greener, but I don’t find the same resistance for new ideas in the web (typescript) or Android (kotlin) communities.
I do wonder if this resistance is combing from an objective evaluation of the new tech, or the lack of desire/time to learn something new.
Is it primarily then people who invest in real estate outside of their primary home?
I am not saying you need to create complex abstract hiarchies right off the bat. But usually, it’s pretty easy to tease out a couple significant abstractions that are very obvious, and break down your classes by a factor of two or three. Just getting such low hanging fruit will prevent you from ever having a 2000 line long method.
And for the folks who are saying that they make sure to not add abstractions too early - are you disciplined enough to go back and add them later? I feel like if you’re the kind of engineer that busts out 2000 line methods, you’re also not going to refactor it as this method grows to 2500 or 3000 lines or beyond.
Probably most robust software you depend on is full of solid, quality abstractions. Learning to write code like this takes practice. The wrong abstraction might be wrong, but it’s one step closer on your journey to growing as an engineer. You won’t grow if you never try.
Just don’t do that. Your code doesn’t have to have abstractions out the wazzo, but if your class (or method) is getting bigger than 1000 lines that’s a great sign that it’s doing too much and abstractions can be teased out. Your future self will thank you, as well as your team.
At the same time, it’s notorious for people stealing stuff - many folks I know across all income spectrums cheat the system in some way.
The temptation to ring in organic produce as conventional and save a few dollars is pretty damn hard to resist myself.
Aside from the points and rewards, credit cards are much more likely to reverse fraud transactions. I’ve had banks deny fraud reports and demand police reports while credit cards always reverse the transaction no questions asked.
Actually it’s best to not even have a debit card in your wallet if it’s linked to your main bank account - the only debit card I carry has access to an account with a hundred dollars or so just in case I need cash.
How does immutability or patter matching save me from runtime errors caused by changing the fields or types inside a struct? Wouldn’t the pattern matching just fail and go down the wrong code path since it was matching for the old pattern?
I feel like immutability is great, pattern matching is great, but static typing is also great and there is no reason why it can’t happily live along side the other two.
If you change the shape of a model object and break its type, it’s great that BEAM will gracefully handle that mistake, but no matter how many times that service restarts, it will still be broken at runtime.
I think type systems have gotten so good in modern languages (Kotlin for example) that it’s a disservice to your org to not use a statically typed language.
I haven’t looked at Dialyzer lately, but is it as robust and easy to use as a first class type system? Having experienced partial typing with annotations with python I must say it’s not nearly as smooth as a proper statically typed language.
I do wish something like Gleam was the front runner language on BEAM - I bet it would get taken a lot more readily.