Saturday 15 June 2013

NDC Oslo Day 3, Part 2

...and here's part 2 of day 3.

"Uncomfortable with Agility: What has Ten+ Years got us?", Andy Hunt

Andy Hunt is one of the co-authors of the Agile Manifesto.
This also was a very good talk. He started by asking if we did agile. All raised their hands. "You're doing it wrong!" :-)
It's a bit hard to retell this session though, don't know why but I think I was too busy listening instead of keeping notes... :-) But I'm going to try to capture some things in essence.

He came back to his question of how many thought they where doing agile. Then he said "You don't do agile, you are agile!"
He also quoted Charles Darwin: "It is not the strongest of the species that survives, nor the most intelligent that survives. It is the one that is the most adaptable to change."
And this was the essence of what they where trying to tell with the agile manifesto. And he thought that, maybe, "agile" wasn't the best word for this. Maybe they should have called it "Adaptable" or something.

Because Agile is:
  • ever-shifting
  • ever-changing
  • ever-responding
Agile is not a thing. When they created the agile manifesto they thought that millions and millions of different method would emerge. But now there's just a handful (Scrum, Kanban, Crystal etc). Agile is not one method.
  • We want to be searchers - not planners!
  • We want to learn - not know!
With agile development we use feedback to constantly change: Do - evaluate - correct.
It's like "live tracer bullets" - you see in real-time where bullets are landing, and adjust to hit the target.

How do you get real-time feedback?
  • Coding: Paring, TDD etc
  • Design: Try it!
  • Requirements: constant user involvement
  • Teamwork: stand-up meeting
Seek and apply feedback to change things! Become a searcher!

Un-agile warning signs:
  • You should value: "Individuals and interactions"
    • "Great! Which process and tools should we use for that?"
  • You should value: "Working software"
    • "Great! Which automated spec framework should we use?"
  • You should value: "Customer collaboration"
    • "Great! How Much should we commit to in this sprint?"
  • You should value: "Responding to change"
    • "Great! Let's build a 200 story backlog and follow it!"
The biggest missing element:
  1. Agree
  2. Add
Think of it as an improv theatre. If an actor says "I like it here on the moon!" the other actor cannot just say "Yes" (or "No"). Then the entire improv dies. He has to add something to it for it to become a valuable improv. "Yes, and I can see a frog behind that stone!" and the other actor continues "Yes, and..."
So, remember "Yes, and..."

One other thing he said is that agile is like crumbling papers: "No, this didn't work *crumble*. No, this didn't work *crumble*. No, this didn't work *crumble*." and so on. Always try new things, evaluate, correct.

He had a lot of other things he said as well (that where really good), but these things caught my attention.

"Why Document Databases supercharge your application development", Christian Amor Kvalheim

He didn't show that much code in this talk, it was mainly a conceptual talk of Document Databases (DD). And it was a really good pitch for using DD. I was a bit sceptical, but now I'm really keen on trying this. The thing I was sceptical about was that I thought I would miss the entire "relational" thing with DD. But he showed some nice concepts about that.

First he talked about that the world is not a structured place, it's actually very unstructured. But we try to impose structure. But DD tries to capture that unstructured place...
So if you find yourself doing (a lot) of ALTER TABLE or using key-value-pairs to go around it. Then DD might be the answer. 
But mainly DD maps better the object oriented thinking.
Then he talked about ORM (Object-Relational Mapping). And he didn't have to convince me here, I basically "hates" ORM :-)
And as Ted Neward said: "ORM is the Vietnam of our industry"

Thing he thought where ORM cracks:
  • When using polymorphism.
  • Ownership of schema is split
  • Duplicate/Partial schema (in DB and in code)
  • How to abstract away SQL
  • Partial objects problem
    • Lazy loading and stuff like that
But how do you solve relations?
  • One-to-many:
    • Embedded: relations inside object
    • Normalised: use id's in object or let other object point to one object
  • Many-to-many:
    • Keep id in both objects (pointing to each other)
Inheritance and polymorphism. Don't have to say much here, you know it, this is where DD fits.

He also talked about that the Document Model is good at representing tree structures. And he showed some example json code to show this.

