From procedural to functional – an example in F#

In this blog post, I show little code review of a code sent to me by friend. The code is quite simple example on how to read XML file using XmlProvider. My friend’s biggest concern was that his code is still procedural and not ‘functional’. I was asked if this code can be refactored to be more functional, whatever it means.

First of all, the code that I got, is fine and most importantly it works. Even when you are using F# to solve your problems, you don’t really have to make your code super functional. That’s the beauty of this language. You can still use state-full and mutable approach to implement solution. You don’t have to make this code functional just for the sake of it.

Said that, I will still try to make the code better and in some ways more ‘functional’ to show some awesome F# features and approaches that do make the difference. My main goal here is to to remove loops and mutability.

XML structure

The XML is a representing a Collection of ‘rows’ with parameters specified as ‘cols’. Each ‘Col’ has a param name and value. Some of the params are missing value.

Original Code

  • Record type defined with all the values as options. Column values are optional thus all the properties are declared as options. This allows the usage of ‘None’ value.
  • The data is being read using FSharp.Data and XmlProvider
  • Collection of records is created by using Sequence and yield operator.
  • The core mapping code from XML to record is in the loop.
  • By default all the values, that hold col value, are set to None and then if one of them exists we do set the proper value
  • I am not sure why ‘ref’ has been used here. It can be changed to just mutable ‘let binding’. More on ref
  • Because ‘ref’ is used, there has to be ‘!’ used to get the data. Thus this weird syntax of ‘!cy’ to extract the value from ‘ref’.

So where to start with some changes ?

With operator and stateless record change

I start with a simple, yet a nice change, that makes the code cleaner.

Instead of extracting all the values and then creating a record instance at the end, I use ‘with’ operator and compose the Record on the fly.

In order to do this, I need to define a function to create a default record type with all the values set to ‘None’ ( option type ). Thanks to this, I can remove ref’ and weird initialization of temp values.

Then, I introduce a function that maps the ‘col’ and its value to proper field in the Record

This function takes a name of the ‘col’ ( parameter ) , a number or a string and the existing record. The with operator creates a new Record based on existing one with specified field added to it.

Now, I can write code like this.

This code creates newRecord and then adds voivoship value to it. All the existing fields are still set to ‘None’.

From loop to recursion

In the original code there is a loop used to change the state of the object. This is a perfect approach in procedural statefull approach. You just add new fields to the object. However when, stateless approach is needed, loop won’t fit it due to its dependence on external state change. Loop doesn’t return anything and it can only change existing state out of its scope. If you want to change something in the loop it has to be mutable.

If you want to loop some collection and change something without mutable value then you might use recursion. The good thing about it is that recursion is a function that has to return something and you can return new state. There is no need for mutable values.

To change the loop from original code to recursion, I need to define a recursive function.

  • rec means that this function is recursive
  • this function takes an existing record and list of columns
  • it loops through the list of columns using match
  • ‘head::tail’ is a list deconstruction convention using cons operator - ‘head’ will be the first element while ‘tail’ is the rest of the collection
  • to do recursive call, I invoke the same function passing record created by addCol function ( introduced earlier in the post ) and rest of the collection ( ‘tail’ )
  • if the list is empty i return the record
  • this is a very common pattern in functional programming

To bind everything together, there is a function that initiates the recursion

  • I do declare a function iterateCols
  • and then invoke it with initial parameters ( an empty record ) and ( list of columns )

Sequence now returns a collection of Rows with values from Columns

That’s all. Full code is available here.

Recursion vs Loop

When you look at the original code and new code, it might look less readable. I do find recursion more readable now, but I got used to it. Normal for loop might be more readable in some cases and you have to always ask a questions like.

  • Do, I need stateless code in here ?
  •  What are the benefits of making this code more ‘pure-functional’

Like everything in our field, there is no silver bullet and we have to be pragmatic.

Feel free to leave a comments with your opinions about this code. I would love to hear more suggestion and ideas on how to approach problems like this.

I want to be programmer where to start ?

I have received an email from a 15th year old student from US asking the question on where to start the coding / programming adventure. I want to share with you questions and my answers.

