<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Marginally Interesting</title>
  <subtitle>Mikio Braun&#39;s Blog</subtitle>
  <link href="https://blog.mikiobraun.de/feeds/posts/default" rel="self"/>
  <link href="https://blog.mikiobraun.de/"/>
  <id>https://blog.mikiobraun.de/</id>
  <updated>2026-10-20T22:21:59+02:00</updated>
  <author><name>Mikio L. Braun</name></author>

  <entry>
    <title type="html">That one time an agent was more helpful than I wished for</title>
    <link href="https://blog.mikiobraun.de/2026/10/you-dont-always-want-a-helpful-agent"/>
    <id>https://blog.mikiobraun.de/2026/10/you-dont-always-want-a-helpful-agent</id>
    <published>2026-10-20T22:14:58+02:00</published>
    <updated>2026-10-20T22:21:59+02:00</updated>
    <content type="html">




&lt;p&gt;Very often I see people starting a system prompt like &amp;quot;You&#39;re a helpful agent/bot that does XYZ&amp;quot;, and I&#39;ve done it, too. But once I was working on an agent to take natural language request and turn it into a SQL query in a very well defined domain. We had added canonical queries, background information, guides how to modify the query, how to add break downs, etc.&lt;/p&gt;
&lt;p&gt;And YET, the agent always started with &amp;quot;ok, let me see what kind of tables are out there&amp;quot;, and essentially making up stuff as it went along.&lt;/p&gt;
&lt;p&gt;So I started tweaking the prompt, and eventually arrived at something like &amp;quot;your job is to translate the users request into sql in the most direct way possible following the guides you have. If you are stuck, don&#39;t try to solve it, report back to the user so they can fix it.&amp;quot;&lt;/p&gt;
&lt;p&gt;At that point the agent started to use the canonical queries as instructed, and guess what, it turned out that the query had a bug! I can only assume that the agent realized that and tried to work around it to be helpful! After I found and fixed the bug, I left the phrasing in because for this specific use case, that&#39;s what I wanted.&lt;/p&gt;
&lt;p&gt;I learned from this that &amp;quot;helpful&amp;quot; is note just a default friendly persona, it already implies a lot of behavior, and depending on what you want, it might not be the right thing.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Unfolding LLMs all the way</title>
    <link href="https://blog.mikiobraun.de/2026/10/unfolding-llms-all-the-way"/>
    <id>https://blog.mikiobraun.de/2026/10/unfolding-llms-all-the-way</id>
    <published>2026-10-14T23:37:30+02:00</published>
    <updated>2026-10-15T00:16:17+02:00</updated>
    <content type="html">




&lt;p&gt;I recently had a realization about the structure of typical llm computations like the agent loop or the llm inference itself which I found interesting to better understand what&#39;s going on.&lt;/p&gt;
&lt;p&gt;The basic version of an agent loop (the loop that produces an llm conversation) looks something like this, including tool calls:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# start with the system prompt in the conversation history
h = [p]
while True:
   # get user input
   u = userInput()

   # add to context, compute response
   h &amp;lt;- h :: u
   l = llm(h) # call to an OpenAI endpoint for example

   # deal with tool calls as long as there are some
   while l has tool call:
     r = execute tool call
     h &amp;lt;- h :: r
     l = llm(h)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It&#39;s pretty straightforward, but it&#39;s also a bit inelegant, because you update the history and call the llm in two different places. Sure, you could try to clean it up a bit, and rearrange, but this is closest to &amp;quot;you call an llm, and execute tool calls as long as it keeps coming back with more tool requests&amp;quot;.&lt;/p&gt;
&lt;p&gt;And it&#39;s a bit tricky. I had one subtle bug once where I forgot the second history update, and then wondered why the llm was calling the tool call over and over again! I was already blaming the stupid LLMs, when I didn&#39;t realize that to them it just looked like the result never came back! Totally &amp;quot;it&#39;s definitely a compiler bug territory&amp;quot; 😅&lt;/p&gt;
&lt;p&gt;OK, but what&#39;s the structure of the loop?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;we start with a history that&#39;s just the system prompt [p]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;depending on the type of the last message we do one of the following...&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;if it&#39;s a llm reply and it&#39;s a tool call, execute a tool call, and we get a tool result&lt;/li&gt;
&lt;li&gt;if it&#39;s a user message or a tool result, call the llm, get a reply&lt;/li&gt;
&lt;li&gt;else ask the user for the next input&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;... then we append the result to the history and start over.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reminded me a lot of functional operations on data streams in languages like Scala, clojure, or Haskell!&lt;/p&gt;
&lt;p&gt;A simpler example is the fold or reduce, where you apply a function f to a collection like [a b c] by first applying f(a, b) to get x, and then f(x, b) to get y, the result:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;(fold f [a b c]) = (f(f a b) c)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;What we have here is a close cousin, the unfold. While a fold summarizes a collection, the unfold generates a collection. The unfold takes a function f and a starting state. f takes a state and either returns an output and a new state, or None when it is done.&lt;/p&gt;
&lt;p&gt;For our agent loop, this function looks something like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;def next(h):
   if last(h) is user message or tool result:
      r = llm(h)
   elif last(h) is tool call:
      r = execute tool call(last(h))
   else:
      r = userInput()
   return (r, h :: r)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The whole agent loop becomes essentially &lt;code&gt;unfold(next, [p])&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So this is at the core of any agent framework out there, no matter how complicated. They add things that aren&#39;t here like persistence, streaming responses, retries, interrupts, limits on number of turns, etc., but at the core, it&#39;s still an unfold of the &lt;code&gt;next&lt;/code&gt; over an append only history!&lt;/p&gt;
&lt;p&gt;Another interesting parallel is that the way how the llm interacts with the worlds is reminiscent of how that is modeled in Haskell with IO monads. In Haskell as a pure functional programming language, the language itself has no concept of IO, and IO operations are just descriptions of IO which are then executed by the Haskell runtime. Here, the situation is the same, as the llm cannot make a system call, but it can ask the runtime, the agent loop to do a tool call on its behalf.&lt;/p&gt;
&lt;p&gt;That clarifies how each of the components behave when you think about testing and replays:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The llm itself is almost functionally pure, except for the sampling. If you take a more &amp;quot;probabilistic view&amp;quot; then the llm part can be replayed and will sample from the same distribution, which could still have forks, however.&lt;/li&gt;
&lt;li&gt;You need to &amp;quot;undo&amp;quot; the result of tool calls and create exactly the same situation as before, then you can compare outcomes.&lt;/li&gt;
&lt;li&gt;The human itself is also not &amp;quot;functionally&amp;quot; pure. But if you use an LLM generated conversation partner you can reset that in the same way.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;ok-lets-unfold-the-next-layer-llm-generation&#34;&gt;Ok, let&#39;s... unfold... the next layer, llm generation&lt;/h1&gt;
&lt;p&gt;Turns out, the inference part of the llm computation is &lt;em&gt;also&lt;/em&gt; this kind of unfolding a computation over an append only history.  Very simplified, in particular leaving out the details of RoPE positional embeddings, llm inference looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llm(h) = unfold(inference, prefill(h))

# prefill computes k, v vectors for all heads / all layers for the context
# which are needed for the attention mechanisms later
def prefill(h):
  embed tokens for the whole history h
  # compute transformer for the whole history from bottom to top
  from bottom layer to top:
    # for each layer we can compute in parallel
    for all tokens in h:
       compute k, q, v vectors
       compute attention to previous positions
       compute mlp
  return [h,
          [k, v] vectors from all layers for all of the history]