He listed some helpful tips:
  • Avoid
    • DD as a relational database.
    • Application Joins.
    • Massive documents.
      • Continuously growing arrays.
    • Wrong level of granularity (to low/high).
      • It's just like a REST API (lots of small calls is a sign of wrong level).
  • Good ideas
    • De-normalize first.
      • Map your document to your OO model.
      • Normalize as needed.
      • You have to know DD (not only OO)
        • Just as you have to know SQL even though you use an ORM tool.
I asked him about reporting. And yes, DD isn't as good as a RDB at doing application joins, but his tip was to export data to a data warehouse. 
My thoughts are that no method is better than the other. RDBM have a purpose. But I like the idea that DD better captures the unstructured world we live in. And that it is good at representing tree structures.

NDC Oslo Day 3, Part 1

I'm gonna split this post (day) into two posts since I didn't have time to write it at my hotel room. I had a plane to catch :-)
Remember, this is a brain dump so there will be typos and spelling errors. So, day 3...

"TDD, where did it all go wrong?", Ian Cooper

I really, really liked this talk. There are a lot of debate going around if doing TDD is "right" or not. Even at Active Solution. And this talk really got me thinking. For me, I think the main problem is that we confuse TDD with unit testing. And some people really help creating this confusion. For instance Roy Osherove's "TDD StringCalculator Kata" http://osherove.com/tdd-kata-1/. He says "TDD Kata". It's not a TDD Kata, it's a "Unit testing Kata"! Big difference! And I think most people start to dislike TDD when they really dislike unit testing. And we have missed the point of TDD. Dan North tried to correct this "error" by trying to rename TDD to BDD http://dannorth.net/introducing-bdd/. But it kind of "failed" because then tools like Cucumber (SpecFlow), NBehave, RSpec emerged. And they aren't really necessary (they usually tends to fail instead) - if you do TDD right (BDD).
Well, enough of my own thoughts. But it really got me thinking. Mainly because a have had some dislike for TDD - and now I know it's because I got it wrong. I was taught wrong.

If you want to some of Ian Coopers thoughts, read this Avoid Testing Implementation Details, Test Behaviours. His talk was mainly about this (as I got it). He also referred to the "goodness" of Kent Beck's book Test Driven Development

He didn't show any code, he talked more about philosophy around TDD. But it would have been really great to see some examples of what he really meant.

The problem
  • Smart devs don't want to write tests.
    • Why? Are they wrong? No!
  • Tests break.
    • And you spend a lot of time fixing tests instead of writing implementation code.
  • Writing more test code than implementation code.
  • Lean start ups wants to drop test first code.
  • "The duct tape programming" is winning ground.
  • Tests are difficult to understand
    • Because the test is broken
  • ATDD (SpecFlow, Cucumber etc) is not working
    • Customers are not involved (interested) and developers become mostly frustrated.
Where did it all go wrong?
He talked about this (hard to retell really well though).

  • Avoid testing implemenation details - test behaviours
    • Not a test-case per class. Test requirements.
    • Test outside-in
    • Only write tests to cover the implemenation details
  • What is a unit test?
    • A test that "runs in isolation" from other tests - not the unit under test!
  • Red-Green-Refactor
    • Go green as fast as possible. Make whatever sin you need; Google, copy-n-paste, duplicate code etc. Quick green excuses all sins! Be sinful! Speed triumphs design!
  • Clean code
    • Refactor. Now apply patterns
    • Don't write new unit tests here
    • Don't introduce public classes
    • "Dependency is the key problem in software development at all scales" - Kent Beck
      • Eliminate dependencies
    • Test behaviours, not implementation details
He then talked about the famous "tests pyramid": http://watirmelon.com/tag/software-testing-pyramid/ Not gonna retell it, you all know. 

But he then talked about Alistais Cockburn's Hexagonal Architecture. The Pattern: Ports and Adapters. And that we should only test the "API" of our system. A test is just another "adapter" running our code. Something is using our code, something wants something out of our code - that's the "adapter".

He then talked about ATDD
  • TDD tends to be "programmer tests"
  • ATDD i about communication with customers (and team)
    • Actually you don't have to automate those tests at all, just having the conversation solves most problems.
  • James Shore stopped using ATDD since customers are never really interested, and developers tends to hate it (in the end).
  • Use TDD as ATDD - test behaviours.
    • SpecFlow or RSpec is not the solution, use TDD correctly instead.
