Hacker Newsnew | past | comments | ask | show | jobs | submit | rullopat's commentslogin

I don't get how Ive is getting so much praise as a designer, after designing the worst iPhones ever and a Ferrari that looks like a Toyota Prius on steroids.

Corporations are afraid of taking chance, and Ives have been elevated to this design guru for his work at Apple. This is despite the fact that he clearly had some terrible designes approved at Apple, but no on had the balls or status to tell him to go back to the studio and make an actual good design.

Ives also had a ton of really excellent and classic designs, but maybe the world needs to stop pretending that everything that man touches is instant classics and best in class. Maybe consumer electronics design doesn't translate well into other fields. I still think it due to companies refusal to take risk, and in some cases, like with OpenAI, wanting to get some association with Apple. Better hire Ives, because then no one can critic the design, because everyone know that Ives is the world greatest designer.

For Ferrari I don't get it. They already have good designers and I think their customers would prefer an EV that looks like a Ferrari, not a Ferrari that looks like Mac.


I'm starting to wonder exactly what designs Ive really had that weren't just "bland rectangle". I'll give him the Apple Loop and the iMac.

The exterior looks like a sad compromise between aerodynamics and design. Though the white version looks least plasticky. That weird bumper looks like the consequence of getting a lower drag coefficient.

It looks a little like the Apple Magic Mouse from some angles, only more ergonomic.

I think that this just emphasizes how much Ive needed Jobs as a constraint. The early stuff they did together was genuinely good and changed the industry for the better. But his later work after Jobs got sick seemed significantly worse. Definitely a relationship that needed both sides.

Couldn't agree more. Jobs' advice to say no to a hundred things sounds easy in a vacuum, but to actually go against the powerful people around you and gatekeep the quality and essence of your business over decades is incredibly hard, foolish and brave.

Jobs ability to say no to someone like Ive and not have him quit in a huff was 90% of his power, imo. It's a difficult line to hoe.

I'm sure everyone at Ferrari HQ dutifully applauded when this was revealed.

You buy a Ferrari for the sex appeal.

But you nailed it. It's the Ferrari Priuso.


I have a lot of issues with the Ive era and the Mac... but every iPhone he designed was a banger. I think the 12-14 era is the only era of iPhones I thought were bad and that was after him.

I suppose the iPhone 6 was bendable but that was a hardware engineering issue as shown by the same form factor not being bendable for the 6s through 8.


>> after designing the worst iPhones ever

How can this make any sense when he designed every iPhone until 2019? None of which would have existed without his original design and all of which remain relatively close to that original design.


amusingly, the last Toyota Prius looks quite nice.

My understanding is that he only did the interior, which I have no issue with. The exterior is garbage.

Your understanding is wrong. LoveFrom designed the exterior.

One of the perks of designing for cultist brands. Like, Apple could ship the next iPhone looking like the most ugly phone ever, and they will still make boatloads of money from their devoted followers. Same goes for Ferrari. If you want to find actually good designers instead of these celebrity designers, watch out for designs that don't have a cult-like following yet.

If you get every iPhone ever released, in black or black-adjacent, and lay them camera-side down and off, it would be difficult to line them up in the correct order.

Not much has really changed with them, and I'm not sure much really can.


Toyota has a decent boring design consistency

I understand the need for memory footprint in some situations, but what's the point of seeking performance for a software that mostly calls LLMs and waits?


Before I tried coding agents my guess would have been: none.

But seeing how slow claude code and copilot cli are and how much ram they use I'm flabbergasted. If you have long running sessions they can both take tens pf gigabytes of ram and feel quite sluggish.


huh. my evidence with codex hasn’t been so bad. and tbh why would i discourage anyone from coding. hack away mr hacker. your solution will either sink or swim


codex is in rust and not in power and memory hungry js/ts.


oh sweet I had no idea. funny that i mostly use it to write rust


It was previously JS/TS, but they rewrote it in Rust, sometime in the past 12 months.


Check out its app-server, IMO it’s a decent foundation to the codex clients.


The appetite for Rust is the appetite for higher guardrails. Automatic memory management in safe Rust makes it less likely your app bloats even as its source balloons.

The people "writing" agents are not themselves experts in how to write performant code. Claude Code is so massive and ugly it can only be realistically maintained by continuing to throw LLMs at it. But that's not a replacement for good software design.