Q: “I am currently 15 years old and a freshman at University City High School. I have an interest in becoming a software developer. I was curious to know if I should wait until I am older to start learning different programming languages. I am good with a computer, and have a B in geometry right now so I would say I have different strengths and weaknesses in math. Just to add, school is stressful for me so there are nights where I wouldn’t have time to practice coding and I play travel hockey from August to February, and that can make me stay up late at night. If you have any suggestions on software developing that can be user friendly for a high schooler please tell me! And let me know if 15 sounds right to start, or if I should wait.”

A: It is awesome that in age of 15th you are considering career in tech. When I was your age, I was only interested in playing football and video games :) . I had however started playing around with a Pascal language ( something really old ) and this is how it started. It was my father that gave me this first spark.

You don’t have to wait to start learning languages, you can do it now, but don’t stress over it, think about it more as a fun activity, not as work. You still have a lot of time to learn and in your teenage years you need to have fun. I would suggest you to start your adventure with JavaScript. It is a fairly simple yet powerful language that you can quickly do really fun things. The most important thing in learning at this stage is to quickly see some useful results. That’s how you will build your own internal motivation to learn more. This is very important for programmers.

When learning programming you have to remember that at start it might be hard plus you will not see the results immediately, but after some investment awesome things will come. Software dev is one of those rare career paths that you can have fun in your work place. I love comming to my work every day plus I am getting paid a decent amount of money. It is really great.
Don’t worry about time, you are still 15th, treat coding practices as something you can do but it shouldn’t be a priority for you now. I started programming for real when I was 22, I know people that started this path in their 30′s. So it is not like you have to start now and work hard when you are 15th to have an awesome career. There is still time.

When it comes to learning resources.
You could start with: – this one will teach you the programming basics + it is fun :) – quite nice course also with games - examples not related with games

Q: “I saw a video about a software developer saying how in his opinion, the good coders are the ones that love doing it and want to make really good code.”

A: Yes it is cool to be a great coder / programmer but the reality is that most of the positions require average programmers and it is fine to be average. Sure being a great coder / developer gives you huge advantage but don’t stress over it now. With time you will know if you are good at it or not, then you can decide to try something else.

Q: “According to the U.S. Bureau of Labor Statistics, software developers who work on systems software will have an employment growth of 20% from 2012-2022. For developers working on applications will have a 23% growth during the same time period.

A: Yes the demand for developers is huge. It is a huge gap and it looks like it will be like that for the foreseeable future. This demand is driving the salary up, plus you are treated nicely by employees. It is really a nice market. This profession is also safe from all the robotics advancement that might replace a lot of other crafts. There is a risk that advancements in AI might make this profession obsolete  in the future but then all creative work will become obsolete.

Q: “Are there any books you can recommend that can help me with coding or just about software developing in general?”

A: There are two book that I will recommend for starter. Head First Programming - yes this book looks silly but it is serious. It has a nice approach to learning, suitable for everyone and then you can also try Head First JavaScript Programming

Q: “From your experience working as a software developer, how much of your day is just coding and the other part of your day attending meetings and such?”

A: When it comes to how my work day looks like. It depends. You have to know that software developers are doing many different things, yes when you are junior developer you spend most of the time coding. That’s how everyone started. With time and experience this changes and you are getting more diverse tasks. Some of us are going into more technical roles, some are getting into management, some are leaving the field to pursue completely different career. When you are Junior you are doing simple tasks and you are dependent on your colleagues. In Mid Role you are not dependent on your colleagues and you are also mostly coding. In Senior roles you have to support your colleagues by mentoring them, helping them plus you are also responsible for various decisions and you take a lot of responsibility for the product. Then you can go to Leading roles which require more soft skills.

When it comes to my day, I spend 70% of time doing technical things and 30% of time doing other things like – task management, helping team, helping other teams, doing presentations, attending meetings etc. Btw, meetings are not bad if those are handled nicely.

Q: “Do you have to be a very creative person?”

A: Yes you have to be fairly creative in this field but creativity is a skill that you can train and acquire.

Q: “You said in your blog that teamwork is key. I play hockey so the only way you can get the job done is by teamwork, no solo work will get your team to the top. I am very good with working with others because of this. So could it happen that the co workers that developers work with can try to do solo work, and not much teamwork? If this were to happen, should a person in a higher position be notified?”