BDD
  • BDD was an insight (by Dan North) that we misunderstood TDD.
Mocks
  • Don't mock your "internals" or privates
  • Mock other "ports" or other publics (se Cockburn link above)
  • Don't mock "adapters" (Cockburn link above). The test is an adapter.
Here the time ran out... :-(

But as I said, I think we all have been taught TDD wrong. We haven't been taught TDD, we have been taught unit testing (with test first approach) and then someone called it TDD. It's not TDD. Roy Osherove's TDD Kata is not a TDD Kata - it's a Unit testing Kata - big difference!
And if you don't like TDD, it's probably unit testing you don't like. And not liking unit testing is fine, you don't have to do unit testing, if you don't want to. 
But try TDD - as it was meant to be!

"Value of Unit test: way from good design to easy maintenance", Katya Mutafina

Katya worked at some oil company in Norway (I think, didn't listen carefully to the "sell talk" :-)).
I went to this session since the previous had "whetted my appetite" :-)
But this was not what I expected. I should have left the session, but I was sitting in the middle at the front row in a small room... But the one hour session only lasted 30 minutes... you get it...
Anyway, she talked about how to write good tests. But it was a bit too basic for me. She mainly talked about using Arrange, Act, Assert in tests.
What I liked was that she called it "unit testing" everywhere - not TDD - see the previous session.

"iOS with C# using Xamarin", Craig Dunn

Craig was an technical evangelist at Xamarin.
Summary first. I had heard a lot of talk about Xamarin. But after this talk. I'm not impressed. I think they have got it all wrong. But I'm glad anyway, now I know I don't want to look at Xamarin. Why? If I want to develop an iOS app (iPhone, iPad) I would rather learn iOS dev instead (Objective-C, Xcode etc).
If you don't know Xamarin (like me) here is some basics from the sessions (it was mainly a live coding session).
  • Xamarin created native apps (iOS/Android/Window Phone).
  • Entire iOS SDK is directly accessible.
  • You can add your own Objective-C libs as well.
  • It's based on Mono.
  • It exposes iOS as C#.
  • It's a compiler.
    • Produces native ARM binary.
Here is the setup:
  • Install Xamarin and Apple Xcode
    • Xamarin has a plug-in for Visual Studio o you don't have to use Xamarin Studio. But basically: use Xamarin Studio (with all missing features compared to Visual Studio).
  • You also need a Mac (with Apple Xcode) somewhere on the network (well...)
It all seemed a little bit too complex...
And at the live coding it was obvious that you need to know a lot about iOS development. Because everything is just exposed as C# (and I saw an "IntPtr handle" in the constructor, well...). My feeling; learn iOS development directly instead! It's probably not harder to write C# than Objective-C. Not much harder anyway.
The benefit? Well, you can share some common code in one place. And yes, that's a benefit. But the threshold of learning iOS dev is still there, so I don't think I will be using it... Or I will learn Xcode and Objective-C instead (without the painful, probably not working, setup).
My opinion of what they should have done. They should have converted everything to .NET application development patterns we are used with. Basically like Microsoft did with WebForms; make it look like WinForms!
That almost became a rant :-) But I did not like this session.

Part 2 in next post...

Thursday 13 June 2013

NDC Oslo Day 2

Promised day 2, so with no further ado, here it is. Oh, just a disclaimer for all typos and stuff (as yesterday), because I'm keeping this as a fast brain dump...

"Hacking .NET (C#). An unfriendly territory", Jon McCoy

Jon is the hacker in the .NET community. And hell, he knows what he's talking about! And this was a very overcrowded session. People sat everywhere except on chairs :-)
He must have done this talk a lot of time, because he had a lot of advanced slides and said an awful lot of things, but everything went very smoothly and natural. It was like it was very, very well rehearsed but I think it was just plain experience (and knowing what he talked about).
This was part one of a series of two sessions.

Anyway, check out his site http://www.digitalbodyguard.com/ it has a lot of cool stuff and tools (for free!) when it comes to hacking (and really learning stuff). And he said that the talk wasn't mainly about hacking, but how these "hacking techniques" can be really useful in everyday work as well. He more liked the word "bending stuff" than "breaking stuff".
He talked more about .NET as a concept and not as the framework it is. And that .NET really is an open standard.
Here are som basic tools he used during his talk and that can be downloaded for free.
  • Gray Wolf (decompiler editor)
  • CompileSharp
  • Gray Dragon (attacking an app tool)
