Failing to affect change

I failed quite hard several years back and I have been using it as a reference point to how I currently conduct my professional career and conduct. From that point forth I have been trying to be a force for change within my workplace and have seen quite a lot of good side affects come from this behavior. I noticed those with similar interest and personalities were drawn to this positive behavior and many of us were able to accomplish great things in a short amount of time. We started by empowering ourselves and removing all obstacles mainly excuses for not being able to deliver. While a large percentage followed this example and were excited about the potential opportunities when empowering themselves, others were resistent to any change to their current work habits.

It has been two years since I changed to this new behavior and it has paid dividends, but I am still purplexed by those that lagged behind. Why haven’t they been interested in changing their work habits to align more with this customer focused environment we are fostering in our organization? So, I have spent time on thinking about this question and I realize that I need to put myself in the same frame of mind I was when I was failing at my job not when I was succeeding. Here are my thoughts.

Let’s start with the most human point. One’s relationship to others.

Trust and personal relationships

My personal relationships started off okay with those in my previous employment but there it was poisoned from the start. I did not trust those that I worked with. I did not have the maturity to know how to compromise or how to listen to others. Did not look at the bigger picture when I was just heads down trying to get things done and pulling 20 hour days. A mixture of being constantly tired and lack of people I could call friendly at work caused me to stress beyond my breaking point. With the lack of support and those I could count on, my lack of trust just compounded the problem to the point that I lost sight of everything that was truly important in the being part of startup; the customer.

Without the customer there will be no company. Without the customer, all you are doing is for self satisfaction - “Look at how I was able to spin this code into the most elegant thing since the Mona Lisa.” The problem is that while taking pride in the small parts of you job is able to keep you going in the short term; without anything to show for it, you won’t have a job. A customer is not going to pay you for how cool your code is when they are getting nothing in return.

I lost myself in the minutia of the day to day just because I could not resolve my trust issues with those around me.

Know your situation and purpose

When I agreed to participate in this startup I underestimated what type of personal toll it would take on my mental health and my relationship with my family. I expected that this was going to be fun and games and we were going to deliver the latest and greated pieces of technology that mankind has ever seen. But it soon became apparent that time was not on our side. I was not going to create a product that would take over the market. We were creating something for a single client. We were essentially a services company that delivered software.

There was no money to take the time to truly plan out technology, there was only the limited amount of money that the customer was paying us to deliver functionality they requested. Thinking about scale was not their main concern. The customer’s single focus was to replace their current system with what they currently had. Plus, the startup’s main objective was to fund their ability to grow into something beyond what they were delivering for this one customer.

So what did I miss here? I didn’t fully understand why I was there. I was there to make our company money and was through focusing on what the customer wants.

How does this apply to my current situation?

So trust and relationships, finding purpose in work and focusing on the customer or the lack there of is the difference between my current successes and previous failures respectively. Now understanding this, how does one connect with the other that is on the other side of this large divide? Does one throw up their hands and forget and/or replace those on the other side of the divide?

Finding new tactics

While some of my tactics have worked with the majority of people I interact with there is a subset that is flat out rejecting my approach to things. This has caused me to be frustrated which continues to compound the ability to connect with them.

I need to find another way to connect and reach those who are rejecting the change. I don’t have the answers yet but here are some of my initial thoughts.

  1. Relationship - Forget about work and take them out to lunch. I just need to turn off work for a week, month or more to build up a relationship with these other people. Somehow distance myself from them in a work atmosphere and build a personal relationship instead. Others can be incharge of interfacing with them in a work capacity while you let old wounds heal and allow for them to see a different side of you.
  2. Slow down the change - Some are not receptive to change and will flat out reject it if it is too abrupt. This will work in certain situations where the work is necessary but at the same time can be mitigated by other means. This also needs to be balanced with the simple fact that one cannot slow down the value-add that one is currently championing.
  3. Building leaders - Take a step back. Let others take the lead. Some people don’t want to follow but lead themselves. The issue comes when you need to course correct a leader who thinks their approach is correct and yours is wrong. There lies the need for my personal growth in leadership. How to face these very difficult personalities and try to change their minds.
  4. Servant rather than leader - Maybe the best way to build trust is to lead by example. Show them that they can be the customer and others are there to help serve them. Maybe being pampered and receiving support from those that are supposed to be your customer can help build that trust that was missing before. I am asking these others to do work like I do work but for what in return? Maybe that is the problem, they are not seeing the purpose or the reward that comes with servicing your customer.

