{"@attributes":{"version":"2.0"},"channel":{"title":"Oliver Wehrens","link":"https:\/\/owehrens.com\/","description":"Recent content on Oliver Wehrens","generator":"Hugo","language":"en-us","lastBuildDate":"Sun, 05 Oct 2025 00:00:00 +0000","item":[{"title":"AI coding test turned to product","link":"https:\/\/owehrens.com\/ai-coding-test-turned-to-product\/","pubDate":"Sun, 05 Oct 2025 00:00:00 +0000","guid":"https:\/\/owehrens.com\/ai-coding-test-turned-to-product\/","description":"<h1 id=\"tldr\">TLDR;<\/h1>\n<ul>\n<li>Write what you want to build<\/li>\n<li>Help cursor plan it<\/li>\n<li>Execute one step after another in a new agent window<\/li>\n<li>Commit to git each step.<\/li>\n<li>Win.<\/li>\n<li>Claude Sonnet 4.5 is good.<\/li>\n<\/ul>\n<h1 id=\"ai-coding\">AI Coding<\/h1>\n<p>Everybody does AI coding. Well, not everybody. I went to the <a href=\"https:\/\/www.meetup.com\/de-DE\/cto-roundtable-berlin\/events\/310814766\/\">Berlin CTO Roundtable<\/a> some time ago and we discussed the learnings and adoption of AI coding.<\/p>\n<p>Two things stuck to my mind.<\/p>\n<p>The usual adoption curve is ChatGPT -&gt; Github Coilot -&gt; Cursor. Some of the participants stated that only after they introduced Cursor, the adoption grew. With ChatGPT and Copilot it was more of a &lsquo;meh&rsquo;.<\/p>"},{"title":"Using AI and Model Context Protocol to create more usable Jira Tickets","link":"https:\/\/owehrens.com\/ai-and-mcp-to-create-more-usable-jira-tickets\/","pubDate":"Mon, 31 Mar 2025 00:00:00 +0000","guid":"https:\/\/owehrens.com\/ai-and-mcp-to-create-more-usable-jira-tickets\/","description":"<h1 id=\"the-problem\">The Problem<\/h1>\n<p>I have seen ticket systems with unusable ticket description. Sometimes way too much, sometimes just one line description. I have an interims PO job at the moment and I feel it. Describing everything, to make it easy for the developer to follow what I want is hard work. Some of it is just like boiler plate in coding. And it is easy to forget details.<\/p>\n<h1 id=\"a-new-technology-a-new-solution\">A new technology, a new solution<\/h1>\n<p>AI helps programmers to write, understand code, generate unit tests. What has AI ever done for Product Owners? Ok, Deep Research and ping-ponging product ideas. But else?<\/p>"},{"title":"iOS Development Setup with Cursor AI","link":"https:\/\/owehrens.com\/ios-development-with-cursor-ai\/","pubDate":"Sat, 08 Feb 2025 00:00:00 +0000","guid":"https:\/\/owehrens.com\/ios-development-with-cursor-ai\/","description":"<p><a href=\"https:\/\/owehrens.com\/the-return-of-product-and-requirements-development-writing-software-without-being-a-developer\/\">A few days ago<\/a> I started to work with cursor and iOS development. Here is my setup so you get a head start on the setup.<\/p>\n<h1 id=\"setup\">Setup<\/h1>\n<h2 id=\"xcode\">Xcode<\/h2>\n<p>Yes you still need it to have it installed. The initial project needs to be setup with Xcode.<\/p>\n<h2 id=\"cursor-extenstions\">Cursor Extenstions<\/h2>\n<h3 id=\"swift\">Swift<\/h3>\n<p>Extension: <a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=sswg.swift-lang\">Swift<\/a><\/p>\n<p>This extension adds language support for Swift to Visual Studio Code. It supports:<\/p>\n<ul>\n<li>Code completion<\/li>\n<li>Jump to definition, peek definition, find all references, symbol search<\/li>\n<li>Error annotations and apply suggestions from errors<\/li>\n<li>Automatic generation of launch configurations for debugging with CodeLLDB<\/li>\n<li>Automatic task creation<\/li>\n<li>Package dependency view<\/li>\n<li>Test Explorer view<\/li>\n<\/ul>\n<h3 id=\"sweetpad\">SweetPad<\/h3>\n<p>Extension <a href=\"%5Bhttps:\/\/marketplace.visualstudio.com\/items?itemName=sweetpad.sweetpad\">SweetPad<\/a><\/p>"},{"title":"The return of product and requirements development. Writing software without being a developer.","link":"https:\/\/owehrens.com\/the-return-of-product-and-requirements-development-writing-software-without-being-a-developer\/","pubDate":"Tue, 04 Feb 2025 00:00:00 +0000","guid":"https:\/\/owehrens.com\/the-return-of-product-and-requirements-development-writing-software-without-being-a-developer\/","description":"<p>I wanted to try AI for software development. The last time I tried it was with Github Copilot in 2023, and I was thrilled. It was great. It could predict my next code, could almost read my mind.<\/p>\n<p>Fast forward to 2025, new tools were coming up. I decided to give cursor.com a try. Since I&rsquo;ve been a podcast listener for years, I choose to program a podcast app. I&rsquo;ve never done anything in iOS or Swift before.<\/p>"},{"title":"Running Deepseek 671B Model on a PC locally","link":"https:\/\/owehrens.com\/running-deepseek-671b-on-a-pc-locally\/","pubDate":"Mon, 03 Feb 2025 00:00:00 +0000","guid":"https:\/\/owehrens.com\/running-deepseek-671b-on-a-pc-locally\/","description":"<p>DeepSeek is making waves. I was running the 32B model locally and came <a href=\"https:\/\/docs.unsloth.ai\/basics\/tutorial-how-to-run-deepseek-r1-on-your-own-local-device\">across a possibility<\/a> (<a href=\"https:\/\/unsloth.ai\/blog\/deepseekr1-dynamic#running%20r1\">another link<\/a> to run the 671B model on my machine.<\/p>\n<h1 id=\"prerequisites\">Prerequisites<\/h1>\n<p>I have a PC with an 12th Gen i7-12700K and 20 cores, with 128GB RAM and a Nvidia RTX 4090 graphics card. While running the whole process took 106 GB RAM and 21 GB VRAM. <a href=\"https:\/\/www.reddit.com\/r\/selfhosted\/comments\/1ic8zil\/yes_you_can_run_deepseekr1_locally_on_your_device\/\">This Post<\/a> claims 20GB RAM is the minimum needed and optimal would be RAM+VRAM = 80GB.<\/p>"},{"title":"The Pivotal Role of Tech Leadership in Overseeing the Big Picture","link":"https:\/\/owehrens.com\/the-pivotal-role-of-tech-leadership-in-overseeing-the-bigpicture\/","pubDate":"Wed, 28 Aug 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/the-pivotal-role-of-tech-leadership-in-overseeing-the-bigpicture\/","description":"<p>The role of an individual overseeing the big picture is pivotal for a company. This role could be filled by a developer, an architect, a Head of Engineering, or a CTO. Depending on the size of the company, it\u2019s not necessary to manage every detail personally, but it is crucial to ensure that essential tasks are completed and that you maintain a comprehensive overview of all operations.<\/p>\n<p>What are the main responsibilities in that role?<\/p>"},{"title":"Reporting on a big waterscrum project","link":"https:\/\/owehrens.com\/reporting-on-a-big-waterscrum-project\/","pubDate":"Thu, 13 Jun 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/reporting-on-a-big-waterscrum-project\/","description":"<p><img src=\"waterscrum.png\" alt=\"Waterscrum\" title=\"Waterscrum\"><\/p>\n<p>I once worked in a smaller development unit with around 100 developers. We were part of a big corporate and got the task as a whole company to finish a strategic project within 12 months. I was assigned to be the project lead on our part and had to make sure we delivered. We used to be an agile development shop, which now got closer and closer to corporate processes.<\/p>"},{"title":"Fuckup: Goodhart's Law in practice - tie a metric to a bonus","link":"https:\/\/owehrens.com\/fuckup-goodharts-law-in-practice-tie-a-metric-to-a-bonus\/","pubDate":"Thu, 18 Apr 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/fuckup-goodharts-law-in-practice-tie-a-metric-to-a-bonus\/","description":"<p>It might be a familiar situation to you:\nYou have an increasing code base \ud83d\udcc8, teams are growing and your ability to deploy is deteriorating \ud83d\udea8.<\/p>\n<p>What do you do? How can you make sure all developers and product owners take care of quality?<\/p>\n<p>In order to react to changes and fix bugs we wanted to be able to roll out fixes as fast as possible (that was\nin ~2014). One prerequisite for this was a that all build pipelines for the main branch are green \ud83d\udfe2.<\/p>"},{"title":"Fuckup: Programming Languages and Organizations","link":"https:\/\/owehrens.com\/fuckup-programming-languages-and-organizations\/","pubDate":"Wed, 17 Apr 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/fuckup-programming-languages-and-organizations\/","description":"<p>Some years ago I witnessed a fuckup which let to the creation of our\n<a href=\"https:\/\/owehrens.com\/why-you-need-a-macro-architecture\">Rules of Play<\/a> and the need for a macro architecture and guidelines.<\/p>\n<p>In the early 2010 Scala as a functional programming language became very popular. We were a Java Shop\nwith an occasional Groovy service. All JVM based. One team decided that they wanted to try\nout something new and went for Scala. It was cool, new features, functional, less boilerplate. It was hype.<\/p>"},{"title":"Clean code ... should you DRY?","link":"https:\/\/owehrens.com\/clean-code-should-you-dry\/","pubDate":"Tue, 19 Mar 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/clean-code-should-you-dry\/","description":"<p><img src=\"clean-code.jpg\" alt=\"Clean Code\" title=\"Clean Code Book\"><\/p>\n<p>2008 Robert C. Martin published his book &lsquo;Clean Code&rsquo;. I was just starting my new job as Senior Software Developer at Hypoport. It was eye-opening. We discussed it in a tech department wide book circle, exchanged ideas of what things mean and agreed to some standards which are important to us.<\/p>\n<p>Over the years, I learned that people took that as the bible. And it went further. My favourite example of taking it religiously is: Don&rsquo;t repeat yourself (DRY). Never ever duplicate code. Make sure you generalize everything so it fits everything if it does remotely the same thing.<\/p>"},{"title":"Why you need a macro architecture","link":"https:\/\/owehrens.com\/why-you-need-a-macro-architecture\/","pubDate":"Sun, 17 Mar 2024 00:00:00 +0000","guid":"https:\/\/owehrens.com\/why-you-need-a-macro-architecture\/","description":"<p><a href=\"https:\/\/ewolff.com\">Eberhard Wolff<\/a> on <a href=\"https:\/\/www.linkedin.com\/in\/eberhardwolff\/\">LinkedIn<\/a> asked recently: &lsquo;What was the biggest mistake you witnessed or did?&rsquo; (in software architecture).<\/p>\n<p>The one thing which came to my mind is that at one point we did not have a shared understanding how we should build our system back when I was working at DHL E-POST. This was in ~ 2014. We split the monolith in multiple services. Every team (we had 10 teams) was doing it how they thought it would be good. Turns out the overall system was harder to use, full of surprises in the APIs (REST) and had different concepts when operating. Documentation was hard to find and different stakeholders had different ideas how things should be done.<\/p>"},{"title":"Can AI replace me as a consultant?","link":"https:\/\/owehrens.com\/can-ai-replace-me-as-a-consultant\/","pubDate":"Sun, 24 Dec 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/can-ai-replace-me-as-a-consultant\/","description":"<p><img src=\"aitakeover.jpg\" alt=\"AI Takeover\" title=\"AI Takeover\"><\/p>\n<p>I got recently asked if my job as a consultant in the tech, product and organizations development space, can be replaced by an AI.<\/p>\n<p>I said, that I&rsquo;m that arrogant to think that this is not possible.<\/p>\n<p>After thinking about it for a few days I was wondering: Is that so?<\/p>\n<p>Usually our customers call us to get help or for an outside view on their (digital) product development. This includes observing everything around product, technology &amp; organization, help implementing improvements and enable the customer to be more effective and efficient after we leave.\nThey know that something could be better and hire us because they don&rsquo;t have the capacity or the time to acquire the knowledge about the issue to solve it themselves.<\/p>"},{"title":"Whisper: Nvidia RTX 4090 vs M1Pro with MLX (updated with M2\/M3)","link":"https:\/\/owehrens.com\/whisper-nvidia-rtx-4090-vs-m1pro-with-mlx\/","pubDate":"Sat, 09 Dec 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/whisper-nvidia-rtx-4090-vs-m1pro-with-mlx\/","description":"<p>(&hellip; see down below for M2 Ultra \/ M3 Max Update and a Nvidia optimzied whisper)<\/p>\n<p>Apple <a href=\"https:\/\/github.com\/ml-explore\/mlx\">released a machine learning framework<\/a> for Apple Silicon. Along with that are <a href=\"https:\/\/github.com\/ml-explore\/mlx-examples\">some examples<\/a> to see how things are working. They also use a whisper for benchmarking. So I dug out my benchmark and used that to measure performance.<\/p>\n<p>I simply added a new file to the repo (and the whisper large model was already downloaded). See the original <a href=\"https:\/\/github.com\/ml-explore\/mlx-examples\/tree\/main\/whisper\">source dir<\/a>.<\/p>"},{"title":"Artifacts for effective alignment","link":"https:\/\/owehrens.com\/artifacts-for-effective-alignment\/","pubDate":"Tue, 31 Oct 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/artifacts-for-effective-alignment\/","description":"<p>In my professional life, I came across many different companies and organizations. The majority of those were digital companies with its own Tech and Product departments (and only there might the following text applicable). If you have not found your product\/market fit, it might be a different game. But if you have, read on.<\/p>\n<p>One of the biggest complications was always the alignment of where to go and how to get there. Does everybody understand the same, is pulling in the same direction, and knows what to do? If you are small enough to fit in a room, things are easier in that regard. The larger you grow and the more remote everybody is, the alignment loses its clear contours. Things will get slower, customer might be unhappy and a clear direction seems to be missing.<\/p>"},{"title":"Podcast time","link":"https:\/\/owehrens.com\/podcast-time\/","pubDate":"Thu, 13 Apr 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/podcast-time\/","description":"<p>No, I did not start my own. <a href=\"https:\/\/shows.acast.com\/dev-env\">Ivan of dev.env<\/a> podcast invited me to talk about how I got there, where I am. Thanks for having me Ivan. It was fun.<\/p>\n<p>Sorry, German only.<\/p>\n<p><a href=\"https:\/\/shows.acast.com\/dev-env\/episodes\/18-oliver-wehrens\">https:\/\/shows.acast.com\/dev-env\/episodes\/18-oliver-wehrens<\/a><\/p>"},{"title":"OpenAI Whisper Performance on Nvidia RTX 4090","link":"https:\/\/owehrens.com\/whisper-performance-on-nvidia-rtx-4090\/","pubDate":"Tue, 21 Mar 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/whisper-performance-on-nvidia-rtx-4090\/","description":"<p><img src=\"openai4090.jpg\" alt=\"&ldquo;OpenAI Nvidia&rdquo;\" title=\"OpenAI Nvidia\"><\/p>\n<p>Short update on my performance series on OpenAI Whisper running on <a href=\"https:\/\/owehrens.com\/openai-whisper-benchmark-on-nvidia-tesla-t4-a100\/\">T4 \/ A100<\/a> and <a href=\"https:\/\/owehrens.com\/openai-whisper-on-apple-m1-cpp-version\/\">Apple Silicon<\/a>.<\/p>\n<p>I got my hands on a Nvidia RTX 4090 and ran a 3600 seconds audio file through it.<\/p>\n<pre tabindex=\"0\"><code>GPU\n0\n\nNVIDIA GeForce RTX 4090\nLoad Model at  2023-03-21 17:22:09.623805\nLoading took 0:00:09.574030\nstarted at 2023-03-21 17:22:19.197835\nended at 2023-03-21 17:25:25.905605\ntime elapsed: 0:03:06.707770\n<\/code><\/pre><p>With the large model it makes a ~ 19.3 x speed up. My prediction back then was about 10x but since just 11 MB VRAM was used I estimated 2 processes can be run in parallel. So it would be a 20x speed up. In a different way, but this prediction turned out to be true.<\/p>"},{"title":"Semantic Search with Cosine Similarity","link":"https:\/\/owehrens.com\/semantic-search-with-cosine-similarity\/","pubDate":"Thu, 23 Feb 2023 00:00:00 +0000","guid":"https:\/\/owehrens.com\/semantic-search-with-cosine-similarity\/","description":"<p><img src=\"Cosine.png\" alt=\"&ldquo;Cosine&rdquo;\" title=\"Cosine Similarity\"><\/p>\n<p>If you have a lot of text, how do you search though it? Keywords? What if these keywords never show up there? Imagine you want to know if Jerome Powell says something about &lsquo;Inflation decrease&rsquo; but he might not say the exact words? You will not find it. Databases like <a href=\"https:\/\/www.meilisearch.com\/\">Meilisearch<\/a> offer synonyms, but this can only take you so far.<\/p>\n<h1 id=\"similarity\">Similarity<\/h1>\n<p>Enter semantic search.<\/p>\n<p>I first heard about it when I saw that <a href=\"https:\/\/openai.com\/blog\/introducing-text-and-code-embeddings\/\">OpenAI<\/a> offers this. It is based around that text can be represented as vectors and similar texts are very close together &lsquo;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Dot_product#Application_to_the_law_of_cosines\">cosine similarity<\/a>&rsquo;. Complicated maths, but you don&rsquo;t need to understand all of it to use it (I certainly don&rsquo;t). Pretrained ML models can calculate vectors for any text. These vectors are specific to that particular model. To give you an understanding how such a vector looks like (I cut out 150 or so lines).<\/p>"},{"title":"OpenAI Whisper Benchmark Nvidia Tesla T4 \/ A100","link":"https:\/\/owehrens.com\/openai-whisper-benchmark-on-nvidia-tesla-t4-a100\/","pubDate":"Thu, 22 Dec 2022 00:00:00 +0000","guid":"https:\/\/owehrens.com\/openai-whisper-benchmark-on-nvidia-tesla-t4-a100\/","description":"<p>In my previous article, I wondered how OpenAI Whisper C++ Edition on a MacBook Pro M1Pro stacks up against a CUDA card. I don&rsquo;t have one, so I could not do the test.<\/p>\n<h1 id=\"benchmarking-nvidia-tesla-t4\">Benchmarking Nvidia Tesla T4<\/h1>\n<p>Google Colab to the rescue. I totally forgot about it. I can run (for free) on an Nvidia T4. If you start a notebook for yourself, don&rsquo;t forget to set the Runtime to GPU.<\/p>"},{"title":"OpenAI Whisper on Apple M1","link":"https:\/\/owehrens.com\/openai-whisper-on-apple-m1-cpp-version\/","pubDate":"Thu, 08 Dec 2022 00:00:00 +0000","guid":"https:\/\/owehrens.com\/openai-whisper-on-apple-m1-cpp-version\/","description":"<p>OpenAI <a href=\"https:\/\/openai.com\/blog\/whisper\/\">released Whisper<\/a> in September 2022 as Open Source. To achieve good performance, you need an Nvidia CUDA GPU with &gt; 8 GB VRAM.<\/p>\n<p>Recently, Georgi Gerganov released a <a href=\"https:\/\/github.com\/ggerganov\/whisper.cpp\">C++ port<\/a> optimized for CPU and especially Apple Silicon Platform.  So I tried this out.<\/p>\n<p>I run all of that on a Macbook Pro with a M1Pro CPU (6 performance and 2 efficiency cores) and 32 GB RAM. I want to run one 10 minute audio file in German with different number of cores and different models (tiny, base, small, medium, large). For more on the models and how it works, see the <a href=\"https:\/\/github.com\/ggerganov\/whisper.cpp\/blob\/master\/README.md\">readme<\/a> of Georgi. I used an exact 10-minute audio clip (search for podcast with the <a href=\"itunes:duration\">itunes:duration<\/a>600&lt;\/itunes:duration&gt; in the RSS feed) from []&lsquo;Was jetzt?&rsquo; Zeit Podcast](<a href=\"https:\/\/www.zeit.de\/serie\/was-jetzt)\">https:\/\/www.zeit.de\/serie\/was-jetzt)<\/a>.<\/p>"},{"title":"What does it take to become a software architect?","link":"https:\/\/owehrens.com\/what-does-it-take-to-become-a-software-architekt\/","pubDate":"Wed, 21 Jul 2021 00:00:00 +0000","guid":"https:\/\/owehrens.com\/what-does-it-take-to-become-a-software-architekt\/","description":"<p>I got together with <a href=\"https:\/\/ewolff.com\/\">Eberhard Wolff<\/a> to discuss and answer questions about what it takes to become a Software Architekt on <a href=\"https:\/\/software-architektur.tv\/2021\/07\/23\/folge68.html\">Software Architektur TV<\/a>. He was asked by several people what kind of skills a software architect needs, how a recruitment process might look or what kind of advice he could give to students to become an architect. So we got together and talked about it with live questions from the audience.\nThe interview got recorded on <a href=\"https:\/\/www.youtube.com\/watch?v=f-aJogqqk6M\">YouTube<\/a>, Twitch, and Podcast (in German).<\/p>"},{"title":"How hands-on should a CTO be?","link":"https:\/\/owehrens.com\/how-hands-on-should-a-cto-be\/","pubDate":"Fri, 12 Mar 2021 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-hands-on-should-a-cto-be\/","description":"<p>I got asked on LinkedIn, so here is my answer.<\/p>\n<blockquote>\n<p>It depends (on the phase of the company).<\/p>\n<\/blockquote>\n<p>I like Simon Wardley&rsquo;s Mapping. He defines categories of company phases<\/p>\n<ul>\n<li>Pioneers (searching for Product-Market Fit)<\/li>\n<li>Settlers (might have found Product-Market Fit)<\/li>\n<li>Town planners (Found something to grow)<\/li>\n<\/ul>\n<p>A job in an early startup is very different from a big corporation.  I also assume that while going through the phases, the company grows.<\/p>"},{"title":"Sketch Book Summary: No Estimates","link":"https:\/\/owehrens.com\/sketch-book-summary-no-estimates\/","pubDate":"Wed, 30 Dec 2020 00:00:00 +0000","guid":"https:\/\/owehrens.com\/sketch-book-summary-no-estimates\/","description":"<p>Here is my <a href=\"https:\/\/owehrens.com\/sketch-book-summary-gbs\/\">Sketch Book Summary<\/a> of <a href=\"https:\/\/oikosofyseries.com\/no-estimates-book-order\">No Estimates<\/a> by Vasco Duarte.<\/p>\n<p><img src=\"GBS-No-estimates.png\" alt=\"GBS No Estimates\" title=\"No Estimates\"><\/p>"},{"title":"Four weeks of home office","link":"https:\/\/owehrens.com\/four-weeks-of-home-office\/","pubDate":"Fri, 17 Apr 2020 00:00:00 +0000","guid":"https:\/\/owehrens.com\/four-weeks-of-home-office\/","description":"<p><img src=\"homeoffice.png\" alt=\"Homeoffice\" title=\"Homeoffice\"><\/p>\n<p>On March 12th we decided to send everybody into Home office. We were partially already working remotely but we never tried to be 100%. Now we were forced to.<\/p>\n<p><strong>As a summary<\/strong>: It works better than I expected. The remote work is not as much as a problem for everybody. Being stuck at home is.<\/p>\n<h1 id=\"tools-dont-fix-problems\">Tools (don\u2019t fix problems)<\/h1>\n<p>We already had bits and pieces in place to enable remote collaboration. We already used Slack, Google Hangouts, G-Suite, Asana, Jira, and Confluence. Hangouts is essential for sharing the Desktop or an App for things like core reviews. We added just recently miro.com to the mix as a whiteboard replacement. So far, we are happy with that setup. On the equipment side I am lucky that I have a room in my house as my office. Very quickly after we started working remotely, I ordered a Logitech C920 Webcam. For Audio I use a Jabra Speak 510. Using headphones all the time is possible but with that it is much better. Having a standing desk really helps me to get some movement during the day.<\/p>"},{"title":"Sketch Book Summary: Good Strategy, Bad Strategy","link":"https:\/\/owehrens.com\/sketch-book-summary-good-strategy-bad-strategy\/","pubDate":"Wed, 15 Jan 2020 00:00:00 +0000","guid":"https:\/\/owehrens.com\/sketch-book-summary-good-strategy-bad-strategy\/","description":"<p>Here is my <a href=\"https:\/\/owehrens.com\/sketch-book-summary-gbs\/\">Sketch Book Summary<\/a> about Good Stratgey, Bad Strategy. Thanks to Daniel for recommending it.<\/p>\n<p><img src=\"goodbad.png\" alt=\"GoodBad\" title=\"Good Strategy, Bad Strategy\"><\/p>"},{"title":"2019","link":"https:\/\/owehrens.com\/my-year-2019\/","pubDate":"Wed, 01 Jan 2020 00:00:00 +0000","guid":"https:\/\/owehrens.com\/my-year-2019\/","description":"<p>Lots of things have changed for me in 2019. So let\u2019s look back.<\/p>\n<p>In 2019, the biggest project I was ever involved in and responsible for went live. Nothing happened at launch day and everything started to work smoothly. We worked the whole of 2018 with up to 10 teams on this project. That was a very cool experience.  Thanks to everybody who was involved. It would not have been possible without all of you.<\/p>"},{"title":"Technical Agility","link":"https:\/\/owehrens.com\/technical-agility\/","pubDate":"Sat, 21 Sep 2019 00:00:00 +0000","guid":"https:\/\/owehrens.com\/technical-agility\/","description":"<p>I was giving a talk at an internal event of a consulting firm on Technical Agility. Here are my experiences and ideas on that topic.<\/p>\n<p>I will touch on<\/p>\n<ul>\n<li>What<\/li>\n<li>Why<\/li>\n<li>Where<\/li>\n<li>How ( &amp; How to measure)<\/li>\n<\/ul>\n<p>I will only touch on technical aspects of this topic. There is so much more to it like organization, team structure, culture and trust.<\/p>\n<p><img src=\"arc.png\" alt=\"Arc\" title=\"Changes\"><\/p>\n<p>The ability to react to changes is the reason I want to have Technical Agility. Pretty generic. But this is what the term says. Everybody can react to changes it is just a matter of time. So let&rsquo;s assume that you want to &lsquo;React to changes fast&rsquo;. How to define fast is up to you and of course, very use case-specific.<\/p>"},{"title":"Wardley Mapping Canvas","link":"https:\/\/owehrens.com\/wardley-mapping-canvas\/","pubDate":"Wed, 04 Sep 2019 00:00:00 +0000","guid":"https:\/\/owehrens.com\/wardley-mapping-canvas\/","description":"<p>I&rsquo;m a fan of <a href=\"https:\/\/medium.com\/wardleymaps\">Simon Wardley&rsquo;s Maps<\/a>.<\/p>\n<p><a href=\"https:\/\/miro.com\/blog\/wardley-maps-whiteboard-canvas\/\">Ben Mosior over at Miro<\/a> came up with a nice canvas for Wardley mapping. I could not find a vector version for printing out, so I made one with Affinity Designer.<\/p>\n<p>They are available at my <a href=\"https:\/\/github.com\/oliverwehrens\/wardleymapcanvas\">Github Repository<\/a>. It contains the original .afdesign file as well as a PDF version with and without explanation.<\/p>\n<p><img src=\"wmc.png\" alt=\"WMC\" title=\"Wardley Mapping Canvas\"><\/p>"},{"title":"Using Sketch Book Summary (SBS) to remember content what matters to me.","link":"https:\/\/owehrens.com\/sketch-book-summary-sbs\/","pubDate":"Fri, 23 Aug 2019 00:00:00 +0000","guid":"https:\/\/owehrens.com\/sketch-book-summary-sbs\/","description":"<p>Over the time I developed my own way of remembering what the content of a book was. I&rsquo;m reading a lot self improvement, time management, management and culture books. A trainer once told me if I could remember months later only 10% what was in the book I&rsquo;m really good. I wanted to change that.<\/p>\n<p>I&rsquo;m reading mostly on my Kindle. I have all the books always with me. The nice thing about it is, that I could mark text which is important or useful to me. My first iteration was just doing that. Turn out at most I was reading all notes at the end again. After a while I figured that did not help enough and I could do better.<\/p>"},{"title":"Sketch Book Summary: Atomic Habits","link":"https:\/\/owehrens.com\/sbs-atomic-habbits\/","pubDate":"Tue, 06 Aug 2019 00:00:00 +0000","guid":"https:\/\/owehrens.com\/sbs-atomic-habbits\/","description":"<p>Below my summary about the Book Atomic Habits by James Clear. This is how I try remember some ideas in books. <a href=\"https:\/\/owehrens.com\/sketch-book-summary-sbs\/\">There is another post about this and why I do it.<\/a><\/p>\n<p><img src=\"atomic_habbits.png\" alt=\"Atomic Habbits\" title=\"Atomic Habbits\"><\/p>"},{"title":"CD und DevOps im Expertencheck","link":"https:\/\/owehrens.com\/cd-und-devops-im-expertencheck\/","pubDate":"Thu, 01 Jun 2017 00:00:00 +0000","guid":"https:\/\/owehrens.com\/cd-und-devops-im-expertencheck\/","description":"<p>Grau ist alle Theorie. Wir haben daher verschiedene Experten zum Thema Continuous Delivery und DevOps befragt \u2013 wir wollten wissen, wie ihre Erfahrungen mit den eigenen Teams und Unternehmen verlaufen sind. Oft stellte sich heraus, dass die Technik an sich nicht das gr\u00f6\u00dfte Problem ist.'<\/p>\n<p><a href=\"https:\/\/entwickler.de\/devops\/cd-und-devops-im-expertencheck\"><img src=\"javamagazin.png\" alt=\"CD\/DevOps\" title=\"CD und DevOps im Expertencheck\"><\/a><\/p>"},{"title":"Warum wir auf DevOps setzen","link":"https:\/\/owehrens.com\/warum-wir-auf-devops-setzen\/","pubDate":"Thu, 01 Jun 2017 00:00:00 +0000","guid":"https:\/\/owehrens.com\/warum-wir-auf-devops-setzen\/","description":"<p>Die Konkurrenz ist gro\u00df, jeder will beim Ausliefern der Software der schnellste sein. Warum wir dabei auf DevOps setzen? Das sind die Argumente.<\/p>\n<p><a href=\"https:\/\/entwickler.de\/devops\/warum-wir-auf-devops-setzen\"><img src=\"javamagazin.png\" alt=\"Warum wir auf DevOps setzen\" title=\"Warum wir auf DevOps setzen\"><\/a><\/p>"},{"title":"2017-90 - Random Tech Links","link":"https:\/\/owehrens.com\/2017-90-random-tech-links\/","pubDate":"Fri, 31 Mar 2017 00:00:00 +0000","guid":"https:\/\/owehrens.com\/2017-90-random-tech-links\/","description":{}},{"title":"Service Discovery For Machines And Humans","link":"https:\/\/owehrens.com\/service-discovery-for-machines-and-humans\/","pubDate":"Wed, 01 Feb 2017 20:54:58 +0100","guid":"https:\/\/owehrens.com\/service-discovery-for-machines-and-humans\/","description":"<p>My slides from the OOP 2017 conference.<\/p>\n<ul>\n<li>Abstract:\n\n\n\n<script async class=\"speakerdeck-embed\" data-id=\"5c80e29228d147f9891b7918f6a3a021\" data-ratio=\"1.33333333333333\" src=\"\/\/speakerdeck.com\/assets\/embed.js\"><\/script>\n<\/li>\n<\/ul>\n<p>Combining Continuous Deployment and a Microservice architecture brings new challenges to develop and operate your platform. A service discovery enables you to build a flexible system. Developers need to have an up to date view on the deployed services as well. A human readable registry with relevant information is needed.\nI will outline what we solved with a Service Registry and what impact it had on our architecture. Furthermore I will show what we needed to give our developers to get an up to date view on the whole platform.<\/p>"},{"title":"Microservices bei der E-POST","link":"https:\/\/owehrens.com\/microservices-bei-der-e-post\/","pubDate":"Sun, 01 Jan 2017 00:00:00 +0000","guid":"https:\/\/owehrens.com\/microservices-bei-der-e-post\/","description":"<p>Microservices sind in aller Munde, und auf Konferenzen versprechen Migrationsszenarien und technische Details gut besuchte Vortr\u00e4ge. Eine Folie, die fast immer auftaucht, ist eine Feststellung von Melvin Conway aus dem Jahr 1968, die besagt, dass \u201eOrganisationen, die Systeme entwerfen, [\u2026] auf Entw\u00fcrfe festgelegt sind, welche die Kommunikationsstrukturen dieser Organisationen abbilden.\u201c (Conways Law). Das hei\u00dft konkret, dass sich die Organisation der Firma und der Teams \u00addirekt auf den Code und die Architektur auswirkt.<\/p>"},{"title":"Der Real-Life-Check","link":"https:\/\/owehrens.com\/der-real-life-check\/","pubDate":"Sun, 01 May 2016 00:00:00 +0000","guid":"https:\/\/owehrens.com\/der-real-life-check\/","description":"<p>\u00dcber Microservices wird momentan viel in Theorie geschrieben und gesprochen. Doch wie sieht es in der wahren Welt dort drau\u00dfen aus? Wir haben die Autoren dieses Themenschwerpunkts und weitere Experten aus der Branche gefragt, wie ihre Microservices-Erfahrungen aus der Praxis sind.<\/p>\n<p><a href=\"https:\/\/entwickler.de\/microservices\/der-real-life-check-001\"><img src=\"javamagazin.png\" alt=\"Der Real-Life-Check\" title=\"Der Real-Life-Check\"><\/a><\/p>"},{"title":"How is your microservice architecture doing?","link":"https:\/\/owehrens.com\/how-is-your-microservice-architecture-doing\/","pubDate":"Fri, 15 Jan 2016 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-is-your-microservice-architecture-doing\/","description":"<p>It all started when my new boss stepped into my door and asked me if I had a clue how our system was working. In an <strong>ideal world<\/strong> we would have teams and developers who work on a isolated context with clear boundaries. They develop, test, deploy, monitor and operate everything by themselves. They are on 24\/7 call and therefore they do everything possible that nothing fails. The system is stable and brings in the money.<\/p>"},{"title":"Entwicklung verteilter Systeme - Herausforderungen nicht nur an die Architektur","link":"https:\/\/owehrens.com\/entwicklung-verteilter-systeme-herausforderungen-nicht-nur-an-die-architektur\/","pubDate":"Tue, 29 Sep 2015 00:00:00 +0000","guid":"https:\/\/owehrens.com\/entwicklung-verteilter-systeme-herausforderungen-nicht-nur-an-die-architektur\/","description":"<p>This is my talk about <strong>Development of distributed systems - challenges not only for the architecture<\/strong>.\n\n\n You guessed it, it is in german. I gave this talk at <a href=\"http:\/\/bed-con.org\/2015\/talks\/Entwicklung-verteilter-Systeme---Herausforderungen-nicht-nur-an-die-Architektur\">BedCon 2015<\/a> and I will talk about it again at the <a href=\"http:\/\/www.the-architecture-gathering.de\/indexEN.php\">Architecture Gathering 2015<\/a> in Munich on October 22nd.\n\n<script async class=\"speakerdeck-embed\" data-id=\"af49bc1ea74b4fefaeaa3636c69542cd\" data-ratio=\"1.33333333333333\" src=\"\/\/speakerdeck.com\/assets\/embed.js\"><\/script>\n<\/p>\n<p>Abstract:<\/p>\n<p>Jede Platform w\u00e4chst mit der Zeit. Mehr Entwickler mit noch mehr Ideen und Vorstellungen arbeiten alle gemeinsam an der Weiterentwicklung. Das System wird gr\u00f6\u00dfer und auf viele Systeme verteilt. H\u00e4ufig wird ein Technologie Stack vorgegeben, um es vermeintlich wartbarer und stabiler zu machen. Zus\u00e4tzlich wird die Software oft dabei von Entwicklung zu QA weitergereicht und am Schluss von Operations deployed und betrieben. Das Ergebnis davon sind lange Releasezyklen und das verschenkte Potenzial, weil nicht die richtigen Tools genutzt werden konnten.<\/p>"},{"title":"Wider den Monolith - Am Ende wird alles gut","link":"https:\/\/owehrens.com\/wider-den-monolith-am-ende-wird-alles-gut\/","pubDate":"Thu, 06 Nov 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/wider-den-monolith-am-ende-wird-alles-gut\/","description":"My <a href=\"https:\/\/jax.de\/wjax2014\/sessions\/wider-den-monolith-am-ende-wird-alles-gut\">WJax 2014<\/a> talk in german.\n\nWider den Monolith - Am Ende wird alles gut. My first talk with lots of pictures. The talk was recorded. As soon as I know the url I will post it here (and if I'm not too embarrassed :) ).\n\nUpdate: Here is the <a href=\"https:\/\/vimeo.com\/114853516\">video<\/a> (in german).\n\n<script async class=\"speakerdeck-embed\" data-id=\"a4267b6047df01322ffa021a0fc4b210\" data-ratio=\"1.33333333333333\" src=\"\/\/speakerdeck.com\/assets\/embed.js\"><\/script>"},{"title":"Migrating a monolith","link":"https:\/\/owehrens.com\/migrating-a-monolith\/","pubDate":"Thu, 09 Oct 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/migrating-a-monolith\/","description":"<p>If you start, a monolith is much easier to begin with. Everything is in one place, it&rsquo;s fast and all team members understand the code.\nIf you plan your application from the start as distributed system in a microservice like style, you add some significant overhead. Don&rsquo;t do it, <a href=\"https:\/\/owehrens.com\/a-monolith-could-be-good-for-you\/\">monoliths have their advantages<\/a> at some point. If another team start with the same project or more functionality is added, splitting up the monolith might be a way to go. Looking at ways to migrate, you maybe can do some better  design decision to for you monolith.<\/p>"},{"title":"If you don't fight it you end up with a monolith","link":"https:\/\/owehrens.com\/if-you-dont-fight-it-you-end-up-with-a-monolith\/","pubDate":"Tue, 07 Oct 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/if-you-dont-fight-it-you-end-up-with-a-monolith\/","description":"<p>You planned your software. You talked to your business owners. As soon as you saw a new use case which should be implemented, you modularized it. You did everything right. And then you hit the integration layer. Sounds familiar?<\/p>\n<p>At some point in your project you need to integrate all modules with each other. In case of a website you need to produce HTML.<\/p>\n<p>There are different approaches how to tackle this problem. You can integrate it on the server side, grabbing all ui code from the affected systems and pack it together or you can integrate it in the browser.<\/p>"},{"title":"A Monolith could be good for you","link":"https:\/\/owehrens.com\/a-monolith-could-be-good-for-you\/","pubDate":"Mon, 06 Oct 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/a-monolith-could-be-good-for-you\/","description":"<p>Everybody says monolithic applications are bad. I usually hear things like:<\/p>\n<ul>\n<li>Tiny changes need full redeployment (maybe even with downtime)<\/li>\n<li>Limited agility<\/li>\n<li>Easy to get a big ball of mud<\/li>\n<\/ul>\n<p>So why would you like to have a monolith?<\/p>\n<p><img src=\"https:\/\/owehrens.com\/static\/monoliths.jpg\" alt=\"Monolith\"><\/p>\n<p>There are many definitions of a monolithic application. There are tons  for microservices.<\/p>\n<p>A Monolith has it&rsquo;s advantages. There are companies which are successful with monolithic applications.<\/p>\n<h1 id=\"you-start-faster\">You start faster.<\/h1>\n<p>It&rsquo;s one codebase. All in one editor. Only one team working on it. Why would you split that into multiple projects, thinking about interfaces and deployment? If you start with a new project I would recommend to do it just like that. Dealing with multiple services right from the start adds overhead and complexity which you can avoid.<\/p>"},{"title":"How you might know that you have a monolith","link":"https:\/\/owehrens.com\/how-you-might-know-that-you-have-a-monolith\/","pubDate":"Fri, 03 Oct 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-you-might-know-that-you-have-a-monolith\/","description":"<p>You start your green field project and keep working on it. It grows and grows and grows. You feel comfortable with it and it could not be better. Because more needs to be done\/the product is successful another team is added.<\/p>\n<p><img src=\"https:\/\/owehrens.com\/static\/monolith150150.jpg\" alt=\"Monolith\"><\/p>\n<p>If this <strong>new team starts<\/strong> complaining that the setup if very complicated and they do take a lot of time to get started:\n<strong>Listen carefully<\/strong>. Of course everybody will complain if they get thrown into another code base, nobody understands the code and of course everybody would have it done differently.<\/p>"},{"title":"How failing tests can be green","link":"https:\/\/owehrens.com\/how-failing-tests-can-be-green\/","pubDate":"Thu, 13 Feb 2014 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-failing-tests-can-be-green\/","description":"<p>Imagine this conversation:<\/p>\n<p><img src=\"https:\/\/owehrens.com\/static\/traffic-light-vector-icon.jpg\" alt=\"red\"><\/p>\n<p><em>Friend<\/em>: &ldquo;We have an integration system where we deploy every two weeks all commits and run hundreds of end to end tests on it.&rdquo;<\/p>\n<p><em>Me<\/em>: &ldquo;And if everything passed it goes into production?&rdquo;<\/p>\n<p><em>Friend<\/em>: &ldquo;Yes.&rdquo;<\/p>\n<p><em>Me<\/em>: &ldquo;How often do they fail?&rdquo;<\/p>\n<p><em>Friend<\/em>: &ldquo;Uhmm, well like every night. But we just take the failing tests and run them again and after that or the next run they will be green.&rdquo;<\/p>"},{"title":"Getting Faster","link":"https:\/\/owehrens.com\/getting-faster\/","pubDate":"Wed, 18 Dec 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/getting-faster\/","description":"My <a href=\"http:\/\/www.continuouslifecycle.de\/lecture.php?id=291\">Continuous Lifecycle 2013<\/a> talk. How we got faster at deploying our software.\n\n<script async class=\"speakerdeck-embed\" data-id=\"fd5eb9e02df501313a98663820a88a30\" data-ratio=\"1.77777777777778\" src=\"\/\/speakerdeck.com\/assets\/embed.js\"><\/script>"},{"title":"Mit Puppet und RPM","link":"https:\/\/owehrens.com\/mit-puppet-und-rpm\/","pubDate":"Mon, 01 Jul 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/mit-puppet-und-rpm\/","description":"<p>\u201eIt works on my machine\u201c hat sicher jeder schon einmal geh\u00f6rt. In der Entwicklung verh\u00e4lt sich die Software wie erwartet. Bis diese in der Produktion ist, dauert es lange. Einmal live, treten dann unerwartete Fehler auf, w\u00e4hrend die Softwareentwicklung l\u00e4ngst an einer ganz anderen Stelle ist. Wie kann dieser Spagat umgangen werden? Dieser Artikel reflektiert, wie wir mit diesem Problem auf Basis einer paketorientierten Deployment Pipeline umgehen.\n<a href=\"https:\/\/entwickler.de\/microservices\/der-real-life-check-001\"><img src=\"javamagazin.png\" alt=\"Mit Puppet und RPM\" title=\"Mit Puppet und RPM\"><\/a><\/p>"},{"title":"Doing a Sprint Review with a Review Fair","link":"https:\/\/owehrens.com\/doing-a-sprint-review-with-a-review-fair\/","pubDate":"Sun, 23 Jun 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/doing-a-sprint-review-with-a-review-fair\/","description":"<p>I&rsquo;m working in an organization where we do synchronized sprints between all teams. This means every two weeks all meeting rooms are booked for retrospectives and sprint plannings. If you have around 10-20 teams distributing knowledge what&rsquo;s happening in the other teams is tricky. No one has the time to go to all reviews.<\/p>\n<p>Enter &lsquo;Review Fair&rsquo;.<\/p>\n<p>The principle is quite simple. All teams show up in one (big) room. This might be the biggest meeting room you have. Every team presents for 3-5 minutes what they have done and why people should came afterwards and talk to them. They usually have some flipchart or laptop to show off stuff to lure the audicence.\nAfter the presentations everybody knows what everybody did and can go to those which did the most important stuff for each one in the audience.<\/p>"},{"title":"Using KVM and Virt-Manager via XQuartz on MacOSX (and solving the keymapping trouble)","link":"https:\/\/owehrens.com\/using-kvm-and-virt-manager-via-xquartz-on-macosx-and-solving-the-keymapping-trouble\/","pubDate":"Mon, 03 Jun 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/using-kvm-and-virt-manager-via-xquartz-on-macosx-and-solving-the-keymapping-trouble\/","description":"<p>In the last couple of months I got to play around with virtualization at work. Doing automated delivery pipleines and provisiong via puppet I decided it&rsquo;s time to get my hands even more dirty at home.<\/p>\n<p>I got myself a <!-- raw HTML omitted -->HP Microserver N54L<!-- raw HTML omitted --> equipped with 16 GB of RAM and 9 TB disks. I wanted ZFS and KVM. Since the machine has an AMD processor the only way was to install Linux on it. SmartOS would have been a nice choice but it only supports KVM for Intel processors.<\/p>"},{"title":"Getting started with veewee and vagrant","link":"https:\/\/owehrens.com\/getting-started-with-veewee-and-vagrant\/","pubDate":"Sun, 26 May 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/getting-started-with-veewee-and-vagrant\/","description":"<p>What do you need to do to get a fully automated kickstart of a virtual machine on your local development platform running? Not much it turns out. There are some tricks to get around but after that it&rsquo;s all fine.<\/p>\n<p>The resulting image can also be used to get a system in production.<\/p>\n<p>I will look at the OS installation part. Puppet will come in a later post.<\/p>\n<h1 id=\"installation\">Installation<\/h1>\n<p>Tools we will play with:<\/p>"},{"title":"From Development to Production","link":"https:\/\/owehrens.com\/from-development-to-production\/","pubDate":"Fri, 26 Apr 2013 00:00:00 +0000","guid":"https:\/\/owehrens.com\/from-development-to-production\/","description":"My <a href=\"http:\/\/bed-con.org\/2013\/talks\/\">BedCon 2013<\/a> talk. Covering commiting code, packaging,testing, deployment and organisational changes.\n\n<script async class=\"speakerdeck-embed\" data-id=\"e8470d7082450130e5211231381a9963\" data-ratio=\"1.33333333333333\" src=\"\/\/speakerdeck.com\/assets\/embed.js\"><\/script>"},{"title":"Do not use Javadoc","link":"https:\/\/owehrens.com\/do-not-use-javadoc\/","pubDate":"Fri, 27 Jul 2012 00:00:00 +0000","guid":"https:\/\/owehrens.com\/do-not-use-javadoc\/","description":"<p>Javadoc is here to help. To understand what the code does and how it works? Right?<\/p>\n<p>I don&rsquo;t think so. I confuses the heck out of me in most cases.<\/p>\n<p>When I look at code like<\/p>\n<pre tabindex=\"0\"><code>\/**\n* Version number of signature.\n*\/\npublic static final String SIGNATURE_VERSION = &#34;1&#34;;\n<\/code><\/pre><p>I get the feeling that the javadoc is pretty pointless. Well, the damn String is named what it is, how does the Javadoc help me here?<\/p>"},{"title":"Javascript testing for Java projects","link":"https:\/\/owehrens.com\/javascript-testing-for-java-projects\/","pubDate":"Thu, 12 Jul 2012 00:00:00 +0000","guid":"https:\/\/owehrens.com\/javascript-testing-for-java-projects\/","description":"<p>I&rsquo;m a Java Programmer. I do mostly web projects. There is a tendency to move away from server side frameworks towards Javascript (+mvc) and rest services. This now involves me in programming Javascript at the GUI level. Welcome <strong>maven<\/strong>, <strong>IDE<\/strong> and <strong>continous integration<\/strong>.<\/p>\n<p>Coming from the JVM world I&rsquo;m pretty much used to writing tests in my IDE running them and then writing the production code. What I found out, this is not that easy with Javascript. For obvious reason I need to run it in a browser. So I need to leave my IDE. Not convinient. If something fails I transfer that result back to my IDE and check what&rsquo;s going on. What about the different Javascript implementations? Ok, I need to run it on all browsers, Chrome, Firefox, Safari, IE \u2026 and the mobile versions maybe as well? Is this overkill? Is this managable?\nWhat about my CI run? I need to make sure only tested code gets checked in. Oh boy. This can be very frustrating.<\/p>"},{"title":"Realtime Push Events zum Browser","link":"https:\/\/owehrens.com\/realtime-push-events-zum-browser\/","pubDate":"Tue, 01 May 2012 00:00:00 +0000","guid":"https:\/\/owehrens.com\/realtime-push-events-zum-browser\/","description":"<p>WebSockets sind in aller Munde, im Java Magazin sind sie nun sogar Titelthema. Aber es geht auch einfacher: Wer Echtzeit-Events zum Browser schicken will, kann es sich leicht machen. Dieser Artikel zeigt, wie.<\/p>\n<p><a href=\"https:\/\/entwickler.de\/java\/realtime-push-events-zum-browser\"><img src=\"javamagazin.png\" alt=\"PushEvents\" title=\"Realtime Push Events zum Browser\"><\/a><\/p>"},{"title":"Cucumber-jvm for Java","link":"https:\/\/owehrens.com\/cucumber-jvm-for-java\/","pubDate":"Thu, 12 Apr 2012 00:00:00 +0000","guid":"https:\/\/owehrens.com\/cucumber-jvm-for-java\/","description":"<p>In an <a href=\"https:\/\/owehrens.com\/concordion-vs-cucumber-and-java-based-acceptance-testing\">earlier<\/a> article I compared cucumber (with Cuke4Duke) and Concordion. It was very cumbersome due to the ruby\/jruby jvm chain. Behold - the new <strong><a href=\"https:\/\/github.com\/cucumber\/cucumber-jvm\">cucumber-jvm<\/a><\/strong> was released. So how did it <strong>improve<\/strong> ?<\/p>\n<p>Cucumber-jvm has support for many languages, e.g. Scala, Groovy, Closure and of course Java. I will focus on <strong>Java<\/strong> and <strong>Maven<\/strong>.<\/p>"},{"title":"One assert per test, really","link":"https:\/\/owehrens.com\/one-assert-per-test-really\/","pubDate":"Tue, 14 Jun 2011 00:00:00 +0000","guid":"https:\/\/owehrens.com\/one-assert-per-test-really\/","description":"<p>Recently I was debugging my code and I could not see why my test was failing. It took me about 20 minutes to see that I violated one rule I try to follow. <!-- raw HTML omitted -->One assert per test<!-- raw HTML omitted -->.\n\n\nAfter <a href=\"http:\/\/twitter.com\/#!\/owehrens\/status\/78809340437467136\">tweeting<\/a> it I got some reaction ranging from 'this is a very silly guideline' to 'Tests should test one thing. Often one assertion, but not always.'. I, of course, tend to agree the latter one.\n\nSo <strong>what's in for you<\/strong> when you use one assert per test? What are the problems?\n<\/p>"},{"title":"Spring 3 MVC, Ajax and jQuery Magic (or better: simplicity)","link":"https:\/\/owehrens.com\/spring-3-mvc-ajax-and-jquery-magic-or-better-simplicity\/","pubDate":"Tue, 20 Jul 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/spring-3-mvc-ajax-and-jquery-magic-or-better-simplicity\/","description":"I'm playing around with some web frameworks lately and to see what's in store with Spring 3 MVC (never did too much with it) I gave it a try to see how it handles Ajax. According to <a href=\"http:\/\/blog.springsource.com\/2010\/01\/25\/ajax-simplifications-in-spring-3-0\/\">ajax simplification announcement<\/a> it should be possible to get up and running in (almost) no time.\n\n<p>We will do a simple web application which will show the current time via Ajax.\n\n\n\nThe directory layout (using maven) should look like this:<img alt=\"Directory Layout\" src=\"https:\/\/owehrens.com\/static\/Spring3MVCFiles.png\" title=\"Ajax result\" width=\"329\" height=\"308\" \/>\nweb.xml\n<\/p>"},{"title":"Busy Programmers Guide on where to buy eBooks","link":"https:\/\/owehrens.com\/busy-programmers-guide-on-where-to-buy-ebooks\/","pubDate":"Sat, 05 Jun 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/busy-programmers-guide-on-where-to-buy-ebooks\/","description":"<p>Every Programmer needs to read books. Usually you would get some packages from Amazon (or your favorite retailer) and read through them.\nNow with devices like the Kindle and iPad (and Nook and&hellip;) things will change. No more carrying around a couple of hundred pages of paper. Only some Megabytes on Gigabytes of storage. The displays nowadays are good enough and the battery is not a problem for the most part.<\/p>"},{"title":"How to detect if your server is down when making jQuery Ajax calls ","link":"https:\/\/owehrens.com\/how-to-detect-if-your-server-is-down-when-making-jquery-ajax-calls\/","pubDate":"Mon, 26 Apr 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-to-detect-if-your-server-is-down-when-making-jquery-ajax-calls\/","description":"<p>If you developed an <!-- raw HTML omitted -->ajax rich web application<!-- raw HTML omitted -->, maybe even a single page interface, you want to make sure that the user gets <!-- raw HTML omitted -->notified<!-- raw HTML omitted --> if the server is <!-- raw HTML omitted -->not reachable<!-- raw HTML omitted --> anymore. This happens either if the it goes down or the client loses its network connection.\nDepending on your code the application can run for a while and the <!-- raw HTML omitted -->user is confused<!-- raw HTML omitted --> about missing interactivity.<\/p>"},{"title":"Lightweight Web Prototyping for the Framework loving (Java) Developer","link":"https:\/\/owehrens.com\/lightweight-web-prototyping-for-the-framework-loving-java-developer\/","pubDate":"Tue, 20 Apr 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/lightweight-web-prototyping-for-the-framework-loving-java-developer\/","description":"<p>A couple of month ago I had an idea for a small web app. But what does it take to do it ? Do you start with the back end or the front end (read server or client side) ? Typically I would start at the back end, get the domain right and then see how I can fit the UI in. If a programmer starts this way you end with the typical &rsquo;the programmer did the GUI&rsquo; scenario. That&rsquo;s not really what I wanted. Don&rsquo;t think too much about the domain, just see what the needs of the end user are and get the UI done (right).<\/p>"},{"title":"How we switched from Subversion to Git","link":"https:\/\/owehrens.com\/how-we-switched-from-subversion-to-git\/","pubDate":"Mon, 22 Mar 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-we-switched-from-subversion-to-git\/","description":"<img class=\"alignleft\" src=\"http:\/\/git.wiki.kernel.org\/images-git\/2\/24\/Gitlogo.svg_from_msysGit.png\" title=\"\u00c2\u00ac\u00c2\u00a9 GitLogo @ mssysgit\"  \/>\nSo I heard about these strange <strong>distributed version control system<\/strong>s like over a year ago. I used it in my own little projects and everything went smoothly and I really liked it.\nThe idea also caught on at work and my team started a using Git in a fresh project last summer. We did not had so much problems since you can use Git very much like a central vcs like Subversion if you want to.\n\nStill, for all other code, we <strong>used Subversion<\/strong>.\nWe believe in agile and feature branches, so that's what we do a lot. Every story has its own branch. If one story touches multiple code bases, that means multiple <a href=\"http:\/\/www.infoq.com\/articles\/agile-version-control\">merge down\/copy up's<\/a>.  \nAt some point, in preparation for a sprint review, we found that code had disappeared from the trunk. Everything seems to work perfectly, just this feature was missing. Usually you would think if code was deleted, there would be at least one test failing and telling you that something is missing. But no, typing <strong>one wrong version number<\/strong> during merge down\/copy up <strong>cut out the story<\/strong> very cleanly. Once we found the problem we could merged it back in from the not yet deleted feature branch.\nOverall we managed to work with Subversion but it was a growing pain since we knew there was something better.\n\nThere are several advantages of distributed version control system which you all might have heard of already so I won't go in to detail of this (of course there is also one major disadvantage: complexity). The <strong>main advantages<\/strong> for me are:\n\n<!-- more -->\n\n<ul>\n<li>Everything is local - very fast<\/li>\n<li>Merging is much much easier (or updating from another repo)<\/li>\n<li>Because merging is easier I tend to branch more often to try out ideas<\/li>\n<\/ul>\n\nNow, what does it take for my team to get Git going in all major code bases?\n\n<h1 id=\"technology\">Technology<\/h1>\n<p>Here is our setup what we use at work:<\/p>"},{"title":"5 code metrics you need to watch","link":"https:\/\/owehrens.com\/5-code-metrics-you-need-to-watch\/","pubDate":"Tue, 23 Feb 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/5-code-metrics-you-need-to-watch\/","description":"<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><\/p>\n<p>Developing software ain&rsquo;t easy.<\/p>\n<p>How do you know how you are doing ?<\/p>\n<p>You could start <!-- raw HTML omitted -->collecting metrics<!-- raw HTML omitted --> about your code. These can give you some indication how maintainable and reliable it is.<\/p>\n<p>The metric which come to mind to the most people is <!-- raw HTML omitted -->code coverage<!-- raw HTML omitted -->. Some people say it must be near 100%, other say 80% is a good number. At the end it can&rsquo;t tell you if you are doing great or good. The only thing you might read from it is that a <!-- raw HTML omitted -->low number<!-- raw HTML omitted --> indicates a <!-- raw HTML omitted -->potential problem<!-- raw HTML omitted -->.<\/p>"},{"title":"Name your objects right","link":"https:\/\/owehrens.com\/name-your-objects-right\/","pubDate":"Tue, 09 Feb 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/name-your-objects-right\/","description":"<p>Whenever you create an object you have to find a meaningful name.<\/p>\n<p>While renaming later in modern IDE&rsquo;s is no problem at all you should not pick the first name which comes to your mind.<\/p>\n<p>Imagine you have an external fraud detection web service and it will return a &lsquo;hit&rsquo; or &lsquo;miss&rsquo;. How do you name this object? HitOrMiss maybe (since this is the representation you get from the webservice) ? It might describe the problem at hand. If you go with this name it will dripple down through all layers. The domain model, the dto&rsquo;s, services and more will now reference to this object (and create their own derivates for it). Your colleagues which code up other parts of the system will refer to it and create their own variants of the name (like structure for web pages). The wrong name is now all over your code.<\/p>"},{"title":"One year of blogging","link":"https:\/\/owehrens.com\/one-year-of-blogging\/","pubDate":"Sat, 06 Feb 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/one-year-of-blogging\/","description":"One year ago I started to blog again. Time for a little recap.\n\n<strong>Why did I do it ?<\/strong>\n\nI use this blog to write down my own thoughts about software and development. This is for my own reference but also it is a little way to give something back to the world wide community in return for all the useful stuff I do read on the net.\n\nI noticed how this also made me a <a href=\"http:\/\/www.joergm.com\/2010\/01\/why-all-programmers-should-blog\/\">better programmer<\/a>. Try it out by yourself. Having a professional blog is also a good way for <a href=\"http:\/\/www.chrisbrogan.com\/develop-a-strong-personal-brand-online-1\/\">Personal branding<\/a>.\n\n<p\/>\n<strong>Stats for the last 12 months<\/strong>\n\nI love number so here they are:\n\nAbout 15.000 unique visitors\nAbout 20.000 pageviews\n\n<p\/>\n<em>Traffic<\/em>\n\n20.64 % Direct Traffic\n36.34 % Referring Sites\n42.44 % Search Engines\n\nHighest page views on one day: the <a href=\"https:\/\/owehrens.com\/using-selenium-2-for-web-testing\/\">Selenium 2<\/a> post, 620 pageviews (ok, this was big link of the day at dzone.com).\n\n<p\/>\n<em>Countries<\/em>\n\nI had visitors from 120 countries.\n\n3362 visitors from United States\n2090 visitors from Germany\n776 visitors from United Kingdom\n\n<p\/>\n<em>Top posts<\/em>\n\n<a href=\"https:\/\/owehrens.com\/getting-the-browsers-geolocation-with-html-5\/\">GeoLocation with HTML5<\/a> 2670 pageviews\n<a href=\"https:\/\/owehrens.com\/getting-started-with-jsf-2-and-maven\/\">JSF 2 and maven<\/a> 2607 pageviews\n<a href=\"https:\/\/owehrens.com\/using-selenium-2-for-web-testing\/\">Selenium 2<\/a> and <a href=\"https:\/\/owehrens.com\/concordion-vs-cucumber-and-java-based-acceptance-testing\/\">Concordion vs. Cucumber<\/a> each 1566 pageviews\n\n<p\/>\nI have 142 RSS subscribed readers.\n\n<p\/>\nAll in all, not too shaby ;-).\n\n<strong>Thanks<\/strong>\n\nThanks to everybody for reading my thoughts. Thanks for the comments and hints.  \n\nI'm looking forward to the next year. It is going to be a great one."},{"title":"What's your preferred development infrastructure stack?","link":"https:\/\/owehrens.com\/whats-your-preferred-development-infrastructure-stack\/","pubDate":"Wed, 13 Jan 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/whats-your-preferred-development-infrastructure-stack\/","description":"In Response to <a href=\"http:\/\/raibledesigns.com\/rd\/entry\/what_s_your_preferred_development\">Matt Raible's<\/a> question about my preferred development stack.\n\n<h3 id=\"source-control\">Source control<\/h3>\n<p>In my own development project I switched to <!-- raw HTML omitted -->Git<!-- raw HTML omitted --> some time ago. I was using svn and before that cvs for a couple of years. Git just makes it easy to try out small ideas very quickly without reverting the code. We will introduce Git at work pretty soon (I hope).<\/p>"},{"title":"Using Selenium2 for web testing (and not Selenium IDE)","link":"https:\/\/owehrens.com\/using-selenium2-for-web-testing-and-not-selenium-ide\/","pubDate":"Mon, 04 Jan 2010 00:00:00 +0000","guid":"https:\/\/owehrens.com\/using-selenium2-for-web-testing-and-not-selenium-ide\/","description":"<h3 id=\"selenium-ide\">Selenium IDE<\/h3>\n\n\n\n<a href=\"http:\/\/seleniumhq.org\">Selenium<\/a> is well know for automatic testing web pages. It does support many <a href=\"http:\/\/seleniumhq.org\/about\/platforms.htm\">browsers, operating systems and languages<a\/>. A <a href=\"http:\/\/seleniumhq.org\/projects\/ide\/\">Selenium IDE<\/a> exists to aid you creating automated tests.\n\n<img alt=\"Selenium\" src=\"https:\/\/owehrens.com\/static\/selenium.png\" title=\"Selenium IDE\" width=\"303\" height=\"177\" \/>\n\nIt is possible to write extensions in JavaScript to have data driven tests. If you organize your selenium tests in a way that you split  the pages and forms in components, you can  load up new data for the tests (written in xml) to fill out forms differently for each use case. The Selenium IDE will be of a great help here since you start develop the tests in the IDE and later 'just' parametrize the pages. With a couple of more javascript magic you can run these as well in <a href=\"http:\/\/seleniumhq.org\/projects\/remote-control\/\">Selenium Remote Control<\/a> (Selenium RC for short). This even works for running  the tests in continuous integration systems like Hudson or Teamcity.\n\nGreat Stuff.\n\n<h3 id=\"the-problem\">The problem.<\/h3>\n<p>The drawback coding up your tests with the Selenium IDE is: <!-- raw HTML omitted -->HTML<!-- raw HTML omitted -->.<\/p>"},{"title":"Story based daily stand-up meeting","link":"https:\/\/owehrens.com\/story-based-daily-stand-up-meeting\/","pubDate":"Fri, 25 Dec 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/story-based-daily-stand-up-meeting\/","description":"<p>We are agile. We do Scrum. We do daily Stand-ups.<\/p>\n<p>A couple of weeks ago we changed our daily stand-up meeting. Our Scrum master came up with the idea to not go around the whole team and everybody talks about what he has done, what he will do and what the impediments are but to make it story based.<\/p>\n<p>Usually after a break down everybody was working on one story, saw the task cards and made sure he did the things he was supposed to do. But this is not enough. You need to have an overview of the whole story (and the sprint). Only with that knowledge you can make sure you will meet the commitment.<\/p>"},{"title":"Integrate early, integrate often","link":"https:\/\/owehrens.com\/integrate-early-integrate-often\/","pubDate":"Sat, 28 Nov 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/integrate-early-integrate-often\/","description":"<p>You are doing scrum, your story is big, you really don't know much about it and the feature does not get implemented in time.<\/p>\n<p>Sounds familiar ?<\/p>\n<p>I had this a couple of times.<\/p>\n<p>What turned out to be a real problem is that, tech nerds as we are, we spent most of the time coding up a nice solution (and we were almost always convinced that this was the minimum we should have done). What we <strong>underestimated<\/strong> was the <strong>time<\/strong> we would need <strong>to integrate<\/strong> it with the rest of the system. When we broke new ground integrating new technologies it turned out is is very easy to miss that point.<\/p>"},{"title":"Concordion vs. Cucumber and Java based Acceptance Testing","link":"https:\/\/owehrens.com\/concordion-vs.-cucumber-and-java-based-acceptance-testing\/","pubDate":"Tue, 13 Oct 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/concordion-vs.-cucumber-and-java-based-acceptance-testing\/","description":"<p>If you want your Business Analyst to provide some acceptance tests for your implementation it would be best to make sure you get it in some form your tests can read. That way you can make sure your code does really do that what the customers wants.\n\n\nTwo tools to achieve that are <a href=\"http:\/\/www.concordion.org\">Concordion<\/a> and <a href=\"http:\/\/cukes.info\">Cucumber<\/a> (and cuke4duke).  Both taking the approach of <a href=\"http:\/\/c2.fit.com\">Fit<\/a> a step further. You can find very good documentation for the tools on their web pages or as examples along with the code.\n<\/p>"},{"title":"Test JBoss Rules 5 (or Drools) with TestNG","link":"https:\/\/owehrens.com\/test-jboss-rules-5-or-drools-with-testng\/","pubDate":"Wed, 23 Sep 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/test-jboss-rules-5-or-drools-with-testng\/","description":"We have been using our own flavor of <a href=\"http:\/\/fit-for-rules.sourceforge.net\/\">Fit for Rules<\/a> (which is build on top of <a href=\"http:\/\/fit.c2.com\">fit<\/a>) for about 1 1\/2 years now to test our business logic written in <a href=\"http:\/\/jboss.org\/drools\/\">JBoss Rules 5<\/a>.  It's relatively  easy to get the<strong> Business Analyst<\/strong> on board since he is using his tool (which is Microsoft Excel) to communicate test cases for the rules. So in theory, he writes the tests in <strong>Excel<\/strong>, we do the rules coding and voila, all <strong>tests turn green<\/strong>.\n\n<p>Reality is, we have to<!-- raw HTML omitted --> tweak the Excel sheets<!-- raw HTML omitted -->. We need to put in imports of our fact model, insert facts and create objects within that not so programmer friendly table environment. A couple of days ago we got the request to tweak some rules and we all had to start doing rules again (and we used to use Eclipse for writing rules because that&rsquo;s the only IDE having a plugin for that).<\/p>"},{"title":"How pair programming can help you to get into Test Driven Development","link":"https:\/\/owehrens.com\/how-pair-programming-can-help-you-to-get-into-test-driven-development\/","pubDate":"Sun, 13 Sep 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-pair-programming-can-help-you-to-get-into-test-driven-development\/","description":"At my current job management buys into Test driven development. It slowly starts to become our primary development style.\n\nSome <strong>advantages<\/strong> of TDD for me are:\n\n<ul>\n<li>Focus on problem solution<\/li>\n<li>No unnecessary development for use cases dreamed up by the developer<\/li>\n<li>Always make sure your code fulfills the requirements (tests)<\/li>\n<li>If you have tests you can safely refactor your code at any time<\/li>\n<\/ul>\n\nEven though we all knew about the advantages of TDD, we figured out that we do <strong>not always write tests first<\/strong>. While this might me acceptable in some situations like UI tests, most of the time it is not desired.\nAfter seeing that problem for a couple of weeks (and always wondering how I did not write test first) all of the sudden I realized why sometimes it was easier to develop code with writing tests first and sometimes I just simply did not thought about it and had to write the tests later.\n\n<strong>It's simply because of pair programming<\/strong>.\n\nWhat certainly happens to me  when coding alone, is that  sometimes I get into 'crunch' mode too fast. With a second person to slow me down, we are discussing the problem and make sure we both have the same understanding of  what we are trying to achieve. During this process it is much clearer what needs to be done and what the goals are. This is a very important step. If I'm all by myself, I start writing down some classes, look at methods and I'm already thinking in code and not about the problem. Once you <strong>know what the real problem is<\/strong>, it is very easy to start writing your tests first. It helped me a lot.\n\nWhere pairing also helps is to <strong>focus<\/strong> both programmers <strong>to stay in TDD mode<\/strong>. Once the driver of the pair programming couple starts to hack away code, the other will remind him to write the tests first. This is a very valuable.\n\nAfter a while I got better at test driven development, even programming alone.\n\nSo if you recognize that you do not write tests first (but you want to) and you yet again don't know how that happened, try pair programming. You learn how to start  with TDD (and get used to it)  and get all the benefits of pair programming as well."},{"title":"4 ways to test your code","link":"https:\/\/owehrens.com\/4-ways-to-test-your-code\/","pubDate":"Thu, 20 Aug 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/4-ways-to-test-your-code\/","description":"<p>Whenever you write some code you better make sure you have it covered by some tests. There are different possibilities on how to achieve this (and you might want to use all of them).<\/p>\n<h1 id=\"unit-tests\">Unit Tests<\/h1>\n<p>Unit tests are a classic. You usually write them while you code. Write tests, run failing test, write code and run passing test. Repeat. Keep this <!-- raw HTML omitted -->small and simple<!-- raw HTML omitted -->. Test the smallest unit which makes sense. You might end up with hundreds if not thousands of them. Make sure you have no external dependencies in them, like databases or external webservices. <!-- raw HTML omitted -->Mock<!-- raw HTML omitted --> them away. They are usually written in TestNG or JUnit.\nThese tests can run at every check in in the VCS.<\/p>"},{"title":"How to get your developers to pay more attention to the burn down chart (and have fun)","link":"https:\/\/owehrens.com\/how-to-get-your-developers-to-pay-more-attention-to-the-burn-down-chart-and-have-fun\/","pubDate":"Wed, 05 Aug 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-to-get-your-developers-to-pay-more-attention-to-the-burn-down-chart-and-have-fun\/","description":"<p>For the last couple of month our scrum master always drew our daily burn down chart. Nice and fine and it always happened automagically. It came to the point that we (the developers) only occasionally paid attention to it (a little less then we should). One day our scrum master stopped doing it and forced us to do by ourselves. While it seemed a bit strange at first it turns out it was a brilliant idea.<\/p>"},{"title":"Two upgrades to cut down development time","link":"https:\/\/owehrens.com\/two-upgrades-to-cut-down-development-time\/","pubDate":"Fri, 24 Jul 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/two-upgrades-to-cut-down-development-time\/","description":"<p>No matter how good  a developer is, with two hardware upgrades you can speed up most machines and cut down development time for everybody.<\/p>\n<h2 id=\"your-big-fat-ide\">Your big fat IDE<\/h2>\n<p>Depending what you use to crunch out your code, these things are eating your memory. And then you have your application server running, and an internet browser with 20+ sessions, plus Twitter, plus Photoshop, plus, plus, plus.<\/p>\n<p>I used to have 2 GB RAM in my laptop and I thought it is ok. Turns out, having 4 GB,  speeds up my overall development significantly. No more swapping of programs and more programs can stay open. So far I never reached the point where my memory was exhausted (well I never really tried).<\/p>"},{"title":"Getting started with JSF 2 (and Maven)","link":"https:\/\/owehrens.com\/getting-started-with-jsf-2-and-maven\/","pubDate":"Fri, 03 Jul 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/getting-started-with-jsf-2-and-maven\/","description":"<p>I use Apache Trinidad at work and since JSF 2 is now final I decided to play with it a bit.<\/p>\n<p>Of course this is going to be the classic Hello World example (as there are many other like this around the web).<\/p>\n<p>First you need to setup a simple Maven project.<\/p>\n<p>The file layout should be something like that.\n\n\n<img alt=\"Directory Layout for JSF 2 Ajax Demo\" src=\"https:\/\/owehrens.com\/static\/JSF2AjaxDemoFileLayout.png\" title=\"Directory Layout for JSF 2 Ajax Demo\" width=\"290\" height=\"234\" \/>\n\n\nAfter that change your pom.xml to include the servlet and jsf2 libs.<\/p>"},{"title":"Update on Quant TestTester","link":"https:\/\/owehrens.com\/update-on-quant-testtester\/","pubDate":"Thu, 25 Jun 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/update-on-quant-testtester\/","description":"<p>Here is a small update on my little fun project.<\/p>\n<p>I released version 0.2 of quant. Now it will recognize all TestNG annotations which do not have a TestNG group (like @BeforeMethod, @BeforeClass etc.). The method &lsquo;reportViolation&rsquo; on ClassTester will now report whats wrong with the examined class.<\/p>\n<div class=\"highlight\"><pre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"><code class=\"language-java\" data-lang=\"java\"><span style=\"display:flex;\"><span> assertFalse(classTester.<span style=\"color:#a6e22e\">isInvalidTestClass<\/span>(),\n<\/span><\/span><span style=\"display:flex;\"><span>    classTester.<span style=\"color:#a6e22e\">reportViolation<\/span>());\n<\/span><\/span><\/code><\/pre><\/div><p>Above code will now report:<\/p>\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n<p>In this way you know what went wrong and where to look for it.\n\n\nQuant is now also available in my <a href=\"http:\/\/maxheapsize.com\/maven2\/com\/maxheapsize\/quant\/\">repository<\/a>. To include it add the following code to your pom.xml.\n\n[xml]\n<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->com.maxheapsize<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->quant<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->0.2<!-- raw HTML omitted -->\n<!-- raw HTML omitted -->\n[\/xml]<\/p>"},{"title":"Quant - Check your Tests","link":"https:\/\/owehrens.com\/quant-check-your-tests\/","pubDate":"Sat, 30 May 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/quant-check-your-tests\/","description":"<p>\n\n<img src=\"https:\/\/owehrens.com\/static\/QuantLogo.png\" class=\"alignleft\"\/>Did you ever wondered if all tests your team wrote are <strong>really running<\/strong> ? How many <strong>disabled tests<\/strong> does your code base have? How many public void methods <strong>do not have a @Test<\/strong> annotation (or at the class) ?\n\nI saw all of that in the last years.<\/p>\n<p>To overcome this situation I wrote a couple of java classes which will scan your java test sources and will examine the annotations (for TestNG, sorry JUnit). The code will detect if all public void methods do have a<code> @Test<\/code> annotation (either direct on the method or on the class) or if there are disabled tests. Both signals are most likely a sign of rotten code.<\/p>"},{"title":"Jetbrains released a Google App Engine plugin for IntelliJ","link":"https:\/\/owehrens.com\/jetbrains-released-a-google-app-engine-plugin-for-intellij\/","pubDate":"Fri, 08 May 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/jetbrains-released-a-google-app-engine-plugin-for-intellij\/","description":"Jetbrains <a href=\"http:\/\/plugins.intellij.net\/plugin\/?id=4254\">released a Google App Engine plugin<\/a> for their IntelliJ IDE. I did not see any announcement about this at all.\n\n<img alt=\"New project inside IntelliJ for Google App Engine\" src=\"https:\/\/owehrens.com\/static\/intellijgaej.png\" title=\"New project inside IntelliJ for Google App Engine\" width=\"533\" height=\"93\" \/>\n\n\nYou will have a new option when creating a new project. After supplying the path to the local app engine SDK your almost good to go. I needed to add the app engine jars as libraries to my project. That being out of the way you can start coding, run you local server (a pre configured run configuration is supplied) and also deploy it to Google all from within IntelliJ. I tested it with a very basic example with local development and remote deployment and this works really nice.\n\nThanks Jetbrains.\n\nFrom the release notes:\n\nThis plugin provides the following features:\n\n<ul>\n\t<li>option on \"Technologies\" page of the module wizard to quickly create:\n<\/li>\n<ul>\n\t<li>appengine-web.xml descriptor\n<\/li>\n\t<li>App Engine Facet\n<\/li>\n\t<li>App Engine Dev server run configuration\n<\/li>\n<\/ul>\n\n\t<li>inspection to report forbidden code in App Engine application\n<\/li>\n\t<li>run configuration for Google App Engine Dev server\n<\/li>\n\t<li>action for uploading an application to Google (Tools | Upload App Engine Application)\n<\/li>\n<\/ul>"},{"title":"IntelliJ Idea Plugin Property Sorter updated","link":"https:\/\/owehrens.com\/intellij-idea-plugin-property-sorter-updated\/","pubDate":"Tue, 05 May 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/intellij-idea-plugin-property-sorter-updated\/","description":"I'm pretty busy at work right now but I could find some time to add one more feature to my little property sorter plugin for IntelliJ Idea.\n\nComments above property entries will now be preserved when you sort the file.\n\nThe plugin is available from within Idea or at <a href=\"http:\/\/code.google.com\/p\/ideapropertysorterplugin\/downloads\/list\">Google Code<\/a>.\n\n<img alt=\"From unsorted ...\" src=\"https:\/\/owehrens.com\/static\/CommentPropertyUnsorted.png\" title=\"From unsorted ...\" width=\"199\" height=\"133\" \/>\n\n<img alt=\"... to sorted with comments.\" src=\"https:\/\/owehrens.com\/static\/CommentPropertySorted.png\" title=\"... to sorted with comments.\" width=\"203\" height=\"143\" \/>"},{"title":"How to test Spring Webflow 2 (with parent flows)","link":"https:\/\/owehrens.com\/how-to-test-spring-webflow-2-with-parent-flows\/","pubDate":"Mon, 20 Apr 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-to-test-spring-webflow-2-with-parent-flows\/","description":"<p>In the last couple of month I was writing some flows using Spring Webflow 2. I knew that I (in theory) I could test them but I never did. The overall documentation of Webflow 2 is not that great at the moment, so I hope to improve that a little bit.<\/p>\n<p>Spring Webflow 2 supports only JUnit tests so far. I guess this will change at some point  but until then you have to pull out that junit.jar again.<\/p>"},{"title":"Getting the Browsers GeoLocation with HTML 5","link":"https:\/\/owehrens.com\/getting-the-browsers-geolocation-with-html-5\/","pubDate":"Sat, 11 Apr 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/getting-the-browsers-geolocation-with-html-5\/","description":"Until now it was almost impossible to get the <strong>GeoLocation<\/strong> of a user browsing your site. You could try to use several services to more or less guess the current position. Most of the time they where using the IP address to tackle the problem. This was <strong>not very reliable<\/strong> when it came to mobile devices.\n\nEver since the iPhone hit the market mobile adoption of the web grew exponentially. Google threw in Android and I'm sure some Windows Mobile phones do have GPS as well.  According to some talks at <a href=\"http:\/\/www.re-publica.de\">re:publica 09<\/a> the big telco carriers such as T-Mobile and Vodafone see their <strong>future in the mobile (geolocation aware) web<\/strong>.\n\nEven though these devices had the capabilities to get the current location,  website developers are still facing the problem that they can <strong>not access the positioning hardware of the phone<\/strong>. There was almost no way for (mobile) web developers to get the location of the user. There are some solution out there but you needed to install extra software which is not always possible on a phone.\n\nFortunately W3C is working on the <b><a href=\"http:\/\/dev.w3.org\/html5\/spec\/Overview.html\">HTML 5<\/a><\/b> standard which includes JavaScript <b>access to the <a href=\"http:\/\/dev.w3.org\/geo\/api\/spec-source.html\">browsers location<\/a><\/b> (at least I hope it will be included). The latest beta of <a href=\"http:\/\/en-us.www.mozilla.com\/en-US\/firefox\/3.1b3\/releasenotes\/\">Firefox 3.1 (beta3)<\/a> already supports that API.   If you don't have a GPS system in your computer you can install an <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/8420 \">addon<\/a> to set your location. Rumors has it that Apple will release the upcoming <strong>iPhone 3.0<\/strong> OS with a location aware browser and Google will do the same with one of the next updates of <strong>Android<\/strong>.\n\nTo test that I wrote a small <a href=\"https:\/\/owehrens.com\/static\/html5geolocationdemo.html\">geolocation aware demo webpage<\/a> with some JavaScript to pull out the information. If you are accessing it with Firefox 3.1b3+ (plugin installed and configured with your position) you will be prompted for unveiling your location to the website. If you do so it will show you your current position on the map and print out the address.\n<img alt=\"Allow access to the browsers GeoLocation\" src=\"https:\/\/owehrens.com\/static\/html5geolocation01.jpg\" title=\"Allow access to the browsers GeoLocation\" width=\"490\" height=\"482\" \/>\n\n<img alt=\"Showing the GeoLocation of the Browser\" src=\"https:\/\/owehrens.com\/static\/html5geolocation02.jpg\" title=\"Showing the GeoLocation of the Browser\" width=\"490\" height=\"527\" \/>\n\nTo access this information all you need to do is:\n\n``` javascript\n    function showMap(position) {\n      \/\/ Show a map centered at\n      \/\/ (position.coords.latitude, position.coords.longitude).\n    }\n    \/\/ One-shot position request.\n    navigator.geolocation.getCurrentPosition(showMap);\n```\n\n\nOnce this feature is widely available in mobile browsers (I do hope for this summer) my bet is that we will see a whole bunch of websites doing all sort of crazy things with these information. I'm a big Location Based Services (LBS) fan and I can't wait to see people taking advantage of this.\n\n <strong>Update<\/strong> Firefox 3.5.x uses Google's Geolocation service if no other way can be used. This is halfway accurate. It gathers information about nearby wireless access points and your computer's IP address. No more plugin needed."},{"title":"A Quick Look at Google App Engine for Java","link":"https:\/\/owehrens.com\/a-quick-look-at-google-app-engine-for-java\/","pubDate":"Wed, 08 Apr 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/a-quick-look-at-google-app-engine-for-java\/","description":"<img alt=\"\" src=\"https:\/\/owehrens.com\/static\/appengine.gif\" class=\"alignleft\" width=\"145\" height=\"111\" \/>At <a href=\"http:\/\/code.google.com\/campfire\/\">Campfire One<\/a> Google <a href=\"http:\/\/googleappengine.blogspot.com\/2009\/04\/seriously-this-time-new-language-on-app.html\">announced<\/a> their App Engine for Java (this was in the rumor mill for a couple of days already). The first 10,000 developers would get an early look at App Engine's Java language support. I would have almost missed it. Some tweets reminded me of registering with Google. I heard of AppEngine before but the fact that it was only available for Python did not make it very attractive to me. Now the game changed a bit with introducing Java (and <a href=\"http:\/\/groups.google.com\/group\/google-appengine-java\/web\/will-it-play-in-app-engine\">other JVM languages<\/a> (JRuby, partial Scala ...), well <a href=\"http:\/\/blog.springsource.com\/2009\/04\/07\/write-your-google-app-engine-applications-in-groovy\/\">Groovy<\/a> for sure, <a href=\"http:\/\/olabini.com\/blog\/2009\/04\/dynamic-languages-on-google-app-engine-an-overview\/\">Ola Bini<\/a> has more on that).\n\nAfter <a href=\"http:\/\/appengine.google.com\/\">registering<\/a> with my Google ID they wanted to verify my account with a sms text message. Google is just listing  3 countries and then 'Other' for sms verification and I expected it would not work with a german cellphone. But it did ;-).\n\nThe <a href=\"http:\/\/code.google.com\/appengine\/docs\/java\/gettingstarted\/\">Tutorials<\/a> on their site are working nicely (even if you don't have Eclipse which they are always referring to). Just follow the instructions step by step, use ant and the command line to get through the examples. Don't copy the template project, this is not in line with the documentation.\n\nIn the last hour or so I went from nothing to a running <a href=\"http:\/\/maxheapsize.appspot.com\/\">Guestbook App at Google (try it!)<\/a>. Once you get the environment right, the code is pretty straight forward.\n\nI see a couple of things which I do like about the App Engine.\n\n<strong>Support for Google Id and Sign In<\/strong>\nAppEngine support sign in with an Google ID with 2! lines of code. Great. I don't want to worry about that (this generates the Google login page and redirects).\n<pre name=\"code\" class=\"java\">\nUserService userService = UserServiceFactory.getUserService();\nUser user = userService.getCurrentUser();\n<\/pre>\n\n<strong>Automagic Persistence<\/strong>\nWith simple annotation you persist your objects. No mapping, no nothing. You can configure if you want to be using JDO or JPA. No database hassle or whatsoever. Of course it needs to be seen how this work with more complex domain models.\n\n``` java\n@PersistenceCapable(identityType = IdentityType.APPLICATION)\n..\n    @PrimaryKey\n    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)\n    private Long id;\n\n    @Persistent\n    private User author;\n\n    @Persistent\n    private String content;\n\n    @Persistent\n    private Date date;\n...\n```\n\n<strong>Local Development - Remote Depolyment<\/strong>\nEverything works locally. If you deploy it to Google it uses the Google facilities. I don't have to worry (deployment is one ant command).\n\n<strong>Scalability and free Use<\/strong>\nIf your application is successful you can grow with Google. More Resources at your fingertips. Of course this costs money (but you should make money at this point right?). If you are beyond the <strong>free<\/strong> 10 GB bandwidth in\/day, 10 GB bandwidth out\/day, 5 million pageviews a month, 46.3 cpu h\/day and 1000 emails\/day you pay:\n\n<ul>\n<li>CPU Time \t$0.10\/CPU hour <\/li>\n<li>Bandwidth Out $0.12\/GByte <\/li>\n<li>Bandwidth In $0.10\/GByte <\/li>\n<li>Stored Data $0.005\/GByte-day<\/li>\n<li>Recipients Emailed $0.0001\/Email <\/li>\n<\/ul>\n\n<strong>Monitoring<\/strong>\nYou get nice and detailed overview of the status of you application. You can upload new version any time and go live on demand.\n<img alt=\"Google AppEngine Dashboard\" src=\"https:\/\/owehrens.com\/static\/GoogleAppEngineDashboard.jpg\" title=\"Google AppEngine Dashboard\" width=\"450\" height=\"303\" \/>\n\nThis this is limited access and Google titles it 'early look' there must be some gotchas but I hope they will get worked out. Of course you will depend on Google's code but I could imagine with a good abstraction layer you can minimize the dependencies to the AppEngine (although replacing some services you might need to use could be hard).\n\nThe downside of using it are (gathered from various sources)\n\n<ul>\n<li>No own threads<\/li>\n<li>Restrictions of java.io.File<\/li>\n<li>Restrictions on reflection<\/li>\n<li>Maximum of 30 seconds per request<\/li>\n<li>An application may not open sockets<\/li>\n<\/ul>\n\n\nFor sure there are some more benefits in hosting with Google (I guess the same goes for Amazon with S3\/EC2). In the past I heard from a couple of startups using those kind of services but I never imagined that it would be that easy.  As I said, I was up and running in under one hour.\n\nI certainly will use AppEngine for a small application in the near future."},{"title":"Coloring your IDE","link":"https:\/\/owehrens.com\/coloring-your-ide\/","pubDate":"Mon, 06 Apr 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/coloring-your-ide\/","description":"<p>Your IDE does a great job in helping you to program. This includes advanced features like Refactoring, Code completion and support for nifty frameworks. But it can do much more.<\/p>\n<p>Most of the time you actually read the code instead writing it. So how about to make this a bit more pleasant experience (well it was for me at least). Most of the people I see use the standard color scheme of the IDE.  I was using it for way to long, that&rsquo;s for sure. Ever since I tweaked it just a little bit I do find my way around an editor window much more easily.<\/p>"},{"title":"IE7 caches rendered elements?","link":"https:\/\/owehrens.com\/ie7-caches-rendered-elements\/","pubDate":"Mon, 30 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/ie7-caches-rendered-elements\/","description":"<p>I&rsquo;m tasked with some css tweaking to our current product. We need to implement a &lsquo;Print Preview&rsquo; screen so the customer can see how this looks before printing. Css supports exactly this use case with the @media notation.<\/p>\n<p>So far so good.<\/p>\n<p>Now Internet Explorer gives me some headache. Basically it looks like that if I render a page and then render the same page again with a slightly different style sheet, the lovely IE (7) will cache the width\/text-align of the element. That means formerly right aligned text now looks like center aligned. Using FireBug under Firefox confirms the correct right aligned styled text. Even using the IE Developer Toolbar shows the correct style sheet information and element. Still, it renders sort of centered. By accident the right border of the text is exactly as far away from the left border as in the previous rendering. If I add any attribute to the text cell (or delete an attribute) all of the sudden the text will be rendered right aligned exactly how it should have been in the first place.<\/p>"},{"title":"Using TestNG with DataProviders to cover more test cases","link":"https:\/\/owehrens.com\/using-testng-with-dataproviders-to-cover-more-test-cases\/","pubDate":"Mon, 23 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/using-testng-with-dataproviders-to-cover-more-test-cases\/","description":"<p>A couple of days ago I had the case that I needed to test a method with different parameters. I ended up writing a couple of test methods <strong>differing only in passing various arguments<\/strong> to the unit under test.<\/p>\n<p>Tonight I was at a <a href=\"http:\/\/newthinking-store.de\/stammtisch\/javausergroup\/20090310\">TestNG<\/a> talk and while I knew most of the stuff already the DataProviders (which I heard of before but unfortunately never really payed attention to) really caught me.<\/p>"},{"title":"How to refactor Spring Webflow variables in your JSF pages with IntelliJ IDEA","link":"https:\/\/owehrens.com\/how-to-refactor-spring-webflow-variables-in-your-jsf-pages-with-intellij-idea\/","pubDate":"Wed, 18 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/how-to-refactor-spring-webflow-variables-in-your-jsf-pages-with-intellij-idea\/","description":"<p>We are using <strong>JSF,<\/strong> <strong>Facelets<\/strong> and <strong>Spring Webflow<\/strong> in the product I&rsquo;m currently working on. What bugged me for some time already was that when we started to refactor the domain and the corresponding dto&rsquo;s the GUI was a problem since the variables which get pulled out of the webflow are just string declarations. I had to go to each xhtml file and change the code to reflect the access to the new properties.<\/p>"},{"title":"Updated Scrum Board Cheat Sheet with Story Owner","link":"https:\/\/owehrens.com\/updated-scrum-board-cheat-sheet-with-story-owner\/","pubDate":"Thu, 12 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/updated-scrum-board-cheat-sheet-with-story-owner\/","description":"<p>So just in the last sprint we (re) discovered that we need an<!-- raw HTML omitted --> owner of each story<!-- raw HTML omitted -->. A person who makes sure things are going smoothly and takes care that everything is done in a way so we can fulfill all acceptance tests. At sprint start the person which feels the strongest about the first story will be owner and he will drive the story.\nVery often we do operate in a <!-- raw HTML omitted -->king and servant<!-- raw HTML omitted --> model. The king (story owner) calls as many servants he needs to get &lsquo;his&rsquo; story (with the highest priority) done. If this story does not scale to the full team the others are starting on the next story. Again, a story owner (king) is chosen (or whoever wants to drive the story). Of course story priority is always determining the order of allocating resources to finish the job.\nTo formalize the story owner a little bit we do write down the name of the person in the upper right corner of the story card. I updated the scrum board cheat sheet.<\/p>"},{"title":"SOLID Development Principles In Motivational Pictures (enhanced)","link":"https:\/\/owehrens.com\/solid-development-principles-in-motivational-pictures-enhanced\/","pubDate":"Sun, 08 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/solid-development-principles-in-motivational-pictures-enhanced\/","description":"I found <a href=\"http:\/\/www.lostechies.com\/blogs\/derickbailey\/archive\/2009\/02\/11\/solid-development-principles-in-motivational-pictures.aspx\">SOLID Development Principles In Motivational Pictures<\/a> a couple of days ago. I put one of them up in the restroom. So it turned out some clever colleague enhanced the SRP picture. Nice job.\n<img alt=\"Single Responsibility Principle and Don't Repeat Yourself\" src=\"https:\/\/owehrens.com\/static\/SingleResponsibilityEnhanced.jpg\" title=\"SRP and DRY\" width=\"550\" height=\"461\" \/>"},{"title":"Why our current Sprint commitment will fail","link":"https:\/\/owehrens.com\/why-our-current-sprint-commitment-will-fail\/","pubDate":"Thu, 05 Mar 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/why-our-current-sprint-commitment-will-fail\/","description":"<p>We do have our Sprint Review tomorrow. We will not meet our commitment. Bummer.<\/p>\n<p>What happened?<\/p>\n<p>After the planning we did the breakdown of almost all stories. We had 5 Stories and another epic. As we did the epic breakdown we knew that we could not nail down every task since it was clear that some refactoring along the user story would be needed. So we marked one card in that story to remind us that we need to break things further down and refine the tasks.<\/p>"},{"title":"Three reasons why you don't want to use a Spring context in unit tests","link":"https:\/\/owehrens.com\/three-reasons-why-you-dont-want-to-use-a-spring-context-in-unit-tests\/","pubDate":"Wed, 25 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/three-reasons-why-you-dont-want-to-use-a-spring-context-in-unit-tests\/","description":"<p>You use Spring in  your application everywhere. You love it. Everything gets injected and is configured by Spring. Great. Why not use the same technology to wire up your tests?<\/p>\n<p>The bottom line is: Starting the Spring Context all the time in your tests drags you down at the costs of development time.<\/p>\n<p>Here is why:<\/p>\n<p><strong>1. Turnaround times are much faster<\/strong><\/p>\n<p>When you discover a bug which might have not been covered by tests yet (this happens to me all the time) you are much faster rerunning your tests without the application context. In the application I&rsquo;m working on it takes about 20-25 seconds to run a test with application context, whereas a pure unit test just takes 1 second. Now imagine this: changing some code and rerunning tests like 100 times saves you a lot of time. The <strong>tests run faster<\/strong>, you <strong>don&rsquo;t get distracted<\/strong> because you could do something else in those 20-25 seconds, like browsing some web pages (you want to be efficient and use the &lsquo;spare&rsquo; time to read up the newest stories on infoq.com). But then you need to switch windows, read something, switch back, wonder what you did, rethink the problem and so on. In the end it costs you much more time than it  seems.<\/p>"},{"title":"Sorting your properties files in IntelliJ Idea","link":"https:\/\/owehrens.com\/sorting-your-properties-files-in-intellij-idea\/","pubDate":"Mon, 23 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/sorting-your-properties-files-in-intellij-idea\/","description":"<p>I do work with language property files pretty much every day (since I&rsquo;m the GUI guy in the team). The files are updated on different branches copied up to the trunk and merged down to new branches, sometimes even updated by our product owner. We got a couple of times into not so funny merge conflicts since people did not sort the property files in the same way. To get around that we used an external tool to sort the files just before committing them.<\/p>"},{"title":"The ScrumBoard Cheat Sheet","link":"https:\/\/owehrens.com\/the-scrumboard-cheat-sheet\/","pubDate":"Thu, 19 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/the-scrumboard-cheat-sheet\/","description":"<p>In the last couple of month we continuously improved our scrum task board. After a sprint planning we usually do a story breakdown into tasks. All tasks for one story get ordered and a time for each will be estimated. We do try do make sure every task is smaller than 8 hours so it can be completed in one day.Our ScrumBoard is a magnetic whiteboard with hand drawn lines.<\/p>"},{"title":"Extreme visibility in an agile environment","link":"https:\/\/owehrens.com\/extreme-visibility-in-an-agile-environment\/","pubDate":"Tue, 17 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/extreme-visibility-in-an-agile-environment\/","description":"<p>What is Extreme visibility?<\/p>\n<p>Extreme visibility is all about providing information about the code to every team in near real time. We show several metrics such as complexity of the code (xs), todo&rsquo;s, deprecated methods, number of broken builds, open tickets and their priority and so on. These are distributed over a couple of screens which our software is rotating through. Every team member can easily see if his or her commits effecting the code quality in a good or bad way and makes the members aware of certain quality standards we try to keep in our code base. A typical screen looks like this (mockup):<\/p>"},{"title":"My MacBook Pro loves 4 GB","link":"https:\/\/owehrens.com\/my-macbook-pro-loves-4-gb\/","pubDate":"Sun, 15 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/my-macbook-pro-loves-4-gb\/","description":"<p>I upgraded my MacBook Pro last week to 4 GB of RAM (up from 2GB). It&rsquo;s cheap (about 50 Euros) and it really makes a difference. I can give IntelliJ IDEA 1GB Xmx without any problem. No swapping anymore if I have Idea, Pixelmator, Tomcat, Maven, XMind, Firefox, Mail.app, Tweetdeck and NewsGator running at the same time. Why did I not do it earlier?<\/p>"},{"title":"IntelliJ IDEA Rulezzz with code completion","link":"https:\/\/owehrens.com\/intellij-idea-rulezzz-with-code-completion\/","pubDate":"Sat, 14 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/intellij-idea-rulezzz-with-code-completion\/","description":"<p>Today I got an interesting ctrl+space code completion in IDEA 8.1. Easteregg anyone ? :)<\/p>\n\n\n<img class=\"alignnone\" title=\"IntelliJ IDEA Rulezzz\" src=\"https:\/\/owehrens.com\/static\/IntellijRulez.gif\" alt=\"\" width=\"649\" height=\"275\" \/>"},{"title":"IntelliJ IDEA 8.1","link":"https:\/\/owehrens.com\/intellij-idea-8.1\/","pubDate":"Wed, 11 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/intellij-idea-8.1\/","description":"<p>I do love IntelliJ IDEA  but the 8.0 release had some issues with indexing and compiler caches.\nVersion <a href=\"http:\/\/www.jetbrains.com\/idea\/features\/newfeatures.html\">8.1<\/a> is out  and addresses these issues (among other things, e.g. git support). Hurray.<\/p>"},{"title":"Behavior driven development with EasyB (and vs. TestNG)","link":"https:\/\/owehrens.com\/behavior-driven-development-with-easyb-and-vs.-testng\/","pubDate":"Tue, 10 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/behavior-driven-development-with-easyb-and-vs.-testng\/","description":"<p>I heard about BDD a couple of months ago and did not really pay attention. Just some weeks ago I thought that maybe I could improve our test and\/or documentation. So I decided to give it a shot with the BDD implementation <!-- raw HTML omitted -->easyb<!-- raw HTML omitted -->.<\/p>\n<p>According to Wikipedia:<\/p>\n<!-- raw HTML omitted -->\n<p>So I took the chance to sketch out a little example and to test it against readability.<\/p>"},{"title":"Starting again","link":"https:\/\/owehrens.com\/starting-again\/","pubDate":"Sat, 07 Feb 2009 00:00:00 +0000","guid":"https:\/\/owehrens.com\/starting-again\/","description":"<!-- raw HTML omitted -->"},{"title":"readme.md","link":"https:\/\/owehrens.com\/readme\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"https:\/\/owehrens.com\/readme\/","description":"<h2 id=\"welcome\">Welcome<\/h2>\n<p>Welcome to my manager readme. The purpose of this documents is to help define our work relationsship. You can consider this a user guide for me.<\/p>\n<ul>\n<li><a href=\"#what-i-value\">What I Value<\/a><\/li>\n<li><a href=\"#assumptions\">Assumptions<\/a><\/li>\n<li><a href=\"#availability--communication\">Availability &amp; Communication<\/a><\/li>\n<li><a href=\"#how-can-you-help-me\">How can you help me?<\/a><\/li>\n<li><a href=\"#how-i-work\">How I work<\/a><\/li>\n<li><a href=\"#expectations-to-others\">Expectations to others<\/a><\/li>\n<li><a href=\"#what-do-i-do-when-im-not-working\">What do I do when I&rsquo;m not working<\/a><\/li>\n<\/ul>\n<h2 id=\"what-i-value\">What I Value<\/h2>\n<p><strong>Happiness<\/strong>: Happy people create great products, which lead to happy customers.<\/p>\n<p><strong>Learning<\/strong>: The only real failure is not learning from our mistakes.<\/p>"}]}}