Basically what he said was that anything is possible with .NET! And fairly easy to do as well. More on that in the next session review.
He also talked about securing your own computer. Since everything can be broken  - bended, sorry - and there is nothing you can do to protect yourself. That's the awful truth. He told us he could brake anything. But his methods of having lots av VM's for different purposes (one dev, one Internet and so on) and then crypto those VM's seemed a lot paranoid and not very pragmatic.
He then also showed some cool IL commands to use when injecting/editing IL code.
Before om demos he talked about the difference between a hacker and an attacker. Hackers mostly have fun. Attackers wants to steal something for own (or others) purposes. Basically they have different motives.

For the demo he had a .NET app that allowed him to load other apps and then he moved a button from one app to another app(!) - and the button still worked exactly the same!! And this was just like 10 lines of code (he said, never showed).

(Part 2) ".NET (C#) Application Code of the Hacker", Jon McCoy

This was the coding part of the "hacking" sessions. Awesome (and very scary!). And just as crowded as the previous talk.
All demos he showed are supposed to be available at http://www.digitalbodyguard.com/. Haven't checked though...

He started by creating and running some low-level assembler code (byte array) in .NET (C#). And since you can do that, you can do anything. If you can load (create) and run assembler with .NET nothing can stop you. Why not load (and modify) that legacy C++ compiled code from -96 and run it in your app the way you want it to work? Cool (and scary).

He then showed a demo where he was able to modify the JIT and then remapped functions, store them and then later put them back. So you can pretty easily take someone else app and make it do other stuff, or stop it from doing stuff - in runtime! If you want to you can also shut another app down (bypassing all exceptions). How? Just inject some endless recursive code. .NET hates endless recursive code and just ignores everything (like exceptions) and shuts down.

He then also showed some cool stuff with reflection. He demoed where he could load another assembly and make the login successful. But really no news there, it's just reflection.
But he showed something way more cooler, he took the same assembly and made all privates public (with the help of Gray Wolf, see previous session). And then he could use the same assembly and use it as an API instead of using reflection. Can actually be very useful! :-) And as a side note. Gray Wolf handles both obfuscated code (deobfuscates it) and also signed assemblies, it's all taking care of. He he he :-)

He then took his computer's biometric software and modified one assembly (with Gray Wolf) and injected some code (IL) where he could show a MessageBox with the admin password.

The only "problem" here is that he knows way more IL than most of us - I mean a lot! He said that he sometimes writes entire apps with just IL(!). And he also knows, deeply, how the CLR works. And he also know a lot about assembler programming. And that is really helpful when it comed to hacking stuff.

But, bottom line is; anything can be broken! And you can't protect yourself against it. You can make it a bit harder, but that is really time consuming, and eventually it will be broken anyway - if somebody wants to.
There where a lot of questions afterwords about if this was true or not, and if there where nothing you can do. The basic answer everytime was: no.
All with the power of .NET.
Long text about this session. Sorry about that, but it was really cool stuff!

"The JavaScript Inferno - A decent into the Client-side MVC Netherworld", Rob Conery

This was a live coding session. And those are always hard to retell. But it was a really good session.
He built an app, side by side, with Knockout, Backbone and Angular. Just to show the differences between them. Really helpful to see. And he wasn't too opinionated as well, he showed both what he thought was good and what was "bad". They all have their pros and cons.
My opinion, after the talk, was that Angular works really well with MVC WebAPI (and node.js) as it has a wrapper (abstraction) above the jQuery ajax (Angular actaully includes a jQuery light version) for doing RESTful programming. That's cool. And Knockout works, probably, a bit better with regular ASP.NET MVC apps as it is used with (if you want to) regular jQuery ajax.
He also emphasized that these frameworks are really good and simple when it comes to doing simple stuff. But when things get complicated, these tools become very compilcated as well.

"Make Impacts, not Software", Gojko Adzic

I love Impact Mapping! And I know a lot about Impact Mapping. I have read the book, I have had internal and external presentations about this. But I just had to listen to Gojko :-)
And how I loved this talk! This talk alone was worth the trip! :-) And it actually made me think about Impact Mapping in a little bit different way as well.