I've been playing with running Claude Code inside a Vagrant VM. I can't be certain it was getting OOM killed when I allowed the VM 4GB of RAM, but when I went to 16 it did seem to be more stable...


> I can't be certain it was getting OOM killed when I allowed the VM 4GB of RAM

Of it's actually getting OOMed (and not backing off by itself), I'm pretty sure that's logged in dmesg. Or earlyoom or systemd-oomd if userspace is in play and getting there first.


Thanks for the tip, I will probably try shrinking it back to 4 to see, as that seems like it should be enough RAM for anybody (:


Yes...exactly. Its frustrating and inefficient.


I see spreading Rust as an overall good thing, because it changes benchmark on how software should feel in terms of performance, stability, memory footprint.

So even if it doesn't create tangible advantage in a particular use case - its still good for the whole industry.


No because it means people will use Rust for the wrong reasons.

Systems programming is only a tiny fraction of code out there.

Approaching every problem as a systems programming problem is a massive waste of resources and intellect.


For small to medium projects, an LLM can write functional (if not well crafted) Rust.

Considering how easy this is now, why choose a heavier, slower and less typesafe language?


Edit: I lost the context that this is about building devtools where you can’t just throw more hardware at the problem. But perhaps my answer still explains the reality: anthropic builds Claude with Claude so Claude needs to be easy to build with Claude.

Easier to read for humans is easy to read for LLMs. A more expressive language will bring about fewer misunderstandings when you apply stochastic tools like LLMs.

Just be sure you don’t choose something heavier/slower that is not more expressive.


Ok, so write your app in the garbage collected language, and then tell the LLM to translate it to Rust :)


Could choose a similar weight, similar speed, equal or more typesafe language though :)


Ada? Other than c and c++ everything else benchmarks 2-4 times slower than rust for compute bound tasks, even after jit warmup. I'm up for ada though, especially with an llm where I don't have to type all that verbose syntax.


OCaml? Haskell? Idris?

Lots of options with no jit or warmup


I'm not against jit or warmup, just saying it doesn't actually catch up for compute bound tasks in my experience. Haskell and ocaml would definitely be next on my list, but they do take a very good hit in performance over ada or rust. I wouldn't say they were similar in performance, certainly. There is a pretty big cliff between the systems languages and everything else performance-wise. For a lot of things it doesn't matter I know, but none of those things are domains I've ever worked in. I've never had a project in my professional career where we didn't descope requirements to fit the available compute.


I find it kind of shocking that Anthropic doesn't see it this way.


Claude Code has whole game engine built into it. God knows why.


Tell us more.


perhaps they refer to Claude code being built on top of a React renderer for terminals, Ink https://github.com/vadimdemedes/ink

and is riddled with timeouts and intervals in useffects


it saves a lot of resources - for instance my devices would probably use less than half of the memory it uses now and I wouldn't hear the fan.


You won't hear the fan because you're still building it.

The resources I was talking about are developers × time.


I am talking about using software - if software is used by many people, that's the more relevant resource usage.


It is a common trend for companies to optimize for visible CapEx at the cost of increased but invisible OpEx for consumers.


Since when is Rust a systems programming language? On their website it is defined as "general-purpose programming language".

>Approaching every problem as a systems programming problem is a massive waste of resources and intellect.

If someone took their time and decided to use Rust maybe their first couple projects won't be as efficient, but they will learn the language and how to use it in the best ways, they will contribute to the ecosystem, etc. Again, I'm looking at the big picture and not specific project case.


I haven't used Rust extensively but my feeling is, if you change the design (which inevitably happens in many early stage projects), the refactoring takes more time due to borrow-checker semantics. Although I am far from a representative sample and could well have been using it wrong


When you write Rust long enough you settle on certain architectures (message passing, event loops) that go well with the borrow checker, and don't end up thinking about it too much. Plus you can always throw an agent at the first set of errors from the refactor and let the compiler guide the annoying parts.


> When you write Rust long enough you settle on certain architectures (message passing, event loops) that go well with the borrow checker

So basically Go?


Go only provides one concurrency paradigm. Rust support many (if not all).

The type system of Go is very weak. I'd say that'd be my main reason to pass on Go, even when the concurrency paradigm fits the project perfectly.