Anyway, I hope this self help exercise helps others as it help me come up with some other ways to think about building relationships at work with those you find the most difficult.

Markdown editor Typora

I am energized about this new way to blog using Jekyll that I have asked others to help me find a better markdown editor. I’ve been using Visual Studio Code that gives you a side by side comparison of the code and the rendered version which is pretty cool but still doesn’t seem fluid enough.

I coworker pointed me to Typora. It is a WYSIWYG editor where you write in markdown and the style of your code is formatted realtime. The tool supports keyboard shortcuts and other nice helper functions to help you focus on the content instead of the styling.

I will be testing out the tool as I go and hopefully write up a followup with more details on the tool. So far my feedback is positive. By the way, I wrote this post using the tool.

Moved to GitHub Pages with Jekyll

After many years of ignoring my website and at the same time trying to find a toolset that will help me with a project I had in mind for 2018, I decided to spend the weekend doing simple research on static websites. I have read up on Jekyll in the past and new that GitHub Pages was something that was starting to catch on, but did not realize how simple it is to stand up a site.

I spent maybe 4 hours trying to stand up my site and here is what I came up with. The skin was purchased on ThemeForest which happened to be called Steve. Can’t be more perfect! Was able to simply migrate my previous posts, not that many so it wasn’t much of a chore. And presto, new website and a minor change in DNS has everything moved over without any issues.

I will try to post at least one time a month if not more than that, so will try to make this a priority.

Anyway, I highly recommend this approach and think many developers will find this easy to work with and easy to maintain. The development environment is familiar and who really cares if the source control is open to the world to see.

Does Queryability and Lazy Loading in C# blur the lines of Data Access vs Business Logic?

I am experiencing a mid-career philosophical architectural crisis. I see the very clear lines between what is considered client code (UI, Web Services, MVC, MVP, etc) and the Service Layer. The lines from the Service layer back, though, are getting more blurred by the minute. And it all started with the ability to query code with Linq and the concept of Lazy loading.

I have created a Business Layer that consists of Contracts and Implementations. The Implementations then could have dependencies to other Contracts and so on. This is handled via an IoC Container with DI. There is one service that handles the DataAccess and all it does is return a UnitOfWork. This UnitOfWork creates a transaction when extantiated and commits the data on the Commit method. View this Article Testability and Entity Framework 4.0.

public interface IUnitOfWork : IDisposable {
    IRepository<T> GetRepository<T>() where T : class;
    void Commit();
}

The Repository is generic and works against two implementations (EF4 and an in-memory DataStore). T is made up of POCOs that get generated from the database schema or some EF4 object mapped from multiple DB objects. Testability is built into the Repository design. We can leverage the in-memory implementation to assert results with expectations since we are abstracting the data access query generator.

public interface IRepository<T> where T : class {
    IQueryable<T> Table { get; }
    void Add(T entity);
    void Remove(T entity);
}

While the data source is abstracted, IQueryable still gives me the ability to create queries anywhere I want within the business logic layer. Here is an example.

public interface IFoo {
    Bar[] GetAll();
}

public class FooImpl : IFoo {
    IDataAccess _dataAccess;
    public FooImpl(IDataAccess dataAccess) {
        _dataAccess = dataAccess;
    }

    public Bar[] GetAll() {
        Bar[] output;
        using (var work = _dataAccess.DoWork()) {
            output = work.GetRepository<Bar>().Table.Where(b => b.IsActive == true).ToArray();
        }
        return output;
    }
}