He started by talking about "declaring victory to soon". Victory is not when software is shipped. But we usually tend to see it that way. What does "done" mean? Really!?
He took the Vasa voyage as an example of declaring victory to soon. We have but the ship into the sea. But was that success?

He then talked about "negative metrics". What is that? Well, what doed low test coverage tell you? It tells you something is bad. But what does high test coverage tell you? It might not tell you anything! Negative metrics. Or measuring velocity. Low velocity is bad. But is high velocity good? It may not! It's a negative metric.

Then, the best part, that really struck me: he spoke about almost the same thing as Allan Kelly did on day 1 (see my previous post). Failing fast and survivable and learn from your mistakes. Impact Mapping helps you with that.
If you have a real road map (like Google maps) you can see that you have a lot of other roads you can take if one road is closed or if we missed the turn. And you can do it easily and fast. You want that with your project as well! That's your impact map.
It's like using a GPS. "Where is the next turn? How far away is it?" When do we get there?" And we wont drive all roads to get there, we just want to get to our target as fast as possible.

He then spoke about user stories, and why they often miss the target. Take the following sentence (from a common user story): "In order to monitor inventory". Sounds okay? No! It's not good! Why? Well, doesn't he already monitoring the inventory? Probably. He/she can just go down and check the stock, he/she can read all the papers. The story isn't telling why we should build anything. Instead, write: "In order to monitor inventory faster". Now that is a change! Something must be done faster, then you save money! It becomes useful. And if he/she doesn't do it faster (or even slower) - then stop spending money on this thing! Doing something faster is our next turn (as in the GPS).
And Impact maps helps us create options and visualize assumptions. We can't know in advance if something will succeed (checking inventory faster). And it helps us test an assumption faster and cheaper - by creating options!
Take this example. A manager thinks that his online game will be more successful (more player will play) if you develop Levels & Achievments. That's estimated to about 9 months of work. "Why do you want this feature?" "So players can post their achievments on facebook." "Okay, you think that players posting on facebook will get others to start playing?" "Yes.". Okay, here is the impact map for that.
But, do we know this "road" exists? Will this succeed? No, we don't. It's an assumption. Okay, so how can we prove this "road" works by testing it faster and/or cheaper? Why not create Tournament winner? That's about 6 hours of work instead!
And it turns out that this didn't lead us to anything. "The road was closed or didn't exist". We didn't get more players. And by creating options (Tournament winner) we could prove that posting stuff on facebook did not lead us to the goal. And we proved it in 6 hours instead of 9 months. Now how about that!
So fail cheap, and fail fast. Impact mapping can help you with that! 

Wow, that's a lot of text. But this is a favorite topic for me :-)

"Web usability on a Budget", Tim G Thomas

Usability is a bit of my special interest as well, so I had to listen to some usability session...
Wel, he first started talking about what usability is and isn't.
Words used to describe unusable systems (often by users): "Frustrating", "Intimidating", "Confusing".
Words used to descrine usable systems: "Pleasing", "Inviting", "Clear" (the opposited basically).

Often in large projects (like 30 people working for years) we already have a lot of roles (visual designers, UX designers, UI designers and so on) and design principles  But what about small projects and teams (like two developers)? You basically just have one role: developer. But there are some basic design principles you can use.
He showed http://www.zenpen.io/ as a great example of a very simple word editor that really just focus on writing text. Try it out. It is really cool.
He also showed https://www.neonmob.com/ a an example of how poweful it is to use the user's language. Don't call things with technical terms, use the user's language. Say "attachments", not "upload". Don't say "Save" - what is that anyway: "saving something", when do you do that in real life? Perhaps you are "filing" things, then use that word.
He said one little interesting thing. You know all these "Confirm popups", like "Delete? Really!?". Why not, instead have a button which unlocks the delete button? Pretty interesting thought...