A: As for the teamwork. Team Sports are a great way to learn on how to act as a team. Keep on it. When I was your age I was playing football and basketball. There are a lot of programmers that do like solo work but this is limiting them. Software development is not a solo work you need a team and good teams can do much more. You will of course meet solo players that do like to work alone, sure you might go to superiors but your duty as a colleague and good team player is trying to involve those solo players to play with the team :) It is possible with help of your team leader, he should be notified that there are some problems, but politely without aggressiveness.

TDD / Unit Testing big list of learning resources from basics to advanced topics

One of my fellow dev friends asked about a set of links, books, screen-casts related to TDD / Unit Testing. He wants to expand his knowledge. Instead of sending him a private message, I thought that it would be great to just create a blog post with all the resources, I used in the past to learn.


Presentation - Video: Unit Testing and TDD – Why You Should Care and How to Make It Happen By Roy Osherove 

If you are completely new to those concepts then this presentation will be a nice quick start.

Book – “The Art Of Unit Testing” by Roy Osherove

Start here if you want to get into TDD and Unit Testing. Where to start then ? I started with Roy Osherove book. It might be outdated know but I think this one is a nice and easy quick start guide on how to get to TDD and Unit Testing. 

Book – “Professional Test Driven Development with C#”  by James Bender and Jeff McWherter 

Another good book to kick-start the learning process. It’s a full course starting from why TDD might help you and then taking you through the journey from TDD beginner.

Blog Post - Unit Test code with static method Console.Write By Myself 

If you ever asked a question on how to unit test static methods then my post shows one good approach to it.

Blog Post - Good unit test – One Assert By Myself

An explanation why one assert per unit of logic is the way to go.

Blog Post Series – String Calculator Kata one two three four by Myself :)

Kata exercise step by step with a commentary.

Blog Post Series – Chess TDD Kata By  

An awesome Kata with great commentary


Resources for developers that started using TDD practice and want to expand their knowledge.

Book – “Test Driven Development: By Example” by Kent Beck 

Yes maybe it would be best to start with Kent’s book, but I think it is more suitable for developers that tried TDD, did some smaller projects with it. In order to get most of Kent’s book, I think that you need prior experience. Kent’s book is like the bible that you will get back to from time to time to get new “A-HA” moments. It’s is really worth revisiting it wit more practical experience.

Pluralisight – Outside In TDD by Mark Seemann

This course is a great way to learn about one approach to TDD. Mark Seemann is probably known to all the .NET developers thanks to his blog and DI in .NET book.

Discussions – Is TDD Dead Series 

There was a huge debate about TDD and its future / relevance. This series of discussions is treasure trove of knowledge.

Presentation –  TDD, where did it all go wrong by Ian Cooper  

If you have watched the TDD discussions then you also can’t miss Ian Cooper talk.

Course / Screen cast - TDD Pairing Sessions – Building a Go Game by Roy Osherove

I haven’t checked this course yet, but its Roy and 8hrs of pair programming awesomnes!

Blog Post –  ‘Classic’ or the ‘London school’ of TDD by Jason Gorman

Explanation of two different approaches to TDD

Blog Post - Why learning TDD is hard, and what to do about it by David Tchepak

Blog Post - The TDD That Can be Spoken Is Not the Eternal TDD by Charles Hoffman

Blog Post – TDD is a path by Steve Jackson 

Blog Post - The Failures of “Intro to TDD” by  Justin Searls

Insights into why learning TDD is not that easy and needs a lot of practice and try / error approach.


Topics that might be going out of TDD and sometimes into more philosophical issues.

Book – Growing Object-Oriented Software, Guided by Tests by Steve Freeman  and Nat Pryce

With some proven war stories it is time to start thinking how Unit Tests and TDD fits into code design.

 Pluralsight – Advanced Unit Testing by Mark Seemann

Another great course by Mark with more advanced topics.

 Pluralsight – Introduction to Property-based Testing with F# by Mark Seemann 

Property-based Testing is still a novelty for me, it is a topic worth exploring as it gets more traction currently.

Book – XUnit Test Patterns by Gerard Meszaros

