tag:blogger.com,1999:blog-44460204805674823982024-02-19T18:02:23.974+01:00stating the obviouseverything's been said before and betterDaniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comBlogger32125tag:blogger.com,1999:blog-4446020480567482398.post-52648884407599481282021-08-03T18:31:00.001+02:002021-08-03T18:31:11.046+02:00An issue I had with AWS CodeDeploy<h1 style="text-align: left;"> Hi there</h1><div>Clearly, I've not really written anything here in 7 years. Let's change that. By writing about an issue we had at Qixxit about 3 years ago. It's pretty specific so really not exciting but I've published a bit of code for it and I wanted to finally do a bit of a write-up on it.</div><div><br /></div><h2 style="text-align: left;">The problem</h2><div>We ran qixxit's backend on AWS as an auto-scaling group behind an application load-balancer. The auto-scaling group would manage ec2 instances running the application. The auto-scaling group would know about the linked load balancer through a property "target-group" in its configuration. This allows the auto-scaling group to tell the load balancer to stop sending traffic to an instance before removing it. </div><div><br /></div><div>We used AWS CodeDeploy's blue/green deployment feature to roll out new versions. This would create a new configuration of the auto-scaling group based on a newly built AMI. It would then bring up new instances for that and redirect traffic from the load balancer to these. Eventually, the old configuration is removed.</div><div><br /></div><div>The new configuration for the auto-scaling group has all the settings of the previous configuration copied over automatically by CodeDeploy. Except for that "target-group" setting.</div><div><br /></div><div>Now when the auto-scaling group decides that it wants to scale in and remove an instance it will just immediately shut down that instance. (Sidenote: maybe it's because English isn't my native language but I really don't get why it's scale in/scale out and not scale down/scale up. Is this maybe specific to Amazon's documentation?) Anyway, the instance is gone but the load balancer still sends traffic to it.</div><div><br /></div><div>I don't actually remember what specific problems this caused and whether this was also an issue when scaling out. It wasn't too dramatic and initially we worked around it by just setting the target group manually and filed a support request.</div><div><br /></div><div>Amazon's support was helpful and acknowledged the issue. But they didn't provide a way to directly track whether this was being worked on (I guess they generally don't?) and from the communication it sounded like it was pretty unlikely anyone would ever actually work on it.</div><div><br /></div><h2 style="text-align: left;">A solution</h2><div>And so I wrote a bit of Javascript to solve it for us. CodeDeploy sends notifications for the various steps of the deployment. That can be hooked into to then set the target group of the auto-scaling group. The whole thing runs as a lambda managed via the <a href="https://www.serverless.com/">serverless framework</a>.</div><div><br /></div><div>This was a nice way for me to practice my javascript test driving skills and also to play around with the serverless framework. And as of recently also to play around with Github Actions. Though I don't actually know if any of it still works or whether it's even still relevant and maybe the bug got fixed by Amazon. </div><div><br /></div><div>Anyway, the repository is here: <a href="https://github.com/dmt/code-deploy-set-target-group">https://github.com/dmt/code-deploy-set-target-group</a></div><div><br /></div><h2 style="text-align: left;">In closing</h2><div>I don't like how this write up turned out. It seems impossible to me to describe this in a generic way that doesn't require some knowledge of a bunch of specific AWS products. But maybe that's a good way to keep expectations low for this blog. </div>Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-79109757645798894952014-03-25T21:35:00.000+01:002014-03-25T21:35:11.471+01:00Looking back on 2013<br />
A lot of things happened for me in 2013 but much of it seems informal and I'm not sure I can make much of it in my usual year in review format. So be it. Also, I wrote this early February and then forgot to publish it.<br />
<br />
2013 started with me returning to South Africa after a much needed vacation back home. I arrived with a much clearer head and much of the stress form the initial months in South Africa gone. <br />
<br />
The project I was working on during my whole time in Joburg was doing well and we started trying to spread those experiences out to more teams at the client. This proved to have the same difficulties every other enterprise agile transformation seems to struggle with, too. I think personally, I learned heaps of things there in terms of how to communicate better and wish I would have taken a more active role in some of the discussions. On the plus side, the client was willing to experiment with processes to some degree, we had some really experienced Thoughtworkers around that I could learn a lot from and for myself I'm happy with what was achieved during the time I was there.<br />
<br />
Overall though, I find that the topic of enterprise agile transformation increasingly fills me with despair. There are so many inherent contradictions causing the same kinds of friction, again and again, with huge challenges for making a lasting positive difference for both the companies and the people working for them. I feel new approaches and the courage to experiment with them are required. Lots of that appears to be happening in smaller companies but I haven't witnessed any of that myself. Ok, enough of that. Where was I?<br />
<br />
I kept taking part in the Joburg developer community, attending lots of little events and making friends along the way. While the community is relatively small, I do like the vibe and this is one of the reasons why I'm looking forward to spending more time in Johannesburg. But more on that later.<br />
<br />
I also had a slightly more active role in some of the events. We had another Black Girls Code event that I ended up facilitating, with heavy support from Thoughtworkers and non-Thoughtworkers alike. I was happy to see (from afar, as I was already back in Germany) that the next BGC event had even more non-Thoughtworkers there. The more people involved in it, the more sustainable and successful it will hopefully become. Curriculum-wise we were working with material we received from the BGC organisers in the US, who were also kind enough to take the time to talk us through it over Skype.<br />
<br />
I also did a little workshop at the Developer Usergroup appropriating the very nice "Taking Babysteps" format. I had learned about it taking part in it when <a href="https://twitter.com/adibolb">Adi</a> ran it in Hamburg a few months earlier.<br />
<br />
Just before heading back to Germany my colleague Rouan and I also gave a talk at JSinSA about <a href="http://linemanjs.com/">lineman</a>, a javascript framework that more people should know about. (As an aside, I stumbled upon lineman because I've been twitter-stalking its author Justin Searls for years now, ever since he wrote a maven plugin that stood out because it actually did what it was supposed to.) <br />
<br />
I was very happy in the Johannesburg Thoughtworks office and when it came time to return home to Germany, that contrast made it pretty clear that I didn't want to keep working for Thoughtworks in Germany. And so my farewell to South Africa also became my farewell to Thoughtworks.<br />
<br />
The next months were incredibly chaotic as I was trying to figure out what I wanted to do next. A good part of that time was spent as a journeyman developer. I <a href="http://danieltemme.blogspot.de/search/label/journeyman%20weeks">blogged about that time extensively</a> so I won't repeat too much of that here. Except to repeat that I'm grateful to have had the opportunity and really enjoyed it. <br />
<br />
During this time I also went to the SoCraTes and ALE conferences again. Both events have quickly turned into my favourite events during the year and I'm already sad that I will probably miss both of them in 2014.<br />
<br />
Eventually I made up my mind and decided to go back to South Africa. It's pretty difficult to describe what I enjoy about the vibe of both the developer community as well as that of Johannesburg itself but in summary I feel it's worth it to go back for a a few years.<br />
<br />
I went back for two months at the end of the year to go job-hunting. It was a pretty positive experience overall and I'm also happy and excited about the new job coming up. <br />
<br />
While I was back I also took part in the global day of code retreat again. I really liked the venue and it was nice to just take part without being involved in facilitating.<br />
<br />
Going back to Germany, I had to wait for my work permit to come through. This proved to be a pretty rough time as being without a job and without my own place really started to wear on me.<br />
<br />
But eventually I got back to Joburg, started a new job, got my own place again and published this blog post. So it all worked out but that's a story for next year's year in review. <br />
<br />Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-41285934637357370252014-02-06T15:19:00.001+01:002014-02-06T15:19:44.115+01:00Journeyman weeks - retrospecting<i>(All my previous posts on this topic can be found via the <a href="http://danieltemme.blogspot.de/search/label/journeyman%20weeks">journeyman weeks label</a>) </i><br />
<br />
With a little bit of distance I will now try to sum up my experience of my little journeyman tour.<br />
<br />
The quick summary is: <b>I'm really happy I did this and I'm really grateful that it all came together on such short notice.</b><br />
<br />
<h3>
Getting started</h3>
First I want to elaborate a little bit more on my motivation. At the time of the SoCraTes conference I didn't really know what to do next, work-wise. I had briefly contemplated joining a Berlin start-up as the technical co-founder but ultimately decided against it. I also wasn't really happy with the idea of just working for any German company. I also started toying with the idea of going back to South Africa. <br />
<br />
As all my stuff was still in storage and I didn't feel like committing to a new place in Germany it meant I was crashing on people's couches anyway. And I didn't just want to hang around doing nothing while I was trying to make up my mind on what to do next. As such, the idea of the journeyman tour seemed like a perfect fit. <br />
<br />
After coming back from <a href="http://www.socrates-conference.de/">SoCraTes</a> I wrote up what I wanted to do in a little blog post. People kindly reshared it on Twitter and generally were very encouraging. I spent a few days doing this and coordinating with people and sorted out a little bit of an itinerary. I had 6 weeks to fill, with most of the first week spent on organising and then a week in between in Bucharest for the ALE conference. The other four weeks thankfully filled up quickly. I'm pretty happy that I didn't really think this through because if I had, I might have just gotten scared. What if nobody was interested? What if, after talking about it so much, I would not actually be able to do it? <br />
<br />
This wasn't that unlikely, I now realise, as companies struggled to understand what I was doing. And since I didn't really know either, I wasn't sure how to market myself. In all the four companies that I ended up visiting I was introduced by people I already knew who had faith in me. I wasn't that aggressive in communicating with other companies and in hindsight I'm much more convinced of what I had to offer. So maybe, if I had taken more time to prepare, I would have managed to find companies by cold-calling them. But as it was, I was dependent on other people doing my marketing for me and I am incredibly grateful for the support I got.<br />
<br />
<h3>
Lessons learned</h3>
I really wasn't sure what usefulness I could provide in just one week. And while I wasn't asking for much in terms of compensation, finding something for me to do, providing someone for me to pair with and getting me set up definitely required effort by my hosts. And so I was a little bit scared to disappoint the faith put into me. Thankfully, I think it turned out ok and I was actually surprised by how much can be done in a week. <br />
<br />
Part of that usefulness falls into the general usefulness of pairing. Having a fresh set of eyes to help work on something, I think, was appreciated by all of my hosts. (This relates well with the "Beginner's Mind" pairing pattern, described <a href="http://www.stickyminds.com/article/agile-motion-beginners-mind-and-promiscuous-pairing">in this post</a>.)<br />
<br />
I also didn't expect how quickly I was able to become productive in the various new dev environments. With a lot of automation already set up and a pair to help explain the details I was able to focus on the actual code. And with concrete tasks to work on this provided a pretty perfect setting to dig into a new language or tool. This is also what I found most beneficial for my own goal of learning new things during those weeks. If I want to get started with a new language I usually struggle setting up some dummy test app to play around with. Having the basics of building, deploying and baseline architecture already created makes it really easy and fun to explore a new language.<br />
<br />
There is probably a lesson in here for companies scared of becoming polyglot, trying to fit all their development work to one language (and one framework and platform, too. Eek.) While there certainly are risks to maintaining a diverse set of software projects, I would say that we tend to underestimate how much of the existing know how of software development can be carried over to a new language. And this only gets easier the more you learn about what differentiates various languages. <br />
<br />
There's probably also a lesson about automation and reducing the time for new people joining a team to actually start writing code. But I think that's a little out of scope of this post. <br />
<br />
Apart from providing a nice way to learn new development skills I also appreciated being able to learn more about how different companies work. All four companies were pretty different in size and organisation and it was nice to be able to take a peek into that. And I think this arrangement would be a pretty good way to do hiring and have potential employee and employer get to know each other.<br />
<br />
Last but not least, besides languages and companies I also got to work with more people and make new friends. That alone has made this worth it for me. Spending time with people who share some of the same enthusiasm for software development was really refreshing and energising.<br />
<br />
<h3>
Try it yourself?!</h3>
So, would I recommend this to others? In general, I would say yes. I found it a good way to learn and to get diverse experience in a short time-span. And for the hosting companies I would say it provides quite a bit of value to have a fresh pair of eyes looking at existing code and processes. But there are some caveats, of course. I'm not sure if I had been as eager to do this if I wasn't homeless at the time. And the things I learned about were a little bit random and probably not always on the top of my list of things to look at. This didn't bother me much, as I have made the experience that a little bit of randomness in my life had always turned out well for me. But it's worth pointing out.<br />
<br />
For the host companies I think the benefits are more pronounced. It's a cheap way to have an outsider come in and ask questions and potentially pick up on blind spots. This is something I think would even work for less experienced developers coming in (and would also work for other roles then devs). And fostering pairing is also something that is valuable, even though a lot of companies may not have picked up on that. Plus, I think showing that a company cares about learning is good advertising from a hiring perspective. <br />
<br />
<h3>
Further reading</h3>
There are other people who did similar travels who inspired me and who put more effort and energy into it than I ever did. I'm extremely happy to see that this doesn't seem to let up.<br />
<br />
First, there is <a href="https://twitter.com/coreyhaines">Corey Haines</a>, who I saw talking about craftsman swaps, code retreats and his journeyman tour at QCon in London in 2010. He had a tremendous impact on how I think about my work. (You can watch the talk <a href="http://www.infoq.com/presentations/Software-Craftsmanship-Beyond-The-Hype">here</a>.)<br />
<br />
<a href="http://codeofrob.com/">Rob Ashton</a>, while probably working from slightly different motivations, was the one whose blog posts came at just the right time to spark off discussing this idea at SoCraTes. A year after he started, he still hasn't settled down and I envy him for it. <br />
<br />
<a href="https://twitter.com/codecopkofler">Peter Kofler</a> has also done a craftsman tour around Vienna and I'm grateful to have been able to exchange experiences with him. He's also written extensively about it on <a href="http://blog.code-cop.org/">his blog</a>.<br />
<br />
Since then I've also become aware of and impressed by <a href="https://twitter.com/andyw8">Andy Waite</a> and the guys from <a href="http://thebakery.io/">The Bakery</a>.<br />
<br />
<b>I hope this encourages you to try something similar. If I can be of any
help please do contact me</b> either via <a href="https://twitter.com/dtemme">twitter</a>, by <a href="mailto:dtemme@gmail.com">email</a> or just leave a
comment.<br />
<br />
And, if you're in or around Germany, there are groups for <a href="http://www.softwerkskammer.org/groups/remotepairing">remote pairing</a> and for <a href="http://www.softwerkskammer.org/groups/craftsmanswap">craftsman swaps</a> on the <a href="http://www.softwerkskammer.org/">Softwerkskammer website</a>.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-41883880032657109322013-10-02T15:48:00.003+02:002013-10-02T17:21:47.574+02:00Journeyman weeks - week four @ msgGillardon<i>Read <a href="http://danieltemme.blogspot.com/2013/09/journeyman-weeks-week-three-soundcloud.html">here about last week</a> at soundcloud...</i><br />
<br />
<a href="https://twitter.com/NicoleRauch">Nicole Rauch</a> had been a strong supporter even before I actually came up with the idea of doing a journeyman tour. The German Softwerkskammer network has been playing with the idea of craftsmen swaps and Nicole worked hard to make that possible in the company she works for. Hopefully the example will inspire others to do similar things.<br />
<br />
During SoCraTes Nicole and her partner Andreas Leidig had offered to host me and eventually got the OK from their employer <a href="http://www.msg-gillardon.de/">msgGillardon </a>to let me work there for a week. The company is set in the small town of Bretten, close to Karlsruhe. It's a very beautiful little corner of Germany and I was quite happy with the contrast of small town life compared to frantic Berlin the week before.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_oFSZU_-3c1duRNOOhUXpACda39S66IYDSECUnx1IYcMI5I3gP-L3sxuc3P48xnzJFdiNIAH3AoP_r1xvUM4I52UyfrgpxtDJn8LsrKaW-G5v15cLBE-6_BoeXxWkdCWNCjrqrJkg_r0B/s1600/IMG_20130909_142957.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_oFSZU_-3c1duRNOOhUXpACda39S66IYDSECUnx1IYcMI5I3gP-L3sxuc3P48xnzJFdiNIAH3AoP_r1xvUM4I52UyfrgpxtDJn8LsrKaW-G5v15cLBE-6_BoeXxWkdCWNCjrqrJkg_r0B/s400/IMG_20130909_142957.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">View from the top of the office</td></tr>
</tbody></table>
The part of msgGillardon I was working at makes software doing forecasting for finacial institutions. Most of that is still in C++, with newer parts now being written in Java. I was a little too intimidated by C++ to work on that, which in hindsight might have been unnecessarily self-limiting. But I actually enjoyed working in Java again, since it's been quite a while. The framework used (Eclipse RAP) and the specifications written in FitNesse provided enough things that were new to me and gave opportunity to learn.<br />
<br />
I remain skeptical of frameworks that try to hide the complexity of visually representing an application. In the case of Eclipse RAP it at least seems to be thorough and consistent in hiding representation, which makes it more acceptable then Wicket or JSF (*shudder*). If you're happy to stick with what the framework provides and think in terms of desktop applications, as in this case, RAP seems to be helpful. But one of the drawbacks showed itself when we started to write Selenium tests for the application. The effort required to select elements to interact with made automating them too expensive.<br />
<br />
FitNesse seems a little crude in some places but I liked working with it. I was missing support to generate code snippets, as Cucumber/JBehave/SpecFlow all do. Aside from that, writing examples in Slim tables fit very nicely for the domain we were working on. There was a lot of combinatorial complexity in the inputs and it looked a lot more comprehensible to have these in FitNesse rather than in java unit tests. It also allowed for a slightly easier active conversation with the product owner about the required functionality.<br />
<br />
In terms of culture, msgGillardon is quite different to the start-up companies I've visited in previous weeks (and also quite different compared to ThoughtWorks and its clients). As a more traditional medium sized company working for a lot of customers in banking, things were a little bit more formal and the technology less bleeding edge.<br />
<br />
Nevertheless, I was very positively surprised by the willingness to try out new things. (And not just the obvious experiment of letting some random guy show up there and work there for a week. With very convenient and simple organisation.) There seems to be a genuine interest in changing and improving and that is not something I'm taking for granted anymore.<br />
<br />
The other thing that definitely stuck out was the diversity of the teams, at least in age and gender. I have no idea how that came to be but it was refreshing to see. I'd be curious if people there have found an explanation for why they are doing so much better than everyone else in Germany.<br />
<br />
During the week I also had the opportunity to take part in the Softwerkskammer Karlsruhe meet-up. It was nice to see so many familiar faces from the SoCraTes conference. Nicole and Andreas were running a legacy refactoring workshop that was a very nice alternative to the legacy code retreat format. Like all good workshops, it left me with a lot of things to think about on how I would do things differently if I were to do it again.<br />
<br />
This ends my journeyman weeks for now. I feel incredibly grateful for the privilege of having been able to do this. I am in the process of summarising the different experiences and compare and contrast them. I will hopefully also have some useful information for others who want to try something similar. If you have any specific questions or feedback, please do leave a comment, contact me on <a href="https://twitter.com/dtemme">twitter</a> or write me an <a href="mailto:dtemme@gmail.com">email</a>. I'd love to hear from you.<br />
<div>
<br /></div>
<div>
Pictures from the past couple of weeks are <a href="https://picasaweb.google.com/108412468179106763891/Walz?noredirect=1">on picasa</a>. Also check out <a href="http://blog.code-cop.org/">Peter Kofler's blog</a> about doing something similar in Vienna and <a href="http://blog.andywaite.com/2013/09/17/promoting-my-coding-world-tour/">Andy Waite's</a> for something remarkably global.</div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-66400368964773924272013-09-18T14:36:00.000+02:002013-09-18T14:39:40.871+02:00Journeyman weeks - week three @ soundcloud<i><br /></i>
<i>To find where I left off go <a href="http://danieltemme.blogspot.de/2013/08/journeyman-weeks-week-two-vaamode.html">here...</a></i><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLedsN4NE_twWgrvQ4pkAE1sFJkIuOvCIe0Z-61WkfR99C71qQYgD0FaftzX67l_MDWwIvUi26Tn-SOZhSdPcecbMgVrHBc6fHcUJFDFjUhzrfgm9ShRG4k2X7t73gh-_Wt2c0WzupPCg3/s1600/IMG_20130827_121922.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLedsN4NE_twWgrvQ4pkAE1sFJkIuOvCIe0Z-61WkfR99C71qQYgD0FaftzX67l_MDWwIvUi26Tn-SOZhSdPcecbMgVrHBc6fHcUJFDFjUhzrfgm9ShRG4k2X7t73gh-_Wt2c0WzupPCg3/s400/IMG_20130827_121922.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Leaving Bucharest behind</td></tr>
</tbody></table>
<br />
The break in Bucharest was really awesome. The ALE conference was as good as I remembered from Berlin in 2011. There's a certain vibe to this conference that is hard to describe. People generally seem to be very open and trusting and thus the conversations to be had are very interesting and candid. It felt very nice to be around friends old and new. And people were very encouraging of what I'm currently doing and very supportive. Which reminds me to point out the following. If you like what I'm doing please let me know in comments or on Twitter. It means a lot to me.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTI1LH4cE5vdCPty6klaAAnCOv-vISCMmwrKALN9O320PtTrxYtJltTHHWiLQV4cztubrLCNSeyTdbl_Ux6NBCaVTvfFFYb5tjF68RkrHTt9RqEzYNG_PyylGtQv6cX90ZJYlyuWW7yuP2/s1600/IMG_20130905_192311.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTI1LH4cE5vdCPty6klaAAnCOv-vISCMmwrKALN9O320PtTrxYtJltTHHWiLQV4cztubrLCNSeyTdbl_Ux6NBCaVTvfFFYb5tjF68RkrHTt9RqEzYNG_PyylGtQv6cX90ZJYlyuWW7yuP2/s400/IMG_20130905_192311.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">I stayed at quite historic grounds</td></tr>
</tbody></table>
<br />
I was still processing the impressions from Bucharest when I set out for Berlin. Arriving there I found my way to the interim <a href="https://soundcloud.com/">SoundCloud</a> office in Prenzlauer Berg. I was greeted by my old friend and former colleague Duana Stanley who had arranged my week there. We had never got to work on the same team while we were in ThoughtWorks, so I was looking forward to finally getting to pair up with her.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtxMozcG9CeDtwfVLHcOu4tKIzJNiT5uzVh92k-aZDmFSdrR_tWpcgizbI0TKTnjnhD_IjhJEvUqnMMBe-2aG1cLAONtomM_6A8LG-klgKeuiNjnjM5ch_NlpdPVp58zdXNKyMgh-tjFZp/s1600/IMG_20130903_141806.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtxMozcG9CeDtwfVLHcOu4tKIzJNiT5uzVh92k-aZDmFSdrR_tWpcgizbI0TKTnjnhD_IjhJEvUqnMMBe-2aG1cLAONtomM_6A8LG-klgKeuiNjnjM5ch_NlpdPVp58zdXNKyMgh-tjFZp/s400/IMG_20130903_141806.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The interim SoundCloud office</td></tr>
</tbody></table>
<br />
We had briefly talked about what I could do wile I was there and one of the things I said I was interested in doing, was learning more about Android development. The Android team had been working on the jenkins CI build of their SoundCloud client and were happy to have Duana and me help out on some things there.<br />
<br />
Their build consists of a fairly normal maven configuration that gets instrumented by a rake build file. That seemed like a much nicer solution to wrap filesystem and git tasks then trying to do that in maven. As we set to work, I was quite surprised by how much maven knowledge was still in my head. Since I haven't really worked with maven in two years and have been trying to forget its existence for longer than that, this was not what I had expected. (Just to be clear: this is not an implicit endorsement of other build tools.)<br />
<br />
We managed to get our initial goal done fairly quickly, which clearly showed the benefits of pairing. Since some of that work was the usual drudgery of trial and erroring our way through different maven settings it was nice to have someone to share in the suffering as we pushed each other forward.<br />
<br />
After that we tried to move parts of the build out into its own project. This took more time than I would have liked but eventually reduced the build time by a good minute. Duana quickly calculated that we would need about 1200 builds to make up for the time we invested in doing this. As we calculated a bit more I was surprised by how quickly this would pay back, if you consider that multiple people are running the build, many times a day. This led me to realise that I never really thought much about this in other instances of trying to improve build times and it seems painfully obvious now.<br />
<br />
Sure everyone feels the pain when the build duration passes that magical 5 minutes barrier. And we feel compelled to improve things. And even 5 minutes is pretty awfully slow. But if you think about it in more concrete terms it gets highlighted. Improve the build by a minute with 3 pairs trying to build 10 times a day and you already get half an hour. By month's end you have already gained more then a full day. The very unscientific and fuzzy way of coming up with this number is balanced by the fact that you really should be building more than 10 times a day anyway.<br />
<br />
Anyway, back to my week. Finally we got to work on a little feature for SoundCloud's android client. Since Android 4.1 notifications can have a different, expanded view when there is enough space in the notification menu. Getting this working for the SoundClound client was a nice, small fearure that cut through a lot of basic Android concepts. I got to do the layout for the big view and, while refactoring, learned how the notifications fit into the concept of Android's services. We decided not to add any extra functionality to it yet, because we felt that we wouldn't be able to finish it by the end of the week.<br />
<br />
We didn't get around to writing much tests (shame on me) but learned that <a href="https://code.google.com/p/robotium/">Robotium</a> wouldn't be able to test the notifications anyway. But I think we managed to get the feature to a good starting position.<br />
<br />
On Friday afternoons, SoundCloud has a demo session where people from across teams show what they've been working on. This seems to have most of the employees present and is followed by drinks and mingling. Duana and myself presented our results and I talked very briefly about what I am doing with this journeyman tour.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTka_prY4NU8V4gIh6RK8m7Gu8cHXXpIgsmmyp9Rz2ulwHTysGnt4ztfmqIDecjz0H4ZjKiv6XHzyR2cRtXuWpUceS3QFRAYUbzOU7S5Q5pGfdFj_5lHCwzZS9iayUzRTa8CRUidO790Gv/s1600/IMG_20130903_114958.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTka_prY4NU8V4gIh6RK8m7Gu8cHXXpIgsmmyp9Rz2ulwHTysGnt4ztfmqIDecjz0H4ZjKiv6XHzyR2cRtXuWpUceS3QFRAYUbzOU7S5Q5pGfdFj_5lHCwzZS9iayUzRTa8CRUidO790Gv/s400/IMG_20130903_114958.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Large paintings of your favourite meme</td></tr>
</tbody></table>
<br />
I quite liked this get together and SoundCloud's company culture in general. SoundCloud is decidedly bigger than the other two startups I was at (and they're still growing) and I think it's at a critical stage where it becomes challenging to keep the existing close-knit culture. People were very open and helpful to me and I think there's still that sense of playfulness that makes startups fun. Also, they provide free pistachios and cashews (among other things) which meant I got pretty sick quickly because I have terrible impulse control when it comes to eating those.<br />
<br />
While I was there I also got to meet some of the women working for the <a href="http://railsgirlssummerofcode.org/">rails girls summer of code</a> project. They all seemed really eager and doing fine so I was pretty happy to see that the project seems to be going along well.<br />
<br />
I also went to another session of xtc Berlin. I think there were about eight people present and I was happy to see that it still lives on. It was also really nice to catch up with some people I hadn't seen in a while. Among which was Stefan Hübner, who reminded me about <a href="http://euroclojure.com/2013/">Euro Clojure</a>, which I promptly bought a ticket for.<br />
<br />
Next week I'm heading south to Bretten near Karlsruhe. Nicole Rauch and Andreas Leider have invited me to work with them at msgGillardon. I've never spent any time in that region of Germany so it should be interesting.<br />
<br />
<br />Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-15871669636095077292013-08-27T14:34:00.002+02:002013-09-18T14:41:49.363+02:00Journeyman weeks - week two @ vaamo.de<i>Wonder what happened <a href="http://danieltemme.blogspot.com/2013/08/journeyman-weeks-week-one-bitbondnet.html">last week?</a></i><br />
<br />
My travel continued as I left Berlin behind and headed out to Frankfurt. During <a href="http://www.socrates-conference.de/">SoCraTes 2013</a> I spent some time talking about my little journeyman project with <a href="https://twitter.com/benjamin">Benjamin </a>Reitzammer. He was one of the first that came to my mind as someone I could be working with and learning from. He had recently started working at a start-up called <a href="http://vaamo.de/">vaamo </a>and so all of that seemed like a good fit and thankfully he was willing to organise getting me there.<br />
<br />
<h3>
Arriving</h3>
I had spent the weekend at my parents' house in Düsseldorf and so the short Monday morning train ride to Frankfurt went by pretty quickly. I had good directions and easily found vaamo's offices in the university campus' "House of Finance". Everyone was quick to welcome me and it was a matter of minutes to get set up for GitHub, Travis and HipChat. It took a little bit of installing random stuff (like a JDK... ahem) and I was up and running. I was able to reuse my postgres docker image from the week before, which I thought was pretty cool.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTiJi1CdEMWIqCI7FOBrTp_EbeH8Y_Ieibvh8pswRk95qekA4dPZRFanNDmvAS6KVBRPWKbUWePA3FOGiIMpBoBIgIa9MRZkayelO5h_VG_LXWJjDQ_i9pUOEk-Ez1FT9O1yEgItFK2bI8/s1600/IMG_20130820_135515.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTiJi1CdEMWIqCI7FOBrTp_EbeH8Y_Ieibvh8pswRk95qekA4dPZRFanNDmvAS6KVBRPWKbUWePA3FOGiIMpBoBIgIa9MRZkayelO5h_VG_LXWJjDQ_i9pUOEk-Ez1FT9O1yEgItFK2bI8/s400/IMG_20130820_135515.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Goethe University Frankfurt</td></tr>
</tbody></table>
<br />
<div>
Vaamo is working on an interesting product around making saving money more accessible. I say interesting because it is something I can probably make use of, once it gets released. The tech stack is based on Scala & the Play framework. There's already quite a few people working on the product, including another of my SoCraTes buddies, <a href="https://twitter.com/Ookami86">Johannes Seitz</a>. During the week I stayed in the huge apartment of one of the founders, conveniently located in walking distance of the office. </div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h3>
Technology</h3>
I am happy I finally had some time to actually work with a JVM language other than Java. I've had some basic idea of how Scala works but now I could actually write useful code in it.<br />
<br />
I especially enjoyed having Johannes show me a few ways to solve common web app problems in a more functional way. We made heavy use of Option (and Either) monads, which felt a lot more straight-forward in Scala than anything I had experimented with in Java, quite some time ago. (Hopefully it was also easier because I've learned a bit more since that time. :))<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYUrfAUZ9nqXrqLA0L5PQoMP9DrXX9O1Ys7PlfFjwEB9LhuA9EYgbhEd51oDSE76Mf9pt7YxkIhQujTvoX0WasZaB7EYEa9n5mNAoO1VPJawPnZoJs9i39tdN4J0l0zwUD8p9cFDHyubQD/s1600/IMG_20130823_113320.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYUrfAUZ9nqXrqLA0L5PQoMP9DrXX9O1Ys7PlfFjwEB9LhuA9EYgbhEd51oDSE76Mf9pt7YxkIhQujTvoX0WasZaB7EYEa9n5mNAoO1VPJawPnZoJs9i39tdN4J0l0zwUD8p9cFDHyubQD/s400/IMG_20130823_113320.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"Show me"</td></tr>
</tbody></table>
<br />
In terms of tooling, I was less impressed. IntelliJ was struggling very much on my (admittedly underpowered) laptop while adding very little benefit in terms of refactoring support. Being used to how well the JetBrains stuff works for other languages I have hope that this will improve but was very disappointed with the current state. Working with vim or sublime might have been the better option.<br />
<br />
I'm also pretty skeptical about the Play framework (and maybe sbt, if that's what's under the covers). Opinionated frameworks are good for the 80% case but then seem to always end up fighting you when you trail off the beaten path. In this particular case I was unable to get jasmine tests integrated into the build. (I'm certain it's possible to do that if you invest time or know more about Scala/Play/sbt but it shouldn't be this hard to get started.) This was sad because the support for TDD in Play seems to otherwise be pretty excellent.<br />
<br />
I did enjoy a different set of tooling very much though. Vaamo uses <a href="http://travis-ci.com/">Travis</a> for continuous integration and I really loved the integration of that with git(hub) and <a href="https://www.hipchat.com/">HipChat</a>. As I mentioned <a href="http://danieltemme.blogspot.ro/2013/04/three-tales-of-browser-based-test.html">here </a>I really like chat rooms to keep a history of ephemeral status information. It's easy to find when you need the information and it's easy to ignore if you don't. And it also makes it viable to have people work in a distributed fashion.<br />
<br />
<h3>
Extra curricular activities</h3>
I also enjoyed hanging out with people and seeing more of Frankfurt. Due to a prior bad experience I had a pretty low opinion of the city and I was glad to find out that it's actually not really that bad. :)<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://www.facebook.com/photo.php?fbid=491282374293156&set=pb.120146491406748.-2207520000.1377600984.&type=3&theater" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBJbxVeJxGoEOj_84Xk_VWMX6U4oXBb3Jnv2loEDq3QtOa-ueMLX5amUKsLMKqHOk7Abv_dTaox59XJSkzlrkh30Jg71ryTaC7Nzy39thTpPgnEOqvUir0R-AtqxsKgBcQKF1Y7cqmTCmR/s400/lasertag-vaamo.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Team Vaamo (with Lasers!)</td></tr>
</tbody></table>
I enjoyed philosophizing about our industry with Benjamin and similarly I was also lucky to run into Olaf Lewitz and Meike Mertsch who just happened to be in Frankfurt at the same time. Once again I feel extremely grateful for the opportunities that make these serendipitous encounters possible!<br />
<br />
This is of course also still the case for the overall journeyman weeks tour. I'm really glad I get to be able to do this. Although I did wake up very disoriented on Tuesday morning, not knowing where I was. :)<br />
<br />
<h3>
Next up</h3>
As I'm finally finishing up this post I'm sitting in the offices of <a href="http://www.mozaicworks.com/">Mozaic Works</a> in Bucharest. My old friend Adi Bolboaca was kind enough to host me and show me around this beautiful city. In the end it was a little bit too short notice to find someone to pair with for two days but I'm enjoying having some time to walk around the city. And starting tomorrow I'll be busy enjoying catching up with people and hopefully meeting new ones during this year's <a href="http://ale2013.alenetwork.eu/">ALE conference</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbSwvkKen7t84LqT6dwDfYciCEO8DSNiz7paBhxqKO47GwkK9TbwWym8XD-Zc5L4OxwHpIQt5zbDfX1LTGFD0u5EaY_J8YFK8XUYuyGEtjf4ABNwAbqTxGBPqF-MUOJjwLXtbVYstQA7UU/s1600/IMG_20130826_135129.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbSwvkKen7t84LqT6dwDfYciCEO8DSNiz7paBhxqKO47GwkK9TbwWym8XD-Zc5L4OxwHpIQt5zbDfX1LTGFD0u5EaY_J8YFK8XUYuyGEtjf4ABNwAbqTxGBPqF-MUOJjwLXtbVYstQA7UU/s400/IMG_20130826_135129.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Down the street from Mozaic Works</td></tr>
</tbody></table>
Next week I will be returning to Berlin again to work with <a href="https://twitter.com/starkcoffee">Duana Stanley </a>at <a href="https://soundcloud.com/">Soundcloud</a>. They use some pretty interesting and diverse technologies so I'm sure that will be another great week for learning. For my final journeyman week (as of now) I will head south to <a href="http://www.msg-gillardon.de/">msgGillardon</a> in Bretten, where <a href="https://twitter.com/NicoleRauch">Nicole Rauch </a>and <a href="https://twitter.com/leiderleider">Andreas Leidig </a>are kind enough to host me.<br />
<br />
<i>Read about my week at SoundCloud <a href="http://danieltemme.blogspot.de/2013/09/journeyman-weeks-week-three-soundcloud.html">here</a>.</i><br />
<a name='more'></a><br />
<iframe frameborder="0" height="300" scrolling="no" src="https://www.google.com/calendar/embed?showPrint=0&showCalendars=0&showTz=0&height=300&wkst=2&bgcolor=%23FFFFFF&src=vc4p1j93ls8huu9gklipkh7sn4%40group.calendar.google.com&color=%235229A3&ctz=Europe%2FBerlin" style="border-width: 0;" width="400"></iframe>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-23041162897162841392013-08-17T20:28:00.003+02:002013-10-02T15:54:13.335+02:00Journeyman weeks - week one @ bitbond.netAfter publishing my <a href="http://danieltemme.blogspot.com/2013/08/journeyman-weeks.html">initial post</a> and advertising it on Twitter I was quite overwhelmed with the positive reaction and offers of support. I also realised I had very little clue about how to do this from a logistical perspective.<br />
<br />
Nevertheless, I quickly found the first two companies willing to host me. And so I decided to just set out and figure the rest out along the way. This will probably eventually involve having to consult with a tax accountant but that's for another day.<br />
<br />
For the first week I returned to Berlin once more. My ex-colleague Gregor <a href="https://twitter.com/russbuelt">Russbuelt</a> connected me to one of his former colleagues, Jürgen Walter, who heads up the technical side of a little startup at <a href="https://www.bitbond.net/">https://www.bitbond.net</a>. I was looking forward to do a little Rails work in earnest and possibly also learn more about bitcoin. The latter part didn't actually happen but I'm quite happy with what other stuff I picked up along the way.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdX-pusiul9MeR0FYHLMvCust8gK-86G6KUy2fH7GqiP7D7W71kbufo4j3boGBaIKmYX1bnq06jx-8wlesUbksy0JSOj8EFf0LUKFS7tw3LTZKsaHzH61SnE7erZqhaC2bCgAyWMQatHfC/s1600/IMG_20130813_101501.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdX-pusiul9MeR0FYHLMvCust8gK-86G6KUy2fH7GqiP7D7W71kbufo4j3boGBaIKmYX1bnq06jx-8wlesUbksy0JSOj8EFf0LUKFS7tw3LTZKsaHzH61SnE7erZqhaC2bCgAyWMQatHfC/s400/IMG_20130813_101501.jpg" width="300" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Balconia Berlin</td></tr>
</tbody></table>
<br />
Jürgen put me up in a room in his nice apartment in Prenzlauer Berg and we went out to a co-working space nearby each day to do our work. As a first problem we tried to change bitbond's <a href="http://www.capistranorb.com/">capistrano</a> scripts to work on docker images rather than straight on the remote server. Coincidentally, both Jürgen and myself had recently been pointed at <a href="http://www.docker.io/">docker.io</a> and thought it was worth looking into further. It turned out that assessment was correct. It's a really neat little toolset. Although it did take us a while to get a clear understanding of how repositories, images, containers, tags and volumes fit together. (Now there's a new <a href="https://www.docker.io/gettingstarted/">tutorial available</a>. Maybe that makes things easier.)<br />
<br />
<h4>
Docker</h4>
<div style="text-align: left;">
Docker lets you spin up preconfigured ubuntu instances and run commands inside of them. The idea being that you have a little vm for each of your components. Spin up an image to run the rails app, one to run redis and maybe more for postgres and nginx. Each image is essentially disposable and changes in state to the image are only persisted if you use docker to commit the image. There is a concept of ephemeral, potentially persistent volumes that can be mounted and shared between images, allowing you to store e.g. the data of your postgres server.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Each image keeps a history of the commits made to it and you can run commands against each of these versions or base new images or repositories on them. A repository is maybe best described as a branch. Lastly, new images can also be built off of existing repositories and there is a <a href="https://index.docker.io/">public directory</a> containing a lot of useful readily configured ones.</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
There is a limitation to the size of an image's history though, so you cannot run more than 42 (doubt that's unintentional) commands within an image while committing the results. This should usually not be an issue but while we were toying around with our deployments we committed quite a few changes and then were quite surprised when we ran into this problem. It didn't help that the error message is far from helpful.</div>
<div style="text-align: left;">
<br /></div>
Our plan then was to<br />
<br />
<ul>
<li>build new images based on the default docker ubuntu repository, containing the debian packages necessary for rails/postgres/redis/nginx</li>
<li>in the case of rails, run each capistrano step inside of the docker image, committing the image after each step </li>
<li>for the other images, run the respective service, making sure addresses and ports of related services are passed in as environment variables and passed on correctly</li>
<li>start rails from its image, also passing in information about related services </li>
</ul>
<br />
(There is another project called <a href="http://coreos.com/">coreos</a> that would make the configuration a little more scalable by using etcd to handle service discovery but we didn't look into that)<br />
<br />
We wrote a bunch of little shell scripts to help with the individual steps and also experimented a lot until we sort of figured out how docker volumes work. We spent some time working on creating a capistrano plugin to make this available to others. Hopefully it won't take too long to get that ready.<br />
<br />
<h4>
Working on the application</h4>
We eventually got to a point where we had a redis and postgres image serving data and a rails and nginx image serving up dynamic and static content, respectively, all working together. At this point we stopped and went to work on the actual application, going through the list of open bugs and features for bitbond.<br />
<br />
I was quite impressed with the level of testing being done on bitbond and with Jürgen's TDD workflow and good naming of things. This last bit might sound like a minor thing until you've actually worked on code where people are diligent about keeping things appropriately named. It makes working with the code just so much easier.<br />
<br />
And so when we were working on a little bug, we wrote a test that reproduced that behaviour and then fixed the code. When we worked on a new feature, we started with a small capybara script that described how that feature was supposed to work and then implemented against that. It's a very focused, quick and rewarding way of working and I always appreciative when I get to do it.<br />
<br />
So we did that and then deployed to production, thereby also making sure we didn't screw up the current production deployment scripts too bad. Ah, the joy of releasing. I can't understand why so many people artificially limit themselves from having that experience more often.<br />
<br />
I also got a glimpse of more of coffee script and haml for working on the client side of things. I always liked both of them but never had the opportunity to do any real work with them. At least in the case of coffee script I definitely need to finally change that. Hopefully my recent experiences with <a href="https://github.com/testdouble/lineman">lineman</a> will help with that.<br />
<br />
<h4>
Success</h4>
So I'm considering the first week of my little journeyman tour a smashing success. I learned new things, got to meet new people and helped ship code. I feel extremely privileged and happy that I have the opportunity to go on this little adventure and do so at such short notice. This community is really great. (And I'm not even sure what "this community" means, exactly.)<br />
<br />
If you think what I'm doing here is interesting, please spread the word or invite me over. You can still contact me at dtemme@gmail.com or @dtemme on Twitter. My calendar is still available at <a href="https://www.google.com/calendar/embed?src=vc4p1j93ls8huu9gklipkh7sn4%40group.calendar.google.com" rel="nofollow" target="_blank">this link</a> as well as embedded at the end of this post.<br />
<br />
<h4>
Next up</h4>
I'm staying in the broader domain of financial services but moving to Frankfurt, where <a href="http://vaamo.de/">vaamo</a> is hosting me. I'm really looking forward to working with old twitter and socrates friend <a href="https://twitter.com/benjamin">Benjamin</a> Reitzammer.<br />
<br />
And if you're in Frankfurt and want to grab a beer, please do let me know!<br />
<br />
<i>(Write up for week 2 is <a href="http://danieltemme.blogspot.ro/2013/08/journeyman-weeks-week-two-vaamode.html">up now</a>.)</i><br />
<div>
<br /></div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-29821781678388586432013-08-06T17:09:00.000+02:002013-08-06T17:09:52.809+02:00Personal Kanban - auf deutschWie an anderen Stellen schon erwähnt, bin ich ein grosser Freund von Personal Kanban und bin dankbar für die Hilfe, die ich daraus ziehen konnte. Einige der hektischeren Phasen in den letzten Jahren wären mir ohne dieses Werkzeug bedeuten schwerer gefallen.<br />
<br />
Nun gibt es das Buch endlich auch in einer deutschen Übersetzung von Meike Mertsch und ich bin froh, dass ich auch diese Version ohne Vorbehalt empfehlen kann.<br />
<br />
<a name='more'></a><i>(Hinweis: mir sind Meike Mertsch und Jim Benson schon über den Weg gelaufen und ich schätze beide sehr. Ich bin also mit Sicherheit nicht objektiv. Aber wer will schon Objektivität?)</i><br />
<br />
<h3>
Zum Buch</h3>
<div>
Zum Buch will ich gar nicht so viel erzählen. Es geht um die vielen kleinen Dinge, die es einem schwer machen seine Zeit sinnvoll einzusetzen. Hier geht das Buch auf viele der unbewussten psychologischen Probleme ein, die uns als Menschen aus der Bahn werfen. Das Buch gibt keine Dogmen vor, sondern eine Reihe von Ideen, wie man sich sein Leben angenehmer gestalten kann. <br />
<br /></div>
<h3>
Zur Übersetzung</h3>
<div>
Meike und ihre Kolleginnen und Kollegen bei it-agile haben einiges an Erfahrung in der Software-Kanban-Welt sammeln können und auch einiges zu deren Entwicklung beigetragen. Ich denke, dies hat einiges bei der Übersetzung geholfen. </div>
<div>
<br /></div>
<div>
Zum Beispiel schätze ich sehr, dass bestimmte englische Begriffe, die sich auch in deutschen Kanban-Teams eingebürgert haben (z.B. "WIP-Limit"), beibehalten wurden. Das ist schon ein kleiner Balance-Akt, da für Kanban-Neulinge diese Einbürgerungen natürlich noch nicht bekannt ist. Aber ich denke es ist gut gelungen und hilft auf Konferenzen und anderen Veranstaltungen eine gemeinsame Sprache zu finden.</div>
<div>
<br /></div>
<div>
Gut gefallen hat mir auch, dass die meisten der Bilder von Kanban-Tafeln mit entsprechender Übersetzung neu aufgenommen wurden. Ich wunderer mich nur, dass ich kein Muster erkennen kann, warum vereinzelt doch die Originalfotos verwendet wurden. </div>
<div>
<br /></div>
<div>
Der humorvolle und verschmitzte Unterton des Originals ist ein wesentlicher Grund, warum mir das Buch so gefallen hat. Solche subtilen Färbungen ins Deutsche zu bringen, stelle ich mir als ziemlich schwierig vor. Grundsätzlich kann man sagen, dass Meike das gut gelungen ist. </div>
<div>
<br /></div>
<div>
<h3>
Fazit</h3>
</div>
<div>
Klare Kaufempfehlung. Wer sich im Englischen nicht so wohlfühlt muss in der deutschen Version nichts aufgeben. Und gelesen haben sollte man das Buch auf jeden Fall.</div>
<div>
<br /></div>
<div>
<br /></div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-49902419440373164742013-08-05T17:21:00.000+02:002013-10-02T15:53:42.827+02:00Journeyman weeksHaving just quit my job and not really knowing what I want to do next I've decided to take to the road. I've always enjoyed Corey Haines' <a href="http://programmingtour.blogspot.com/">programming tour</a> (wasn't there supposed to be a book?) and recently I came across Rob Ashton's post <a href="http://codeofrob.com/entries/working-for-free-and-what-it-taught-me.html">here</a>. This gave me the idea to just travel around for a few weeks and see what I can learn from other people and hopefully help others build cool stuff.<br />
<div>
<br />
At the <a href="http://www.socrates-conference.de/">SoCraTes</a> conference I mentioned this to a few people and was generally encouraged. During the code retreat that happened on the Sunday I also realized that I need more practice and that there is so much stuff out there that I'm clueless about and want to learn (most recently Elixir). I was also discouraged a little, as the organisational overhead seems a little daunting.<br />
<br />
But anyway, I'm currently homeless and jobless and while I wait for the "next step" I wouldn't mind learning more and keeping my operating cost down. So here is my offer: I will work with you if you can provide a roof over my head and can somehow get me to said roof (I am currently based in Düsseldorf, Germany). I've mostly been working with Java, JavaScript and C# and would very much appreciate the chance to expand more into the functional world. I am very opinionated about writing maintainable software and even more opinionated about what software not to write at all.<br />
<br />
I hear you say:<br />
<blockquote class="tr_bq">
<h3>
Daniel, that's great! How can I help?</h3>
</blockquote>
<div>
Thanks! There's three things, really: </div>
<div>
<ul>
<li>If you would like to work with me for a week or two please contact me at dtemme@gmail.com or @dtemme on twitter</li>
<li>If you have any tips on being self-employed in Germany and how to arrange something like this, I would like your input</li>
<li>If you think you might know anyone that is interested in pairing with me, please spread the word</li>
</ul>
</div>
<br />
I will initially run this little experiment until the middle of September. I've created a calendar showing my availability <a href="https://www.google.com/calendar/embed?src=vc4p1j93ls8huu9gklipkh7sn4%40group.calendar.google.com" rel="nofollow" target="_blank">here</a>.<br />
<br />
<h2>
Updates</h2>
<br />
<ul>
<li><i>Updates for <a href="http://danieltemme.blogspot.com/2013/08/journeyman-weeks-week-one-bitbondnet.html">week one</a></i></li>
<li><i><a href="http://danieltemme.blogspot.de/2013/08/journeyman-weeks-week-two-vaamode.html">Week two at Vaamo</a></i></li>
<li><i><a href="http://danieltemme.blogspot.de/2013/09/journeyman-weeks-week-three-soundcloud.html">Week three at SoundCloud</a></i></li>
<li><i><a href="http://danieltemme.blogspot.de/2013/10/journeyman-weeks-week-four-msggillardon.html">Week four at msgGillardon</a></i></li>
</ul>
<br />
<br /></div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-6118668364122001432013-04-04T17:20:00.002+02:002013-04-04T17:24:58.082+02:00Three tales of browser-based test suites [Part 2] - test harder<br />
In <a href="http://danieltemme.blogspot.com/2012/07/three-tales-of-browser-based-test.html">Part 1</a> I wrote about my initial experience testing with Selenium. In this part I will write about what I learned about browser-based tests on my first project working for ThoughtWorks. It was a step up in terms of coverage and complexity and that also brought its own set of problems.<br />
<br />
<a name='more'></a><br /><br />
The application we were working on is essentially a massive single-page JavaScript app but written by multiple teams. This made testing the different parts in integration quite a challenge. To handle that, an effort had been started to build up a suite of cuke4duke tests instrumenting the browser via Selenium.<br />
<br />
All the teams had build monitors in their rooms and the department lead was thankfully very insistent that people follow the rule to not commit on a red build. To make communication about the status of the build a little bit easier, we were using a skype chat room. This is something I now try to do on bigger teams all the time as the persistent chat history allowed people to stay up to date even if they came in late or were out in meetings.<br />
<br />
Over time the tests grew until they took about 30 minutes to run. In combination with a bit of flakyness in third party systems and the general brittleness of Selenium this lead to a situation where people were unable to commit for multiple hours and in one case even for two whole days. This was obviously not a good situation and so we set out to find ways to improve this.<br />
<br />
A lot of effort was put into creating fake versions of the third party backend services. This wasn't possible for all the external systems but what was there already helped to reduce false negatives.<br />
<br />
Developers and QAs also worked more closely together to figure out better ways to handle timing related issues with Selenium and to focus on what specifically was tested on that layer. I don't think we were aggressive enough here though as there was quite a lot of tests that were redundant between unit and even between functional tests.<br />
<br />
Another problem was cuke4duke itself, mainly when trying to parallelize tests. Since the gherkin tests didn't need too much updating for it, the choice was made to switch to JBehave.<br />
<br />
There was also a dedicated pair chosen each week that would take care of build issues and work on improving the testing framework. This made it possible to do things that might otherwise seem a bit daunting (like switching to JBehave) but also meant a considerable investment in what was "just" maintenance.<br />
<br />
With all of this in place one of the operations guys got into setting up more and more environments to run Selenium Grid against. This sped things up considerably. As mentioned in the last post I would now recommend doing this with <a href="https://saucelabs.com/">SauceLabs</a> but the general idea is still the same. If you can run tests in parallel, things go a lot faster.<br />
<br />
When I left, there were about 600 JBehave tests around that took about 10 minutes to run as part of the CI run. As a comparison, the 2000-ish Javascript tests took a little over a minute on a dev machine. And I'm tempted to blame part of that minute on being run as part of maven. These days, I'd love to try <a href="https://github.com/testdouble/lineman">lineman</a> for such a front-end heavy project.<br />
<br />
So, again, here's my takeaway points:<br />
<br />
<ul>
<li>consideration of what tests can be moved out of being run in a browser takes some dedication. After spending time to write all those tests people are very reluctant to give up on them. Especially since you're likely to perceive it as a higher risk than it actually is.</li>
<li>Using Gherkin on top of a decent page model seemed to be useful for the QAs and helped with collaboration on the tests. But in a smaller team I'd probably still opt for running test straight from JUnit</li>
<li>this was an interesting case in balancing between investing in the testing setup versus eventually ignoring brittle, long-running tests. The latter seems a lot more common and it took a very strong-minded department lead to avoid that.</li>
<li>again it was very important how long tests would be running. The shorter the more likely it would be that devs would actually run the tests before committing. I still think 10 minutes seems to be the absolute maximum there.</li>
<li>having one massive Javascript application developed by multiple teams is probably not something I would recommend</li>
<li>having a build chat was a very simple but extremely useful tool. People were more likely to fix problems quickly rather than just trying to find someone to blame and then ignoring the problem</li>
<li>I also spend quite some time trying to understand Selenium's quirks to avoid the dreaded Thread.sleep() that seems all too common. For larger test suites this quickly adds up. </li>
</ul>
<br />
<br />
In part 3 I would like to talk about a project where QAs and devs didn't share ownership. Considering that I'll probably be too lazy to write that for another couple of months, here's the abstract: don't do it that way.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-75918720134449822912013-03-15T21:53:00.000+01:002014-02-06T15:50:52.803+01:002012, a yearThis thing proved to take quite a bit of time to write. But 2012 was a very eventful, challenging, rewarding, entertaining and educational year.<br />
<div>
<br /></div>
<div>
Like <a href="http://danieltemme.blogspot.com/2011/12/thank-you-2011.html#more">last year</a> I'm overcome by massive gratefulness and joy for having been able to connect to so many nice people throughout the year. </div>
<div>
<br /></div>
<div>
So, in very brief stats: I worked on 3 projects, spoke at 2 conferences, did more code retreats, and moved to South Africa.</div>
<div>
<br /></div>
<div>
<a name='more'></a><h3>
Goodbye Berlin</h3>
</div>
<div>
I started the year by joining another project in Berlin. This was limited to 8 weeks from the outset so didn't leave me and my colleague Matt too much time to work with the team there. It was a more challenging setup, too, as the team was (and had been for a while) under a lot of pressure to change and so trust and safety were in short supply. Nevertheless I really enjoyed working with Matt and I think we did manage to have some positive impact.</div>
<div>
<br /></div>
<div>
As my time in Berlin was coming to an end I found myself surprised by how sad I was to leave. It's a very strange love/hate-relationship I have with that city. But the really great tech community and the many good friends I have there do make me lean towards moving there when I return to Germany.</div>
<div>
<br /></div>
<h3>
Hello Hamburg</h3>
<div>
After having 'lived' in Hamburg for 7 months without ever actually having spent much time there I was now actually working on a project in Hamburg. </div>
<div>
<br /></div>
<div>
The experience was very mixed though, I had a very long commute and the project I was working on was problematic, as I felt we had no agency and lacked support from the client. On the plus side, it got me working alongside more of my TW colleagues, which I appreciated.</div>
<div>
<br /></div>
<div>
And Hamburg itself is a pretty awesome city and the local ThoughtWorks office and the growing number of people working there were nice to have around. I also quite enjoyed the local dev community, especially around the JS, Kanban and craftsmanship user groups. </div>
<div>
<br /></div>
<h3>
Conferences</h3>
<div>
In my quest to keep pushing myself out of my comfort zone, I decided that I wanted to try out giving a talk at a conference. The topic emerged at one of the xtc Berlin meetings, based on me being sad that some people I hold in high regard were staying at jobs that I thought were wasting their talent. Combined with my own experience from recent years, I quickly found the nice, somewhat baiting title "Quit Your Job" and eventually also came up with an abstract. </div>
<div>
<br /></div>
<div>
And when both Scan Agile and Agile Central Europe accepted my proposal I was starting to freak out a little. I spent quite some time preparing and thankfully also had the opportunity to do a test-run with some colleagues, who helped me a lot with their feedback.</div>
<div>
<br /></div>
<div>
Arriving in Helsinki a little late I sadly missed out on the speaker's dinner. But I still got to spend a nice evening at the bar with Olaf Lewitz, Cyrille Martraire and Chris Matts.</div>
<div>
<br />
I was more than a little anxious the next day but felt very supported by the organizers. And I was also very thankful for having Phil Calçado around, too, so I knew at least one person in the audience.<br />
<div>
<br /></div>
<div>
The talk went well enough and the feedback was positive. In particular I was very moved by Juha Heimonen, who was very enthusiastic in his feedback (and has since quit and found a new job).</div>
<div>
<br /></div>
<div>
The ACE conference took place in Kraków a little later in the year. I arrived early to take part in the initial day of workshops. Sadly, Marcin Floryan's workshop didn't happen but thankfully Jim Benson's was a good alternative.<br />
<br />
I had some time to tighten up the talk a little. I also was a bit less nervous and so I was pretty happy with how it <a href="http://vimeo.com/44327015">turned out</a>.<br />
<br />
I really enjoyed the conference as a whole. The single track and short talks are a nice approach and it was a really interesting mix of speakers. So it was nice not to have to miss out on any of the talks.<br />
<br />
Again it was hugely inspiring to have so many interesting conversations with people. In particular, I was very happy to have met Paul Klipp. His friendliness and encouragement were very appreciated and the work he does at Lunar Logic is something people should take a look at.<br />
<br />
Overall, I'm glad that I got myself to do something I'm incredibly uncomfortable with. And I would definitely recommend both conferences to both attendees and speakers.<br />
<br />
And while I'm talking about conferences, I also wanted to mention the german software craftsmanship conference that took place for the second time in a nice little town called Rückersbach. It was cool to see that the german community has grown and is doing so well. And it was very nice yet again to meet new and old friends. I enjoyed finally meeting Benjamin Reitzammer after having interacted on twitter for a while. And some people even came from all over Europe. Thus I met Sandro Mancuso, Samir Talwar, Cyrille Martraire, Adi Bolboaca and Erik Talbom again. I do sometimes worry that our community might be a bit too small when you constantly run into the same people throughout Europe. But then I really do appreciate having the chance to stay in touch with them, so why worry.<br />
<br />
<h3>
Coderetreats</h3>
</div>
</div>
<div>
After having taken part in the Legacy Coderetreat in Belgium the year before I was eager to try out running one myself. So I did just that with the help of Alex Peters in March in our office in Hamburg. It was well-received but I wasn't quite happy with the format. The later sessions require you to redo some basic refactorings each time. To counter this, we allowed people to continue working on the code without resetting after each session. But this led to different pairs arriving at very different different codebases in the end. </div>
<div>
<br /></div>
<div>
For the global day of coderetreat I helped facilitate one of the two events in Johannesburg. I paired up with Janco Wolmarans, whose company Driven Software was hosting one of the events. There was a good turnout, the weather and the venue were very nice and I think people had a good time. </div>
<div>
<br /></div>
<div>
I was also very happy that we were able to have quite a few brief google hangout sessions with people all over the world. The GDCR is a pretty amazing thing and I'm happy I could be a part of it.<br />
<br />
Facilitating for a large group is pretty exhausting though and it was really nice to be able to switch back and forth with Janco.<br />
<br />
<h3>
South Africa</h3>
</div>
<div>
Back in April we had a little company-internal webcast about the work ThoughtWorks is doing in Africa. And I was immediately intrigued by the different kind of entrepreneurialism and the aspiration to help grow the IT community there. And since I was eager to keep changing things I told my boss Nick that I'd like to go on assignment there. He was nice enough to put me in contact with the South African office and so, by end of August I made it to Joburg. </div>
<div>
<br /></div>
<div>
Giving up my apartment, moving my belongings into storage, getting vaccinations, figuring out the bureaucratic issues around health care and getting a Visa proved to be quite hectic. Once again my sanity was saved by setting up a Personal Kanban board for the project.</div>
<div>
<br /></div>
<div>
I've already <a href="http://danieltemme.blogspot.com/2012/09/south-africa-first-impressions.html">written a little bit</a> about my experience arriving in Johannesburg. Lots of that is still true, although I do understand a little bit of Cricket now. The socializing bit also changed somewhat as there are a plethora of events happening, lots of which are organised in and/or by our office.<br />
<br />
We've also explored both Johannesburg and its surroundings a bit more. One particularly nice trip was to God's Window, which Kyle Hodgson wrote about <a href="http://kylehodgson.com/2012/12/03/panorama-route/">here</a>.</div>
<div>
<br /></div>
<div>
One other event I'd like to explicitly mention was the <a href="http://www.blackgirlscode.com/about-bgc.html">Black Girls Code</a> event we ran in October. The excitement that we saw in the kids was amazing and inspiring and it's something that will stay with me. I can't wait until we do the next one. </div>
<div>
<br /></div>
<div>
Overall though, I definitely underestimated how much stress the move would put on me. Being in such a completely different environment without direct contact to my support network, with so much going on, all while still doing regular client work on top of it took quite an emotional toll on me.<br />
<br />
<h3>
Briefly back to Germany</h3>
</div>
<div>
So it was really nice to go back to Germany for the holidays. Arriving back in Germany was almost more of a culture shock than arriving in Joburg. I spent the first two evenings just aimlessly wandering around Düsseldorf in the rain. It was nice to be able to do that and to make use of public transportation. Being able to just walk around the city, even after dark, is probably the thing I miss the most in South Africa.</div>
<div>
<br /></div>
<div>
I happened to be back just in time to join the office christmas party in Hamburg. It was nice to meet the new people that had started while I was gone and to reconnect with the other colleagues. And the warm welcome I got felt really nice.</div>
<div>
<br /></div>
<div>
Meeting up with friends and family and being able to spend some time with them was just what I needed. I felt a lot better after the 4 weeks I stayed in Germany and with the constant rain and cold I was looking forward to head back to summer.<br />
<h3>
On to 2013</h3>
</div>
<div>
And so I got back to Joburg. And the weather is indeed very nice. And I've been quite happily busy since. Sadly this meant that this blog post dropped quite low in priority. I'm glad I made it through. Thanks for reading this. Have a nice 2013!</div>
<div>
<br /></div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-86829801400433413602012-09-21T20:01:00.000+02:002012-09-21T20:01:06.534+02:00South Africa - first impressionsIt's now been 4 weeks since I set off from a not so impressive summer evening in Hamburg to arrive in a slightly warmer Johannesburg the next day. It's high time I capture some of the first impressions if they're to be first impressions.<br />
<br />
But just to quickly give a status update for the people that care: I'm fine, the project I'm working on is fine, the TWers here are cool and it's exciting to see the office grow. The nature of how things are here does limit my socializing though and thus makes me feel a little isolated.<br />
<br />
On now for my highly subjective observations:<br />
<br />
<ul>
<li>South Africans are even crazier about their BBQing (or Braai-ing) than Germans. The main difference being the amount and the sheer size of the meat. </li>
<li>Food... lots of Avocados and lots of meat in general. I'm loving it.</li>
<li>I was told that only red meat is meat and chicken counts as a vegetable</li>
<li>100% of sampled offices (2) use fingerprint scanners instead of keys. Not sure if this could ever fly in privacy-conscious Germany, but it is convenient.</li>
<li>Oh how I miss my reliable, fast and cheap internet. </li>
<li>Our office is really nice and next door it has proper hipster coffee. </li>
<li>Let's not talk about beer though. Instead, stick to wine.</li>
<li>Traffic lights are called robots</li>
<li>Driving involves a change of habits owing to the security problems. Bags go in the trunk, phones stay in the pocket, windows stay up</li>
<li>In general people are excessively friendly though. The common "How are you" is actually answered and not just mirrored back. After taking a while to get used to the latter being the norm in the UK it's weird to have to unlearn that. </li>
<li>Live seems to center around cars and malls. This is a bit annoying, as I can't stand malls</li>
<li>The exception to this being Melville, which has lots of small shops and cafes on actual streets that you can walk on. I found <a href="http://open.spotify.com/track/4JNlOKg1uTY6O4RzvSStaa">this nice song</a> there.</li>
<li>Basic satellite TV (which seems fairly common) has about 10 sport channels. It doesn't seem uncommon to have those running on TVs around the office. </li>
<li>I do not understand Cricket. </li>
<li>Everything happens two hours earlier. I get up two hours earlier, I start work two hours earlier, I'm home two hours earlier, shops close two hours earlier, I go to bed two hours earlier. I'm still not sure if that's also a security side-effect.</li>
<li>Giraffes are awesome.</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://a.yfrog.com/img735/2189/8lnhp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="http://a.yfrog.com/img735/2189/8lnhp.jpg" width="400" /></a></div>
<div>
<br /></div>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-86491740497849719242012-07-31T16:28:00.001+02:002015-09-13T18:53:34.396+02:00Three tales of browser-based test suites [Part 1]The topic of browser-based testing seems to come up again and again and on many occasions I meet people who have expectations that don't match my experience. So I guess it only makes sense to write down these experiences and some of the conclusions I came to.<br />
<br />
I'm not even going to try and go into distinctions between acceptance, functional, integration or whatever testing. Whatever you're calling those tests, if they are instrumenting a web browser, that's what I'm talking about. (If you care about the distinctions, or about testing in general, I recommend reading Gojko Adzic's excellent book <a href="http://specificationbyexample.com/">Specification By Example</a>.)<br />
<br />
I want to look at three concrete examples that I have worked on over the past years.<br />
<br />
In the first case, nobody on our team had prior experience, except for a short but traumatic brush with IBM's Rational Functional Tester (remember kids: friends don't let friends use IBM products). To get rid of that, we decided to go ahead and try Selenium.<br />
<br />
We initially recorded tests with the Firefox plugin but quickly realized that this wasn't maintainable and didn't really offer us good control for selecting elements. Our Tester <a href="https://twitter.com/bm_solutions">Benjamin</a> then took it upon him to write tests in Java and started to integrate them into our CI environment. Over time he created a solid set of Page Objects that allowed us to write new tests fairly quickly.<br />
<br />
It took the rest of the team quite a while to take some ownership of these tests but eventually we came to a point where we'd sometimes even drive new features from these Selenium Tests.<br />
<br />
There were hurdles along the way. Tests were brittle and the execution time was unacceptable (>30 mins). This improved with newer versions of Selenium, use of Selenium Grid to parallelize tests and by keeping a close eye on the VMs running the browser instances. In the case of IE(<8 gave="gave" just="just" p="p" simply="simply" up.="up." we="we"><br />
Due to some relatively complex processes it was also fairly hard to test later stages of these processes. We only slowly got better at setting up test data for this without making use of the browser. This left us with some unfortunate holes in automated coverage.<br />
<br />
There were still manual tests for each release for all of our major supported browsers. But with more of the core functionality being handled by automated tests and with the amount of changes shrinking due to shorter release cycles the effort for this went down considerably.<br />
<br />
We also became better at writing unit and integration tests and our confidence in these grew.<br />
<br />
What did I take away from it:<br />
<br />
<!--8--></8><br />
<ul>
<li>the demand for these tests was driven by Benjamin wanting to automate his tests to make his life easier. And also his desire to learn more about Java. It was a relatively clear goal and the benefits of effort spent on automation were fairly clear. Where automation was hard, it allowed him to balance that effort with the effort of doing the tests manually</li>
<li>setting up and maintaining browser instances for tests and keeping them stable is hard, unthankful work and I'm glad that these days you can just hand money over to <a href="http://saucelabs.com/">saucelabs</a> to do that for you</li>
<li>getting the CI builds to be reliably green made shared ownership easier. Collaboration on these tests continued to grow.</li>
<li>closely related to that, the tests have to run fast. If they run for more than ten minutes they might as well not exist</li>
<li>we had relatively few Selenium tests compared to our unit-tests but there were the odd cases of bugs that weren't caught by our normal test-suites</li>
<li>when we rewrote a lot of the front-end JavaScript and test-drove those with jasmine, browser compatibility issues became very rare</li>
<li>as our understanding of all the different tests grew, it became easier to decide when we could avoid writing an extra Selenium test</li>
<li>working closely with the rest of the team and writing the tests in Java gave our Tester room to grow and learn and turn into a regular dev on the team. Seeing that happen was probably one of the most fun things during my time there. The rest of the team also took up some of the manual testing work.</li>
</ul>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
<span style="font-size: x-small;">(Edit 13.9.15: removed some point about testers that I didn't like anymore)</span><br />
<br /></div>
<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">
Continue on to <a href="http://danieltemme.blogspot.de/2013/04/three-tales-of-browser-based-test.html">part 2</a></div>
<!--8-->Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-85736274410735476952012-04-04T21:48:00.001+02:002014-02-06T15:47:24.107+01:00Timetravelling in JavaScript unit tests<br />
At the February <a href="http://berlinjs.org/">berlinjs</a> meet-up Krzysztof Szafranek had a very nice, short talk about TDD in JavaScript (slides <a href="http://szafranek.net/works/presentations/meetjs-unit-testing/">here</a>). Among many other things he was showing <a href="http://busterjs.org/">busterjs</a> and the way it lets you test asynchronous stuff without having to actually wait for time to pass.<br />
<br />
I made a note of it to give it a closer look. When I recently had to write some JavaScript again, I remembered about it and was keen to give it a try. Since we were already using jasmine as our testing framework, my colleague Christoph and I were looking for something equivalent there. To cut the intro short, there is: <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">jasmine.Clock</span>.<br />
<br />
<a name='more'></a><br />
<br />
<h4>
The classic jasmine async helper methods</h4>
So let's look at an example. Suppose we want to test whether a focus event triggers the display of a tooltip. Since this behaviour happens asynchronously, you'd usually use jasmines <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">runs()</span> and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">waitsFor()</span> functions to defer verifying your expectations until the code actually had a chance to run.<br />
<script src="https://gist.github.com/2303459.js?file=tooltip_async_spec.js">
</script>
This has a couple of annoying limitations. First off, writing the test gets a bit more complicated and the test becomes harder to read. Next, if we’re only verifying such a simple behaviour (as a good unit test should) we end up duplicating the check in <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">waitsFor()</span> and in the actual <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">expect()</span> block. Admittedly, we could just leave out the last block, but that hurts the expressiveness of the test.<br />
<br />
And then there’s the issue of time. Waiting for 200 ms doesn't seem that bad, but from my experience these things quickly add up. And what if we’re testing for something that’s happening with a larger delay? Making it even worse is the negative case. How long does it take until <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">waitsFor()</span> fails, if what we’re testing isn’t working (yet)? A timeout can be specified as another parameter to waitsFor but by default this is set at 5 seconds. And in the Unittestiverse, that is an eternity.<br />
<br />
<h4>
Using jasmine.Clock</h4>
So, here’s how we can test the same thing using <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">jasmine.Clock</span>:<br />
<script src="https://gist.github.com/2303459.js?file=tooltip_spec.js">
</script>
This already reads a lot better in terms of describing the behaviour we’re interested in. It does completely hide the fact that the underlying code gets called asynchronously but I see that as a benefit in this case.<br />
<br />
The other big benefit is that this test now runs in about 10 ms in my browser. No matter whether it fails or not.<br />
<br />
I also like how this works internally. It's a simple idea, yet clever. And while clever things usually only end up causing trouble I don't mind taking that risk if it gives me such big benefits.<br />
<br />
The setup call (<span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">useMock()</span>) redefines JavaScripts core async methods <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">setTimeout()</span> and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">setInterval()</span> (and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">clearTimeout()</span> and <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">clearInterval()</span>) and replaces them with their own implementation, which stores the callback and the time after which to call it.<br />
<br />
When you call <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">Clock.tick(200)</span> it executes the stored callbacks that were supposed to happen in that period, in the appropriate order. This happens synchronously from inside our test. So by the time we verify the expected behaviour, everything is hopefully in place.<br />
<br />
After our test has run, jasmine restores the original functions and any other tests that might rely on the original behaviour should work fine.<br />
<br />
<h4>
Concluding</h4>
<div>
I like it a lot and am wondering why I only stumbled upon it now. If I don't care about the aync-ness of some behaviour - which is the default case, as it is just an implementation detail of the language - I can create more expressive tests with less effort.</div>
<div>
<br /></div>
I can probably come up with some cases where this way of testing might not be the best way to go. But my gut feeling is that those cases would smell of not being at the unit level.<br />
<br />
A cursory glance at google suggests that there also might be some issues with specific features of other JavaScript libraries.<br />
<br />
But tell me about your experience. Have you used this feature before? Did you run into problems? I have only just started writing the first tests in this way and maybe there are some caveats I should know?Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-40220179657448770202011-12-30T22:02:00.003+01:002021-08-02T15:12:52.369+02:00Thank you, 2011<br />
It’s December. That means it’s time to write a long, rambling post looking back on the year. It’s been a very exciting and eventful year for me, so I’m actually appreciating having the time to do this.<br />
<br />
Last new year's eve I tweeted the following. And I wasn't wrong.
<br />
<blockquote class="tr_bq">
<a href="https://twitter.com/#!/dtemme/status/20921159998509056">2011 is gonna be amazing, you just watch!</a></blockquote>
<br />
I’ve changed jobs, moved from Düsseldorf to Hamburg, took part in a lot of conferences and events, organised a few things myself and in all of that met a huge amount of amazing people that truly inspired me. Thank you, everyone! It was an amazing year.<br />
<br />
<br />
<a name='more'></a><br />
<span class="Apple-style-span" face="Arial, Helvetica, sans-serif"><b>Starting out</b></span><br />
<br />
At the start of the year I was getting frustrated at work because I was not able to communicate what I thought were some positive and useful lessons. We had a great team and our experimenting with agile methods helped us get better at developing software and at better understanding our customers. But we weren’t able to make these experiences more visible and I grew impatient and unhappy with the decisions made for the rest of the department.<br />
<br />
And so, slowly, the decision to look for a new job started to form. I really liked the job and the team and the company but I was scared of losing my enthusiasm and stagnating, which has happened to me in the past. And so I wasn’t eager to just join any other company but rather look for something where I could learn as much as possible. I didn’t want to leave the team before finishing the current set of features that were supposed to go live for an event in May. So I decided to wait until then to start looking for a new job in earnest. It didn't quite go like that.<br />
<br />
<span class="Apple-style-span" face="Arial, Helvetica, sans-serif"><b>A week in London</b></span><br />
<br />
In March my colleague Christian Kellner and I were lucky enough to be able to go to QCon in London. And since I was already in London and somehow got word that the SDT Conference was happening on the weekend after QCon, I took part in that, too. It was a week of intensive learning (and drinking, I guess) and so it was all too much to ever sit down and do a proper write-up, like I did last year. I’ll try and give it a quick shot now.<br />
<br />
One overarching theme and notable difference to the year before was affordable internet roaming and thus access to Twitter and Maps. What did people ever do without them? This meant I was able to find interesting people to talk to during the evenings and this made the week a much richer experience.<br />
<br />
One of those interesting people was Benjamin Mitchell. He pointed me to the eXtreme Tuesday Club (twice, after me not really getting the “Tuesday” part of it on Monday ☺) where we had an interesting but very confusing conversation. This gave me the incentive to go see his talk later in the week after which a lot of our earlier conversation started to make sense. <a href="http://www.infoq.com/presentations/Kanban-Management-Fad">His talk</a> and my subsequent further reading on ‘that Argyris stuff’ was probably the biggest influence on me this year. It helped me see a lot of problems I have communicating with people. And trying to avoid attributing malevolent intent to people just because they do or say things I disagree with is a very simple but powerful concept and I think that made me a more relaxed and happy person.<br />
<br />
<blockquote class="tr_bq">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.flickr.com/photos/8268882@N06/5518265401/" style="margin-left: auto; margin-right: auto;" title="QCon London 2011 by peter_java_pilgrim, on Flickr"><img alt="QCon London 2011" src="http://farm6.staticflickr.com/5060/5518265401_52b7ca7c7f.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Me rambling at Torbjörn Gyllebring and Benjamin Mitchell (photo by Peter Pilgrim)</td></tr>
</tbody></table>
</blockquote>
<br />
On Saturday evening, after the first day of SDT Conf, some of us, surprisingly, ended up in a pub. Here, Jo Cranford made a very enthusiastic (and ultimately convincing) sales pitch for joining ThoughtWorks. After a few days deliberation I contacted Jo and eventually applied. (I should also mention Marc Johnson and Liz Keogh, who also made me feel like applying might be a good idea.)<br />
<br />
The application process took quite some time but was very interesting (but I’ll not go into that now). In the end, I got an offer, quit my old job and started with ThoughtWorks in July. Leaving my old team was very sad but they were very supportive and understanding, which made it even sadder, I guess.<br />
<br />
<span class="Apple-style-span" face="Arial, Helvetica, sans-serif"><b>A very busy couple of weeks</b></span><br />
<br />
As a kind of bookend to my time in Düsseldorf Adrian Bolboaca and myself held a code retreat in May. Andreas Ebbert-Karroum was kind enough to arrange for <a href="http://www.codecentric.de/">codecentric</a> to sponsor the location and catering. It was a <a href="http://shishkin.wordpress.com/2011/06/19/code-retreat-dsseldorf/">nice event</a> with a dozen participants and I really enjoyed the opportunity to facilitate together with Adrian. I’m incredibly impressed with the amount of time, effort and skill he puts into helping people become better developers and I hope I continue to keep running into him (which happened surprisingly often, this year). (The same actually goes for Greg Dziemidowicz, where all of this also applies.)<div><br /><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://web.archive.org/web/20130116043137/http://twitter.yfrog.com/kgo28zj" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="383" data-original-width="640" height="192" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSWLBJeE8Hua3psvuUG2Od9Ax_6WojLPdOTZFq3ubneXyB5fFF424fjyptI3zfq87-QDlR-PGDoiLF3D4WWnY-Q8O94uDCEca3Y8k7Y6vVRoAzY3RLOdhoHJ-PviAKhZjeDB8irnG3Ecy9/" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Me rambling at more people (photo by Andreas Ebbert-Karroum)</td></tr></tbody></table><br /><br />I took part in a few more code retreats and also the ‘first’ legacy code retreat, held by JB Rainsberger. It’s always fun, it’s always nice to meet and pair with new people and I can only recommend it to anyone. I also hope to be organizing a legacy code retreat in Hamburg some time early next year but more on that later.<br />
<br />
With that done it was time to find a new apartment in Hamburg and sort out moving there. This proved to be fairly challenging, as the housing market in Hamburg is insane. ThoughtWorks was helpful and I finally found something just in time before I started work on my first project.<br />
<br />
Having all of these things overlap and taking part in four different cities I’m amazed everything eventually worked itself out. I owe everything to my friends & family (especially my brother) who helped me out a great deal. And I was lucky in reading Personal Kanban just in time to find some tools to help me stay sane.<br />
<br />
<b><span class="Apple-style-span" face="Arial, Helvetica, sans-serif">The first project</span></b><br />
<br />
After a week of induction and a couple of days in Hamburg finding the new apartment I was already off to Berlin. Here, two colleagues and myself joined a newly formed team.<br />
<br />
I was excited and curious to see how things were different when coming in as an external consultant. Everyone seemed to have pretty high expectations for us, which scared me a bit. Thankfully, this also meant that there was a lot of trust from the start. And since the team was already doing well in terms of testing and short iterations, this meant that we were quickly off, writing useful code.<br />
<br />
My involvement in that project ended just the other day and for me it was a huge success. I immensely enjoyed having been part of that team and so leaving it was yet another very sad moment. In a way, I think I got off to a very easy start. The people on the team were really cool, there was already strong management support for working in an agile way and I got to work on a technology stack I was already familiar with (including more Javascript, which I find increasingly fun to work with). It will be interesting to see how that compares to future projects.<br />
<br />
<span class="Apple-style-span" face="Arial, Helvetica, sans-serif"><b>More conferences</b></span><br />
<br />
In between my time there I also managed to visit two more conferences, Agile Lean Europe in Berlin and Lean & Kanban Benelux in Antwerp. I keep going back to Belgium even now after it’s no longer an easy two-hour car ride from home. This is testament to the quality of the Belgian beer and to the really nice events the guys from <a href="http://www.agileminds.be/">Agile Minds</a> keep organizing.<br />
<br />
Both conferences I really enjoyed. My highlight from LKBE was a <a href="http://vimeo.com/30696302">very funny talk</a> from Jim Benson (co-author of aforementioned Personal Kanban). At ALE it was my colleagues’ Barry O’Reilly and Jo Cranford talking about mental models (i.e. more of that Argyris stuff). (The way people and topics intersected throughout the year is something I found really funny. It is a small world.)<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.flickr.com/photos/mfloryan/6135327043/" style="margin-left: auto; margin-right: auto;" title="IMG_6244 by mfloryan, on Flickr"><img alt="IMG_6244" src="http://farm7.staticflickr.com/6187/6135327043_e79530c7b0.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">An evening at ALE (photo by Marcin Floryan)</td></tr>
</tbody></table>
<br />
ALE was a whole different thing in itself though. The vibe was distinctly different from other conferences, even other un-conferences. There was a lot of positive energy and a sense of hopefulness. Considering there is currently a lot of gloominess in the agile community (with good reason, I guess) it was nice to see people spreading their enthusiasm. Also, I got a random and unexpected hug, which I appreciated more than I would have expected.<br />
<br />
Also at ALE, I got the idea for starting xtcBerlin, which I’ve already written about <a href="http://danieltemme.blogspot.com/2011/09/xtc-berlin.html">here</a>. There is now a small but steady group of people meeting regularly for beers and shop talk and I’m happy for the conversations I’ve had. I’m pretty hopeful for this to keep on going even after I leave Berlin (in March, I guess?) though I should probably be more aggressive in advertising it.<br />
<br />
This might be a good point to say something about Berlin. Eh, whatever…<br />
<br />
<b><span class="Apple-style-span" face="Arial, Helvetica, sans-serif">ThoughtWorks</span></b><br />
<br />
I’m not going to go into too much detail about ThoughtWorks, as I’m running out of steam writing this. To keep it short: I like it. What really stood out for me was how welcoming every single ThoughtWorker I’ve run into has been. There’s a level of openness and willingness to collaborate that I don’t think is common over such a large group of people.<br />
<br />
<b><span class="Apple-style-span" face="Arial, Helvetica, sans-serif">In summary</span></b><br />
<br />
It was a very good year. Writing this, the main thing I kept coming back to was how much I enjoyed interacting with so many people. I feel privileged and hope I was able to give back at least a tiny bit of the awesomeness that I received. Again, thank you all very much!<br />
<br />
There’s just one other thing that I want to point out, because it is important to me and I want to remind myself of it. All the major decisions I made this year went against my nature and were not always easy or comfortable for me to make. And I regret none of it. I’m richer for all the experiences I’ve made.<br />
<br />
Which is to say: leave your comfort zone every once in a while.<br />
<br />
Prosit!<br />
<div>
<br /></div>
</div></div>Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-2086900246827854832011-09-25T23:05:00.000+02:002012-01-24T14:08:26.563+01:00xtc BerlinLate Tuesday evening, the night before the<a href="http://ale2011.eu/"> ALE conference</a> started, I sat in the hotel bar of the venue talking to people who had arrived early. Looking around, I thought, "cool, it's like an extreme tuesday club in Berlin". Since then I've been thinking about what it would take to actually create something like this in Germany.<br />
<br />
So what is the extreme tuesday club?<br />
<blockquote>
A regular London meeting (weekly) for Agile/XP/Kanban/Scrum newbies, practitioners, and experts. <a href="http://twitter.com/extremetuesday">(*)</a></blockquote>
That's not very elaborate but I like that it casts a fairly wide net in terms of target audience. <br />
<br />
There are already a lot of different software and agile related user groups in Berlin and I like what I've seen of them so far. But each of these only cater to a specific topic or technolgy.<br />
<br />
I'm looking for something less formal. Have a beer, talk to people about what they're working on, share war stories, cross-pollinate new ideas, ask for help or give help, if wanted. I would hope it would be as inclusive as possible. So, newbie or expert, programmers, PM/POs, design people, start-uppers, whatever - as long as you care about what you're doing and want to talk with people about it, it should be fine.<br />
<br />
I did a little open space session at ALE on this and there seemed some general interest and I said I would just try and get this rolling and just see what happens.<br />
<br />
Someone suggested the <a href="http://www.cafe-100-wasser.de/">Cafe 100 Wasser</a> as a pub to go to. And that's where I'll be, this Tuesday from around 8pm onwards. I'd be happy for you to join me. If you do plan to come, please let people know <a href="https://twitter.com/#!/search/%23xtcberlin">on Twitter.</a><br />
[we've since changed pubs around quite a bit. Twitter is probably the safest bet to find out where people are. We're now usually at the Prater Garten in Prenzlauer Berg]Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-88991748917021842732011-09-17T21:33:00.000+02:002011-09-17T21:33:36.127+02:00Some closure (ha!) to 7 Languages in 7 WeeksI'm currently trying to work through a backlog of things I've been meaning to blog about. And at the top is this post. The whole experience deserves being wrapped up properly. But I'll keep it brief.<br />
<br />
When last I wrote about it, I was somewhere in the middle of week 6, working with clojure. This is probably my favourite of the languages in terms of learning new things and offering new perspectives while also having enough momentum that I might actually be able to do something with it at some point. I really hope this doesn't fall victim to my inherent lazyness.<br />
<br />
The last week dealt with Haskell. At this point I was so busy with moving apartments and starting my new job that I barely managed to read the chapter but didn't get to try the examples. It sounded interesting but maybe a bit too strict. Others in the study group seemed to like it a lot though.<br />
<br />
So, what's left to say. I really appreciated the study group and being able to learn from other <a href="https://github.com/mbbx6spp/7languages7weeks/network">people's code on github</a>.<br />
<br />
I enjoyed the weekly google hangout sessions with the others, when I was able to join them. I particulary liked how aimee facilitated those, keeping track of threads of discussions and making sure everybody got to say something.<br />
<br />
The book requires quite a bit of commitment to get the most out of it but where I did that I felt it was well worth it.<br />
<br />
I certainly recommend doing this together with other people. And <a href="https://twitter.com/#%21/sevenlanguages">share your experience</a> with the world. <br />
<br />
All in all, I stick to what I said in my <a href="http://danieltemme.blogspot.com/2011/06/first-language-done-inspiration-had.html">first post</a> on this.We live in amazing times!Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-31370329564837203392011-07-21T12:16:00.000+02:002011-07-21T12:16:26.728+02:00Learning clojure just in timeIt looks like we've moved to clojure at just the <a href="https://github.com/clojure/clojurescript">right moment</a>. <br />
<br />
As mentioned, I started using emacs for the first time again in ages. While I still struggle remembering all the useful key combos I did get a little bit of help in the transition by installing <a href="http://aquamacs.org/">aquamacs</a>. It keeps buffers in tabs and lets you use cmd-c,x,v while you're trying to remember how to work the yank buffer.<br />
<br />
I'm really liking clojure so far. I'm finally writing tests again (not sure I actually ever did for any of the other languages) and it's nice to have that inside emacs and also have the REPL to try things out.<br />
<br />
So, Day 1 only had two excercises. I'm going to just point to <a href="http://sermoa.wordpress.com/2011/07/20/week-6-day-1-feeling-my-way-in-clojure/">aimee's entry</a> on that, because we both came up with pretty similar code.<br />
<br />
But let's look at the second exercise<br />
<blockquote>Write a function called (collection-type col) that returns :list, :map, or :vector based on the type of collection col.</blockquote>I got the following:<br />
<script src="https://gist.github.com/1096869.js?file=gistfile1.lisp">
</script><br />
I wasn't quite happy with repeating the col argument for each condition. So I started to play around with using the various test methods (list? vector? map?) as keys in a map and then filtering the keys based on the collection argument given. I eventually gave up on it, because it is a rather silly approach. But it was an interesting opportunity to play around with the language.<br />
<br />
<script src="https://gist.github.com/1096897.js">
</script><br />
Then I noticed multi-methods and became interested. Method dispatch based on the result of a function applied to the arguments of the method. This is pretty powerful and will probably take a while to get comfortable with. I used the rather simplistic approach of dispatching on the class to do the second exercise again.<br />
<br />
<script src="https://gist.github.com/1096875.js">
</script><br />
This is silly, too. And it works pretty sloppily. The empty list creates an instance of PersistentList$EmptyList which doesn't seem to match PersistenList. But whatever, it's good enough and it got me thinking about multi-methods. There is more on those in <a href="http://www.fatvat.co.uk/2009/01/multi-methods-in-clojure.html">this blog post</a>.<br />
<br />
And now it's on to day 2, where apparently we see the list comprehensions I was so impressed with in Erlang enter clojure, too.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-2552037347781136862011-07-19T16:28:00.000+02:002011-07-19T16:28:30.187+02:00Excuses, Excuses. Also, Emacs.My, I've been a bit lazy, I guess. Has it really been that long?<br />
<br />
Starting a new job and trying to find a new place to live has taken quite a bit of my time. So it was that during the Prolog week I started to struggle finding the time to do the examples. Then during the Scala week I didn't do much at all other than reading the chapter. But with Erlang I had some more time again and at least managed to do the day 1 and 2 stuff. With Clojure this week I hope to give it even more attention.<br />
<br />
For all of it, I neglected writing about it. So to get this rolling again I'll do a quick rundown.<br />
<br />
<h2>Prolog</h2><br />
Prolog is old and weird. The book compares it to Rain Man, which seems apt. Having never done any work with any logic languages this was very new to me. It was a very big shift in thinking. I appreciated that. It's one of the reasons to work through the book after all.<br />
<br />
I think Prolog as a language is not very practical for me. But the chapter provided some really useful basics for understanding the syntax of Erlang and for pattern matching, which shows up in the Scala and Clojure chapters, too.<br />
<br />
<h2>Scala</h2><br />
Scala was, as mentioned, somewhat neglected by me. Some of the syntax in the examples (especially for the actor stuff) seemed a bit weird to me and I really should actually work through them to get a feel for it. Minor inconsistencies in syntax are probably the main thing bugging me about what I read about Scala so far. And defining your default constructor inside the class definition while still having the option for actual init methods really rubbed me the wrong way.<br />
<br />
Still, XML as a first class language construct looks very nice and getting around some of Java's noise is also charming. I reckon we'll cross paths again at some point and I can give it a closer look.<br />
<br />
<h2>Erlang</h2><br />
Next came Erlang. And that was quite a bit of fun. Having been eased into the syntax by the Prolog chapter helped a great deal. I was quite fascinated by list comprehensions. I'm not sure if their power comes at the cost of maintainability. But it's hard for me to judge that given my lack of experience with the language and syntax.<br />
<br />
I didn't even get to play with the actor stuff but I suppose people are happy with it and specifically with the Erlang implementation. <br />
<br />
At some point I should really revisit Erlang. It's different enough to challenge the mind to take a new look at old habits. And it looks interesting in general with its focus on concurreny.<br />
<br />
<h2>Clojure</h2><br />
I'm trying to dig a little deeper this week again. Clojure is interesting to me because for a long time I've wanted to try and make sense of a Lisp language. <br />
<br />
In the process of reading up on it I noticed that a lot of people seem to prefer using emacs as an editor for clojure. So I installed that. (As a complete Mac noob let me point out that <span style="font-family: "Courier New",Courier,monospace;">brew install emacs</span> and <span style="font-family: "Courier New",Courier,monospace;">brew install emacs --cocoa</span> are two very different things. I have yet to learn why [cf. mac noob] but you probably want the latter.)<br />
<br />
I had been using emacs (XEmacs, to be honest) for quite a while as my primary development environment. But that was some 7+ years ago and I never really touched it again. I'm incredibly amused that a lot of the key bindings are coming back to me anyway. And it feels kinda nice. Maybe I will rejoin the battle for the one true editor. <br />
<br />
<blockquote>Sidenote: emacs installation notes for anyone who bothers. From someone who has no clue what he's doing:<br />
<ul><li style="font-family: "Courier New",Courier,monospace;">brew install leiningen clojure clojure-contrib </li>
<li style="font-family: "Courier New",Courier,monospace;"> brew install emacs --cocoa</li>
<li style="font-family: "Courier New",Courier,monospace;">git clone https://github.com/technomancy/emacs-starter-kit.git ~/.emacs.d</li>
<li style="font-family: "Courier New",Courier,monospace;">alias emacs='/usr/local/Cellar/emacs/23.3/Emacs.app/Contents/MacOS/Emacs -nw'</li>
<li style="font-family: "Courier New",Courier,monospace;">lein new someproject</li>
<li>add <span style="font-family: "Courier New",Courier,monospace;">:dev-dependencies [[swank-clojure "1.2.1"]]</span> to the <span style="font-family: "Courier New",Courier,monospace;">(def-project</span> entry in someproject/project.clj</li>
<li style="font-family: "Courier New",Courier,monospace;">lein deps </li>
<li style="font-family: "Courier New",Courier,monospace;">lein swank</li>
<li>start <span style="font-family: "Courier New",Courier,monospace;">emacs</span> in another shell</li>
<li>(you may or may not need to install some elpa packages for slime and swank and paredit and whatever. See if it works with the just the stuff from the emacs-starter-kit or otherwise ask google. I did get annoying errors doing this and have no idea why it worked in the end. Sorry.) </li>
<li style="font-family: "Courier New",Courier,monospace;">M-x slime-connect</li>
<li>edit e.g. someproject/test/someproject/core.clj</li>
<li>execute tests with <span style="font-family: "Courier New",Courier,monospace;">C-c C-, </span></li>
<li>you can also do other things with the REPL inside emacs but you best google for that</li>
</ul>I hope that can be of help.</blockquote>Back to the study group...<br />
<br />
It seems like most of us have been struggling keeping up with the pace of the book, with everyone taking the odd week off from working through all the examples. But we were lucky that it seems to have mostly been different weeks, so there was always at least one person who could explain more details about a given language. So while I was very lazy there have been a lot of really interesting posts from others in the group.<br />
<ul><li><a href="http://sermoa.wordpress.com/2011/07/04/week-3-day-3-solving-a-sudoku-with-prolog/">aimee on Prolog</a></li>
<li><a href="http://sermoa.wordpress.com/2011/07/08/week-4-day-2-scala-reveals-its-functional-side/">and again on Scala</a> (fuck the pope!)</li>
<li><a href="http://plagelao.github.com/7languages7weeks/erlang/2011/07/13/erlang-day-two.html">Alberto on Erlang</a> (check out the Solution = list comprehension. It's quite impressive)</li>
<li><a href="http://mbbx6spp.github.com/7languages7weeks/2011/07/17/erlang-where-next.html">Susan with an Erlang follow-up</a></li>
<li>More posts <a href="https://twitter.com/sevenlanguages">here</a></li>
</ul><br />
We've also continued our weekly chats which are always a source of inspiration for me. As of recently we're using the Hangout feature of Google+ and it's really good. Since Skype keeps crashing my little Win7 netbook I'm happy to have found a better replacement.<br />
<h2>Tl;dr</h2>It's really nice to see how the chapters of the book build up on each other. I think the book has made me more adventurous to just play around in new languages. It is still nice to have this little virtual study group to help push me along. Technology is still awesome, too (git pushing from a train via tethering to the phone. Magic!) I reinstalled emacs after all those years.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-37135829494959008582011-06-28T15:10:00.000+02:002011-06-28T15:10:21.341+02:00[Insert clever play on the name Io]And so goes the second week and the second language on our seven week trip. Compared to the first week in Ruby, I struggled a lot more with Io. It's a language with very simple rules which, for me, made the edge cases all that more confusing. I also was a bit preoccupied with other, unrelated issues and so I skimped on a lot of the examples. Thankfully, Alberto did a lot of that work and <a href="http://plagelao.github.com/7languages7weeks//2011/06/21/io-day-one.html">wrote about it</a> in a series of excellent posts. If you want to know more about Io, you should really read those.<br />
<br />
As such, I'm going to keep it short with my own observations. As an abstract, Io is a prototype based OO language where everything is either an object or a message passed to it.<br />
<br />
<ul><li>I was unable to build Io in Windows and I don't know what I would've done if I hadn't found <a href="http://tech.groups.yahoo.com/group/iolanguage/message/12573">some forum posting</a> with a link to pre-built binaries. </li>
<li>I particularly liked the way conditionals were also just messages, apparently just extending the base boolean types</li>
<li>Yet I don't really understand message precedence and how something like <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">self sum / self size</span> works. self size obviously gets evaluated before being passed to the divide operator, which I didn't expect</li>
<li><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">getSlot('foo') code print </span><span class="Apple-style-span" style="font-family: inherit;">will print a method definition, similar to Javascript's </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">foo.toString()</span><span class="Apple-style-span" style="font-family: inherit;"> (where 'foo' is a method/function)</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">sadly, that is not usable for the language constructs as they are written in C</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Io has a pretty solid concept of coroutines, actors and futures, much unlike Javascript. Quickly writing some parallel code might indeed be one of the languages strong points</span></li>
</ul><div>It seems the book deliberately started with Ruby to ease me in and then started to get a bit more challenging with Io to progress to Prolog, which I guess will be quite a bit different from what I'm used to. </div><div><br />
</div><div>I'm again grateful for our study group. Our little skype conference showed that I wasn't the only one struggling with Io and I'm not sure I would've gotten much out of this chapter if it wasn't for other people's blog posts further explaining things. This isn't really a failure of the book as much as I just wasn't able to commit the time to really dig into the examples.</div><div><br />
</div><div>And now it's on to Prolog, which should get interesting, as I haven't worked with logic languages before. This time, installation is easy, as there is a package in cygwin that provides the 'pl' executable. (And, once again, let me recommend also <a href="http://danieltemme.blogspot.com/2010/08/windows-7-eclipse-mintty.html">getting mintty</a>.)</div>Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-56931030268542587992011-06-17T01:49:00.000+02:002011-06-17T01:49:59.512+02:00First language done; inspiration hadContinuing on through Seven Languages in Seven Weeks I've finished the chapter on Ruby. I'll quickly list a few more things I've noticed and then do a little initial retrospective.<br />
<ul><li>I was a bit confused with how method definitions apply to classes v. instances and how module inclusions and extending classes work into that</li>
<li>Interestingly, I feel reminded of similar troubles I had with understanding Javascript prototypes, functions and new. </li>
<li>obj.freeze appears to be a way to dynamically declare variables final. I suppose that could be useful</li>
<li>you can always pass blocks to functions even without having declared them as arguments</li>
<li>there is what I'd call reverse varargs that lets you explode arrays to match method arguments using the same notation as varargs, which I quite like. <span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">def foo(one, two, *rest) …<br />
foo(*[1,2], 3, 4, …)</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">Having things like </span><span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;">.methods</span><span class="Apple-style-span" style="font-family: inherit;"> on all objects to do reflection for debugging/getting to know the language is really helpful</span></li>
<li><span class="Apple-style-span" style="font-family: inherit;">if I had worked through this before and added a bit of rspec knowledge I might have been able to contribute a lot more on the occasions I paired on Ruby at code retreats</span></li>
</ul><div>Code is <a href="https://github.com/dmt/7languages7weeks/tree/master/ruby/day3">here</a>. </div><div><br />
</div><div>So now a little bit about the learning experience. I'm greatly enjoying this so far and I think it comes down to three things.</div><div><br />
</div><h2>The book</h2><div><br />
</div><div>The book is great for getting you started in a language. As I mentioned on twitter I left with more questions than answers. But I now have a vague idea of where to look to find those answers. It's a really great achievement to pique the interest to go into the details of a language and to not make you feel completely lost doing so. I'm already looking forward to learning about Io.</div><div><br />
</div><h2>The group</h2><div><br />
</div><div>I'm also really enjoying our little virtual study group. People share their questions, answers or just share their fun in the learning. There's a lot of interesting blog posts already (aggregated <a href="https://twitter.com/sevenlanguages">here</a>) and also quite a bit of activity on the github network for the project. I find this both liberating and motivating. It's safe ground for exposing your ignorance and at the same time I feel challenged not to slack off and actually keep working on it and do things like writing blog posts. </div><div><br />
</div><h2>The technology</h2><div><br />
</div><div>And I love the technology that enables this and the fact that there are people that care enough to take part in this. We live in amazing times! Programming is fun and being able to share that with others makes it even more fun. I love that it's so easy to organize this on twitter more or less on a whim (at least my taking part was on a whim). I love that to get started reading I only needed a few clicks on pragprog (even if the kindle version has its little issues). I love that github lets me see how others solved the problems given in the book, both reassuring me that I did something right or helping me along to find better solutions. And then of course it's great to be able to just download and try out all these languages.</div><div><br />
<br />
</div>Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-56909467503324933262011-06-14T22:34:00.000+02:002011-06-14T22:34:57.402+02:00Seven Languages In Seven WeeksI'm stuck trying to put my thoughts on estimation, conferences and switching jobs into writing. So many unfinished drafts, oh my!<br />
<br />
So instead I'm now trying to write the odd post about my experience working through Seven Languages In Seven Weeks.<br />
<br />
<a href="http://sermoa.wordpress.com/2011/06/10/7-languages-in-7-weeks/">aimee daniells</a> had the great idea to start an online study group for said book (not gonna type that title again, nu-uh). And since it helps distracting me from worrying about finding a new place to live within the next 3 weeks I gladly took the opportunity to join. (Sidenote: if you're looking for a flatmate in Hamburg please do get in touch.)<br />
<br />
The book is very interesting to me because I don't know all that much about any of the languages but have been meaning to take a closer look at Clojure, Ruby and Erlang for some time. It's nice to have something concrete that gets me doing that.<br />
<br />
The first language is Ruby. I've worked through days 1 and 2 now and here's a quick summary of what I took away from it.<br />
<br />
Ruby has a lot of syntactic sugar. Enough to almost certainly give you diabetes. Parts of me (the old, elitist parts) feel somewhat uncomfortable with that. Other parts of me (the ones trying to get work done in Java) just feel jealous.<br />
<br />
There were some more notes I took that I'll just list here without trying to add context (or sense)<br />
<br />
<ul><li>The kindle version of the book doesn't wrap the code examples correctly with larger text sizes. That's pretty annoying. Does no one test these things?</li>
<li>When googling for the api docs one should be careful that one reads the docs for the correct version of ruby one is using. I spent 10 minutes wondering why str.match(regexp) { block } never executed the block until I figured out that that feature just didn't exist</li>
<li>String and exec expansion seem to behave pretty much like in bash. Single quote string get left alone, double quote strings get processed and backticks execute native programs. (I hope I'm not misremembering my bash there)</li>
<li>if and while have counterparts in unless and until. Sugar++</li>
<li>Sugar++ would not actually work. Sugar += 1 does, however. And I think I like why that is the case</li>
<li>Numeric zero and empty strings evaluate to true, which i find pretty disgusting</li>
<li>Running in a windows shell I successfully ran into encoding issues for Umlauts. Probably Windows' fault. I hate character encoding</li>
<li>Cygwin can install ruby and Umlauts look ok there. Calling the windows ruby executables from inside cygwin, which I tried first, had some really weird issues</li>
<li>On that note: mintty still rocks</li>
<li>Enumerable has all the nice sugar you can only get via Google's guava in Java. And with blocks it's a lot better readable</li>
<li>And you can mix all that into your own classes, with just a bit of duck typing. Very nice</li>
<li>All that duck typing really makes me long for some grapes</li>
<li>If I understand it correctly, Hashes can lazily evaluate values from keys which reminded me of the guava MapMaker. Also very nice. </li>
<li>Hash.invert seems almost too sugary but could be useful</li>
<li>Same goes for String.next. Instant tooth decay!</li>
<li>A File API with permissions and methods to create symlinks? I never dared dream of that (although, wasn't there something in that regard in the works with Java, too? About time anyway)</li>
<li>IO.readlines/foreach is really handy. Convenient enough to never look at perl again. </li>
<li>The automatic closing of files when using blocks is also nice. Kinda like using() in C#, implicitly. (Wasn't there also something like that coming to Java? I can't remember all the things that may or may not go into the language)</li>
<li>I felt pretty clever doing Array.new(16) {|x| x+1} until I saw (1..16).to_a</li>
</ul><div>Code is <a href="https://github.com/dmt/7languages7weeks/tree/master/ruby">here</a>.</div><br />
<br />
All good fun so far.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-78526467883213080402011-03-04T19:51:00.000+01:002011-03-17T20:57:40.416+01:00Ignoring long-term planning and estimatingI got on the agile bandwagon fairly late considering people are now celebrating the 10-year anniversary of the agile manifesto. But it's been a good 2 years now and I feel like it's a good time to sum up some of my experiences. And I'll start by writing something about estimating that's recently been on my mind a lot.<br />
<br />
I get the impression that a large part of what people use to sell Scrum to managers is the ability to get better estimates and more reliable long-term planning. That tracking velocity and assigning storypoints to your features somehow enables you to determine what exactly you can release half a year from now. I don't think that's entirely honest. You still have no way to reliably predict accidental complexity; and team fluctuation, shifting priorities and delays in external processes that you depend on will still leave you guessing when you'll have that big new release ready.<br />
<br />
The constant feedback obviously helps to at least be able to react to some of these obstacles. A looming deadline works wonders to get stakeholders to prioritize the features they want implemented. But I think all of this is looking at agile development from an old-fashioned angle, that is likely to be more frustrating than necessary.<br />
<br />
Those big releases and big new major versions of your products just don't make all that much sense if you're not actually burning your software to disks to be put onto shelves. If you have a new little feature that will help your customers have a better experience using your product why wait to release it? If that feature actually doesn't help your customers, why wait to find out about it?<br />
<br />
If you're a long-term agilante (agilista? agilero?), that is probably pretty obvious. But personally, I don't think I really grasped the power of that until recently. Really taking the idea of short iterations with incremental changes to its conclusion is not something I've seen much of in the time I've been developing software. You may read about some of the big poster-child internet companies working that way and increasingly, little start-ups seem to have a lot of success with it. But once companies get to a certain size they seem surprisingly eager to hold back on actually releasing their software.<br />
<br />
<br />
And, with that said, I have decided that I do not care about estimating any more. I do care about the people on the team, I care about splitting items up into fine-grained tasks [edit: 'features' is probably the better word]. I might even care about tracking time spent on tasks to get feedback on whether we've become stuck on something. I care and take pride in the quality of the code we deliver. I care about people using that software and the feedback they can give. I don't care about dates in the future that may as well be arbitrary.<br />
<br />
I conveniently ignore any kind of marketing needs or grand c0mpany strategy. Because, really, why shouldn't I? If we can consistently release new features in a short timeframe and the quality is good, why shouldn't the company strategy adapt to this rather than the other way around?<br />
<br />
This idea is fairly fresh in my mind and I'm really looking forward to seeing what it develops into. I'm pretty sure I've missed a few things. And I'm curious what other people think about this...<br />
<br />
Edit:<br />
And to aptly prove the motto of this blog, Naresh Jain <a href="http://blogs.agilefaqs.com/2008/12/25/estimation-considered-harmful/">wrote about this</a> two ears ago. Well worth reading.Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-29043108706075122292011-02-09T15:06:00.000+01:002013-04-02T15:32:08.410+02:00Code Retreat - was ist das?<i><b>Edit: es hat sich viel getan. Code Retreats finden mittlerweile ziemlich häufig statt. Auf der Seite der <a href="http://www.softwerkskammer.de/">Softwerkskammer</a> findet man mehr dazu. Die Veranstaltungen sind immer kostenlos und es lohnt sich auf jeden Fall, mal teil zu nehmen.</b></i><br />
<br />
<br />
Vor kurzem habe ich an einem Code Retreat teilgenommen (<a href="http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=&search=retreat">Leo </a>gibt für "retreat" u.a. Klausurtagung, was das ganze einigermaßen trifft) und war davon sehr angetan. Ich plane gerade, selbst einen solchen Event zu organisieren und im Zuge dessen lohnt es sich einmal ein paar erklärende Worte auf deutsch zu schreiben.<br />
<br />
Ich bediene mich dabei sehr ausgiebig bei dem was Corey Haines und andere schon zu diesem Thema geschrieben haben. Am Ende dieses Artikels verweise ich auch noch auf einige weiterführende englische Seiten.<br />
<br />
<h3>
Was ist das Problem?</h3>
Im normalen Arbeitsalltag wird kaum Zeit darauf verwendet, seine Fähigkeiten zu verbessern. Man nimmt vielleicht hier und da an Schulungen teil oder arbeitet sich gegebenenfalls in neue Frameworks ein. Aber wir arbeiten nicht gezielt daran unsere Arbeitsweisen zu verbessern oder unser bestehendes Know-How zu vertiefen.<br />
<br />
Und wenn wir dann unter Zeitdruck stehen, fallen wir zurück auf die Techniken, die wir beherrschen, auch wenn wir wissen, dass es bessere Möglichkeiten gibt. Das klassische Beispiel hier sind Software-Tests. Es ist nahe liegend, dass ein Projekt mit hoher Testabdeckung mehr Sicherheit beim hinzufügen von Änderungen bringt. Damit aber sowohl die eigentliche Testabdeckung, als auch das Durchführen von Änderungen mit einem vertretbaren Aufwand erreicht werden können, braucht es einiges an Erfahrung und Übung. Und wenn man diese Erfahrung nicht hat und der nächste wichtige Termin naht, ist es dann doch einfacher, die Tests zu ignorieren und direkt drauf los zu programmieren.<br />
<br />
Einige Leute bringen an dieser Stelle auch gerne den Vergleich zu Musikern. Genau wie diese ihre Fingerübungen machen, kann man auch als Entwickler sein Können trainieren. Statt dessen geben wir aber jeden Tag ein Konzert. Das hat natürlich auch seinen Wert und man wird auch nicht vermeiden können sich hier und da zu verbessern. Man kann sich wahrscheinlich auch eine ganze Weile diesem Trott hingeben. Aber irgendwann nimmt einem die Eintönigkeit dann doch die Freude an der Arbeit.<br />
<br />
An dieser Stelle kann man auch gleich einen Strich ziehen. Wer mit seinem Können zufrieden ist und sich damit wohlfühlt, sollte wohl nicht weiter lesen. Zufriedenheit ist schwer genug zu erreichen. Lernen sollte freiwillig und aus eigenem Interesse passieren.<br />
<br />
<h3>
Was kann man tun?</h3>
Wenn man sich bewusst die Zeit nimmt, gibt es eine Menge Dinge die man tun kann. Eine gute Möglichkeit, die vor kurzem in der <a href="https://groups.google.com/forum/#%21msg/growing-object-oriented-software/glJ8qwiiXfk/in3vVggorvkJ">GOOS-Mailingliste erwähnt wurde</a> ist, sich gelegentlich einfach mal eine halbe Stunde Zeit zu nehmen, bestehenden Code zu verbessern. Dies sollten wirklich nur kleine Änderungen sein und man sollte sich an seine Zeitvorgabe halten. Ist man nach dieser Zeit nicht mit dem Ergebnis zufrieden, verwirft man seine Änderungen. Da dies ja primär als Weiterbildung zu sehen ist, sollte man gar nicht davon ausgehen wirklich Code zu committen. Und wenn dann doch eine Verbesserung dabei heraus kommt, umso besser!<br />
<br />
Mehr und mehr finden sich auch Code Katas im Netz. Hier werden überschaubare Aufgabenstellungen wieder und wieder gelöst, um in ähnlichen Alltagssituationen praktisch reflexartig darauf reagieren zu können. Diese sind sowohl ein guter Weg selber zu üben, als auch interessant anzuschauen. Es gibt eine ganze Reihe von Leuten, die freundlicherweise ihre Lösungen im Netz bereit stellen, zum Teil auch als Screencasts. (<a href="http://codingkata.org/">http://codingkata.org/</a> <a href="http://www.katacasts.com/">http://www.katacasts.com/</a> <i><a href="http://codersdojo.org/">http://codersdojo.org</a></i> <i>[Link aus dem Kommentar hinzugefügt]</i>) Gerade für Einblicke in neue Programmiersprachen sind konkrete, bekannte Beispiele sehr hilfreich.<br />
<br />
Überhaupt ist natürlich die Zusammenarbeit mit anderen wahrscheinlich die beste Möglichkeit, neue Dinge zu lernen.<br />
<br />
Darüber hinaus gibt es natürlich auch noch andere Dinge. Unter anderem halt Code Retreats, sonst würde ich ja nicht diesen Artikel schreiben.<br />
<br />
<h3>
Was sind jetzt also Code Retreats?</h3>
Code Retreats folgen einigen relativ einfachen Regeln:<br />
<ul>
<li>Aufgabenstellung ist <a href="http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens">Conways Spiel des Lebens</a> </li>
<li>Mittels pair-programming und, nach Möglichkeit, test-getrieben, versucht man das Spiel zu implementieren</li>
<li>Das macht man für 45 Minuten. Danach wirft man den geschriebenen Code weg. Keine Backups, kein committen in ein Repository. Einfach nur löschen</li>
<li>Man nimmt sich ein paar Minuten Zeit, um in der Gruppe darüber zu reden, was man gelernt hat</li>
<li>Man fängt wieder von vorne an (6-7 mal)</li>
</ul>
Da es eigentlich nicht möglich ist, innerhalb von 45 Minuten fertig zu werden, braucht man gar nicht erst zu versuchen, Abkürzungen zu nehmen und kann sich nur darauf konzentrieren, "perfekten" Code zu schreiben. Es macht auch nichts, für einen Durchlauf eine komplett neue Herangehensweise auszuprobieren (z.B. keine else-Blöcke, keine primitives, nur Funktionen/keine Objekte, keine Methoden mit mehr als zwei Zeilen, ...). Egal was man probiert, man riskiert im Durchschnitt nur 22,5 Minuten.<br />
<br />
Es geht ganz klar nicht darum, die Aufgabenstellung zu lösen, sondern auszuprobieren, wie man anders an die Aufgabenstellung heran gehen kann. Insbesondere eignet sich das Format auch gerade dazu test-getriebenes Entwickeln zu üben.<br />
<br />
Für mich war außerdem auch sehr interessant zu sehen, dass der entstandene Code nur einen Teil des Produkts der 45 Minuten ausmachte. Das entstandene Wissen über die konkrete Problemstellung brachte jeden neuen Durchgang deutlich näher an das Ziel als den Vorherigen.<br />
<br />
<h4>
Weiterführendes</h4>
<ul>
<li><a href="http://coderetreat.com/how-it-works.html">http://coderetreat.com/how-it-works.html</a> Eine kurze Beschreibung des Ablaufs eines Code Retreats</li>
<li><a href="http://programmingtour.blogspot.com/2011/01/on-goals-of-coderetreat.html">http://programmingtour.blogspot.com/2011/01/on-goals-of-coderetreat.html</a> Ein etwas weiterführender Beitrag zu den Zielen. Enthält auch ein Video mit der Einleitung, die Corey Haines zu Beginn eines Code Retreats vorträgt</li>
<li><a href="http://www.infoq.com/presentations/Software-Craftsmanship-Beyond-The-Hype">http://www.infoq.com/presentations/Software-Craftsmanship-Beyond-The-Hype</a> Die Präsentation von der QCon 2010, durch die ich auf das Thema gekommen bin</li>
<li><a href="http://vanryswyckjan.blogspot.com/2010/11/code-retreat-ghent.html">http://vanryswyckjan.blogspot.com/2010/11/code-retreat-ghent.html</a> ein Erfahrungsbericht</li>
<li><a href="http://financialagile.com/reflections/8-software/38-coreys-code-retreat">http://financialagile.com/reflections/8-software/38-coreys-code-retreat</a> und noch einer</li>
</ul>
Daniel Temmehttp://www.blogger.com/profile/01703346426386348351noreply@blogger.comtag:blogger.com,1999:blog-4446020480567482398.post-49068157105221546692011-01-08T23:17:00.000+01:002014-02-06T15:50:09.234+01:00Remember back then?...back in 2010? That was a nice year. I have to say I'm pretty happy with how it turned out. There were some setbacks, first and foremost the departure of two colleagues whose knowledge and support I valued very highly, who left for new cities and new challenges. But such is life. But I learned a lot this year and got to make a lot of interesting experiences and meet a lot of interesting people.<br />
<br />
It was a long year and this will be a long post. It will be self-indulgent and most likely only for my own benefit. So there.<br />
<br />
First off, I finally took the time to finish reading Domain Driven Design, or "the great blue book in the sky" as I heard someone (probably Neil Robbins) call it. It was very timely as we were just in the process of redoing a fairly large part of our application. It gave me the confidence to split up the refactoring along the life cycle of our main entity, transforming it along the way. That way we were able to concentrate on the first step in the life cycle without having to change everything down the line, too.<br />
<br />
Said refactoring was also the first time I remember of deliberately doing "refactoring toward deeper insight". The experience of taking what we had learned about the domain in the previous year and applying that to our domain model was surprisingly rewarding. The end result was a lot simpler and closer to how people actually worked. It gave us the opportunity to introduce new functionality that would otherwise have been extremely cumbersome to implement.<br />
<br />
The whole process was not without its flaws though. We underestimated the amount of code we had to change, even with the reduced scope. Especially the front-end proved that good UI design is very hard and time-consuming. In hindsight we probably should have spent more time on considering how the changes might have been divided further into smaller, releasable pieces. In the end we were left with a long time between deployments and suffered all the communication issues that missing regular feedback loops can give you. It was still a good learning experience and it showed me how much I appreciated our previous, shorter deployment iterations. <br />
<br />
In march I went to QCon, which I <a href="http://danieltemme.blogspot.com/2010/03/qcon-2010.html">wrote about before</a>. The inspiration I got turned out to have a fairly lasting effect. To get back to the kind of enthusiasm I had when I started out and to be able to really consciously enjoy coding again is something I am extremely grateful for. This wasn't necessarily all due to QCon but it encouraged me to be more introspective about how I work. In particular it had me putting more effort into getting better at TDD. At some point the whole "using tests to drive out the design" bit finally clicked and it made me a happier person.<br />
<br />
There is still a lot left to improve though. Most of our bug-fixing work is now purely front-end stuff, ironing out layouting issues and Javascript behaviour across different browsers. But we're getting there. Writing jasmine tests is something I'll hopefully get better at and which <a href="http://danieltemme.blogspot.com/2010/11/javascript-tdd-with-jasmine-and-maven.html">integrates well enough into our builds</a>. My colleague Benjamin put an amazing amount of work into getting a useful Selenium tool-set and tests for us. The environment for these is sadly still somewhat brittle but hopefully that will get better with Selenium 2.<br />
<br />
We've made a lot of progress in automation anyway. Our test-environment gets automatically redeployed by Teamcity now. These are still very tiny baby-steps towards continuous delivery that conveniently ignore some of the larger issues like schema evolution and the need to switch to a DVCS but at least I think it's stumbling in the right direction. <br />
<br />
I was also happy I got to help in making collaboration with our designers on different teams a little easier. Working on a bunch of projects in parallel while trying to consolidate on a consistent look & feel is something that has taken even more effort than I expected. And since look & feel is usually the most immediately apparent contact point for stakeholders, it is always under scrutiny. I underestimated that, too, even though I really should know better. All the more reason to push for further front-end test automation.<br />
<br />
Later in the year our team worked on a new project and decided to base it on JSF 2, mostly so we could get the know-how. The other teams were already using it and it seemed reasonable to look for common ground there. I did learn a lot, but I didn't get much done. Having no one on the team with any prior experience meant we had to go through all the little beginners mistakes you get when you stumble into some new technology. Some of those early issues just rubbed me the wrong way which made me get increasingly frustrated. And I'm afraid my growing resentment probably didn't help the mood of the team.<br />
<br />
This did bring up a few interesting questions about the effectiveness of aiming for a heterogeneous development environment. Questions which I don't really have answers for but still could ramble on about for hours. So I should probably put that in another post some day.<br />
<br />
In November I was lucky enough to take part in a <a href="http://www.coderetreat.com/">Code Retreat</a>. Having been intrigued by that ever since I saw Corey Haines talk about it at QCon, I jumped at the chance to try it out. This, too, is worthy of its own post and so I won't go into details here. Suffice it to say that I liked it a lot and plan to organize a code retreat in Düsseldorf, to show it to more people. <br />
<br />
(As an aside, I just stumbled over a google result for a code retreat in Wroclaw which brought a smile to my face. I always enjoyed my time there, when I visited there for another company, back in another time. And I always had a very high opinion of the people and their programming skills there. So, I guess this fits quite well.)<br />
<br />
After Code Retreat Ghent came Google Developer Day Munich. It was nice to meet my now ex-colleague Sebastian again. And same as in Ghent, I was glad for the opportunity to chit-chat with other people in our profession. It never hurts putting things in perspective and hearing what others are passionate about. And of course, rambling about things I'm passionate about. (Something I find myself doing more of these days, I think. But maybe it was just the free beer provided by Google.)<br />
<br />
The effort Google puts into these events was impressive and I really liked how non-partisan the speakers were. They openly acknowledged the existence of competitors (foremost Apple) without looking to discredit or awkwardly ignore their work. <br />
<br />
I wasn't looking for anything in particular since my work currently targets neither HTML 5-capable browsers nor mobile phones, but at the end of the day I felt more sad about that fact. I wasn't aware how exciting some of the HTML 5 stuff is and I'm really looking forward to that becoming the norm and what people will be able to do with it. <br />
<br />
Well, that about does it for two-oh-one-oh. Remaining, then, is the goals I've set myself for 2011 (I'm not yet convinced of spelling it 20!!).<br />
<br />
<br />
<ul>
<li>Organize a code retreat, possibly making it a recurring event</li>
<li>Look for more of these opportunities to learn from others</li>
<li>Subversion is a nightmare to merge stuff with and I'm eager to switch to git but it would mean having to get used to a different workflow for everyone in the team. Maybe I'll start with a git kata.</li>
<li>Follow through on all the "I should really write a blog post about that"</li>
<li>Write more posts in german. </li>
<li>Read GOOS, finish reading REST in Practice, glance over Continuous Delivery.</li>
<li>Try to solve more problems event-driven</li>
</ul>
<br />
Hmm... last and possibly least I just realized that I also started writing on this blog (and on twitter) this year. I guess I'll keep that up.Unknownnoreply@blogger.com