Then he listed some things he thought was useful principles:
  • Follow conventions
    Use logo on the top right, quick menu on the top, search at the top right and so on.
  • Emphasize and deemphasize
    Like in "nudge" the user. He showed https://www.mint.com/ as an example. Use colored buttons to make them "important" (and use the word "free!" - it's a nudge). Also look at the CAPS menu items - they stand out a bit to make them more "important". Cool little tricks.
  • Use "cool" icons
    He actually showed http://manage.windowsazure.com as an example of how icons can be really helpful and remove a lot of "text clutter". Eventually users will recognize symbols. It's like the subway and road signs.
  • Provide affordance
    On the web, we don't have much physical affordance since it's only 2D. Affordance is like: you see a door knob and you know instinctively what to do.
    So, on the web you must make things obvious. Make a button look like a button. Also the "hand" cursor is like an affordance.
Finally he presented som useful tools to help:


"Growing software from Examples", Seb Rose

He talked about BDD, ATDD, Spec by Example and what is the difference? Well, same thing different name  - he thought :-)

He talked about that examples are useful as documentaiton - living documenation (if you automate it), And he talked about using Relish as a source for keeping those.
He then talked about things to consider when using examples (as specs):
  • Ubiquitous language
    It's powerful, because you can use it as a documentation everyone understands (at least in the company, or those using the system).
  • Prefer declarative examples
    Focus on behaviours instead. It's easy to write specs that become to technical and to detailed.
  • Avoid workflow style
    Can be detected by that it usually contains lots of steps in the scenario. Like a workflow to get to the "point". Instead, focus on a single behaviour, and isolate it. Example: "When on the checkout page" is enough. It's unimportant how we got there.
  • Consider costs and benifits
    Examples are not always needed for everything. Consider when it has value and not. The more isolated you can test something, the more tests you can write. TDD - lots of tests. End-to-end tests - not so many. It's like a pyramid.
  • Exercise only as much as needed
    Not always end-to-end tests. Try to isolate things. And avoid UI tests if possible. Try to slice the system into testable pieces. If you test the UI, try to isolate that as well - not testing all the way down to the database.
But bottom line was: You don't always have to automate your tests (examples). The most important thing is the discussion you have (with the stakeholders, or whatever) when writing the tests (and examples).

"Rigorous, Professional JavaScript", James Shore

This was mostly a live coding session. So not much to say. We have, at Active Solution, also watched much of this on his online course: http://www.letscodejavascript.com/
This baically was about showing some techniques on how to prepare your code for maintainability over time. In JavaScript (and node).
One cool tool he showed was the web browser test runner Karma: http://karma-runner.github.io You just launch whatever web browser you want to test your code in (and as many as you want) and the tests will be run in that browser. Pretty neat!

Okay, lots of things to say about this day. My head is filled to the brim. But I think it was a really great day. Learned a lot of things. Mostly I liked Gojko's Impact Mapping talk... :-)

Wednesday 12 June 2013

NDC Oslo Day 1

This is going to be a blog post of three, one for each day. And it's more or less just gonna be a brain dump from my notes during the day. So there gonna be a lot of typos, bad spelling, strange grammar and stuff, so keep that in mind :-). Anyway, here it goes...

Keynote: "The Science of Communities Behind Software", Joel Spolsky

Joel (co-founder of stackoverflow) talked about the importance of understanding the anthropology of a "society" on the webb. Especially when creating a Q&A like stackoverflow.
He thought that you can control what kind of users you want to visit and ask questions (and answer them) - and ask the right questions - by designing the system with that in mind.
He spoked mainly on how stackoverflow worked, and what was the idea behind all the things created and why they where created that way. Like voting, reputation, laws etc. You want to encourage a certain behaviour. And almost shut people off that don't belong on the site.

"Creating Web Experiences with Users in Mind", Divya Manian.

Divya is a product manager at Adobe. Not that great talk and not what I excpected, so I'm not gonna write much about it. But mainly she talked about performance considerations when building web apps. And how browsers work and some tips and tricks to make sure the browser uses the GPU instead of the CPU. Not very pragmatic though. Like "avoid 'display:none'" (??) Well... no! I thought this talk was going to be more of "user experience" in like "user interactions" and UI. And I would have liked to se more pragmatic examples and solutions, not only "problems".

"The abstractions of AngularJS", Scott Allen

