Archives

Archives / 2008
  • Recommended Reading

    I was asked a question today, what books I would recommend to read. Besides the those that I have already finished and a few that are still in pipeline, anything else that would contribute to the overall improving. The current list is:

  • Continuous Integration (book)

    First my personal impression - this book is a very good "business case" to introduceimage  things like automated builds, CI server, DB continuous integration (loved the word CDBI), automated deployment, automated inspection - most of the things that CI leverages. It doesn't go into deep details of one or another particular technology, balancing most of examples between (mostly) Java and .NET worlds.

  • Happy * !

    I realized that I always forget to greet the readers. Never too late to fix it (and yes, I have a test in place to automate it from now on :)

  • Looking for Passionate Developers

    Our team is growing and we are looking for passionate developers that go beyond the average. If you are looking for an environment that is all about software development, agile flavour, thinks out of Container, T/BDD spiced, .NET mixed with OSS, mapped with NHibernate, and willing to go beyond, then it's the place to join. We are located in Calgary (Canada) and will be happy to have you on board. Who is interested, can drop me a note at Feldman {dot} Sean {dot} at gmail {dot} com.

  • Autumn Of Agile

    Stephen A. Bohlen has started a great series of screencasts. You should definitely check it out if you are into Agile and the rest. The work is really done well, so donate!

  • Test-Driven Development: A Practical Guide

    This book is a bit outdated (published in 2003, probably written in 2002), but still one of the best practicalimage  examples of what TDD is all about. It talks about unit testing, mocking, integration testing. I am definitely putting this one on my recommended readings list. The part I loved is that the author takes readers from zero to an application implementing not just the back logic, but also the UI, all TDD done. The nice transition from state testing to mocking was very well performed, and in MHO one of the best I have seen so far in books. 

  • "Hello World" TDD Style

    A friend of mine told me, "what you know and what seems to as trivial, might be completely new to someone else". So I am trying to remember this, and once again the simple life wisdom proved to be correct. One of our team members had to be away while the team was conquering T/BDD and unit testing. As a result, he stayed a little behind, and as catch up exercise, we pared on a very simple problem, Calculator, another version of the classical "Hello World". Maybe this will help someone someday.

  • First Milestone

    I learned from a wise man that celebrating small successes as important as the having big one, if not even more. So today I would like to thank my team for the effort they made in such a short period of time and with a quiet a steep learning curve they had to go through. One picture is worth a thousand words.

  • C# 3.0 + R# = Great Tests Readability

    C# 3.0 has introduced lots of great features to make our life easier and syntax sweeter. Lots of people talked about it already, and I am not scooping here anything new. What I do want to demonstrate, is how to make the code easier to understand.

  • Test Helpers and Fluent Interfaces

    Today was a great day. One of the things we do with the team is experiment how we write our test. Experimenting seems the most effective way of figuring out what should be our testing approach. At this point we are mostly doing specification driven tests (unit tests).

  • Depend Upon Abstractions - reiteration.

    I was reading through the book when combined several subjects together, such as "help tests" and "error handling", and realized that the core "Depend upon abstraction.  Do not depend upon concretions." principle is underused by myself.

  • NUnit vs. MbUnit

    It's not a secret that I prefer certain tools/frameworks/applications over other ones. So is true with unit testing framework. My currently preferred one is MbUnit. My team was using NUnit so far, and honestly I respected the choice and didn't mind that much. Until this week.

  • VisualSVN - Issue

    I have posted a question at VisualSVN user group in regards to reverting delete operation on an item in a project. The workaround is very much manual, and feels wrong. At this point I was either able to revert the change for the deleted file only and manually add it to the project, or revert both deleted file and modified project file, and manually remove the references to the files that are reported as 'missing'.

  • HP Laptop Service

    Lately I had an accident with my HP Pavilion laptop and wanted to share the HP service story with you. Hopefully it will save people time and money.

  • Recommended Podcast

    This is late news, but I really recommend listening to the podcast with Robert C. Martin on .NET Rocks! Decided to listen to this one as a result of the book have read a while ago, Agile Principles, Patterns, and Practices in C#. The guy who has spent over 30 years trying to figure out how to do software, has some ideas to inspire how you do things. Audience? Developers, managers, users. Anyone. This is a great content to listen to.

  • naming_a_test

    Naming conventions is always brought up when a team is trying to standardize the way code is expressed. Tab size of 2 vs. size of 4, Camel case vs. Pascal case, blog opening on a new line vs. same line with expression, member fields prefixed vs. underscored vs. nothing, control names with Hungarian notation or without it. The list goes on and on. The truth is that this is really doesn't matter. I have learned to accept what team decides to go with and once you embrace the style it's all good. What really matters is the code being produces, not the size of the font it's printed in (well, probably not the best example, but you get the idea).

  • Domain Object and Contracts

    As a team we have found ourselves in a very delicate situation where we had to make a group design decision and it was quiet an interesting experience. What happens if your opinion does not align with the decision? How do you express your opinion without suppressing others opinions, promoting your concepts without falling into the nasty habit of ignoring anything that is different?

  • Strict Mocks

    I am extremely excited to be a part of a team that has deliberately decided to follow the Agile path and TDD way of producing results. Along with that I am learning myself tones.

  • Singletonitis

    While reading Joshua Kerievsky book "Refactoring to Patterns" could not go silent about abuse of Singleton pattern he described. The question that was asked in the book "When is a Singleton unnecessary?" - "Most of the time". Honestly, I can recall at least a few times when I was sick with Singletonitis: different Utilities, Session related classes, Context related classes, Resources related classes, you name it.

  • NHibernate GUID Alternative

    A good identifier for an entity is considered to be a number. A unique identifier for an entity, such as identifier that can be synchronized across multiple databases, is considered to be GUID. The only issue with a GUID is that it's generated on the DB side, and therefor has  a certain performance hit (an extra roundtrip to the DB to generate the GUID and let NHibernate know about it on insert of a new record). The alternative is to use a generator strategy guid.comb - a guid generated on the client side and as a result of that eliminate an extra roundtrip to the DB. The other benefit is that the value generated by this strategy is sequential, and therefore the GUID values are somewhat more traceable in terms of their order of creation.

  • Law of Demeter

    This post shows a good example of how to refactor your code to preserve Law of Demeter. Very clean and simple example. R# is there for the refactoring part, to make things less manual and friction free. As a reminder, Law of Demeter:

  • Enumerations And Extension Methods

    Enumerations are for enumeration. Obvious. Often, though, it's used also for some metadata knowledge. For example, an enumeration for gender might look like:

  • Moving On

    This is my goodbye post to Sunwapta, the company I spent 3 years with. Definitely, this was one of the most exciting experiences that have happened to me during my career as a software developer. People there have helped me to grow and mature, and for that I owe them my gratitude. I have learned tones. Thank you for keeping up with me and listening to all of the things I was bringing in. I hope when you run into code I had contribution to, it will bring up more of the positive thoughts and not the opposite. It is a bit sad to leave things not entirely finished, but I am more than confident that they will be done in the best way. After all, together we have done a long way and learned awesome things that not only made us better developers, but also taught that pounding in code is not everything that matters, but thinking, analyzing, constantly improving, and most of all, never settling on mediocre, always striving to better. 

  • Nokia

    This post is not sponsored by the manufacturer. Neither do I get dividends from the sales. This is pure lips service to a great product line I've used for years.

  • OSS with MS

    This is definitely interesting turn of things. Rather than come with it's own exact copy of an existing product, MS will provide an OSS product as a part of a bundle. I wonder if there are more interesting and welcomed surprises coming from this direction.

  • VMWare Workstation 6.5 - Unity Feature

    VMWare has released the 6.5 version with some nice updates (better USB support, Bluetooth support, DirectX support, and last but not the least - Unity feature. What it allows is to run the application from virtual machine in the host as those would be applications running on the host itself - sweet. So now if you need to work on several programs from several virtual machines, you can execute all of them with Unity (in Unity mode) and switching programs/windows would be just a matter of tabbing between those (ALT-Tab) and not a bunch of keystrokes and guest OS get focus / loose focus. Really love this feature.

  • Team Work

    "I am a team player" - another buzz expression of this days that anyone will bring up if are asked. "Why are you team player?" this is the question to ask and answer.

  • WPF Visual / Logical Tree(s)

    Coming from the ASP.NET development, I am quit used to the fact that a page has a tree of controls and by traversing the tree you can navigate to the elements.

  • Google Chrome

    This is old news, but Google apparently has release a browser to speed things up (according to Google most of the current browsers are not performing well with CSS, JavaScript, and whole rendering). From a scratch approach worked not bad at all. Though there are several things that are working against this new browser:

  • WPF

    Recently I started to work on a new project in our company that is using WPF technology. As a web developer with almost no experience with desktop applications I find it interesting and challenging at the same time (statefull environment,  no need in intermediate DTO objects, rich UI support, XAML abilities that are beyond regular markup capabilities, etc). Yet there are many questions that have an answer, but feel very weird. A few of those for example

  • SP1 and Scott Guthrie

    Ok, so I was really upset and spilled a bit more than probably should have to. ScottGu has picked my desperate yell from the blog and suggested a help (2nd time I believe - 1st one occurred when .NET 2.0 SP1 has broken our production web sites, wow, he's good). Apparently there was an issue with SP1 Beta and R# 4.0. I already went through refresh on installs (including removal of addins and components). Plan vanilla .NET FW with Service Packs with no addins installed works fine (well, not crushing, working without R# is impossible).

  • SP1

    As you probably know, the all new and shiny SP1 for both .NET framework and VS.NET 2008 are out. So I waited a bit, saw that other developers are accepting it and installed it. Great, worked smooth. Till I dared to restart. After that VS.NET 2008 designer "empowered by new abilities deployed with SP1" has showed own of it's hidden jams - complete crash of the IDE with no traces to what has just happened.

  • Re-inventing Wheel

    It doesn't matter how much we try to avoid it, it is unavoidable. Re-inventing wheel phenomena is always going to take place here and there. Doing a little BDD tests made it clear that I need to mark and specification with the type of the the system under tests I am testing, or the Concern of the test. One way I was showed to do it was to introduce a custom ConcernAttribute and mark with it the TestFixute - specification. Code looks like this:

  • BDD vs TDD

    I wanted to put a simple test in place to document the behaviour of a value converter WPF application I am working on is using. First I did it the standard TDD way (sort of spiking multicultural support of MbUnit framework). The result worked great.

  • Logging

    Logging is the process in which trees are cut down for forest management andimage timber. Logging is controversial due to its potential environmental and aesthetic impacts. 

  • Fearless Change: Patterns for Introducing New Ideas

    I'd like to drop a few word for the book was lucky to read lately - Fearless Change: Patterns for Introducing New Ideas.  Authors of the book have succeeded to capture ways to apply changes in amazingly accurate way. Written as a pattern book with orientation for software development (and not only) this book makes a perfect read for those who are willing to make changes and affect others.

  • Taking Out Fires

    Firefighters are not analyzing the situation, they are taking several plans to consider leaving the simplest and the least harmful to be executed. Can be this applied anywhere? No. When you have stressful times in software development you need to enrich your knowledge and learn about the problem. Doesn't mean to put on hold the development. Neither it means to implement the firemen approach and forget about it. It means take out the fire and learn how to avoid fires in the future by implementing the proper solution when you can.

  • Challenge - Listing Achievements

    So today I was challenged. Challenged to talk about my achievements at the company I work for. Why is it a challenge? Simply because I don't like to brag about my personal achievements when know how much I still have to achieve. But in this case this is different, as I would like to have a chance to look back and review what are the achievements I managed to generate in the company (Note: compensations are not linked to this :).

  • Break It Down Into Bits

    I had to refactor a portion of code and decided to go with strategy pattern. Interesting thing is that the final result might look more complex, but when discussed with a fellow developer, got green light in terms of "more maintainable" and "self documenting" code result. So here I am sharing it with others for review and opinions.

  • Data Driven Or Domain Driven Application?

    The company I work for has a significant amount of web applications of a specific line of business. This line of applications started 8 years ago (I am with the company just for the last 3 only). Since I started to be interested in Domain Driven Design, felt strongly that this line of applications should be re-addressed with a DDD approach. But the resistance was enormous, motivating that "these are the pure data centric applications and there's no place for domain, the data is the domain and as a result of that it is a DATA driven design application".

  • DB Trigger - A Friend Or A Foe?

    Database triggers are useful, and I am not going to bush it completely. In some cases, like the one I run into, triggers are more of a distraction and source of issues, rather than help and ease of headache-free maintenance. In order to understand the case, players must be introduced first.

  • You Have Got To Be Persistent

    [Purely Personal]

    “Never give up, never surrender” was my favourite part from the Space Odyssey. Today it proved to be true again. How do you lift the skills of the team? By lifting the overall skills, by raising the bar for the whole team. This was the GCD is lifted, forcing the less strong developers to invest more, rather than doing an opposite, forcing the strong developers to play dummy.

    Why do I writing this at all? Because I appreciate when people are brave enough to call white a white and black a black, and not just call it a shade of grey. Today I managed to bring back the skills lifting back to the team. This is a great opportunity to prove that by sharing the knowledge more can be achieved. Admitting mistakes made to fix those is the right step in a better direction.

  • Jamming With Mr. Mo

    Today I had a friend of mine, Mr. Mo, visiting us for a dinner and then having a little code jam (with a cup of tea and some crackers). A few things I would like to comment on:

    - Thank you Mo for discovering the great taste of Oren’s triple A stake. Rhino Mocks 3.5 is awesome. Not only it is more natural to read, but also blends the differences between state based and interaction based testing into more cohesive testing. I loved it.

    - I am not the only one who has strong negative feelings about not-so-sexy stored procedures and logic in DB

    - TDD PPP (ping pong pairing) with a developer that has same attitude as you are is amazing. Ready to push the boundaries, ready to be bold with code. Willing to experiment to have it done better.

    - People over processes is so much valid. I have burned so many bridges in the past. No longer willing to do it. Serving as a good example is way better than a target for hatred.

    - Fear and Pride are the worse enemies of almost any developer. Fear of an unknown. Pride of the old achievements. When you free of thus bargain, you are able to achieve more. Much more.

    PS: Mo, relocate to SW!

  • MbUnit 2.4 PlugIn for ReSharper 4.0

    Albert Weinert has release an update to his plugin to allow execution of R# 4.0 from within Visual Studio .NET 2005 / 2008. The only Unit Testing framework supported by R# 4.0 out of box is NUnit, so this is a useful plugin for those who prefer MbUnit to NUnit.

  • IDs to Objects

    A few months ago I blogged about Domain Objects vs. Primitive Types. Back then it felt right to me to transform a primitive type, like a Guid that represented an organization ID, to an Organization domain object. Unfortunately at that time I was not educated enough to know that this is a common idiom among many object designers. Apparently it is. Craig Larman writes it nicely in his book (in my case Organization is what Craig references to as a Customer):

  • Have Honest Opinion

    It is very hard to provide an honest opinion when you are involved in a situation. I found it always difficult for myself and admired people of being able to do it, lifting themselves from emotional attachments to the matter.

  • Command-Query Separation Principle

    A few days ago read in Larman's book about Command-Query Separation Principle. Funny to mention  that I heard about the concept many times ago, but this is the only source that stated it as a principle. And it makes total sense once you evaluate all the pros and cons of the idea.

  • 3 Years

    Today is 3 years since I started working with the company I work today. It's being a long journey from figuring out what I want, till realizing what I am and need to be. The team has accepted all of my wildest ideas about the code and was very tolerant to the fact that I cannot wait to get something done. We've made a long way.

  • Google Shortcut Keys - Awesome

    For all keyboard junkies out there - if you are also hooked on Google products (GMail, Reader, Calendar, etc), don't miss the option of using GMail with keyboard shortcuts. The are awesome. I loved the navigation shortcut (combination of pressing first G and then another key, neat).

  • Two Loosely Coupled Code - Part 2

    In the

    I raised the question of "Too loosely coupled design". There's a lot to discuss about it, and I am not going more time on it, except showing one more sample that IMHO shows the benefits and outcomes of the principle being applies, or consequences of not doing so.

  • OCP Principle

    Jeremy Miller (aka The Shade Tree Developer) has a very good article about OCP principle printed by MSDN magazine. This is a valuable article for any developer that strives to work according to law of "measure twice, cut once", and not just cook spaghetti. http://msdn.microsoft.com/en-us/magazine/cc546578.aspx 

  • Going To See My Family

    This is not a technical post. Nor it's related to software development or the theory behind it. It is a pure human post about principles that are much more basic and important in life then anything else - family.

  • Windsor Container - Bug

    Today run into what I think is a bug in Windsor Container. After googling a bit, found a post that is similar to what I have - need to have a constructor in implementer component (ctor(string)) and configure Windsor to call it, rather than overloaded version of constructor. For some reason Windsor is not going to the default constructor.

  • Whiteboard vs. Excel - Part 2

    I have posted before about the subject, and there was a strong hold on both sides (for and against). Yesterday I run into a blog that mentioned a software called Mingle 2.0 - obviously not the first version according to the name, but I have never heard of it before, so it might be a naming game (all the Web 2.0 thing) - who knows? And probably someone knows. If you a successful survivor of the software or have  a few words to drop, leave your comment after the beep.

  • What About ALT.NET Calgary Group?

    We have some very talented and blade sharp people here. So why can't we start ALT.NET Calgary local group? This would definitely promote excellent ideas around, enrich our dev community, put more stress on quality, agility, and much more. Feel free to contact me if interested.

  • Changes

    After a long time I had the book sitting idle, finally I had a chance to get my hands image on it - Who Moved My Cheese. A very nice, fairy tale kind-of book teaching how to cope with changes. I loved it, especially it's nice to read if you are trying to wrap around the agility concept.

  • Pair-Programming, Keyboard, and Mice

    While pairing today with one of the developers from our team, we decided not to let the mice to distract us, and unplugged it. That was awesome - within seconds we diagnosed ourselves with a mouse-have-to-touch addiction symptom. Every single moment a hand was reaching to the sacred location two things happened:

  • NHibernate 2.0 Tutorials

    Over the weekend I had a chance to play a bit with the tutorials provided by Gabriel Schenker for NHibernate 2.0 TDD style. A few thoughts on the subjects:

  • The Dip by Seth Godin

    An interesting book where author sharpens things that are quiet simple and have lots of common sense. I loved a few things that are very applicable to myself:

  • Whiteboard With Stickers vs. Excel

    At the company I work for we are trying to do things in a more agile way. And one of the things that people hesitate to do is to stick to something to 'taste' it. It doesn't necessarily means that there will be no value delivered to the client, or the work will be entirely stalled. To me it means don't turn down right away something until you know what are you talking about. And you won't know what you are talking about unless you do it. So this one is about whiteboard with stickers vs excel spreadsheet.

  • JP in the House

    Today JP Boodhoo has visited the place I am working for to give a short idea what we should be doing to become more agile and walk the path of true developers. It was short, and we didn't have a chance to hit the base code (code never lies), but this is definitely will wake some up from the Matrix (later on this one).

  • VAR To Keep It Simple

    Among various things in C# 3.0, one of the syntactical sweets that I find quiet useful is the 'var' keyword. Combined with R# intelligence, you create a very readable code that is not cluttered with excessive type reminders. Just enough to keep it strongly typed and readable.

  • Tentity

    Tentity - Database mirrored Table representation in code to mimic the concept of entity, bringing DB awareness, cache and persistence concerns in it, with design driven mostly for the state and some functionality dictated by DB operations to be performed on the data. A complete anti-POCO.

  • Fun, Respect, and Money

    There was an interesting observation made once, that to be happy with what you do, you have to have 2 out of 3 things which are Fun, Respect, and Money. If you have all three, then you are doing great. In case there is only one out of three, it is really up to your spirit, until you move on. Two is a reasonable number if you passionate about what you doing.

  • Training Session Observation

    It is nice once in a while to get back to the course or training session you took and make sure that you haven't wasted your time for nothing. This is not about ego, this is about making sure that what ever you know today will be absolutely no enough tomorrow and constantly remind yourself this basic law of software development.

  • C# 3.0 Auto Property And NHibernate

    I was reading about NHibernate mapping of the properties that have no setter, and how it's done through the backing field (reflection I assume). The setting looks like this:

  • Pair Programming And Sharing Knowledge

    Pair programming is a proven technique for sharing knowledge among team members and teams. Benefits of that are felt after relatively a short period of time, boosting not just the productivity, but self-confidence of the developers (which is playing an important role even though is not admitted), and most of all, improving the maintainability of the code when it comes later. And it comes. It always comes.

  • Know Your Friends Well, Know Your Enemies Better

    Long time ago I had to deal with a case where the famous ViewState generated by WebForms was quiet heavy. This post is not going to wine about how bad ViewState is for the environment. This post is to show that even working with something big and nasty such as web forms, you still have to give a thought what are you trying to do and what is out there that can help you to accomplish the mission.

  • Understanding IoC Container - Part 2

    I try to lower expectations in order not to be disappointed, but in this case I was asked by several individuals to address the fact that IoC container power is in the ability to "hook" implementer with the contract through an external file, leaving application code unaware of the actual implementer till the run-time, having no reference to implementers' assembly or whatsoever. I am going to expand the sample from the part 1 post to achieve that goal in a couple of days.

  • Free (OSS) Virtual Machine Software - VirtualBox

    I was exposed to an interesting product from innotek called VirtualBox. If you like MS VPC or VMWare, check this one out. It's free, it's not bad (so far I was just playing with it installing Windows XP and running some applications on a quiet slow host machine). Would love to hear others comments on this one, or any other alternative that is welcomed.

  • Understanding IoC Container

    In a multi layered application architecture, loosely coupled code is more than a important. It's the basic which can either help the entire project progress, or drive it down the slope to the end (in the bad meaning of the word). One of the basics to keep coupling as low as possible is Inversion of Control (IoC) container.

  • Domain Objects vs. Primitive Types

    Lately I am paying more and more attention to aspects of Domain Driven Development (DDD), development where code is looking more at the domain in which it is trying to resolve problem(s), rather than technologies it is using. One of the biggest headaches that you getting into when trying to adopt DDD is persistence. Normally persistence is done in Relational database such as SQL server, Oracle, or another vendor database. And this is exactly the problem - Object Oriented model vs. Relational Data model. So what is more important, a software that is written in DDD way,  that forces you to put DB on a lower priority, or DB efficiency as a priority pushing your software from Domain driven development to become a Data Driven development? If you asking me - domain is more  valuable. I will show an example that to me serves the best proof for those who still try to save the "extra round trips to DB" or "we could combine the queries and have a single call to the DB". Keep in mind, I am not going against DB efficiency, after all a sloppy data access can kill the best application out there. But having a great data access model will not make you application writing easier, on contrary.

  • Don't Be A Slave Of Visual Studio & Don't Workship File System

    Understanding what are you working on is the priority #1. If you not sure, then you don't know what are you working on. How do you keep several items linked logically while working on them - you try to keep something common between them. To be more particular, I will bring an example of an application I was exposed to with my team, and show several approaches, including the one I am so against.

  • Lambda Expressions

    I was looking at anonymous delegates today in .NET 2.0 and thinking how much "syntactical noise" it has and how clean and delicate it is with Lambda expressions. Remember though how it used to be?

  • ORM Poll

    Looking for some feedback from ASP.NET community - are you using ORM mapping tool and how disconnected your business logic from the persistence during initial development?

  • TDD By Sample - Search Criteria

    The goal of the application is to allow specifications for search (criteria’s) to be required viewspecified by the client in order to perform a custom search. Figure 1 demonstrates the requirement. I intestinally keep it simple for the sake of the exercise.

  • Web Application Project Compilation And NAnt

    I am working on automated builds for our projects. I am quite excited about it, since it feels like taking back the power over the creation of the code. Not only that, the 'auto-magic' dissolves ones you do it manually and things become simple. You run the script, the script is failing, you need to fix the issue and you want the issue to be simple in order to A) locate it quickly B) fix in the least effort applied.

  • Edgile

    Combining client-side with server-side, coping with multi-browser support, handling imperfect world of CSS , implementing the code the best way you can relaying on patterns and principles with legacy code kicking around, keeping up with the pace of changing, facing clients that are not ready to pay for the quality, dealing with team mates that are still loyal to procedural code order and married to databases, yet not over-designing is more than just agile. My definition of this is going on the edge with agility in mind. Or just Edgility.

  • Volta

    I was following the development on Script# CCC was developing. Sounded like an interesting idea of getting closer .NET and client-side JavaScript. Today found a link to MS experimental project called Volta (hmm, I wonder what will happen if you dare to touch it, same that happens to many experimental projects - a moment of joy and a big shocker at the end? :)