If Kent’s Beck book is a Bible then Gerard Meszaros book is a new Testament. Yes it has XUnit in its name but it really doesn’t matter. Topics covered here are adaptable to all the technologies plus you need to read this book if you want to get a basic vocabulary around TDD and Unit Testing.

Blog Post – If you are not doing TDD … by Szymon Pobiega

Not doing TDD is not something bad, TDD is just another tool in your belt.

Blog Post -The Pragmatics of TDD by Uncle Bob

Another great post explaining that there is a lot of pragmatism in TDD

Blog Post – TDD Anti-Patterns by James Carr

Funny but knowledgeable list of anti patterns in TDD

Functional Flavour

If you are into functional programming then this might be also of interest to you.

Pluralsight – F# Unit Testing by Mark Seemann

Pluralsight – Test-driven Development with F# by Mark Seemann

Presentation - Look, No Mocks! Functional TDD with F# by Mark Seemann



Akka.NET simple example with Github Api

In this post I want to a simple introduction to Akka.NET using an example app based on Github api.

I have been diving into Akka .NET lately. My first encounter with this technology was on Vaughn Vernon workshop in Krakow. The main event had couple of side presentation and one of them was about Akka project in Java world. It was a magic to me. Couple years later, I accidentally found ( probably on twitter ) Bartosz Sypytkowski blog and decided that now is the time to learn something about it.

Akka is a toolkit and runtime for building highly concurrent, distributed, and resilient message-driven applications on the JVM. The power of Akka is also available on the .NET Framework and Mono via the Akka.Net project.

It is achieved thanks to actor model pattern.

The actor model in computer science is a mathematical model of concurrent computation that treats “actors” as the universal primitives of concurrent computation: in response to a message that it receives, an actor can make local decisions, create more actors, send more messages, and determine how to respond to the next message received. The actor model originated in 1973.

More info on actor model.

Where, I have started with Akka :

  • Akka.NET BootCamp – ( highly recommended )
  • Github –

Example – Github commit counter

As with all the technical learning, the best way to do it is through example projects. I had couple of ideas and have decided to got with a simple app for counting commits in all the repos on Github. It’s straightforward, simple and I can use a non-complicated hierarchy of actors to achieve that. There are many examples on how to use Github Api, I won’t go into details here. I am gonna use Octokit – nuget package which is a official SDK for Github in .NET. This package provides nice and easy to use GitHub client.

hidden_number – has to be generated on your GitHub profile config page, there is also a possibility to call GitHub using anonymous user. However, with the latter option, keep in mind that this is only for testing and there is very small request limit of 60 per hour compared to 5000 per hour for authenticated user.

Using Octokit I can create a github-client what can be used to easily get all the commits for the public repos.

  • line 11 – getting all the public repos using github client for my user.
  • line 15 – getting through all the repos and getting the commits count
  • line 25 – displaying the final number of commits

Full procedure takes around 100458 ms ~ 1.66 minute. Quite long, considering it’s somehow a simple task + all the hard work is done on the Github side. How to make it faster then ? The main problem here is the server response time. I am sequentially asking the server to get all the commits for single repo. Because the ‘number crunching’ happens on the server side, the github client is waiting for the response. This wait time is wasted. Instead of this approach, I could make multiple requests. That for sure will speed things up. It could be done with threads but this blog post is about Akka so lets do this using actors.

The pseudo code for new solution.

  • Create one actor that does a request for all the public repos associated to my user.
  • For each repo create a child actor that will do request getting all the commits.
  • All the child actors will inform the parent actor about the number of commits in the repo.
  • Count the number of commits received by the main Actor.

Graph of Actors

The Code

  • line 3 – ActorSystem is a root for all the stuff related to actors. It does a lot of different tricks behind the scenes and its something like a base actor for all the other actors.
  • line 5 – Creation of MainGithubRepo. Never ever create actors using ‘new’, always use ActorSystem or Context ( from withing the other actor ). Props object is a concept of a blueprint with instructions on how to create actors. In this scenario it is just a boilerplate code but Props can be used to share actor specification across different ActorSystems, this system can even be on some other machine. It’s a concept simillar to DockerFile or VagrantFile. ‘ReporeadingActor’ parameter is a name for my main Actor. Always name your actors accordingly.
  • line 7 – To start actor, I need to send a message to him. I am sending null because this actor doesn’t support any customized command. You can image here a list of commands like ‘start’, ‘stop’ that could be used to control the actor.
  • line 9 – Await Termination will block main thread until all the actors have terminated.