This was a live coding session, so it's hard to retell it. But he showed some AngularJS techinques mainly. How to use Controllers, Views, Modules, directives etc. Not that pragmatic I think. I would have liked to see more on when to use which technique. And maybe he should have built a "complete" app (and the different kinds of approaches), and not just some little things here and there.
He also made me beleive that Angular (and knockout) are good at the small "simple" things, but when things gets complicated, Angular (and other MVVM JavaScript frameworks, like knockout) becomes very complicated as well, and probably hard to maintain and understand. But I would love to try Angular more deeply.

"Do it right, then do the right thing", Allan Kelly

This was a brilliant talk by an experienced speaker! And it was kind of mind blowing. So I'm gonna write some more about it. 
He said, himself, that the title should have had a question mark after it - he was not sure this was entirely right, but he had (what he thought) some "evidence".
We have always been taught that it is most important to build the right thing (over building it right). But maybe we should just start building things and then see if it was right or not. Build, learn, evaluate and change (adapt).
The key point here is that it's better to fail fast, cheap and often then to (probably) fail anyway in the end (but do it costly). He compared it to a machine gun and a 19th century rifle. It's better to just fire a lot of bullets at a rapid speed then to take time to aim and probably miss anyway.
So fail often and most important fail cheaply. We now have the tools to do it. Because when you succeed, you gonna be ahead of your competitors. So make it easy to fail.
If failure becomes expensive, you become afraid of failure!
It all actually made me thought of  this story http://www.azarask.in/blog/post/the-wrong-problem/.
He also asked: "Why do cars have breaks?" Answer: "So they can go faster!". You don't want to drive a car with no breaks - or you want to go really really slow. So, make it easy to brake, as well. Stop what you are doing and turn and drive another way.

"Pattern of effective teams", Dan North

I always love Dan North's talks. He is a great speaker and have lots of ideas that are well worth listening to. And he tells them well!
He spoke about some patterns he had seen that makes team work more effective. And he made it very clear that effective is not the same as productive. Productive means "write a lot of code", but that's not important if you can write less code and solve the same thing.
He talked about these patterns:
  • Dreyfus squared
    When you learn thing you move through these stages: Novice, Advanced beginner, Competent (aka Practitioner), Proficient and Expert.
    He then talked about how to combine team members based on which stage they are in.
  • Shallow silos
    It's all about interactions betweeb team members (pairs). Talk to each other. Everyone should know what the other teams are doing. Everyone should easily step outside their "silos" for a moment. And then they have to be shallow.
  • Near and far
    How to mix the "specialists" in a team with the rest of the team, and still make everyone happy.
  • Warm Welcome
    Make newcomers feel welcome. Prepare even before they start, and make them feel like a part of the group immediately.
  • Seize the day
    The most striking thing here was when he talked about daily standup. And that we probably are doing it wrong, it's to boring: "Yesterday I did nanana, today I'm ninini. No obstacles" everybody *yawns*. We don't really care what others are doing. Instead, how can we make this day as good a possible?
  • Code critique
    Do code reviews! Read other's code - and learn from it!
    Pairing and code reviews are different things. Pairing = code quality. Code critique = consistency and learning to the entire team.
  • Hack day
    I liked this. Go play! Eventually some great things will happen! It's how SQL was created, and Java.
    Or maybe have a "todo cleanup day" or something, it doesn't have to be all "play", but jut something you normally don't take time to do otherwise.

"You are not (only) a software developer", Russ Miles

Russ ended up talking much about Impact Mapping mainly. And when I started realising this he said it himself, as well :-)
He focused a lot on not "over production" things and instead focus on the goal, and how we get there as simply as possible.
So, to connect with the title of the talk, he finished with:
Move from being a software developer to a change developer (through software).
Move from delivering software to delivering change.
Well, think Impact Mapping :-)

"Chef for developers", Erling Wegger Linde

I don't know what Chef is. Google it, if you're curious. It's something with amazon cloud service and Ruby. I don't know. I thought this talk was going to be about something else (I didn't read the synopsis). It was a last minute descision (since the talk I was planning on going to was a series of talks and not intended to visit the last part of, as I was going to do). Anyway, I was totally lost here. Should have left the talk, but didn't want to make him (Erling) feel bad. But after a while Scott Guthrie left the talk, and I don't even think that the Ruby guy (speaker, Erling) knew who that guy (who left) was :-)

Well... that was that. A really great day after all. Many thoughts in my head right know.
And well organized conference.
Next blog tomorrow!