Now you can see how the queries could get even more complex as you perform joins with complex filters.

Therefore, my questions is:

  • Is queryability considered data access or business logic when behind a repository layer that acts like an in-memory abstraction?

This article was originally a question posted on StackOverflow.

The iPhone is a big waste of time

I just got an iPhone and I have to admit that it is a great devise for business purposes. But in the hands of a teenager, or someone that has never grown up, I can see how it could be the biggest waste of time.

I will try not to fall into the deep abyss that could be the iPhone.

Red Gate’s SQL Source Control

I have been looking for a product like this for years and it is almost here. I am talking about an integrated source control IDE for SQL Server. Check out the following link and the details below:

SQL Source Control

Store your SQL Server databases under source control

  • Source control your database
  • Work directly in Management Studio, not with offline scripts
  • Connect your database to your existing source control system
  • Know who changed what, when, and why
  • Help the whole team stay in sync by easily getting the latest database version

There will be frequent early access releases as we develop SQL Source Control

  • The first early access release will support only Subversion
  • The next early access release will support Team Foundation Server
  • They’ll release version 1 in 2010
  • Sign up for the early access program and they’ll keep you updated

http://www.red-gate.com/products/SQL_Source_Control/index.htm

Work, Vacation and back to Work

Work just seems to follow me everywhere, including on my vacations. It has been extremely hectic here at BravePoint for the past 4 months. Trying to get a product out the door and it just seems like we are moving through mud. It has been a combination of distractions and lack of momentum, but hopefully we can get back on track.

Here is a list of technologies we have been working on:

  • SmartClient 7.0 RC (RIA framework)
  • ExtJS 2.0
  • BIRT & Java
  • ASP.NET MVC 1.0
  • An in-house Webspeed RPC Engine

I have been learning none stop and hopefully it will attract more clients as we start gaining more and more experience in these different areas. I will try to get a little more technical on my subsiquent post. I know that I always say that but, like I said, I have just been too busy.

I have finally made the switch to DreamHost

I have abeen with godaddy for the better part of decade and now I am dreaming with DreamHost. The ease of their hosting panel. The price is respectable, especially since I took advantage of the 777 coupon that they published on their splash page (one year hosting for less than $10). They give you unlimited space and traffic.

I was able to transfer my wordpress blog in a matter of minutes. The databases setups are almost instantaneous. And the ssh access is fantastic. They give you close to full rights under your home directory.

I also setup a couple of subversion repositories and installed redmine as my project management site. And this is coming from a complete newbie to the linux world. I have been a windows guy thru and thru, up to about a month ago. To be honest, the speed and ease of setup of a lamps web site trumps all else.

DreamHost also gives you the ability to host multiple sites with different webapps from the same account. I am completely sold. I only hope that the early success I have had with this hosting provider lasts more than a couple of weeks.

Posting to my WordPress blog using MS Word

This is a test of me posting to my blog using MS Word and the MetaWeblog XML-RPC engine. This will help me blog more often than I have in the past.

I will try to be a little more fruitful in the future with more technically oriented posts.

Dynamically loading javascript files

Below is a little piece of code that helped us facilitate dynamically loading javascript files.

// Please go here for details on the script below:
// http://unixpapa.com/js/dyna.html
var head = document.getElementsByTagName("head")[0];
var script = document.createElement('script');
script.setAttribute("id", id);
script.setAttribute("type", 'text/javascript');
script.setAttribute("src", url);
script.onload = function(){
   loadedCallback(sender, id);
};
script.onreadystatechange = function(){
   if (this.readyState == 'loaded' || this.readyState == 'complete') {
      loadedCallback(sender, id);
   }
};
head.appendChild(script);

As you can see the same callback loadedCallback(sender, id); is called twice. The first under the load function is only picked up by Firefox, Opera, etc. and the onreadystatechange is a Microsoft event. Took me forever to figure the Microsoft solution.