OpenSpaceCode review

This was my second time in OpenSpaceCode, and probably feels more confident about giving feedback and getting negatives and positives from those two.
Lots of positive feedbacks can be found on my previous blog;  however improvement starts with constructive feedback, where about I will to write now.
A. Collecting Offers:
1. Fact: Before the conference, MVC was twittered around, so there was a high expectation on it.
Opinion: We should be taking the risk to trade off a session and creating our own session.
Or maybe, we should be asking for volunteers to have sessions. [Did anyone complain about MVC session other than it was a bit fast?]
Or experienced people from old sessions maybe…
2. Fact: On the day, a stock of post-its and pens were given to everyone.
Opinion: Everyone holding a post it in their hand may not be an encouragement for everyone, since people offered sessions were the ones without post-its [maybe a psychological effect]
3. Fact: The number of people was more, but the subjects offered were more popular/general subjects.
Opinion: Last time, the offered subjects were too narrow, following the examples @adean opening speech. I find his words really influential. However, general subjects [generally a few subject on one big one [MVC and spark,] helped people to continue the discussions, and to be in the discussion.
Can’t be thankful enough to the number [46], since lots of knowledge and experience were on board.

B. Selection process
1. Fact: We did not categorize the offers into “difficulty” level, whereas in the first one we did.
Opinion: I think this was because we did not have many alternatives. But this should help people be aware of their “two hours” limit…
2. Fact: We voted for the most popular ones [same as first one].
Opinion: Makes it easy for people to change their session if they don’t the one they have.
3. Fact: Hosts are volunteered; they did not have to be the person who offered.
Opinion: Sessions missing the person who offered the subject sometimes suffered from “why we had this session”, but helped people to nativagate to any related subject they want to go on.
4. Fact: We removed the post-its and stick them onto the doors.
Opinion: Removing post-its from the wall posting to the doors is an agile thinking way I believe, and I like the flexibility. However, we can have bigger post-its, so that we can write host names on them as well.
5. Fact: Some sessions were the same as the old one:
Opinion: We should be asking/telling that we had a similar session last time, telling about benefits
6. Fact: We did not question/eliminate the offered subjects
Opinion: The session I was in was IoC, and it was a wonderful discussion. However, now I feel like it is more proper for an altnet topic…Maybe, the name “OpenSpaceCode” needs some filter on the subjects?

C. Sessions:
1. Fact: Wireless connection setup took some time.
Opinion: This could have been on main first room, at least a small demo, since the guide was a bit confusing…Instead of saying “create a new wireless network”, it could say “add a wireless network connection from wireless network connection properties”, easy?
Since each time, this event is welcoming more and more people, being more direct can help, and assuming next it can be another place…
1. Fact: For some sessions, installation was the session.
Opinion: Yes, it is a way of learning, but preparing yourself for the tool, and not being able to touch it makes you disappointed. To increase usability, an installation package [or a tool like hornget] can be useful.
If these sessions were hold monthly, then the group could benefit from the previous sessions
2. Fact: There was no PowerPoint.
Opinion: Loved the “sharing” and involving part.
3. Fact: The rules applied and there is no expectation from the sessions.
Opinion: This is sad. There was an ultimate goal, having checked the source code into google.code.
I would rather keep the pace slow and give a chance to at least two people checking the code in.
[Still not sure, if everyone knows that they a have Google code account or how to use it, [and yes they are developers, they are clever people…]]
4. Fact: Finding out what to build is hard.
Opinion: We can have volunteers to write some projects, or to search proper/alternative projects from openspace, so that we can start with that example, and modify it through our goal.
We can have a session/day for looking at openspace projects and discuss which ones can be useful…
And refactoring can be another session who wants to enjoy.

OpenSpaceCode and AltnetUK weekend

I had one of my best weekends so far, a weekend with wonderful .net developers. On Saturday, there was Openspace Coding Day and on Sunday
Alt.Net UK Conference. Grateful for EMC Cohango for hosting and Thoughtworks for Sunday lunch.


As open space coding day is supposed to be an unconference, there was no keynote speaker, no PowerPoint, and people were expected to offer a subject that is in their interest zone, without being an expert on it. The fundamental rules are:
– Whoever shows up is the right group
– Whatever happens is the only thing that could have
– Whenever it starts is the right time
– When it’s over, it’s over.

My choices were for IoC with MVC 2.0 for morning session, and MVC 2.0 with Spark for the afternoon session.

For IoC session, Autofac was the main subject to be discussed in the session, and discussed the benefit of IoC and why should we use?
After two hours, we could not find the reason that every project should use an IoC tool, i.e. Autofac, WindsorCastle, or Spring, or Unity; however we end up with lots of learning:
— As you apply the fundamental philosophy behind the loosely coupled components, you may not need a tool to take care of it.
— IoC and Dependency Injection are not the same thing.
— Once you register your container [at the start up of project], you don’t have register again.
— There are nice open source projects, i.e. an ecommerce project suteki you can check if you want to look at.
— There is a nice open source tool for easy installation of an open source project, hornget that I will try asap [after lots of praise].

MVC 2.0 and Spark session benefited from Jeremy’s inputs, and we followed ScottGu’s MVC 2.0 article and then spark was the popular view engine.


On AltnetUK day, I had “Software as Art” which forces me write another blog on that. The main discussion was around what makes it different software engineering process from an engineering process and art… My concern is I can’t see the design part, since if we are going to create artisan table, not an assembly line produced table; who is going to pay it, or how should we market it? [Yes, it will cost much more…]
Then, “What if your company renamed Waterfall as Agile?” was a discussion about why we should be using it, and if we have enough pain in the development process without being agile, how can we improve the process [without telling you are doing agile]. Nice inputs were
— If you can’t change your company, change your company by Fowler
— Don’t tell you want to do agile, do agile and tell them it is waterfall [start being agile].
— By picking up the most important parts first and delivering those parts will improve the process with small frequent shipments.
— Creating documents, reports won’t help software to be better! [believe in hearth]
Lean Thinking is a nice to book to start thinking in agile…

Can’t finish without adding the idea of @serialseb: to rename altnet as alternative group, since we are all developers and we should be able to switch between languages/platforms [which should give us more power in terms of awarenes what we have and we are missing…]

All in all, it was wonderful as:

1. Sharing knowledge is helpful
— Looking into new technologies/tools expands your understanding, especially you are in a company does not use the latest technologies, and you are learning/trying them on your own…
— Any book/article you have to read gets high priority on your waiting list [or gets into your zone at least].
2. Sharing experience is priceless
— “How did your project fail?” is not a question everyone would share in your company, but here it starts discussions with twenty people with lots of feedback that you can take back.
— The pitfalls on software projects on a broader view, gives you more question to ask for your own project.
— There are always gaps to improve, and this kind of activities let you see the gap! [Rest depends on you]
3. Hearing other people’s questions/worries on a subject makes it more interesting and you start to question in a deeper philosophical sense.
4. Have the chance to meet and discuss with the people that you follow their blogs, i.e. @JeremySkinner,@serialseb, @gojkoadzic and their inputs were incredibly useful for both days.

And Management Decides

There is a myth that at some point people starts to say that “tell business management about this.”
“But this is purely technical!”

I am not good at talking people coming from nontechnical backgrounds, and I find it quite interesting. They have eyes wide open, no idea what you are talking about; the literature you use is coming from MARS, and to take their attention and talking about the problems is not the nice part. However, when you start to talk about solutions, generally, it is a resource issue and it is hard to convince your needs/problems are really important.

From business perspective, I am sure everyone is coming with important things. And they have [hopefully well-known] priorities. They will take action based on the importance and relevance of the items.
What I can’t understand [or do understand but find it illogical] is that some companies have no roadmaps for some years. I find it harder to talk in a technology driven business that technological investment is in the very last rows of the priority list. 

In IT department, everyone is slow, not because it is UK, but they have no standards [or everyone has one].  Even the more process you create, the more slow you do your job, the more appreciation you get. If you deliver a project just to update a row for two months with three people, yes I am frustrated.

The business believes that if they continue what they are doing, they will be ok. They can be more than ok, they can be create state of art projects, but fine stick with the one we have and accept that “updating a row should take three people two months, and all a hundred documents are useful.”  UML documents are a subject for another blog, I do believe in documentation, but not modelling each call that creates a constraint for the creativity for the developer. Then don’t call him a developer but a code monkey. And if the strategy is outsourcing the overseas code monkeys, my questions are still valid that “technology driven business” [not software house] should have a core team in-house…

or not?

Delegation

What are barriers behind the delegation. Let’s look at with closer eyes:
a. Jealous:
      The delegated person can do a wonderful job.  We can realise/feel how bad we were doing the same task. A competency and comparison is unevitable
b. Guilty – Increasing to overloading
      By delegating a task, we are increasing the overload of that person.
c. Fear – Being overtaken
      We can be overtaken if the person is doing quite well. He can underestimate ourselves and can get promotion.
d. No Time
     Sometime, we don’t want to delegate because we don’t have time for delegation. “Telling what to do” takes more time than “doing it.”
e. Security
     The task we are doing can involve some secure information. We may not want it to be shared across other people.
f.  Enough skill/training
    Candidates for the task we are trying to delegate may not have enough skills/trainings. We see ourselves in power to be the only one to be able to do that task.
g. Love the task
    If we like the task, we are less likely to delegate it. Either it is easy or it gives excitement to us, we want to do that task on our own.
h. Hate the task
   If we think the task is useless and have repetition, too complex/ too easy, we may not want to share the task we hate.
i. Don’t like the person
   If we don’t like the person the less likely we want to give the task and watch him being successful.
j. The less motivation from the person
   If the candidates have less motivation than you have, and you don’t see them as willingful as you are, you may not assign the task, but do it on your own.

Knowing the causes helps to find out the solutions…

bittnerness of failure

Tomorrow we will have the informal review session for the first increment [if you call it increment]. I had different kinds of challenges in this project, all team players coming from different backgrounds.  And always there is lots of to learn, bitterness of failure can be medicine for weaknesses.
1. Project scope was never clear as usual.
Lots of rework and change lists to go over many times [for models and code]
2. Team was not aware of how we are going to implement it. [Maybe some of them yes, but communication was not enough]
Incremental methodology should have been understood by project manager. All the project analysis phase is being done in six months, with one developer assigned. This developer was supposed to attend all the meetings, and tried to understand what she is supposed to be doing in six months. Analysts thought their task is over and they can wait for testing; delivered just UI specs. Developer was told to deliver models, design diagrams, code it, and keep up to date.
A project for more than a year, was planned in two increments [Increments were not really increments.]

Some people were complaining that the design documentation was not reviewed by analysts…[Can they?] Is this the point where waterfall becomes efficient? Something like spiral, but even if spiral, isn’t it the “working software” triggers analysis phase, not documents…

3. A new methodology called PSDM [an alternative version of RUP] was around to use, but no one had expertise. [Lots of hard work to understand how it is working with consultants, but they were mastering the project, lack of communication]
4. Roles were not definite [still not], and conflict of interests were stressful.
[Who should be the technical lead
-if we had one developer, why we would have one?
-if we have more developers coming on board, what is the role definition of technical lead? what is the expectation from him as technical details/giving support as well? if not who is going to the support?]
5. Analysis Model was done by the developer, [even consultants could not notice], and when she needed Design Model, she override the documents/system types. [No one was using those material, so no one has noticed…]
What is the point of creating documents….
Want to deliver “working software” frequently…

Role of the Software Developer

Who we call as software developer? After I see Burcu’s blog, the demand from the companies to be more specific, I had a second thought about the roles in real life… I find it hard to imagine a task specified on a distinct skill set on development environment. Even if my role is lead developer in an e-commerce business, and I have three business analysts, 2 project managers on my team, I can start coding after 5 pm; when people start to leave the office. The communication and maintanence tasks during the day becomes the most important thing, and there are plenty of meetings to discuss any new improvement/problem. After 5, I can have time to finish the projects’ task [coding].
Either the real life is simple, and I do not know the way to make it simpler or this is the most common path every developer faces. Since you are the most skilled person to solve the questions, your contribution is appreciated on many parts of the business. Lifecycle of the projects require lots of commitment and there are lots of challenges out there.

ISoftwareDeveloper
ISoftwareDeveloper

Projects:

  • Analysis phase can’t continue with a consultancy from a lead developer. Almost all meetings require the developer.
  • Design phase is done by the developer.
  • Developer is keener to create documentation [as a result of enough bad experience caused by not creating documentation and answering lots of similar questions]
  • Coding phase is the easiest part [smallest amount of time]
  • Meeting for testing scenarios phase starts. Creating data, simulating environments, solving problems with configurations/settings.
  • Deployment is always done by them…[even if it is not their project]
  • Testing with the help of testers and business analysts; then bugfixing starts.
  • When they think they can take a deep breathe, release starts; and after the release they have a brand new project!
  • During this cycle[regardless of they are waterfall or spiral, etc…] there backend tasks:

  • Deployments, code review [they are lucky if they are doing this; since this means candidate good develoeprs are on the way]
  • Merges of branches, and source control management are done daily. [not to mention conflicts and problems with builds]
  • Maintainance of the environments, and finding problems, solving…
  • Live issues, [emergent ones] need immediate attention
  • Ongoing support for ordinary questions/known problems[the ones we can’t solve not having budget/time]
  • Training/knowledge sharing with other developers.
  • The list goes on…
    Throghout eight years, I have not come up with a job that has only one task: coding.
    Development includes
    a system that is alive, needs attention all the time.
    people, requires communication, knowledge sharing
    projects, needs exploration of new ideas, as well as integration of old system with new one.

    What else do you developers do in your day?

    What is Success?

    The more time spent on words, the harder it gets to define. Yesterday I had a talk to a friend, about the problem in consultancy for measuring “success”.  It gets complicated, are we talking about “a result comparison of the planned time and budget to the actual data” or “a comparison to what it should have achieved.”

    If compared the actual time and cost to the planned one, sometimes not delivering a project has more benefits; it can be a good learning experience [not preferable one but since there is a phrase: success comes from experience and experience comes from failure]. Even cancellation can provide more advantage; a good risk analysis at the very beginning of the project can save many resources beforehand.
    If compared to what it should have done something better, then the question “what were the alternatives and how could it have been achieved” raises.  The expectation/understanding from success changes the further we go.

    Then, confusion starts with “decision” word. “How would it be done in a better way”, “what were the expected results”? [I won’t continue now, but I am sure you get the idea]
    Even if I start to make assumptions and select a path to reach a final understanding of a word success, it will be unique to my understanding/imagination/knowledge and experience. While you are reading, I am sure you have come up with lots of more questions for each confusion.

    “Being aware of what you want” is challenging enough, and I won’t go further with asking “being sure about what you want.” Do you really want it? Have you done enough analysis? Are you confident enough? [Is confidence a good thing?]  I don’t know.

    As the scope gets bigger, the answer gets more unconclusive. I reckon, that’s where agile methodologies help us to have smaller, achieavable, forecastable projects.  Being aware of the big picture, but relying on what you have in the smallest piece on your hands.

    Development Models

    To minimize the risk, to deliver a successful project, teams look for a methodology that they can rely on. Most of the development methodologies started with the idea of manufacturing systems: “X delivers high quality, efficient and excellent products applying Y methodology, why we can’t?”
    X is one of Japanese companies, and Y is applied on assembly line. But since, we can convert a developer into a computer, we can apply the same logic, can’t we?
    Both have project plans, design and production phases. Both have quality assurance, and apply TQM principles.
    They should have budget, risk analysis and decision phases…
    However, software projects have unique products per projects, where manufacturing companies are producing same lego pieces. Once they have a specification, all lego pieces can interact with each other, and can produce millions of them…Once you have a specification for a part, you produce it, and that’s all, reusable code can be consumed for the new project, but probably they will pick a new language/technology and will not use it, since production of a piece takes three months up to three years… 
    I can’t make generalizations because there are trillions of parameters around this subject.  But I had a training on a new methodology last week. [It was an iterative and incremental methodology developed for company].
    To be able to outsource, that put planning, analysis and design phases into iterative cycles, and finished the iteration with implementation. The model/documentation that will be handed to outsources can’t set into stone. To make risk analysis perfectly, you can’t assume during development any risks will not arise, and the analysis should not be reviewed.  Throughout all my development experience, I did not have any project changing requirements, changing scope/analysis after all planning phases finishes. But then, it was upto developers to ask questions and contribute to the depth/quality of the delivery.  If you are going to outsource, and trying to perfect your documentation, i.e. every piece of code developers are going to write is in [uml] documents, you can’t expect outsourced developers not to ask questions and change your analysis documents.
    Waterfall was not useful, since it was set into stone assuming all phases will be done one by one without review/update.
    Iterative and incremental process was not useful, since it was helping with the outputs/artifacts.
    However, I am not happy with this model as well since it is a spiral model without any implementation cycle.

    Documenting the code

    If a new framework is developed in your company, and you are going to use it, without proper documentation you can face lots of difficulties. It may company culture “to go and ask questions” but it can be a pain after five questions [ten maybe?]

    With defensive programming, and agile methodologies around, lots of developers write their unit tests, created their exceptions carefully, every piece of code is in UML diagrams [object and sequence models,…] but unless it is a culture, nobody creates comments in their code.

    Some does, but this becomes more confusing since there is no standard, a few people apply their own standards…

    From the very beginning of the .NET [and C#], <summary> tags are there for documentation…This time, I will give  some examples how to use it. 

    namespace  EC.Domain.ProductDMgr{ 
    /// <summary>  
    /// Product Data Transfer Object  
    /// </summary> 
    public class ProductDTO

      private
    readonly int prodId; 
      private readonly string title;  private readonly int dissection; 
      /// <summary> 
       /// ProdId is the product Identifier 
      /// </summary> 
      public int ProdId { get { return prodId; } } 
      /// <summary>Title is the title of the product</summary> 
      public string Title { get { return title; } } 
      /// <summary> Dissection is the department of the product </summary>  
     
    public int Dissection { get { return dissection; } } 
      /// <summary>   
      /// The constructor of the product with identifier and title 
      /// </summary> 
      /// <param name=”prodId”>Identifier of the product</param> 
      /// <param name=”title”>Title of the product</param> 
      /// <param name=”dissection”>Dissection of the product in the store</param> 
      /// <exception cref=”ArgumentOutOfRangeException”> Exception for Dissection bigger than 999</exception>  
      public ProductDTO(int prodId, string title, int dissection) 
      this.prodId = prodId; 
      this.title = title; 
        if (dissection > 999)
            throw new ArgumentOutOfRangeException(“dissection”, “Dissection should be equal or less than 999”); 
        else
       

            
    this.dissection = dissection;
         } 
      } 
    }
    Anyone  using your assembly should be more confident about the objects and parameters now:

     

    Object_Browser

    And during the development, that will add extra mile speed to the project:

    Yellow_Window

    For detailed info, you may refer to msdn.

    There are codeplex projects [SandCastle, AjaxDoc] running on to extend this documentation and create msdn like help documents/websites.

    Cleaning the Code

    As UncleBob discuss on his article Commented out code is an abomination, leaving codes commented out does not help the other developers to understand/write the code better, but only create problems. I will keep the same example he gives, for clarity and assuming everyone saw at least one piece of code similar [no, no I know you did not do]. Here is the example he gives:

    protected void log(String message, int priority) {
          if (project != null) {
            project.log(message, priority);
          }
    //      else {
    //        System.out.println(msg);
    //      }

        }

    First of all, it breaks the rule of xp, “don’t code for future.”  Probably the developer was thinking writing to console will be a requirement in future, and wanted to help other developers going to use his code.
    The code should be as simple as required, just doing what it should do. Adding extra complexity will create lots of questions.

    Secondly, if he really wanted to leave a comment, it should not be a commented line, but a comment to the top of this functionality, telling what it is in his mind : “This if may have else statement writing the code to the console.”

    Thirdly, and worst case: breaking another rule for defensive coding: he could left it for himself….
    It was a requirement, but he couldn’t write/compile it as he wanted. Maybe he wanted to write a xml file, but could not [did not have time…], and left this commented part as a reminder [believing without comment he will remember…].
    And maybe because it was not mandatory, he delivered without an else…
    Obviusly, he may want to add optional else part with a functional code later [if he can]…
    Then, I reckon, he should add TODO: keyword to the start of his comment:  
    “TODO: This if should have an else statement writing the message to xml file”
    Lastly, it was an important piece of code [lots of lines…], and he wanted to keep it to use later since he was not confident to write the same again himself. I could offer to have that piece of code locally and  write a reference as a comment.
    Then he can argue that “I want it in source control so that I won’t lose it!”
    I would not mind creating a commented lines file, and extract this piece of commented lines as a method and referencing the method name here.

    All in all, I can’t see a point in commented lines to stay there…
    It should not be the new developer looking at code, and deleting old codes [requires some courage since she may lack some knowledge] , but the owner of the code should really be responsible for his code…

    C# is quite handy in terms of writing comments and creating documents from code. In the next blog, I will show some nice examples. Writing solid codes should not be that far away…