tag:blogger.com,1999:blog-75287779225260334522024-03-13T20:13:35.337+00:00meza - in the brainsAnonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.comBlogger48125tag:blogger.com,1999:blog-7528777922526033452.post-3947526272320733012016-03-25T11:16:00.003+00:002016-03-25T11:16:13.434+00:00Goodbye written media, hello youtubeHey guys.<br />
As you noticed, I haven't updated this site for a long time. I've had a lot of things going on, and it took its toll on the time I have on my hands.<br />
<br />
Also, I don't enjoy writing and refactoring posts. I do however enjoy film making.<br />
<br />
So that said, I've moved my braindumps over to youtube land in the form of <b>DAILY </b>vlogging.<br />
<script src="https://apis.google.com/js/platform.js"></script>
<br />
<center>
<div class="g-ytsubscribe" data-channelid="UCKlAopeOKMGEvwCyplQhzHA" data-count="hidden" data-layout="full">
</div>
</center>
<br />
This is my channel. Make sure to <b>subscribe with the button above</b> and comment, to interact. Let me know what you think and what topics you'd like me to touch on. It's a much larger commitment than blogging, but the format that I'm slowly getting to is allowing me to actually do it. The biggest motivator for me is to be able to commit to stuff in front of all of you, so that you would keep me true to myself and on my toes. So please subscribe, and help me on my journey to my dreams. In return, I'll try and do the same by bringing you some colour to your days.<br />
<br />
I have a website for the project too: <a href="http://journeytomydreams.com/">http://journeytomydreams.com/</a> <br />
<br />
Here's a playlist of the stuff I have currently:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/videoseries?list=PL7MR5XQCyamk8hbBY4ByytvQ_y18ruK6g" width="560"></iframe>
<br />
Now you know. Thank you for reading this blog, and hug thanks for subscribing to the youtube channel. It means a lot!
<br />
There's also a giveaway that I'm running. Make sure to enter:<br />
<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/mJxhenwkc48" width="560"></iframe>
<br />
<br />
Blog off. Youtube on.
See you there. <br />
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-42855660430777970312014-06-11T21:08:00.000+01:002014-06-11T21:42:07.255+01:00Ever felt like you suck at handling CSS?I am a back-end developer at heart. I have a passion for APIs, console applications and libraries. Every time I hung around frontend engineers, I felt like I suck big time. All those fancy and complicated tools, and they still keep on top of everything. I hate worrying about whether the files are in the right place, whether the CDN has the newest asset, etc. I like order, and I hate sucking at things.<br />
<br />
<a name='more'></a><br />
Recently I've wondered down the path of doing some full-stack web development again, and this time I wanted to do it right! I didn't want to suck at it! Fortunately, I have the amazing opportunity to work with <a class="g-profile" href="http://twitter.com/designhorf" target="_blank">@designhorf</a>, so it's not only about my worries anymore. He's doing all the magic in CSS and HTML land, but I didn't want him to have to care about anything else apart from creating and implementing awesome design.<br />
<br />
Here are a list of things I never ever wanted to touch manually:<br />
<ul>
<li>browser support in CSS files</li>
<li>static analyzing CSS, JS and SCSS files </li>
<li>rendering CSS from SCSS files</li>
<li>minifying CSS, JS and SVG files </li>
<li>invalidating CDN caches</li>
<li>deactivating CDN URLs in CSS files when working locally</li>
</ul>
... and the list goes.<br />
<br />
I promise I will write detailed blogposts about things we've discovered, but not just yet. We're too busy creating <a href="http://www.tailored-tunes.com/" target="_blank">Tailored Tunes</a>.<br />
<br />
The only thing I have time for now is an unordered list of some things to look at if you too worry about these:<br />
<br />
<ul>
<li><a href="http://compass-style.org/" target="_blank">Compass</a> for SCSS. It gives a ton of shorthands, so you don't have to worry about browser compatibility too much anymore.</li>
<li><a href="http://gruntjs.com/" target="_blank">Grunt.js</a> that automates everything for you</li>
<li><a href="https://www.npmjs.org/" target="_blank">npmjs</a> to manage grunt plugins</li>
<li><a href="https://github.com/guardian/frontend/blob/master/Gruntfile.js" target="_blank">The Guardian frontend project</a> sets an amazing example how to use Grunt. Take a good look at all the loadNpmTasks(...) lines. Those are all grunt plugins. Most have decent documentation, just look them up and see if you need them or not.</li>
<li>Use the fact that Heroku (and most environments you deploy to) can execute Grunt! We're using an apache+php, so we put the generated css files into git to avoid needing ruby on production boxes for the sake of compiling assets.</li>
<li>Finally, <a href="https://gist.github.com/meza/8c4c7b10cbebdff7e8c9" target="_blank">here is an excerpt</a> of the Grunt tasks we're using<span id="goog_229213852"></span><span id="goog_229213853"></span> </li>
</ul>
Remember: <b>Developer experience is just as important as end user experience!</b><br />
<h3>
</h3>
<h3>
So what's our current workflow with this setup?</h3>
<br />
Whenever we're doing things, we're running <span style="color: lime;"><span style="background-color: black;"><span style="font-family: "Courier New",Courier,monospace;">grunt watch</span></span></span> on a terminal in the background. That detects changes in files, and applies tasks that are needed to get that change into the assets the site actually uses.<br />
<br />
We have a <a href="https://gist.github.com/meza/a9b8a2a634e604e7bd40" target="_blank">git pre-commit hook</a>, that runs <span style="font-family: "Courier New",Courier,monospace;"><span style="color: lime;"><span style="background-color: black;">grunt</span></span></span> before each commit, and adds all the generated CSS files to the payload, so that we don't have to remember to add them manually.<br />
<br />
Upon deploy, <a href="https://github.com/meza/heroku-buildpack-php" target="_blank">our custom heroku buildpack</a> runs <span style="font-family: "Courier New",Courier,monospace;"><span style="background-color: black;"><span style="color: lime;">grunt deploy</span></span></span> to minify things, hash things and enhance URLs.<br />
<br />
<h3>
What are the benefits?</h3>
<br />
We've been using these tools for a while now, and I can say the following: I feel like my asset handling doesn't suck anymore!<br />
<br />
Every bit is automated and version controlled. The only thing we have to worry about now is to come up with a product and a UI that people will love using, as much as we love creating it!<br />
<br />
So that's about it for now. If you have any questions, please feel free to ask them, and we'll try to explain and show everything we can. We'll be blogging a lot about this on Tailored Tunes's yet to be born developer blog.<br />
<br />Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-5443689551132917592014-02-18T12:08:00.000+00:002014-02-18T12:08:04.770+00:00Rant about tools over craftI've just posted a blog-post in the format of a gist to be able to have a sensible discussion about it.<br />
<a href="https://gist.github.com/meza/9069507" target="_blank">Check it out here.</a><br />
<br />
I would really like to hear your thoughts about the topic of tools over craft. While I believe in tools to help us be lazy and concentrate on the important stuff, some might be blocking us from learning and evolving.<br />
<br />
What are your thoughts? <br />
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-50637933541900450692014-02-17T12:41:00.000+00:002014-02-27T16:47:42.684+00:00Havig difficulties testing sites with 2 step authentication? Suffer no more!We live in an era where the meaning of privacy - especially online privacy - is a vague, blurred thing waiting to be defined. We can never be 100% sure who, where and how is accessing our information. If we're lucky, the 3rd party's intentions are to protect us. To be honest, I don't feel as much aversion against sharing my life with Google and Facebook as many of my peers. I believe that as long as I benefit from what they gather... well, I don't have anything to hide. Really.<br />
<br />
<a href="http://2.bp.blogspot.com/-6US2YqzArJA/UwH289hWnxI/AAAAAAAAb84/gh47oYiU6lI/s1600/original.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="http://2.bp.blogspot.com/-6US2YqzArJA/UwH289hWnxI/AAAAAAAAb84/gh47oYiU6lI/s1600/original.jpg" height="180" width="320" /></a>On the other hand, I strongly despise intruders who's acts on my account could very well raise suspicion over me without me actually doing anything wrong. <br />
Fortunately more and more websites are introducing 2 factor authentication to prevent identity theft. While this will definitely not eradicate cyber crime, it might reduce it radically. I imagine people will less likely go into the trouble of getting access to my phone just to hack my email/facebook account if I'm not of any significance. <br />
<br />
Since Google introduced <a href="http://en.wikipedia.org/wiki/Google_Authenticator" rel="nofollow" target="_blank">TOTP</a> into their login flow, many organizations using Google Apps made it mandatory for their employees. This however introduces extra complexity to the testing of tools and<br />
<a name='more'></a>services relying on Google login (or other social login flows) and people involved in test automation are facing a difficult challenge. Or are they?<br />
<h2>
What is 2 step authentiction?</h2>
Let's get couple of terms right with the help of Wikipedia:<br />
<blockquote class="tr_bq">
The function of <a href="http://en.wikipedia.org/wiki/Identification_%28information%29" rel="nofollow" target="_blank"><b>identification</b></a> is to map a known quantity to an unknown entity so as to make it known. The known quantity is called the identifier (or Id) and the unknown entity is what needs identification. A basic requirement for identification is that the Id be unique. Ids may be scoped, that is, they are unique only within a particular scope. Ids may also be built out of a collection of quantities such that they are unique on the collective.<br />
<br />
<a href="http://en.wikipedia.org/wiki/Authentication" rel="nofollow" target="_blank"><b>Authentication</b></a> (from <a href="http://en.wikipedia.org/wiki/Greek_language">Greek</a>: αὐθεντικός; real or genuine, from αὐθέντης authentes; author) is the act of confirming the truth of an attribute of a datum or entity. This might involve confirming the identity of a person or software program, tracing the origins of an artifact, or ensuring that a product is what its packaging and labeling claims to be. Authentication often involves verifying the validity of at least one form of <i>identification</i>.<br />
<br />
<a href="http://en.wikipedia.org/wiki/Multi-factor_authentication" rel="nofollow" target="_blank"><b>Multi-factor authentication</b></a> (also MFA, two-factor authentication, two-step verification, TFA, T-FA or 2FA) is an approach to <i>authentication</i> which requires the presentation of two or more of the three authentication factors: a knowledge factor ("something only the user knows"), a possession factor ("something only the user has"), and an inherence factor ("something only the user is"). After presentation, each factor must be validated by the other party for authentication to occur.<br />
<br />
<a href="http://en.wikipedia.org/wiki/Two-step_verification" rel="nofollow" target="_blank"><b>Two-step verification</b></a> (also known as two-factor authentication) is a process involving two stages to verify the identity of an entity trying to access services in a computer or in a network. This is a special case of a <i>multi-factor authentication</i> which involves the presentation of two or more of the three <i>authentication</i> factors: a knowledge factor, a possession factor, and an inherence factor. </blockquote>
<h2>
How does this translate to our life?</h2>
You might already be using this technique with your bank. Do you have a "token generator" device that you need to access your online banking platform?<br />
Now days the "thing you own" often translates to your mobile phone, as that devious device became one of the few things that we all hang on to, even in our beds. Not to mention we discover the loss of it almost instantly. Did you know that <a href="http://www.techcentral.co.za/the-next-10-years-in-mobile/27622/" target="_blank">we look at our phones 150 times a day on average</a>?<br />
<br />
I'll use Google as an example, but the same process applies for Facebook, Github and a whole lot of other services.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/zMabEyrtPRg?feature=player_embedded' frameborder='0'></iframe></div>
<br />
This results in the following flow:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-tuyFJbrd_n4/UwHtefiRHSI/AAAAAAAAb70/yuK-pfcxZQQ/s1600/Screen+Shot+2014-02-17+at+11.05.21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-tuyFJbrd_n4/UwHtefiRHSI/AAAAAAAAb70/yuK-pfcxZQQ/s1600/Screen+Shot+2014-02-17+at+11.05.21.png" height="320" width="312" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Ri3jR38iGiM/UwHth5dzPhI/AAAAAAAAb78/_Oy9ddXVisY/s1600/Screen+Shot+2014-02-17+at+11.05.30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-Ri3jR38iGiM/UwHth5dzPhI/AAAAAAAAb78/_Oy9ddXVisY/s1600/Screen+Shot+2014-02-17+at+11.05.30.png" height="270" width="320" /></a></div>
Now I'm sure you see where the problem is when it comes to testing. While it's pretty easy to configure an automation suite to use a specific username and a password, waiting for a text message or using a smartphone app to come up with the verification code is indeed difficult and slow for the likes of most people involved in test automation.<br />
<h2>
So what can we do?</h2>
Fortunately people are not trying to re-invent the wheel as much as they used to, so most of the one-time password code generators work according to a <a href="http://en.wikipedia.org/wiki/Google_Authenticator" rel="nofollow" target="_blank">very specific algorithm</a>. Knowing this, it is not that difficult to come up with a generator of our own to support our testing efforts, and to bypass the second verification step just as quickly as a normal username-password screen.<br />
I've been experimenting with this approach. For PHP, I've found a nice library that does everything you need, it's called (surprise): <a href="https://github.com/PHPGangsta/GoogleAuthenticator" target="_blank">GoogleAuthenticator</a>.<br />
<br />
I wasn't as lucky with Java. There are many sort-of implementations, but I failed in finding a built for purpose library that I could easily use. <a href="https://github.com/meza/galib" rel="nofollow" target="_blank">So I've built one</a>.<br />
<h3>
Using the Java library</h3>
All you have to do is to include the library with your favourite build tool <a href="http://search.maven.org/#browse|1376168358" target="_blank">from here</a>.<br />
Once the code is part of your project, simply use the following lines:<br />
<br />
<pre style="background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> GoogleAuthenticator ga = new GoogleAuthenticator();
String passCode = ga.getCode("your secret key");
</code></pre>
<br />
As you can see, it all comes down to knowing a second secret, which serves as a seed for the code creation process.<br />
<h3>
Acquiring the seed</h3>
The process is somewhat fiddly, but nothing to be afraid of. Here's how you do it:<br />
Sign in to your google account if you haven't already, then in the top right hand corner, click on your profile picture, and select "Account".<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-6PpgclDMTkM/UwHyV7v7KkI/AAAAAAAAb8M/9M1OC1FO5mk/s1600/Screen+Shot+2014-02-17+at+11.24.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-6PpgclDMTkM/UwHyV7v7KkI/AAAAAAAAb8M/9M1OC1FO5mk/s1600/Screen+Shot+2014-02-17+at+11.24.20.png" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Select security settings:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-ujRbRTqGXaU/UwHytjxuz4I/AAAAAAAAb8U/A8qvLXoPUpw/s1600/Screen+Shot+2014-02-17+at+11.24.45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-ujRbRTqGXaU/UwHytjxuz4I/AAAAAAAAb8U/A8qvLXoPUpw/s1600/Screen+Shot+2014-02-17+at+11.24.45.png" height="186" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
That will ask you for your password. Once through that, go for the 2 step verification settings and select "Move to a different phone"<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-LvATAvE846M/UwHy3RTzZrI/AAAAAAAAb8g/OMPNfKgyb1M/s1600/Screen+Shot+2014-02-17+at+11.25.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-LvATAvE846M/UwHy3RTzZrI/AAAAAAAAb8g/OMPNfKgyb1M/s1600/Screen+Shot+2014-02-17+at+11.25.14.png" height="55" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Select the type of phone you have, and proceed.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-eFDWIPXCqU8/UwHzXSikvVI/AAAAAAAAb8s/V-WsRoEBZMo/s1600/Screen+Shot+2014-02-17+at+11.25.47.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-eFDWIPXCqU8/UwHzXSikvVI/AAAAAAAAb8s/V-WsRoEBZMo/s1600/Screen+Shot+2014-02-17+at+11.25.47.png" height="320" width="274" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h4 class="separator" style="clear: both; text-align: left;">
This is the important part! </h4>
<div class="separator" style="clear: both; text-align: left;">
You are now presented with a QR code that sets up Google Authenticator, and this is where the trick is. To acquire the secret, you need a barcode scanner (different to the Google Authenticator app itself). </div>
<div class="separator" style="clear: both; text-align: left;">
When you scan this QR code, you'll find a URL in it, which will look something like the one I've extracted from the picture above:</div>
<blockquote class="tr_bq">
otpauth://totp/Google%3Ameza%4<wbr></wbr>0meza.hu?<b><span style="color: red;">secret</span></b>=<wbr></wbr><span style="color: #38761d;"><b>xc6iavmpzqzgmljgpg5a4m2oarjys5</b></span><wbr></wbr><span style="color: #38761d;"><b>6c</b></span>&issuer=Google</blockquote>
<div class="separator" style="clear: both; text-align: left;">
Do you see where I'm going to with this?</div>
<div class="separator" style="clear: both; text-align: left;">
The URL has a query parameter named "secret", and the value is what you need to be able to generate the correct code.</div>
<div class="separator" style="clear: both; text-align: left;">
Now there's <span style="font-size: large;"><b>one more important thing</b></span>: open your Google Authenticator, scan this barcode and finish the steps with google. <span style="color: red;"><span style="font-size: large;"><b>Failing to do that will lock you out of your account</b></span></span>! </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h2 class="separator" style="clear: both; text-align: left;">
Other things worth mentioning:</h2>
<ul>
<li>Usernames and passwords are considered highly sensitive information. So is the TOTP secret. NEVER store these in a repository. Make sure you have a user specific <a href="http://www.meza.hu/2013/08/configuration-done-right.html" target="_blank">configuration solution</a> that allows individuals to set their own settings without the need to commit them. </li>
<li>You can now tell your developers how to implement their own 2-step verification process, and advise them about the necessity of doing so.</li>
</ul>
<h2 class="separator" style="clear: both; text-align: left;">
Updates</h2>
<ul>
<li>I've updated the library usage code, as I've made some changes to the interface.</li>
</ul>
<br />
<br />Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com2London, UK51.508515 -0.1254871999999522851.192402 -0.77093419999995227 51.824628000000004 0.51995980000004771tag:blogger.com,1999:blog-7528777922526033452.post-10093172613501017482014-01-16T07:00:00.000+00:002014-01-16T07:00:00.579+00:00So I found myself entering a remix contest ...So as to prove myself that it's worth investing in my project studio, I've started to put my work out there and show the world (and myself) what I'm capable of.<br />
<br />
The first manifest of my dedication is this remix of a GTA V classic. So far, the professional response was amazing, so I wanted to show this to all of you!<br />
<br />
However, because it is a contest, I would be honoured if you could just click a "vote" on it if you like it. <br/><i>(It uses facebook connect to check whether you've already voted or not.)</i>
<br />
<h2>Will you help me win?</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.indabamusic.com/opportunities/the-chain-gang-of-1974-sleepwalking-remix-contest/submissions/8b58861e-7b08-11e3-ad51-12313b020cf1" target="_blank"><img alt="The Chain Gang of 1974 - Sleepwalking (meza remix)" border="0" src="http://1.bp.blogspot.com/-l3qORwPijqI/UtcqRO22LlI/AAAAAAAAb2w/W1V5-kELilE/s1600/Screen+Shot+2014-01-16+at+00.37.26.png" height="255" width="640" /></a></div>
<br />
How did you like it?Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-14489119276583339132014-01-14T10:20:00.000+00:002014-01-14T10:20:13.504+00:002014 kickoffHappy new year to all of you!<br />
<br />
I hope you all closed a fruitful and wonderful 2013, and are full of great plans and opportunities for the following 12 months!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ZQ3ePkqJyfc/UtUPAOLqP0I/AAAAAAAAb2I/VsT-2hoLYWs/s1600/looking-back-looking-forward1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ZQ3ePkqJyfc/UtUPAOLqP0I/AAAAAAAAb2I/VsT-2hoLYWs/s1600/looking-back-looking-forward1.jpg" height="267" width="400" /></a></div>
<br />
<br />
I've had an eventful last quarter, gathered some thoughts I'd like to share with you.<br />
<br />
Soon, I'll write about :<br />
<ul>
<li>When and what NOT to test</li>
<li>My journey with mongoDB and Neo4j, and why I use which in what situation</li>
<li>My journey with building a Spotify application</li>
<li>Prematurely scaling <a href="http://www.tailored-tunes.com/">my start-up</a>'s code to be able to deal with the expected high data transfer</li>
<li>Building anti-corruption layers that could potentially save the site from dysfunction even when 3rd parties are down</li>
<li>I will continue the Hungarian article-series too (sorry 'bout that non-Hungarians, I still have 4 pieces to write) </li>
<li>and will show you some highlights of my musical career which now has a significantly larger focus in my life. </li>
</ul>
Looking forward to hearing from you in comments and/or in private! <br />
<br />
p.s.: If I haven't replied yet, rest assured, I will! (I'm a bit behind emails)<br />
<br />
Yours truly,<br />
mezaAnonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-78365372903323299692013-10-29T11:59:00.000+00:002013-10-29T14:01:31.893+00:00A vadászat - Angliai útikalauz ITsoknakSorry again, all English readers, I promise this will not be a trend! My article series for Hungarians continues. Thanks for your understanding! A more technical and English post is coming up next week! :) <br/><br/>
Ha azt gondoltad, hogy az önéletrajzírás nehéz, akkor gondjaid tovább nőnek majd. Idáig könnyű dolgod volt mert nem voltál semmi más, csak adat. Adat, amivel Angliában nem szokás visszaélni. Adat, ami fekete vagy fehér. Kulcsszavak, cégnevek, megnevezések, referenciák.
Amint egy szemfüles fejvadász kiszemelt Téged egy pozícióra, onnantól Rólad és a felek közti színjátékról szól a történet. Lehet, hogy most páran felhúztátok a szemöldökötök a kifejezést olvasván, de ez az igazság. “Színház az egész világ” és ez nincs másképp a jelen helyzetben sem. A leendő munkaadó eljátssza a mindenttudó, bölcs és tökéletes munkahely szerepét ahol az egész világ dolgozni akar. A fejvadász eljátssza, hogy tényleg Érted és a cégért van. Te pedig eljátszod, hogy Te vagy a legjobb az adott pozícióra az adott cégnek ami a vágyaid netovábbját képzi. Akármennyire büdös ez, meg kell enni. Ez van. Természetesen annál jobb a végeredmény, minél inkább hűek a színészek egyéniségeihez a szerepek. Ráadásul mivel a munkaerőpiac - Angliában - jelenleg iszonyú “profi szakember” hiányban szenved, ezért meg van a lehetőséged válogatni, ha türelmes vagy.
<a name='more'></a>
Ha figyelmesen követted <a href="http://www.meza.hu/2013/10/angliai-utikalauz-it-soknak.html" rel="prev" target="_blank">az előző bejegyzés</a>ben foglaltakat, akkor már túl vagy a sokadik megkeresésen, amiknek a 99%-a valahogy így néz ki:
<blockquote>
I find your profile very interesting for a number of clients I am recruiting for and I specliase in bringing the best EU talent to the UK, but to keep this simple:<br/>
<br/>
- I am recruiting for roles in the UK (mostly London) and The Netherlands<br/>
- I focus on Java developer roles! But also on other programming languages<br/>
- My clients range from top Gaming companies to publishing companies.<br/>
- Salary ranges from 30 -65k<br/>
- Gives you exposure to new technologies i.e. Scala / Groovy / Mobile<br/>
- All my companies are very Agile!<br/>
<br/>
I also have a company within London that are looking to make 10-15 Java Web developer hires due to rapid growth!
</blockquote>
Na, az ilyen nálam azonnal az ignore listán köt ki. Report spam, kész. Ezt az angolok ötletesen úgy hívják, hogy “fishing with a shotgun”. Kilőnek copy-pastelt üzeneteket bárkinek akit az adott keresőszavak alapján megtaláltak és bíznak abban, hogy valaki visszajelez. Az ilyen fejvadászok tényleg csak eljátszák, hogy Érted és a cégért vannak, holott csak a megkeresések számát akarják növelni a saját bónuszuk érdekében. Az ilyen üzenetek mögött rejlenek általában a “porszívóügynökök”, akiktől mindannyiunkat a hideg ráz. Azonban, mint mindennek, ennek is több oldala van. Ha az a célod, hogy minél több ügynökség adatbázisába bekerülj, akkor érdemes ezekre az üzenetekre is válaszolni. Ettől határozottan emelkedni fog a megkeresések száma, ámbátor könnyen lehet, hogy azok minősége drasztikusan csökkenni fog.
<br/>Nekem egy ilyen üzenet azt jelenti, hogy egy, a munkáját nem komolyan vevő fejvadász dologzik egy, a munkájukat nem komolyan vevő ügynökségnek, akiket olyan ügyfelek alkalmaznak akiknek ez a módszer elegendő. Nem jó jel.<br/>
<br/>
<h2>Harmadik típusú találkozás a fejvadásszal</h2>
Az első és legfontosabb dolog amit tudni kell a fejvadszokról, hogy sokan vannak. Nagyon sokan. A második dolog pedig az, hogy egy munkáltató nem feltétlenül csak egy ügynökséggel dolgoztat egyszerre. Könnyen keveredhetsz olyan kényes szituációba, hogy két - vagy több - egymással versengő fejvadász is megkeres egy adott állás miatt. Ha ezt nem kezeled időben, könnyen találhatod magad elutasítva csak azért, mert senkinek nincs kedve ezt a politikai csomót kibogozni.<br/>
<br/>
Ahhoz, hogy az ilyen helyzeteket elkerüld, tanácsos listát készíteni az ügynökségekről, a fejvadászokról és a pozíciókról amiket ajánlanak. Sajnos nagyon kevés az olyan ajánlat ahol a kezdetektől fogva minden információt a rendelkezésedre bocsátanak, úgyhogy nem árt észnél lenni. Ha valamelyik munkaköri leírás vagy cég-bemutató szöveg ismerősen hangzik, érdemes rákérdezni konkrétan. Ha bejön, akkor rengeteg időt meg tudsz spórolni mind magadnak, mind a fejvadásznak. Amennyiben nem jön be és a telefon másik végén lévő illető sokat kezd kérdezősködni, a legjobb amit tehetsz az az, ha nem mondasz el semmit. Hatalmas ugyanis a verseny az irodák között, és mindenféle rafinált módon próbálnak információt szerezni a piacuk mindkét térfeléről. Noha ez Téged túl mélyen nem kell, hogy érintsen, mégis sokat számít a megbízhatóságodat tekintve amikor több adatot akarsz kérni egy esedékes állással kapcsolatban.<br/>
<br/>
<h2>Mit is keresek?</h2>
Felejtsd el a munkakörök megnevezéseit.
Nagyon sokan esnek abba a hibába, hogy a hazai helyzettel hasonlítanak össze mindent. Ez persze valahol érthető, viszont jó minél hamarabb levetkőzni. Ha komolyan érvényesülni szeretnél és magadat jólérezni akkor el kell fogadnod, hogy máshol más! Hogy a dolgod ne legyen kicsit sem egyszerű, a munkaköri megnevezések is javában eltérnek az otthoniaktól. Nem volt szerencsém feltérképezni a teljes spektrumát a különbségeknek de annyit igen, hogy egy jó tanáccsal tudjak szolgálni: A munkaköri leírás alapján ítélj, ne a munka megnevezése alapján.<br/>
<br/>
A fejlesztés területe talán még a legzavartalanabb, ott vagy <i>Software Engineer</i> vagy, vagy valami nagyon hasonló.<br/>
A tesztek világában lehet az ember <i>QA Analyst</i>, <i>Test Engineer</i>, <i>Software Engineer in Test</i>, <i>Agile QA</i>, <i>Technical QA</i>, az előbbiek mindenféle elképzelhetetlen variációja, és még azon is túl.<br/>
Product oldalon lehetsz minden a <i>Business Analyst</i>tól kezdve <i>Solution Architect</i>en át a <i>Product Owner</i>ig bármi.<br/>
Egy a lényeg, hogy mindenképp olvasd át azt, hogy mit is várnak el tőled és az alapján cselekedj.<br/>
Néha találkozhatsz olyan zöldfülű fejvadásszal, aki csak egy klienssel dolgozott idáig és alapértelmezettnek veszi, hogy ugyanarra gondoltok amikor a developer ajánlatról beszélgettek. Inkább kérdezz többet, de legyél biztos abban, hogy miről is van szó.<br/>
<br/>
A pozíciók szintjei is másképpen működnek, mint otthon. Azt, hogy <i>junior</i>, átlag, <i>senior</i> vagy <i>principal</i> leszel-e, azt az befolyásolja, hogy mennyi ideje vagy a szakmában és mit tudsz letenni az asztalra. Otthon ugyebár általában akkor lehetsz senior valahol, ha 2+n évet eltöltöttél a cégnél és ez a titulus elvész, ha állást váltasz.<br/>
<br/>
Itt megvan a lehetőséged kapásból senior pozíciókra jelentkezned. Ez általában annyit jelent, hogy team leader leszel és jó esetben egy csapatnak a technikai döntéseiért és szakmai fejlődéséért fogsz felelni.<br/>
<br/>
A senior fölötti szint a principal jelölővel rendelkezik. Az ő életük már inkább szól meetingekről és elvetemült politikai játékokról, mint tényleges alkotásról. Nagy ritkán ilyen, vagy ennél magasabb szintekre is hívnak be “az utcáról” embereket, úgyhogy sosem lehet tudni.<br/>
<br/>
Egész érdekes módon az ember ha sokat mozog - akár csak kíváncsiságból - a munka piacterében, nagyjából elkezd átlátni a szitán és 1-1 cégnév, pozíció-megnevezés vagy ember hallatán mindent tud az adott szituációról. Nekem nagyon hasznosnak bizonyul ezen dolgok ismerete, mert ad egy átfogó képet a jövőbeli lehetőségekről és irányokról amerre a szakma halad.<br/>
<br/>
<h2>Bérigény</h2>
Az esetek túlnyomó többségében minden meghirdetett pozíció mellett ott van, hogy mennyit hajlandóak érte fizetni. Szerencsére ez által megszűnik az a kínos eset, hogy az utolsó kör után derül ki, hogy nevetségesen kevéssel akarják kiszúrni a szemed.<br/>
Ha most azt gondolod, hogy ez mennyire leegyszerűsíti a dolgot, sajnos el kell keserítselek. Mivel a bérek megszabásánál még nem jöttek rá arra, hogy minden cég mást ért egy adott titulus alatt, ezért egy adott pozihoz viszonylag egységes az anyagi kínálat. Az a nem mindegy viszont, hogy mit várnak el cserébe. Az pedig igencsak eltérő lehet cég és cég között.<br/>
A tanácsom az, hogy amint lehet derítsd ki a fejvadásztól, hogy pontosan mit kell csinálni és mennyiért. Ezt vesd össze a többi ajánlattal, illetve a munkavégzés helyének a belvárostól való távolságával. Ez a későbbiekben lesz valamennyire fontos, de annyit el tudok árulni előre, hogy minél távolabb keresel lakást a központtól, annál olcsóbb a bérleti díj.<br/>
<br/>
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Amikor találsz egy megfelelő pozíciót egy arra alkalmasnak tűnő embernek (vagy fordítva), akkor mi történik? Ha már megvolt az előzetes telefonhívás és megteremtettétek a kölcsönös bizalmat akkor is kagylót ragadsz vagy emailben küldöd a részleteket?</b><br/>
Ez már jobban az egyéntől függ. Általában egyébként az a tapasztalatom, hogy az emberek csak az első beszélgetést nem szeretik telefonon intézni, utána már könnyebben megy minden. Da ha valaki pl. nehezen elérhető munkaidőben és / vagy kéri, hogy lehetőleg inkább e-mailben keressem meg, akkor kevésbé fontos ügyek esetén ehhez tartom magam. Ez nem azt jelenti, hogy egyáltalán nem fogok már az illetővel telefonon beszélni: fontos, sürgős, e-mailben nehezen lekommunikálható ügyek esetén (pl. interjú utáni első benyomás kipuhatolózása) bizony kell a telefon.<br/>
<br/>
<b>Milyen részleteket adhatsz ki még mielőtt kiderülne, hogy érdekli-e a jelentkezőt az adott állás?</b><br/>
Jaj de jó, hogy megkérdezted ezt! Sajnos kevesebbet, mint szeretnék, pláne e-mailben. Az adatvédelem két irányba működik: ugyanúgy, ahogy az önéletrajzát se adom ki a kezeim közül “ok és engedély” nélkül, úgy sajnos a kliensek (cégek) érdekeit is védenem kell. Cégnevet általában az első beszélgetés alkalmával megadok, illetve utána ezt már e-mailben is kommunikálom. Amíg viszont nem beszéltünk telefonon, addig nem adok - nem adhatok - ki cégnevet.</br>
A pénz kicsit nehezebb ügy: számokat nem írhatok le. Soha. Nem azért, mert nem akarok, mert rejtegetni valóm van vagy mert bukmékerkedem, hanem mert nem lehet.</br>
Telefonon már jobban tudunk beszélni erről is, viszont elsőnek mindig azt fogom megkérdezni, hogy Te mennyi fizut kapsz jelenleg, mennyit szeretnél eztán és csak utána adok infót arról, hogy mi az amit a kliensem nyújtani tud. Egyébként sok esetben tévhit, hogy nekem az a jó ha minél kevesebbet kapsz; mivel százalékos juttatás van, nekem is az a jó ha minél többet keresel majd, persze épeszű keretek között. (Ez a „permanent“ elhelyezésekre igaz.)
<br/><br/>
<b>Mik a jó válaszok egy gyümölcsöző kapcsolathoz ha a jelentkezőt érdekli, több információt akar vagy éppen nem érdekli az aktuális lehetőség?</b><br/>
Nekem a gyümölcsöző kapcsolathoz őszinteség kell. Én azt akarom tudni, hogy Te mit akarsz csinálni a jövőben és nem azt, hogy „tedd nekem a szépet“. Nyilván az a legjobb, ha az aktuális ajánlattal pont beletráfaltam és Neked való. Ha nem az (részlegesen kitöltött LinkedIn profil esetén bizony nagy az esély, hogy nem találom el, hogy kb. milyen pozi jöhet Neked szóba), akkor kérlek azt is mondd meg. Legalább tudni fogom, hogy mi, merre, mennyi és tudok ajánlani mást, vagy észben (no meg adatbázisban) tartalak arra az esetre ha adódik valami ami már inkább passszol(hat). Mivel nekem is lépést kell tartanom az újdonságokkal, technológiákkal, azért is jön jól ha elmagyarázod, hogy mit csinálsz vagy miért nem trafáltam bele, mert én ezáltal tanulok is. A következőnél már nem fogom a bakit elkövetni.
<br/><br/>
<b>Vannak olyan reakciók amik elijesztenek az illetőtől?</b><br/>
Hajjaj, van bizony! Van egy bizonyos arrogáns személyiség aki úgy hiszi, hogy szívességet tesz nekem azzal, hogy még nem csapta le a telefont... Szinte hallom ahogy fáj neki minden egyes válaszadás... Na az ilyeneknél felírom magamnak, hogy többet az életben ne hívjam fel!
<br/><br/>
<b>Amennyiben érdekli a jelöltet amit küldtél neki, mi a következő lépés?</b><br/>
Elküldöm a szükséges dokumentumokat a megbeszélt / kiszemelt céghez és várunk. Apropó önéletrajz. Én magam általában nem változtatgatok rajta semmit (a kontaktinfót értelemszerűen ki kell vennem), viszont ha valami rossz, azt is meg szoktam mondani és megkérem az illetőt, hogy javítsa amint tudja.</br>
Általában minden ügynökség egy sajátos sablonnal dolgozik amire „átalakítják“ az összes önéletrajzot. Tehát az eredeti forma elveszik, a tartalom megmarad. Ez két okból bevett szokás: nyomatékosítjuk, hogy ez a pályázó „tőlünk“ jön nem a konkurenciától illetve a kliensnél üldögelő HR-es kolléga szeme is gyorsabban megtalálja a keresett infót a jól megszokott forma mögött.</br>
És itt van a macska elásva: nem azért kérek WORD doksit, mert át szeretném költeni a CV-t a napi humoromnak megfelelően és mert nem tudok kezelni egy szerencsétlen PDF konvertert. Azért kérek, mert a PDF-ből lett Word-doksik szétesnek, formázhatatlanok és egyszerűen nincs időm szórakozni velük. (Így is volt olyan, hogy egy órát szántam arra, hogy a „space“-et nyomogattam, hogy szétválasszam egymástól a szavakat a konvertált doksiban. Nyami!)</br>
Persze nem azt mondom, hogy mindenki akkora szent, mint én vagyok: mint pályázó én magam is jártam úgy, hogy „eltünedeztek“ dolgok az önéletrajzomból amire az interjúztatóval csak a személyes beszélgetés során jöttünk rá.</br>
</br>
Szóval kiment a jelentkezés, várunk. Néha kicsit nyaggatom persze a céget, hogy van-e már visszajelzés, de sajnos óvatosnak kell lennem: én vagyok őértük, nem ők értem. Ha nincs feedback vagy csak 3 hét múlva van, az bizony nem tőlem függ, hanem a cégtől. Sajnos viszont én vagyok a kommunikációs csatorna, szóval ez roppant frusztráló és kényelmetlen helyzeteket tud szülni. Ezért kell nekem, a fejvadásznak arra törekednem, hogy jó munkakapcsolatot alakítsak ki a klienseimmel. Ez persze kétoldalú motiváció kell, hogy legyen.</br>
</br>
Ha jön feedback és pozitív, akkor indulhat az interjúzás!
</blockquote>
Ahogy Kata is írja sokszor előfordul, hogy a fejvadász előbb megkérdezi a jelenlegi keresetedet. Ez kevésbé vészes, ha már jól bejáratott angol állásod van. Ha viszont elkezded átváltani a magyar fizetésed fontra akkor könnyen lehet, hogy jóval a szakmai átlag alá trafálsz. Nem mondom azt, hogy hazudj. Isten ments! Azonban azt sem szeretném mondani, hogy szúrj ki magaddal. Vedd figyelembe, hogy egy potenciális munkaadó azon fog gondolkodni, hogy megéri-e nekik Téged átköltöztetni egy másik országból. A fejlettebb kultúrával rendelkező cégeknél ez tehetség kérdése és akkor hajlandóak az angol átlag feletti béreket adni. A többi cégnél pedig a pénz fog dönteni: ha egy helyi átlagos ember áráért kapnak egy jót, akkor belemennek.<br/>
Érdemes tehát belenézni az aktuális <a href="http://www.reed.co.uk/average-salary/it-telecoms" target="_blank">átlag fizetések táblázatába</a> és belőni egy olyan összeget ami beleillik a képbe.<br/>
Nyugodtan mondhatod a fejvadásznak, hogy nem gondolod, hogy jelen helyzetben az aktuális kereseted releváns viszont van egy határozott elképzelésed, hogy mi az aminél nem akarsz kevesebbet kapni.<br/>
<br/>
<h2>Telefonos kör</h2>
A telefon az általános, de láttam már Skype és egyéb más eszköz által lebonyolított első kapcsolatfelvételt is a munkaadók részéről. Ez általában azt a célt szolgálja, hogy megismerjék az embert az adatok mögött. Ki vagy te, és miért vagy az aki vagy szakmailag. Mivel viszonylag sokat voltam a vonalnak a munkaadó részén több cégnél is, ezért tudok adni egy általánosított képet arról, hogy mit is zajlik.<br/>
A struktúra amit nekem mindenhol követnem kellett az az volt, hogy 10 percben bemutatom a céget és a munkát amiről beszélgetünk. Utána 10-15 percben kérdezgetem az illetőt mindenféle dologról és a válaszokból próbálom leszűrni, hogy tényleg alkalmas lehet-e. Elsősorban emberileg, másodsorban szakmailag. A maradék 5-10 percben pedig lehetőséget biztosítok arra, hogy kérdezzen a jelentkező.<br/>
Volt egyszer egy hosszas beszélgetésem egy Microsoftos emberrel amikor megpróbáltak elcsábítani oda. Egy telefonos interjún találtam magam hirtelen és egy jó órát beszélgettünk. Mivel nem kerestem munkát, hanem ők akartak meggyőzni, ezért bátran kérdeztem mindenféle kényelmetlen dolgot a belső kultúrájukkal kapcsolatban. Milyen verziókövetőt használnak, milyen gépeken dolgoznak, tudom-e szinkronizálni a céges naptárat a saját telefonommal, naponta hányszor releaselnek, mi a CI szerver, stb.<br/>
Nagyon pozitívan csalódtam a túlvégen lévő szakemberben és egy jót beszélgettünk. Nem sokkal később jött a feedback, hogy ugyan az illető nagyon szeretne velem együtt dolgozni, de nem hiszi, hogy én ott jól érezném magam.<br/>
Lehet, hogy ez nem mindenkinél van így, de nekem ez fontos - ha nem a legfontosabb. Nagyon jó élmény volt ezt mindenféle hercehurca nélkül, egy egyszerű beszélgetésből kideríteni. Így nem vesztegettük egymás idejét tovább.<br/>
<br/>
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Mindig van telefonos kör?</b><br/>
Nem, nem mindig. Ha a környéken laksz már alapból, akkor előfordul, hogy azonnal behívnak személyes interjúra. Ha viszont még csak nem is tartózkodsz az országban, minimum egy telefonos és / vagy egy Skype-os interjúra számíts!
<br/><br/>
<b>Mi a célja egy telefonos beszélgetésnek? Mire készüljünk fel?</b><br/>
Ez attól függ, hogy kivel lesz az interjú. Ha a HR-ből valakivel, akkor inkább egy „felületesebb“ beszélgetés lesz. Értem ezalatt, hogy az illető jobban a személyes tulajdonságokra fog rámenni, illetve motivációra. Ha országváltást tervezel akkor biztos, hogy ebbe is keményen bele fognak mászni. Miért ide? Hogyan? Mikor? Kivel? Tehát egy átfogó képet szeretnének kapni Rólad, illetve eldönteni azt, hogy megéri-e a dolog, hogy a cégtől mások is „áldozzanak“ Rád az idejükből: olyanok, akik nem azért vannak a cégnél, hogy egész nap interjúztassanak.</br>
Van viszont olyan kliensem is aki jobb szereti a technikai tesztet lenyomni a legelején még mielőtt komolyan elgondolkodnak a pályázóról. Náluk egy olyan személy hívja fel először az illetőt aki hasolnó pozícióban dolgozik, mint amire a delikvens jelentkezett vagy az interjúztató közvetlen felettese lenne a pályázónak. Itt keményen megy a szakmázás, röpködnek az IT-s kifejezések és kevésbé fontos az, hogy ki vagy.</br>
</br>
A lényeg: sok dologra lehet következtetni abból, hogy kivel is lesz az interjúd. Azért azt hadd tegyem hozzá, hogy egy valamirevaló lelkiismeretes fejvadász felkészíti a pályázóját az eseményre.
<br/><br/>
<b>Mennyit tudsz segíteni a felkészülésben?</b><br/>
Az én érdekem is, hogy amennyit csak lehet. Sajnos nekem is csak annyi infóm van amit a kliensből ki tudok húzni. Azért vannak általános érvényű tanácsok is, amik nagyon hasznosak és mindig, mindenkinek elmondok, még akkor is ha egy-két dolog azért a többségnek evidens. (Mindig akad akinek valami nem az.)</br>
Ha nem újkeletű a kapcsolatom a klienssel és / vagy már helyeztem el nála embert hasonló pozícióba, akkor nagy valószínüséggel már frankó infókkal fogok tudni szolgálni! Érdemes a toborzótól megkérdezni, hogy mióta áll kapcsolatban a számunkra érdekes céggel!
<br/><br/>
<b>Milyen hosszú egy ilyen menet és van-e valami bevett struktúrája?</b><br/>
A tapasztalatom az, hogy általában minimum 20-30 perc, maximum egy óra. A “bevett” struktúra megint olyan, hogy cége válogatja. Általában adnak infót a cégről és a pozícióról és általában kérdeznek az eddigi munkatapasztalatról, cégekről. A végén vagy van idő és lehetőség kérdezni vagy nincs. Ha van akkor viszont kötelező!
<br/><br/>
<b>Milyen folyamat zajlik a háttérben? Miért nem kerülnek meg a telefonos kör után az ügyfelek?</b><br/>
Ez egy jó kérdés, magam is feltettem már párszor.</br>
Leginkább azért nem, mert (jobb esetben) egy normális szerződés véd minket. Ha mondjuk mégis tovább menne a dolog a hátunk mögött akkor azért előbb-utóbb azt észrevennénk. Olyat viszont hallottam már, hogy jött a feedback, hogy „kösz de kösz nem“, aztán kivárt a kliens és mondjuk egy fél évvel később ők maguk keresték meg a pályázót. Nem szép dolog de ez van.
<br/><br/>
<b>Előfordul, hogy telefonos kör után azonnal ajánlatot tesznek?</b><br/>
Nem, én még ilyenről nem hallottam. Minimum egy videós-skype interjú kell még hozzá. Általában a cég meghív egy személyes interjúra is. Ha ezt ők állják, akkor azért lehet sejteni, hogy bőven pozitív irányba áll a mérleg.
<br/><br/>
<b>Hogyan kapsz visszajelzést a kör sikerességéről és mennyire gyorsan?</b><br/>
Általában emailben, néha telefonon. Mennyire gyorsan? Néha azonnal, néha évezredek múlva. Olyan is volt már, hogy hosszas nyaggatás után nekem kellett feladni és azt mondani a pályázónak: “ez van, no feedback”.
<br/><br/>
<b>Te adsz visszajelzést a jelöltnek vagy a cég?</b><br/>
A tapasztalatom az, hogy nagyobb cégek esetén én, viszont kisebb cégek esetén szeretik ők maguk is felvenni a fonalat a pályázóval. Fogalmazzunk úgy, hogy én azért minden esetben tudósítok arról a pályázó felé amit én tudok (az néha kevesebb, mint amit a pályázó tud)... vagy arról, hogy mit nem tudok.
<br/><br/>
<b>Ha sikeres volt a kör, akkor hogyan zajlik az egyeztetés a következőre?</b><br/>
Jó esetben már az interjún a pályázónak is elmondják, hogy mi lesz a következő lépés és mi “csak úgy mellesleg” leszünk értesítve. Mindig örülök ha a pályázó és a cég szépen egymás között lezsíroznak mindent. No nem azért mert engem kihagynak, hanem mert ez mindenképpen jót jelent.
Másik eset, hogy én kapok a visszajelzéssel együtt infót a következő interjúról (mikor, hol, kivel).</br>
Olyan is előfordul, hogy a HR-es csak annyit tud hirtelen visszajelezni, hogy pozitív a dolog és lesz folytatás. Az, hogy mikor, hol, kivel… na ez akár csak hetekkel később derül ki. Persze ezt a verziót szeretem a legkevésbé. A több hétig tartó bizonytalanság se nekem, se a pályázónak, se a kettőnk kapcsolatának nem tesz jót.</br>
</br>
Tapasztalataim azt mutatják, hogy minél komolyabban gondolja a cég a munkaerő-felvételt, annál hamarabb jeleznek vissza a következő körrel kapcsolatban.
<br/><br/>
<b>Mennyire szokták a cégek állni a személyes körhöz szükséges költségeket, mint a repülőjegyet és a szállást?</b><br/>
Komoly, nagy nevű munkáltatóknál általában nem is kérdés, hogy állják-e a repülőutat és a szállást. Pláne, senior szintű vagy magasabb beosztás várományosa vagy. Hallottam pár olyan példát, hogy pár cég ha komolyan érdeklődik, akkor egy hosszú hétvégét is hajlamos állni a jó kapcsolat érdekében.<br/>
Én többször tapasztaltam azt, hogy állják (minimum egy részét legalább) mint azt, hogy nem. Ez sajnos a cégtől függ, erre nem alapozhatunk a folyamat legelején.
<br/><br/>
<b>Van olyan, hogy a fejvadász ügynöksége fizeti ezeket?</b><br/>
Nincs. Aki hasonló elven működik (elhelyezés utáni juttatás), az tuti nem fizet a saját szakállára.
<br/><br/>
<b>Mennyire segíti az ügynökség a jelöltet onnantól, hogy leszáll a repülőről egészen odáig, hogy elindul haza?</b><br/>
Ez a rész, amit sok esetben a legkevésbé tudunk kontrollálni. Ha a kliens persze valahol a közelünkben van, az más. Volt már, hogy az irodánkban készítettem fel a pályázót és utána együtt mentünk el az interjúra. Sajnos ez azonban ritka egész egyszerűen azért, mert a technikának köszönhetően a klienseim bárhol lehetnek a világon, nem kell feltétlen a szomszéd utcai cégekkel lepaktálnom. Ezért sajnos nagyjából lehetetlen, hogy végig fogjam a delikvens kezét, főleg a személyes talalkozó előtt / közben. Ez már inkább a kliens részéről feladat.
<br/><br/>
<b>Minden ügynökség ilyen?</b><br/>
Ezt nem merném kijelenteni, de a legtöbb igen. Jelenleg az angol toborzó cégeknél például igen nagy “divat” az Európán belüli terjeszkedés. Már most se igazán furcsa, hogy egy magyar lány Londonból mondjuk egy németországi munkalehetőséggel hív fel, a jövőben ez még kevésbé lesz így.
<br/><br/>
<b>Te elkíséred a külföldről elcsábított jelöltet a klienshez? Találkoztok egyáltalán?</b><br/>
Sajnos mivel Londonban csücsülök és főként Németországba keresek embereket, ez elég lehetetlen. De volt már pályázóm itt Londonban, vele találkoztunk és el is kísértem, bizony. Hasznos élmény volt és sajnálatos, hogy csak ritkán van rá lehetőség.
</blockquote>
<h2>Hurrá, repülök!</h2>
<br/>
Gratulálok! Innentől igazán izgalmas a történet. Készülhetsz az összehasonlítgatásra, kultúrsokkra, feldolgozhatatlan akcentusokra és mindenféle előjelű csalódásra!<br/>
<br/>
Mielőtt a szakmai részébe belevágnánk, érdemes pár dolgot megemlíteni Londonról.
Ha fizetik a szállásodat és mindent, akkor nem sok tennivalód van. De ha nem…<br/>
<br/>
A szállás és a közlekedés talán a két olyan dolog ami kiugróan költségesebb a hazaihoz képest. Nagyon sokan keresnek fel ismerősöket, barátokat átmeneti szállás és segítségnyújtás indokkal. Ha van ilyenre lehetőséged, akkor mindenképpen javaslom a szálloda helyett. Egyrészt tud kicsit mesélni a városról, szokásokról és életről. Másrészt el tud igazítani.<br/>
<br/>
A miheztartás végett pár ár amire jó, ha készülsz:<br/>
<br/>
<h3>Közlekedés</h3>
A fapados járatok repülőtereiről általában busszal, vagy vonattal juthatsz be. Mindenképpen return jegyet vásárolj, úgy kb féláron van. Így is a busz az körülbelül £10-£15, amíg a vonat £22-£30. A különbség a kettő között, hogy az egyik másfél órás út, a másik néha csak 30 perc.<br/>
<br/>
Mivel sokat fogsz várhatóan kacsázni a városban, ezért érdemes egy úgynevezett <a href="http://visitorshop.tfl.gov.uk/oystercard/product/oyster-card.html" target="_blank">Oyster card</a>ot beszerezni. Ezt használhatod minden létező tömegközlekedési járművön a <a href="http://www.tfl.gov.uk/assets/downloads/oyster-rail-services-map.pdf" target="_blank">londoni zónák</a>on belül. Erre lehetőséged van napi vagy hetijegyet venni. A napinak az ára £10 körül, a 7 napinak pedig £50 körül mozog, amiért bármennyit utazhatsz.<br/>
<br/>
<h3>Kaja / pia</h3>
Az étel a helyi keresetekhez mérve nem vészes. Magyar turistaként viszont néhol felháborító. Éttermekben nem ritka a £10-£20 közötti étel ár.
Kocsmákban átlagos a £4 egy korsó sörért, de a közértben megkapod üvegben £1.50 körül.<br/>
<br/>
<h3>Szórakozás</h3>
Szórakozóhelyekre teljesen átlagos a £8-£15 belépő.<br/>
<br/>
<!-- interjuk -->
<blockquote class="interviewee">
<table border=0 cellpadding=5 cellspacing=5>
<tr>
<td class="person">
<div class="author">
<img alt="Szabó Szilvia" src="http://s3.amazonaws.com/meza/szilvi-128px.png"/></div>
<br class="clear"/>
<b>Szabó Szilvia</b>
</td>
<td class="person">
<div class="author">
<img alt="Kerék Krisztián" src="http://s3.amazonaws.com/meza/krisz-128px.png"/></div>
<br class="clear"/>
<b>Kerék Krisztián</b>
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Mivel foglalkozol most?</b>
</td>
</tr>
<tr>
<td class="answer border">
Head of Strategy vagyok egy start-up nál de igazából mindennel foglalkozom a beszerzéstől a
stratégiai partnerkapcsolatokig.
</td>
<td class="answer">
Web-developer @ picsolve.com
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Mikor kezdtél el aktívan keresni külföldön munkát?</b>
</td>
</tr>
<tr>
<td class="answer border">Svédországban fejeztem be az egyetemet három éve, és akkor jött a gondolat hogy nem szeretnék
még otthon Magyarországon letelepedni.</td>
<td class="answer">Vicces, de 2013 augusztus elején. Lényegében teljesen hirtelen felindulásból egy hétfői napon.
Következő hét kedden már megvolt az állás:)
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Mindig Anglia volt a cél?</b>
</td>
</tr>
<tr>
<td class="answer border">Nem igazán. Először Svédország, majd Franciaország - Svájc. Angliában (Londonban) a nagyvárosi
élet, a pezsgő start-up világ, a barátok és a nyelvi könnyebbség vonzott.
</td>
<td class="answer">Nem, most sem az elsősorban. Szingapúr lenne egy 3-5 éves cél. Anglia a nyelv (angol) miatt
adta magát. Németországban vagy Hollandiában képzeltem el magam eddig.
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Milyen módszert választottál a keresésre, és mi volt az ami a végén bejött?</b>
</td>
</tr>
<tr>
<td class="answer border">Szinte mindegyiket kipróbáltam, több-kevesebb sikerrel. Pályáztam cégekhez, voltam
kapcsolatban fejvadászokkal / közvetítőkkel, írtam több motivációs levelet (bár elég kevés
motivációm volt arra, hogy bármelyik céghez is csatlakozzam).
Aztán egy nap olvastam egy start-upról a workinstartups.com-on, ami elég jó ötletnek tűnt.
Végre egy cég amiben láttam fantáziát. Írtam nekik emailt amiben röviden felvázoltam, hogy tetszik
amit csinálnak. Kérdeztem, hogy gondoltak-e már ilyen vagy olyan irányú fejlesztésre; tegyék
bele ezt és azt a marketingbe stb. Erre az emailre kb. egy órán belül jött is a válasz, hogy
felhívnának Skype-on egy állásajánlattal.
</td>
<td class="answer">Semmilyet. LinkedIn nagyon hasznos kis tool, kb. 2 éve figyelek arra, hogy jót mutasson a
profile-om. Kb. 1-1.5 éve ért be ez, mert azóta non-stop “zaklatnak” fejvadászok. Utolsó 3
állásom mondhatni úgy lett meg, hogy csak a CV-m kellett megírnom és bemenni elbeszélgetésre.
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Hány megkeresésed volt az első telefonos interjúig?</b>
</td>
</tr>
<tr>
<td class="answer border">Elég sok, 4-5 biztosan.</td>
<td class="answer">0! Azonnal volt 4 komoly ajánlat. 2 telefonos elbeszélgetés volt amit már helyben, interjú
követett.
</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Mi volt a legszürreálisabb tapasztalatod keresgélés közben?</b>
</td>
</tr>
<tr>
<td class="answer border">Annyira szürreális élményben nem volt részem viszont meglepő, hogy a hirdetésekben felvázolt
munkakör szinte szóról szóra mindehol ugyan az, csak a cégnév vagy a földrajzi elhelyezkedés
más. Így aztán nehéz eldönteni hogy melyik cég az, amelyik érdemi munkát is végez és melyik
az ahonnan azonnal, már két hónap után menekülnél.
</td>
<td class="answer">Nagyon nem keresgéltem :)</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Hány ügynökkel voltál aktív kapcsolatban?</b>
</td>
</tr>
<tr>
<td class="answer border">Ha jól emlékszem hárommal. Jobb minél több ügynökkel kapcsolatban lenni és ápolni is ezeket a
kapcsolatokat. Volt olyan ajánlat ami nekem nem tetszett de tudtam, hogy az egyik ismerősömnek
pont jól jönne. Érdemes összehozni a jó embereket és segíteni egymásnak.
</td>
<td class="answer">1 + otthon egy nagyon ügyes magyar csapattal :)</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Hány telefonos köröd volt és milyen általános tapasztalatot tudnál levonni belőlük?</b>
</td>
</tr>
<tr>
<td class="answer border">Egy vagy kettő. Általános tapasztalatként azt tudom elmondani hogy az első interjú (az
ügynökséggel) tényleg csak az önéletrajzról szól, hogy mennyire passzol a céghez.
</td>
<td class="answer">Egy telefonos volt csak, egy céggel. A másik hárommal első tapasztalatom élőben volt.</td>
</tr>
<tr>
<td colspan="2" class="question">
<b>Volt valami kiemelkedő élményed ezekkel?</b>
</td>
</tr>
<tr>
<td class="answer border">Nem.</td>
<td class="answer">Semmi különös, elbeszélgettünk csak, semmi szakmai nem volt szinte. Igazából csak egy "első benyomás"
interjú.
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Milyen gyorsan jött az első személyes interjú?</b></td>
</tr>
<tr>
<td class="answer border">Elég gyorsan, az első telefonos interjú után.</td>
<td class="answer">Azonnal, mint említettem. Hétfőn kerestem meg az egyik fejvadászt, kedden már azzal keresett meg, hogy
köv. héten ki kellene repülnöm.
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Mennyit segített a fejvadászod abban, hogy felkészülj és kijuss?</b></td>
</tr>
<tr>
<td class="answer border">Sokat, bár a mostani munkámat magamtól találtam, nagyon sokat segít egy ügynök a felkészülésben.</td>
<td class="answer">Időpontokat leszervezte, timeline-t készitett a 3 napra.</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Fizették az utad?</b></td>
</tr>
<tr>
<td class="answer border">Igen (általában ez nem szokott gondot jelenteni - ahol már ez is gond vagy szájhúzás van belőle, az
már lehet egy rossz jel. Nem kell első osztályú repjegy vagy ilyesmi, de az a cég aki nagyon szeretne
veled találkozni, az megoldja).
</td>
<td class="answer">Nem. :) Fura is volt, de így legalább volt tétje, hogy ne hülyéskedjem el :)</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Hogy oldottad meg a szállást?</b></td>
</tr>
<tr>
<td class="answer border">Egy ismerősnél.</td>
<td class="answer">Egy ismerősnél.</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Hány személyes kört szerveztél le a kintléted idejére?</b></td>
</tr>
<tr>
<td class="answer border">Kettőt.</td>
<td class="answer">4 interjúm volt, 4 cégnél.</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Mindegyikre elmentél?</b></td>
</tr>
<tr>
<td class="answer border">Persze.</td>
<td class="answer">Igen, de már az első után megvolt az állás (a kilátás az irodából és a recis lányok már előre
eldöntötté tették a kört, amit a Lead Architecttel való beszélgetés (2 óra) csak megerősített).
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Milyenek voltak a cégeknél? Találkoztál valami általános mintával?</b></td>
</tr>
<tr>
<td class="answer border">-</td>
<td class="answer">Jó volt mind, teljesen más világ, mint otthon. :) Szuper irodák, lendületes managerek, akik nem
bullshit-elésből élnek meg. Ami feltűnt elsőre mindegyiknél, hogy itt olyan dolgokat, amiket otthon
letudtunk kávézások közben, itt SCI-FI-ként kezelnek. Kicsit olyan volt az érzésem mindegyiknél,
mintha túlképzett lennék. :)
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Felvettek?</b></td>
</tr>
<tr>
<td class="answer border">Igen.</td>
<td class="answer">Igen, 4-ből 3 megvolt.</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Elfogadtad?</b></td>
</tr>
<tr>
<td class="answer border">Igen.</td>
<td class="answer">Az elsőt elfogadtam, az volt a favorit. :)</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Megbántad?</b></td>
</tr>
<tr>
<td class="answer border">Nem.</td>
<td class="answer">Hülyevagy? :)</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Hányadik volt a cég a sorban?</b></td>
</tr>
<tr>
<td class="answer border">Az első és egyetlen ami igazán érdekelt is.</td>
<td class="answer">Első, van benne fantázia és van érdekeltség szerte a világon.</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Mennyit segített a fejvadász az ittléted alatt?</b></td>
</tr>
<tr>
<td class="answer border">Nem fejvadász által kerültem ki ( korábbi állás kereséseim során viszont sokat segített).</td>
<td class="answer">Rengeteget. Nagyon precízen leszervezte a 3 napot, amit kint töltöttem. Előtte/utána találkoztunk,
átbeszéltük, mit keresnék, meddig lehet elmenni fizuban, stb.
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Találkoztatok személyesen?</b></td>
</tr>
<tr>
<td class="answer border">-</td>
<td class="answer">Igen, kisért mindenhova :)</td>
</tr>
<tr>
<td colspan="2" class="question"><b>Van valami félsz, gondolat vagy gát amiről kiderült a személyes körös napok közben,
hogy
teljesen felesleges volt és nem kellett volna aggódnod miatta?</b>
</td>
</tr>
<tr>
<td class="answer border">Persze, nő létemre tele vagyon ilyen "félsz"-ekkel. Attól kezdve, hogy a reptérről beesve nincs
rendesen kivasalva a szoknyám addig, hogy van-e nálam kinyomtatva önéletrajz. De ez mind nem számít.
Ami eddig sikerre vitt, az a munkához való hozzáállás, gondolkodásmód, segítőkészség.
</td>
<td class="answer">Nyelvtudás miatti félelem teljesen felesleges. Valakinek van egy stabil angolja, ami arra már elég
hogy felirat nélkül is nézzen filmeket és azért részegen bárkivel elbészelget, akkor itt már
perfektnek tudhatja magát. Legfontosabb tapasztalat Londonnal kapcsolatban, hogy az emberek szinte
félszavakból megértik egymást, hozzá vannak szokva a sok nemzetiséghez és az eltérő angol verziókhoz.
:)
</td>
</tr>
<tr>
<td colspan="2" class="question"><b>3 tanács amit ajánlanál mindenkinek aki angliai állásvadászatra adja a fejét?</b></td>
</tr>
<tr>
<td class="answer border">Ha szorít az idő és mindenképpen ki szeretnél kerülni, érdemes fejvadászok, ügynökök segítséget kérni.
Londonban nem nehéz munkát találni és a kezdetekben
ha nem vagy időhöz kötve, akkor jobb kicsit szétnézni, mielőtt kiköltözöl. A konferenciák, találkozók,
workshop-ok sokat segíthetnek abban hogy jobban eligazodj, és kialakíts magad körül egy ismerősi kört
akik tudnak ajánlani vagy segíteni. Sok állás van ami nincs is meghirdetve vagy csak éppen olyan
kaliberű embert fognak keresni mint amilyen te vagy.
Ne ess hasra az első fizetés ajánlattól, és ne váltsd át fejben forintra az összeget. Nyugodtan kérd
ki ismerőseid véleményét.
</td>
<td class="answer">LinkedIn!!!<br/>
Ez lenne az első 10 tanács: csináld meg jól a LinkedIn-t és Téged keresnek. Soha többet nem kell
állást keresni. :)<br/>
11. tanács: Tervezz! Ne a semmire gyere ki, legyen meg az X év tapasztalat lehetőleg olyan cég(ek)nél,
amire büszke lehetsz! Nem kell félned utána semmitől. Szakmailag egy tapasztalt magyar fejlesztő itt
bárkivel felveszi a versenyt. De nem mindegy mi az induló fizetés és ezt csak tapasztalattal lehet feltornázni. :)
</td>
</tr>
</table>
</blockquote>
<!-- interjuk end -->
<h2>Úristen, interjú!</h2>
Ha igazán tökös fejvadászokkal vagy körülvéve, akkor nagy valószínűséggel az adott városban (fókuszunkban London) eltöltött pár nap alatt megannyi cég irodáiban fogsz megfordulni. Tudom, hogy a legtöbbetekben van egyfajta vizsga-drukk és izgalom. Ne legyen. Nem úgy kell felfogni, hogy munkáért kuncsorogsz. Ez nem Magyarország. Itt arról van szó, hogy kölcsönösen hasznosak lesztek-e egymásnak a munkáltatóval vagy sem. Illetve arról, hogy több értéket tudsz-e Te adni, mint egy helybéli.<br/>
Fontos az, hogy milyen képet alkotnak rólad az első benyomás alapján. Ha nagyon izgulsz, akkor teljesen másként látszódhatsz, mint egyébként. Félszeg vagy, halk, remegő és bizonytalan, vagy egy értékes szakember aki mer, tud és akar is dolgozni? Nem mindegy melyiket látják! A magabiztosság, kérdező-készség és a kommunikáció a legfontosabb. Van-e rálátásod a területre amin dolgozol? Fejleszted-e önmagad? Elismered-e ha valamit nem tudsz? Tudsz-e segítséget kérni másoktól?<br/>
<br/>
<h3>Mi történik a találkozón?</h3>
Nagy valószínűséggel egy recepcióhoz fogsz érkezni, ahová kijönnek eléd. Onnantól a protokoll cégenként más, de szinte mindegyiknél hasonlók az elemek csak más sorrendben. Nem ritkák a 3-5 órán át tartó személyes körök, amiknek része egy ebéd is.<br/>
<br/>
Elmondom, hogy amikor én vagyok az interjúztató, akkor mi történik.<br/>
<br/>
<h4>Megérkezés</h4>
Általában a felettesem vagy én összeszedjük a jelöltet a recepciónál. Pár mondatot váltunk, megkínáljuk itallal és bevezetjük az interjú helyszínére.<br/>
<br/>
<h4>Tech teszt</h4>
Itt egy pair-programming technikai teszttel kezdünk aminek két célja van: felmérni a tudását az illetőnek és megismerni a gondolkodásmódját. Én személy szerint szeretek olyan feladatokkal készülni amikre nem csak egy uniform jó megoldás létezik. Sokkal többet jelent ha látom, hogy valaki nem bonyolítja túl feleslegesen, ésszel és tesztekkel védve kódol, minthogy hatalmas enterprise mintákkal pocsékoljuk az életünket. Sokkal többet jelent az, ha látom miképpen használja a Google-t, minthogy minden szignatúrát tud fejből. Szeretem látni az embert a programozóban és a programozót az emberben.<br/>
<br/>
<h4>Manager + HR kör</h4>
A technikai tesztnek akkor van vége amikor az interjúztató-partnereim leváltanak. Általában 50-60 perccel a kezdés után. Itt egy leendő közvetlen felettes, leendő közvetlen kolléga és opcionálisan egy HRes ül Veled szemben. Ők arra kíváncsiak, hogy miképpen fogsz tudni beilleszkedni és hogyan fogod segíteni - vagy hátráltatni - az ő munkájukat. Ha olyan pozícióba felvételizel ahol másokat kell irányítanod, akkor az ez irányú képességeidről is faggatni fognak. Fontos, hogy készülj fel az adott cég termék-portfóliójából. Sok helyen belekérdeznek és ha nincs ismereted, akkor azt szűrik le, hogy nem is akarsz ott dolgozni igazán.<br/>
Nagyon jó példa erre egy Amazonos interjú kérdés: “Mi a CTO-nk neve és hogy kell kiejteni.”<br/>
<br/>
<h4>Folytatás</h4>
Legtöbb cég itt dönti el, hogy bent tart-e még kicsit vagy sem. Az, ha nem marasztalnak az nem jelent semmi negatívat. Szimplán lehet, hogy nincs idejük.<br/>
Az viszont, ha ezután körbevezetnek, bemutogatnak embereknek és meghívnak ebédelni vagy munkaidő után sörözni, az mindenképpen jót jelent. Itt viszont van egy kulcs pont: ha éppen nem a reptérre sietsz vagy egy másik interjúra, akkor fogadd el az invitálást! Még ha nincs is kedved, akkor is!<br/>
Ha olyan helyre visznek ahol nem ismersz semmilyen terméket, akkor kérdezz! Meséld el, hogy miket szeretsz és kérd meg, hogy javasoljanak valami jót és izgalmasat! Ez a lehető legjobb lehetőség arra, hogy egy pozitív kapcsolatot alakíts ki a leendő főnökeiddel és kollégáiddal. Ennek köszönhetően, amint költözésre kerül a sor, máris ismerősök közé fogsz érkezni. Egy másik jótanács: akármi történik, Te maradj a legjózanabb! Ez itt kb annyit jelent, hogy mondjuk 2 körrel legyél - valahogy okosan - lemaradva.<br/>
<br/>
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Milyen egy átlagos személyes körös nap? Mik történnek?</b><br/>
Találkozik az illető a HR-rel és néhány Team Leader-rel meg Manager-rel. Van néhány személyes interjú, bemutatkozás, esetleg valami technikai teszt. Bemutatják a céget, körbevezetik itt-ott, kézfogás ezzel-azzal, hasonlók. Volt pályázóm, aki a cégnél töltött nap végén megkapta a szerződését is.
<br/><br/>
<b>Mi az amivel mindenképpen készüljünk?</b><br/>
Értelmes kérdésekkel mindenképp, illetve tollal es jegyzettömbbel. De komolyan! Sajnos nekünk magyaroknak ezt nem tanították meg (nekem legalábbis nem), hogy igenis jegyzeteljünk az interjún! Elvégre rengeteg hasznos infó elhangzik. Ha lejegyezzük, azzal csak az összeszedettségünket és érdeklődésünket fejezzük ki. Érdemes az önéletrajzunkból is egy-két példányt a táskánkban tartani, hogy adott esetben kéznél legyen. Fontos viszont, hogy mi magunk ne az önéletrajzunkból puskázzunk. Bármilyen furán hangzik, de ha kinyomtatjuk a minket interjúztató LinkedIn profilját és azt is kipakoljuk az asztalra… nos volt olyan kliensem, aki ettől totál oda volt, meg vissza! (Persze pozitív értelemben.)
<br/><br/>
<b>Hogyan viselkedjünk? Vannak tabuk vagy protokollok amikről tudnunk kellene?</b><br/>
Sajnos egyes pályázók túlbecsülik magukat. Úgy érzik, hogy elég, ha a technikai tudásuk meg a “skill”-ek beszélnek helyettük. Ez sajnos maximum a közvetlen (leendő) kollégákkal és team leader-ekkel lesz így. Egy HR-est vagy felsőbb vezetőt igenis “le kell venni a lábáról”, igenis figyelni kell az ön-menedzselésre! Hiába vagy baromi jó Java-s, attól még meg kell tanulni “eladni” magad.</br>
Ez az amiben én, mint toborzó a legtöbbet tudok segíteni feltéve, ha hallgatsz rám. Sajnos azonban az a tapasztalatom, hogy pont azok akiknek a leginkább szükségük lenne a jó ön-menedzselésre azok vannak leginkább úgy vele, hogy felesleges “blabla” amit a vonal másik végen süketelek és hogy ők bizony nem fogják eladni magukat az “önmarketing” ördögének. Így is lehet persze.
<br/><br/>
<b>Milyen ruhában menjünk?</b><br/>
Ahogy említettem, ha nincs más külön kiemelve, akkor igenis elegánsban: ing, zakó, és valami normálisabb (nem farmer) nadrág. Persze nem mondom, hogy elő kell venni a régi öltönyt a szekrény legaljából. Ha nem vagytok biztosak a dolgotokban, nyugodtan kerdezzétek meg a toborzót! Ja, és a sportcipőt is tessék elfelejteni! Ha a cégnél lazábban veszik a dolgot, azt valószínűleg megemlítik. Túlöltözni egyébként sem olyan ciki, mint alulöltözni.
<br/><br/>
<b>Milyenben ne?</b><br/>
A sportcipő tabu, a farmer “casual” esetén egy zakóval szerintem elmegy. Az elnyűtt Metallica-s pólót remélem nem is kell említenem!
<br/><br/>
<b>Ez tényleg ennyit számít?</b><br/>
Igen, tényleg. Olyan ez, mint egy randi, fontos az első benyomás. Ha nagyon érdekel a lány, a randira is normálisan öltözöl fel, nem?
<br/><br/>
<b>Előfordulhat az, hogy nem engeded a jelöltet interjúzni a saját jó hírneved érdekében, ha személyesen ezt indoklóan jelenik meg?</b><br/>
Igen, elő bizony. Ha az én bizalmamat eljátsza valaki, akkor informálom róla a kliensemet is és megkérem, hogy vegyük ki az illetőt az eljárásból.</br>
Volt olyan esetem, ahol erősen dilemmáztam, hogy mi legyen a pályázómmal kapcsolatban: hittem is a “sztoriját”, meg nem is. Végül úgy döntöttem, hogy kiállok mellette és meggyőzöm a kliensemet, hogy érdemes még egy próbát tenniük. Hát ne tudjátok meg, imádkoztam rendesen, hogy ne csalódjak se én, se a kliens a pályázómban!
<br/><br/>
<b>Vannak olyan témakörök amiket hárítanunk kell(ene) Rád és nem megvitatni az interjúztatóval?</b><br/>
Nem, így hirtelen semmi nem jut eszembe.
<br/><br/>
<b>Van valami említésre méltó sztorid ahol valakit a viselkedése miatt utasítottak el és nem a szakmai képessége miatt?</b><br/>
Igen, van. Az illető technikailag ott volt, ahol lennie kellett, illetve a potenciál meg volt benne, viszont sajnos az ön-menedzselésre (meg a süketelésemre) nem figyelt. (Megjelenés, gesztus, beszéd-stílus, stb…) Sajnos a pozi pont olyan volt, ami megkövetelte a cég klienseivel való mindennapos interakciót és sajnos nem voltak meggyőződve róla, hogy a pályázóm sikeresen tudná képviselni a céget, ezért nem vették fel. Egyáltalán nem a technikai tudásán múlott.
<br/><br/>
<b>Milyen gyorsan jön visszajelzés az interjú után?</b><br/>
Interjú után mindig (!) beszélek a pályázóimmal, lehetőleg rögtön mikor kijöttek amíg még friss az élmény. Ebből aztán – és ebből sose csinálok titkot – küldök egy kis összefoglalót a kliensemnek is. Szeretik ismerni a pályázó véleményét az interjúról és róluk. Általában ilyenkor – ha röviden is -, a kliens is visszajön valami infóval. Ha a személyes interjú után egy-két nappal nem jön valami visszajelzés, akkor az sajnos általában már veszett fejsze nyele. A kedvencem, amikor a kliens előbb jön infóval minthogy a pályázóm véleményét egyáltalán ki tudtam volna puhatolni.
<br/><br/>
<b>Mi volt a legrosszabb visszajelzés amit valaha adnod kellett volna és nem a tudást illette?</b><br/>
Bármennyire gondolkodom nem ugrik be semmi ilyen. Általában már irányunkba is elég diplomatikusak. Olyan volt, hogy a HR-es egy smiley-jel kíséretében megkért, hogy finoman adjam tovább a véleményét. (Pedig nem volt durva.)<br/>
</br>
Viszont feltettem a kérdést a kollégáimnak is (utólagos engedelmeddel) és olyan sztorizás kerekedett belőle, hogy nem győztünk nem hangosan nevetni. Egy kollégám pályázójának két interjúja volt egy nap és mindkét helyről azt a visszajelzést kaptuk, hogy az ipse alkoholistának tűnt: izzadt, kicsit szétszórt volt, stb. A kollégámnak fel kellett tennie a kérdést a pályázó felé, hogy adott esetben vállalna-e orvosi kivizsgálást, ám a delikvens kiakadt a “vádakon” és visszautasította a dokit. Ezek után a kollegám előadta az egyik cégnek, hogy a pályázó nem alkoholista, csak sietett, izgult és hogy más cég pozitívan érdeklődik utána.</br>
A végeredmény: a kliensünk felvette és az illető azóta is ott dolgozik. (Az, hogy alkoholista-e nem derült ki…) Így kell ezt kérem csinálni!
</blockquote>
<h2>Túlélted, gratulálok!</h2>
Ha minden jól ment, akkor már valószínűleg úgy ülsz a repülőn hazafelé, hogy tervezgeted a költözésedhez szükséges dolgokat.</br>
Ha igazán szerencséd van, akkor már egy konkrét ajánlattal a kezedben teszed mind ezt. De mit is jelent az ajánlat?</br>
</br>
<h2>Mit tartalmaz az ajánlat?</h2>
Magukat komolyan-vevő cégek esetén az ajánlat egy amolyan szándéknyilatkozat, amit papíron meg is erősítenek. A legtöbb helyen azonban szimplán egy ígéret, hogy irányukból nincs semmi akadálya a szerződés megkötésének az adott pozícióra a megbeszélt juttatásokért. Sokszor annak közlését, hogy van-e ajánlat vagy sem, a fejvadászra bízzák.</br>
Csatornától függetlenül innentől már csak Rajtad áll, hogy elfogadod-e vagy sem.</br>
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Az ajánlattétel után mennyi közöd van a többi eseményhez?</b><br/>
Nem sok, maximum csak kommunikációs csatorna maradok a két fél között. Ha igény van rá, megvitatom az ajánlatot a pályázóval az ő szemszögéből nézve. Ha kell, megvitatom a pályázót a klienssel. Nem titok, itt már kifejezett célom a dolgot pozitív irányba terelni (elvégre a finish-ben vagyunk), de igazából szavam már nincs.
<br/><br/>
<b>Mennyire tartod a kapcsolatot az elhelyezettjeiddel? Érdekel a sorsuk?</b><br/>
De még mennyire, hogy érdekel! Van persze, aki eltűnik a szemem elől, de nagyon sok pályázóm van, akivel a mai napig megvan a jó kapcsolat, akár én helyeztem el, akár nem. Olyan is akad, akitől már többet megtudtam a kliensemről, mint magától a cégtől. Ez egy szuper dolog, főként a jövőbeni pályázóimnak; arról a cégről tényleg alapos infókkal fogok tudni szolgálni a jövőben!
</blockquote>
<h2>Elfogadom! Mi történik ilyenkor?</h2>
Ha még az interjú közben megtörténik ez az egész folyamat, akkor sokszor ott helyben a kezed alá tolják a szerződést.<br/>
<br/>
Ha azonban csak az után, hogy hazarepültél, akkor egy szép paksamétában küldenek Neked mindenféle aláírandót és kitöltendőt. Ezeknek a száma cégenként változik. Nekem például EÜ kérdőívet, titoktartásit, meg minden nyavalyát ki kellett töltenem és aláírnom.<br/>
<br/>
<h2>Szerződés</h2>
A szerződés egészen átlagos. Mikor kezded a munkát, mik a kötelességeid, mi a munkaköröd, mi a munkaidő, mennyi szabadságod van, relocation package, stb.<br/>
Ezzel nincs más dolgod, mint átnézni, mély levegőt venni és aláírni majd postázni.<br/>
<br/>
Gratulálok, ideje elkezdeni pakolni! :)<br/>
<br/>
Van pár témakör amit még nem érintettem és fontos kiemelni:<br/>
<br/>
<h2>Juttatások</h2>
Legtöbb permanens álláshoz különféle juttatások tartoznak. Alább egy lista a legáltalánosabbakról. Az, hogy mit ajánlanak meg Neked, az cégtől függ.<br/>
Ezen tételek minden esetben a fizetésed FELETT értendők, hozzáadódnak.<br/>
<br/>
<ul>
<li><h3>Részvény</h3> ha a tözsdén van a cég, akkor sokszor motivál örökös részvénytulajdonnal.</li>
<li><h3>Bónusz</h3> minden cégnél van, és sávos. Minél nagyobb beosztásban vagy, annál nagyobb a bónusz százalék. Sima fejlesztőknél ez 10-20%, senioroknál 20-30%, feljebb meg akár 50-60ig is mehet. A szám azt jelenti, hogy a pénzügyi év végén az éves fizetésednek a hány százalékát utalják át jutalomként pluszban. Fontos tudni, hogy az összegen hatalmas (közel 50%) adó van</li>
<li><h3>Private healthcare</h3> a cég biztosít téged (néha a családotat is), aminek keretében megadott magánklinikákra tudsz menni a biztosítás oltalma alatt. Ez például nekem egy £700-os endokrinológiai vizsgálatot jelentett ingyen, az ország legnagyobb szaktekintélyénél.</li>
<li><h3>Autó hozzájárulás</h3> minden hónapban adnak benzinre igen jelentős összeget. Ha nincs autód, akkor KPban a közlekedésre.</li>
<li><h3>Bérlet</h3> kifizetik a bérleted.</li>
</ul>
<br/>
<h3>Relocation</h3>
Sok helyen van olyan rendelkezés, hogyha X mérföldön kívülről vesznek fel valakit, akkor adott limitig állják a költözéssel járó költségeket.<br/>
Érdemes rákérdezni az ajánlat elfogadása előtt erre és ennek a körülményeire.<br/>
Nekem például azzal a feltétellel ajánlottak egy szebb összeget ha 1 hónappal korábban tudok kezdeni. Elfogadtam.<br/>
<br/>
<h2>Bónusz beszámoló</h2>
Egy névtelenséget kérő olvasónk osztott meg velünk egy történetet az előző cikk után, ami talán segít színezni a képet a fent elhangzottakkal egyetemben. Íme:
<br/>
<blockquote class="interviewee">
<div class="author">
<img alt="Anonymous" src="http://s3.amazonaws.com/meza/anonymous-128px.png" /></div>
Valójában sosem kerestem állást külföldön, se Angliában, se máshol. LinkedIn-en három-négy éve folyamatosan megtalálnak fejvadászok, a legtöbb Angliából. Nem reagáltam rájuk, egészen 2011 novemberéig, amikor az életem eléggé a feje tetejére állt és nézzük meg milyen egy interjú Londonban alapon az egyikre válaszoltam. Az önéletrajzom elküldése után egy-két nappal volt a telefonos interjú, elég egyszerű szakmai kérdésekkel, majd megkérdezték kimennék-e egy személyes interjúra. Igent mondtam, kivettem egy nap szabadságot és reggel mentem, este jöttem.<br/>
Az interjú nem volt túl nehéz, négy emberrel beszéltem, egy Senior Developer-rel és a leendő Team Leaddel, az ő főnökével és egy HR-es hölggyel. Még aznap este ajánlatot tettek, egy londoni mércével is tisztességes számmal. Akkor nemet mondtam.<br/>
<br/>
Eljött 2013 eleje, ismét egy nagyon nehéz évvel a hátam mögött jött egy újabb megkeresés, ezúttal Spanyolországból. Erre pusztán azért válaszoltam, mert el tudtam képzelni magam a spanyol tengerparton henyélve munka után. Ez az interjú eddigi legrosszabb élményeim egyike volt, annak ellenére, hogy egy hosszú hétvégét fizettek. Háromszor egy órás telefonos kör volt, ahol sokszor ugyanazokra a kérdésekre kellett válaszolnom. Ezt még megelőzte egy három órás teszt, amit még otthonról csináltam meg, majd jött a kinti egész napos interjú, ahol a négy interjúztató emberből három kifejezetten ellenszenves volt és ráadásul ahogy utána érdeklődtem, kb évi 50 000 EUR bruttó fizetés lett volna az ajánlatuk. Már a kinti személyes interjúk alatt eldöntöttem, hogy nemet fogok mondani, szerencsére nem kellett, mert úgy tűnik az ellenszenv kölcsönös volt, nem tettek ajánlatot, "differences in coding style" indokkal. Semmi gond, köszi a hosszú hétvégét :)<br/>
<br/>
Ekkor viszont már annyira benne voltam, hogy egy angol fejvadásznak válaszoltam, aki kapásból négy interjút is elkezdett szervezni. A telefonos interjúkat letudtam otthonról, megvettem a repjegyet, hogy pár napot Londonban töltsek és letudjam őket. A fejvadász azonban valahogy nem állt a helyzet magaslatán, szerda este indultam volna és addig még egy interjút sem sikerül megszerveznie. Írtam a korábbi cégnek, akiknél 2011-ben már sikerrel jártam és megkérdeztem, van-e esetleg valami lehetőség náluk. Szerencsére volt, még aznap megtörtént egy újabb telefonos interjú és pénteken, amikor már kint voltam, egy újabb személyes találkozó. Ugyanazokkal az emberekkel beszéltem, az eredmény is ugyanaz lett, de ezúttal elfogadtam az ajánlatot.<br/>
<br/>
Egy hónapos felmondási időm volt otthon, július másodikán volt az első munkanapom Londonban, azóta is itt dolgozom, most már próbaidőn túl és nem Senior Developer pozicióban, mint aminek felvettek, hanem előléptettek Technical Architectnek. A szállást még otthonról intéztük el, szerencsénk volt, mert egy ismerős hazaköltözött és azt a lakást, amit ő bérelt sikerült kivennünk, kaució nélkül ráadásul. A lakás két hálószobás, 1 050 fontot fizetünk érte. Greenwichben van, a környéket nagyon szeretjük és 30 perc alatt vagyok bent a munkahelyen.<br/>
<br/>
A fizetésből nagyon szépen kijövünk ketten, minden hónapban sikerül félretenni valamennyit, úgy hogy azért eljárunk mindenféle helyekre, eszünk-iszunk rendesen. Kultúrsokk, honvágy részemről egy szemernyi sincs. Szerettem Magyarországot vagy Budapestet, szerettem otthon élni - ebben nyilván sokat segített, hogy szerencsére a fizetésem is nagyon jó volt - és ez az érzés továbbra sem változott. Ami nagyon más itt kint, az hogy úgy érzem több a lehetőség, biztosabbnak érzem a jövőmet. Sokszor megfordul a fejemben, hogy hol tartanék, ha 2011-ben igent mondok.
</blockquote>
<h3>Előzmények</h3>
<ul>
<li><a href="http://www.meza.hu/2013/10/angliai-utikalauz-it-soknak.html" rel="prev" target="_blank">A gondolat</a></li>
</ul>
<h3>Hogyan tovább?</h3>
Remélhetőleg ezután a két bejegyzés után egy kicsit tisztább képed van arról, hogy miképpen indulj neki életed talán egyik legnagyobb kalandjának. Tudom, kicsit hosszú, de már régóta érett.
<b>Lesz még 3+1 fejezet</b>, amikben kitérünk a következőkre olyan emberek segítségével, akik első kézből tudnak hasznos tapasztalatokat megosztani:<br />
<ul>
<li>Kiköltözés, lakásvadászat, telefon, internet, számlák, szükséges papírok, elintézési módok, hasznos tippek az egyébként nem triviális új élet kezdéséhez</li>
<li>Integráció, kultúra, mit szabad?, mit tilos?, miképpen működik itt a szakma és a szakmán kívüli élet? Mennyibe kerül a minden és milyen egy átlagos IT-s élete?</li>
<li>Költözés családdal, kisgyerekkel. Mik a lehetőségek, költségek és miképpen lehet a legjobbat kihozni a helyzetből?</li>
<li>Bónusz: szakmai események: hol találod őket?, mik vannak?, mik a szokások?, hova érdemes menni?</li>
</ul>
<h2>Kérdezz!</h2>
A tartalmat leginkább a személyes és baráti kör tapasztalata vezérli. A sorozatot viszont Nektek készítjük! Ha szeretnétek bármilyen, az ittléttel, költözéssel vagy munkakereséssel kapcsolatos kérdésre választ kapni, akkor írjátok azt meg a <a href="mailto://meza+utikalauz@meza.hu">meza+utikalauz@meza.hu</a> címre, mi pedig válaszolunk rá.<br/><br/>
<h2>Hasznos volt?</h2>
A cikksorozat mindenféle anyagi motiváció nélkül készül. Amit "nyerünk" belőle az felkészült pályázók, és jó szakemberek akikkel együtt tudjuk megváltani a világot itt, Londonban.<br/>
Mivel a tartalom eléggé hosszúkás és néha jobb az ilyet a buszon, metrón vagy vonaton offline olvasni, ezért könyv formájában is kiadjuk a tartalmat.<br/>
<br/>
<b><a href="http://leanpub.com/angliai-utikalauz-itsoknak" target="_blank">A könyv leanpub oldala</a></b></br>
<br/>
A "könyv" ára jelenleg 0.99 USD, de ingyen is meg tudjátok szerezni, ha alkalmazzátok a "<b>belevagok</b>" kupon kódot.<br/>
<br/>
Sok sikert az állásvadászathoz!
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com5tag:blogger.com,1999:blog-7528777922526033452.post-17309706135988883142013-10-01T10:18:00.001+01:002013-10-29T12:03:19.988+00:00Angliai útikalauz IT-soknakI’ve been contacted many times before by fellow Hungarians about things you should know before moving to London. I’ve decided to write up everything I’ve experienced into a how-to. Because it is tightly coupled to Hungarian culture and life, I’m going to write these posts in Hungarian. Sorry for the inconvenience, and thanks for your understanding!<br />
<br />
Szóval!<br />
Sokan kérdeztetek már tőlem kisebb-nagyobb blokkokban kiköltözéssel kapcsolatban. A legtöbb információ amit a neten lehet találni az arról szól, hogy miképpen zajlik az élet a vendéglátásban vagy a gyerekfelügyelet területén. Azoknak viszont, akik IT-n belül mozognának, nekik nem sok hasznos gyümölcs terem az interneten.<br />
Azoknak szól a poszt-sorozat, akik gondolkodnak a kiköltözésen és mindent körbe akarnak járni.<br />
Összeszedjük a legfontosabb információkat a munka kereséshez, interjúzáshoz, költözéshez és berendezkedéshez. Mit kell tudni a jövedelemről, kiadásokról, lakhatásról, életről. <b>Segítségemre lesz <a href="http://uk.linkedin.com/in/katalinb" rel="author" target="_blank">Bognár Kata</a></b>, aki betekintést nyújt a a fejvadászok életébe és elmeséli miképpen lehetünk sikeresek a velük való közös munka során. Mikre kell figyelnünk és hogyan illene viselkednünk. Katát és a munkáját kicsit jobban megismerhetitek ha elolvassátok a releváns <a href="http://cukorhal2.wordpress.com/2013/09/22/a-fejvadasz-mint-olyan-allatfaj-1/" style="text-decoration: none;">blogbejegyzését</a> :)<br />
<img border="0" src="http://s3.amazonaws.com/meza/union-jackx736.jpg" width="730" />
<br />
<a name='more'></a><h3>
Megfogalmazódott a gondolat, hogy talán külföldön jobb?</h3>
Mindenhol vannak jó és rossz dolgok, az élet egyensúlyon alapszik. Londonban szinte megszűnik az ember politikán gondolkodni, cserében rengeteg bürokratikus kört kell futni szinte mindennel. Eszelősen sok szakmai esemény van szinte minden délután, cserében a munkahelyek tele vannak középszerű és szakmai érdeklődést nem mutató emberekkel. Rengeteg ilyen párhuzamot tudnék még írni, de nem ez a lényeg. A lényeg, hogy mindennek megvan az ára. A kolbászos kerítésért fel kell adnunk a feneketlen tejfelt. Mindenkinek magának kell eldöntenie, hogy képesnek tartja-e magát a alkalmazkodásra és hajlandó-e változtatni a szokásain. Ha hajlandó, akkor megéri-e? <b>Ha a politika nem zavar, anyagilag nincs gondod otthon és nem tudod elképzelni a vasárnapot a családi húsleves nélkül, akkor ne indulj útnak.</b><br />
Komolyan.<br />
<br />
<h3>
Képes vagyok alkalmazkodni, belevágnék!</h3>
Tehát úgy döntöttél, hogy Anglia!<br />
Rengeteg téves vagy csak részben valós dolog kering a köztudatban, ezekre érdemes kicsit kitérni:
<br />
<br />
<h4>
Startupok jól fizetnek:</h4>
Nem. Sajnos csak otthon divat ez. Itt, mivel újonnan induló “startup” cégről van szó, ezért nagy garasoskodás megy. Sokat várnak el és az elvárásokhoz képest keveset fizetnek. Példának okáért ugyanannyit kap egy heti 37.5 órában dolgozó java backendes, mint egy frontend+backend+dba+sysop kombójú, 24/7ben riasztható, reggeltől vakulásig dolgozó startup alkalmazott. Van akinek ez a jelenlegi életciklusában tökéletesen megfelel, de érdemes erről beszélni időben.<br />
<br />
<h4>
Tökéletesen kell tudni angolul / Királynő angolját kell beszélni:</h4>
Nem(, persze nagy előnyökkel járhat ha sikerül levetkőzni az akcentust és bővíteni a szókincset).<br />
Akkora az olvasztótégely, hogy szinte nem lehet hallani 2 egyforma beszédet. Az utóbbi pár generáció már úgy nőtt fel itt, hogy körül voltak véve angolul alig tudó bevándorlókkal. Megszokták és már fel sem tűnik nekik. Olyannyira, hogy sokszor el is felejtkeznek arról, hogy esetleg te nem érted őket rendesen. Ilyenkor nem szégyen egy illedelmes “Sorry, could you repeat please” vagy egy “Come again” mondatot elmorzsolni. Akár 8x is, ha 8x kell. Nem sértődnek meg.<br />
<br />
<h4>
Dress code:</h4>
Cégtől függ.<br />
Bankszektorban öltöny+nyakkendő, még ITban is.<br />
Nagyobb szervezeteknél és nem trendi cégeknél általában annyi megkötés van, hogy lehetőleg hosszú nadrág, nem sport cipő és konszolidált felső legyen.<br />
A normálisabb cégeknél viszont semmi ilyen marhaság nincs, de ha ez fontos Neked, akkor érdemes az első interjún megkérdezni.<br />
<br />
<h4>
Sokat esik az eső:</h4>
Ez igaz is, és nem is. Tény, hogy vannak időszakok amikor egymás után minden nap elered, de nem szabad összehasonlítani az otthoni esőkkel. Az, hogy jelenleg milyen időjárás van, nem determinálja a következő félóra időjárását sem. Az általános minta, hogy kb 10 percet esik, majd eláll félórára. Aztán megint esik 10 percet, majd kisüt a nap. Így valóban igaz, hogy időnként minden nap esik. Csak nem mindegy, hogy mennyit.<br />
Nekem például nincs esernyőm amióta kiköltöztem és gyalog (meg tömegközlekedve) járok. Másfél év alatt egyszer sikerült rommá áznom, amikor ez a minta nem jött be.<br />
<br />
<h4>
Szar a kaja:</h4>
Más a kaja. Az angolok reggelit alig esznek, ebédre csak egy szendvics dukál csokival meg üdítővel, majd vacsorára egy jó adag steak. Emiatt a munkahelyek közelében ritkán lehet jó és emberi áron lévő, magyar ember számára ebédként értelmezhető főtt ételt kifogni. Nekem szerencsém van, mert a jelenlegi munkahelyemen található kávézó kajás részében néha egészen ízletes marhapörkölt és egyéb nyalánkság van a magyar chefnek köszönhetően.<br />
Ezen kívül ott vannak a különböző indiai, arab, kínai, stb. étkezdék amikkel mindenki úgy barátkozik, ahogy akar.<br />
És van az otthon főzés vagy a helyi szokások átvétele.<br />
<br />
<h4>
Drága a kaja:</h4>
Ez is félig igaz. Az éttermes kaja drága a hazaihoz képest, pont.<br />
A boltokban az alapanyag viszont átszámítva is megegyezik a magyarral, ellenben jobb a minősége. Sajnos ez a szomorú igazság. Ami otthon import, és sok adó sújtja, az itt helyi termék, adókedvezménnyel.<br />
A legtöbb nagy áruházláncban van úgynevezett “meal deal”, ami egy szendvics, csoki vagy gyümölcs és egy üdítő, potom 3 fontért. Ennyiből meg tud ebédelni egy angol.<br />
Ha a bolti alapanyagokat drágának és nem megfelelőnek találnád, akkor még mindig mehetsz a megannyi híres kaja-piac bármelyikére, ahol aztán kedvedre válogathatsz az otthoninál jóval olcsóbb és jóval jobb minőségű dolgokból.<br />
<br />
<h4>
Drága a lakás:</h4>
Ezen nincs mit szépíteni, az. Marhára. Azonban, ha arányaiban nézzük egy programozói fizetéshez, akkor nem. Személy szerint otthon is a fizetésem harmadát költöttem egy hasonló lakásra, itt is azt teszem.<br />
<br />
<h4>
De hát a jó kis magyar ízek:</h4>
Ha IT-s létére nem találja meg magának az ember a megannyi magyar boltot, akkor megérdemli. Házhoz szállítják a túró rudit a rendeléstől számított 24 órán belül, ha lusták lennénk elmenni érte. De a csokin kívül lehet kapni kolbászt, hurkát, tejfölt, piroska szörpöt, pálinkát, meg minden mást, mint otthon. Igaz, kicsit drágább, de ez érthető. Sőt, van lángosos is Camdenben (bár inkább hasznos pár sör után, mint finom), illetve nyíltak fornettis üzletek is. Személy szerint én próbálom megszüntetni a dependenciákat. Úgy érzem, hogy nem azért költöztem el, hogy aztán sóvárogjak. Inkább felfedezem az újdonságokat, és helyettesítem a régi ízeket újakkal. Persze néha elcsattan egy húsleves, de az is helyi alapanyagokból.<br />
<br />
<h4>
Abból a fizuból már bármit megtehetek:</h4>
Korántsem, viszont ha nincs hiteled, nem kell hazaküldeni pénzt és senki mást magadon kívül eltartanod, akkor értelmes keretek között és ésszerű elvárásokkal, nyugodt - már-már gondtalan - életed lesz.<br />
<br />
<h3>
Értem! Hogyan keressek munkát?</h3>
A külföldi munka keresést nem érdemes az utolsó pillanatra hagyni. Semmiképp sem javaslom, hogy felmondj azelőtt, hogy valahova már felvettek. Még ha az első helyre ahová jelentkezel be is kerülsz, hetek - vagy hónapok - telhetnek el az első levél és a szerződés megkötése között. Ha van tartalékod arra a pár hónapra, akkor csak segíti a helyzeted, ha azonnal tudsz kezdeni. Azt azért érdemes tudnod, hogy a fent említett bürokratikus körök itt is megvannak és fájnak.<br />
<br />
Amíg otthon pénzügyi okokból kifolyólag a legtöbb munkáltató belsősökkel oldja meg a munkaerő toborzását, addig itt külsős fejvadász cégeket alkalmaznak erre a feladatra. Olyannyira, hogy sokszor a munkáltató meg sem hirdeti publikusan a munkát, hanem csak az úgynevezett beszállítóinak adja le az infót. Ez nem azt jelenti persze, hogy nem lehet céges weboldalakon kifogni az álommelót. Van rá esély, csak jóval kevesebb, mint amit otthon megszoktunk. <br />
<br />
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Mi a különbség a HRes, a fejvadász és a toborzó között? Melyiknek mi a feladata?</b><br />
A toborzó az, aki egy ügynökségnek dolgozik és nem a saját cégének keres munkatársat. A fejvadászt lényegében a toborzó szinonímájaként használják, de van egy árnyalatnyi különbség; ő az, aki ilyen-olyan dumával szerzi meg valaki telefonszámát és “kéretlenül” hívja fel a jövő lehetséges pályázóit.<br />
A HR-es velük szemben nem ügynökségnek, hanem konkrétan a kereső cégnek dolgozik, egyfajta “belsős toborzó”. A legtöbb esetben hozzá futnak be az ügynökségek pályázatai és ő küldi tovább cégen belül a felelős döntéshozóknak, illetve ő maga is rendelkezik több-kevesebb döntési joggal a kiválasztás folyamán. Fontos kiemelni, hogy se a toborzó, se a HR-es – általában - nem rendelkezik IT-s háttérrel. Mégis ők (is) döntenek a sorsodról, ez van, ezt kell szeretni.<br />
<br />
Szóval ha ügynökségen keresztül jelentkezel, az önéletrajzod útja valahogy így néz ki: toborzó -> HR-es –> és csak aztán jön a felelős team leader vagy manager. Ez persze nem mindig van feltétlen így, cége válogatja. Mi toborzók egyébként szintén jobban preferelájuk ha van közvelten kontaktunk a konkrét döntéshozó szakemberrekkel, managerekkel.
</blockquote>
<br />
<h4>
A fejvadászért nem kell fizetnem?</h4>
Nem. A fejvadász cég a munkáltatótól kap sikerdíjat. <br />
<br />
<h4>
Hogyan kezdjek neki?</h4>
Amíg otthon az a divat, hogy Neked kell kuncsorogni állásért, itt ez (is) fordítva megy egy szintig. Hatalmas a munkaerőpiac errefelé viszont nagyon kevés az igazán jó szakember. Ezt felismervén a legtöbb fejvadász cég nyit külföldre és onnan próbálja elhalászni a tehetségeket.<br />
<br />
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Ha jön egy megkeresés, hogy kell például egy PHP fejlesztő aki ért a MongoDBhez is, akkor mi az első dolog amit teszel annak érdekében, hogy megtaláld?</b><br />
Először is kellenek az alap-kritériumok: mi a pontos pozi, milyen technológiákat, szempontokat keressek egy CVben, hol/mennyiért, mit csinál a cég, stb. Aztán azok alapján amiből keresést lehet összehozni (leginkább a technológiák), összerakok egy keresést és azt használom az adatbázisunkban, a Linkedin-en, meg a job board-okon is. Ha kell, persze menet közben finomítom, illetve ha kevés találat jön, kihagyom a keresésből ami kevésbé fontos.<br />
Ez esetben “PHP” AND “MongoDB” lenne minimum a keresés: ha sok találat van szűkítek a hely szerint. Ha kevés, akkor meg pl. az egész országban keresek (hátha valaki költözni akar).<br />
<br />
<b>Csak online böngészgetsz?</b><br />
Igen, csak online, bár pont nemrég agyaltam azon, hogy esetleg hogyan máshogy lehetne még…<br />
<br />
<b>Hol keresel legszívesebben tehetséges embereket és miért pont ott?</b><br />
LinkedInen, mert ott "passzív" jelöltek vannak fent, akik igazából (általában) sokkal "értékesebbek", mint az aktívan keresők. Ez persze nem mindenkire igaz, de az a tapasztalat, hogy akiknek az önéletrajzai mindenféle álláskereső portálon fent vannak azok valamilyen okból vagy nehezen találnak melót vagy gyakran váltogatatnak munkahelyet. Illetve az aktív keresőt nyilván a konkurenciánk is könnyebben megtalálja. Ezért mondom, hogy egy passzív jelölt sok esetben “értékesebb” lehet.</blockquote>
<br />
<h4>
LinkedIn</h4>
Tudom jól, hogy otthon csak egy újabb felesleges szósölnetvörknek számít a LinkedIn, de itt az az első számú frontvonal. Ha nem vagy fent, nem is vagy igazi szakember. Akármennyire nem szeretjük beismerni, a mi szakmánk is ismerettség és hírnév alapján működik. Annyi ebben a különbség az itteni és a magyar valóság között, hogy itt nem mernek ajánlani valakit csak azért, mert jó barát vagy rokon az illető. Nem merik eljátszani a saját becsületüket az emberek. <br />
<br />
A szakmai hírnevet errefelé két dolog jelenti elsősorban: mennyire híres cégeknél dolgoztál eddig és mennyien ismernek téged. Bár ez otthonról kicsit furcsának tűnhet, ez ugyanúgy része az alkalmazkodásnak, mint az étkezési szokások megértése. Mivel szinte minden nap van valami szakmai összeröffenés ezért aki aktívan járkál meetupokra, konferenciákra és egyéb kockulásokra az akaratán kívül is gazdagszik számtalan LinkedIn ismerőssel. A java fejvadász lesz, kisebb hányada pedig "szintén zenész". Amikor valaki megnézi a profilod, akkor a tartalmán kívüli legfontosabb információ az a közös ismerősök száma és minősége, majd az összesített ismerősök száma. Amíg a sok ismerős nem jelenti azt, hogy eljársz bárhova is, addig a kevés szakmai online kapcsolat azt üvölti az érdeklődő arcába, hogy nem mész el semerre, azaz nem érdeklődsz mások iránt és Te sem érdekelsz senkit.<br />
<br />
Hasonló okok miatt fontos az is, hogy legyenek komolyan vehető, szubjektív referenciáid. Meg volt veled elégedve a PO vagy a CTO? Vedd rá őket, hogy vállalják fel és indokolják meg. Fontos, hogy megmutasd a leendő munkaadódnak, hogy miért érdemes veled dolgozni. Értelemszerűen, minél magasabb beosztású a referens, annál jobb. Itt is jó egyensúlyra törekedni, hiszen arra is kíváncsiak lesznek, hogy a közvetlen kollégáid mit gondolnak rólad. Nem tudom eleget hangsúlyozni, hogy mivel itt nem élnek vissza az ajánlós rendszerrel, ezért megbíznak benne. Hiszik, hogy egy CEO nem fogja kockáztatni a szavahihetőségét feleslegesen. Ha komolyan gondolod az itteni munkát, akkor figyelj erre, és csak olyanokat kérj meg referencia írására akik őszintén tudják ezt megtenni Neked, Érted!<br />
<br />
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Mit tartalmaz egy jó referencia?</b><br />
Pozitív véleményt az illetőről. Én pl. jobb szeretek közvetlen munkatársaktól referenciát kérni, mert ők látják igazán az illetőt, ők dolgoznak vele nap, mint nap.
Egyébként sokszor tapasztaltam, hogy a megadott referenciaszemély nem festett szép képet a jelöltről, ez számomra kicsit meglepő… azt hinné az ember, hogy aki meg van adva, az minimum jó viszonyt ápol a pályázóval és csak jókat mond róla… hát nem.
A LinkedIn-en lévő referenciákat is jónak tartom, az én szakmámban kifejezetten kötelező “gyűjteni” őket, de mindenki profilján hasznosak lehetnek!
<br />
<br />
<b>Szubjektív vagy objektív?</b><br />
Sajnos azt kell mondjam, hogy én a telefonon keresztül nyilván csak szubejktív véleményt kapok, de ez nem is baj. Ezt jelenti “emberekkel dolgozni”. A számokat nem szeretem, azok csak számok, nincs mögöttük a “sztori”.
A LinkedIn-es referenciák is nyilván szubjektívek, de ettől még semmi gond nincs velük, sőt! Igazából mind azt sugallja, hogy van ennyi meg annyi ember aki érdemesnek érezte megragadni a billentyűzetet (még akkor is, ha Te kérted meg rá) és leírni, hogy bizony elégedett volt a munkáddal, illetve a személyeddel.
<br />
<br />
<b>Varázs szavak vagy mondatok léteznek?</b><br />
Az interjún biztosan, de számomra nem. Én, mint fejvadász inkabb partner, mint ellenség vagyok. Egyfajta tanácsadóként kell rám tekinteni, ugyanaz a célom, mint Neked: megtalálni a számodra megfelelő pozit. Hogy miért? Mert ha meggyőzlek, hogy Neked való a pozi (közben pedig nem is) és “elrugdallak“ az interjúig ahol netán meg is ajánlják Neked a munkát, a végén úgyis felerősödik benned, hogy Neked nem ez kell és visszamondod. Ennél a pontnál vagyunk úgy, hogy mindenkinek csak az idejét vesztegettük. Na ennek semmi értelme, ezért nem értem azokat a kollégákat akik mindenkit mindenre “rádumálnak”.<br />
Egy szó, mint száz: mi össze kell, hogy dolgozzunk és amennyire lehet őszinték legyünk egymással. Nekem nem varázs mondatok kellenek, hanem “jó magaviselet“. Mondd meg, ha nem tetszik, válaszolj időben az e-mailemre és vedd fel a telefont a megbeszélt időpontban. Még akkor is ha nem fog tetszeni, amit mondasz.<br />
<br />
Önéletrajzban, illetve a LinkedIn profilon szerintem nem igazán léteznek varázs-mondatok már csak azért sem, mert akkor mindenki használná (használja) őket. Pont ezáltal veszítik el az “erejüket“. Inkább az egyediség a lényeg. Én pl. igyekeztem egy kis humort csempészni a profilomba, mert szeretném ha ezt sugallná: “szerintem a humor és a professzionalitás nem zárja ki egymást“.
A referenciákban (LinkedIn) szintén nem léteznek. Azoknak pont az egyedi vélemény a lényege. Elég illúzióromboló lenne, ha mindenkinél ugyanazt a “melegszívű ajánlást” olvasnám!<br />
<br />
Na jó, az interjúra azért tudok adni egy varázs-mondatot: alapszabály ugye, hogy kérdezz. Ha emlékezetes is akarsz maradni, akkor kérdezd meg az interjú végén a partneredtől, hogy van-e, illetve maradt-e benne valami kétely Veled kapcsolatban. Ez egy ütős és bátor kérdés, valamint hasznos is: ha van kétely, rögtön ott az alkalom, hogy szépíts rajta.
</blockquote>
<br />
<h4>
Nekem már van CVm. Hogy töltsem fel?</h4>
Sajnos ha eddig csak Magyarországon kerestél munkát, akkor valószínűleg sokra nem mész a meglévő önéletrajzoddal azon kívül, hogy emlékeztet a történelmedre. Nagyon sokban különböznek a mi szokásaink az angolokétól.<br />
Az első és legfontosabb gondolatmenet amit meg kell értened az az, hogy az angol-szászok kínosan ügyelnek az egyenjogúságra. Legalábbis papíron. Ebből adandóan tilos bármiféle személyes információt közzétenni. Ide tartozik a nem, a kor, a faji- és vallási hovatartozás, a családi állapot, nemi irányultság, a nem szakmai hobbik, stb. Persze a LinkedIn-es profilképed elárul sokat viszont a fejvadászoktól kép nélküli önéletrajzot kapnak a cégek és ők csak az alapján ítélhetnek. Papíron. Ez egy olyan ködös terület, amit jobb elfogadni és nem bolygatni. Az érem másik oldala viszont, hogy soha nem fognak kiutálni azért, mert tele vagy varrva vagy éppen kék a hajad.<br />
Ha minden személyes adatot kivettél az önéletrajzból, akkor a száraz szakma marad, aminek viszont vaskalapos formátuma van: egy személyes szakmai összefoglalás, amolyan ars poetica, képességek felsorolása, előző pozíciók felsorolása, egyéb.<br />
<br />
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Mi az amit először nézel meg egy profilon?</b><br />
Titulus, azaz, hogy milyen poziban dolgozik/ dolgozott az illető. Pl. ha PHP-fejlesztőt keresek, de az illető soha nem dolgozott fejlesztőkent, akkor hiába jött fel találatként, nincs értelme az önéletrajzot sokáig nézegetnem.
<br />
<br />
<b>Mitől csukod be azonnal a tabot?</b><br />
Ha nincs telefonszám. Annyi de annyi önéletrajz van pl. Monster-en kontaktinfó nélkül! Ebben az esetben is: nincs értelme sokáig nézegetnem az önéletrajzot.
Ha csak e-mail cím van, akkor még adok pár másodperc esélyt az önéletrajznak, ilyenkor egyéb tényezők döntenek, hogy billentyűzetet ragadok-e.
<br />
<br />
<b>Azt gondolom tudod jól, hogy a programozók ritkán szeretnek telefonálni és inkább az aszinkron kommunikációt kedvelik. Miért ragaszkodsz mégis a telefonhoz? Van ennek valami oka amit meg kellene értenünk?</b><br />
Igen tudom, de ennek több oka is van:<br />
A legfontosabb; e-mailben nem lehet mindent rendesen és gyorsan lekommunikálni, míg ha beszélünk akkor minden felmerülő kérdést (mindkét fél részéről) rögtön és azonnal, egymás mondandójára reflektálva meg tudunk tárgyalni, ami végső soron mindkét fél érdeke.
A nem hivatalos verzió (ámbátor nagy igazság) viszont: e-mailben soha semmit nem fogsz „eladni“, még a munkát sem. Ez van, elvégre ez mégiscsak sales meló.<br />
<br />
Szintén ritkán emlegetett „nem hivatalos“ indok a diszkréció. Sajnos gondolnom kell a klienseimre és a konkurenciára is. Ezért van pár infó (kliens neve, fizetés), amit egész egyszerűen nem adhatok ki e-mailben pláne úgy, ha még nem is beszéltem Veled “személyesen”. A beszéd jobban megalapozza a bizalmat és a későbbi munkakapcsolatunkat is, emellett az ilyen “tabu” dolgokról sokkal könnyebben lehet beszélni telefonon keresztül.
Nehéz egyébként az érdekvédés két oldalán brillírozni. Azt szoktam mondani, hogy ez ugyanolyan, mint hogy egy önéletrajzot se fogok kiküldeni a “tulaj“ beleegyezése nélkül.<br />
<br />
Nekem is vannak persze olyan napjaim, amikor nincs kedvem vadidegenekkel beszélgetni, inkább elbújnék az e-mailek mögé. De végső soron minden beszélgetés után megállapítom, hogy “na, nem is fájt“.
Nagyon sok fejvadász cégnél egyébként az alapján (is) értékelik a dolgozókat, hogy hány hívást csinálnak és mennyi időt “lógnak“ a telefonon. Ezzel a “méréssel“ nem teljesen értek egyet, de a munka nagyja a telefonon dől el, ez tény. Kíméleltenül tudják ezt a főnökeink is és kíméletlenül be is vasalják rajtunk a teljesítményt. De erről még hosszan tudnék sztorizni…
<br />
<br />
<b>Mitől keresed meg azonnal az illetőt?</b><br />
Ez több, specifikusabb dologtól függ: ha az önéletrajza hemzseg a találati szavaktól, ha látom, hogy kb. a titulusa is megfelel, látom, hogy nem havonta ugrált egyik cégről a másikra (ez a contractorokra is igaz, sorry!) és ugye van telefonszám, már hívom is.
Van ez a vita a fotóról, hát nálam negatív irányba a kép ritkán szokott elvinni. Ha viszont kifejezetten szimpatikus az illető a fotón engem az pozitív irányba terel. (Ez utóbbi azt hiszem eléggé szubjektív pont, maga a „szakma“ is jókat vitázik a „kell-e fotó kérdésen“.)
<br />
<br />
<b>Mennyit számítanak a referenciák Neked, és mennyit a kliensnek?</b><br />
Őszinte leszek: ahol most dolgozom, ott nem gyakran szoktunk mi magunk referenciát kérni. Már csak azért sem, mert ez inkább a HR-es, azaz a kliens dolga. Ettől függetlenül, ha lenne rá időm, biztos én is csinálnék referencia hívásokat, legalább az erősebb pályázóimnál.
A LinkedIn-es referenciák viszont itt is érvényesek, sőt! Szerintem egyfajta személyesebb képet adnak a pályázóról, ami sose baj. A sok “skill” mögött elvégre mégiscsak egy embert készülnek alkalmazni.
<br />
<br />
<b>Fotó amitől elsírod magad? Hogy ne pózoljunk Linkedinen?</b><br />
Jaj hát akad. LinkedIn még nem is annyira szörnyű, mint a Xing. (Xing kb. ugyanaz, mint a LinkedIn csak a német régióra.) Na itt van egy csomó öltönyös, bajszos, idős, komolyan a messzibe bámuló “professzionális” fotó. Hát őket szokni kell, na. :)
A lényeg: ne legyen bulikép, vagy nyaralás (kirándulás) alatt készült kép. Kérlek, csak ezt a kettőt ne! (Sajnos ezt még sokan a fejvadászok közül se tartják be.)<br />
A leghatásosabbak azok a képek amiken látszik, hogy komolyabb géppel készültek (élesek!), mégse mesterségesen beállítottak.
<br />
<br />
<b>Milyen egy jó összefoglalás? Mit kell kifejeznie?</b><br />
Írd le, hogy mit csinálsz, mit csináltál, és mit szeretnél a jövőben, de kérlek úgy, hogy én is megértsem. Nincs értelme az IT-s “fellengzésnek“, mert “sajnos“ az önéletrajzod főként olyan emberek fogják – leginkább az első szakaszban – olvasni, akik nem az IT területéről jönnek. Én is próbálok Veled érthető lenni a telefonon (több kevesebb sikerrel), kérlek Te is vedd figyelembe, hogy nem ugyanaz a szókincsünk.<br />
Hogy mit kell kifejeznie? Hogy vannak perspekítváid! Nem álmaid, perspektíváid!
<br />
<br />
<b>Képességek listája: buzzword-bingo vagy őszinteség és esetleg kevés, ám annál relevánsabb kulcsszó?</b><br />
Valahol a kettő között. Minél több releváns szó van az önéletrajzodban, annál előbb/feljebb jössz fel találatként a keresésemen. Azért persze a “buzzword-bingo-t kiszúrom, ha nem is egyből, hát legkésőbb akkor amikor felhívlak.
<br />
<br />
<b>A helyes sorrendje az előző munkahelyeknek … ?</b><br />
Legutolsó legfelülre. Ja és ne csak évszámot, hanem hónapot is írj a tól-ig-hoz. Illetve előbb a munkatapasztalat, csak azután a sulik listázása. Viszont azt se hanyagold el, legyen érthető, hogy hol, mit tanultál, befejezted-e, vagy sem.
<br />
<br />
<b>Hogyan bukkanhat fel a keresésedben valaki akinek kevés tapasztalata van de mégis szeretne külföldi állást?</b><br />
Felbukkanni a keresőszavakkal lehet. Gyakori hiba a frissen végzetteknél, hogy nem részletezik mit csináltak, mit tanultak. Pl. sokszor adnak meg csak annyit, hogy “programozó” itt és itt. Ír esetleg két mondatot, hogy mit csinált a cégnél vagy mi is a cég maga és ennyi. Tessék technológiát írni, az az ami kereshető. A tanulmányoknál is le lehet írni, hogy mi volt a szakvizsga / diplomamunka témája, milyen technológiákra ment rá, stb, stb.<br />
Másik hiba, hogy a “junior”-ok sokszor nem tudják mit is szeretnének igazán. Akkor én honnan tudjam? Oké, hogy kódoltál ebben, abban, meg amabban, de tessék irányt választani, abban elmerülni. Nekem egy olyan kell, aki jó PHP-ben meg MongoDB-ben, nem olyan, aki kicsit dolgozott abban is meg mellette front-end-es is meg webdesigner meg DB Admin, meg még a jó ég tudja mi. Legyél csak PHP-s, de az nagyon!
</blockquote>
<h5>
Nézzük az önéletrajz részeit sorra:</h5>
<h6>
Összegzés:</h6>
Rólad kell szólnia. Akár egyes szám első személyben, akár harmadik személyben. Attól függ, hogy Neked melyik a kényelmesebb és testhezállóbb. Ebben az 1, maximum 2 mondatban azt kell elmondanod, hogy szakmailag mi hajt. Mi az, amit rólad 2 mondatban feltétlenül el kell mondani, ha az IT életedről van szó? Képzeld azt el, hogy a kedvenc témakörödben elő kell adnod egy konferencián. Az esemény programfüzetében megjelensz mint előadó és a fényképed mellé kerül egy szöveg. Úgy írd meg a személyes összefoglalódat mintha azt a szöveget írnád. Ki vagy te? Mióta csinálod amit csinálsz? Miért csinálod? Mi érdekel leginkább? Mit vársz el a jövőben magadtól? Mik a perspektíváid?
Lehet, hogy csak két mondatról van szó de a legfontosabb két mondatról az önéletrajzodban. Ne kapkodd el.
<br />
<br />
<h6>
Képességek felsorolása:</h6>
Ez egy blokk amibe jöhet az összes három betűs rövidítés és technológia megnevezése amit rólad érdemes tudni. Nem feltétlenül kell strukturálni őket, bár nem árt ha van valami minta. Ha nem vagy biztos abban, hogy 1-2 technológia milyen kategóriába tartozik akkor inkább ne írj kategória-címeket csak egy rendezett felsorolást.
Anno én mindent beletettem amihez értek. Miért ne? - gondoltam egészen addig amíg nem jött szembe egy blog-poszt amiben azt írták, hogy “ne kérkedj olyan tudással amit nem szívesen csinálnál megint”. Lehet, hogyha kihagyod az általad nem kedvelt dolgokat akkor kevesebb megkeresést fogsz kapni de garantáltan növekedni fog az értékes megkeresések aránya. Megint csak Neked kell eldöntened, hogy mit szeretnél jobban és mire vagy hajlandó. Én például nem akarok ActionScripthez nyúlni soha többet.
<br />
<br />
<h6>
Szakmai múlt:</h6>
Az előző munkahelyek felsorolását mindenképpen időrendben visszafelé kell megírni. Nagyon ritkán kíváncsi csak bárki is arra, hogy zöldfülűként mit csináltál. Leginkább az fontos, hogy honnan jössz és mik a legfrissebb értékeid.<br />
Ez a szekció is merőben eltér az otthon elvárttól. A formátum megint csak kötött:<br />
<blockquote>
<b>Pozíció, Cégnév</b><br />
mettől-meddig, melyik városban, melyik országban<br />
<br />
- feladat 1<br />
- feladat 2
</blockquote>
A feladat lista 2 féle lehet. Ha olyan helyen dolgoztál ahol külsős projekteken kellett tevékenykedned és elárulhatod a kliensek neveit, akkor a felelősségeid listáját projektenként sorold fel. Ha bármelyik feltétel hamis, akkor absztraktan fogalmazd meg.<br />
De milyen is egy angol-szász kompatibilis feladatlista?<br />
Nem felsorolás, hanem kerek mondatokba szedett.<br />
<i>“Én vezettem be a verziókövetést a cégnél! Előbb SVNt, majd GITet használtunk.”</i><br />
<i>“Migrációs scripteket írtam MySQL és MongoDB között.”</i><br />
<br />
Fontos, hogy <b>ne szerénykedj</b>. Itt el kell magad adni és a lehető legjobb fényben feltűntetni azt, amit csináltál. Egy jó tanács amit egy barátomtól kaptam: “használj erős igéket!” Ezt egyszerűbb mondani, mint megcsinálni. Ha sokmindent kell írnod, akkor igen gyűrött lesz a szinoníma szótár a végére, de megéri. Olyan igéket keress, amik önbizalmat, határozottságot és pozitív töltetet hordoznak az átlagosság helyett. Minden feladatot élveztél és a lehető legjobb teljesítményedet nyújtottad!<br />
Tudom, legtöbbször nem könnyű megfogalmazni, hiszen nem is gondolunk bele, hogy valójában mit is csinálunk. Számomra nagyon hasznos procedúra volt annak feltérképezése és mondatokba szedése, hogy mit is csinálok én!?<br />
<br />
Ahogy Kata is mondta, az önéletrajznak a fő olvasóbázisa nem technikai, viszont megadott dolgokat keresnek. Ezt figyelembevéve írj magadról. Talán segít, ha azt mondom, hogy 1-1 mondat 80%ban legyen laikusok által is felfogható, 20%ban pedig szakzsargon.<br />
Másik tanács, ami kódra is igaz: ne keverd a felelősségeket. A verziókövetés bevezetése és oktatása nem ugyanaz. Ezek mehetnek két különálló pontba.<br />
<br />
<h6>
Iskolák:</h6>
Csak a relevánsakat sorold fel. Senkit nem érdekel a nem szakirányú végzettség.<br />
<br />
<h6>
Hobbik:</h6>
Megint csak akkor, ha van bármiféle szakmai relevanciája. Meetupokra jársz? Code dojokat szervezel? Robotokat építesz a szabadidődben? Az mind jöhet! Zenélés, fotózás, biciklizés: nem!<br />
<br />
<blockquote class="tr_bq interviewee">
<div class="author">
<img alt="Bognár Kata" src="http://s3.amazonaws.com/meza/kata-128px.png" /></div>
<b>Valami hasznos tanácsod van esetleg mindazoknak akik külföldön törik a fejüket?</b><br />
Sajnos az angol kollégák sokan mind ugyanabban az “Egyesült Királyságnak” nevezett “tóban” halásznak de azért vannak kivételek (pl. én). Csak láthatóvá kell magad tenni és nem szabad feladni. A külföldi kollégáknak érdemes megkönnyíteni a dolgát, pl. megadni, hogy magyar a nemzetiséged és zárójelben feltüntetni, hogy “EU member” vagy hasonlók. Ebből tudják, hogy nem kell külön engedély, hogy az országban tartózkodj/ dolgozhass. Máris értekesebb jelölt vagy! Esetleg odaírnám, hogy mit saccolsz mikor tudnál kezdeni. Az összegzésben is meg lehetne említeni, hogy miért is szeretnél lelépni és miért Angliába.<br />
<br />
De egy a lényeg: döntsd el, hogy tényleg külföldre akarsz-e menni, vagy sem. Ha igen, remek, dolgozzunk együtt! Ha nem, akkor – és ezt most megint nagyon csúnyán fog hangozni – ne rabold az időmet kérlek. Lehet pont egy olyantól veszed el, aki már eldöntötte, hogy tényleg menni szeretne és konkrét segítségre van szüksége. Köszönöm. :)</blockquote>
<h3>
Hogyan tovább?</h3>
Remélhetőleg ezután a cikk után egy kicsit tisztább képed van arról, hogy miképpen indulj neki életed talán egyik legnagyobb kalandjának. Tudom, kicsit hosszú, de már régóta érett.
<b>Lesz még 4+1 fejezet</b>, amikben kitérünk a következőkre olyan emberek segítségével, akik első kézből tudnak hasznos tapasztalatokat megosztani:<br />
<ul>
<li><a href="http://www.meza.hu/2013/10/a-vadaszat-angliai-utikalauz-itsoknak.html" target="_blank">Fejvadászokkal való együttműködés, interjúzás menete, felvételi folyamat</a></li>
<li>Kiköltözés, lakásvadászat, telefon, internet, számlák, szükséges papírok, elintézési módok, hasznos tippek az egyébként nem triviális új élet kezdéséhez</li>
<li>Integráció, kultúra, mit szabad?, mit tilos?, miképpen működik itt a szakma és a szakmán kívüli élet? Mennyibe kerül a minden és milyen egy átlagos IT-s élete?</li>
<li>Költözés családdal, kisgyerekkel. Mik a lehetőségek, költségek és miképpen lehet a legjobbat kihozni a helyzetből?</li>
<li>Bónusz: szakmai események: hol találod őket?, mik vannak?, mik a szokások?, hova érdemes menni?</li>
</ul>Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com4tag:blogger.com,1999:blog-7528777922526033452.post-59621857122372787362013-08-27T19:01:00.002+01:002013-08-27T19:01:52.526+01:00But I only write test code, I'm not a programmer!<i>"But I only write test code, I'm not a programmer!"<br />"I'm only a tester, so I've never done TDD before!"<br />"Why should I care about readability, this is only test code?"</i><br />
I often hear phrases along these lines from testers, and it makes me very sad. Not just the fact that this mentality often results in hard to maintain and brittle test code, but it also blocks testers from developing their skills.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-xqaHKL9YTT4/UhzNmKIgLqI/AAAAAAAAZ48/-HATc2D6ceA/s1600/sadpanda.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-xqaHKL9YTT4/UhzNmKIgLqI/AAAAAAAAZ48/-HATc2D6ceA/s320/sadpanda.png" height="320" width="320" /></a></div>
<a name='more'></a><blockquote class="tr_bq">
Definition of the word: <a href="http://www.thefreedictionary.com/programmer" target="_blank">programmer</a><br />"One who writes computer programs."</blockquote>
<br />
Before continuing on with my rant, I'd like to make one thing clear:<br />
<b>Test automation code is a piece of software</b> that tests the functional correctness of another software. Therefore, you, me and everyone involved in maintaining that automation code is - by definition - a programmer. We might be specialised in test frameworks, tools, browsers, requirement formats, but we are still programmers.<br />
Without admitting that, we will never feel entitled to think about all the fancy stuff "developers" do. We won't feel the need to learn design patterns, and will not be striving for decoupling, readability and clean code. Why should we? We're only testers. We will constantly feel inferior to the guys actually <i>"writing software"</i>.<br />
<br />
I often ponder about why this phenomenon exists in the first place. I believe it comes from an ancient world's mindset, where "testers" were "only" executing manual scripts. Back then, testers did not write software. And by that I mean that they didn't have an IDE installed on their computer. They didn't have <i>jdk</i>, <i>ruby</i> or a stack of javascript dark magic installed on their computer. They didn't have to learn version control systems and continuous integration services. Hell, if they've ever heard the term: merge conflict. Now if that's true for you now, you're right: you don't need to know about programming. But if you're like most of us, and your job is to use a programming language to construct an executable program, you are (drumroll) a programmer. It is not a matter of the intent of the software we create, but the fact that we are writing software.<br />
<br />
There is however another legacy that we (as programmers of test code) need to fight. Unfortunately most programmers by title, perceive test folk as less capable. But I believe it is due to what I've been writing about above, and the only way we can change that perception is to man up, admit that we're programmers and learn the craft, to prove them wrong.<br />
<br />
<b>It starts by admitting it to yourself, and it feels damn good!</b><br />
<b>So what are you waiting for?</b>Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com2tag:blogger.com,1999:blog-7528777922526033452.post-48077913738005266172013-08-22T16:25:00.000+01:002013-08-22T16:41:09.494+01:00Beyond craftsmanship?<div style="text-align: justify;">
Regarding creative work, I hear the following term a lot: <i>Creating something from nothing</i>.</div>
<div style="text-align: justify;">
A musician has the silence, and fills it with sound waves. A painter has an empty canvas, and fills it with paint. A programmer has a problem, and creates a solution. It can be challenging at first to grasp, but the initial state is not nothing and we're not creating anything. We are only transforming materials. This might be easier explained if we observe other crafts like carpentry or metalwork. Carpenters and blacksmiths create solutions to their customers' problems by crafting furniture and forging weapons amongst many other things. So why do we sense a big distinction between the so called "creative" work from "physical" work? I'll share a little secret: given that each person we observe in each field is a professional, <b>the only difference in their way of working is the materials they use</b>.</div>
<a name='more'></a><div style="text-align: justify;">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-lLqIh5d2FQo/UhYqKEUKoWI/AAAAAAAAZvo/uhBIzJgX1Gc/s1600/medium_RACHEL_DAVID.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://1.bp.blogspot.com/-lLqIh5d2FQo/UhYqKEUKoWI/AAAAAAAAZvo/uhBIzJgX1Gc/s320/medium_RACHEL_DAVID.jpg" width="209" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="http://www.redmetal.net/" target="_blank">Rachel David</a></td></tr>
</tbody></table>
The blacksmith has some raw material, an anvil, a hammer and a chisel. A carpenter is equipped with some wood, a saw, a hammer, some nails, carving tools and a grinder. A painter starts off with some paint, brushes, sponges and a palette. A musician with an instrument of choice, and a programmer with a set of programming languages, paradigms and software tools.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nobody denies the importance of learning the craft for the physical professions. <b>To understand how to</b> handle the tools correctly in order to <b>create something valuable for the customer</b>, each apprentice must learn from a master. May that be a father or a local craftsman or a professional teacher. <i>For each apprentice, a master exists.</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Musicians are trained in a similar manner. They have the option to study music at school or from any private tutor. The main goal is to practice so much, that the handling of the tool transforms to muscle memory. When that happens, the apprentice is ready to actually <b>experience playing music instead of playing an instrument</b>. Not so long ago I've stumbled upon a very frank <a href="http://www.digitaldjtips.com/2013/03/why-you-dont-have-to-be-a-musician-to-be-a-good-dj/" target="_blank">writing</a> by <a href="http://www.digitaldjtips.com/phil-morse/" target="_blank">Phil Morse</a> on <a href="http://digitaldjtips.com/">digitaldjtips.com</a>. He wrote that there are two types of musicians:</div>
<blockquote class="tr_bq">
<ul>
<li style="text-align: justify;"><i>A “<b>formal</b>” musician is doing grades, and they’ve been to a lot of
classes. They can read music. They could be heading to a career in
“organised” music – orchestra, that type of thing. They can be hugely
dedicated, but by the same token, some may not even particularly like
playing music. (We all know of people who’ve been forced to take piano
lessons by their parents, for instance…)</i></li>
<li style="text-align: justify;"><i>A “<b>spontaneous</b>” musician is usually self-taught, although they may
have had training too. They enjoy playing along to what’s on the radio
(on their keyboard, or guitars, usually), and so they can pìck out
chords and melodies and copy them pretty fast. They tend to form bands.
But they can be lacking in a lot of pretty useful musical knowledge at
the same time. (By the way, by “spontaneous” I certainly don’t mean they
can “just do it” without any effort – this type of musician practises
just as much as the first type…)</i></li>
</ul>
</blockquote>
<div style="text-align: justify;">
Of course metalworkers and carpenters can be self-taught too. The sole reason this happens rarely is the cost of raw material and proper tools they can practice on. As students of an institute, they'll have access to anything they need in order to develop. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Painters have similar opportunities. Many art schools exist to build up the muscle memory to use the different types of brushes, and to know what type of paint and material they should apply for the required outcome. The cost of self development for them is less expensive.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Programming <i>craft</i> on the other hand does not have such a clear path. Of course many schools teach some form of computer science, and many individuals coach and mentor others to become better at using their inventory. The craftsmanship term did not exist in our industry all the way up to 1992, when it was first suggested by Jack W. Reeves in an <a href="http://www.developerdotstar.com/mag/articles/reeves_design.html">essay</a>: that <b>software engineering is more of a craft than an engineering discipline</b>. Fortunately the idea spread and brilliant materials have been created to support the journey of a craftsman. Apart from gaining access to a computer, learning programming can be achieved free of charge.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
This lead me to the conclusion that, <b><span style="font-size: large;">the less expensive it is to practice a profession, the less important craftsmanship appears.</span></b></div>
<div style="text-align: justify;">
<br /></div>
<h3 style="text-align: justify;">
Is craftsmanship important though?</h3>
<div style="text-align: justify;">
I've visited an art gallery not so long ago. I wasn't particularly interested in the exhibit but was excited<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-AkYZfRQesgM/UhYrn-Or_hI/AAAAAAAAZv0/OAGBZNJpmfo/s1600/387360-11398911-7.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://1.bp.blogspot.com/-AkYZfRQesgM/UhYrn-Or_hI/AAAAAAAAZv0/OAGBZNJpmfo/s320/387360-11398911-7.jpg" width="315" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><a href="http://www.saatchionline.com/art/Painting-Household-Untitled-107/387360/1625811/view" target="_blank">Untitled 107</a> (not the one I'm talking about)</td></tr>
</tbody></table>
to meet a visual artist friend of mine, so I tagged along. We wandered around looking at weird street art, abstract sculptures, a photo series of naked Russian homeless people and some old fashioned paintings. As usual, I was a bit upset about what people put on gallery walls and call art. At least this time I was accompanied by someone who could actually confirm my beliefs, or bust them by explaining what to value in the creations.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
You are probably familiar with the feeling when you spot something that is way above average in quality and content. Let it be any form of creation from music to product design. Perfection simply stands out. We found a painting almost at the end of the path we took in the gallery which caught our attention. For me, it was the first item in years I could've imagined on my wall. The professional with me got sucked into a specific state of mind I felt familiar from somewhere. She started analysing the painting and explaining her insights to me. All the details about handling brushes, choosing canvas material, selecting paint types and strokes. She reminded me of myself when doing a code review. Analysing the design patterns, naming and formatting conventions, extendability, testability, etc.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
And then it struck me:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Would a painting stand out just by the perfect technique it has been created with?</div>
<div style="text-align: justify;">
Would a painting stand out just by what it depicts regardless of the quality?</div>
<div style="text-align: justify;">
Would a piece of music be appreciated just for the way the instruments are used?</div>
<span style="text-align: justify;">Would anyone use a sword-shaped piece of metal if it's not sharp?</span><br />
<div style="text-align: justify;">
<b><i>Does a piece of code have any value if it's perfectly crafted, but is not solving the customer's problem?</i></b></div>
<br />
<div style="text-align: justify;">
<b>Is there value in craftsmanship alone, or is there something about the way we use it that actually represents value?</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Once we've learned everything our masters had to teach us, we will be able to mimic their work perfectly. If Leonardo Da Vinci was our mentor, we could paint the Mona Lisa equally well. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
The question kept on bugging me: <b><i>what is art then?</i></b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
On the same week I met with <a href="http://en.wikipedia.org/wiki/Ward_Cunningham" target="_blank">Ward Cunningham</a> at an <a href="http://xpday-london.editme.com/eXtremeTuesdayClub" target="_blank">eXtreme Tuesday Club</a> night. We sat down for a chat and as he was talking about similar stuff, I've shared the thoughts puzzling me. We went through many examples from other industries and professions and realised that the pattern I've described above is present in each and every of them. It doesn't matter how small or large the stakes might be. Whether you're planting a flower or building a skyscraper. <b>If you are a true professional in your line of work and take pride in what you're doing, you will most likely end up doing art.</b><br />
<br />
<h3>
What is art then?</h3>
</div>
<div style="text-align: justify;">
Currently I feel that <i><b>the value of art for the creator is the journey of value creation</b></i>. May that value be anything from others' delight to money making.</div>
<div style="text-align: justify;">
Watching my friend analysing the painting, programmers reviewing code, musicians listening to others' music I got to the following conclusion: <b><i>The way to create timeless art is to produce equal value to the customers and fellow artists as well</i></b>. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So does that mean that <b>ART means that you have to be a craftsmen AND be able to use your tools for the right thing? </b>Maybe. Right now, I feel that it does, and one is not good without the other.</div>
<div style="text-align: justify;">
We know that tool usage can be taught. Can the other half be taught, or is it something that people will (or will not) acquire by experience?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Fj79-myJ1W4/UhYsroBxp0I/AAAAAAAAZwA/pNKIoRENSnw/s1600/art.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="210" src="http://1.bp.blogspot.com/-Fj79-myJ1W4/UhYsroBxp0I/AAAAAAAAZwA/pNKIoRENSnw/s320/art.jpg" width="320" /></a></div>
<br />
<h3>
Conclusion: Programming is art!</h3>
The way I see it, programming is no different from painting or writing music. We have to know our toolset to choose the most appropriate tool and approach in order to serve our audience's needs. It is in our own interest to be good citizens and create "clean code". Without that, our creations will be thrown away or turned into something else. They'll rot.<br />
<b>Are you ready to experience programming instead of using a programming language?</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>Remember: Earth without art is just: Eh.</i></div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com1tag:blogger.com,1999:blog-7528777922526033452.post-24226341857530652192013-08-21T08:00:00.000+01:002013-08-21T08:00:10.706+01:00Configuration done right<link href="http://www.github.com//assets/embed-4252e560c3e6f4c476a216c2bb7938cd.css" rel="stylesheet"></link>
In my <a href="http://www.meza.hu/2013/06/configuration-interface-done-right.html" target="_blank">previous post about the topic</a>, I've talked to you about my problems with the typical configuration methods. I've compiled a list of values that I'd expect from a configuration system and set my mind on making it happen. These points were:<br />
<ul style="background-color: white; color: #141414; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 16px; line-height: 22px; list-style-image: initial; list-style-position: initial; margin: 0pt 0px; padding: 0px 2.5em;">
<li><span style="background-color: transparent; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should be dead simple to use</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should support extension</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should support scopes</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should support namespaces</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should support optional configuration files for developer local configs</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should allow stating that a new configuration file should override the keys or not</span></li>
<li><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should not need an object representation in the code</span></li>
</ul>
<div>
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Over the past weeks I've created a solution that we've tested on several projects already here at The Guardian. I'll take you through the current state.</span></span><br />
<a name='more'></a><br />
<h3>
Should be dead simple to use</h3>
</div>
<div>
For me, the statement above conveys two things. One, it is really easy to add the tool as a dependency. Two, I only need to tell what configuration sources I intend to use.</div>
<div>
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Many open source projects tend to have their own maven distribution ways, and require you to add a custom repository to your pom. While that might work with small companies and private projects, regulated organisations seem to have difficulties with untrusted sources. Not to mention that adding a 3rd party repository config might consist of adding twice as many lines to your pom, which in my opinion is "hard to use". For the sake of the easy dependency handling, I've released it through sonatype's OSS maven repository which allows anyone to load it without any extra config. </span></span><br />
<blockquote class="tr_bq">
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;"><a href="https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide" target="_blank">How to release your own project through sonatype</a></span></span></blockquote>
<h4>
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Importing the library</span></span></h4>
<!-- BEGIN GIST -->
<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code> <dependency>
<groupId>hu.meza.tools</groupId>
<artifactId>config</artifactId>
<version>LATEST</version>
</dependency>
</code></pre>
<h4>
<span style="font-family: Arial; font-size: 15px; line-height: 17px; white-space: pre-wrap;">Defining a configuration source stack</span></h4>
<span style="font-family: Arial; font-size: 15px; line-height: 17px; white-space: pre-wrap;">The second point is ease of usage with regards to sane coding strategies. It seems really easy to just create a globally accessible static class that every living being in our code knows of and can use. How many times have we imported </span><span style="font-family: Courier New, Courier, monospace; font-size: 15px; line-height: 17px; white-space: pre-wrap;">Config</span><span style="font-family: Arial; font-size: 15px; line-height: 17px; white-space: pre-wrap;"> from out of the blue and wrote the following?</span><br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>Config.getString("someSetting");
</code></pre>
It is easy to use until you start testing your code and realise that you need to be thinking of mocking statics and global state.<br />
This boils down to the <a href="http://javarevisited.blogspot.co.uk/2013/03/difference-between-singleton-pattern-vs-static-class-java.html" target="_blank">difference between a Singleton and a singleton</a>. But let's not jump ahead of ourselves. I'd like to take the chance and show you how to define a configuration source stack, which is the next step after importing the library.<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>Config config = new Config();
File frontendConfigFile = new File(path);
config.add(new Optional(new FileConfiguration(frontendConfigFile)));
config.addOverriding(new Required(new ResourceConfiguration("environment.properties")));
config.addOverriding(new Optional(new ResourceConfiguration("developer.properties")));
config.addHighOrder(new SystemPropertiesConfiguration());
</code></pre>
What this does in what is says it does:<br />
<ol>
<li>Add an optional file source</li>
<li>Add a required resource source and override any keys that match from the previous sources</li>
<li>Add an optional resource source and override any keys that match from the previous sources</li>
<li>Add a higher order source from the system properties that will stand above all previous ones if the keys match</li>
</ol>
<div>
Now you might notice that Required and Optional are not always used. If omitted, it'll behave however the source is configured to behave. With this, we've covered another constraint:<br />
<ul style="background-color: white; color: #141414; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 16px; line-height: 22px; list-style-image: initial; list-style-position: initial; margin: 0pt 0px; padding: 0px 2.5em;">
<li><span style="color: black; font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">should support optional configuration files for developer local configs</span></li>
</ul>
</div>
<div>
<br />
<h3>
Should be extendible</h3>
Being able to alter behaviour if needed is one of the most important things for me. As a library producer, I wouldn't want to limit anyone in how they use my solution. I think of it as a foundation others could build upon.<br />
<br />
<h4>
So how do I use this?</h4>
Currently I am working in Cucumber-JVM land, where I use <a href="https://github.com/cucumber/cucumber-jvm/tree/master/picocontainer" target="_blank">picocontainer</a> as my dependency injection container. Unfortunately cucumber-picocontainer is <a href="https://github.com/cucumber/cucumber-jvm/pull/450" target="_blank">not configurable at this moment</a>, so in order to create a properly set configuration for my apps, I need to wrap this solution into a standalone object, and pass that along to anyone who might need it.</div>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>public class Configuration {
private final Config config;
public Configuration(Config config) {
this.config = config;
final SystemPropertiesConfiguration systemPropertiesConfiguration =
new SystemPropertiesConfiguration();
Config system = new Config();
system.add(systemPropertiesConfiguration);
String userHome = system.get("user.home");
String path = String.format("%s%s.gu%sfrontend.properties", userHome, File.separator,
File.separator);
system = null;
File frontendConfigFile = new File(path);
config.add(new Optional(new FileConfiguration(frontendConfigFile)));
config.addOverriding(new Required(new ResourceConfiguration("environment.properties")));
config.addOverriding(new Optional(new ResourceConfiguration("developer.properties")));
config.addHighOrder(systemPropertiesConfiguration);
}
public String baseUrl() {
return config.get("baseUrl");
}
public String cookieString() {
return config.get("userCookie");
}
}
</code></pre>
<div>
I ended up liking this solution, as the mapping between functional meaning and configuration keys are done in a single point. My application specific configuration stack knows about how to get information out of the sources, while my code only knows what to ask for. This leaves me without pain when I need to change a configuration key.<br />
<br />
I assume that when you can access you DI container's configuration, you can easily create a provider for the Config object that can do all this setup.<br />
<blockquote class="tr_bq">
<h4>
Where to use?</h4>
It can be tempting to pass the whole Configuration object to everyone who might need a single bit of information out of it. I tend to believe that an object - or method for a matter of fact - should only know of things that it directly uses. For example, I wouldn't pass the whole Configuration to a class which only reads out a single setting. I would probably pass the Configuration to the factory which produces the object in question, and add that particular setting as a parameter to the construction (or method call).<br />
The general rule is <b>the less classes it collaborates with, the more flexible my code is</b>. At least that's how I think about it. </blockquote>
<h3>
Should support scopes</h3>
Scopes come in handy with applications that for example use plugins. Your plugin might want to know about how the main application is configured, but not vice versa. The application, or other plugins should not even be aware of your plugin.<br />
To achieve this, the only thing you need to do is to pass the parent Config in when you create your local one.</div>
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>Config config = new Config(hostApplicationConfig);
</code></pre>
Easy?<br />
From this point in time, your local <span style="font-family: Courier New, Courier, monospace;">config</span> instance will see everything that the <span style="font-family: Courier New, Courier, monospace;">hostApplicationConfig</span> holds, and everything that you add in later. The latter however, will have no clue that it's <a href="http://en.wikipedia.org/wiki/Decorator_pattern" target="_blank">decorated</a>.<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>/**
* a.properties:
* setting_a=aaa
*/
Config hostApplicationConfig = new Config();
hostApplicationConfig.addOverriding(new Required(new ResourceConfiguration("a.properties")));
/**
* b.properties:
* setting_b=bbb
*/
Config config = new Config(hostApplicationConfig);
config.addOverriding(new Required(new ResourceConfiguration("b.properties")));
</code></pre>
The above example deals with two configuration files. One is loaded to the <span style="font-family: 'Courier New', Courier, monospace;">hostApplicationConfig</span> which is then passed to the <span style="font-family: 'Courier New', Courier, monospace;">config,</span><span style="font-family: inherit;"> which then loads another configuration file</span><span style="font-family: 'Courier New', Courier, monospace;">.</span><br />
Because of the scoping, I could do:<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>config.get("setting_a");
config.get("setting_b");
</code></pre>
but cannot do:<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>hostApplicationConfig.get("setting_a");
hostApplicationConfig.get("setting_b");
</code></pre>
because the <span style="font-family: 'Courier New', Courier, monospace;">hostApplicationConfig </span>only knows of <span style="font-family: Courier New, Courier, monospace;">setting_a</span>.<br />
<br />
<h3>
Should support namesapces</h3>
This is a feature that I am currently not using, but I've suffered from the lack of it before.<br />
Being able to define namespaces is important when you are not able to change configuration keys and you have conflicting keys. This can happen if multiple applications are using the same configuration source and things get messy. If you need to go there, here's what you can do:<br />
<pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code>/**
* a.properties
* setting_a=AAA
*/
/**
* b.properties
* setting_a=BBB
*/
Config config = new Config();
config.addOverriding(new Required(new ResourceConfiguration("a.properties")));
config.addOverriding(new Required(new ResourceConfiguration("b.properties")), "newApp");
config.get("setting_a");
config.get("newApp.setting_a");
</code></pre>
You load your properties into a "newApp" namespace. The only effect it has is that you need to ask for the setting in that particular namespace by adding "newApp." in front of the setting key.<br />
<br />
<h3>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">Should allow stating that a new configuration file should override the keys or not</span></h3>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">I've briefly touched </span><span style="font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace;">Required</span></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"> and </span><span style="font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace;">Optional</span></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"> before. These control the way the library behaves when the configuration source could not be loaded for some reason. If it's required to be present and you state that with </span><span style="font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace;">Required</span></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">, it'll throw a </span><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;"><span style="font-family: Courier New, Courier, monospace;">CouldNotLoadConfigurationSource</span><span style="font-family: Arial;"> exception.</span></span><br />
<span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;"><span style="font-family: Arial;"><br /></span></span>
<h3>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">Should not need an object representation in the code</span></h3>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">As you could see from the previous examples, we're not mapping configuration to any internal model.</span><br />
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><br /></span>
<h3>
Summary</h3>
</div>
<div>
<span style="font-family: Arial; font-size: 15px; line-height: 17px; white-space: pre-wrap;">I've spent a great amount of time fiddling with different ways of doing this, and even more time testing out the version I've described above. It seems easy to install, comfortable to use, readable and extendable.</span><span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">The best way to operate this configuration solution is to use it through a dependency injection container, pass it to a factory and feed in the requested data as parameters to other objects.</span></span><br />
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Please feel free to contribute with other loaders and ideas.</span></span><br />
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Fork the project at: <a href="http://github.com/meza/config">http://github.com/meza/config</a></span></span><br />
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">I'd be happy to see implementations in other languages too.</span></span></div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-4747914935671702622013-08-15T12:27:00.001+01:002013-08-15T12:27:51.678+01:00Back from summer break<div style="text-align: justify;">
It turned out to be one of the best summers in London in decades. The weather was uninterruptedly stunning for more than 2 months in a row. In my previous years, I had to face the extremes in Hungary. It could go up to 40+ degrees celsius. For most of the Brits I've told this fact, it seemed like a desirable condition. It's not. It gets under your skin. The air is stiff and sticky. The concrete jungle amplifies it and radiates heat even after the sun sets. You stop sleeping, you start getting moody and you feel trapped. Going somewhere seems less and less feasible as you can't imagine yourself sitting in a car or on a train. It's miserable. So after all those years of summer suffering, I really enjoyed that perfect 25-30 degrees that suddenly hit England.</div>
<a name='more'></a><br />
<div style="text-align: justify;">
We had similar conditions last year, but it lasted only for a week. They said it's normal and I believed it. </div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: justify;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-xood2zRkh5o/Ugy6PLqAPlI/AAAAAAAAZss/vFvvadQhiuY/s1600/20130621_210214.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="400" src="http://1.bp.blogspot.com/-xood2zRkh5o/Ugy6PLqAPlI/AAAAAAAAZss/vFvvadQhiuY/s400/20130621_210214.jpg" width="225" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">View from my study</td></tr>
</tbody></table>
<div style="text-align: justify;">
So as it kicked in around June, I started taking the most out of it and stayed outside until late every night with friends. It was a nice transition as the city slowly realised that they could actually count on the sun. People flooded the streets, parties popped up on random outdoors locations and the general mood just went off the charts.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I have this secret goal in life: to live. So in the name of that, I hardly said no to any invitation. I've met </div>
<div style="text-align: justify;">
many wonderful people on my way, went to beautiful places, danced until dawn, chatted away on a hilltop overlooking the city, went to a wedding that was a pool-party, accidentally wandered into a Stones concert, had beers and BBQs in several parks, played on a table-football tournament, and many-many more things that I couldn't possibly list. Every afternoon/night held something magical. I felt like stepping into one of those road-trip-like american movies, where surreal things happen to the characters, and they hilariously fight their way through whatever life throws at them. Then all of it becomes a very good memory, and forms a special bond among the people involved. Currently my head is full of such memories of laughter, tears, music and booze. Most of you can probably relate to this from the last days of summer holiday before going back to school. The difference is that doing the same crazy things as a grown-up turns out to be even more fun!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
If I could give you one advice only may that be professional or general, that'd be this: <b>don't just exist, live!</b></div>
<table 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://3.bp.blogspot.com/-_-0bFQXbIKo/Ugy5qe1LtmI/AAAAAAAAZsk/RgoanHT50_s/s1600/friends.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="368" src="http://3.bp.blogspot.com/-_-0bFQXbIKo/Ugy5qe1LtmI/AAAAAAAAZsk/RgoanHT50_s/s640/friends.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">With friends at Seven Sisters</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
But life is not only about partying. Every morning, I showed up at work. I believe that this balance makes it even more memorable. I can't say it was easy though. Sometimes waking up after 3 hours of sleep seemed impossible, but at least I learned that I could actually focus on code much better when I'm <i>that</i> tired.</div>
<div style="text-align: justify;">
Anyway, we had some great successes during work that I'll be writing about soon.</div>
<div style="text-align: justify;">
I've managed to crack the <a href="http://www.meza.hu/2013/06/configuration-interface-done-right.html" target="_blank">configuration problem</a>. Used it on several projects now at The Guardian, and I can say that I'm happy with the result.</div>
<div style="text-align: justify;">
We've evolved the <a href="https://github.com/meza/AAO" target="_blank">AAO framework</a> to be context-aware and to support relative subject and object references, enabling fluent conversation capturing.</div>
<div style="text-align: justify;">
I <a href="https://github.com/cucumber/cucumber-jvm/pull/561" target="_blank">contributed to cucumber-jvm</a> with an option to generate camel-case snippets.</div>
<div style="text-align: justify;">
I'm preparing a talk and a workshop around AAO too. You can catch me in <a href="http://skillsmatter.com/event/agile-testing/agile-testing-bdd-exchange-nyc-2013" target="_blank">NYC on the 20th of Sept</a>, or in <a href="http://skillsmatter.com/event/agile-scrum/ltg-workshops" target="_blank">London on the 18th of Oct</a> for the workshop.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
To close this post, I'd like to share a video I've made at the <a href="https://www.facebook.com/events/447900135291773/" target="_blank">Holi Festival of Colours, London</a> last weekend. This summarises what I've been just writing about, and it closes this period. Time to get back to reality and change the world!</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/dudbDq15S3Y?feature=player_embedded' frameborder='0'></iframe></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0London, UK51.511213899999987 -0.1198243999999704151.195100899999986 -0.7652713999999704 51.827326899999989 0.52562260000002958tag:blogger.com,1999:blog-7528777922526033452.post-45096303173612599992013-06-18T07:30:00.000+01:002013-06-18T07:30:01.131+01:00Configuration Interface done right<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-p-6dh82gJEo/Ub9_FiBHe6I/AAAAAAAAYVk/C2ksA0gnacI/s1600/Configuration_icon_by_obsilion.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><img border="0" src="http://1.bp.blogspot.com/-p-6dh82gJEo/Ub9_FiBHe6I/AAAAAAAAYVk/C2ksA0gnacI/s1600/Configuration_icon_by_obsilion.png" /></a></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I find configuration interfaces fascinating. I’ve worked with many languages on many projects, and if nothing else, the configuration was common in all. To be more precise, </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">problems around </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">configuration. There is a saying that the two most difficult programming tasks are pagination and progress bars. I’d say the third is configuration. We </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><i>can</i></span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> do it, but it’s rarely comfortable and we’re rarely proud of the solution. Now I’m not talking about small websites with 3 configurable parameters. I’m talking about e-commerce sites and enterprise death-stars.
</span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">If someone reading this have never been confronted with such issues, here’s a recap of the stuff we usually need to have in the configuration parts of such system:
</span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; vertical-align: baseline; white-space: pre-wrap;">
</span></div>
</div>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li><span style="font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; vertical-align: baseline; white-space: pre-wrap;"><b>Operation stuff</b></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; vertical-align: baseline; white-space: pre-wrap;">, like ports to listen on, database connection endpoints, api endpoints, system specific credentials, locale to use, themes, etc</span></li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Component stuff</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: what logger to use, what features to enable, themes, etc</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Feature stuff</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: localisation, themes, feature fine-tuning</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">3rd party stuff</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">: things that are required by the third parties we use but we have no clue what they do, or personalisation of the way we use the 3rd parties.</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Random stuff</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> that might not be configurable at all, we just didn’t want to hard-code a string because we’re told that we lose a pinky for doing such thing.</span></div>
</div>
</li>
</ul>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> </span></div>
</div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">I’ve bumped into this problem again, and now I’ve set my mind on cracking this nut. I know that I will not come up with a “one solution fits all” result, I’m not even trying to. So what will I do?</span></div>
</div>
<a name='more'></a><div style="text-align: justify;">
<span style="color: black; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Right now I’m working on testing frameworks for a maven/sbt based ecosystem with multiple project streams, each with several layers of modules. My primary goal is to solve </span><span style="color: black; font-family: Arial; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">our</span><span style="color: black; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> problems. My secondary goal is world </span><span style="color: black; font-family: Arial; font-size: 15px; text-decoration: line-through; vertical-align: baseline; white-space: pre-wrap;">domination</span><span style="color: black; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> peace.
</span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">The solution has not yet shown itself, so don’t expect to get anything - apart from a braindump - out of this for a while. The problem lies deep in the complex space, meaning that I have no idea that what I try will work out or not. I need experiments, measurements and feedback. I need information to reduce my ignorance of the solution space.</span><br />
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><br /></span>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">What I know now is that technically it is possible. It might not be easy and I might face some really interesting design challenges, but this part of the problem is simply complicated. I can choose from many design patterns, configuration file formats, libraries, tools, examples, etc. In the end, it's just code. Code can take shuttles to Mars and operate rovers on the surface. Code is just a mean to an end.</span><br />
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><br /></span>
<span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">My ignorance is about user experience. How would we want to use it?</span></div>
<div style="text-align: justify;">
<div style="text-align: justify;">
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b></div>
</div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Working with many developers over the years, I have learned to accept that we are amazingly lazy. If a new tool is not ridiculously comfortable to </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">use</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, we will probably not prefer it over our old (bad) habits. We’ll might give the new toy a spin, but will inevitably revert to the old one once the joy of experimenting fades away. I believe that </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">the best way to offer a programmer an alternative is to offer a </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><i>simpler</i></span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: bold; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> solution.</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> Recognising this, we can support our fellow programmers with products they enjoy using and are happy to switch to.</span></div>
</div>
<h2 dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 10pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; font-weight: normal; line-height: 1.15; white-space: pre-wrap;"><i>If you know a way to measure joy automatically without sticking electrodes on every user, please speak up!
</i></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;"><span style="font-weight: normal;">Even if it appears hard, I will use joy - more precisely geek joy - as a measurement of success.
</span></span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">My hypothesis is that by solving the common problems we face with configuration interfaces and providing a dead simple way to do so through, I’ll save my peers from many hours of frustration, therefore making them happy.</span></h2>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
</div>
<h2 dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 10pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; font-weight: normal; line-height: 1.15; white-space: pre-wrap;">How will I achieve this? I don't know yet. When? Hopefully soon. I don't see point in creating <i>yet another complicated configuration interface</i>,<i> </i>there are many decent ones out there already.</span></h2>
<h2 dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 10pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; font-weight: normal; line-height: 1.15; white-space: pre-wrap;">Right now I have a vague set of guesses about what I want to create, which will act as hypothesises I need to prove during the process. What I can tell you now is that </span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">currently </span><span style="font-family: Arial; font-size: 15px; line-height: 1.15; white-space: pre-wrap;">I think that a good configuration interface</span></h2>
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should be dead simple to use</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should support extension</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should support scopes</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should support namespaces</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should support optional configuration files for developer local configs</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should allow stating that a new configuration file should override the keys or not</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">should not need an object representation in the code</span></div>
</div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-align: justify; text-decoration: none; vertical-align: baseline;"><span style="line-height: 1.15; white-space: pre-wrap;">should be dead simple to use</span><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt;">
</div>
</li>
</ul>
<div style="text-align: justify;">
<div style="text-align: justify;">
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;"><br /></span></span></div>
</div>
<div style="text-align: justify;">
<div style="text-align: justify;">
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">That's all folks. That's where I'm at now. If you think I can save myself a whole lot of trouble and use a brilliant tool that I don't know of, please tell me now! Otherwise I'll save the world and blog about it.</span></span></div>
</div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0London, Greater London N1, UK51.5412621 -0.08813880000002427651.5017571 -0.16881980000002428 51.580767099999996 -0.0074578000000242728tag:blogger.com,1999:blog-7528777922526033452.post-3628912760068292062013-05-14T14:31:00.000+01:002013-05-14T14:31:21.750+01:00Why am I mad about losing @lastfm?On my music blog I have whined about the fact that it feels bloody hard to find quality music. Too many releases happen each day in an expanding variety of genres. To solve this problem, I have been using last.fm for years. I've been scrobbling my listening history to teach their engine about my likes, so that the AI could show me new stuff that I would likely love... and buy. Yes, I am one of those maniacs, who likes to thank the author by purchasing their creations. It was easy through Last.fm.<br />
<br />
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-xDRM6KCZkdc/UZI6LvW4YEI/AAAAAAAAXqY/td4u06bh_As/s1600/lastfm.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-xDRM6KCZkdc/UZI6LvW4YEI/AAAAAAAAXqY/td4u06bh_As/s1600/lastfm.png" height="600" width="640" /></a></div>
<br />
So my question honestly is: how will this stop piracy? Last.fm encouraged me to purchase songs, making it effortless to do so.<br />
<br />
Now I am reaching out to you, dear readers.<br />
<br />
<span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][1]"></span><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">I
need something </span></span></span><br />
<ul>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">that learns my taste without interfering with my choice
of music listening device/software. This means that I can still use winamp/android music player/audacious on my devices to tell the service what my listening habits are.</span></span></span></li>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">that can recommend music to me that I
might like, and it's always spot on</span></span></span></li>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">that can offer me a 1 click buy to
the music provider of my choice</span></span></span></li>
<ul>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">even from my mobile device </span></span></span></li>
<ul>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">even for a
downloaded song I am listening to but decide to purchase for the greater
good</span></span></span></li>
</ul>
</ul>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">that will not lock me in to its own universe</span></span></span></li>
<li><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">that will not spam my friends with my activity</span></span></span><span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]"> </span></span></span></li>
</ul>
<span data-ft="{"tn":"K"}" id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2]"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0"><span id=".reactRoot[600].[1][4][1]{comment10151446121369779_26233968}.0.[1].0.[1].0.[0].[0][2].0.[0]">Yes, this description fits Last.fm if you were wondering and haven't used it before. Also, the above requirements rule out spotify unless you could show me how to achieve these goals with it.</span></span></span>Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com1tag:blogger.com,1999:blog-7528777922526033452.post-58219632451664532772013-05-02T14:46:00.000+01:002013-05-03T09:43:02.521+01:00Principles of painless test automation #1 - LSP<br />
<div style="text-align: justify;">
Test automation causes massive headaches. Period. I'm pretty sure that every one of us who ever tried it knows what I mean. We end up with way too many <a href="http://martinfowler.com/bliki/BroadStackTest.html">full-stack tests</a>, way too much reliance on Selenium/Webdriver and way too many business people thinking that "everything is equally important".</div>
<div style="text-align: justify;">
The number of ways to tackle the pain depends on the number of people involved with the solution. Unfortunately there is no ultimate solution to test automation. <b>There are</b> however<b> principles that</b> <b>we can follow</b>. Just as with programming. If we keep our code clean, decoupled and readable, we can eventually focus on the less technical aspects of our work.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
In the Principles of painless test automation series I will share my experience about building automation frameworks. I will cover programming language agnostic thoughts, principles and solutions.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a></div>
<h3>
LSP</h3>
<div style="text-align: justify;">
<b>The most common pitfall</b> we tend to fall in<b> is replicating business logic in our test suite</b>. Let that be unit tests that calculate the correct result of something, or integration test code that is limited by what it represents.</div>
<div style="text-align: justify;">
A trivial example would be testing addition with a <u>simple unit test</u>.</div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace;">assertEquals(4, add(2,2))</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Simple, right?</div>
<div style="text-align: justify;">
Of course we like to be sure that the add method does not simply return 4, so we <a href="http://www.codemanship.co.uk/parlezuml/blog/?postid=382">triangulate</a> and add more examples. After some more assertions like above, sometimes we get drawn into writing a small loop where for example we go from 1 to 10, and check that adding the numbers 1+1, 2+2, 3+3, etc. always results in what's expected of it. But <b>we're lazy</b>. Most of us will definitely not bother writing the solution into the examples. Instead, we will create a function that will calculate the sums for us and return it, so that we could use it as reference.</div>
<div style="text-align: justify;">
Extracting methods results in less and readable code. Sometimes duplicating so isolated and small pieces of functionality could be the right thing to do. The pain begins when the mirroring does not stop at the bottom of the testing pyramid. Note, that the previous example refers only to unit testing.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Imagine we're testing an application that has some guest users, registered users and admin users. Each group has different permissions on our website. The guests can view the items, but cannot purchase them. The registered users have a shopping cart and payment methods. The admins have the permission to upload new items into the store, but cannot purchase.</div>
<div style="text-align: justify;">
The number of ways to create a test automation framework to verify such product's correctness depends on the number of teams implementing them. Each solution will be unique to the domain and to the people creating them. I've seen one thing in common though. Each framework had the notion of guests, registered users and admins. Most had implemented the <a href="http://selenium.polteq.com/en/category/page-object-model/">page object model</a> quite successfully to an extent, and everything was working perfectly.</div>
<div style="text-align: justify;">
<br /></div>
<blockquote class="tr_bq">
One day, a new member joined on of these teams. She spent a massive time getting familiar with the product and the company. She got assigned to one of the delivery teams as a tester, so on her second week she started playing around with the product. Her job as a tester was to advise the programmers in charge of the test automation on what tests to write. She spent days clicking about, doing some exploratory testing and examining the existing tests.<br />
On the third week of her new job, she asked something quite naive.<br />
<i>"So I see that you don't have any tests that would show what the admin interface does when a normal user tries to use it. Can we add some tests around that?"</i>The developers nodded in appreciation, because they indeed did not think of that scenario. They even agreed that it is a very important thing, and they should check that an unauthorized personnel cannot carry out an admin action. So they went back to code-land and started implementing the tests, which led them to a very unusual realization.<br />
Their implementation of the admin page objects did only allow the use of the <span style="font-family: Courier New, Courier, monospace;">AdminUser</span>, as their <span style="font-family: Courier New, Courier, monospace;">RegisterdUser </span>could only use pages that were accessible by a logged in user.<br />
Within minutes, they realized that their whole model of the product is constraining them in performing a seemingly trivial test.</blockquote>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
So what did they get wrong? What caused their pain?</div>
<div style="text-align: justify;">
<ul>
<li>The first <a href="http://en.wikipedia.org/wiki/Code_smell">smell</a> was the appearance of business roles within the testing framework.</li>
<li>The second indicator might be that the permissions of each role was replicated by the way the objects were composed.</li>
</ul>
</div>
<div style="text-align: justify;">
Let's just stop here for a moment and realize something.</div>
<div style="text-align: justify;">
One of the key elements of the <a href="http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)">S.O.L.I.D. principles</a> in code is the <a href="http://en.wikipedia.org/wiki/Liskov_substitution_principle">Liskov Substituion Principle</a>. It seems tricky to grasp at first, but <a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin">Uncle Bob</a> has a brilliant analogy that helps us with understanding it.</div>
<div style="text-align: justify;">
He starts his story by explaining a situation when programmers have a <span style="font-family: Courier New, Courier, monospace;">Rectangle </span>object. When they are asked to create a <span style="font-family: Courier New, Courier, monospace;">Square </span>object, they extend the <span style="font-family: Courier New, Courier, monospace;">Square</span> from the <span style="font-family: Courier New, Courier, monospace;">Rectangle </span>because we know from geometry that a square is a type of rectangle. His words follow:</div>
<div style="text-align: justify;">
<br /></div>
<blockquote class="tr_bq">
<i>The problem is this is not a Rectangle. It’s a piece of code! It’s a representation of a Rectangle. <b>Representatives do not share the relationships of the things they represent</b>. For example, imagine 2 people who are getting divorced. Each one of them has a lawyer who represents them. Its very unlikely those 2 lawyers themselves are getting divorces because the representatives of things do not share the relationships of the things they represent!</i></blockquote>
<div>
<br /></div>
<h3>
So what can we learn from this?</h3>
<div style="text-align: justify;">
The testing framework acts as a representative of a user of the product, and to some extent it represents the product towards those users by the page object model.</div>
<div style="text-align: justify;">
Therefore the users and the pages should not adhere to the same relationship as they do within the product. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>But there is a difference between a guest, a registered and an admin users!</i></div>
<div style="text-align: justify;">
Yes, indeed! We are so used to modelling objects in code, that sometimes we just create them for the sake of object creation. We found that the only difference between users of our system is the credentials they use. Nothing less, nothing more. We could still create named instances of the <span style="font-family: Courier New, Courier, monospace;">User</span> object in our test code though, but from this point they will be dead simple named value objects which only differ in their names and credentials they hold.</div>
<div style="text-align: justify;">
The business action representations like the page objects will have no notion of the distinction, they will operate with <i>any</i> <span style="font-family: Courier New, Courier, monospace;">User</span> implementation.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>The ability for a user to carry out an action should be decided by the product, and not the testing framework.</b></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
I've assembled a little framework that helps me to achieve what the article above is about. Check it out at: <a href="http://github.com/meza/AAO">http://github.com/meza/AAO</a></div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com1tag:blogger.com,1999:blog-7528777922526033452.post-65230263357599234152013-03-14T06:30:00.000+00:002013-05-02T14:45:46.247+01:00Goodbye Google Reader! What now?On the 13th of March 2013 the internet received a<span style="font-size: large;"><span style="font-family: Arial;"><b> </b></span></span><a href="http://googlereader.blogspot.co.uk/2013/03/powering-down-google-reader.html" target="_blank">statement</a>:<br />
<blockquote class="tr_bq">
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal; text-align: justify;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">We have just announced on the <a href="http://googleblog.blogspot.com/2013/03/a-second-spring-of-cleaning.html">Official Google Blog</a></span><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"> that we will soon retire<b> </b>Google Reader (the actual date is July 1, 2013). We know Reader has a<b> </b>devoted following who will be very sad to see it go. We’re sad too.</span></b><span style="text-align: justify;"> </span></blockquote>
<blockquote class="tr_bq">
<div style="text-align: justify;">
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"></span></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;">
<span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">There are two simple reasons for this: usage of Google Reader has declined,<b> </b>and as a company we’re pouring all of our energy into fewer products. We think<b> </b>that kind of focus will make for a better user experience.</span></b></div>
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;">
<br /><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt;">
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">To ensure a smooth transition, we’re providing a three-month sunset period so<b> </b>you have sufficient time to find an alternative feed-reading solution. If you want<b> </b>to retain your Reader data, including subscriptions, you can do so through<b> </b></span><a href="http://www.dataliberation.org/google/reader"><span style="color: #1155cc; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Google Takeout</span></a><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">.</span></b></div>
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;">
<br /><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"></span><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Thank you again for using Reader as your RSS platform.</span></b></blockquote>
<br />
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-KBmxlr9goUw/UUEeFgF0k5I/AAAAAAAATa8/weGidnW3zfk/s1600/rip-google-reader.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-KBmxlr9goUw/UUEeFgF0k5I/AAAAAAAATa8/weGidnW3zfk/s1600/rip-google-reader.jpg" /></a></div>
<br />
<b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">In short, <b>bye bye Google Reader!</b></span></b></div>
<div style="text-align: justify;">
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Now if you're like me and have collected hundreds of feeds over the past 8 years, this news would likely hurt your feelings too. The first thing you can do is to <a href="http://bit.ly/ZAUroi" target="_blank">search for alternatives</a>.</span></span><b id="internal-source-marker_0.05398527625948191" style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><b> </b></span></b></div>
<a name='more'></a><br />
<div style="text-align: justify;">
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">I've done the search before the media jumped on the topic, so most of the results were familiar to me. One stood out from the rest: <a href="http://www.newsblur.com/" target="_blank">NewsBlur</a>.</span></span></div>
<div class="NB-module-content">
<ul class="NB-about-why">
<li><i><b>News reading</b>: With first-class iOS, Android, and web apps, NewsBlur is an easy and organized way to read the news wherever you are.</i></li>
<i>
</i>
<li><i><b>Training</b>: By using NewsBlur's training filters, you
can hide stories you don't want to see and highlight the stories that
interest you. Teaching NewsBlur your preferences (or lack thereof) for
certain blogs, authors, and topics cuts down on the noise and connects
you with the news that interests you most.</i></li>
<i>
</i>
<li><i><b>Social</b>: Sharing and talking about the news is not
only fun, but allows you to break out of your routine and embrace the
serendipity of your friends' tastes.</i></li>
<i>
</i>
<li><i><b>Blurblogs</b>: Even if your friends aren't NewsBlur
users, they can keep up with what you're reading through a public blog
of all the stories you've shared, including your comments.</i></li>
</ul>
</div>
<div style="text-align: justify;">
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Apart from the training feature, these were the characteristics of Google Reader I fell in love with. I specially loved the social bit while they had it on, as I've discovered many feeds browsing my peers' subscriptions. It was a good feeling to share something with the one's following me. It wasn't like sharing on social sites. This share was to a thin slice of my social network. A slice of people who were interested in what I read. After all this trip down memory lane, I've decided to give NewsBlur a spin. </span></span><br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-Bep4CkoDTGQ/UUEihoNrMAI/AAAAAAAATbE/1we8_BmbDAQ/s1600/newsblur140313.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-Bep4CkoDTGQ/UUEihoNrMAI/AAAAAAAATbE/1we8_BmbDAQ/s1600/newsblur140313.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: large;"><span style="font-family: Arial;"><span style="font-size: x-small;">Stats at 00.07<span style="font-size: x-small;"> </span><span style="font-size: large;"><span style="font-size: x-small;">14<span style="font-size: x-small;">/</span>03<span style="font-size: x-small;">/</span>2013</span></span> GMT</span></span></span></td></tr>
</tbody></table>
<br />
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">Not surprisingly, by the time I got to this option, many thousand fellow feed consumers did too, bringing the surprised NewsBlur to its knees. Fortunately the maintainer issued a <a href="https://twitter.com/NewsBlur/status/311981087222022144" target="_blank">tweet </a>directing us to the another domain where the service was up for a bit longer.</span></span></div>
<div style="text-align: justify;">
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="font-weight: normal;"><span style="font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">I was relieved that an "import from google reader" option popped onto the middle of my screen, making the switch a no-brainer. I did have to fiddle around with the access token's callback url due to using the development version, but since I'm a dev too, I was happy to be able to use the service in such unexpected conditions. After a few minutes I got the whole thing set up, and having played with it for an hour I've arrived to the following conclusion:</span></span><span style="font-weight: normal;"> </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/A25VgNZDQ08?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<span style="font-weight: normal;"><span style="font-size: large;"><a href="http://www.newsblur.com/">NewsBlur</a> acts as a perfect substitute to Google Reader. It even has the social elements of the pre G+ version. Up to 64 feeds the usage is free. Above that limit a perfectly affordable annual subscription scheme is available. I've happily signed up for it. Oh, and it's open source, so you can install it on your own cloud. Check it out on github at: <a href="https://github.com/samuelclay/NewsBlur">https://github.com/samuelclay/NewsBlur</a> </span></span><br />
<br /></div>
<div style="text-align: justify;">
<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://3.bp.blogspot.com/-AtiGjIQtq0A/UUF-fjuAdoI/AAAAAAAATbU/xuhk7IKnlh4/s1600/newsblur140313_0736.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="http://3.bp.blogspot.com/-AtiGjIQtq0A/UUF-fjuAdoI/AAAAAAAATbU/xuhk7IKnlh4/s1600/newsblur140313_0736.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Stats 07.36 14/032103GMT</td></tr>
</tbody></table>
<br />
update 1 (07.37 14/03): New stats<br />
update 2 (10.23 14/03): Video</div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-61811715574188792562013-02-24T12:06:00.001+00:002013-02-24T12:06:07.923+00:00Why do we write readable code?Because we don't want to be in the shoes of the new engineer:<br />
(and we don't want to upset the new engineer who's a
violent psychopath who knows where we
live.) <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/100000/70000/6000/300/176362/176362.strip.print.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/100000/70000/6000/300/176362/176362.strip.print.gif" height="286" width="640" /></a></div>
<div style="text-align: right;">
via <a href="http://dilbert.com/strips/comic/2013-02-24/" target="_blank">Dilbert.com</a></div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-60838875537368995402013-02-01T07:00:00.000+00:002013-02-01T07:00:04.926+00:00In bed with real options<span id="internal-source-marker_0.5439161508843839" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">7:00,
the clock goes off. I know that I have an hour to get out of bed, take a
comfy bath, shave, eat, read twitter and flip through the items in Google Reader, get dressed, pack my stuff and leave for the shuttle bus
which takes me to the office. So what do I do? I slap snooze and nap for
the next 10 minutes. I’m enjoying the comfortable warmness of my
blanket and the cool air in my room. It’s perfect. I dream. 7:10, the
alarm starts beeping again. Slap! For a few moments I think about all
the stuff I need to do. Each task lasts for about 10 minutes, except
taking a bath. It takes 20. I can reduce it to 10 if I take a shower
only. The thoughts are getting blurry at this point and I’m dreaming
again. All so peaceful. I’m skiing at my favourite resort in South
Tyrol. The sun is shining, the air is fresh, music is playing around the
restaurant. I’m feeling fine and not willing to give up this for
anything. </span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<a name='more'></a><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">7:20, and I’m slapping the button again. If I don’t get out of bed now, I will need to give something up. </span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">One of my options will expire</span><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">.
I can still decide what to skip for now, but I have to make the call.
Chances are that I’ll continue my dream which is so dear to me, and I
could get breakfast at the office. This thought came so naturally while
sliding down that shady slope I love so much. You feel like you can see
the whole of the Alps from here. From a window formed by 2 pine trees
just on the edge of a cliff I can see several semi-busy villages in the
valley enjoying the tourist occupation. The curvy and narrow roads
leading up to the mountain tops are causing massive headaches to the
inexperienced drivers who just cannot cope. It’s so different from our
everyday city-lives. Stress just can’t exist in an environment like
this.</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;"></span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">7:30:
oh that alarm is ruthless! I need to get to the end of my slope, I
can’t just leave now. Do I have to give something up completely or is it
enough just to defer things? Well, the only option that will vanish
permanently is my current dream, the rest I can deal with later. I’ll
just read the news on the bus, or during breakfast. Come to think about
food, there’s a fine little pub just at the bottom of the slope I’m
currently on. After taking several deep breaths of the alpine air, I
start sliding. I’m navigating between faceless black and white people,
but I don’t even care about them. This time it’s just about me, nature
and the music in my ears. I think it’s Guano Apes - Lords of the Boards.
What a perfect song for such scenario! And the friggin' alarm disturbs
me at 7:40, right in the middle of the song. I still need to shower,
shave and walk to the bus. Or do I? Since I live close to my workplace, I
could just call a cab. Obviously this option costs me more than the
free shuttle, but I can finish my favourite slope and can leave the flat
10 minutes later. Is this worth £7? </span><br />
<blockquote class="tr_bq">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">“And now I'm flying like an angel to the sun</span><br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">My feet are burning and I grab into another world” </span></blockquote>
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">As
the lyrics echo in my mind, I know that I’ve made the right decision
and literally bought myself time to dream. I’m at the bottom. Feeling
fine and fresh, and most of all happy. It’s only 7:45, but I know that I
have 5 more minutes in which I can slowly start booting my brain. As
the clock goes off at 7:50, I’m ready for action.</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">Sitting
in the cab of course I think about the price I’m paying for the ride.
It seems a bit expensive for 3 kilometres which I could’ve walked
easily. I need to remind myself that this was the only option I’ve left
myself with so that I could finish my dream. And *that* feels like worth
it.</span><br />
<br />
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline;">More about Real Options here: <a href="http://www.infoq.com/articles/real-options-enhance-agility">http://www.infoq.com/articles/real-options-enhance-agility</a> </span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/ETPo6hOo9E0?feature=player_embedded' frameborder='0'></iframe></div>
<br />Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-81992424761841292122012-12-14T07:00:00.000+00:002012-12-14T07:00:02.302+00:00How does it feel to say no to meetings and managers?<i>"Oh no, not another meeting. How will I get my job done if all I do is attend meaningless meetings just to make the managers happy?"</i><br />
How many times have you had that exact thought over the last month? Can you sum the number of hours you've wasted from that 37-40 you have a week?<br />
My team's answer is 0 and 0 again. Yes, I do have a job and no, I'm not working alone.<br />
<br />
<a name='more'></a><br />
While crafting the Next Big Thing, the business people have identified some well framed parts of the system, and several teams started working on distinct features of the product. Each team was living in their own little bubble, doing their best to deliver the feature they were trusted with. Collaborating when and where necessary. The average setup was a handful of devs, some tester minded folks, a business representative, and a manager of some sort, let's call them masters of The Process. Every morning, we had stand-up meetings. Sprint demo and retrospective took place on Wednesdays, and each new sprint started on Thursdays with a planning meeting. We held a story-kickoff meeting with each story we picked up just to make sure we're all on the same page. Everyone was happy, the stories progressed, and the sky was blue, and the world a better place.<br />
It all happened on a not so shiny day, when it struck us. It hit us like an ascending plane hits a fly before his first fly-coffee. It turned out that we have not even scratched the surface of the Thing from the Next Big Thing, and that it should have been done by the time. Done, done, and done correctly.<br />
<br />
Now what normally happens when organisations face such problem? They gather around it. Observe it closely and scientifically for a long period of time. Shiny gantt charts hover around them while they point and blame one another to a point where it all goes quiet. They all stare at the problem without a single breath taken. An imaginary light bulb lights up above the group as they come to the same conclusion. Suddenly out of the nothing they start throwing bricks of money at the problem. Solved! Happy days! Did you know that you can fix a flat tire with some notes?<br />
Fortunately the smart people behind the Next Big Thing decided to live up to their names, and be smart. They've appointed 2 guys from 2 different teams to solve it. I was one of the lucky ones, but at the time I didn't feel that this glorious context switch could be remotely connected to being fortunate, and that I will be potentially able to bust a myth. They told us that this is the most important part of the Next Big Thing, and that the Thing must not fail! We will get all the support we need, but we cannot fail. Having said that, we spent the first week of our 8 week time box on meetings to assure managers that we will deliver the Thing. We spent numerous hours by identifying pieces of the puzzle ahead of us and naturally ordering them in the cone of uncertainty. We estimated what we could, and left the ones we couldn't. The Process wasn't like that though. The Process needs a backlog with estimates, and cannot have items without one. We needed to be strong and consequent.<br />
<br />
When this small team was assembled, we decided to prove several points. One of this was that The Process is just a guideline offering tools that we could use for our benefit. We chose to use estimates on stories we were confident with, and we didn't use estimates on stories we needed to learn more of. We knew that the closer we get to implementing it, the story would either disappear from our crystal ball, or emerge from it in a much clearer state. We decided to use a Kanban board to visualize our work, and told everyone that our input column is a dynamic backlog, and that anybody could re-order it whenever they want to. These changes alone were quite a shock to The Process, and the best part is yet to come.<br />
It was pretty obvious, that getting things done is more about getting the Thing done than talking about doing the Thing. Since it was important to the company that "the Thing succeeds" (<i>which would've been the correct terminology from the start</i>) we started declining meetings we did not feel important enough. Then we declined all of them.<br />
People were angry with us. Meetings were the way to communicate in an organisation from he beginning of time and suddenly two rebels in the corner started boycotting them. We had to use logic where we felt it is enough, or pure passivity where logic could not win. I will not lie, we did upset some managers. The response we used to explain our way of operating was: <b>"You know where we sit, come and talk to us when you want to. If we have a question, we know where you sit and we'll go and ask you."</b> Some took it well, some didn't. Honestly, we couldn't care less. In couple of weeks of delivering instead of justifying our process, we've managed to lose the managers and the meetings completely. People interested in our work regularly stop by for a chat or an ad hoc demo. Whenever we have to rely on someone else's input, we go and sit with them at their desks, or at the canteen. Casually and focused. Instead of being managed by a manager, we now use them to manage others to our advantages. As a compromise to giving constant progress reports, we agreed to hold a brief 5 minute stand-up each morning with anyone who wanted to attend, only once did someone turn up and then 20 minutes late, we've not had one since.<br />
Now all of the above does not mean that all meetings and managers are evil. We wouldn't have succeeded without having managers who let us experiment in the first place. Their role did not disappear, it only evolved from managing the way we work to managing what we will work on. Sometimes a meeting is inevitable. When you need to align several distant teams, or you only have hold of a valuable asset for a short time frame it might be the best option to get all interested parties together for a few moments. The general rule of thumb is to defer a meeting until it is unavoidable. <br />
<h3>
What did we learn from this?</h3>
Here comes an unordered list of things we observed:<br />
<b> </b><br />
<ul>
<li><b>Communication is about communication, not ceremonies. </b>People enjoy conversations better than ceremonies.<b> </b></li>
<li><b>Meetings tend to be the product of mistrust</b>, therefore they can be avoided by building trust. It seems like the chicken and the egg problem, but the best thing to do is either eliminate the meetings and build trust, or the other way around. </li>
<li>Exchanging organized gatherings to ad hoc discussions results in <b>less time spent more efficiently for less number of people</b>, therefore reducing waste, increasing flow.</li>
<li><b>Uncertainty can be fun.</b> Accepting that we are not sure about something is not a weakness. It sparks discussions, raises flags. Eventually everything will fall into place, once you've started examining the things you know. <i>It turned out that working with uncertainty is more fun than following crystal clear requirements.</i></li>
<li><b>A team is a group of people who are constantly and directly effected by each-others work.</b> Yuval Yeret used the explanation that "... who say relevant things to each other on standups". This little experiment proved my theory that though synchronous communication (real life conversation) only grows to be an interruption if the goal of the communication differs from the goal of your task. Therefore when a team is solving the same problem, verbal communication between them will unlikely be perceived as an interruption.</li>
<li><b>Defer a meeting until it is unavoidable</b>. Though most meetings turn out to be waste, some are not. Make sure a meeting you attend to has an agenda, and a clear goal.</li>
</ul>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-68976990870779448682012-11-26T07:00:00.000+00:002012-12-24T01:11:32.645+00:00Sharing requirements with git for transmedia applicationsIn my <a href="http://www.meza.hu/2012/11/requirement-structure-of-transmedia.html" target="_blank">previous post</a> about the topic I wrote about the abstract requirements of transmedia applications. When talking about transmedia applications I think of many independent code bases serving the same business values on different platforms. They share the programming language independent features like the branding, and the purpose they intended to deliver. The native iOS and Android Facebook applications unlikely reuse any code from each other, yet most of Facebook's features can be accessed without having to learn a new interface.<br />
<br />
<a name='more'></a><br />
Let's say we got involved with building news portal. The publisher decided to create web application, a PC application and several other apps for Android, iOS and WinPhone. Dealing with so many different teams and technologies it does not seem trivial to keep the acceptance criteria of features in sync between each working group. It might feel even harder if the development of each application happens in different times, and time zones. For example when the work on the desktop application begins in Moscow 3 months after the web app team has started their work in San Francisco, would the original requirements still stand? Did the work on the web app alter the original values? Does the team in Moscow know about the changes if there are any?<br />
<br />
<br />
<h3>
How does the git multiverse look like for our news portal?</h3>
We have a separate repository for feature files describing the core business requirements which each application must deliver. In addition to that, we have repositories for each platform to hold the platform related requirements. The feature repos are set up to only handle files ending in <span style="font-family: "Courier New",Courier,monospace;">*.feature</span> to avoid noise and confusion when someone is using them. To make this happen, the <span style="font-family: "Courier New",Courier,monospace;">.gitignore</span> file needs the following entries:<br />
<div class="gist" id="gist-4112564">
<div class="gist-file">
<div class="gist-data gist-syntax">
<div class="gist-highlight">
<div class="line" id="LC1">
*.*</div>
<div class="line" id="LC2">
!README</div>
<div class="line" id="LC3">
!*.feature</div>
<div class="line" id="LC4">
!*.gitignore</div>
</div>
</div>
<div class="gist-meta">
<a href="https://gist.github.com/raw/4112564/c9d566dd2218e07a92e1c6c31446bc5809212d59/.gitignore" style="float: right;">view raw</a>
<a href="https://gist.github.com/4112564#file_.gitignore" style="color: #666666; float: right; margin-right: 10px;">.gitignore</a>
<a href="https://gist.github.com/4112564">This Gist</a> brought to you by <a href="http://github.com/">GitHub</a>.
</div>
</div>
</div>
<br />
We have repositories for each application. These contain the given application's code, configuration, tests and resources. <b>The software can be built, deployed and shipped from its own isolated repository without having any impact on the others</b>. The individual applications become linked only by using git submodules to attach the higher level features onto their own local scenarios. This means that whenever someone changes a requirement in the platform or the core level, it becomes available for each leaf of the repository tree.<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">/app</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-source</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-tests</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-features</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-local</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-platform (submodule)</span><br />
<span style="font-family: "Courier New",Courier,monospace;"> |-business (submodule)</span><br />
<br />
A simple CI process can react upon a commit to one of the feature repositories, and verify that the application could still handle the changes. If so, it can bump the linked version of the requirements of the given app. If not, it can signal that some work is needed. This however does not work well if the changes are <i>pushed</i> down as they happen. We should keep in mind that core level modifications might have a huge ripple effect, and they need special atention. The benefit of using git submodules over svn:externals for example lies in the fact that the development teams can decide when to <i>pull</i> in the changes.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-4eAtBl74Dvw/ULIxNM05xlI/AAAAAAAAPho/19rOGS_80pc/s1600/gitSetUp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-4eAtBl74Dvw/ULIxNM05xlI/AAAAAAAAPho/19rOGS_80pc/s1600/gitSetUp.png" height="640" width="406" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This model can help products to share vision and identity through the interfaces it has. Keeping a consistent behaviour and user experience might have a higher impact on reliability and market acceptance than anything else.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>The application is not the product. The application only acts as an interface to the product.</b></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
My next post in this series will describe how to write application agnostic requirements, and how to think about them on the other end of the wire.</div>
Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-73591637088360978032012-11-19T06:00:00.000+00:002012-12-19T17:28:07.859+00:00The perfect start of a Monday morning<div class="separator" style="clear: both; text-align: center;">
<a href="http://d24w6bsrhbeh9d.cloudfront.net/photo/4591394_700b.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://d24w6bsrhbeh9d.cloudfront.net/photo/4591394_700b.jpg" height="200" width="178" /></a></div>
If you suffer from the illness called Monday morning, here's something for you.<br />
<br />
Open <a href="http://test.skimlinks.com/" rel="nofollow" target="_blank">i</a>t before breakfast: <a href="http://chickenonaraft.com/" target="_blank">click</a><br />
<br />
<br />
Cheers,<br />
mezaAnonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-38174388644929662272012-11-03T08:00:00.000+00:002012-11-05T17:20:44.013+00:00Requirement structure of transmedia applications<blockquote class="tr_bq">
Transmedia storytelling (also known as transmedia narrative or multiplatform storytelling) is the technique of telling a single story or story experience across multiple platforms and formats using current digital technologies, and is not to be confused with traditional cross-platform media franchises, sequels or adaptations. <br />
<br />
From a production standpoint, it involves creating conten that engages an audience using various techniques to permeate their daily lives. In order to achieve this engagement, a transmedia production will develop stories across multiple forms of media in order to deliver unique pieces of content in each channel. Importantly, these pieces of content are not only linked together (overtly or subtly), but are in narrative synchronization with each other.<br />
<i><a href="http://en.wikipedia.org/wiki/Transmedia_storytelling" target="_blank">Wikipedia</a></i> </blockquote>
There is a brilliant buzz going on nowdays about the importance of a simple thought. <i>"<b>never think of building a mobile application</b>.
Instead you need to think about building a single application that presents
across multiple devices: mobile, desktop, tablet - or whatever
device your users might use." </i>says Martin Fowler in his <a href="http://martinfowler.com/bliki/TransMediaApplication.html" target="_blank">post about the topic</a>. I would like to pick up where he left off, and share a little secret which I found very useful.<br />
<br />
<a name='more'></a><br />
It all begins with a product idea, which is then implemented by several platforms.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-LCXWqZ3tQRA/UJRLNlS5Q1I/AAAAAAAAOxI/UpsL0xHMOmc/s1600/productIdea.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="316" src="http://4.bp.blogspot.com/-LCXWqZ3tQRA/UJRLNlS5Q1I/AAAAAAAAOxI/UpsL0xHMOmc/s1600/productIdea.png" width="640" /></a></div>
<br />
Let's use Twitter for our example. Twitter's business features are implemented across many different operating systems, and even more software platforms. You find clients written in almost every capable programming languages, for reasons one would never imagine. There is even a <a href="http://www.floodgap.com/software/ttytter/" target="_blank">Twitter client for the unix console</a>. But what can you know for sure about each and every tweet capable software out there? It can surely tweet, or at least retrieve tweets. Twitter's core business features are tweeting, and allowing users to view others' tweets.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Let's narrow our scope to the official clients. Imagine, that as a brand, Twitter has to make sure that there is no major difference in the user experience even if the devices are all so different. They cannot rely on embedding the website, because it causes more incompatibality, and more bandwidth consumption for the end user. So they create specific programs for the different platforms.<br />
<i>Remember, I am using Twitter as an example, I have no clue how they go about this topic at all.</i><br />
The common part in each application is that they all have a product vision. a goal, they want to achieve, a purpose of their existance. They all have at least one feature<i> </i>which is mission critical for their business to function. Google would take an enourmous hit if the search engine would just stop working. Twitter would probably not be in business if people would be only able to tweet for themselves.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.blogger.com/blogger.g?blogID=7528777922526033452" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="http://3.bp.blogspot.com/-oLmZ9mwFTkM/UJRLMs7c5BI/AAAAAAAAOxA/PjlyHGMee1w/s1600/layersOfRequirements.png" style="cursor: move;" width="640" /></a></div>
<br />
There are always a set of <i>Business critical requirements </i>which <i>must</i> work. In the realm of transmedia applications, the next layer which needs attention is the platform layer. How would you feel if the routine you've gained using an application on the iPhone 4 would be utterly useless on the iPhone 5? Or if you switch to another vendor's phone, you wouldn't even recognize the Twitter client? A high profile company does not want to couple their users' experience to the device their product runs on. To address this issue, they have a set of requirements that must be met on every mobile phone for example. These are <i>Platform specific critical requirements. </i>I emphasise critical because I believe that a negative user experience is indeed a critical failure if it could've been avoided by being consistent. <br />
<br />
<br />
Though the whole project domain has one set of business requirements, it can have several platforms. Mobile, Tablet, Desktop, Web, you name it. Within each supported platform, lies some number of applications. These applications must implement every single requirement provided by the platform they run on, and the business needs they serve. If this fails, the users will find the problem and react to it. An application on th other hand has the freedom of having its own set of features too. They can be experimental features for the platform, or some nice extras the programmers thought of. It doesn't matter too much to the product until it adheres to the upstream requirements.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-eu1e9fJc46Y/UJRZv48tMCI/AAAAAAAAOxw/FPnMg0TTKNM/s1600/featurePyramidChanges.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="492" src="http://3.bp.blogspot.com/-eu1e9fJc46Y/UJRZv48tMCI/AAAAAAAAOxw/FPnMg0TTKNM/s1600/featurePyramidChanges.png" width="640" /></a></div>
What matter is knowing which feature of the product lies where on this pyramid. Introducing a change on the bottom is easy. One application of one platform needs to be changed. If we're talking about a carefully crafted software, the change might even be less than 10 lines of code. Piece of cake. But what would happen for example if Twitter would decide to remove the capability of posting textual updates, and would rely solely on pictures? Each participant of the product should know the impact of the changes they are about to introduce or communicate. Even if a businesss level change seems to be a good idea, it is most likely worth to try it out first, to minimize the potential waste. What if the new cool idea is never used by the users? Is it worth implementing it on 50 different applications? If a new feature is a hit on a mobile device, will it work on the website too?<br />
<br />
In my next post, I will show a method how you can use BDD to support this structure, and how to share the requirements using git.<br />
<br />Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0tag:blogger.com,1999:blog-7528777922526033452.post-77857148308653027422012-10-18T11:57:00.000+01:002012-10-18T11:57:49.037+01:00Interruptions and the teamSo the first part of my post is told by Jason Fried in the video below. Please listen to the talk, and continue afterwards. He has phrased these thoughts well, and completely spoke my heart.<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="411" src="http://www.youtube.com/embed/5XD2kNopsUs" width="730"></iframe><br />
<br />
There is one thing I would like to add to this post, and this is an idea I first heard from <a href="http://yuvalyeret.com/" target="_blank">Yuval Yeret</a>, and managed to play around with it.<br />
Imagine a standup meeting where everybody stands in a circle, and the session starts. The first person starts to talk about what he has done yesterday, what he'll do today, and the possible blockers he is facing. After a minute or two, he's finished and the second person starts. She goes through this ceremony, and passes the ball onto the next developer, and so on. In an average team, by the time they get to the 6th person, the 1st one is playing with his phone, some are yawning and are trying to escape the meeting as fast as possible. Why? Because they are not a team.<br />
<b>A team is a group of people who are working on the same task.</b> To phrase it differently:<br />
<i>A team is a group of people who are directly effected by the progress [standup reports] of the other members.</i><br />
Looping back to the video, I do believe that if a member of such team interrupts someone with a question related his task, that indeed is not a distraction. That is collaboration.<br />
My proposal is to <b>encourage <i>synchronous</i> communication between <i>team</i> members, and <i>asynchronous</i> communication with the rest of the world</b>.Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0Watford, Hertfordshire, UK51.654855 -0.39820331.313038499999998 -40.8278905 71.996671499999991 40.0314845tag:blogger.com,1999:blog-7528777922526033452.post-65774920890459888352012-10-16T07:00:00.000+01:002012-10-16T07:00:05.992+01:00Superfluous accessors<whine> <br />
<br />
I've been complaining about this boilerplate pattern for a while now, but what I saw today made me a bit concerned. <br />
<script src="https://gist.github.com/3895355.js?file=SuperfluousAccessors.java"></script><br />
It is finally becoming more and more common to correctly encapsulate fields, thus getting rid of uncontrolled modifications. But the more I think about it, the more useless in certain situations. When you only have a POJO without an interface, and you have absolutely no logic around setting or retrieving a value, there is absolutely no reason to add the boilerplate accessors.<br />
<blockquote class="tr_bq">
<i><b>There are a finite number of keystrokes left in your hands before you die. - </b></i><b>Scott Hanselman</b> </blockquote>
It is just a perfect waste of <a href="http://www.hanselman.com/blog/DoTheyDeserveTheGiftOfYourKeystrokes.aspx" target="_blank">keystrokes</a>. <i>I would challenge such case though, and advise you to code towards interfaces, and not implementation.</i> There are indeed some valid cases where you'll choose to upset the gods of clean code and sacrifice a tamagotchi later on instead.<br />
<script src="https://gist.github.com/3895355.js?file=Accessor.java"></script><br />
With the great power of modern IDEs, when the time should come when you'll need an interface or some logic in the getter or setter, you can use the dark powers of the "encapsulate fields" refactoring. This will hide your field from the outside world, create the accessors, and replace all read and write operations with the appropriate method call. <br />
</whine>Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com1tag:blogger.com,1999:blog-7528777922526033452.post-87699059071908046332012-10-15T21:07:00.001+01:002012-10-15T21:07:15.967+01:00Coderetreat London 29.09.12 summarySo since I had no blog to post to for a while, I've missed to show this to you.<br />
I've facilitated a Coderetreat in London lately, here's how it went:<br />
<br />
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="411" src="http://www.youtube.com/embed/qBvMBAOQD5U" width="730"></iframe><br />
<br />
Feel free to join the <a href="http://www.linkedin.com/groups/Coderetreat-London-4651812?trk=myg_ugrp_ovr" target="_blank">LinkedIn group</a> to get notified about the next one.Anonymoushttp://www.blogger.com/profile/06265278274185419578noreply@blogger.com0