The biggest reason to pass on Go right now (if your software can tolerate a runtime) is the lack of algebraic data types when doing interesting domain modeling. It makes such a huge difference it’s worth tolerating the pain points of Rust (or Swift, or F#) just to have them.


Traits, Enums, and Typestate allow much richer paradigms at much lower cost


Its just not a thing to consider and doesn't happen often.


How is it any faster than something written in say, Java?


latency and throughput (when with Java the system is crying for more memory while it's chilling in the Rust case)


You can tune java runtime in many ways, achieving impressive throughput/latency for your type of workload.

Next to none of them will get you nearly as good cold start times as of native app, if using free java.

There was GraalVM and its ecosystem which included Java Native Image - first thing I’d evaluate if thought about non-server side, performant Java application.

But it all had been sadly swept away by Oracle from free tier.


I use GraalVM and Native Image now and while the project --a small CLI tool-- is tiny (2kLOC with mainly AWS-SDK deps) the compile times are huge (~3 minutes), the OS-dependencies many (so much I use a build container to ease the burden of installing all) and the resulting binary is huge (~60MB).

But then it distributes as one binary and starts in milliseconds.

Rust would have been a better fit (cargo-and-done, smaller binary, quicker to compile); but I wanted to use Kotlin as we use in all other projects.


It hasn't been swept away by Oracle, far from it. It's development is just no longer coupled to the OpenJDK release cycle, which benefits both projects.


What's the latency difference between a long running process issuing a network call in Java vs rust? This is such a short time that it is completely overshadowed by noise (OS doing something else, what other software is running etc)

As for throughput: you have 1-2 requests going at a time, the next one waiting for the reply. What throughput are we talking about?

That's like speeding to the post office and expecting your letter to get to the recipient faster.


you seem to specifically aim at the current example, but mine wasn't

Anyways, consider how higher memory usage can affect the systems performance dramatically once the system needs to start swapping memory to disk signficantly


If you cannot write a simple Java agent without consuming so much RAM that your system is swapping then that really says more about the developer than anything.

Java is used in plenty of embedded systems and other memory constrained environments. Yes, it’s not going to perform well compared with Rust, but that doesn’t mean it’s an Electron-equivalent bloated clusterfuck of an ecosystem that’s going to eat all your system resources.


> so much

1) the agent is probably not the only thing running on the system, so more is just worse generally

2) I am fine if a developer needs Rust or similar to write a resource efficient app. I wonder what the developer could achieve when he put the optimization effort into the Rust app instead.


My point is that Java isn’t going to be the application that sends your machine into swap hell.

People are so narrow minded about programming on this forum. They talk as if only Rust fills the void between unsafe C and node.js behemoths. But the reality is there are a plethora of other good languages out there too.


I can't put Java into good languages category at least for how it allows null to be everywhere.


Of course, what would be a point of talking about an overly specific statement that has no relevance here?


> That's like speeding to the post office and expecting your letter to get to the recipient faster.

I mean, the post office is not a magic box. Actual people will take your letter somewhere, sometimes batching sends. So running to the post office might actually get your letter in an earlier batch, same as ordering on amazon or your online supermarket in the morning or in the evening might change the delivery time.

Pedantic, I know, but interesting example.


Simplest explanation I could come up with: Just for hype and fun.

Rewriting things in rust is "cool". Bun did it, other projects did it. Therefore, writing a coding agent in one should be cool too.

And apparently enough HN crowd agrees with it to take the #1 spot on the board.


For the most part, doing things right in the given language matters more than change of language. A lot of refactors in Rust (in the coding agent space) I see jump straight to Rust without considering what inefficiencies can be addressed before changing the language.