Repo Reader

  • line 1 – This Actor inherits from ReceiveActor. This is a special kind of actor that has a nice ‘this.Receive’ convention to write its logic. There are of course all the different types of actors.More info on Receive Actor
  • line 3 – for ReceiveActor, all the logic is implemented in constructor.
  • line 5 – The first thing to do is to define child actors. One of them is ‘WriteToConsoleActor’. This a special actor that just writes the messages to console. It is potentially unnecessary logic but just to show some general idea I have it here. I could create a list of different actors that write messages to different places.
  • line 7 – Then I create commit reading actors. I want to create one actor per repo. My Github account currently have 31 public repos. In here, instead of creating one Actor, I am creating a collection of 20 Actors.
  • I used ActorRef in the code instead var to show what is ActorRef and what is created when creating Actors. No matter of what type of actor you create and it doesn’t matter if its a single actor or a collection the result is always ActorRef. This is an object that is close to concept of ‘pointer’. The main Actor parent, doesn’t have to know what is behind the ActorRef he is just sending a messages and awaits a response, from something behind ‘pointer’. This is a very awesome way to handle this. This ActorRef can also point to different machine / server. A neat abstraction.
  • line 18 – I am getting all the repos then send a message to ActorRef. As you can see the parent doesn’t care what will happen with the message and whats behind it.
  • line 26 – At the end I am awaiting responses of type int. My commit reading actors will notify this parent back with a number. Those numbers are then counted and there is the result.


This is a simple actor that just writes the received messages to console. NotifyUserMessage is just a dto with Message property.

Commit Counter

Commit counter just gets the list of comments, then sends the parent the number of commits.

Using Akka counting commits took – 0.72 minutes.

This example is simple and there are all the different problems and quirks with it. For instance:
- What will happen if there is a connection issue ?
- What will happen if i will use my request limit in github api ?
- How to handle some orchestration ?

Those and other problems I will describe in another post. For now this is a simple example that i used to start exploring the Akka world. This technology is quite promising and i am happy that awesome team lead by created it. Thanks to that i don’t have to learn Scala to use it.

Boost your dev productivity with cmder + ConEmu

Unix world and awesome tmux

In unix world there is a nice ‘tool’ ‘tmux’ - terminal multiplexer.

With ‘Terminal Multiplexer’, you can nicely split up screen and have multiple terminals visible in front of your eyes. While working with python, on one of the screens I had vim running, then there was a screen for interactive Python plus small terminal to issue git commands. I could easily jump between ‘screens’ and also have different work spaces hidden behind the tabs. This setup can be then stored in the file and loaded up on demand. It provides a similar functionality to *.sln and *.csproj files in Visual Studio, but without big IDE that tends to crash and have a painful start up speed.

It’s a pretty neat tool to work with. The user experience is something you need to get used to, but if you are spending some time in command line world, the learning curve won’t be that big.

Windows world with cmder / ConEmu

In windows world, a single window with cmd.exe / msysgit running is mostly all you need. There is a powerful Visual Studio ( with Community edition we don’t even have to worry about complex MS licensing ). Using VS and it’s extension you can just use GUI like interface to do many different tasks. I was surprised that some of my colleagues, for git management, do use either VS extension or SourceTree (recommended). I am using mostly cmd line + git gui.

At JustGiving we are using chef to maintain our infrastructure code, I also need to modify varnish files from time to time. I could do all of that in Notepad++ or even Visual Studio, but in my drive to become ‘friends’ with cmd line i really got used to the ‘gui-less’ world. I don’t want to say that this approach is a must have for productive work, because it would be a lie. Gui interfaces are fine and great, it is just a matter of preference.

Tmux on Unix made a great impression on me and I wanted similar experience in the MS world. First stop, running tmux on Windows. It is doable, cygwin environment gives you that, but colleagues at work showed me a better tool - cmder. Cmder is an extension for ConEmu which is a console emulator. After some configuration it looks like this. Pretty neat eh ?


My current config has 2 tabs.

  • 1st with vim instance running, to edit notes stored on dropbox  
  • 2nd with vim for editing files and coding + 2 msysgit instances and 1 cmd line running

