These types of lists are nice and I appreciate the time and effort put into making them. I do wonder how much utility they provide though? I personally find it a bit overwhelming. Like is idea that I sit down and memorize all this stuff?
In the past when lists like this come up I read a bit, then bookmark for later. Later never comes and now I just have this bookmark lying around amongst the thousands of others I have made over the years.
Maybe a more useful way to present this stuff is figure out a better way to give you the law relevant to the context in which you are in? For the sake of argument I could see something like this being useful:
INPUT
I am a `_developer_` working at a `_start up_` who `_needs to give_` `_an estimate_`
OUTPUT
- see Hofstadter's Law
Probably a non trivial task and I'm sure there's a law in that list that describes this phenomenon!
I think it might be more useful to think of this as a list that could help you expose "unknown unknowns". These aren't ironclad rules, but they are each a piece of gathered advice that hold some truth in some context. So if you encounter one that makes no sense, then great, that's a potential blind spot that you've transformed from an "unknown unknown" to a "known unknown".
So let's take your example of Hofstadter's Law
> It always takes longer than you expect, even when you take into account Hofstadter's Law.
So your reaction to this might be one of:
- Yes, that's a funny way to put it. I've spent many years estimating projects and matching up the final time taken, and even though i've gotten better at it, i still underestimate a little on each project. Here are different patterns i've seen for how my estimates end up going wrong. Here are different approaches i use now to try to mitigate how wrong my estimates end up being.
- Huh, that's interesting. I've just started being a manager, and i've been wondering why everything seems to take longer than i expect. Am i just the only one who is bad at estimating? Or is this some kind of problem that everyone encounters. Maybe i should look up techniques or ask advice on this subject.
- I don't know what this means. Why would anyone's estimates be wrong? Writing a website is like making a ham sandwich right? Once you do it once or twice, you must be able to estimate it perfectly every time.
>These aren't ironclad rules, but they are each a piece of gathered advice that hold some truth in some context.
This is spot on. There is a time and a place for these "laws" which is sometimes forgotten. Don't be dogmatic about following them. They will be detrimental to a team following them blindly.
I tend to agree with you about generic awesome lists, but this one seems useful as a reference. Bookmarking for the next time I can't remember what the Lindy Effect is called.
It's good to give it a read so you're familiar with the concepts, but then remember where the list is, or archive it so you can return to it.
Later down the line, you're going to encounter a problem and one of the ideas in the list will be helpful in framing the context of your problem. It may or may not help in finding a solution, but it can help articulate the problem to other people.
Heh. I have been at the butt end of that one a few times. Another favorite of mine is when they push back with Parkinson's law: work expands to meet time available for its completion.
Not on topic but can I just say fuck Reddit for the way they purposely hobble the mobile experience on web? No I won’t install your shitty app Reddit. Ever. I might have considered it before but it’s personal now.
While the "download our app goddamnit" popups are clearly user-hostile, I do wonder how much of the rest of the UI is poor due to incompetence. Or to put it more nicely, due to structural and organizational issues.
Most of the new(er) UI seems to be a poorly performing, slow, and inefficient experience on desktop as well. There's a few improved features here or there, but most of the site is just genuinely awful to use - beyond things that are 100% subjective. Buttons and interactions are laggy and way more resources are used than you'd think were necessary. It certainly seems worse for getting ad impressions, ignoring the additional dark patterns it has over the old UI.
Across all of the new UI, the mobile version of it, and the official reddit apps, the experience is quite terrible, in many of the same ways. It seems odd to me that the same mistakes would be made in all of the products, and not solved after so much time and talent were available.
Maybe there's just some product person who likes a lot of bad ideas and has too much power. I dunno. It's weird.
Though Teddit's intentions are great, I feel like using teddit, reddit, baconreader, etc is still giving Reddit my time, focus, and fellowship. As a site, I've noticed I don't feel good after browsing it the last few years, so aside from articles or something that a friend passes along, I don't find myself there as often.
Addictive social networks are awful specifically because they're engineered to give you dopamine. If a website lets you check in and out without becoming addictive then… good!
(Unrelated to this post) Hello! I've sent two emails to hn@ for help with my account over the past few weeks. Is there a better way for me to contact you/whoever's on the other end of that email for help?
I was a lot more interested in this product until I started reading the marketing copy. To me it reads like the worst of breed of Silicon Valley “solution looking for a problem speak”.
Yeah, I don't love their communication / marketing as well.
Basically, it is a todo manager, but with built-in first-class scheduling. You input your todos, assign time estimates, and Sorted helps you spread them out in your day, keeping your calendar events in mind.
To explain the value in this, let me copy one of my comments in this thread:
[...] Sorted is really great for people like myself who tend to overfill their todo lists, and subsequently feel bad at the end of the day when they don't manage to complete everything.
Sorted pushes me to assign time estimates to the task, which helps me to keep my todo-list for the day more realistic and manageable. I like it more than managing my todos directly in the calendar [...].
> Basically, it is a todo manager, but with built-in first-class scheduling.
> You input your todos, assign time estimates, and Sorted helps
> you spread them out in your day, keeping your calendar events in mind.
Org-mode does present all the same information, but tasks are not automatically scheduled down to the minute. Though I would not be surprised if someone did write a script to micromanage every minute of the day.
If someone needs the tool to say "17:04 unplug laptop ; 17:05 place laptop in bag" then I think that they are spending too much time with their tools and need to spend more time doing the first thing on their list no matter if it has a timestamp or not.
This looks perfect for my brain. I like the idea of hyper scheduling, which seems to be automatically scheduling todos on your timeline, and automatically moving them around as life happens. Moving todos around manually in Google Calendar whenever you use more time than planned is a drag.
Same here. I've always wanted a timeline style scheduling program like this.
I've used a notebook exactly like this project, sort of a hybrid bullet note system. Eventually when work got too complicated I started doing the same thing in an RTF notes program.
But the biggest thing for me though is being able to add info VERY quickly without more than a few taps. Otherwise I'm just not going to bother with it.
My notes, I have a full keyboard and dedicated "open notes" button on my touch bar. Works excellent for me.
The author doesn’t mention it in the article but the pattern suggested is inversion of control (IoC) which is one of my favorites. Highly suggest looking into it if you’ve not heard of it.
Yeah this is the "D"[1] is SOLID [2]. Robert "Uncle Bob" Martin talks about this in his books Clean Code and Clean Architecture. I'd recommend them. Clean Architecture is really good as an audio book.
I am in injecting a function that returns a `User` type. That is the interface. I, the function accepting the injected function, don't care how it gets that `User` (that's the implementation). I just care that I am getting a `User`.
Now, knowing that, I can inject any number of function implementations that implement that interface. As long as a `User` gets returned it does not matter how the sausage gets made so to speak.
I have a bunch of tattoos. My right arm is sleeved for instance. Not saying that to try to get coolness points here (tbh I don't think tats are even considered "cool" anymore...) but to just make the point that I've got some bad ones I'd rather not have. It's gonna happen if you get enough of them. For instance, I found a painting of a girl in Day of the Dead face paint that I _loved_. Got something inspired by it tattooed on me. A big one at that. The artist who painted said painting ended up being Sylvia Ji[0]. Her stuff is now adorning the bottoms of snowboards and displayed on t-shirts. Would I have gotten that knowing what I know now? Absolutely not. Do I regret it? Eh... not really. At the time that I got it, it was a really different thing to get.
I think the point of a tattoo, the thing that makes them so exciting, is the fact that you can in fact get one that was a mistake and that mistake is permanent. Its inherently a dumb thing to do to yourself and depending on how you look at it, that can either be exciting and life affirming or a reason to never ever set foot in a tattoo studio. Knowing that, you can definitely over think your first one and do something like the author is describing. IMO you just own it. Ok so you got something that someone else has. Whatever! Get more. Get a cover up or get it removed! To me it's kind of an analogy for life: messy, complicated, hard to get out of sometimes. Even getting a bad tat is a ballsy move IMO.
Notion has no doubt taken note that a lot of people (myself included) use them as a quick and dirty wswyg web site builder. This new feature can be used for a lot of things, but it strikes me as particularly good for that use case. In fact, if I were a gambling man, I'd wager that their product roadmap is full of gems like this and are leading to them positioning themselves as a competitor to the likes of Squarespace and Wordpress.
I'm using Notion as the DB for a simple jobs site with a static frontend and it's been really nice. Super easy to use CRUD interface out of the box and it's easy to rapidly iterate on data models.
Normally I approach these kinds of projects with a well planned out data structure and proper migrations but the velocity in getting something usable out the door and getting people to use it as been well worth the shortcut. I hope Notion leans into this use case.
I thoroughly enjoy writing "nice" internal articles for my company in Notion. It just works. Props to them for pulling this off so effectively. I look forward to seeing what they've got coming in the pipeline.
Man, for a dev with as much experience as you’re claiming to have, this comment ain’t a great look.
I’d argue that the more experience you get the more you write code for other people which involves adding lots of tooling, tests, etc. Even if the code works the first time, a more senior dev will make sure others have a “pit of success” they can fall into. This involves a lot more than just some “unit tests as an afterthought to keep the coverage up.”
Keeping the code simple, finding the right abstractions, untangling coupling, gets the most bang for the buck. See the “beyond pep8” talk for a enlightened perspective.
That said, lightweight testing and tools like pyflakes to prevent egregious errors helps an experienced dev write very productively. Typing helps the most with large, venerable projects with numerous devs of differing experience levels.
> Typing helps the most with large, venerable projects
I disagree. I've started using types from the ground up and it helps almost equally at every stage of the game. Also I aggressively rely on autocomplete for methods. It's faster this way than usual "dynamic" or "pythonic" python.
Part of it might be exactly because writing my datatypes first helps me think about the right abstractions.
The big win with python is maybe 2-10% of functions, I just want to punt and use a dict. But I have shifted >80% of what used to be dicts to Models/dataclasses and it's so much faster to write and easier to debug.
I agree but guardrails are pretty awesome. And if people were saying "don't use guardrails, just drive properly", I'd ask why they think guardrails and driving properly are mutually exclusive.
Agreed. It's like saying "oh well I just fly the airplane really carefully". A lot of codebases eclipse the point where one person can understand the whole system. Testing, static analysis and tooling are what allows us to keep the plane flying.
> However, the top post approaches religious dogma.
I don't deny it. Join the cult of Static Python. We have cookies! And lower stress levels!
I usually wrap that spiel with my caveat "this depends greatly on your neurotype, style, environment, and other things." I have ADHD and my brain struggles with keeping bits of state in memory, so having to remember the type of every variable without my IDE tracking it for me is a huge performance drain.
However, I would contend even if your neurotype supported that mental workflow... it isn't actually better. Humans on average can handle 7 +/- 2 "pieces" of information in focus. Why spend any of your precious half-dozen pieces of salient consciousness on something a machine is really good at doing?
Because it adds a lot of work that many projects don't need. Read wpietri's post on how candidates who write static get half as much accomplished in an interview.
Also since the tools are immature and bolted on afterward in Python, I think it's even a bit worse than it would be in something decent like C#.
It's an immediate tell when someone makes statements like the one you're replying to.
It immediately tells me that they've never worked on large software projects, and if they have they haven't worked on ones that lasted more than a few months.
I apologize to folks reading this for my rather aggressive tone but I've been writing software for a long time in numerous languages, and people with the unit tests as an afterthought attitude are typically rather arrogant in fool hardy.
The most recent incarnation I've encountered is the hotshot data scientist who did okay in a few Kaggle competitions using Jupyter notebooks, and thinks they can just write software the way they did for the competitions with no test of any kind.
I had one of these on my team recently and naturally I had to do 95% of the work to turn anything he produced into a remotely decent product. I couldn't even get the guy to use nbdev, which would have allowed him to use Jupyter to write tested, documented, maintainable code.
I've worked on large scale projects for a long time. A large portion of the kind of code I've written is impractical or impossible to actually "unit test" e.g. Unity3D components or frontend JS that interacts with a million things. When something weird is going on I'll have to dig in with console logs and breakpoints.
On certain backend code where I am able to do unit tests, they do catch the occasional edge case logic error but not at a rate that makes me concerned about only checking them in some time after the original code, which I'll have already tested myself in real use as I went along.
> A large portion of the kind of code I've written is impractical or impossible to actually "unit test" e.g. Unity3D components or frontend JS that interacts with a million things.
Opinion: This is actually a symptom of what is (imho) a pervasive problem lodged deep in the collective consciousness of software dev: OOP with fine-grained objects. I blame (early) Java in large part for exacerbating this mentality. Encapsulation of state with mutator methods in particular. It sprays state all over the application, encourages mutation in place over immutability, coupling, validating-not-parsing, and makes it nigh-well impossible to write good tests.
It's really hard to write objects that enforce all invariants under every mutation. And when you have state strewn everywhere, it's impossible to test every nook and cranny. The combinatorial space explodes.
Objects are helpful for encapsulating state when they are course-grained, mutations are atomic, coupling occurs in one place, state changes are auditable, and the entire state can be replayed/set at once, to enable mock tests and subsystem integration tests. AKA, things like databases, reactors, and persistent data structures.
I quit the company and the team as a result of the bosses refusing to make their pet data scientists write remotely professional code.
I was more experienced with predictive algorithms and deep learning than any of the data scientists at the company but because they were brought in from an acquisition of a company that had an undeserved reputation due to a loose affiliation with MIT, they were treated like magicians while the rest of us were treated like blacksmiths.
I had the choice and I made the choice to leave. And of course I raised hell with the bosses about them not writing remotely production quality code that required extensive refactoring.
And yes I was paid to do the work but the work occupied time that I could have spent working on the other projects I had that were more commercially successful but less sexy to Silicon Valley VCs who look at valuations based on other companies' newest hottest product.
This reminds me of the lie detector scene from the wire[0]. I love that show and thought this scene was clever and funny. After reading this it has me wondering if cultural touchstones like this glorify what’s actually something pretty devastating.
In the past when lists like this come up I read a bit, then bookmark for later. Later never comes and now I just have this bookmark lying around amongst the thousands of others I have made over the years.
Maybe a more useful way to present this stuff is figure out a better way to give you the law relevant to the context in which you are in? For the sake of argument I could see something like this being useful:
INPUT
I am a `_developer_` working at a `_start up_` who `_needs to give_` `_an estimate_`
OUTPUT
- see Hofstadter's Law
Probably a non trivial task and I'm sure there's a law in that list that describes this phenomenon!