Having said that, I considered a Go/Rust rewrite of Dirac (https://github.com/dirac-run/dirac) for some modules to support cases when someone wants to run like 30 agents, but it quickly became obvious that, a) while the node event loop is a bottleneck, it is not the sole bottleneck and b) if you have a VSCode extension, you can't totally get rid of TypeScript, so it just becomes the case of bi-lingual project and the maintenance burden that comes with it


Rust is just another language. Sure it's cooler than some langs, to some ppl. Sure.

The author made the choice. Open sourced it (thanks!). So now we all enjoy more options. Saying author did so because "cool" does not sit well with me. It's feels like you get a no-strings attached gift of significant value and then going saying the giver gave it to be seen as cool.


Opencode can be surprisingly hard on the CPU (could be an issue when coding on battery or a weak remote VM), and uses a lot of RAM. A little competition is always welcome.


Even a simple coding agent TUI should work instantenously, which I sadly cannot say is true about typescript-based applications like Claude Code or Gemini.

After switching away from GNOME Terminal + Zsh to Ghostty + Nushell, I started to appreciate how instant everything feels. Why not make everything just as fast?


I have to say this is one of my favorite things about local Qwen and Qwen code, it seems a heck of a lot faster that Claude and feels better to work with.

Problem is it is nowhere near as smart, so what speed I get in conversation gets killed by iteration.


I didn't see anyone mention this, but I think having a single binary is much nicer than having a JS (or Python) program sprawled all over your system.


Having single binary output is completely different problem and is solved for both Python and typescript (bun supports the later).


That's true, but it's not quite the same thing. The single binary you're referring to is the interpreter and source code packaged together (at least for TS/JS).

If you install too many of these "single binaries" then at some point you would be better off just having a single interpreter and using npm/pip.

By contrast the Rust binary only contains the machine code for this program and can be directly executed.


Node and Deno can also bundle apps into a single executable.


Over time software grows. Once big rewriting it in another language is hard and gets harder as the project grows in size.

Starting with a resource-saving attitude may be a very good long term strategy.

Also: with Rust there are many features of high-level, modern, type-safe, FP-inspired languages that you do not have to miss.


Most FP languages cannot work without GC unless you're willing to give up idiomatic FP programming. There is a reason Haskell has a garbage collector.


Hence I used FP-inspired (to point at languages like Rust, Kotlin, Ruby, Swift)


That's exactly the tradeoff I made with Barnum (https://barnum-circus.github.io/). It's just not important to optimize the performance of the rust side for the reason you stated. So instead, all focus goes into making it easy for an LLM to build a reliable pipeline (from which LLMs are invoked).


While we are not there yet, people are looking into running agents in esp32 and alike.

See projects such as picoclaw, nullclaw and more.

https://github.com/sipeed/picoclaw

https://github.com/nullclaw/nullclaw


I recall back in the mid 2000s when i saw many "rewrite in rails" apps. Its just hype, and it will die out in a few years when something new comes out.


e.g. opencode right now uses ~80% of my CPU.

At first I also thought that it would be just call and wait, but a lot of work is done locally (any tool calls).


It's also dealing with memory issues (see: Memory Megathread https://github.com/anomalyco/opencode/issues/20695).

And in my experience is not that much faster to start than more complex software like Visual Studio Code.


If you write in Go, you get faster compile time, more likely your code will compile fine after long time.


- Reduce the footprint on the planet

- prolonged life of hardware

- less electricity

- less expensive hardware


Compared to what LLMs actually consume, your agent makes zero difference


Why would anyone compare a cloud LLMs power usage when one doesn't pay for it? Local power consumption is important for those.


OP specifically cited “reduce the footprint on the planet”


very wrong - especially on the local machine, see https://news.ycombinator.com/item?id=48164613


Running many of those in scale.


I think it's one (but not the only) reason that makes LLMs work very well with Ruby on Rails


I’m working on an ATS system that integrates LLMs for helping the recruiter in writing job descriptions, parsing CVs to Markdown, making summaries of CVs and suggest which ones match the best the job offers giving pluses and minus: https://beehive-ats.com/


The Thurstmaster steering wheel for the PlayStation looks nicer


So if you have a page that is common between, lets say, 30-40 tests, you prefer to copy/paste the new selectors everywhere?


Ive just designed not practical thin furniture, like the bending iPhones and the ultra thin MacBooks with no way to release heat and the keyboard that was getting broken after pressing a bit too hard


It's great for sending your 6 GB hello world exe to your friends I suppose


The beauty of docker is that it is a reflection of how much someone cares about deployments: do you care about being efficient? You can use `scratch` or `X-alpine`. Do you simply not care and just want things to work? Always go for `ubuntu` and you're good to go!

You can have a full and extensive api backend in golang, having a total image size of 5-6MB.


I've done both, tiny scratch based images with a single go binary to full fat ubuntu based things.

What is killing me at the moment is deploying Docker based AI applications.

The CUDA base images come in at several GB to start with, then typically a whole host of python dependencies will be added with things like pytorch adding almost a GB of binaries.

Typically the application code is tiny as it's usually just python, but then you have the ML model itself. These can be many GB too, so you need to decide whether to add it to the image or mount it as a volume, regardless it needs to make it's way onto the deployment target.

I'm currently delivering double digit GB docker images to different parts of my organisation which raises eyebrows. I'm not sure a way around it though, it's less a docker problem and more an AI / CUDA issue.

Docker fits current workflows but I can't help feeling having custom VM images for this type of thing would be more efficient.


PyTorch essentially landed on the same bundling CUDA solution, so you're at least in good company.


Yep, then I have some projects that have pytorch dependencies which use it's own bundled CUDA and non-pytorch dependencies that use a CUDA in the usual system wide include path.

So CUDA gets packaged up in the container twice unless I start building everything from source or messing about with RPATHs!


> You can have a full and extensive api backend in golang, having a total image size of 5-6MB.

So people are building docker "binaries", that depend on docker installed on the host, to run a container inside a container on the host– or even better, on a non-linux host, all of that then runs in a VM on the host... just... to run a golang application that is... already compiled to a binary?


Sure but a Docker setup is more than just running the binary. You have setup configs, env vars, external dependencies, and all executed in the same way.

Of course you can do it directly on the machine but maybe you don't need containers then.

In the same vein: people put stuff within a box, which is then put within another bigger box, inside a metal container, on top on another floating container. Why? Well, for some that's convenient.


Golang should not need docker. It's statically built.


Docker / containers are more than just that though. Using it allows your golang process to be isolated and integrated into the rest of your tooling, deployment pipelines, etc.


It's go; that could be trivially done with a script.

Heck, you can even cross compile go code for any architecture to another one (even for different OSes), and docker would be useless there unless docker has mechanisms to bind qemu-$ARCH with containers and binfmt.


I'd argue that having it in a Docker container is much easier to integrate with the rest of many people's infra. On ECS, K8s, or similar? Docker is such an easy layer to slap on and it'll fit in easily in that situation.

Are you running on bare servers? Sure, a Go binary and a script is fine.


Yep, it's using docker as a means of delivery really. Especially in larger organisations this is just the done thing now.

I understand what the OP is saying but not sure they get this context.

If I were working in that world still I might have that single binary, and a script, but I'm old school and would probably make an RPM package and add a systemd unit file and some log rotate configs too!


I'm using Kamal for a Ruby on Rails app on a dedicated server on Hetzner. Works like a charm! Did you find it difficult to deploy a .NET, because of the documentation oriented more towards Rails?


Took a bit of research and trial and error to get to a solution we liked, but as it's just deploying and managing Docker Apps, deploying .NET Docker Apps was ok but a bit of time was spent supporting DB Migrations and litestream and running it from GitHub Actions, we've documented our support for Deploying with Kamal (inc YouTube Guide) at:

https://docs.servicestack.net/kamal-deploy


What about Kamal? https://kamal-deploy.org/ Did anybody here use it for anything that is not a Ruby on Rails app?


Yes, I have been using it and really enjoying it for deploying web apps. So far I have deployed web apps using: * fastapi (python) * Django ninja (python) * ghost cms (node)

I have been writing up my thoughts (and an example): https://andrewperkins.com.au/kamal/

The ability to deploy to both cloud servers and on-premises is a big win as I often work on projects that have a mix of both.

As the sibling comment says, it’s focussed on web servers. In my use case that is fine!


Great! Are you also deploying DB servers or any other kind of additional servers that are dependencies of those webapps?


Yes, I am deploying mysql with ghost

``` accessories:

  db:
    image: mysql:8.0
    host: 170.64.156.161
    env:
      secret:
        - MYSQL_ROOT_PASSWORD
    options:
      restart: always
    directories:
      - data:/var/lib/mysql
```

For my other services I am just using sqlite combined with a volume for persistence (managed by kamal)


The thing that puts me off is its seemingly heavy focus on “web apps”. I have a bunch of services I either use or wrote myself and only a handful have anything to do with the web.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: