<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4628800998927408654</id><updated>2024-10-04T21:11:57.524-05:00</updated><category term="TDD interfaces code OOP"/><title type='text'>C is for Coding</title><subtitle type='html'>A development blog for me to rant and rave about my experiences within my profession.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-6746219618089536051</id><published>2016-07-06T15:26:00.000-05:00</published><updated>2016-07-06T15:26:10.197-05:00</updated><title type='text'>Angular 2...</title><content type='html'>I&#39;m grinding my way through Angular 2 and I keep hitting some bumps along the way.
&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;a href=&quot;http://image.slidesharecdn.com/getting-ready-for-angular-2-2015-150508202121-lva1-app6892/95/getting-ready-for-angular-2-29-638.jpg?cb=1431120304&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://image.slidesharecdn.com/getting-ready-for-angular-2-2015-150508202121-lva1-app6892/95/getting-ready-for-angular-2-29-638.jpg?cb=1431120304&quot; width=&quot;320&quot; height=&quot;180&quot;&gt;&lt;/a&gt;&lt;/div&gt;
I&#39;ve been trying to create a dashboard app for my company that I can quickly spin up forms and data.
The hope was with Angular 2 and JavaScript I could accomplish this faster than a .net application.
I wrote a medium sized application in Angular 1 at the beginning of the year and it went very well.
For the back-end services I changed from a monolithic service gateway to more of a microservices using Service Stack api.
I can now spin up a quick database and connection in a hour or so with a RESTful api.
With the front end I wanted to do something similar so for the past month I&#39;ve been working on the previously mentioned dashboard.

I started with RC 1.  Since it was new to me, I didn&#39;t miss out on some of the breaking changes and I knew routing and forms would be changed in the coming months/weeks.
As I messed around with some newbie projects while I was implementing my microservices and other tasks RC 2 came out.
Everything became a learning curve and it took me a bit to get back up to speed.  
I downloaded a dashboard template&lt;a href=&quot;http://akveo.com/&quot;&gt;Akveo admin 2 desktop&lt;/a&gt; and shortly thereafter
RC 3 came out and then last week RC 4 was released.  Routing, Forms, and other changes/bug fixes and learning how to implement the dashboard set me back a bit.
I created my own local git repository and set off to updating the routing to the beta router.  
I didn&#39;t have time for akveo to update it and I wanted to stay with the Angular team as they released
the product.

I also had to learn about form builder (akveo did implement this..).  
The problem with the forms and binding is there are multiple ways to do this and lots of opinions and examples to choose from.
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://i784.photobucket.com/albums/yy124/Jules_Denver/My%20First%20Album/makes_my_head_hurt.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://i784.photobucket.com/albums/yy124/Jules_Denver/My%20First%20Album/makes_my_head_hurt.jpg&quot; width=&quot;264&quot; height=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;
Since I was implementing authentication I picked one and was wondering how to force each page to be required to authenticate and low and behold auth.gaurd came to the rescue:

&lt;pre&gt;
@Injectable()
export class AuthGuard implements CanActivate {
    constructor(private authService: AuthService, private router: Router){}

    canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot
    ) 
    {   
        let user = localStorage.getItem(&#39;user&#39;);
         if (user === null)
        {
            this.router.navigate([&#39;/login&#39;]);
            return false;    
        }
        return true;
    }
}&lt;/pre&gt;
Simple but effective for the time being.

Okay I got that all working and needed to actually get a user object from the service once the user was authenticated.
Well, now I get to dive into the world of observables. In reality, there isn&#39;t that much difference, but Angular 2 team almost makes it more
difficult on how to decide on what to use.  Promise or Observable with other variations on observable.  
For example if you have Pluralsight watch the 
&lt;a href=&quot;https://app.pluralsight.com/library/courses/play-by-play-angular-2-quick-start-john-papa-ward-bell/discussion&quot;&gt;John Papa and Ward Bell play by play video&lt;/a&gt;
and they discuss all the different ways in which they could be used in different situations.
If you want to look at the &lt;a href=&quot;https://github.com/johnpapa/pbp-a2-ward&quot;&gt;code&lt;/a&gt; he has examples of both in the component and service.

Now back to getting the user data from the service before render.  
I couldn&#39;t figure out how to populate the object before render in which it would be undefined.

Here is how I accomplished it:
Here is one of my routerConfig ts files:
&lt;br /&gt;
&lt;pre&gt;
export const PagesRoutes: RouterConfig = [
     { path: &#39;&#39;, redirectTo: &#39;/pages&#39;, terminal: true },
      { path: &#39;pages&#39;,
            component: Pages,
            resolve: {
                  teamMember: MemberResolver
            },
            canActivate: [AuthGuard],
            children: [
                  {
                        path: &#39;&#39;,
                        component: Dashboard,
                        canActivate: [AuthGuard]
                  },
                  {
                        path: &#39;Dashboard&#39;,
                        component: Dashboard,
                        canActivate: [AuthGuard]
                  },
                  {
                        path: &#39;Charts&#39;,
                        component: Charts,
                        canActivate: [AuthGuard],
                        children:
                        [
                              {
                              path: &#39;ChartistJs&#39;,
                              component: ChartistJs,
                              canActivate: [AuthGuard]
                              }
                        ]
                  }
            ]
      }
];&lt;/pre&gt;
Notice the resolve in the pages component.  It uses the resolver from the router and you create a class like this:
&lt;br /&gt;
&lt;pre&gt;
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from &#39;@angular/router&#39;;
import { TeamMember, TeamMemberService } from &#39;./index&#39;;
import { Observable } from &#39;rxjs/Rx&#39;;
import { Injectable } from &#39;@angular/core&#39;;

@Injectable()
export class MemberResolver implements Resolve&lt;teammember&gt; {
      constructor(private _teamMemberService : TeamMemberService) {}
      _teamMember: TeamMember;
      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable&lt;teammember&gt; {
            let userName = localStorage.getItem(&#39;user&#39;);
           return this._teamMemberService.callService_RxObservable(userName);
                
      }
}&lt;/teammember&gt;&lt;/teammember&gt;&lt;/pre&gt;
And now to retrieve the observable data:
&lt;br /&gt;
&lt;pre&gt;
export class Pages implements OnInit {
 
  constructor(private route: ActivatedRoute, private _teamMemberService: TeamMemberService) {
  }
   ngOnInit() {
    
     this._teamMemberService.teamMember = this.route.snapshot.data[&#39;teamMember&#39;];
     
   }
}&lt;/pre&gt;
The ink on the &lt;a href=&quot;https://angular.io/docs/ts/latest/api/router/index/Resolve-interface.html&quot;&gt;Resolve documentation on angular.io&lt;/a&gt; still wasn&#39;t dry when I discovered this.
It took me a bit to understand it and I was using the activatedRoute along with the snapshot to retrieve the observable data.

</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/6746219618089536051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2016/07/angular-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/6746219618089536051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/6746219618089536051'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2016/07/angular-2.html' title='Angular 2...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-4430924334447480439</id><published>2013-03-04T09:59:00.001-06:00</published><updated>2013-03-04T09:59:22.448-06:00</updated><title type='text'>//Comments</title><content type='html'>I &lt;strike&gt;&lt;b&gt;hate&lt;/b&gt;&lt;/strike&gt; (opps told my kids that we should never use that word), writing comments in my code.
&lt;br&gt;
&lt;br&gt;
I&#39;m not talking about API comments that people can use in intellisense to understand the method and it&#39;s parameters.  I&#39;m talking about comments in the code that are supposed to describe private methods or logic flows.  It shouldn&#39;t need to be done in this day and age of programming.  We are well past the age of days past when programmers used a,b and c as variable names and then reused the same variable for a new contextual meaning.
&lt;br&gt;
&lt;br&gt;
I read blog posts over and over talking about the correct rules and syntax of using comments.  What to comment in or out of methods.  How about we write code that explicitly states what we are doing.  If it doesn&#39;t make sense to you, then how about your simplify it so you can explain it to a teenager.
&lt;br&gt;
&lt;br&gt;
&lt;blockquote&gt;
  Developer:  I can&#39;t understand the code when I read it.

&lt;br&gt;
  Me:  Do you have unit tests written against the code?
&lt;br&gt;
  Developer:  No.
&lt;br&gt;
  Me:  I bet when you write them your code will change to a more readable state.
&lt;br&gt;  
&lt;/blockquote&gt;
&lt;br&gt;
&lt;br&gt;
I&#39;m so tired of fighting battles I had as a software engineer ten or fifteen years ago.  I want to be pushed on the complexity of doing things even more simply.  I&#39;m tired of reading nested if and case statements scrolling through my IDE and wondering what JR developer was allowed to write such crap only to find out it was the companies most senior developer.  And he was the favorite of the managers because he just got shit done.
&lt;br&gt;
&lt;br&gt;
Yeah he got shit done.  Five hundred line methods with more cyclonic complexity than can be measured.  I&#39;m supposed to add a feature without breaking the existing functionality.
&lt;br&gt;
&lt;br&gt;
Now is the time I wish he had written comments!!!!
</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/4430924334447480439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2013/03/comments.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4430924334447480439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4430924334447480439'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2013/03/comments.html' title='//Comments'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-5418547848363225307</id><published>2013-02-21T15:09:00.002-06:00</published><updated>2013-02-22T08:34:09.225-06:00</updated><title type='text'>Shotgun post!</title><content type='html'>It&#39;s been a while.
&lt;br&gt;
&lt;br&gt;
I&#39;ve been working as a part-time game developer.  I&#39;m using the &lt;a href=&quot;http://www.havok.com/&quot;&gt;Havok Engine &lt;/a&gt; for an MMO called &lt;a href=&quot;http://www.embersofcaerus.com&quot;&gt;Embers of Caerus&lt;/a&gt;which at this time is a volunteer position.  If funding gets approved who knows if I&#39;ll be offered a full-time position since I&#39;m not sure where the main office will be located in the U.S. or not.  It&#39;s some nice experience and gives me something fun to do.
&lt;br&gt;
&lt;br&gt;
Ruby (Rails), Python and Java is really what I&#39;ve been messing with on my own time.  I&#39;ve done a couple of sites in Rails, a couple of stupid Android Apps for my kids to keep up with the &quot;in crowd&quot; of development.  I wish there were more companies around Green Bay that would examine their I.T. and use the right tool for the job instead of forcing it with .NET or RPG.  Even then I don&#39;t know a decent sized company up here yet that has implemented .net 4.0 let alone writing some Rails site!
&lt;br&gt;
&lt;br&gt;
I really am into the NO_SQL movement.  I&#39;ve used ORM&#39;s in the past, but I&#39;ve worked with Entity Framework 5.0 in VS2012 and I really like the automation it provides especially for decent databases.  I created a little project to hold stock market data and I thought I would give VS12, SQL12 and EF5 a run through it&#39;s paces.  Compared to what I&#39;m doing in my day job it was so nice to have the db created, the models/mapping created and the calls ready to get and set data ready for my use.  It makes me cringe each time I write my mapper class at my day job (even though it is abstracted as far as I can take it).
&lt;br&gt;
&lt;br&gt;
Speaking of Python, I have a cool idea for a game.  I was looking at the Pixar python 3D engine.  My daughter is a budding artist and I thought she could learn to use Maya or a similar tool to create my objects and I would exercise my Python muscles more.  Heck Python works for &lt;a href=&quot;www.eveonline.com/en&quot;&gt;Eve Online&lt;/a&gt; I guess I could try it!
&lt;br&gt;
&lt;br&gt;
Laterz</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/5418547848363225307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2013/02/shotgun-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/5418547848363225307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/5418547848363225307'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2013/02/shotgun-post.html' title='Shotgun post!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-1336178388041889732</id><published>2010-07-01T08:40:00.002-05:00</published><updated>2010-07-01T08:45:02.836-05:00</updated><title type='text'>The Refactoring March</title><content type='html'>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijL2Z7BoVJ766DYlqHQ1TCPdc90inlrUWK5yu1tyb8PGIxzQa5gC_qtbFkb4qLubU4aCnQKthpGloAnLPtQ7gGe0jqECUk1CyAoGe3KBHHx2UNNPgW4nrlBFiMeh9E1G3TEA16c5w51DU/s1600/refactoring-dummies-thumb.jpg&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 252px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijL2Z7BoVJ766DYlqHQ1TCPdc90inlrUWK5yu1tyb8PGIxzQa5gC_qtbFkb4qLubU4aCnQKthpGloAnLPtQ7gGe0jqECUk1CyAoGe3KBHHx2UNNPgW4nrlBFiMeh9E1G3TEA16c5w51DU/s320/refactoring-dummies-thumb.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5488933321297528706&quot; /&gt;&lt;/a&gt;&lt;br /&gt;I’ve been hired to help refactor code.  The lead developer and project owner know they have a code mess and they want it fixed.  Rewriting the application is not an option, but the code base is tightly coupled and has turned into &lt;a href=&quot;http://www.laputan.org/mud/&quot;&gt;a ball of mud&lt;/a&gt;.  Where does one start?&lt;br /&gt;&lt;br /&gt;At first (and still am to a certain degree) perplexed about the process.  Core features are intertwined in a whimsical manner where no thought of abstraction or single responsibility has ever taken place.  Procedural code runs rampant among threads, inherited classes (abstract or not) and a myriad of if statements.  And as developers have tried to “improve” the methodology of making calls into the bowels of the communication layer it has quickly become a congealed mess.&lt;br /&gt;&lt;br /&gt;While I have faced similar issues with code in the past, I’ve never been given the green light to really fix the problems and make it work.  I’ve argued unsuccessfully to rewrite projects because the code base is so messed up that only a proper burial into the sea of electricity was fitting.  This does not sit well with people who have many years of time and money invested into the project(s).  It requires more creative thinking to get the code base into a true usable state.&lt;br /&gt;&lt;br /&gt;I’ve told the project manager that we need to stop current development.  Adding more features will only serve to create more threads of illegitimate code.  The second step I’ve taken is getting the source code repository into a better managed state so we know what code is getting developed, tested and in production.  I wouldn’t say the previous state of source control was horrible, but it lacked the ability to exist in these different states independent of each other.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Next I traversed through the code and began to pick at the low hanging fruit.  Simple things like removing needless comments (almost all of them), unused variables, unused methods and classes, clean up using declarations and other tidying refactors to make the code a bit better to read.  In Fowler’s book, “&lt;a href=&quot;http://www.amazon.com/exec/obidos/ASIN/0201485672&quot;&gt;Refactoring:  Improving the Design of Existing Code&lt;/a&gt;” he indicates that code not placed with unit testing is considered legacy code and thus needs to be refactored.  This means the start point for refactoring is getting the code wrapped in unit tests.&lt;br /&gt;&lt;br /&gt;This means the developers need to have the ability to write unit tests.  This also means we need to have good coding standards and reviews as we move forward.  Since the company is hiring real Sr. Developers we have a nice core team that understands these principals.   We now need to get the existing team to understand these are not suggestions, but requirements if we are to bring the code base back to life. &lt;br /&gt;&lt;br /&gt;My fear is that while we might do a good job of cleaning up the cuts and bruises we will need to use the electric paddles a couple of times in this process to keep the pulse going.</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/1336178388041889732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/07/refactoring-march.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/1336178388041889732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/1336178388041889732'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/07/refactoring-march.html' title='The Refactoring March'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijL2Z7BoVJ766DYlqHQ1TCPdc90inlrUWK5yu1tyb8PGIxzQa5gC_qtbFkb4qLubU4aCnQKthpGloAnLPtQ7gGe0jqECUk1CyAoGe3KBHHx2UNNPgW4nrlBFiMeh9E1G3TEA16c5w51DU/s72-c/refactoring-dummies-thumb.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-2022812859554235778</id><published>2010-06-09T20:06:00.002-05:00</published><updated>2010-06-09T20:15:08.079-05:00</updated><title type='text'>New Job...</title><content type='html'>I finally started my new job today, about 3 weeks later than I really expected.  I&#39;m not sure what the real hold up was, but involved lawyers, insurance and I&#39;m sure money.  No matter, I was able to start at 1pm today and had an interesting discussion with the PM and the Lead developer.&lt;br /&gt;&lt;br /&gt;They are committed to making this development group one of the best in Wisconsin and they want me to be a pivotal player in this development.  They want to hire 5 developers in the next few weeks.  They have already have two others on board, they are needing IT to help with equipment and such.&lt;br /&gt;&lt;br /&gt;We talked a lot about design and moving the application in the right direction.  They have a developer in Colorado who phoned into our room and I got a chance to see the code he was working on.  Not very good, but then again I expect that in most applications.  Even when developers are well meaning a lot of bad code slips through the cracks as release dates are nearing and it needs to be done now.&lt;br /&gt;&lt;br /&gt;It is going to be interesting working with them.  I already warned them that I usually come with both guns blazing wanting to make the software better, but I believe my recent experiences has taught me to temper how I go about it.  They responded that they welcome the input.  Be careful what you wish for!&lt;br /&gt;&lt;br /&gt;This could be a gold mine of opportunity for me.  I think the goals, the conditions and the software that is wanting to be written has the potential to be really neat and exciting.&lt;br /&gt;&lt;br /&gt;And I&#39;ll be able to post about something more than a file copy system!&lt;br /&gt;&lt;br /&gt;Expect to hear more in the near future.</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/2022812859554235778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/06/new-job.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/2022812859554235778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/2022812859554235778'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/06/new-job.html' title='New Job...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-3309938408617439250</id><published>2010-05-22T23:16:00.002-05:00</published><updated>2010-05-22T23:44:11.463-05:00</updated><title type='text'></title><content type='html'>Yesterday (every time I type that word I think of the Beatles song...) I had an interview with the PM/Lead.  I was given the opportunity to complete a calculator program.  I had two hours and while I didn&#39;t complete it (I was too worried about removing the dependency from the UI to the BLL (Core) layers.  If I wouldn&#39;t have been so anal I would have been able to implement an abstract class for the base methods for the operators and completed it easily.  I think sometimes I get all caught up in the details I forget to get it working and then re-factor.&lt;br /&gt;&lt;br /&gt;I used tests to help me along, but when I got side-tracked in my writing I also got side tracked in my tests.  I&#39;m learning more and more to trust the tests and not myself.  As I learned from my music project, the tests will tell me what I need to do.  Testing will then find the missing implementations or the erroneous errors that exist in computers that one doesn&#39;t always think about.  But then you fix it with a test, then fix the code and you are back riding into the sunset again.&lt;br /&gt;&lt;br /&gt;I had a quick code review of what I had written and it made sense to him.  I was at least able to show him that the calculating worked, there was error handling and undo functionality, but I had the framework completed for that, just needed about 30 more minutes.  I think I was too stressed to work efficiently.  Not having a job and needing one does that I believe.&lt;br /&gt;&lt;br /&gt;Sooo... we talked about the team.  Right now it is pretty small, but they have a ton of work that needs done.  The lead told me the code base wasn&#39;t pretty, but they have done a good job of removing some &lt;a href=&quot;http://martinfowler.com/bliki/TechnicalDebt.html&quot;&gt;technical debt&lt;/a&gt;.   He also discussed doing code reviews and weekly technical lectures where the team is teaching each other.&lt;br /&gt;&lt;br /&gt;I had told them that I started that kind of program at my previous employer and even put the lesson notes on a wiki.  I offered they should start video taping it.  I think people are more often willing to watch something rather than read something.&lt;br /&gt;&lt;br /&gt;We talked about source control as they are currently using &lt;a href=&quot;http://subversion.tigris.org/&quot;&gt;SubVersion&lt;/a&gt; but are looking at&lt;a href=&quot;http://msdn.microsoft.com/en-us/vstudio/ff637362.aspx&quot;&gt; Team Foundation System&lt;/a&gt; which I had installed and configured at said last place of employment.&lt;br /&gt;&lt;br /&gt;I was given a tour of the software.  It&#39;s some pretty impressive stuff (a WPF/C# program that uses USB to chat to modules inside of boat engines).  They have a ton of features that are needed and are looking to add (hence why they were interviewing me).&lt;br /&gt;&lt;br /&gt;On the way home, I was called an told I got the job if I wanted it.  Pretty cool software system, working on boats (yes going on the lake with them!) and a team lead that is pushing the team towards &lt;a href=&quot;http://manifesto.softwarecraftsmanship.org/&quot;&gt;software craftsmanship.&lt;/a&gt;  I can handle a place like that.</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/3309938408617439250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/yesterday-every-time-i-type-that-word-i.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/3309938408617439250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/3309938408617439250'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/yesterday-every-time-i-type-that-word-i.html' title=''/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-4842626083574909316</id><published>2010-05-19T15:16:00.004-05:00</published><updated>2010-05-19T15:40:55.829-05:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="TDD interfaces code OOP"/><title type='text'>How I solved it.</title><content type='html'>The other day I asked the &lt;a href=&quot;http://cisforcoding.blogspot.com/2010/05/tdd-question.html&quot;&gt;blog world about TDD&lt;/a&gt;.  And while I didn&#39;t get many comments in the blog :P  I did get some private feedback statements about how I could handle it.  I swear developers are teachers at their heart, because rarely does any give a straight answer to a question.  It is always something abstract (no programming pun here).  So I banged my head against the keyboard and came up with my approach.&lt;br /&gt;&lt;br /&gt;TDD is about letting the tests help you design.  If you toss the tests away then the design doesn&#39;t really matter because it is untestable.  I&#39;m not going to discuss what should be testable or not, but I believe if you are doing TDD in the &#39;logic&#39; part of your program then it should be wrapped in tests.  If I change the behavior of the method how then would I know if my tests pass at the individual function level?  Again this is where the Agile manifesto comes into play, I&#39;m not scared of change because if I change something I know where it breaks.&lt;br /&gt;&lt;br /&gt;My solution was to understand what I wanted from the facade class.  You could call it a controller class really so it is going to handle all of the dependencies and while I&#39;m a fan of cutting them down as much as possible, you have to have dependencies someplace.  Since this is such a small program I&#39;m fine putting them there because now I can test the underlying functions in a more precise way.  I&#39;m not just testing a return value, but I&#39;m testing the intent of the function.&lt;br /&gt;&lt;br /&gt;So I created an interface to the Tag.cs file.  This will allow me to write to the interface and open it up for testing.  I also removed the dependency in the tag file for the MP3 reader and put it in the facade.  By doing this I opened up my testing to mocking that object.  I was then easily able to test that the function was returning the correct data and formatting it in the way I wanted.&lt;br /&gt;&lt;br /&gt;Before I wrote any UI code, I knew my files where getting renamed in the manner I wanted and they were going to get copied to the correct network share based on the Artist&#39;s name.  All before ever copying a single file to the media server.&lt;br /&gt;Clicking he button calls the facade and it simply worked.&lt;br /&gt;&lt;br /&gt;After I realized I wanted to change the way I had named the mp3 file, I simply changed the test to the output I wanted and ran the test.  Obviously it failed.  But without running the debugger I knew exactly which function failed, fixed the format and ran the test again.  This time it passed.&lt;br /&gt;&lt;br /&gt;As I tested the program through the interface I realized that I had illegal characters in my file name and pathing since music artists have to be weird.&lt;br /&gt;Write some tests with some embedded in the title and artist and bam I now have tests against them.&lt;br /&gt;&lt;br /&gt;The only issue I&#39;m having now is that the mp3 tagger library I&#39;m using doesn&#39;t support v2.4 of ID3.  I think I have some older mp3&#39;s that have different versions of ID3 and so I have to do some manual fudging with iTunes to convert the tags to the right version.&lt;br /&gt;&lt;br /&gt;I didn&#39;t learn much more with TDD, but I did learn more about interfaces, abstract and OOP.&lt;br /&gt;&lt;br /&gt;Wheee.....</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/4842626083574909316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/how-i-solved-it.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4842626083574909316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4842626083574909316'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/how-i-solved-it.html' title='How I solved it.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-2068422762274881419</id><published>2010-05-18T09:17:00.005-05:00</published><updated>2010-05-18T09:58:12.638-05:00</updated><title type='text'>TDD Question</title><content type='html'>Working on my &lt;a href=&quot;http://cisforcoding.blogspot.com/2010/05/music-project.html&quot;&gt;music project&lt;/a&gt; and I decided that I needed a more direct tool to rename my mp3 files.  The best way to do that is to read the tagging info embedded in the file and name and place the file in the right location on the media server.  The idea is to eliminate as much manual copying/naming as possible.&lt;br /&gt;&lt;br /&gt;One thing I realized was that it wasn&#39;t Pollux that named the files, I made that decision myself and had MediaMonkey name them only by title.  And that mistake was documented below.&lt;br /&gt;&lt;br /&gt;I knew the basic premise of how mp3 files work, but I needed more specifics.  I googled mp3 tags and thought about writing my own extraction program, but why redesign the wheel when I figured there had to be some libraries out there.  &lt;br /&gt;&lt;br /&gt;I also figured this would be a good chance to explore visual studio 2010.  Since 90% of the jobs in North East Wisconsin are .net, its best to keep those skills current.  Although there is a certain romance to do it in Ruby or some other new language, but I don&#39;t want to spend any more time on this.&lt;br /&gt;&lt;br /&gt;The first library I found seemed like it was going to work, but it didn&#39;t update all the tags.  It also wasn&#39;t open sourced so I couldn&#39;t update to do the things I wanted.  So I thought I&#39;d use Reflector to see if I could gleam anything useful.  Taking a look at the code I knew it wasn&#39;t going to work for me.&lt;br /&gt;&lt;br /&gt;The next library I found was on source forge called, &lt;a href=&quot;http://sourceforge.net/projects/csid3lib/&quot;&gt;C# ID3 Library&lt;/a&gt; not only did this include the source, but it was wrapped within a couple of dialogs to use as examples.  It even had some test projects.&lt;br /&gt;&lt;br /&gt;I started writing my own tests to extract the file&#39;s location.  I abstracted the reading of the tags into its own file, passing the file&#39;s location.  I then created the new file name along with its new location doing some string manipulation.&lt;br /&gt;&lt;br /&gt;I did some Mocking with &lt;a href=&quot;http://code.google.com/p/moq/&quot;&gt;Moq&lt;/a&gt; with &lt;a href=&quot;http://www.nunit.org/&quot;&gt;NUnit&lt;/a&gt; and using an interface I was able to mock the object getting the correct tags and creating the right file path.&lt;br /&gt;&lt;br /&gt;I then wanted to wrap the whole process within a facade.  As I developed my routines, I wrote unit tests to make sure each function behaved as predicted by the tests.  But then I realized that I didn&#39;t want the facade to have the dependency of the Mp3file class that reads the file.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ooNEa0KxYp0kujh6oH1q0fFpTtSittzg2-LFnHk7N6cJDLqv_1nuBlD2M7mAsR6Xj9FwWNZqns90kI52q9AVmrQ7e2Cb4bpcJVs9q-xvVR7q_G8jn5bUKP-wYwvEuNHt9J-CiA7VUCk/s1600/UML-MP3.jpg&quot;&gt;&lt;img style=&quot;float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 134px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ooNEa0KxYp0kujh6oH1q0fFpTtSittzg2-LFnHk7N6cJDLqv_1nuBlD2M7mAsR6Xj9FwWNZqns90kI52q9AVmrQ7e2Cb4bpcJVs9q-xvVR7q_G8jn5bUKP-wYwvEuNHt9J-CiA7VUCk/s320/UML-MP3.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5472620785163953954&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I wanted to make Tag an Internal class so that only the facade can access it.  As I&#39;m typing this I should make an ITag interface file to access the Tag.cs and abstract that out.  That way if I want to reuse it, then all I need to do is call the interface.  &lt;br /&gt;&lt;br /&gt;Anyways as I was refactoring last night I realized that I&#39;d have to add attributes to allow my test project access my internal classes so I could keep my unit tests.  My thought however was to write a unit test around the facade method RenameMP3File.&lt;br /&gt;But this got me thinking, if I did that then I would lose the ability to mock the MP3Tags object.  The Tags.cs constructor instantiates the MP3Tags file with the file name and fills the properties I need.  The facade is doing a great job of hiding this functionality, but now I can&#39;t mock my MP3Tags object.&lt;br /&gt;&lt;br /&gt;So I have two options that I can think of, exposing the Tags class so I can continue to use my unit tests as already configured.  Or change my unit tests to test only the facade method, but losing the ability to mock my object up thus my tests are brittle.  I suspect there is a third way, but I think I&#39;m missing it. &lt;br /&gt;&lt;br /&gt;I know in the end that this is a small project and won&#39;t expand much, but I&#39;m using as an exercise to try to keep my skills up and active since I&#39;m looking for work.  While I know I can get this to work, I don&#39;t want to fall out of the TDD methodology to slap it in to work.  I know this changed when I added the facade logic outside of TDD, but then I would have had to add that dependency up the line.  Is that a bad thing?&lt;br /&gt;&lt;br /&gt;Well any thoughts you have would be appreciated.</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/2068422762274881419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/tdd-question.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/2068422762274881419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/2068422762274881419'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/tdd-question.html' title='TDD Question'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ooNEa0KxYp0kujh6oH1q0fFpTtSittzg2-LFnHk7N6cJDLqv_1nuBlD2M7mAsR6Xj9FwWNZqns90kI52q9AVmrQ7e2Cb4bpcJVs9q-xvVR7q_G8jn5bUKP-wYwvEuNHt9J-CiA7VUCk/s72-c/UML-MP3.jpg" height="72" width="72"/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-8003908078026731469</id><published>2010-05-18T00:04:00.005-05:00</published><updated>2010-05-18T01:01:19.185-05:00</updated><title type='text'>The music project</title><content type='html'>A bit of a preface is needed here.  I am organizing my mp3 music collection, which by most people&#39;s standards is a lot (around 40k mp3 files).  Simply stated is that I have a ton of music and I&#39;m trying to figure a way to best organize it.&lt;br /&gt;&lt;br /&gt;I started with a hard drive full of ripped mp3s that were haphazardly thrown for storage and I wasn&#39;t keen on keeping good play lists so I organized most of my music for each person by windows folders.  It was easy to sync to multiple devices. (don&#39;t roll your eyes at me!).  I ended up with a mess of duplicate songs.  I spent the last few days &quot;flattening&quot; out the songs into a few directories located on my media center.&lt;br /&gt;&lt;br /&gt;I copied them to my local drive and then ran the &lt;a href=&quot;http://polluxapp.com/&quot;&gt;Pollux application&lt;/a&gt; to make sure my tags were clean and adding the lyrics.  For $10, its a good app for what it does, but I did wish it had more options to help me with getting my files organized.&lt;br /&gt;&lt;br /&gt;I had a problem copying files from subdirectories to a parent directory on the mediacenter.  I looked at robocopy and others, but I didn&#39;t want to spend three hours writing a script for another program, so I took about thirty minutes and wrote a quick wpf app to set parent source (it spidered through all subdirectories looking for any mp3&#39;s) and a destination drop on the media center.  I put a check for duplicate filenames to ignore and diskspace.  All was well.&lt;br /&gt;&lt;br /&gt;Having 10K plus songs in a single directory got a bit overwhelming if I needed to search without &lt;a href=&quot;http://www.mediamonkey.com/&quot;&gt;MediaMonkey(MM)&lt;/a&gt;/&lt;a href=&quot;http://www.apple.com/itunes/&quot;&gt;ITunes&lt;/a&gt;.  So I had MM rename/copy the tracks and put them into a folder structure that was like \\mediacenter\drive C\A\Aerosmith&lt;br /&gt;then all of Areosmith&#39;s songs would be in a single folder.  If I wanted to sort by name or by album I can view that in windows explorer or better yet in MM or ITunes where I would be managing the files 90% of the time.&lt;br /&gt;&lt;br /&gt;I completed the task!  &lt;br /&gt;&lt;br /&gt;All my songs were nicely arranged on my mediacenter drives with extra space to spare amongst them.  However I noticed a couple of issues as I loaded the mass of mp3s into my MM.  &lt;br /&gt;&lt;br /&gt;The first issue when flattening out the files and copying to the mediacenter pc, I ignored if a song was already there by the same name.  I was trying to eliminate the 500 Beatles songs into 300 since I have many cds that have the same Beatles song.  Trying to save on space and reduce the volume of files to shift through.  But a band can remix the song by the same name and I&#39;d end up with only one version of the song.&lt;br /&gt;&lt;br /&gt;The second mistake was if the two different bands had the same name for a song.  For example Breathe is a popular song title.  Since I renamed all the mp3&#39;s to its simplist form (only its title), my fix for duplicate files backfired again.&lt;br /&gt;&lt;br /&gt;So I realized I needed to go back to my source and recopy these again, but I needed to do this smarter since it takes a while to copy and arrange all these songs.  So I decided to write another program that did more than simple copy files and move them around.  I need something smarter.&lt;br /&gt;&lt;br /&gt;I need to start from scratch since I have no idea which songs I&#39;ve lost.&lt;br /&gt;But now I have some &quot;requirements&quot; to my program.&lt;br /&gt;&lt;br /&gt;I have three problems to solve here:&lt;br /&gt;&lt;br /&gt;1.  I need to re-run Pollux to retag my music.  I need to make sure they do not get renamed in such a way that I lose duplicate songs.&lt;br /&gt;&lt;br /&gt;2.  I want to keep the directory structure I currently have Drive/alphabet/artist/ but I want to reduce the steps it takes me to get from my mess on my portable drive to my media center.&lt;br /&gt;&lt;br /&gt;3.  I need to come up with a naming convention for my songs to avoid the problems above, but I need to ask the end user if having the same song from different albums is really a problem?  Since I&#39;m trying to automate this organization, I&#39;m going to have to say that I will have to live with having duplicates from different albums so I don&#39;t lose different versions, but I will ignore having the same song from the same album, which is a possibility at times.&lt;br /&gt;&lt;br /&gt;Tomorrow I will post about item #3 and my discovery with TDD and how I started and how it ended up.&lt;br /&gt;&lt;br /&gt;Venthor</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/8003908078026731469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/music-project.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/8003908078026731469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/8003908078026731469'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2010/05/music-project.html' title='The music project'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-4248231802895495820</id><published>2009-05-08T08:07:00.003-05:00</published><updated>2009-06-15T10:02:06.355-05:00</updated><title type='text'>Off shore development</title><content type='html'>At the company I work for we have gone through two phases of off-shore development.  The first phase used the popular more for less coding scheme.  Before I came onto the project it was determined that we can outsource the business logic of our internal web application to a group of Indian developers.  They had promised to release the code within a few months and when it came time to deliver....well you can imagine the horror.&lt;br /&gt;&lt;br /&gt;The room was filled with all the right people within the company seated around a projector as the developers showed their achievements.  They stepped through the demo and except for a few glitches the application seemed to work as intended.&lt;br /&gt;&lt;br /&gt;When the US developers begin to look at the code they checked in, it was discovered they had hardcoded close to 35% of the code to make it appear that it would work.  From that moment on, it was a battle between the business owners on what they expect to have completed and what the Indian firm would deliver.&lt;br /&gt;&lt;br /&gt;Unfortunately this was the tip of the problem, the developers had written code that followed every &lt;a href=&quot;http://en.wikipedia.org/wiki/Anti-pattern#Programming_anti-patterns&quot;&gt;anti-pattern&lt;/a&gt;  imaginable and then some.  To be fair, this project had its problems way before the Indian developers got the opportunity to begin the process of creating a &lt;a href=&quot;http://www.laputan.org/mud/&quot;&gt;big ball of mud&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then the company decided to ramp up developers both in the states and in Asia.  Our company has manufacturing plants in the SE Asia area and they wanted to share the knowledge and experience with our Asian partners.&lt;br /&gt;&lt;br /&gt;I will admit that the US developers at the time had as much experience and talent as our Asian team, which meant none of them had done much .Net programming and NO web development.  They had been sent to a .NET class and some web programming classes six or eight months before they began to develop.</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/4248231802895495820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2009/05/off-shore-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4248231802895495820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/4248231802895495820'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2009/05/off-shore-development.html' title='Off shore development'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4628800998927408654.post-7554054466736506418</id><published>2009-02-19T19:29:00.000-06:00</published><updated>2009-02-19T20:04:30.406-06:00</updated><title type='text'>The Five W&#39;s of this blog...</title><content type='html'>Who,What,Why,Where and When....&lt;br /&gt;&lt;br /&gt;Who?&lt;br /&gt;Hello I&#39;m Bob Dorris and I&#39;m the lead developer for a multi-million dollar project for a manufacturer in the US.&lt;br /&gt;&lt;br /&gt;Where?&lt;br /&gt;I live in NE Wisconsin where it seems like winter 11 months of the year.&lt;br /&gt;&lt;br /&gt;When?&lt;br /&gt;I&#39;ve been at my current position for the past two weeks.  I&#39;ve been a professional programmer for the past twenty years. &lt;br /&gt;&lt;br /&gt;What?&lt;br /&gt;A programming blog to add my two cents into my profession.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;Gives me a place to vent about the things I see on a daily basis.&lt;br /&gt;&lt;br /&gt;So there it is, a brief look into my life as a developer and why I&#39;m starting this blog.   Trust me in the belief that I won&#39;t know everything, but I&#39;m sure I will have an opinion about it.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;Bob</content><link rel='replies' type='application/atom+xml' href='http://cisforcoding.blogspot.com/feeds/7554054466736506418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cisforcoding.blogspot.com/2009/02/five-ws-of-this-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/7554054466736506418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4628800998927408654/posts/default/7554054466736506418'/><link rel='alternate' type='text/html' href='http://cisforcoding.blogspot.com/2009/02/five-ws-of-this-blog.html' title='The Five W&#39;s of this blog...'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>