This setup gives me a nice environment for editing files not related to Visual Studio and .NET. Another neat functionality are customized Tasks. I am using those to store different project workspaces.  One task equals one workspace. Thanks to that I can easily start another ‘project’ and initialize it by opening specific folders and specific files in Vim. It is a lot faster than doing everything manually.

To get this setup:

  • Settings -> Startup -> Tasks
  • create new predefined task with + sign
  • And add this code

What does those commands do ?

1. Creates new screen and opens Vim in my Dropbox folder context
2. Creates new screen with Vim pointing to D:\
3. Initializes shell in new window and splits current screen into 75%/25% Horizontaly

4. Initializes shell in new window and splits up the existing window into 33.3%/66.6% Vertically

5. Initializes shell in new window and splits up the existing window into 50%/50% Vertically


I have barely scratched the surface of the ConEmu and cmder awesomeness. Its functionality is more powerful than just split screen functionality.


Jakub Jedryszek asked a couple of good questions:

How to install cmder as an extension to ConEmu ?

It is simple. Standalone version of cmder already contains ConEmu. Installation is simple, download, unpack run ->

How to configure vim with plugins on windows and which version to use ?

You can install GVim which is vim with Gui-like interface for Windows. One of the plugins in the screen is NerdTree. To install it you just need to copy paste this file NERD_tree.vim to C:\Program Files (x86)\Vim\vimfiles\plugin. If you have multiple plugins then pathogen.vim is also recommended.

For starters with vim, it is better to start with vim-tutorial then move to vim as a Notepad replacement. Another step is VsVim. It is really a great, stable extension for Visual Studio that plays nicely with R#. I have been using VsVim for past 3 years and it was always great. I am also using Vimium which adds vim like feel to Chrome.

Are you using vim to amend / create commits description in git ?
If you have msysgit installed and you use cmd line then by default you will use vim, and yes I am using it 85% of the time, around 15% is done with git gui and rarely tortoise-git. Tortoise is mostly handy for git history checkup or blame, but lately it has been replaced by github :)


It is recommended by Maximus5 to update ConEmu to new version. Current cmder contains ConEmu version 140707(preview) while the newest ConEmu is 150309.
List of changes is massive.. To update ConEmu, get the new package from and copy its content to ‘your cmder installation’/vendor/conemu-maximus5 folder.

More Links:

  • ConEmu docs

Docker here docker there docker everywhere – Getting started with docker in .NET with F#

If you are in IT world, you surely heard or read about docker. There was / is a huge hype about this technology. It looks like this one might actually survive the initial ‘It’s awesome phase’. I was looking for some info about docker. It was confusing to get to know what docker really is. Too much marketing buzz words everywhere. In this post I will sum up all my notes about how to start with docker in .NET and F#. It will be like learning journey that might end as a simple tutorial on where to start.

Docker ? 

My first encounter with docker was through simple tutorial . It’s a online interactive shell emulation that lets you execute some of the commands and get the basics of docker. Sadly, after finishing it you are left out with more questions than answers.

You can start by reading official site docs. The most important thing to note is that docker is a kind of a runtime that enables you to create images that you can run on top of it.This concept is just like Virtual Machines, there are however differences. Docker is not creating full complete OS instance, instead it is creating lightweight containers that do share the kernel but are still isolated and separated from each other more. This process is more efficient both in time and memory space. It is easier and faster to create smaller containers instead of full VM’s. There are however some cons, you won’t get full isolation but who really needs that ? Other problem is … Windows is currently not supporting those small containers, we can only run Unix beacuse docker is using ‘Linux Containers‘. You can still run docker on Windows, but you can’t create windows images. Microsoft promised to provide this support in new Win version.

Running Docker on Windows

To start using docker on windows go to – Boot2Docker is all you need to get started. This tool will install VirtualBox, configure small Unix VM that you will use docker from and there is also a nice utility tool that will connect you to your virtual machine.

Boot2Docker is a little unstable, while testing I encountered one issue with never ending docker loading. It looks like there are some with issues – . I had to reinstall Boot2Docker multiple times to get it working.

F# + docker