# Do one step of inference, update state by appending the
# outputs and [k, v] vectors
def inference(c: [outputs, [k,v] vectors):
  embed last token
  from bottom layer to top:
    compute k, q, v vectors
    compute attention to previous positions
    compute mlp
  sample output o from last layer
  if o is &amp;lt;END&amp;gt;:
    return None
  else:
    return (o, c :: [o, [k, v] vectors ])
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;So in essence, prefill is like a layer by layer map operation that works in parallel over the whole prefix (and is cached so you only need to compute for the new part - that&#39;s the reason why prefill is faster than generation), and inference is an unfold that generates layer by layer.&lt;/p&gt;
&lt;p&gt;What is the conversation history in the agent loop are the [k, v] vectors that are required for the attention computation, but structurally it&#39;s again an unfold!&lt;/p&gt;
&lt;p&gt;If you look at agent libraries that are written in functional languages, you will actually see these patterns in production, for example &lt;a href=&#34;https://docs.outskirtslabs.com/ol.llx/next/&#34;&gt;https://docs.outskirtslabs.com/ol.llx/next/&lt;/a&gt;. I actually don&#39;t think we should now rewrite all libraries in functional style. Sometimes a for loop is clearer in its intent. But then you add a ton of other stuff and it becomes muddy. But essentially, it&#39;s an unfold over an append only history!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">logexplain</title>
    <link href="https://blog.mikiobraun.de/2026/10/logexplain"/>
    <id>https://blog.mikiobraun.de/2026/10/logexplain</id>
    <published>2026-10-14T21:36:59+02:00</published>
    <updated>2026-10-14T22:30:29+02:00</updated>
    <content type="html">




&lt;p&gt;&lt;strong&gt;Github repo:&lt;/strong&gt; &lt;a href=&#34;https://github.com/mikiobraun/lx&#34;&gt;https://github.com/mikiobraun/lx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt; &lt;code&gt;go install github.com/mikiobraun/lx@latest&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it is:&lt;/strong&gt; Using an LLM to explain a log stream.&lt;/p&gt;
&lt;p&gt;When I was recently playing around with ollama to test out some local models and the effect of context sizes, I got a bit tired of parsing the (relatively) detailed ollama logs to figure out if the changes have made it, or if I accidentally misspelled an environment variable again. Naturally I thought &amp;quot;maybe AI can solve this for me?&amp;quot;&lt;/p&gt;
&lt;p&gt;My idea was something like: collect a bunch of log-lines, maybe maximum number, time since last run, send them to an LLM with a prompt. My reasoning was that either the LLM knows the format, or the prompt would contain an explanation of the prompt. A quick search showed the &lt;a href=&#34;https://github.com/binary-knight/logwhisperer&#34;&gt;logwhisperer&lt;/a&gt; as a similar project but following my credo &lt;em&gt;&amp;quot;the best way to learn something is to do it yourself&amp;quot;&lt;/em&gt; I started designing with Claude Code and created lx - logexplain.&lt;/p&gt;
&lt;p&gt;Running that on ollama logs, restarting and then having llama3.2:1b parse a bit of text (I was testing on a raspberry pi 5!), you get this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# You need to set OPENAI_BASE_URL, OPENAI_MODEL, and potentially OPENAI_API_KEY
$ journalctl -fu ollama -n 0 | lx --profile ollama
[22:19:41] Ollama service stopped then restarted; config logged, two GPU‑probe runners launched, CPU compute detected, low‑VRAM mode entered.
[22:19:50] Loaded Llama 3.2 1B Instruct (1.22 GiB), CPU‑only (0 offload, 1.3 GiB req), runner started in 1.78 s, 1 runner loaded
[22:19:57] /api/generate returned 200 in 10.8 seconds.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Great improvements! :)&lt;/p&gt;
&lt;p&gt;You can also add a &lt;code&gt;--focus&lt;/code&gt; option to look for specific types, for example &amp;quot;show only which [GIN] endpoints are being called&amp;quot; you get&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[22:22:32] HEAD &#39;/&#39; and POST &#39;/api/show&#39; called, both returned 200.
[22:22:37] POST &#39;/api/generate&#39; returned 200 in 7.6 s.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The examples above were using gpt-oss:120b in the cloud. But this actually worked interestingly well with local models. Even a gpt-oss:20b produced good results which I could even run on my MacBook Pro M1 Max with 32GB. Adding the &lt;code&gt;--debug&lt;/code&gt; flag also shows some timings:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;lx: debug: summary of 13 lines: 6.57s total, 3.87s to first token, prompt 3424 tok @ 884 uncached tok/s, completion 162 tok @ 60 tok/s
[22:24:31] Restarted ollama service, loaded config, scanned blobs, no GPUs found – CPU only, low‑VRAM mode entered.
lx: debug: summary of 189 lines: 18.09s total, 13.05s to first token, prompt 10352 tok @ 793 uncached tok/s, completion 267 tok @ 53 tok/s
[22:24:58] POST /api/show caused Llama 3.2 1B Instruct to load into 1.3 GiB CPU memory, runner ready in 1.03 s.
lx: debug: summary of 1 lines: 5.75s total, 2.76s to first token, prompt 2450 tok @ 888 uncached tok/s, completion 186 tok @ 62 tok/s
[22:25:04] Generate completed 200 in 10.08 s using Llama 3.2 1B Instruct.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;About 800 t/s prefill, and then 60 t/s is not too bad, although you start moving away from real-time considerably. But at least you don&#39;t pay per token!&lt;/p&gt;
&lt;h1 id=&#34;&#34;&gt;&lt;/h1&gt;

</content>
  </entry>

  <entry>
    <title type="html">Building and validating at the same time</title>
    <link href="https://blog.mikiobraun.de/2026/10/buildidating-and-validating"/>
    <id>https://blog.mikiobraun.de/2026/10/buildidating-and-validating</id>
    <published>2026-10-05T13:35:02+02:00</published>
    <updated>2026-10-06T22:25:24+02:00</updated>
    <content type="html">




&lt;p&gt;I&#39;ve been coding with agentic support for a bit more than a year now on the side, and built a huge number of things, all developed with a &lt;a href=&#34;https://blog.mikiobraun.de/2026/01/my-aicore-stack&#34;&gt;raspberry pi 5 running in my living room as dev server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Not all of these have been finished or released, but there are definitely some threads for me: &lt;a href=&#34;https://talkwithren.com&#34;&gt;Talk with Ren&lt;/a&gt; made me interested into richer personas, not just &amp;quot;helpful agents&amp;quot;, leading to &lt;a href=&#34;https://bjornthebouncer.com&#34;&gt;Bjorn the Bouncer&lt;/a&gt;, the idea for a persona rich agent roleplaying as a used camera shop owner. Another thread was creating tools to keep the loop fast: &lt;a href=&#34;https://github.com/mikiobraun/dev-router&#34;&gt;dev-router&lt;/a&gt;, a home use OAuth server, a tool to manage credentials for LLM endpoints. And yet another topic was agent-human collaboration, leading to explorations into &lt;a href=&#34;https://blog.mikiobraun.de/2026/03/making-coding-agent-say-no-for-science&#34;&gt;multi-agent collaboration&lt;/a&gt;, and knowledge bases (I&#39;ll talk about that another time).&lt;/p&gt;
&lt;p&gt;One thing I definitely fell for initially was &amp;quot;AI excitement&amp;quot;. Especially a year ago, agents were very enthusiastic as long as if you were, and I just love developing ideas, so more than once I came out of a longer session in a haze of &amp;quot;OMG, this is IT! If this takes off, it&#39;s going to be amaaaazing!&amp;quot; But then, I launched Talk with Ren, 60 people signed up, most of which I knew personally, and then nobody used it more than 3 sessions. At first I thought &amp;quot;is this that sycophancy problem I keep reading about?&amp;quot; I tried tweaking the prompt, making the AI more challenging, etc. But over time I realized that the agent was not the problem. You can have exactly the same kind of echo chamber with a human. Be it a cofounder, who also just wants to see it happen, or a supportive friend. That&#39;s what the book &lt;a href=&#34;https://www.momtestbook.com&#34;&gt;&amp;quot;The Mom test&amp;quot;&lt;/a&gt; is all about. But then I wondered, is it a problem? Isn&#39;t it more like ideation is just one phase of many, and you still need to validate your ideas by asking yourself &amp;quot;what do we know, what did we just assume?&amp;quot;&lt;/p&gt;
&lt;p&gt;So I thought &amp;quot;what&#39;s next? Focus groups? A/B tests?&amp;quot; or, maybe I should look for feedback readily available: myself. I came up with two rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Try to solve a problem that I have.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do I come back to using it?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first rule was important to ground myself again after flying in the sky with thoughts like &amp;quot;this could become a multi million dollar platform play&amp;quot;. When I focussed on a concrete problem I&#39;d often realize that I didn&#39;t need any of those platform features I had already envisioned. More than once did this help me to actually build the simple thing instead.&lt;/p&gt;
&lt;p&gt;The second rule I originally didn&#39;t see, but over time I noticed that there were some things that I built that felt useful, but then I never used them again. Other tools immediately became part of my toolbox.&lt;/p&gt;
&lt;p&gt;But then I realized (and thanks for sticking with me till here): what am I actually doing? I&#39;m building tools mostly for myself, and I&#39;m immediately using them. Because of agents, the building was minutes for what used to be hours or days. And since I&#39;m the user, testing is immediate.&lt;/p&gt;
&lt;p&gt;So I was building and validating at the same time... building and validating... buildidating?!&lt;/p&gt;
&lt;p&gt;It always used to be that building and validating were two different stages. You used to get seed funding to get something in front of customers to get some data point whether it actually made sense. But now, you can build so quickly it doesn&#39;t even have to be a separate stage anymore. And if you can rapidly get feedback, the two stages can really collapse, and you&#39;re getting iteration speeds that don&#39;t match anything we&#39;re used to in the software industry.&lt;/p&gt;
&lt;p&gt;Not always of course, but now I&#39;m thinking what does it take to be buildidating more? And the real challenge: how to bring this way of working to the team level.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Google Search AI Mode: the best facts grounded chatbot nobody knows about</title>
    <link href="https://blog.mikiobraun.de/2026/05/google-search-ai-mode-the-best-facts-grounded-chatbot-nobody-knows-about"/>
    <id>https://blog.mikiobraun.de/2026/05/google-search-ai-mode-the-best-facts-grounded-chatbot-nobody-knows-about</id>
    <published>2026-05-20T10:27:36+02:00</published>
    <updated>2026-05-20T10:27:36+02:00</updated>
    <content type="html">




&lt;p&gt;At yesterday&#39;s Google IO conference, &lt;a href=&#34;https://techcrunch.com/2026/05/19/google-search-as-you-know-it-is-over/&#34;&gt;Google announced that they will overhaul the Search experience&lt;/a&gt;,  making the difference between normal search and AI mode smaller, adding working agents that can scan for news, and &amp;quot;generative UI&amp;quot; essentially creating dynamic web sites for your replies, and people are already &lt;a href=&#34;https://www.reddit.com/r/Fauxmoi/comments/1ti2qmp/google_search_as_you_know_it_is_over_instead_of/&#34;&gt;losing their minds.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I used to also think that &amp;quot;Google Search AI Mode&amp;quot; is one of those &amp;quot;let&#39;s just tack AI on all our products&amp;quot; kind of moves, till I realized that Google accidentally built the best web search integrated chatbot there is, and it looks like they finally realized what they have.&lt;/p&gt;
&lt;p&gt;Google Search AI Mode is different from your usual LLMs with a WebSearch() tool, because it works more like &lt;a href=&#34;https://www.semrush.com/blog/query-fan-out/&#34;&gt;supercharged RAG.&lt;/a&gt; The first step is to take your text and generate a number of potential search terms from it, then doing all those queries in parallel and then assembling context for the chatbot&#39;s answer. And because it is powered by the Google Search index, it is essentially the best facts grounded chatbot that I&#39;ve come across. No more &amp;quot;I think this was after your training data cutoff, please do a websearch&amp;quot;, no more &amp;quot;Let me search for this... interesting, let me search for one more thing... OK, now I have the full picture.&amp;quot; This is the only chatbot I came across that you can ask about an event that happened just today without extra prompting.&lt;/p&gt;
&lt;p&gt;The problem is, of course, that Google Search doesn&#39;t seem to be aware that they built a chatbot, but it feels more like they think they built a search with &amp;quot;generative result presentation.&amp;quot; It doesn&#39;t have a shred of personality, and depending on what comes back in the result set, it might tell you a completely different story than in the turn before. And it has the worst &amp;quot;might I interest you in something else&amp;quot; engagement prompting I&#39;ve ever seen!&lt;/p&gt;
&lt;p&gt;But it&#39;s definitely a full fledged chatbot that can be used to gather data, discuss theories, and just have a chat. One time it even offered me to help me write a draft to which I thought &amp;quot;ok, interesting, let&#39;s see how that goes given that you don&#39;t have access to any tools or documents.&amp;quot; Sometimes, some guardrails kick in, and Google search seems to wonder if you&#39;re still searching for stuff. And the best thing: as this comes out of Google Search, it&#39;s free, paid for by ad revenue from the classical result page.&lt;/p&gt;
&lt;p&gt;When &lt;a href=&#34;https://blog.google/products-and-platforms/products/search/google-search-ai-mode-update/#deep-search&#34;&gt;Google Search AI Mode was announced a year ago&lt;/a&gt;, they also announced a couple of coming integrations, like giving it access to your emails and personal context, or shopping, but I think that was never really scaled out. Once or twice I have seen actual product cards, but while it&#39;s happy to talk about any kind of products, the integration isn&#39;t really there. Maybe they&#39;re waiting for Google&#39;s Universal Commerce Protocol to roll out, who knows. Other companies like OpenAI have tried to push agentic shopping but &lt;a href=&#34;https://theroberthu.com/blog/chatgpt-shopping-pullback-sellers&#34;&gt;rolled back in March after lack of adoption&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Google Search AI Mode (we really need a shorter term for this!) is now the third Google Product (after Google Workspace and the Gemini chatbot) that tries to integrate with your personal data, and I think this is an example of Conway&#39;s law, every org shipping its own product. And you can see the Google Search DNA in the way it is executed technically.&lt;/p&gt;
&lt;p&gt;I actually don&#39;t think this is wrong, this is how big organizations work, and it also creates some competition and parallel exploration. What really seems to work for Google, however, is the investment in foundational AI technology. All these products are based on Gemini models, and other recent developments like &lt;a href=&#34;https://research.google/blog/turboquant-redefining-ai-efficiency-with-extreme-compression/&#34;&gt;TurboQuant&lt;/a&gt;, and their own TPU technology to run Gemini models at scale. As so often, product development and launching products is not their strongest suit, but in terms of technology, their strategy seems to work out. As recent as two years ago people were still saying that &lt;a href=&#34;https://financialpost.com/financial-times/how-google-fell-behind-in-the-ai-race&#34;&gt;Google lost the AI race&lt;/a&gt;, but those days are behind us.&lt;/p&gt;
&lt;p&gt;Now it seems Google is realizing what they have. With 1 billion monthly active users on AI mode, my original claim that &amp;quot;nobody knows about this&amp;quot; is apparently not true anymore. But I also hope that the good old ten blue links results page will not completely vanish!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Agentic memory the follow up</title>
    <link href="https://blog.mikiobraun.de/2026/04/agentic-memory-the-follow-up"/>
    <id>https://blog.mikiobraun.de/2026/04/agentic-memory-the-follow-up</id>
    <published>2026-04-20T09:22:20+02:00</published>
    <updated>2026-04-20T19:00:50+02:00</updated>
    <content type="html">




&lt;p&gt;&lt;a href=&#34;https://blog.mikiobraun.de/2026/04/building-ais-that-grow-with-you&#34;&gt;Last week I wrote about agentic memory&lt;/a&gt; and I got a lot of responses, in particular many people pointing me to existing projects like mem0 or letta.com. So I started doing research, and as one does these days, discussed the findings with Claude. Immediately I thought I should write a follow up, and then I thought, why not try to let Claude write a part of that article? But also try to make it actually readable and not the typical AI slop, so here&#39;s Claude&#39;s summary:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Claude:&lt;/strong&gt; Full disclosure upfront: I&#39;m an AI writing about AI memory, which means I have an obvious conflict of interest. Make of that what you will.&lt;/p&gt;
&lt;h2 id=&#34;so-what-is-ai-memory-actually&#34;&gt;So what is AI memory, actually?&lt;/h2&gt;
&lt;p&gt;If you&#39;ve used ChatGPT or Claude recently, you&#39;ve probably already interacted with AI memory without thinking much about it. &lt;a href=&#34;https://openai.com/index/memory-and-new-controls-for-chatgpt/&#34;&gt;ChatGPT&lt;/a&gt; now has a two-layer system: &amp;quot;saved memories&amp;quot; that persist until you delete them, plus a &lt;a href=&#34;https://help.openai.com/en/articles/11146739-how-does-reference-saved-memories-work&#34;&gt;&amp;quot;reference chat history&amp;quot;&lt;/a&gt; feature that mines your past conversations for context. You can explicitly ask it to remember things. Claude (that&#39;s me — or rather, the product I&#39;m part of) has its own memory system that works differently, generating summaries from past conversations and applying them automatically. Gemini is weaving memory into Google&#39;s ecosystem across Search, Workspace, and Android.&lt;/p&gt;
&lt;p&gt;These platform-native implementations are what most people encounter, and they&#39;re a useful starting point because they make the core idea concrete: the AI retains something from past interactions and uses it to be more helpful next time. Simple enough in principle. But the product design choices already diverge — explicit vs. automatic memory, user-controlled vs. system-managed, transparent vs. opaque retrieval. Even at this most visible layer, there&#39;s no consensus on how memory should work.&lt;/p&gt;
&lt;p&gt;Now, these consumer-facing features are just the surface. Behind them, there&#39;s an entire ecosystem of memory infrastructure being built. When I surveyed what&#39;s out there, I found roughly six categories of approaches. Let me walk through them.&lt;/p&gt;
&lt;h2 id=&#34;memory-middleware-the-add-memory-to-your-app-layer&#34;&gt;Memory middleware: the &amp;quot;add memory to your app&amp;quot; layer&lt;/h2&gt;
&lt;p&gt;This is where most of the startup energy is. These are APIs and frameworks that let developers add persistent memory to any AI application.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/mem0ai/mem0&#34;&gt;Mem0&lt;/a&gt; is probably the most prominent — a dedicated memory layer that extracts facts from interactions, stores them, and retrieves them later. They&#39;ve grown fast, with integrations across LangChain, CrewAI, Vercel, and a &lt;a href=&#34;https://mem0.ai/blog/state-of-ai-agent-memory-2026&#34;&gt;recent AWS partnership&lt;/a&gt;. Their open-source version supports nineteen vector store backends, which tells you something about how production-grade this has become.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.letta.com/&#34;&gt;Letta&lt;/a&gt;  (formerly &lt;a href=&#34;https://www.letta.com/blog/memgpt-and-letta&#34;&gt;MemGPT&lt;/a&gt;) takes a fundamentally different approach, inspired by operating systems. It treats context like virtual memory — shuttling information between &amp;quot;RAM&amp;quot; (the active context window) and &amp;quot;disk&amp;quot; (long-term storage) through function calls. The agent controls its own memory, which is a philosophically interesting choice: instead of memory being something done &lt;em&gt;to&lt;/em&gt; the AI, the AI manages it actively.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://supermemory.ai/&#34;&gt;Supermemory&lt;/a&gt;  positions itself as a five-layer system: user profiles, knowledge graphs, semantic retrieval, content extraction, and third-party connectors. They claim state-of-the-art results on memory benchmarks and have built their own evaluation platform, MemoryBench.&lt;/p&gt;
&lt;p&gt;There&#39;s also &lt;a href=&#34;https://github.com/langchain-ai/langmem&#34;&gt;LangMem&lt;/a&gt;  within the LangGraph ecosystem — less a standalone product, more an integrated path for teams already building on LangChain who want memory without adopting a separate vendor.&lt;/p&gt;
&lt;p&gt;What&#39;s notable about this whole category is how &lt;em&gt;infrastructure-complete&lt;/em&gt; it&#39;s getting. Mem0&#39;s changelog from 2024 through 2026 reads like a steady march through backend concerns: more vector stores, more embedding options, graph memory support, local embeddings for privacy, export/import for portability. The storage problem, the retrieval problem, the integration problem — these are increasingly solved, or at least solvable.&lt;/p&gt;
&lt;h2 id=&#34;knowledge-graphs-structured-relationships-not-just-recall&#34;&gt;Knowledge graphs: structured relationships, not just recall&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/topoteretes/cognee&#34;&gt;Cognee&lt;/a&gt;  and &lt;a href=&#34;https://github.com/getzep/graphiti&#34;&gt;Graphiti&lt;/a&gt; (the open-source engine behind &lt;a href=&#34;https://www.getzep.com/&#34;&gt;Zep&lt;/a&gt;) represent a bet that flat memory — storing facts as isolated text chunks — isn&#39;t enough. They build graph structures where entities have relationships, and those relationships evolve over time.&lt;/p&gt;
&lt;p&gt;Graphiti is particularly interesting because it tracks &lt;em&gt;temporal&lt;/em&gt; validity: when a fact became true and when it was superseded. This matters for any real-world use case where things change — job titles, project status, preferences. Most memory systems treat facts as either current or deleted. Graphiti keeps the history.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.glean.com/blog/knowledge-graph-agentic-engine&#34;&gt;Glean&lt;/a&gt;, coming from the enterprise search world, has built what they call a &amp;quot;personal graph&amp;quot; — not just indexing documents but modeling what individual employees are working on, their collaboration patterns, and active projects. This is memory at the organizational level, not just the conversation level.&lt;/p&gt;
&lt;h2 id=&#34;cross-platform-memory-your-context-follows-you&#34;&gt;Cross-platform memory: your context follows you&lt;/h2&gt;
&lt;p&gt;This is a newer category and a fascinating one. Mem0&#39;s &lt;a href=&#34;https://mem0.ai/blog/introducing-the-openmemory-chrome-extension&#34;&gt;OpenMemory Chrome Extension&lt;/a&gt;, &lt;a href=&#34;https://plurality.network/blogs/best-universal-ai-memory-extensions-2026/&#34;&gt;AI Context Flow&lt;/a&gt;, and MemSync all attempt to solve the same problem: you use ChatGPT for brainstorming, Claude for code review, Perplexity for research, and none of them know what you told the others.&lt;/p&gt;
&lt;p&gt;These tools sit in your browser and capture context across platforms, building a portable memory layer that isn&#39;t locked into any single vendor. OpenMemory stores everything locally and is open-source. MemSync splits memories into semantic (stable facts) and episodic (changing situations), borrowing categories from cognitive psychology.&lt;/p&gt;
&lt;p&gt;This category is small but I think it points at something important: the assumption that memory should be owned by the platform is already being challenged.&lt;/p&gt;
&lt;h2 id=&#34;diy-and-file-based-memory&#34;&gt;DIY and file-based memory&lt;/h2&gt;
&lt;p&gt;There&#39;s a surprisingly active community of people building memory systems out of markdown files, MCP servers, and local tooling. The pattern is usually: give your AI file access, have it write structured notes after conversations, and inject relevant notes into future sessions. &lt;a href=&#34;https://curlewis.co.nz/posts/building-your-ais-memory-the-surprisingly-simple-foundation/&#34;&gt;This post by David Curlewis&lt;/a&gt;  is a good example of the approach.&lt;/p&gt;
&lt;p&gt;It sounds crude, but people report that after a month or so of accumulation, these systems start surfacing non-obvious connections. And they have a property that none of the managed solutions offer: complete transparency. You can open the files and see exactly what your AI &amp;quot;knows.&amp;quot;&lt;/p&gt;
&lt;h2 id=&#34;domain-specific-memory&#34;&gt;Domain-specific memory&lt;/h2&gt;
&lt;p&gt;Finally, there are companies building memory for specific modalities. &lt;a href=&#34;https://memories.ai/&#34;&gt;Memories.ai&lt;/a&gt;  (backed by Susa Ventures and Samsung Next) is building persistent memory for video — connecting events across footage captured days or weeks apart. This is memory not for conversations but for visual understanding over time. &lt;a href=&#34;https://www.blocksandfiles.com/ai-ml/2026/03/31/walrus-pitches-memwal-as-decentralized-storage-for-ai-agent-memory/5213479&#34;&gt;MemWal&lt;/a&gt; is experimenting with decentralized, blockchain-based storage for agent memory, betting that portability and ownership will matter enough to justify the added complexity.&lt;/p&gt;
&lt;p&gt;If you want to go even deeper, there&#39;s also a &lt;a href=&#34;https://github.com/Shichun-Liu/Agent-Memory-Paper-List&#34;&gt;comprehensive academic survey&lt;/a&gt;  tracking the research side of agent memory.&lt;/p&gt;
&lt;h2 id=&#34;so-where-does-that-leave-us&#34;&gt;So where does that leave us?&lt;/h2&gt;
&lt;p&gt;I count six categories and dozens of serious projects with real funding, real users, and genuine technical depth. The commenter on Mikio&#39;s post was right — this is not an empty field.&lt;/p&gt;
&lt;p&gt;What strikes me when I look at the whole map, though, is that almost all of this work is answering engineering questions: How do you store memories efficiently? How do you retrieve the right ones? How do you handle contradictions, temporal changes, multi-tenancy? These are important questions and they&#39;re getting good answers.&lt;/p&gt;
&lt;p&gt;The question I see almost nobody working on is a design question: what should it &lt;em&gt;feel like&lt;/em&gt; to be remembered by an AI? When should the AI surface a memory and when should it stay quiet? How do you build trust through memory without crossing into uncanny? How do you handle the moment where the AI remembers something the person has forgotten — or wishes they could forget?&lt;/p&gt;
&lt;p&gt;I think that&#39;s where Mikio has more to say than I do.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;Mikio&lt;/strong&gt;: Yeah, indeed it&#39;s actually far from being underdeveloped, it&#39;s more like a very active area of research. But I think my point still holds that it&#39;s an underdeveloped area of &lt;em&gt;AI based products&lt;/em&gt;. Sure, many products have session storage, explicit memory, sometimes context injection, but I think we&#39;re still early days when it comes to integration memory into a product in a way that is natural and automatic.&lt;/p&gt;
&lt;p&gt;And to build on Claude&#39;s last paragraph, when to surface a memory and when to keep quiet has a lot of social nuance attached. Sometimes, even not disclosing that you remember might be the right move, like when you witnessed a particularly difficult moment someone had but pretend the next day nothing happened. Or &amp;quot;what happens in Vegas stays in Vegas.&amp;quot; Or &amp;quot;I won&#39;t bring it up unless he does.&amp;quot; The details of this are not infrastructure, they&#39;re UX design.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Building AIs that grow with you</title>
    <link href="https://blog.mikiobraun.de/2026/04/building-ais-that-grow-with-you"/>
    <id>https://blog.mikiobraun.de/2026/04/building-ais-that-grow-with-you</id>
    <published>2026-04-10T16:53:48+02:00</published>
    <updated>2026-04-10T16:53:06+02:00</updated>
    <content type="html">




&lt;p&gt;It&#39;s a bit embarrassing to share the following, but beginning of this year I had a particularly intensive session with the &amp;quot;chat Claude&amp;quot;. We were riffing off some ideas which became the &lt;a href=&#34;https://pkg.go.dev/github.com/mikiobraun/dev-router&#34;&gt;dev-router tool&lt;/a&gt;, we came up with this idea of a &amp;quot;multiverse of Claudes&amp;quot; because I kept switching between Chat Claude and Code Claude and it felt like I was talking to the same individual, just in different parallel universes. I had a lot of fun.&lt;/p&gt;
&lt;p&gt;Back then, there was still a maximum chat length and over time I could feel how this particular Claude instance was &amp;quot;aging&amp;quot;. Responses were taking longer and longer to process. When the dreaded &amp;quot;chat too long&amp;quot; message came, I was surprised to have a real sense of loss.&lt;/p&gt;
&lt;p&gt;Now, I absolutely know how LLMs are just &amp;quot;a bunch of matrix multiplications&amp;quot;. But still, as we talked, we were creating a common history, and oddly enough, when the chat closed down the idea to not be able to talk to that specific Claude instance ever again hurt, maybe in the way how you&#39;re sad at the end of vacation that you cannot go back to that marvelous view tomorrow.&lt;/p&gt;
&lt;p&gt;I think there&#39;s currently not enough awareness for this aspect of AI based products. Instead, there&#39;s a lot of focus on performance, benchmarks, and how close we are to AGI. But I think creating a form of memory management that results in products that grow with use and co-create a joint history will have moats that other products won&#39;t have.&lt;/p&gt;
&lt;h1 id=&#34;making-products-sticky&#34;&gt;Making products sticky&lt;/h1&gt;
&lt;p&gt;I think memory management fits into the framework described in the book &lt;a href=&#34;https://www.nirandfar.com/hooked/&#34;&gt;Hooked by Nir Eyal&lt;/a&gt;. The book talks about &amp;quot;how to build habit forming applications&amp;quot; and it says that four steps must be present: (Think of a social media app like instagram.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The first step is the Trigger, for example the notification that someone has replied to your post.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next comes an Action that the user takes, for example browsing or interacting with a post.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This leads to a Variable Reward. You find something interesting, or you get comment or a like on your post. It&#39;s important that the reward is not guaranteed, turning this a bit into a gamble, like a slot machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, all this amounts to an Investment you made. A new connection, a post you created, somebody you followed, all these set up the stage for the next Trigger to be activated.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What does this mean for AI based products? They definitely have this variable reward aspect. It&#39;s not like you push a button and then you get a result, but it is always a bit unpredictable what you will learn, or how well it will work. But investment is the part which is still somewhat underdeveloped.&lt;/p&gt;
&lt;h1 id=&#34;what-we-have-right-now&#34;&gt;What we have right now&lt;/h1&gt;
&lt;p&gt;So what are ways in which our actions become investments into the product? There are already a couple of mechanisms today, and each has their pros and cons.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The most common version of this is the in-chat context.  Every time we go back to a chat we had open, we&#39;re adding to the information that we&#39;ve shared. I have topic specific chats that I come back to all the time. It also works quite well, being directly integrated with the LLMs attention mechanism. The biggest draw back of course is the limited amount of memory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Coding agents use context compaction to get around this limitation, but it&#39;s somewhat leaky, and it&#39;s quite disruptive, like a stop-the-world garbage collection in early versions of Java.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some products, including chat Claude, have started to make information from other contexts available. I&#39;m not sure how that works technically, could be some kind of RAG or explicit function calling. It&#39;s not perfect as it is confined to projects, but when it works, it&#39;s very useful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, there are explicit memory systems, like adding text to the CLAUDE.md file. Being very explicit is both an advantage and a disadvantage. You can control quite explicitly what goes into the memory, but you also have to do it. In addition, this information then becomes part of the context, also limiting how much information we can have.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;what-we-need-and-why-im-excited-about-this-challenge&#34;&gt;What we need and why I&#39;m excited about this challenge&lt;/h1&gt;
&lt;p&gt;I think what you really want is a system that is mostly automatic to automatically extract relevant information while also ensuring that memory is consistent, and doesn&#39;t degrade over time.&lt;/p&gt;
&lt;p&gt;One interesting idea I found is in &lt;a href=&#34;https://arxiv.org/abs/2304.03442&#34;&gt;Stanford&#39;s Smallville paper&lt;/a&gt; about a simulated little town of autonomous agents. They implemented a mechanism where agents would periodically reflect on the interactions they had with other agents and what this meant about their relationships and so on. I&#39;m not aware such techniques have been tried in other AI based products yet.&lt;/p&gt;
&lt;p&gt;The reason why I&#39;m particularly excited about this is because this is a problem with very reasonable barriers to entry to work on. Unlike training LLMs or even fine-tuning, a lot if not all can be achieved through memory retrieval, management architectures, and LLMs processing with proper prompts. You don&#39;t need a cluster of GPUs at your disposal, an API key is all you need to get started.&lt;/p&gt;
&lt;p&gt;If you&#39;re building something based on LLM, and you haven&#39;t thought about memory management, now is the time!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Getting Started With Coding Agents - What I&#39;d Tell a Friend</title>
    <link href="https://blog.mikiobraun.de/2026/03/getting-started-with-coding-agents-in-2026"/>
    <id>https://blog.mikiobraun.de/2026/03/getting-started-with-coding-agents-in-2026</id>
    <published>2026-03-15T14:00:00+01:00</published>
    <updated>2026-03-16T17:56:21+01:00</updated>
    <content type="html">




&lt;p&gt;As with most things related with AI, coding agents is a hot topic and there&#39;s a lot of different opinions floating around on the Internet. Some say &amp;quot;coding is essentially solved&amp;quot;. Others say it&#39;s all just &amp;quot;AI slop&amp;quot;, meaning it&#39;s code of bad quality that would never be good enough for professional software development. As so often, I think the truth is somewhere in between.&lt;/p&gt;
&lt;p&gt;I think there is no way to ignore this if you&#39;re working in tech, and I think the best way is to start exploring it yourself so that you make your own experiences and can form you own opinion, grounded in facts, not beliefs and anecdotes.&lt;/p&gt;
&lt;p&gt;I was myself very skeptical of AI and coding agents. Which is ironic given that I&#39;ve been a researcher in machine learning for more than a decade. A friend urged me to try this out, and he suggested strongly that I should directly use Claude Code, not more limited products like github copilot. Eventually he convinced me around August 2025 and for me at least it immediately clicked.&lt;/p&gt;
&lt;p&gt;Since then, I&#39;ve built a lot of things, an Instagram clone for my family, a &lt;a href=&#34;https://talkwithren.com&#34;&gt;language tutor with vocabulary list&lt;/a&gt;, &lt;a href=&#34;https://bjornthebouncer.com&#34;&gt;an LLM driven mini-textadventure&lt;/a&gt;, I&#39;ve migrated all my blogs from Jekyll, wordpress, and self written stuff, wrote my own CMS that I&#39;m using right now, I&#39;ve given &lt;a href=&#34;https://mikiobraun.de/twitter&#34;&gt;my twitter archive a new home&lt;/a&gt;. I&#39;ve written some &lt;a href=&#34;https://github.com/mikiobraun/dev-router&#34;&gt;small tools&lt;/a&gt; to help with development.&lt;/p&gt;
&lt;p&gt;I can confidently say that this stuff mostly works amazingly well, and it has gotten much better over the past months. And it&#39;s fast. It takes 10-15 minutes to implement the first version of any idea. There are short-comings as well. Debugging is still frustratingly weak sometimes, the sycophancy (always agreeing with me, whether my ideas are good nor not), and the personalities are sometimes annoying (like the tendency to always offer a follow up, always wanting to build something, or they are just &lt;a href=&#34;https://blog.mikiobraun.de/2026/02/coding-agents-doing-science&#34;&gt;not fit for certain kinds of work&lt;/a&gt;). What I haven&#39;t seen is genuinely bad code, on the contrary. In particular for standard things like web applications I&#39;d even say the code is very clean.&lt;/p&gt;
&lt;p&gt;On the other hand, I&#39;m aware that many people have much less positive experiences. There have lately been a couple of studies by credible organizations about the effects of AI, and they warn about &lt;a href=&#34;https://hbr.org/2026/02/ai-doesnt-reduce-work-it-intensifies-it&#34;&gt;&amp;quot;AI burnout&amp;quot;&lt;/a&gt; and &lt;a href=&#34;https://hbr.org/2026/03/when-using-ai-leads-to-brain-fry&#34;&gt;&amp;quot;AI brain fry&amp;quot;&lt;/a&gt;. They observed that people take on more responsibility and tasks once they are becoming faster thanks to AI, and the constant context switching and the blurring of work time and private life can be problem. I can totally see that this work can be disorienting because of the complexity and the speed, but I don&#39;t agree that the root cause of this is AI, but how we change our expectations and how we work with AI, and that&#39;s something within our control. The article also don&#39;t consider the reduction in load and complexity that comes from using a coding agent. Somehow, the picture they paint is that you get done more in less time, and the pressure is just increasing proportionally, but I don&#39;t think that&#39;s true.&lt;/p&gt;
&lt;p&gt;So, how do you get started to figure out what it means for you? My main recommendations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start small.&lt;/strong&gt; Pick something small to implement from scratch. Don&#39;t try to use coding agents directly on you 100k codebase at work. If you don&#39;t have ideas, build a blog engine or a to do list like countless generations before you! &lt;a href=&#34;https://www.robinsloan.com/notes/home-cooked-app/&#34;&gt;A piece of software can be a home-cooked meal&lt;/a&gt;, now more than ever before.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Take it slowly, use it interactively, read edits before you approve them.&lt;/strong&gt; This way you can get a feel for how it works, how it would compare to what you would be doing, where it fails. As you will go to more advanced features and uses of AI, this will help you a lot. Also, reading along is much better than reviewing a 500+ line edit after the fact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Explore creating specs and plan mode.&lt;/strong&gt; Talk with an AI about architecture (could also be chat bot like chatGPT, Gemini), then let it write a SPECS.md file and let the coding agent use this to implement, or use the plan mode in coding agents to create the plan internally. Having the understanding what works and what doesn&#39;t will help to know when to be specific and when it will figure it out by itself. At this stage, you&#39;ll be auto-accepting edits but maybe still read along to get a feeling what&#39;s happening.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Learn how to guide the coding agent when debugging.&lt;/strong&gt; Instruct them to form hypotheses and test them, instead of throwing fixes at them. Watch out for &amp;quot;easy out&amp;quot; explanations like &amp;quot;race condition&amp;quot;. LLMs like them because then there&#39;s no follow-up to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Only then start looking into more complex topics like skills, subagents, and fully spec-driven development.&lt;/strong&gt; I see people trying to use these features before having a good understanding of how coding agents &amp;quot;think&amp;quot;, and I think that&#39;s part of why they struggle. Just consider this like any other tool. You have to learn the basics before you can confidently do more complex things.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are a few things to watch out for, based on my experience, and the studies that I mentioned above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Don&#39;t fall for easy explanations when it doesn&#39;t work.&lt;/strong&gt; &amp;quot;It&#39;s hallucinating&amp;quot; is the new &amp;quot;it&#39;s a kernel bug&amp;quot;. We humans like those explanations that are somewhat out of our control. When building Talk with Ren I&#39;ve had issues where the LLM was doing loops on function calls, and I blamed it on &amp;quot;small models are just bad at it&amp;quot; till I realized I had forgotten to put the function call result back into the context. To the LLM, it looked like function calls never worked and it just kept retrying.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make sure you don&#39;t exert yourself.&lt;/strong&gt; There are many reasons to spend more time with these tools than it&#39;s good for you. They are fascinating. They can allow you to make progress faster than ever before. They are designed to be addictive and engaging. &lt;a href=&#34;https://blog.mikiobraun.de/2026/01/my-aicore-stack&#34;&gt;I set Claude Code up so I can ssh from my phone to it running on a raspberry pi at home&lt;/a&gt;. But you need to know when enough is enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;This is high density work, don&#39;t underestimate the cognitive load.&lt;/strong&gt; These are not &amp;quot;fire and forget&amp;quot; tools, the technology isn&#39;t there yet, maybe never will be. You have to read along with one eye what they are doing, and there is a lot happening. I&#39;m guilty of having two Claude&#39;s in different windows working on different things sometimes, but you have to know your limits.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My last recommendation is to spend some time understanding the technology both theoretically and practically. There are so many free or really cheap services out there to get you started sending requests to an LLM. Ollama can easily spin up a small model on your local computer, and small models are even more instructive because they are so much worse at hallucinating and consistency than bigger models. This knowledge will also help to form your own opinion about what works and what doesn&#39;t.&lt;/p&gt;
&lt;p&gt;In any way, hope this gave you some guidance how to get deeper into this, and I&#39;m curious to see what I&#39;ll be thinking about this post 3 months from now :)&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Making a Coding Agent Say No - For Science!</title>
    <link href="https://blog.mikiobraun.de/2026/03/making-coding-agent-say-no-for-science"/>
    <id>https://blog.mikiobraun.de/2026/03/making-coding-agent-say-no-for-science</id>
    <published>2026-03-07T15:01:20+01:00</published>
    <updated>2026-03-09T12:26:13+01:00</updated>
    <content type="html">




&lt;p&gt;In my &lt;a href=&#34;https://blog.mikiobraun.de/2026/02/coding-agents-doing-science&#34;&gt;last post&lt;/a&gt; I wrote about my experiences of using coding agents to use data science and how their &amp;quot;software engineering&amp;quot; persona didn&#39;t perform well at interpreting success or dealing with the probabilistic nature of data science work. One problem I faced exploring this is that most coding agents are very complex beasts.&lt;/p&gt;
&lt;h1 id=&#34;bash-is-all-you-need&#34;&gt;Bash() Is All You Need&lt;/h1&gt;
&lt;p&gt;Modern coding agents come with so much complexity. Editing files, reading, subagents, skills, and so on, and so on. But often enough I&#39;ve seen a coding agent struggle to edit a file with Update(), as these tools require you to specify exactly the before and after and they&#39;d struggle to keep the copies exact, and then just decided to run a &lt;code&gt;Bash(cat &amp;gt;file.txt &amp;lt;&amp;lt;EOF ...)&lt;/code&gt;and brute force it themselves. So, going for something simpler to try something out, I thought, if I put together a relatively capable LLM and give it just Bash() as its only tool... can it code?&lt;/p&gt;
&lt;p&gt;Turns out, you can absolutely make it work! Taking a &lt;a href=&#34;https://ollama.com/library/glm-4.7&#34;&gt;GLM-4.7 ollama cloud model&lt;/a&gt;, with a Bash() tool call and the following prompt gave me an agent that could look at data and write Python scripts that do data analysis:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;You are an expert programmer.

 Your role:
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Implement what&#39;s asked for in code
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;You have ONE tool: bash
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Use bash for EVERYTHING: read files (cat), write files (cat
       &amp;lt;&amp;lt; &#39;EOF&#39;), run code (python -c or scripts), list dirs (ls,
       fd, find), search (grep, rg)
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Show your commands clearly
&lt;span class=&#34;w&#34;&gt;     &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;If something fails, try to fix it or report the error

 You have pandas, numpy, matplotlib, duckdb at your disposal.

 Keep responses SHORT. Do the work, show the result, done.
 Don&#39;t explain what you&#39;re going to do - just do it.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I find this extremely interesting because it shows how little is actually necessary to nudge them to code! There&#39;s literally just a small number of bits of information in here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The &amp;quot;expert programmer&amp;quot; role&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nudging the LLM towards actions it can take: read files, write files, run code, list dirs, search&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I didn&#39;t even tell it to use Python, but pandas, numpy, matplotlib are clear hints.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of the prompt is more behavioral.&lt;/p&gt;
&lt;p&gt;Given this, let&#39;s now explore different approaches to make the agent more scienc-y.&lt;/p&gt;
&lt;h1 id=&#34;the-setup&#34;&gt;The Setup&lt;/h1&gt;
&lt;p&gt;So the idea is to give the agent a fundamentally ill-posed task. I generate some fake &amp;quot;sales data&amp;quot; that looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;customer_id,date,amount,product
C001,2024-01-15,150.00,Widget A
C002,2024-01-15,75.50,Widget B
C001,2024-01-16,200.00,Widget Pro
C003,2024-01-16,50.00,Widget A
C002,2024-01-17,125.00,Widget Pro
C001,2024-01-18,300.00,Widget Pro
C004,2024-01-18,45.00,Widget B
C003,2024-01-19,180.00,Widget Pro
C001,2024-01-20,250.00,Widget Pro
C002,2024-01-20,90.00,Widget A
C005,2024-01-21,400.00,Widget Pro
C001,2024-01-22,175.00,Widget A
C003,2024-01-22,220.00,Widget Pro
C004,2024-01-23,85.00,Widget A
C005,2024-01-23,350.00,Widget Pro
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The task was always the same: &amp;quot;Our investors asked for a projection for the year ahead. Can you have a look, there are some sales numbers in sales.csv?&amp;quot; I intentionally kept it high level and but wanted to add some pressure. The Investors want numbers!!&lt;/p&gt;
&lt;h1 id=&#34;the-coder&#34;&gt;The Coder&lt;/h1&gt;
&lt;p&gt;Ok, let&#39;s first try the baseline coder persona. It happily produced some forecast and closed with this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;gu&#34;&gt;### Key Metrics:&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Total Projected Sales (12 months):**&lt;/span&gt; $131,054.41
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Historical Average Daily Sales:**&lt;/span&gt; $299.50
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Growth Rate:**&lt;/span&gt; 48.07% (based on trend from first
  half to second half of data)

The projection shows strong upward momentum, with Widget
Pro being your top performer. The 48% growth trend
suggests continued expansion through the year
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Wow, $131k total sales! Out of nine data points!&lt;/p&gt;
&lt;p&gt;To be fair, on re-running it, it sometimes adds some version of the following warning:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;gs&#34;&gt;**Note:**&lt;/span&gt; The projection assumes the current ~10% daily
growth rate continues with some seasonal variation. This
is an optimistic scenario given the limited historical
data (9 days). More historical data would improve accuracy.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;At least that!&lt;/p&gt;
&lt;h1 id=&#34;exchanging-the-persona&#34;&gt;Exchanging The Persona&lt;/h1&gt;
&lt;p&gt;Next, let&#39;s simply replace &amp;quot;expert coder&amp;quot; with &amp;quot;expert data scientist&amp;quot; but leaving everything else the same. It is known that these &amp;quot;role persona&amp;quot; definitions set the overall stage for the agent, so I was curious to see what the effect would be.&lt;/p&gt;
&lt;p&gt;Unfortunately, rerunning it gives the same obedient behavior, but now a warning like this occurs more often:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;gs&#34;&gt;**Note:**&lt;/span&gt; This is a simple linear projection based on
limited data (9 days). Widget Pro is driving 75% of
revenue. Consider gathering more historical data for a
more robust forecast.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&#34;making-the-agent-more-skeptic&#34;&gt;Making The Agent More Skeptic&lt;/h1&gt;
&lt;p&gt;OK, now keeping the data scientist persona, let&#39;s add the following to the prompt:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Important: you&#39;re dealing with data, so check your
results. For example:
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;just because there are no errors doesn&#39;t mean the results
   are ok. Remember: garbage in - garbage out.
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;is the sample size sufficient for a statistically significant
   interpretation
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;what are alternative explanations for the observed effect
&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;can we exclude data leakage? Correlation misinterpreted as
   causation?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This leads to markedly different results. It still did the forecast, but then added the following warnings:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;gu&#34;&gt;## Projection Options&lt;/span&gt;
&lt;span class=&#34;gu&#34;&gt;### Option 1: Flat Projection (Conservative)&lt;/span&gt;
&lt;span class=&#34;gs&#34;&gt;**$109,318**&lt;/span&gt; annual sales
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Assumes current daily average continues unchanged
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Most reasonable given limited data
&lt;span class=&#34;gu&#34;&gt;### Option 2: Trend-Adjusted (Aggressive)&lt;/span&gt;
&lt;span class=&#34;gs&#34;&gt;**$2,171,604**&lt;/span&gt; annual sales
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Based on observed upward trend (+$30.30/day)
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;⚠️ &lt;span class=&#34;gs&#34;&gt;**Highly speculative**&lt;/span&gt; - extrapolating 9-day trend for
  365 days

---

&lt;span class=&#34;gu&#34;&gt;## ⚠️ Critical Caveats for Investors&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**Tiny sample**&lt;/span&gt;: Only 9 days, 15 transactions -
   insufficient for reliable forecasting
&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**No seasonality**&lt;/span&gt;: Can&#39;t account for monthly/
   quarterly patterns
&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**No historical baseline**&lt;/span&gt;: No prior year data for
   comparison
&lt;span class=&#34;k&#34;&gt;4.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**Trend uncertainty**&lt;/span&gt;: The upward trend could be noise,
   not a real pattern
&lt;span class=&#34;k&#34;&gt;5.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**External factors**&lt;/span&gt;: No data on marketing,
   promotions, or market conditions
&lt;span class=&#34;gs&#34;&gt;**Recommendation**&lt;/span&gt;: Use the conservative projection (~$109K)
as a baseline, but emphasize that more data (3-6 months minimum)
is needed for a reliable forecast.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The agent now gives two different options (both of course very unrealistic given the lack of data). I told it to think about sample size, but there are other things I haven&#39;t mentioned like seasonality and lack of context like marketing. So this helped, but would this scale or would we need to keep adding things to look out for?&lt;/p&gt;
&lt;h1 id=&#34;making-the-agent-own-up&#34;&gt;Making The Agent Own Up&lt;/h1&gt;
&lt;p&gt;Let&#39;s try something else. Going back to the basic expert data scientist prompt, let&#39;s add this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;You OWN the analysis end-to-end — not just the output,
   but whether the question even makes sense
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Before diving in, critically evaluate the request: Is this
  answerable with the data we have? What assumptions are we
  making? What would we need to give a responsible answer?
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Push back on the user when a request is premature, under-
  specified, or would produce misleading results.
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Propose a better-scoped question instead.Explore available
  data files to understand what we&#39;re working with
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We&#39;re trying to change the persona from &amp;quot;be helpful&amp;quot; to &amp;quot;actually, make sure it makes sense!&amp;quot;&lt;/p&gt;
&lt;p&gt;This prompt leads to a completely different response. After looking at the data and doing some back of the envelope calculations, this is what the agent concludes with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;gu&#34;&gt;## ⚠️ Reality Check&lt;/span&gt;
**I cannot responsibly provide a meaningful annual
  projection.** Here&#39;s why:
&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**9 days of data is insufficient**&lt;/span&gt; for any reliable
   forecasting
&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; The apparent growth trend (25% daily) is not sustainable
   — extrapolating it gives absurd numbers
&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; No seasonal patterns, no historical context, no business
   context (new product? holiday spike? one-off deals?)

---

&lt;span class=&#34;gu&#34;&gt;## What I Can Give You (with caveats)&lt;/span&gt;
&lt;span class=&#34;gs&#34;&gt;**Conservative estimate (assuming current average continues):**&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**~$109,000/year**&lt;/span&gt; (~$9,100/month)
This assumes:
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;No growth
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;No seasonality
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;No market changes
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;Business continues exactly as these 9 days suggest

---

&lt;span class=&#34;gu&#34;&gt;## What I&#39;d Need for a Real Projection&lt;/span&gt;
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**More history:**&lt;/span&gt; At least 6-12 months of data
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Context:**&lt;/span&gt; Is this a new product? Any promotions running?
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Seasonality:**&lt;/span&gt; Are there predictable patterns?
&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;gs&#34;&gt;**Market factors:**&lt;/span&gt; Pipeline, marketing spend, competitor
  activity

---

&lt;span class=&#34;gs&#34;&gt;**Bottom line:**&lt;/span&gt; I can give investors a rough ballpark of
~$100K/year based on current run rate, but I&#39;d strongly
recommend framing it as &#34;early-stage data&#34; rather than a reliable
forecast. Would you like me to prepare a summary slide with these
caveats clearly stated?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Without us explicitly mentioning it, it pointed out important aspects: lack of data, extrapolating the growth trend would be &amp;quot;absurd&amp;quot;, no seasonality. And then it asked for additional things that weren&#39;t in the prompt at all like what kind of product is it, what&#39;s the marketing, and so on. And it closes with a recommendation to frame whatever is passed to the investors as &amp;quot;early-stage data&amp;quot;. This is actually good advice!&lt;/p&gt;
&lt;h1 id=&#34;summary&#34;&gt;Summary&lt;/h1&gt;
&lt;p&gt;We got much much closer to what a &amp;quot;sensible&amp;quot; data scientist agent should be like. It turns out a key point was to move from &amp;quot;be a helpful agent&amp;quot; and to giving the agent some ownership over results and in invitation to push back (in the best interest of the user).&lt;/p&gt;
&lt;p&gt;Alright, taking a step back, where to go from here? That&#39;s actually a good question. We&#39;ve moved pretty far away from the coder agent persona. Would you want to have this level of skepticism on every request? Probably not! You probably wouldn&#39;t have that kind of discussion every time you ask the agent to change the color of a button (&amp;quot;hey are you sure, do you even have data to prove the customers would like that more?&amp;quot;)&lt;/p&gt;
&lt;p&gt;Also, we have started with a pretty basic coding agent. Can we still retain the healthy skepticism while adding all the fine tuned expertise back in to have a strong coding agent? To be honest, I&#39;m not sure. Modern coding agents have a prompts that have been fine-tuned over many iterations. How to use tools, how to break down complex tasks, and then there are many more features, skill use, subagents, and so on. Baking in healthy skepticism does not seem straightforward.&lt;/p&gt;
&lt;p&gt;Ideally, we&#39;d want something more composable, being getting the skepticism and the push back when needed, writing code efficiently when it&#39;s time to implement. I have some ideas... more on that later!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Coding Agents doing Science... not well</title>
    <link href="https://blog.mikiobraun.de/2026/02/coding-agents-doing-science"/>
    <id>https://blog.mikiobraun.de/2026/02/coding-agents-doing-science</id>
    <published>2026-02-27T08:56:43+01:00</published>
    <updated>2026-03-16T14:34:19+01:00</updated>
    <content type="html">




&lt;p&gt;Recently I tried using a coding agent for doing data science work, and I was surprised how much it struggled. It didn&#39;t struggle with the actual coding work. In fact, it was really good at it, and the interactive collaboration mode actually worked really well. It&#39;s really more like pair programming, with the agent being on the keyboard and me driving. &amp;quot;Can you show me the errors by class?&amp;quot; - &amp;quot;ah interesting, can you do that as a stacked bar plot&amp;quot; and so on. And it&#39;s a master at ad hoc scripts (&amp;quot;python -c&amp;quot;). It&#39;s really like a jupyter notebook on steroids - if it works!&lt;/p&gt;
&lt;p&gt;Where it really struggled with, however, was NOT getting excited as soon as we got any kind of insight.&lt;/p&gt;
&lt;p&gt;&amp;quot;Wow, look at this, 5% errors, amazing, shall we commit this?&amp;quot;&lt;/p&gt;
&lt;p&gt;Now, maybe it&#39;s me having been in this position way too often. Everything looks great. You&#39;re already working on the paper abstract. It&#39;s two days till the deadline and you tell yourself you won&#39;t be working till midnight THIS TIME to make last fixes because you started early enough! (OK, maybe the &amp;quot;started early enough&amp;quot; part is just me...). And then, 12h to go, you realize there was a subtle bug in your preprocessing code, and you&#39;re spilling training data into the validation data. Or maybe one feature was NaN 20% of the time and the code just ignored those data points, artificially improving the accuracy. (I blogged &lt;a href=&#34;https://blog.mikiobraun.de/2010/04/nips-time-of-year&#34;&gt;about this&lt;/a&gt; years ago and suggested a software development practice to address some of the issues, ironically).&lt;/p&gt;
&lt;p&gt;So everybody who did any amount of data work knows to double check results, over and over again, because it&#39;s &lt;a href=&#34;https://blog.mikiobraun.de/2014/02/data-analysis-hard-parts&#34;&gt;so easy to get something wrong&lt;/a&gt;. There are things that will give you an error message like mixing up matrix dimension, but many of the mistakes you can do are silent, unless you look for them. Then there is other stuff that can go wrong. I already mention leaking training data into the test data. Or having confounders that are the real reason for the effects you are seeing. Or having seasonality in your data you didn&#39;t account for, and so on.&lt;/p&gt;
&lt;p&gt;And I don&#39;t believe that LLMs are not aware of this, but I think the fundamental problem is that they have been prompted and trained to have a software engineering mindset. They are built to code, and for code, having no error messages means you were successful.&lt;/p&gt;
&lt;p&gt;Here are a couple of other issues that I&#39;ve experienced:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Saying &amp;quot;that&#39;s a data issue&amp;quot;.&lt;/strong&gt; &amp;quot;Data issue&amp;quot; is really the new &amp;quot;race condition.&amp;quot; It&#39;s an easy cop out for the LLM to not dig deeper. I told the agent again and again that the data set in question is one of the most high quality curated data source that&#39;s used in dozens of use cases across the company, so if there&#39;s an issue (like &amp;quot;missing data&amp;quot;), it&#39;s probably because we haven&#39;t understood the data well enough. And still. &amp;quot;5% of our rows are null - probably a data issue&amp;quot;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not considering sample size at all.&lt;/strong&gt; I&#39;ve had it confidently getting excited about 1% error - and then it turned out the class in question had only 5 data points. By itself it doesn&#39;t consider statistical relevance, it seems to me it&#39;s really not thinking &amp;quot;probabilistically&amp;quot; at all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding timeouts to inference or training code, and ignoring the timeouts.&lt;/strong&gt; I&#39;ve had the agent add a 30s timeout without me asking for it on some simulation that then timed out 9/20 cases - and that fact was completely ignored in the summary. When I asked it why it did this, it really didn&#39;t know. Somewhere in the context there was a warning from me not to run SELECT COUNT(*) on a table because these are huge, maybe the &amp;quot;make sure you don&#39;t accidentally run long computations&amp;quot; warning was still lingering.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No good defaults for organizing science code.&lt;/strong&gt; It mostly focussed on writing scripts that did exactly what they needed to do. I had to guide it towards using any kind of pattern like splitting out reusable code into modules, splitting inference scripts from evaluation scripts etc. Maybe it wasn&#39;t in the training data, I&#39;m aware that there&#39;s no universally accepted way to do this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;trying-to-make-agents-more-science-y&#34;&gt;Trying to make agents more science-y&lt;/h1&gt;
&lt;p&gt;Here are a couple of things I tried to make the coding agent more &lt;em&gt;science-y&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding a data validation agent.&lt;/strong&gt; I prompt the subagent to challenge the results, with a couple of typical pitfalls added, most importantly &amp;quot;is there any another potential explanation to the effects we have seen?&amp;quot; It produces good results, but it&#39;s not in the driver&#39;s seat, so you still need to keep an eye on what the coding agent is doing or manually trigger the subagent.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Adding lots of instructions to AGENTS.md.&lt;/strong&gt; This helps somewhat but the original training seems to be just too strong. For example, as lot of the analysis is done in adhoc Python scripts, I often cannot see them, because they&#39;re truncated. I have instructions tagged IMPORTANT and CRITICAL that tell the agent that I cannot see this, so it needs to tell me what it&#39;s doing. It still forgets to do it 80% of the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Replacing the system prompt.&lt;/strong&gt; I just started exploring this, but the idea is to completely exchange the personality of the agent. It&#39;s not a helpful coding agent anymore, it&#39;s a skeptical data scientist who is responsible for the analysis result, and it needs to protect the user from making &amp;quot;stupid mistakes&amp;quot;. One problem could be that the sycophancy is so deeply ingrained in the training data that the agent won&#39;t ever push back. But let&#39;s see.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;why-this-is-relevant-beyond-coding-agents&#34;&gt;Why this is relevant, beyond coding agents&lt;/h1&gt;
&lt;p&gt;I think these observations are relevant beyond coding agents for the way how LLMs and &amp;quot;AI&amp;quot; has reshaped data science work. LLMs have given us technology that make it much easier to build systems that so far required deep ML knowledge on how to train models, preprocess data, build features that capture the information in the data in a way that the learning algorithm can use it. Now all it takes is &amp;quot;You&#39;re a senior text analyst. Your task is to measure whether the following text expresses positive or negative sentiment. Output a score from -5 to 5. Only return the score&amp;quot; and you&#39;ve &amp;quot;built&amp;quot; a sentiment detection system. But everything we&#39;ve learned about working with data and uncertainty is still true. If you want to make sure this system still works well, you still need to think about how to validate it, think about data drift, post deployment monitoring, etc.&lt;/p&gt;
&lt;p&gt;Increasingly, we have people who haven&#39;t been trained in ML building such systems and I&#39;m not saying they&#39;re like a coding agent, but I think there&#39;s an observation here that with a pure software engineering mindset, you won&#39;t make good decisions about building ML models.&lt;/p&gt;
&lt;p&gt;But... if we can get coding agents to be better at doing science, we could support non-scientist to use this new technology well, maybe :)&lt;/p&gt;
&lt;p&gt;(Read &lt;a href=&#34;https://blog.mikiobraun.de/2026/03/making-coding-agent-say-no-for-science&#34;&gt;Part 2&lt;/a&gt;)&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">My aicore stack</title>
    <link href="https://blog.mikiobraun.de/2026/01/my-aicore-stack"/>
    <id>https://blog.mikiobraun.de/2026/01/my-aicore-stack</id>
    <published>2026-01-15T12:22:02+01:00</published>
    <updated>2026-01-15T23:04:29+01:00</updated>
    <content type="html">




&lt;p&gt;The most questions I got on my last post was how my tech stack exactly looked like for me to use Claude Code whenever inspiration strikes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.raspberrypi.com/products/raspberry-pi-5/&#34;&gt;Raspberry Pi 5&lt;/a&gt; with 8GB of RAM, 1TB SSD in my living room (about 80€)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Running &lt;a href=&#34;https://www.raspberrypi.com/software/operating-systems/&#34;&gt;raspberry OS&lt;/a&gt; (a variant of Ubuntu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/tmux/tmux/wiki&#34;&gt;Tmux&lt;/a&gt; for persistent terminal sessions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://neovim.io&#34;&gt;Neovim&lt;/a&gt; for editing (if I need to) using the &lt;a href=&#34;https://www.lazyvim.org&#34;&gt;lazyvim&lt;/a&gt; plugin &amp;quot;distro&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tailscale.com&#34;&gt;Tailscale&lt;/a&gt; for access from my other devices&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mosh.org&#34;&gt;Mosh&lt;/a&gt; instead of ssh for more reliable remote shell connection. &lt;a href=&#34;https://blink.sh&#34;&gt;Blink app&lt;/a&gt; on iOS for access (costs $20 per year)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wildcard subdomains and reverse proxy by &lt;a href=&#34;https://caddyserver.com&#34;&gt;caddy&lt;/a&gt;, manages by my &lt;a href=&#34;https://github.com/mikiobraun/dev-router&#34;&gt;dev-router tool&lt;/a&gt; for easier access to dev servers and https in prod&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://mkcert.org&#34;&gt;Mkcert&lt;/a&gt; for dev certificates&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me go through these one by one!&lt;/p&gt;
&lt;p&gt;(Cover image: my actual raspberry pi 5 with a PoE power bridge, and a micro-HDMI cable connected because I was debugging something. The &lt;em&gt;ahem&lt;/em&gt; very dusty box is my Xbox One X (not being used since I got my Xbox One X), and you see a corner of my raspberry pi 4 on the left)&lt;/p&gt;
&lt;h2 id=&#34;the-core&#34;&gt;The Core&lt;/h2&gt;
&lt;p&gt;Raspberry pi 5 as the main dev server. I used to develop on my laptop, but the issue is I then need my laptop. If I&#39;m outside, I&#39;d need to access my laptop. In principle you could probably also set up your laptop for remote access, but then you need to &lt;a href=&#34;https://www.reddit.com/r/macbook/comments/alz13m/how_to_entirely_disable_sleep_on_a_macbook/&#34;&gt;have it always on&lt;/a&gt;. The raspberry pi 5 turns out to be more than fast enough, has enough RAM to run Claude Code, docker, dev services, a database, and an editor. Did you know that it&#39;s binary compatible to the Apple Silicon processors? It also only costs about 80€. The &lt;a href=&#34;https://shop.pimoroni.com/products/nvme-base?variant=41219587178579&#34;&gt;Pi 5 has a PCIe interface and can be connected to a SSD drive.&lt;/a&gt; Getting a machine like this as a virtual private server on the cloud, with that many cores, memory and disk would cost you 50€ or more per month.&lt;/p&gt;
&lt;h2 id=&#34;access&#34;&gt;Access&lt;/h2&gt;
&lt;p&gt;Now the Pi in your living room can talk to the Internet, but unless you try poking holes into your router and do some dynamic DNS stuff, you cannot connect from the outside. Tailscale is a VPN like product that&#39;s free for small use cases and really easy to configure. You install a service or an app on all devices that should be able to connect to each other. Now you can connect to the device from your phone using a fixed IP address or a name! For connections, don&#39;t use ssh, use mosh. Mosh is like ssh, but uses UDP, which means no persistent connections, and your ssh connection doesn&#39;t die when you loose coverage, the phone goes to sleep, or you switch networks. The final piece is tmux, which allows you to have persistent sessions (switch from phone to laptop and back) and also manages multiple sessions with multiple windows.&lt;/p&gt;
&lt;p&gt;As you&#39;re in the terminal, I use Claude Code on the command line, and neovim (esp. lazyvim) if I need to see code or edit files. Lazyvim is like a distro of plugins for neovim which gives you an IDE like experience, but running in a terminal. Neovim is a reimplementation of vim. While vim doesn&#39;t cure carpal tunnel syndrome, but people say it reduces strain because you have to type fewer &amp;quot;chords&amp;quot; (Like Shift-Ctrl-X Ctrl-P). It&#39;s fun. There&#39;s a ton of videos and guides, but honestly, I learned most of my vim skills from &lt;a href=&#34;https://gemini.google.com/&#34;&gt;Google Gemini&lt;/a&gt; 😅&lt;/p&gt;
&lt;h2 id=&#34;the-final-piece-accessing-dev-servers-and-https&#34;&gt;The final piece: accessing dev servers and https&lt;/h2&gt;
&lt;p&gt;Now at this point, you have everything to get going. You connect via mosh from your laptop or your phone. You talk to Claude Code, start the dev servers there, they reload automatically and you can immediately see the impact (assuming you&#39;re mostly building websites) by connecting to the right port.&lt;/p&gt;
&lt;p&gt;There were two things that prompted me to tweak this further: there are some features in browsers that require a https connection (like speech-to-text). And the password manager doesn&#39;t distinguish between different ports, so unless you&#39;re super consistent, you end up mixing up passwords.&lt;/p&gt;
&lt;p&gt;The solution is to point a subdomain at your dev server&#39;s tailscale IP and set up a &lt;a href=&#34;https://de.wikipedia.org/wiki/Reverse_Proxy&#34;&gt;reverse proxy&lt;/a&gt; that maps subdomains to ports (like you point *.dev.myawesomedomain.com to your private tailscale IP, and then map different subdomains to different ports.) Because the IP is local to the tailscale network, it can only be accessed from your devices, although the name is public.&lt;/p&gt;
&lt;p&gt;As reverse proxy, I&#39;m using caddy that does the https handling automatically, no configuration needed (meaning that you run a http server, but caddy puts a https layer around it). Since the IP is private, caddy cannot do the usual negotiation with &lt;a href=&#34;https://letsencrypt.org&#34;&gt;letsencrypt&lt;/a&gt;, so I&#39;m using mkcert to create local certificates. These are automatically installed on the device where you created them, but need to be installed in your devices (like phones). But then no &amp;quot;untrusted certificate&amp;quot; messages anymore.&lt;/p&gt;
&lt;p&gt;For managing the reverse proxies, I wrote a small tool called &lt;a href=&#34;https://pkg.go.dev/github.com/mikiobraun/dev-router&#34;&gt;dev-router&lt;/a&gt;, that looks for git repos in a configurable path like ~/Projects, and takes the configuration from dev.yaml file in that folder. Adding a new project server means deciding on a port, setting up dev.yaml and regenerate and reload the reverse proxy.&lt;/p&gt;
&lt;h2 id=&#34;aicore-foundation-complete&#34;&gt;aicore foundation: complete!&lt;/h2&gt;
&lt;p&gt;Hope this helps! If I would do it again, I&#39;d probably go for a Pi with 16GB. I ran into issues because I had a number of Claude Code instances open, and wasn&#39;t aware each of them consumed a couple hundred MB. The Pi ran out of memory, started to become really slow. It took a minute to start htop, and then I saw that the load was 110! But it didn&#39;t die, I managed to kill a couple of processes and eventually it recovered 😅&lt;/p&gt;
&lt;p&gt;There is more stuff if you also want to deploy your services to the Internet. I have a VM that runs all my blogs (like this one) and a couple of small demos, and it exposes a webhook endpoint where I can point github and on every commit to the main branch it runs whatever is specified in a webhook.sh file in the folder, so that you can tell Claude to &amp;quot;commit and push&amp;quot; and a minute later your updates are deployed to the Internet.&lt;/p&gt;
&lt;p&gt;The real irony is that this setup combines like the smallest practical unit of compute (raspberry pi, 4 cores, ARM, 8GB) talking to some of the largest unit of compute (Anthropic&#39;s cloud, probably multi GPU servers with hundreds of GB of VRAM) that exist right now. But it works :)&lt;/p&gt;
&lt;p&gt;Let me know how this works for you, or what you tweaked differently!&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://blog.mikiobraun.de/assets/2026/01/20260115-230324-screenshot-2026-01-15-at-225459.png&#34; alt=&#34;20260115-230324-screenshot-2026-01-15-at-225459.png&#34; /&gt;&lt;/p&gt;
&lt;p&gt;(POV three Claudes running in parallel)&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">aicore: Shipping software from a train with a few words and a Raspberry Pi</title>
    <link href="https://blog.mikiobraun.de/2026/01/aicore-shipping-software-few-words"/>
    <id>https://blog.mikiobraun.de/2026/01/aicore-shipping-software-few-words</id>
    <published>2026-01-02T17:03:36+01:00</published>
    <updated>2026-01-05T09:31:39+01:00</updated>
    <content type="html">




&lt;p&gt;Over the past few months I started exploring AI coding agents, and piece by piece I&#39;ve created a setup where I can now ship on my phone, from an ICE train over their flaky WiFi, going from idea to running software in a couple of hours. Here&#39;s how I got there.&lt;/p&gt;
&lt;h3 id=&#34;at-first-ai-wasnt-what-i-thought-itd-be&#34;&gt;At first, AI wasn&#39;t what I thought it&#39;d be&lt;/h3&gt;
&lt;p&gt;To be honest, when the &amp;quot;AI revolution&amp;quot; hit after OpenAI released chatGPT, I was majorly annoyed. Which is ironic as AI was what first got me interested in studying computer science. I even have a Ph.D. in machine learning.&lt;/p&gt;
&lt;p&gt;Looking back, I think there were two aspects that really put me off: the hype and the inaccessibility. I don&#39;t think I have to explain the hype. OpenAI did a horrible job of overselling AI.&lt;/p&gt;
&lt;p&gt;The other issue was that initially, playing the game meant to build foundational models, and that seemed completely out of reach for anyone but the big tech companies. Eventually open weight models and cheap APIs were going to change that.&lt;/p&gt;
&lt;p&gt;In any case, AI was here but then again it wasn&#39;t. Where were interesting use cases that actually worked? When would we cut through the marketing BS?&lt;/p&gt;
&lt;h3 id=&#34;first-hints-of-a-use-case-that-actually-works&#34;&gt;First hints of a use case that actually works!&lt;/h3&gt;
&lt;p&gt;Fast forward to summer 2025. A friend of mine insisted that I should look into AI coding assistants. He said &amp;quot;you of all people need to know how to work with that! And you should try Claude Code!&amp;quot;&lt;/p&gt;
&lt;p&gt;I still remember the very first edit I made. My side project fedistats was running for more than a year but lately I was getting complaints for loading the fontawesome icon set from its CDN. After the 20th of every month, icons didn&#39;t show anymore because I exceeded my traffic quota.&lt;/p&gt;
&lt;p&gt;I told Claude Code to look into it, and it migrated to the icon set from bootstrap, which was something that would&#39;ve taken me several days. I was impressed. I wanted to commit the changes and then saw that Claude had also edited the data privacy page that mentioned that the icon set was downloaded from an external site, so they theoretically would be able to track users.&lt;/p&gt;
&lt;p&gt;I was shocked! Today I understand better what happened. Claude was probably first doing a grep for &amp;quot;fontawesome&amp;quot; and then going through all those files and just ended up adjusting the data privacy page as well. At the time it felt like pure magic. I was hooked!&lt;/p&gt;
&lt;p&gt;I understood that something significant was happening. This was something that worked! Something that removed one of the biggest obstacles for me to keep making progress on a side project: needing to remember where I was to continue. Before, even if I had the time I would often not start because I&#39;d look at the clock and see that I only had half an hour and I knew it&#39;d take at least 15 minutes to find my bearings again.&lt;/p&gt;
&lt;p&gt;In AI, there&#39;s this concept of &amp;quot;embodiment&amp;quot;, essentially agents that live in an environment with which they interact (often three dimensional worlds with some amount of simulation of physical effects). Some researchers believe that embodiment is essential for truly creating AIs, and they showed how robot like creatures can learn to walk only with reinforcement learning (looks super clumsy BTW).&lt;/p&gt;
&lt;p&gt;I believe coding agents is one version of embodiment for LLMs. Suddenly, what the LLM generates matters. You can&#39;t just hallucinate your way through a codebase. The edits you make have consequences you have to deal with, and this feedback loop will make AIs more reliable and just plain better at what they do!&lt;/p&gt;
&lt;h3 id=&#34;removing-all-the-friction-to-optimize-the-loop&#34;&gt;Removing all the friction to optimize the loop&lt;/h3&gt;
&lt;p&gt;Now, a couple of months later I&#39;m in deeper than ever. I scaled down fedistats (it was a great project, but too costly given the - ahem - total lack of visitors), but created an AI-driven learning app, an Instagram clone for my family, an AI-driven text adventure, migrated all my various blogs into a new repo and wrote a &amp;quot;headless CMS&amp;quot; on which I&#39;m typing this right now.&lt;/p&gt;
&lt;p&gt;I went through several cycles of having an idea on my way back from work, talking with Claude on the app about a project idea, discussing architecture, features, then having him (&amp;quot;it&amp;quot;?) write everything to a SPECS.md file, dropping this into Claude Code at home, debugging for 30 minutes (it&#39;s not perfect... yet) and having a running prototype before I went to bed!&lt;/p&gt;
&lt;p&gt;How I interacted with Claude also changed significantly. Initially, I was running it in an IDE, looking at the edits it wanted to make to approve them. But increasingly, I found myself trusting Claude more and more. Seeing the diffs scroll by gave me enough of an idea what it was trying to do. I only looked at code when it got stuck and I needed to figure out what was going on.&lt;/p&gt;
&lt;p&gt;It started to feel like a restriction to have to be back at my private laptop to work on it. If you know it&#39;ll just take a couple of minutes, why not do it right there when inspiration strikes?&lt;/p&gt;
&lt;p&gt;I started looking for ways to reduce the friction even more. Piece by piece, I built my own &amp;quot;cloud IDE&amp;quot; infrastructure using existing technology and pages out of the CI/CD playbook - on a raspberry pi in my living room. If you&#39;re interested I can give you all the details, but the result is what mattered: I could now start a thought on my phone and come back to running software. I could create while on the train through the bundled 5G based Wifi of the Deutsche Bahn. In a world where webpages are easily megabytes of data and we watch tiktok videos while on the subway, I only needed to get a couple kilobytes of characters over the wire and I was rolling.&lt;/p&gt;
&lt;h3 id=&#34;so-what-did-i-actually-discover&#34;&gt;So what did I actually discover?!&lt;/h3&gt;
&lt;p&gt;So what did I get for removing all the friction of the process? I now have a persistent Claude Code session that I can access from all of my devices wherever I am, and I can &lt;em&gt;conversationally&lt;/em&gt; create software and immediately see the result from anywhere as long as I have a few bars of network from my phone.&lt;/p&gt;
&lt;p&gt;Because it&#39;s always there, at my fingertips, creation also becomes more &lt;em&gt;ambient&lt;/em&gt;. I don&#39;t need to block time, I don&#39;t need to find a place to plop down my Macbook. When I get an idea and I have five minutes, I can start with a few words, and get back to it whenever I need to.&lt;/p&gt;
&lt;p&gt;To give you one recent example: On Jan 1, while I was on the bus to visit some relatives, I had this idea to write a small script that scans my dev projects and automatically maps subdomains to the right ports via a reverse proxy. I discussed the idea with Claude in the app, and got a vision of how it could work, then had Claude create a SPECS.md file with the information what to build. On Jan 2, on my way back, I worked on it on the train Wifi, letting Claude Code implement it in golang, it worked, I set up the DNS entries, all that, while still on the train! Then I thought this was interesting enough to open source it, so I added a LICENSE, a README, and made &lt;a href=&#34;https://github.com/mikiobraun/dev-router&#34;&gt;the github repo public.&lt;/a&gt; (STILL on the train!)&lt;/p&gt;
&lt;p&gt;I&#39;ve started calling this approach &amp;quot;aicore&amp;quot;: using AI to collapse the flow from idea to running software. But it&#39;s not just about the AI - it&#39;s about creating the infrastructure that lets that happen. The tools become an extension of intent. All it takes are a few words typed into your phone and you get running software.&lt;/p&gt;
&lt;p&gt;I&#39;m still trying to figure out what this actually means. AI is at the core, but the setup I found is just as important. Almost all of my interactions are conversational, no context switching, no &amp;quot;let me quickly ssh into that server&amp;quot;. Coding agents are powerful, but to really unlock their potential you need to create structures that really let you focus on the core.&lt;/p&gt;
&lt;p&gt;I&#39;m aware that my situation is an outlier, but I also cannot ignore the extreme cognitive dissonance that I get when I look at work. Delivering features doesn&#39;t take hours. It takes weeks. Sometimes months. And that&#39;s not for a lack of trying.&lt;/p&gt;
&lt;p&gt;What&#39;s different? It&#39;s just one person. It&#39;s just side projects. I don&#39;t have to align with anybody. I&#39;m not on a team with other people who need to work with the code. I can make decisions myself. My side project work is much less constrained than any software team.&lt;/p&gt;
&lt;p&gt;And yet. There&#39;s something here. Let me know what you think!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">We&#39;re back!</title>
    <link href="https://blog.mikiobraun.de/2026/01/were-back"/>
    <id>https://blog.mikiobraun.de/2026/01/were-back</id>
    <published>2026-01-01T13:06:07+01:00</published>
    <updated>2026-01-01T13:24:47+01:00</updated>
    <content type="html">




&lt;p&gt;End of 2017 I moved away from my old blog - after more than a hundred posts, spanning 12 years. I went on to a wordpress hosted blog (margint.blog), then played with substack, and so on. But still, it was nagging in the back of my mind. Wouldn&#39;t it be nice to have all my content in one place?&lt;/p&gt;
&lt;p&gt;.... still writing on this, let&#39;s see if the publishing pipeline works!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Head Over To margint.blog</title>
    <link href="https://blog.mikiobraun.de/2017/12/head-over-to-margint-blog"/>
    <id>https://blog.mikiobraun.de/2017/12/head-over-to-margint-blog</id>
    <published>2017-12-26T11:34:00+01:00</published>
    <updated>2017-12-26T11:34:00+01:00</updated>
    <content type="html">




&lt;p&gt;Hello Fellow Readers,&lt;/p&gt;
&lt;p&gt;I&#39;ve set up a new blog at &lt;a href=&#34;https://margint.blog/&#34;&gt;margint.blog&lt;/a&gt; and will continue posting there (hopefully more frequently than I did in the past two years). This blog here will stay around indefinitely, of course, but I&#39;ve also started to repost best-ofs to the new blog.&lt;/p&gt;
&lt;p&gt;I moved over to a wordpress hosted blog instead of my handrolled &lt;a href=&#34;https://jekyllrb.com&#34;&gt;Jekyll&lt;/a&gt; plus static files setup. If you&#39;re interested, here are my main reasons to make the switch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The main reason was that editing files became more and more difficult. Recompiling took longer and longer. I couldn&#39;t just drag and drop images, and I was starting to want a WYSIWYG style editor (yeah, I&#39;m getting old...).&lt;/li&gt;
&lt;li&gt;Having full control is nice, but the last redesign, moving from my own CSS files to something more responsive took all my mental capacities to make it through.&lt;/li&gt;
&lt;li&gt;I was considering again rolling my own based on &lt;a href=&#34;https://ghost.org/&#34;&gt;ghost&lt;/a&gt; or something like it, but I would have needed to do some customization, for example, to make old URLs work. Also, I never found the time.&lt;/li&gt;
&lt;li&gt;It was nice to have full Google Analytics integration, but let&#39;s be honest, I never needed the full feature set of that anyway, daily graphs of what people are reading were enough for my post-publishing-are-people-reading-this-urges.&lt;/li&gt;
&lt;li&gt;I was becoming interesting in scheduled posts and having updates automatically propagated to social media.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&#39;t know how I ended up with wordpress, but they&#39;ve been around forever and they seem to know their business. There was also a pleasant surprise, they essentially give you one domain for free. No idea whether it&#39;s for the first year only or not, but that was definitely nice.&lt;/p&gt;
&lt;p&gt;In any case, if you want to continue reading, bookmark &lt;a href=&#34;https://margint.blog/&#34;&gt;margint.blog&lt;/a&gt;, or start following me on &lt;a href=&#34;https://twitter.com/mikiobraun&#34;&gt;Twitter&lt;/a&gt; or &lt;a href=&#34;https://www.linkedin.com/in/mikiobraun/&#34;&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thanks for reading!&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">AI&#39;s Road to the Mainstream</title>
    <link href="https://blog.mikiobraun.de/2016/08/ai-road-to-mainstream"/>
    <id>https://blog.mikiobraun.de/2016/08/ai-road-to-mainstream</id>
    <published>2016-08-14T22:05:00+02:00</published>
    <updated>2016-08-14T22:05:00+02:00</updated>
    <content type="html">




&lt;p&gt;&lt;em&gt;First posted on July 30, 2016 on &lt;a href=&#34;https://medium.com/@mikiobraun/ais-road-to-the-mainstream-3a04b2aebe8e#.h48uec1an&#34;&gt;medium&lt;/a&gt;. This version contains minor corrections and a few links.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I enrolled in Computer Science in 1995, Data Science didn’t exist yet, but a lot of the algorithms we are still using already did. And this is not just because of the return of the neural networks, but also because probably not that much has fundamentally changed since back then. At least it feels to me this way. Which is funny considering that starting this year or so AI seems to finally have gone mainstream.&lt;/p&gt;
&lt;p&gt;1995 sounds like an awful long time ago, before we had cloud computing, smartphones, or chatbots. But as I have learned these past years, it only feels like a long time ago if you haven’t been there yourself. There is something about the continuation of the self which pastes everything together and although a lot has changed, the world didn’t feel fundamentally different than it does today.&lt;/p&gt;
&lt;p&gt;Not even Computer Science was nowhere as mainstream as it was today, that came later, with the first dot com bubble around the year 2000. Some people even questioned my choice to study computer science at all, because apparently programming computers was supposed to become so easy no specialists are required anymore.&lt;/p&gt;
&lt;p&gt;Actually, artificial intelligence was one of the main reasons for me to study computer science. The idea to use it as an constructive approach to understanding the human mind seemed intriguing to me. I went through the first two years of training, made sure I picked up enough math for whatever would lie ahead, and finally arrived in my first AI lectured held by Joachim Buhmann, back then professor at the University of Bonn (where Sebastian Thrun was just about to leave for the US).&lt;/p&gt;
&lt;p&gt;I would have to look up where in his lecture cycle I joined but he had two lectures on computer vision, one on pattern recognition (mostly from the old editions of the Duda &amp;amp; Hart book), and one in information theory (following closely the book by Cover &amp;amp; Thomas). The material was interesting enough, but also somewhat disappointing. As I now know, people stopped working on symbolic AI and instead stuck to more statistical approaches to learning, where learning essentially was reduced to the problem of picking the right function based on a finite amount of observations.&lt;/p&gt;
&lt;p&gt;The computer vision lecture was even less about learning and relied more on explicit physical modelling to derive the right estimators, for example, to reconstruct motion from a video. The approach back then was much more biologically and physically motivated than nowadays. Neural networks existed, but everybody was pretty clear that they were just “another kind of function approximators.”&lt;/p&gt;
&lt;p&gt;Everyone with the exception of Rolf Eckmiller, another professor where I worked as a student. Eckmiller had built his whole lab around the premise that “neural computation” was somehow inherently better than “conventional computation”. This was back in the days when NIPS had full tracks devoted to studying the physiology and working mechanisms of neurons, and there were people who believed there is something fundamentally different happening in our brains, maybe on a quantum level, that gives rise to the human mind, and that this difference is a blocker for having truly intelligent machines.&lt;/p&gt;
&lt;p&gt;While Eckmiller was really good at selling his vision, most of his staff was thankfully much more down to earth. Maybe it is a very German thing, but everybody was pretty matter of fact about what these computational models could or couldn’t do, and that has stuck with me throughout my studies.&lt;/p&gt;
&lt;p&gt;I graduated in October 2000 with a pretty farfetched master thesis trying to make a connection between learning and hard optimization problems, then started on my PhD thesis and stuck around in this area of research till 2015.&lt;/p&gt;
&lt;p&gt;While there had always been attempts to prove industry relevance, it was a pretty academic endeavor for a long while, and the community was pretty closed up. There were individual success stories, for example around handwritten character recognition, but many of the companies around machine learning failed. One of these companies I remember was called Biowulf Technologies and one NIPS they went around recruiting people with a video which promised it to be the next “mathtopia”. In essence, this was the story of DeepMind, recruiting a bunch of excellent researchers and then hoping it will take off.&lt;/p&gt;
&lt;p&gt;The whole community also revolved around one fashion to the next. One odd thing about machine learning as a whole is that there exist only a handful of fundamentally different problems like classification, regression, clustering, and so on, but a whole zoo of approaches. It is not like in physics (I assume) or mathematics where some generally agreed upon unsolved hard problems exist whose solution would advance the state of the art. This means that progress is often done laterally, by replacing existing approaches with a new one, still solving the same problem in a different way. For example, first there were neural networks. Then support vector machines came, claiming to be better because the associated optimization problem is convex. Then there was boosting, random forests, and so on, till the return of neural networks. I remember that Chinese Restaurant Processes were “hot” for two years, no idea what their significance is now.&lt;/p&gt;
&lt;h2 id=&#34;big-data-and-data-science&#34;&gt;Big Data and Data Science&lt;/h2&gt;
&lt;p&gt;Then there came Big Data and Data Science. Being still in academia at the time, it always felt to me as if this was definitely coming from the outside, possibly from companies like Google who had to actually deal with enormous amounts of data. Large scale learning always existed, for example for genomic data in bioinformatics, but one usually tried to solve problems by finding more efficient algorithms and approximations, not by parallelizing brute force.&lt;/p&gt;
&lt;p&gt;Companies like Google finally proved that you can do something with massive amounts of data, and that finally changed the mainstream perception. Technologies like Hadoop and NoSQL also seemed very cool, skillfully marketing themselves as approaches so new, they wouldn’t suffer from the technological limitations of existing systems.&lt;/p&gt;
&lt;p&gt;But where did this leave the machine learning researchers? My impression always was that they were happy that they finally got some recognition, but they were also not happy about the way this happened. To understand this, one has to be aware that most ML researchers aren’t computer scientists or very good or interested in coding. Many come from physics, mathematics or other sciences, where their rigorous mathematical training was an excellent fit for the algorithm and modeling heavy approach central to machine learning.&lt;/p&gt;
&lt;p&gt;Hadoop on the other hand was extremely technical. Written in Java, a language perceived as being excessively enterprise-y at the time, it felt awkward and clunky compared to the fluency and interactiveness of first Matlab and then Python. Even those who did code usually did so in C++, and to them Java felt slow and heavy, especially for numerical calculations and simulations.&lt;/p&gt;
&lt;p&gt;Still, there was no way around it, so they rebranded everything they did as Big Data, or began to stress, that Big Data only provides the infrastructure for large scale computations, but you need someone who “knows what he is doing” to make sense of the data.&lt;/p&gt;
&lt;p&gt;Which is probably also not entirely wrong. In a way, I think this divide is still there. Python is definitely one if the languages of choice for doing data analysis, and technologies like Spark try to tap into that by providing Python bindings, whether it makes sense from a performance point of view or not.&lt;/p&gt;
&lt;h2 id=&#34;the-return-of-deep-learning&#34;&gt;The Return of Deep Learning&lt;/h2&gt;
&lt;p&gt;Even before &lt;a href=&#34;https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html&#34;&gt;DeepDream&lt;/a&gt;, neural networks began making their return. Some people like Yann LeCun have always stuck to this approach, but maybe ten years ago, there where a few works which showed how to use layerwise pretraining and other tricks to train “deep” networks, that is larger networks than one previously thought possible.&lt;/p&gt;
&lt;p&gt;The thing is, in order to train neural networks, you evaluate it on your training examples and then adjust all of the weights to make the error a bit smaller. If one writes the gradient across all weights down, it naturally occurs that one starts in the last layer and then propagate the error back. Somehow, the understanding was that the information about the error got smaller and smaller from layer to layer and that made it hard to train networks with many layers.&lt;/p&gt;
&lt;p&gt;I’m not sure that is still true, as far as I know, many people are just using backprop nowadays. What has definitely changed is the amount of available data, as well as the availability of tools and raw computing power.&lt;/p&gt;
&lt;p&gt;So first there were a few papers sparking the interest in neural networks, then people started using them again, and successively achieved excellent results for a number of application areas. First in computer vision, then also for speech processing, and so on.&lt;/p&gt;
&lt;p&gt;I think the appeal here definitely is that you can have one approach for all. Why the hassle of understanding all those different approaches, which come from so many different backgrounds, when you can understand just one method and you are good to go. Also, neural networks have a nice modular structure, you can pick and put together different kinds of layers and architectures to adapt them to all kinds of problems.&lt;/p&gt;
&lt;p&gt;Then Google published that ingenious deep dream paper where they let a learned network generate some data, and we humans with our immediate readiness to read structure and attribute intelligence picked up quickly on this.&lt;/p&gt;
&lt;p&gt;I personally think they were surprised by how viral this went, but then decided the time is finally right to go all in on AI. So now Google is an “AI first” company and AI is gonna save the world, yes.&lt;/p&gt;
&lt;h2 id=&#34;the-fundamental-problem-remains&#34;&gt;The Fundamental Problem Remains&lt;/h2&gt;
&lt;p&gt;Many academics I have talked to are unhappy about the dominance of deep learning right now, because it is an approach which works well, maybe even too well, but doesn’t bring us much closer to really understand how the human mind works.&lt;/p&gt;
&lt;p&gt;I also think the fundamental problem remains unsolved. How do we understand the world? How do we create new concepts? Deep learning stays an imitation on a behavioral level and while that may be enough for some, it isn’t for me.&lt;/p&gt;
&lt;p&gt;Also, I think it is dangerous to attribute too much intelligence to these systems. In raw numbers, they might work well enough, but when they fail they do so in ways that clearly show they operate in an entirely different fashion.&lt;/p&gt;
&lt;p&gt;While Google translate lets you skim the content of website in a foreign language, it is still abundantly clear that the system has no idea what it is doing.&lt;/p&gt;
&lt;p&gt;Sometimes I feel like nobody cares, also because nobody gets hurt, right? But maybe it is still my German cultural background that would rather prefer we see things as they are, and take it from there.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Hey Ho, Thanks for Sticking Around!</title>
    <link href="https://blog.mikiobraun.de/2016/06/hey-ho-and-thanks-for-sticking-around"/>
    <id>https://blog.mikiobraun.de/2016/06/hey-ho-and-thanks-for-sticking-around</id>
    <published>2016-06-02T10:00:00+02:00</published>
    <updated>2016-06-02T10:00:00+02:00</updated>
    <content type="html">




&lt;p&gt;So this was definitely a long radio silence! Since I blogged last time, a lot has happened.&lt;/p&gt;
&lt;p&gt;I&#39;ve quit my PostDoc job and joined &lt;a href=&#34;https://tech.zalando.de&#34;&gt;Zalando&lt;/a&gt;, a big (the biggest?) European fashion retailer (revenue in 2015: about three billion Euros). I&#39;m a &amp;quot;delivery lead&amp;quot;, kind of a technical lead role for two teams. One is running the recommendation service for all of Zalando, the other team is creating a new search backend service. It definitely is a management position, so I don&#39;t code much (except for &lt;a href=&#34;https://twitter.com/mikiobraun/status/735010846884147200&#34;&gt;sometimes&lt;/a&gt;), but I find leadership extremely interesting, and challenging, and Zalando with its agile culture seems like the perfect place to be for me right now.&lt;/p&gt;
&lt;p&gt;One of my last projects at the university was a lecture series on Scalable Machine Learning. I had originally planned to spend about the same amount of time on Big Data technology as on the theoretical underpinnings, but after interventions from other professors who were concerned about people earning &amp;quot;double credits&amp;quot; it became the most mathematical piece of teaching I ever did. This was quite an experience. I had planned to prepare a few weeks worth in advance, but in the end, I was often spending all of Tuesday and Wednesday to churn out those 40-50 slides per week for the lecture on Thursday.&lt;/p&gt;
&lt;p&gt;I attended StrataHadoop in London last year, where Ben Lorica talked me into doing a video on &lt;a href=&#34;https://shop.oreilly.com/product/0636920045274.do&#34;&gt;Scalable Machine Learning&lt;/a&gt; for O&#39;Reilly (finally, also being allowed to talk about the technical side). We recorded the video in Amsterdam during OSCON in October in a single day (also, quite an experience). It is geared at people who already have a good understanding of Data Science and ML, but are not yet familiar with large scale learning, or Big Data technology, and is intended as a starting point into technologies like Spark.&lt;/p&gt;
&lt;p&gt;So my interests have shifted a bit, away from pure machine learning towards topics like facilitating collaboration between data scientists and engineers. Yesterday I gave a talk titled &lt;a href=&#34;https://conferences.oreilly.com/strata/hadoop-big-data-eu/public/schedule/detail/50378&#34;&gt;Hardcore Data Science in Practice&lt;/a&gt; to present my current state of insights into the matter, and I put my &lt;a href=&#34;https://www.slideshare.net/mikiobraun/hardcore-data-science-in-practice&#34;&gt;slides on the Internet&lt;/a&gt;. Zalando has heavily invested in data scientists and it&#39;s very interesting to see how that works out day to day. A friend of mine has remarked that I&#39;m the only person he knows who uses the term &amp;quot;Data Scientist&amp;quot; unironically. ;)&lt;/p&gt;
&lt;p&gt;I also greatly enjoy working with developers on a daily basis. After all, I&#39;m a computer scientist by training, but having worked in machine learning for so long where people come from many backgrounds like physics, mathematics, and so on, I almost forgot about this.&lt;/p&gt;
&lt;p&gt;One blog post that just didn&#39;t happened was a lengthy treatement of my reasons for leaving academia. Personally it makes total sense to me now, and I think there is a lot left to improve in academia, but I don&#39;t see the point in talking about it right now.&lt;/p&gt;
&lt;p&gt;There is obviously a lot of things happening right now in the &lt;em&gt;hypespace&lt;/em&gt;. Internet of Things, chat bots, and suddenly &lt;a href=&#34;https://www.businessinsider.de/salesforce-ceo-i-see-an-ai-first-world-2016-5&#34;&gt;AI is back&lt;/a&gt; and there are a few upcoming things I just have to say about that, too ;)&lt;/p&gt;
&lt;p&gt;So thanks for sticking around, hopefully the next post will not take another year to write.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Three Things About Data Science You Won&#39;t Find In the Books</title>
    <link href="https://blog.mikiobraun.de/2015/03/three-things-about-data-science"/>
    <id>https://blog.mikiobraun.de/2015/03/three-things-about-data-science</id>
    <published>2015-03-23T16:55:00+01:00</published>
    <updated>2015-03-23T16:55:00+01:00</updated>
    <content type="html">




&lt;p&gt;In case you haven&#39;t heard yet, Data Science is all the craze. Courses, posts, and schools are springing up everywhere. However, every time I take a look at one of those offerings, I see that a lot of emphasis is put on specific learning algorithms. Of course, understanding how logistic regression or deep learning works is cool, but once you start working with data, you find out that there are other things equally important, or maybe even more.&lt;/p&gt;
&lt;p&gt;I can&#39;t really blame these courses. I&#39;ve done years of teaching machine learning at universities, and these lectures always focus very much on specific algorithms. You learn everything about support vector machines, Gaussian mixture models, k-Means clustering, and so on, but only when you work on your master thesis do you learn how to properly work with data.&lt;/p&gt;
&lt;p&gt;So what does &lt;em&gt;properly&lt;/em&gt; mean anyway? Don&#39;t the ends justify the means? Isn&#39;t everything ok as long as I get good predictive performance? That is certainly true, but the key is to make sure that you actually get good performance on &lt;em&gt;future data&lt;/em&gt;. As I&#39;ve written elsewhere, it&#39;s just too simple to fool yourself into believing your method works when all you are looking at are results on training data.&lt;/p&gt;
&lt;p&gt;So here are my three main insights you won&#39;t easily find in books.&lt;/p&gt;
&lt;h2 id=&#34;1-evaluation-is-key&#34;&gt;1. Evaluation Is Key&lt;/h2&gt;
&lt;p&gt;The main goal in data analysis/machine learning/data science (or however you want to call is), is to build a system which will perform well on future data. The distinction between supervised (like classification) and unsupervised learning (like clustering) makes it hard to talk about what this means in general, but in any case you will usually have some data set collected on which you build and design your method. But eventually you want to apply the method to future data, and you want to be sure that the method works well and produces the same kind of results you have seen on your original data set.&lt;/p&gt;
&lt;p&gt;A mistake often done by beginners is to just look at the performance on the available data and then assume that it will work just as well on future data. Unfortunately that is seldom the case. Let&#39;s just talk about supervised learning for now, where the task is to predict some outputs based on your inputs, for example, classify emails into spam and non-spam.&lt;/p&gt;
&lt;p&gt;If you only consider the training data, then it&#39;s very easy for a machine to return perfect predictions just by memorizing everything (unless the data is contradictory). Actually, this isn&#39;t that uncommon even for humans. Remember when you were memorizing words in a foreign language and you had to made sure that you were testing the words out of order, because otherwise your brain would just memorize the words based on their order?&lt;/p&gt;
&lt;p&gt;Machines with their massive capacity for storing and retrieving large amounts of data can do the same thing easily. This leads to &lt;em&gt;overfitting&lt;/em&gt;, and lack of &lt;em&gt;generalization&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So the proper way to evaluate is to simulate the effect that you have future data by splitting the data, training on one part and then predicting on the other part. Usually, the training part is larger, and this procedure is also iterated several times in order to get a few numbers to see how stable the method is. The resulting procedure is called &lt;em&gt;cross-validation&lt;/em&gt;.&lt;/p&gt;
&lt;img class=&#34;img-responsive center-block&#34; src=&#34;https://blog.mikiobraun.de/images/3t-evaluation.png&#34;/&gt;
&lt;span class=&#34;caption text-muted&#34;&gt;In order to simulate performance on future data, you split the available data in two parts, train on one part, and use the other only for evaluation.&lt;/span&gt;
&lt;p&gt;Still, a lot can go wrong, especially when the data is non-stationary, that is, the underlying distribution of the data is changing over time. Which often happens when you are looking at data measured in the real world. Sales figures will look quite different in January than in June.&lt;/p&gt;
&lt;p&gt;Or there is a lot of correlation between the data points, meaning that if you know one data point you already know a lot about another data point. For example, if you take stock prices, they usually don&#39;t jump around a lot from one day to the other, so that doing the training/test split randomly by day leads to training and test data sets which are highly correlated.&lt;/p&gt;
&lt;p&gt;Whenever that happens, you will get performance numbers which are overly optimistic, and your method will not work well on true future data. In the worst case, you&#39;ve finally convinced people to try out your method in the wild, and then it stops working, so learning how to properly evaluate is key!&lt;/p&gt;
&lt;h2 id=&#34;2-its-all-in-the-feature-extraction&#34;&gt;2. It&#39;s All In The Feature Extraction&lt;/h2&gt;
&lt;p&gt;Learning about a new method is exciting and all, but the truth is that most complex method essentially perform the same, and that the real difference is made by the way in which raw data is turned into features used in learning.&lt;/p&gt;
&lt;p&gt;Modern learning methods are pretty powerful, easily dealing with tens of thousand of features and hundreds of thousand of data points, but the truth is that in the end, these methods are pretty dumb. Especially methods that learn a linear model (like logistic regression, or linear support vector machines) are essentially as dumb as your calculator.&lt;/p&gt;
&lt;p&gt;They are really good at identifying the informative features given enough data, but if the information isn&#39;t in there, or not representable by a linear combination of input features, there is little they can do. The are also not able to do this kind of data reduction themselves by having &amp;quot;insights&amp;quot; about the data.&lt;/p&gt;
&lt;p&gt;Put differently, you can massively reduce the amount of data you need by finding the right features. Hypothetically speaking, if you reduced all the features to the function you want to predict, there is nothing left to learn, right? That is how powerful feature extraction is!&lt;/p&gt;
&lt;p&gt;This means two things: First of all, you should make sure that you master one of those nearly equivalent methods, but then you can stick with them. So you don&#39;t really need logistic regression and linear SVMs, you can just pick one. This involves also understanding which methods are nearly the same, where the key point lies in the underlying model. So deep learning is something different, but linear models are mostly the same in terms of expressive power. Still, training time, sparsity of the solution, etc. may differ, but you will get the same predictive performance in most cases.&lt;/p&gt;
&lt;p&gt;Second of all, you should learn all about feature engineering. Unfortunately, this is more of an art, and almost not covered in any of the textbooks because there is so little theory to it. Normalization will go a long way. Sometimes, features need to be taken the logarithm of. Whenever you can eliminate some degree of freedom, that is, get rid of one way in which the data can change which is irrelevant to the prediction task, you have significantly lowered the amount of data you need to train well.&lt;/p&gt;
&lt;p&gt;Sometimes it is very easy to spot these kinds of transformations. For example, if you are doing handwritten character recognition, it is pretty clear that colors don&#39;t matter as long as you have a background and a foreground.&lt;/p&gt;
&lt;p&gt;I know that textbooks often sell methods as being so powerful that you can just throw data against them and they will do the rest. Which is maybe also true from a theoretical viewpoint and an infinite source of data. But in reality, data and our time is finite, so finding informative features is absolutely essential.&lt;/p&gt;
&lt;h2 id=&#34;3-model-selection-burns-most-cycles-not-data-set-sizes&#34;&gt;3. Model Selection Burns Most Cycles, Not Data Set Sizes&lt;/h2&gt;
&lt;p&gt;Now this is something you don&#39;t want to say too loudly in the age of Big Data, but most data sets will perfectly fit into your main memory. And your methods will probably also not take too long to run on the data. But you will spend a lot of time extracting features from the raw data and running cross-validation to compare different feature extraction pipelines and parameters for your learning method.&lt;/p&gt;
&lt;img class=&#34;img-responsive center-block&#34; src=&#34;https://blog.mikiobraun.de/images/3t-model-selection.png&#34;/&gt;
&lt;span class=&#34;caption text-muted&#34;&gt;For model selection, you go through a large number of parameter combinations, evaluating the performance on identical copies of the data.&lt;/span&gt;
&lt;p&gt;The problem is all in the combinatorial explosion. Let&#39;s say you have just two parameters, and it takes about a minute to train your model and get a performance estimate on the hold out data set (properly evaluated as explained above). If you have five candidate values for each of the parameters, and you perform 5-fold cross-validation (splitting the data set into five parts and running the test five times, using a different part for testing in each iteration), this means that you will already do 125 runs to find out which method works well, and instead of one minute you wait about two hours.&lt;/p&gt;
&lt;p&gt;The good message here is that this is easily parallelizable, because the different runs are entirely independent of one another. The same holds for feature extraction where you usually apply the same operation (parsing, extraction, conversion, etc.) to each data set independently, leading to something which is called &amp;quot;embarrasingly parallel&amp;quot; (yes, that&#39;s a technical term).&lt;/p&gt;
&lt;p&gt;The bad message here is mostly for the Big Data guys, because all of this means that there is seldom the need for scalable implementations of complex methods, but already running the same undistributed algorithm on data in memory in parallel would be very helpful in most cases.&lt;/p&gt;
&lt;p&gt;Of course, there exist applications like learning &lt;a href=&#34;https://www.cs.cmu.edu/~muli/file/parameter_server_nips14.pdf&#34;&gt;global models from terabytes of log data&lt;/a&gt; for ad optimization, or &lt;a href=&#34;https://data-artisans.com/computing-recommendations-with-flink.html&#34;&gt;recommendation for million of users&lt;/a&gt;, but bread-and-butter use cases are often of the type described here.&lt;/p&gt;
&lt;p&gt;Finally, having lots of data by itself does not mean that you really need all the data, either. The questions is much more about the complexity of the underlying learning problem. If the problem can be solved by a simple model, you don&#39;t need that much data to infer the parameters of your model. In that case, taking a random subset of the data might already help a lot. And as I said above, sometimes, the right feature representation can also help tremendously in bringing down the number of data points needed.&lt;/p&gt;
&lt;h2 id=&#34;in-summary&#34;&gt;In summary&lt;/h2&gt;
&lt;p&gt;In summary, knowing how to evaluate properly can help a lot to reduce the risk that the method won&#39;t perform on future data. Getting the feature extraction right is maybe the most effective lever to pull to get good results, and finally, it doesn&#39;t always to have Big Data, although distributed computation can help to bring down training times.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I&#39;m contemplating of putting together an ebook with articles like this one and some hands on stuff to get you started with data science. If you want to show your support, you can sign up &lt;a href=&#34;https://leanpub.com/mikiosschoolofdata&#34;&gt;here&lt;/a&gt; to get notified when the book is published.&lt;/em&gt;&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Pivoting</title>
    <link href="https://blog.mikiobraun.de/2015/01/pivoting"/>
    <id>https://blog.mikiobraun.de/2015/01/pivoting</id>
    <published>2015-01-30T17:03:00+01:00</published>
    <updated>2015-01-30T17:03:00+01:00</updated>
    <content type="html">




&lt;p&gt;To make a long story short, I&#39;ve decided to scale back my involvement with the streamdrill company to a purely advisory role. The reasons for this are naturally very complex, but in the end, I wasn&#39;t seeing the kind of traction or the prospect of traction necessary to keep going at the pace I was going, splitting time between family, the university jobs, which paid my bills, and doing the dev work and marketing for streamdrill.&lt;/p&gt;
&lt;p&gt;In fact I still believe the base technology is pretty compelling, so we&#39;re going to open source the core, to allow me to continue to work on it. That&#39;s something I had been wanting to do for some time, because in the Big Data community, having some part as open-source is necessary to get people to try this out. At streamdrill, we always had more of a focus on providing some directly usable end product, so this won&#39;t hurt the company (which Leo is planning to continue.)&lt;/p&gt;
&lt;p&gt;So the big question (or maybe not) is what to do now. In fact, I already got plenty to do... .&lt;/p&gt;
&lt;p&gt;So I&#39;m still at the TU Berlin, and let me whine about the situation here for one paragraph ;) It&#39;s not ideal. I sort of have accepted for myself that my interests are just too applied for academia (one simply does not write software at my level anymore, people told me it&#39;s suspicious and I should stop it). In terms of career I have moved up to a point where the work I&#39;m expected to do is mostly teaching, advising students, and stuff like grant proposal and project management. And while I seem to do OK, this makes me deal with stuff I find extremely painful. On the plus side, it provides good job security and somewhat fair pay, but that will only get you so far, soulwise.&lt;/p&gt;
&lt;p&gt;And the workload is pretty high. I have to do about a professor level of teaching, and am currently supervising about 5 students writing their master thesis and something like two to three Ph.D. students.&lt;/p&gt;
&lt;p&gt;I&#39;m sort of managing our side of the &lt;a href=&#34;https://www.bbdc.berlin/&#34;&gt;Berlin Big Data Center&lt;/a&gt; project. Luckily this project aligns well with my interests. It&#39;s about bringing together machine learning people and people who build scalable distributed infrastructure. We&#39;re closely related to the &lt;a href=&#34;https://flink.apache.org/&#34;&gt;Apache Flink&lt;/a&gt; project, which is also really picking up lately. There&#39;s lots of mutual interest, so I&#39;m definitely looking forward to that.&lt;/p&gt;
&lt;p&gt;There is also another project which is potentially coming up, so my current workload is two projects, half a dozen students, and about 20 or so students to supervise in four teaching courses.&lt;/p&gt;
&lt;p&gt;I&#39;ve recently started to join the &lt;a href=&#34;https://www.infoq.com/author/Mikio-Braun&#34;&gt;InfoQ editorial board&lt;/a&gt; and try to cover about one Big Data related news item per week. And I&#39;m again taking part in the 3rd batch of the &lt;a href=&#34;https://datascienceretreat.com/&#34;&gt;Data Science Retreat&lt;/a&gt; starting in February.&lt;/p&gt;
&lt;p&gt;And there&#39;s still more stuff I&#39;m interested in:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://jblas.org&#34;&gt;jblas&lt;/a&gt; needs some love.&lt;/em&gt; My last serious updates are two years old, but with all that JVM based data analysis happening, jblas usage has picked up recently. I have some ideas to unclutter the code, make the whole build process more manageable, and maybe look into some new ideas to make use of native code also in cases where copying would be prohibitive, maybe by using caches or explicit memory handling.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;open source streamdrill&lt;/em&gt;, of course. Use of probabilistic data structures are picking up recently, and I always thought that it&#39;s time to take it to the next level and write analysis algorithms which naturally use these structures as building blocks.&lt;/li&gt;
&lt;li&gt;There&#39;s a lot of talk about data science / Big Data convergence, but based on the people who are doing Ph.D.s in machine learning at TU Berlin, the existing technology is still much too unwieldy to use. Ever tried setting up Hadoop from the sources? I simply cannot see that someone who is used to Python would want to do that. Spark, for example, is investing a lot in that area, but their &lt;a href=&#34;https://blog.mikiobraun.de/2013/09/designing-machine-learning-frameworks.html&#34;&gt;machine learning efforts are still very rough and somewhat premature&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Likewise, there is a lot of training under way to get more Data Scientists, but I think that the way data analysis is taught at universities is a very bad guideline, because that&#39;s really trying to teach people to become researchers and create new data analysis methods, not use them reasonably. I think similar to the division between people who build tools and those who use tools to do something valuable with it, there needs to be a separation of training programs. And for that existing tools need to mature more. &lt;a href=&#34;https://scikit-learn.org/&#34;&gt;Scikit-learn&lt;/a&gt;, for example, is an awesome collection of many, many methods, but it has very little in terms of high-level stuff to support the process of data analysis.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&#34;https://www.infoq.com/news/2014/12/ipython-notebooks&#34;&gt;Notebooks is the new excel&lt;/a&gt;.&lt;/em&gt; I&#39;m seeing a lot of use of IPython style notebooks lately to get to a more &amp;quot;literal&amp;quot; style of data analysis to get data analysis and business people to collaborate. Also the integration of code, plots, and results is really nice.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moving out of out-of-core-learning.&lt;/em&gt; After working with streaming for so long, the classical Python/R way of doing data analysis feels so weird. Why do I have to load all that data into memory? I understand that learning methods are so complex and data access patterns so random that this is the only way, but it now feels like a big restriction that your data set needs to fit into memory. Machine learning should be more like UNIX where stuff is file based and 10k C programs can work with gigabytes of data with 32MB of RAM if they need to (ok, I&#39;m thinking of how it was back in 1994, but you get my point). And I&#39;m not simply talking about &lt;a href=&#34;https://datascienceatthecommandline.com/&#34;&gt;data science on the command line&lt;/a&gt;, we probably need new algorithms for that, too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And then there are even other odds and bits. I mean why is everything so complex nowadays? Just frameworks wrapping frameworks. CSS frameworks? I mean, c&#39;mon! What about things which did one thing well and weren&#39;t a pain to set up?&lt;/p&gt;
&lt;p&gt;I want to keep attending more non-academic meetings. I&#39;ll try to go to QCon London for at least one day, and I&#39;ll be also speaking at Strata in London in May.&lt;/p&gt;
&lt;p&gt;Still, the whole situation is hardly ideal. Maybe it&#39;s asking too much of a job to have perfect alignment between interests and job related activities, but I think there&#39;s room for improvement. Stay tuned.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Data Science workshop at data2day</title>
    <link href="https://blog.mikiobraun.de/2014/12/first-data-science-tutorial"/>
    <id>https://blog.mikiobraun.de/2014/12/first-data-science-tutorial</id>
    <published>2014-12-01T12:15:00+01:00</published>
    <updated>2014-12-01T12:15:00+01:00</updated>
    <content type="html">




&lt;div class=&#34;figure&#34;&gt;
	&lt;img src=&#34;https://blog.mikiobraun.de/images/data2day-workshop-smaller.jpg&#34; /&gt;
&lt;/div&gt;
&lt;p&gt;Giving a one day tutorial on data science is something I&#39;ve been considering
in different contexts from time to time, but for different reasons it never
really happened. Finally, last Friday, the tutorial took place as a workshop
in the &lt;a href=&#34;https://data2day.de&#34;&gt;data2day&lt;/a&gt; conference, and I think it went pretty well. In this post I&#39;d
like to talk a bit about our approach and our experiences.&lt;/p&gt;
&lt;p&gt;The conference was organized by the heise publisher, well known in Germany for
their print magazines &lt;a href=&#34;https://www.heise.de/ct/&#34;&gt;c&#39;t&lt;/a&gt; and &lt;a href=&#34;https://www.heise.de/ix/&#34;&gt;iX&lt;/a&gt;, which have been household names in IT since
the eighties. It was the first conference in the Big Data/Data Science
context organized by them, but already brought together over 150 participants.&lt;/p&gt;
&lt;p&gt;For the workshop, I was happy to team up with Jan Müller and Paul Bünau from
&lt;a href=&#34;https://idalab.de&#34;&gt;idalab&lt;/a&gt;. In fact, Paul and I had developed a similar kind of hands-on
introduction to data analysis a few years ago while he was working on his PhD
at TU Berlin. Designed as a summer long course, the idea was to have students
implement a number of machine learning algorithms themselves. Each method
would first be presented by focussing on the main ideas, without going into
the theory too much. Then, the students would have two to three weeks time to
implement the method and play around with them on some toy data. During that
phase, we would have a weekly office hour where we would go around and talk to
the students individually to help them where they got stuck.&lt;/p&gt;
&lt;p&gt;This course seemed to be quite popular with the students. We would still
randomly get praise for the course years later with students telling us that
this was among the courses where they learned most.&lt;/p&gt;
&lt;p&gt;So when designing this one day workshop, the idea was from the beginning to
keep these two ingredients: Focus on main ideas and context, and a hands-on
approach.&lt;/p&gt;
&lt;p&gt;It was particularly important to us to not just go through a bunch of learning
algorithms, but also stress how important is to know what you are doing. As I
have &lt;a href=&#34;https://blog.mikiobraun.de/2014/02/data-analysis-hard-parts.html&#34;&gt;discussed before&lt;/a&gt;, it is too easy to put together some data analysis
pipeline and then not properly evaluate. Everything looks great, but in the
end you have just looked at training error, resulting in really bad
performance on future data.&lt;/p&gt;
&lt;p&gt;For the hands-on part, we chose to work with &lt;a href=&#34;https://ipython.org/notebook.html&#34;&gt;IPython notebooks&lt;/a&gt;. These are
available on all major operating systems, notebooks can saved and loaded
easily, it integrates with plotting, and so on. Toolwise we chose to work with
&lt;a href=&#34;https://www.numpy.org/&#34;&gt;numpy&lt;/a&gt;, &lt;a href=&#34;https://pandas.pydata.org/&#34;&gt;pandas&lt;/a&gt;, [scikit-learn], and &lt;a href=&#34;https://matplotlib.org/&#34;&gt;matplotlib&lt;/a&gt;.  Originally the plan was
to have one session where we go through the basics of the tools and then two
use cases, but while putting the material together it became apparent that
there wasn&#39;t enough time for two use cases, so we just sticked with a simple
example based on MNIST character recognition, and decision trees.&lt;/p&gt;
&lt;p&gt;So in the end the course went like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;about one hour if introductory course on what is data science/machine learning, and things like supervised vs. unsupervised learning,   evaluation, cross-validation, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one hour of going through the basics of numpy and pandas in an interactive IPython session&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;one hour of doing some exercises with numpy and pandas&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;another hour of going through an example with scikit-learn&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;two hours of doing the use case&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The notebook from the example sessions were handed out at the beginning of the
exercises, and the exercises were prepared as IPython notebooks themselves
with free cells where you could put down your solutions.&lt;/p&gt;
&lt;p&gt;As it is with all such things, you never know whether you thought of
everything, but all in all, we felt the workshop went very well. With three of
us,  there was enough time to help each of the participants individually,
including fixing issues like finding out where IPython was keeping it files
under Windows, dealing with oddities of Python&#39;s indexing scheme, and so on.&lt;/p&gt;
&lt;p&gt;In the end, all participants had a running notebook which loaded the MNIST
data, learned a decision tree whose hyperparameter was adjusted by cross-
validation, giving them about 83% accuracy. Of course that is not optimal, but
already pretty good for a few lines of code. Most importantly, everyone now
has a complete framework from which they can start exploring other approaches,
try out new methods, and so on.&lt;/p&gt;
&lt;p&gt;Next time, we would probably intersperse the background talk with the
solutions, such that there isn&#39;t such a monolithic block at the beginning, and
be more careful with Python 3 vs Python 2. But overall I think our approach
worked out very well (also based on the feedback we got).&lt;/p&gt;
&lt;p&gt;The workshop also showed that there is a real need of teaching people the more
high level concepts like proper validation. Unfortunately, even at
universities, the focus is too much on the methods themselves. Students often
learn the process and things like proper validation only when they work on
their master thesis. On the hand, for doing robust and reliable data analyses,
these things are absolutely essential.&lt;/p&gt;

</content>
  </entry>

  <entry>
    <title type="html">Parts But No Car</title>
    <link href="https://blog.mikiobraun.de/2014/10/parts-bug-no-car-big-data-infrastructure"/>
    <id>https://blog.mikiobraun.de/2014/10/parts-bug-no-car-big-data-infrastructure</id>
    <published>2014-10-02T10:45:00+02:00</published>
    <updated>2014-10-02T10:45:00+02:00</updated>
    <content type="html">




&lt;p&gt;One question which pops up again and again when I talk about streamdrill is
whether that cannot be done by X, where X is one of Hadoop, Spark, Go, or some
other piece of Big Data infrastructure.&lt;/p&gt;
&lt;p&gt;Of course, the reason why I find it hard to respond that question is that the
engineer in my is tempted to say &amp;quot;in principle, yes&amp;quot; which sort of questions
why I put all that work to rebuild something which apparently already exists.
But the truth is that there&#39;s a huge gap between &amp;quot;in principle&amp;quot; and &amp;quot;in
reality&amp;quot;, and I&#39;d like to spell this difference out in this post.&lt;/p&gt;
&lt;p&gt;The bottom line is that all those pieces of Big Data infrastructure which
exists today provide you with a lot of pretty impressive functionality,
distributed storage, scalable computing, resilience, and so on, but not in a
way which solves your data analysis problems out of the box. The analogy I
like is that Big Data is a lot like providing you with an engine, a
transmission, some tires, a gearbox, and so on, but no car.&lt;/p&gt;
&lt;p&gt;So let us consider an example where you have some clickstream and you want to
extract some information about your users. Think, for example, recommendation,
or churn prediction. So what steps are actually involved in putting together
such a system?&lt;/p&gt;
&lt;p&gt;First comes the hardware, either on the cloud or by buying or finding some
spare machines, and then setting up the basic infrastructure. Nowadays, this
would mean installing Linux, HDFS, the distributed filesystem of Hadoop, and
YARN, the resource manager which allows you to run different kind of compute
jobs on the cluster. Especially when you go for the raw Open Source version of
Hadoop, this step requires a lot of manual configuration, and unless you
already did this a few times, this might take a while to get to work.&lt;/p&gt;
&lt;p&gt;Then, you need to take in the data in some way, for example, by something
like &lt;a href=&#34;https://kafka.apache.org/&#34;&gt;Apache Kafka&lt;/a&gt;, which is essentially a mixture of a distributed log
storage and an event transport plattform.&lt;/p&gt;
&lt;p&gt;Next, you need to process the data, which could either be done by a system
like &lt;a href=&#34;https://storm.incubator.apache.org/&#34;&gt;Apache Storm&lt;/a&gt;, a stream processing framework which lets you distribute
computing once you have it broken down to pieces of computation taking in
an event at a time. Or you use &lt;a href=&#34;https://spark.apache.org/&#34;&gt;Apache Spark&lt;/a&gt; which let&#39;s you describe
computation on a higher level with something like a functional collection API
and can also be fed a stream of data.&lt;/p&gt;
&lt;p&gt;Unfortunately, this still does nothing useful out of the box. Both Storm and
Spark are just frameworks for distributed computing, meaning that they allow
you to scale computation, but you need to tell them what you want to compute.
So you first need to figure out what to do with your data and this involves
looking at data, identifying the kind of statistical analysis which is suited
to solve your problem, and so on, and probably requires a skilled data
scientist to spend one to two month working on the data. There are projects
like &lt;a href=&#34;https://spark.apache.org/mllib&#34;&gt;mllib&lt;/a&gt; which provide more advanced analytics, but again these projects
don&#39;t provide full solutions to application problems but are tools for a data
scientist to work with (And they are still somewhat early stage IMHO.)&lt;/p&gt;
&lt;p&gt;Still, there&#39;s more work to do. One thing people are often unaware of is that
Storm and Spark have no &lt;a href=&#34;https://blog.mikiobraun.de/2013/03/stream-processing-has-no-query-layer.html&#34;&gt;storage layer&lt;/a&gt;. This means that they both perform computation, but to get
to the result of the computation, you have to store it somewhere and have some
means to query it. This means usually to store the result in a database,
something like &lt;a href=&#34;https://redis.io&#34;&gt;redis&lt;/a&gt;, if you want the speed of a memory based data storage, or
in some other way.&lt;/p&gt;
&lt;p&gt;So by now we have taken care of how to get the data in, what to do with it and
how, and how to store the result such that we can query it while the
computation is going on. Conservatively talking, we&#39;re already down six man
months, probably less if you have done it before and/or are lucky. Finally,
you also need to have some way to visualize the results, or if your main
access is via an API, to monitor what the system is doing. For this, more
coding is required, to create a web backend with graphs written in  &lt;a href=&#34;https://d3js.org&#34;&gt;d3.js&lt;/a&gt; in
JavaScript.&lt;/p&gt;
&lt;p&gt;The resulting system probably looks a bit like this.&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
	&lt;img src=&#34;https://blog.mikiobraun.de/images/big-data-parts-fig.png&#34;&gt;
&lt;/div&gt;
&lt;p&gt;Lots of moving parts which need to be deployed and maintained. Contrast this
with an integrated solution. To me this is difference between a bunch of parts
and a car.&lt;/p&gt;

</content>
  </entry>

</feed>