jonah's recent activity
-
Comment on Software engineers / programmers: how’s it going? in ~comp
-
Comment on Young adults in the US are increasingly wary of AI, concerned it will take jobs in ~tech
jonah Link ParentI agree. To add more to the “why”, in my experience, there is still so much more context outside of the code and in ways that a world of README’s will not solve. There’s a lot of work going into...I agree. To add more to the “why”, in my experience, there is still so much more context outside of the code and in ways that a world of README’s will not solve. There’s a lot of work going into giving the models as much as we can to solve problems, but the models still suffer from context collapse and hallucinations. I don’t see this being solved any time soon. There are many cases I see day-to-day where higher level architectural decisions are just not solvable by the models with the “set-and-forget” mindset often applied to the smaller bite-sized pieces of work that LLMs have come to excel at. It requires experienced engineers who know the existing system and know how to shit-test the LLM output. I do not fear for my job right now.
-
Comment on AI usage patterns in software teams in ~tech
jonah LinkWe've been doing this for a while at my current job. Importantly, we are reading and editing our cards before marking them as "Ready" though I see the time spent on this to be decreasing. I think...Two years ago, fewer than one issue in a thousand was created by AI. Teams now use AI to write just under half of everything created in Linear, and at the current pace it will soon author more than people and integrations combined.
We've been doing this for a while at my current job. Importantly, we are reading and editing our cards before marking them as "Ready" though I see the time spent on this to be decreasing. I think something Sean Goedecke mentioned recently is playing a part here.
It does occasionally worry me that more and more of the "card lifetime" is being handled by LLMs. For us, it seems like there's a great deal of care that goes into triaging an issue or a feature (still LLM-assisted). I mentioned this a few months ago in another thread. That still holds true. Since then, the bias towards the LLM almost owning the process of development and review (and these days, significantly assisting me in my testing, usually through harnesses and I/O validation) has continued to dominate. There's not a single part of my workflow where I'm not using an LLM to do something. I think I still have mixed feelings about that.
On one hand, it's nice that LLM models are getting to the point where a trivial, bit-sized piece of work is almost entirely automated where my role is essentially guiding it to completion. I have personally found it to be an excellent and efficient tool for performing a guided task. On the other hand, I used to spend a lot more time actually writing code. Sometimes I would even enjoy the process. Other times, if I didn't, I would at least feel like I had ownership of it. That is less so the case these days.
For my personal projects, I get to enjoy the best of both worlds. At work, the cost-benefit of using LLM models is that we're able to move quickly. I can slow down for my personal projects and actually write the code that is enjoyable to write. I can let an LLM do the parts I would usually anguish over with very little gained at the end. I have much more fun coding on personal projects these days than I did pre-LLM. I can basically set my own difficulty level now.
Just got to the end of writing this and realized it was more than I expected to write, so if you made it this far, thank you for participating in my train of thought. Every so often I like to hear how others in the industry feel about the current state of their jobs with respect to LLMs. My feeling as of writing this is... bittersweet. Usually I'm a little more excited about it LOL
-
Comment on Why your Amazon order confirmation emails have become so unhelpful in ~tech
jonah Link ParentEven with LLM assisted coding, I would hate having to waste usage or tokens (and time) every week just trying to fix a scraping script. Not to mention what you already did, which is the...Even with LLM assisted coding, I would hate having to waste usage or tokens (and time) every week just trying to fix a scraping script. Not to mention what you already did, which is the anti-scraping tools out there.
-
Comment on Why your Amazon order confirmation emails have become so unhelpful in ~tech
jonah Link ParentI don't think there is such an API, or at least one that's generally available. I would love to be wrongI don't think there is such an API, or at least one that's generally available. I would love to be wrong
-
Comment on Why your Amazon order confirmation emails have become so unhelpful in ~tech
jonah LinkThis has been particularly frustrating for me because I just wrote a nightly script to help me identify Amazon charges in YNAB and I was using the order confirmation emails to do that. I swear...This has been particularly frustrating for me because I just wrote a nightly script to help me identify Amazon charges in YNAB and I was using the order confirmation emails to do that. I swear like two days into the script working perfectly they stopped including product details.
-
Comment on Firefox for iOS now has a native adblocker in ~tech
jonah LinkUnfortunately it appears as though the feature has not rolled out to my device yet but to see if I had it, I downloaded Firefox and I’m pretty impressed with how pleasant the experience is. I...Unfortunately it appears as though the feature has not rolled out to my device yet but to see if I had it, I downloaded Firefox and I’m pretty impressed with how pleasant the experience is. I don’t recall the reason for just going back to Safari on my phone but I think I’ll stick with Firefox going forward. Native search engine customization means I can use Kagi without a weird extension. And upcoming built-in ad-block will let me get rid of another one.
I’m a big Firefox guy on all my computers. I really wish I remembered the reason I switched. Probably to try Orion and then ended up back on Safari.
Thanks for the reminder to try Firefox again!
-
Comment on I'm not ready to let this place go in ~tildes
jonah LinkNot to be a downer, and I’m mostly a lurker, but I didn’t get the impression at all that Tildes is anywhere near closing its doors. I don’t understand everyone else speaking about the most recent...Not to be a downer, and I’m mostly a lurker, but I didn’t get the impression at all that Tildes is anywhere near closing its doors. I don’t understand everyone else speaking about the most recent meta-conversations as foreshadowing the site shutting down. As far as I can tell, some folks are frustrated with some of the discourse recently (or maybe more than recently) and are publicly announcing their leaving because some aspects of the site are not to their liking in terms of moderation style. That’s certainly within their right. But it’s been a little more than topical, and I think Deimos just wanted to go on record and say nothing's going to change. It didn’t feel like he was announcing the end of the site. Yeah, if this place ends up going under I’ll miss it. I’m certainly not as involved as many of you, so it’s not the same for me, I acknowledge that. But I don’t personally understand these existential responses.
-
Comment on Actually useful MCPs in ~comp
jonah LinkFor anyone out there using Linear for project management, me and my team have found their MCP integration incredibly useful. When tasks are small and well defined, Claude can generally do a B+...For anyone out there using Linear for project management, me and my team have found their MCP integration incredibly useful. When tasks are small and well defined, Claude can generally do a B+ implementation with no other context than “read this linear issue and get to work.” Of course, YMMV, and I’d imagine it depends a lot on how heavily your team uses Linear day-to-day.
-
Comment on Megathread: April Fools' Day 2026 on the internet in ~talk
jonah Link ParentThey've included a query parameter for those who would like to disable it, so maybe they'll leave that in for those who would like to keep it around after today... Maybe try kagi.com?fun=yes tomorrow!They've included a query parameter for those who would like to disable it, so maybe they'll leave that in for those who would like to keep it around after today... Maybe try kagi.com?fun=yes tomorrow!
-
Comment on Megathread: April Fools' Day 2026 on the internet in ~talk
jonah LinkThe Kagi search page has a fun retro look to it. My favorite is the viewer count at the bottom!The Kagi search page has a fun retro look to it. My favorite is the viewer count at the bottom!
-
Comment on YouTube is awful. Please use YouTube, though. in ~tech
jonah Link ParentThat’s not really how music streaming works with respect to the hosting / delivery. Each service both hosts and delivers the content. It’s just that most people will have their content uploaded to...That’s not really how music streaming works with respect to the hosting / delivery. Each service both hosts and delivers the content. It’s just that most people will have their content uploaded to each of those services because those services are already popular and it would be bad for the artist not to upload their music there. And to my knowledge, most artists aren’t uploading to streaming services for monetary reasons, rather for discovery and conversions to concerts and merchandise. To make it analogous to music streaming, you could (and some already) do this by just uploading all your same content across various video hosting platforms. The reason I don’t think a lot of people do this is because it’s largely pointless in that Vimeo, Floatplane, etc have so little of the video content market share. There’s also a large difference in audience interaction between these platforms as most video platforms are social in some way whereas most music platforms are not. You’ve also got the problem of video being exponentially more challenging to host and deliver as opposed to audio.
I get what you’re saying in terms of your ideal situation for how video platforms should function, but music absolutely does not function like this already. And if it did, I still don’t think these platforms are nearly similar enough to compare them with respect to feasibility.
-
Comment on Five browser extensions to make every website more useful in ~tech
jonah Link ParentBecause Kagi requires login, you’d have to log in each time you want to use it in a private window. Not having to do that is very convenient. Kagi also doesn’t maintain your search history, so...Because Kagi requires login, you’d have to log in each time you want to use it in a private window. Not having to do that is very convenient. Kagi also doesn’t maintain your search history, so it’s not like my “private window” searches will appear in my account, because none of my searches do.
-
Comment on Day 4: Printing Department in ~comp.advent_of_code
jonah LinkPython Standard brute-force method of solving both of these and didn't take too long on my machine (sub 1s for both) so I'm happy enough to share my solution. I'm used to there being some kind of...Python
Standard brute-force method of solving both of these and didn't take too long on my machine (sub 1s for both) so I'm happy enough to share my solution. I'm used to there being some kind of edge case that my test input didn't capture, but it was pretty straight forward today and I didn't end up running into any of those problems.
I'm also going to remove my utility
grid_atmethod because... well you can imagine how that's implemented and it's just noise in the code (and I did not save any grid utilities from last year...)Part 1
from common import load_input input = load_input() # def grid_at(grid, x, y) relative = [ (-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1), ] grid = list(map(lambda x: list(x), input.splitlines())) w, h = len(grid[0]), len(grid) total = 0 for y in range(h): for x in range(w): if grid_at(grid, x, y) != '@': continue res = list(map(lambda d: grid_at(grid, x + d[0], y + d[1]), relative)) if res.count('@') < 4: total += 1 print(total)Part 2
from common import load_input input = load_input() # def grid_at(grid, x, y) relative = [ (-1, -1), (0, -1), (1, -1), (-1, 0), (1, 0), (-1, 1), (0, 1), (1, 1), ] grid = list(map(lambda x: list(x), input.splitlines())) w, h = len(grid[0]), len(grid) total = 0 while True: to_remove = [] local_total = 0 for y in range(h): for x in range(w): if grid_at(grid, x, y) != '@': continue res = list(map(lambda d: grid_at(grid, x + d[0], y + d[1]), relative)) if res.count('@') < 4: to_remove.append((x, y)) local_total += 1 if local_total == 0: break total += local_total for (x, y) in to_remove: grid[y][x] = '.' print(total) -
Comment on Day 3: Lobby in ~comp.advent_of_code
jonah LinkPython I almost gave up. I did not write my part 1 to be generalized for the second part, but when I figured out how to generalize it, I was able to keep the same efficiency as part 1. On my...Python
I almost gave up. I did not write my part 1 to be generalized for the second part, but when I figured out how to generalize it, I was able to keep the same efficiency as part 1. On my machine, my benchmark times (thank you
hyperfine) were 8.4ms and 9.4ms respectively.Part 1
from common import load_input input = load_input() def find_largest(batteries: [int], start_index: int, chop: int) -> int: largest = -1 largest_index = -1 for i in range(start_index, len(batteries) - chop): if batteries[i] > largest: largest = batteries[i] largest_index = i return largest_index total = 0 banks = input.split('\n') for bank in banks: batteries = list(map(int, list(bank))) a = find_largest(batteries, 0, 1) b = find_largest(batteries, a + 1, 0) total += (batteries[a] * 10) + batteries[b] print(total)Part 2
from common import load_input input = load_input() def find_largest(batteries: [int], start_index: int, chop: int) -> int: largest = -1 largest_index = -1 for i in range(start_index, len(batteries) - chop): if batteries[i] > largest: largest = batteries[i] largest_index = i return largest_index total = 0 banks = input.split('\n') for bank in banks: batteries = list(map(int, list(bank))) allowed = 12 last_index = 0 for i in range(allowed): n = find_largest(batteries, last_index, (allowed - i - 1)) power = pow(10, (allowed - i - 1)) total += batteries[n] * (1 if power == 0 else power) last_index = n + 1 print(total) -
Comment on Day 2: Gift Shop in ~comp.advent_of_code
-
Comment on Day 2: Gift Shop in ~comp.advent_of_code
jonah Link ParentBecause in those numbers, the repeated digits are repeated more than twiceBecause in those numbers, the repeated digits are repeated more than twice
-
Comment on Day 2: Gift Shop in ~comp.advent_of_code
jonah LinkI didn't post yesterday because I was annoyed at how long it took me. I was much happier today. My part 1 took very little time to write and executed pretty quickly, but part 2 took a little...I didn't post yesterday because I was annoyed at how long it took me. I was much happier today. My part 1 took very little time to write and executed pretty quickly, but part 2 took a little longer. On my machine I averaged about 1.2s. I decided to plug in some threading (not included here) to see if I could get it faster, and got it down to ~230ms. That was a cool win for today!
Part 1
from common import load_input input = load_input() # There's gotta be a better way to do this def id_is_invalid(prod_id: int) -> bool: str_id = str(prod_id) if len(str_id) % 2 != 0: return False mid = int(len(str_id) / 2) first, last = str_id[:mid], str_id[mid:] return first == last # Gross, but it works ranges = list(map(lambda x: list(map(lambda y: int(y), x.split('-'))), input.split(','))) counter = 0 # Dumb solution but it works for r in ranges: for prod_id in range(r[0], r[1] + 1): if id_is_invalid(prod_id): counter += prod_id print(counter)Part 2
from common import load_input input = load_input() def has_pattern_count(s, m, k): if s.count(s[:m]) >= k: return True return False def id_is_invalid(prod_id: int) -> bool: # Single digit IDs can't possibly match the criteria # And yes, this got me if prod_id < 10: return False str_id = str(prod_id) str_len = len(str_id) # m -> pattern length # k -> number of repetitions # m * k should always equal str_len # i.e., str_len / m should always be a whole number, and the result is k m = 1 while m < (str_len / 2) + 1: if str_len % m == 0: k = str_len / m if has_pattern_count(str_id, m, k): return True m += 1 return False # Gross, but it works ranges = list(map(lambda x: list(map(lambda y: int(y), x.split('-'))), input.split(','))) counter = 0 # Dumb solution but it works for r in ranges: print("Processing range:", r) for prod_id in range(r[0], r[1] + 1): if id_is_invalid(prod_id): counter += prod_id print(counter) -
Comment on Netflix kills casting from phones in ~tech
jonah (edited )Link ParentIf you have an old-ish PC lying around, you can get a cheaper NAS without all the bells and whistles. I have an older desktop powering my Jellyfin setup and it works pretty well. I got a Ubiquiti...If you have an old-ish PC lying around, you can get a cheaper NAS without all the bells and whistles. I have an older desktop powering my Jellyfin setup and it works pretty well. I got a Ubiquiti NAS and I’ve been thrilled with it. I wanted something that was actually… network attached storage and not another fully fledged computer setup built for media transcoding and all that. If you already have some hardware lying around it doesn’t have to be super expensive to self host.
Edit: I also missed your point about fixing stuff that doesn’t work. That used to be me too, so I get it. Once I dockerized everything, the time I’ve spent managing my stuff has approached zero. Managing that stuff is not for everyone. Sometimes it’s easier to have someone else worry about it
-
Comment on I think nobody wants AI in Firefox, Mozilla in ~tech
jonah Link ParentQuick answers are enabled by default insofar as your search will prompt a quick answer if it ends in a question mark. Given that most people do not literally type questions into their search...Quick answers are enabled by default insofar as your search will prompt a quick answer if it ends in a question mark. Given that most people do not literally type questions into their search engine (and also ending it in a question mark) I would not consider this to be an AI feature that is enabled by default the same way that Google’s quick answers is. It’s also very easy to disable if you would in fact like to write your search query in the form of a question.
I read your other comment about wanting to use products that are 100% AI free, so I’ll just concede that Kagi does in fact develop many AI features and if that’s a problem for you then I won’t try and convince you otherwise. I was instead trying to argue against the implied characterization of Kagi that they are chasing trends which I think is obviously false based on their history and their AI philosophy. Perhaps you disagree! Either way I appreciate the discussion.
Before I answer the main questions I'll just say I've been working full time in the industry as a backend engineer for about 7 years now. My mid-to-large size company is very pro LLM assisted programming. We have not yet fully given in to the vibe, but are are continuing to trend towards integrating the LLM into most or all processes.
The way the velocity of change feels in the last year since the year before is less to be sure. Much of my daily work involves using LLMs. I wrote recently that I feel somewhat conflicted about this, but day-to-day, my output has increased significantly and I have not seen a degradation in the backend services I work on. Ultimately, I'm happy to be using these tools to work on things that are less exciting, and spending more of my brain power on higher level problems.
There are certain types of work for which LLMs can feel like a cheat code, so in those ways, I enjoy work more because it's honestly still really fun to give an LLM a simple task that would take me 30-60 minutes on my own and watch it do it in less than 5. There are other times where I'm in a 2 hour Teams call looking at someone else's Claude session, and Opus 5 is just chugging and going down all sorts of different rabbit holes and in those moments I enjoy my work less because what are we doing right now.
That is challenging to quantify, so I'll say that I feel like I'm working the same. The shape of the work is dramatically different in the last year or two versus before that. Some days feel like more work, others feel like less.
I am still hopeful. I've written before that I don't feel my field will be replaced yet, though I do have enough experience to still bring value to an organization. I think organizations with the right mindset will continue to hire and train junior engineers, and my optimism is saying that the organizations with the wrong mindset will not survive the next 5-10 years. I think there will be a reckoning for the orgs that commit themselves completely to the slop. It's an uncertain time, but I'm still hopeful.
I can't really answer this one. One of my previous jobs made me miserable, and I was there for a year and a half because I just couldn't get hired anywhere else. That sucked, and I would imagine it sucks for just about everyone else in the same situation. So if you're struggling with the current landscape, I'd encourage you to talk to some folks about it. Everyone around here seems friendly enough. Heck, shoot me a PM if you just need to get something off your chest. Talking about it, and trying to find joy outside of my career is what got me through that time. Eventually, I got hired somewhere else and it's been the best time of my career. I also realized that even though my previous job was pretty awful for me, it was not a waste of time. I still experienced growth because of it. So if nothing else, try and find the bright spots.
I wrote an article almost a year ago that, upon reading it again, I have decided is not that interesting if you don't already know me. So in brief, even before LLMs I felt like my trajectory was in flux, and to be completely honest: that has not really changed. In recent years, I've felt that as I've continued to grow and continued to surround myself with other engineers vastly more brilliant than myself, that my understanding of software engineering and my place in that world will change. Ironically, that change is the only constant in my career.
Though, I did just tell my wife that if my job disappears I'll try to be an electrician. Something I can do with my hands that still feels like I'm solving a puzzle.