I want to create my first simple image that I will be able to use and write some F# code, compile and run it.There are existing images with F# that you can just download and start using, but in order to learn I want to create my own image. In order to do this I will define a docker file with set of instructions that define how to construct an image. Those instructions are stored in DockerFile without extensions or dots. Thankfully Boot2Docker does have vi on board so I can use it to create this file.

1. touch DockerFile – will create me a file

First instruction would be to get me a Unix distro that I will run everything on top off.

2. To build image

Yey it works, behind the scenes it gets the debian DockerFile and goes from instruction to instruction creating a debian runtime. I could possibly write my own ‘debian’ image, but that would involve me learning about how to build Unix distro. Instead of that I can just point to external image and build on top of it. That is one of the beautiful things about docker. You can mix / match different images and build more complex ones using the basic ones.

3. In order to compile F# app i will need mono and fsharp compiler

-y – “Always Yes” so if there is any prompt in ‘apt-get’ installer just say yes
-q – Quiet – makes the log less verbose

4. Building image

I got some errors from apt-get missing packages and the logs says to add – ‘apt-get update’. This is supposed to update the ‘apt-get’ list of packages.

‘sudo docker build’ – and couple minutes later you should have a nice image with debian + mono + fsharp.

5. Switching to more specialized image 

Sadly in my case I got lot of errors while downloading ‘mono-complete’. Instead of building mono on my own, I have decided to change the base image and use some Unix distro with mono on board. Running ‘docker search mono’. Gave me a list of all the potential images, I decided to use ‘mono’.

Notice that I installing vim, I need some basic text editor to create first F# hello world app.

6. What now ? - Starting container
I have base image, there is no container yet. What is a container you may ask ? Container is a running instance of imageTo start interacting with container, you need to start some app on it. Most basic one is interactive shell, that will also enable me to work on top of container

7. Testing out F#

Lets see if fsharp is here fsharpi should start F# interactive.

Yey, it’s here. To exit just type quit#;;

8.  Creating folder + hello world source file

I need folder and hello.fsx file

9. Hello World App

10. Compiling app

11. Running Hello World App

Uff, done. That wasn’t that hard. Now, you might ask so what ? You just compiled Hello World app … I can do this on my local machine, yep but this brief tutorial is just a starting point, I have started exploring docker, because, I want to play with and F#. In next posts I will post more things about how to use docker to create multiple akka actors and how to write some simple distributed app. That will be fun, cause it is a new world for me. Docker is more complicated than that. It is quite sophisticated and you can create complex images with many dependencies


You can use vagrant with docker
Docker Misconceptions
Pawel Sawicz just send me a nice link with some anty-hype opinion about docker
Another nice link with some docker problems + a solution 

Fuel your personal growth with feedback

TL;DR; Feedback is crucial for your career. Be proactive, get out of your closet and ask for it!

Last week, I have read Michal Sliwon post “A recipe for a happy software development team”. It’s a great read with some eye opening thoughts. I encourage you to read it.

One of the things that stood out for me, is how Michal and his team use feedback. As chance would have it, 2 weeks ago I asked for a feedback in my Company. It has been a year, since I joined the team. Surely, that’s enough time to tell me if I am a good team player and problem solver. In a year, you can make just enough mistakes, and good stuff too, to show who you are.

Before I started in IT, all the feedback I got were ‘grades’ at University / School. Grades are fine if you need a system for fast evaluation of multiple people but it always felt naive and ‘not enough’. How can you evaluate someone based on simple predefined grade system ? How can you help someone ‘find the way’ using this system ? I always imagined that on Uni, I would have some 1-on-1 meetings with teachers or at-least someone will try to mentor me. Nope, education system is like a factory. You get in, you get out and in the end you enter the dangerous world of grown ups, not knowing the importance of giving and receiving ‘Feedback’. Some people are even expecting similar grade systems in workplace. You know do this and that and you will be there ? There are some companies that are very transparent in their ‘promotion’ system ( Buffer, Fog Creek Software ). That’s just compensation systems, even with it there is still place for proper feedback process. Btw, I am all into transparent workplaces, this is the way to go. Lack of feedback greatly lowers your chances and negatively affects your growth. By growth, I don’t only mean career related things but also your growth as a human being.

In my first company, I was quite keen to receive my first feedback. Being a Junior Dev felt like a little kid in a maze, not knowing really what is happening around you. Feedback was important to me, I was waiting for it. Now, imagine my surprise when I got no feedback at all. And so you work without any guidance, trying to figure out on your own what kind of ‘team-player’ you are. There was one message, company did not fire me so, “hey they have to be happy right” ? Wrong! Approach like that is similar to grading system, it’s not enough. What kind of lesson you can get from just knowing that you are good enough to stay at your company ? Probably none. Back then I was just a ‘kid’, having proactive attitude was something completely alien to me. I was hoping that my first manager, would be my guide in this dangerous world of all these grown-ups and their politics. Sadly it did not happen. I felt betrayed and started managing career on my own. Yeah you can do that to a certain degree, but it’s not the same. You can’t evaluate yourself. Your point of view is flawed. You know ego, ego, ego. There is also impostor syndrome which causes different anomalies and can affect the way you are thinking about the world. So in short you need feedback from someone else. Now, I was lucky, I found mentors in the community, in form of books, blogs, I have talked to people on twitter, facebook, meetups etc. but it would be a lot simpler if I would ask for feedback on my own. What’s the lesson here ? Being pro active is really crucial, no one will manage your career for you. Get out of your closet and ask for Feedback!


So much talking about feedback and there was no why. Here it is.

1. IT is changing really fast, you can’t keep up with all these technologies. Ideally me and you, we would have a lot of time to research and explore various technologies, but yep time is a limited resource and we can’t do everything at once. But hey two heads are better than one. Having someone who could give you some feedback about various techs is really beneficial.

2. Technical expertise. You can’t be an expert in all of the technologies. Having someone, somewhere with experience in certain technology can save your time and money ( and hundreds of ‘F’ words for sure ).

3. To consider yourself as a mature person, you need to ‘nurture’ your personality. Yes, It is a hard, long process, you might not even see the changes. That’s where you need external feedback. Ideally someone close to you. Friend ? Team-mate ? Friend can influence you personal life while team-mate can pinpoint career related stuff. For instance if you are dreaming about becoming senior / tech lead or architect, ideally you would find someone in this position. Hist tips and suggestion will speed up your growth into that position.

4. Life is full of dangers and those dark caves that you don’t want to go in. Having a mentor and guide that could give you some feedback is really beneficial. Imagine how much time and effort you would save if someone would told you that some route in career is a waste of time.

5. Getting feedback is a great way to learn how to give feedback. This can lead to awesome opportunities to meet intelligent people. If you are a person who is pro active in giving feedback, there are people that will greatly appreciate that. In the end you can gain contacts, friends, new opportunities. We are a social creatures and building your personal network is one of the most important things in your career.

In next post, how and where to get feedback ?

Little fix. In next post, I will write about how to get feedback and where to look for it.

From 2014 into 2015 – tech plans

A lot has happened in the last year 2014.

  • I moved to London which was not that easy task. Moving abroad proofed more difficult than, I thought and those estate agents … I don’t want to start.
  • Started working for an awesome company JustGiving. I am glad and happy that, I can work with so many awesome people on projects that have an impact. It is really good to work for Tech4Good company.
  • Finally, I invested heavily into learning about functional programming.
  • Spent a lot of time organizing my TDD knowledge, couple of books + one nice workshop with Roy Osherove.
  • I did some talks in Polish / English dev groups.
  • Organized with Pawel and Jakub.

What I want to do in 2015 ?

  • Again, functional programming all the way. This is the ‘thing’, I want to go for now and see what happens. It was really refreshing to learn about it and use it in some practical projects.
  • DDD, I need to gain more knowledge about it. It was always there, I have read blue book by EE but I think, I wasn’t mature enough to really grasp it. I have heard good things about Implementing DDD by VV, probably will start with this book.
  • Speaking activities, I need to do more speaking to learn from my mistakes and get better.
  • Artificial Intelligence, AI will be a great source of problems complex enough so that, I can use functional programming with it. I always wanted to start learning about AI, it is something that really interests me, apart from history and sci-fi. Will see what happens, I have already started last year by refreshing my knowledge from uni and gaining little ‘foothold’ in this broad and complex subject. You will see some posts about AI for sure.