Monday, April 15, 2013
Javascript: One Language to rule them all, and in the darkness... NO WAIT!
Sunday, March 31, 2013
What's a Kingmaker Without Coin?
Saturday, March 30, 2013
Startups Are the New Nineties Garage Bands
It's not my title but I thought of it before finding this old article. Startups are popping up everywhere. So many people are involved with finding the next big thing. You have incubators all over the place hoping to be a part of the next thing and people wanting to make it big with their idea.
In the 90s everyone had a band or knew of someone in a band. You would have to find talented peeps to fill the different roles and then collaborate to get anything rolling. A few took off and we all know their names now.
Today, you can take your idea to something like Start Garden or an incubator and find peeps to be on your team. What I want to do with BuildItHub is allow anyone with some talent and some social grace to join the band. It might be for one song, a couple gigs or for the long haul, but that is what I want to allow. Just have to find out if others want to play along...
Thursday, March 28, 2013
Learning Ruby on Rails: Is it worth it?
Note: The following post might be me having my own geeky midlife crisis. After all, I am turning 38 this year. So maybe all the young hipsters out there are making me a bit envious. But, maybe it's not a crisis, and maybe the grass is really greener on the other side...
I've been toying around with the idea of learning another programming language. Being interested has not driven me to commit to another language on an actual project though. I think for me it comes down to doing what I know because it's fast, or at least faster than starting from scratch with all the new syntax and tools. Being a hopeful, evening and weekend entrepreneur, usually I'm trying to put a minimum viable product together as fast as I can. Necessity seems to be my driving force.
I've been a .net developer since 2001. When it first came out, or shortly after I had to choose if I'd be a .net or Java Dev. After the decision was made I never really desired to be anything else. I'm not one of those developers who thinks Bill Gates is the anti-Christ, though Balmer doesn't give me the warm fuzzies. I have not jumped on the M$ hate bandwagon, and actually have come to really love Windows 7 (Windows 8 will not be my next OS though). I've never been much of a fan of the console. In fact I'm quite fond of IDEs. Well, I'm fond of Visual Studio, as it's been my main tool of choice for over a decade.
Rails interests me because it seems to have quite a community of really excited craftsman around it. They seem to care about doing things right. By right I mean, as the website says, optimized for developer happiness and sustainable productivity. Supposedly you can build a highly maintainable site very quick [if you know what you're doing].
These new thoughts started a little over a year ago. I'd started doing a lot more front end development and have come to almost enjoy JavaScript. Once I started treating it like a real language, I realized the power that is there. Now something is happening within and I don't believe I'm the only .net develops out there feeling this way. I want to learn something new but a few things stand in my way from pulling the trigger. One - I'm learning to tolerate the console, but I have to admit I'm still not a fan. I know many will not take me seriously after that statement, but i have to be honest. Two - Ruby, Rails and lots of the tools are built around the Unix console being the main tool of choice so it seems the Mac is becoming the new developer machine. Macs are freaking expensive and my current employer isn't going to foot the bill at this time. I could try Ubuntu on my windows machine, but getting it all setup, configured and taking the time to learn the new OS could take me a while. That same while I could be finishing my next MVP in a language I'm pretty good with.
Is it worth the hassle? Am I just being lazy or am I being practical? One thing I am considering seriously is Node.js and Sails.js - Something about an all js and HTML stack really has me intrigued, but how hard will it be with a windows machine? Your thoughts and advice is welcome...
Wednesday, March 27, 2013
Why I love my job this year ;)
Friday, March 22, 2013
Once upon a time...
Saturday, March 2, 2013
Into the Realm of Elves (.net >> rails)
Introduction to My Journey
I'm biting the bullet and learning Rails today. I would be at GRDevDay but didn't get the ticket before they were sold out. So while you are all learning some cool stuff I will do the same. The latest version of the book "Agile Web Dev w/ Rails" just showed up on my kindle and I'm going to take a shot. Yesterday I tweeted...Chadrick Mahaffey @chadrickm I feel like I'm a human venturing into a dark forest trying to follow elves (.net to #rails).
What version do I have?
$ gem list --local railsSo I have 3.2.9 and it appears I might not be able to get 4.0.0.beta1 using windows. So until I invest in a new maGIc book I'll be a bit behind the time, but this is fine for now.
Learning to Use Hand Incantations Again (cmd and SublimeText2)
I'm in the forest now. Time to summon something.
Saturday, January 19, 2013
Silo is a four letter word...
Wednesday, February 22, 2012
A New Metaphore - Epic Story to TV Series
I’m currently reading a book by Ka Wai Cheung called “The Developer’s Code: What Real Programmers Do”. In the chapter called “Metaphor” Cheung writes “...when I’m asked what I do, I often resort to analogy. Our industry is chock-full of them. It’s the way we describe our work to everyone else... metaphor has to become our meta-language. Not only is it how we connect the uniqueness of programming to the general public, but it’s often how we make decisions on how we approach our own software problems.” He goes on to explain how we borrow from traditional building when we speak of building software. We have roles such as engineers, architects, project managers and designers. We have borrowed our very identities from another industry. Some of that made a lot of sense when software releases were done over floppy disk or CD, but not today with the web the way it is. I wont quote the entire chapter, but he ends with the idea that, “Software development might be closer to writing a novel or composing music.” I love the writer analogy and I’ll probably overuse it so much in the future that it will become more harmful than helpful, but let’s have some fun with it.
There is a series of fictional books out by one of my favorite authors. Perhaps you have heard of George R. R. Martin, or perhaps you have heard of the HBO series that is based on his books called, “A Game of Thrones”. It has a very mature rating so be warned if you check it out. My new analogy for software developers and software projects in general is that of the epic book series turned TV series. Writers (Developers) take the original book (Business Processes) with the help of the director (Architects or Leads) and the original author (The Business), and they break it up into seasons and episodes. For now I like to think of the season as the current technologies a project will take advantage of. Each episode is a release with it’s minimum marketable features and these can and should happen much more often than we have allowed them to in the past. As Cheung says, we are on the web and people are now embracing iterative change much more than they use to. In all episodes there are lots of subplots or stories that make up the whole episode. Agile has already defined features as stories, so I’ll just stick with that for now.
Before I read this book and before this analogy, I started calling our sessions by season and episode (S3E2). It was just my funny way of keeping things interesting but now I’m going to rethink the significance of it. I think this is a way better description of our industry today than the bridge or skyscraper analogies of days gone by and as Brian and I co-author Luncht I’ll be thinking about it more and more.
Tuesday, February 14, 2012
Luncht S3E4 - Test Driven DESIGN - Chadrick's Take
There is substantial overhead when doing TDD, but the code is better for it and the knowledge transfer is automatic.
Doing things right takes time and a lot of effort.
What I found was my story bullets, what I call Acceptance Tests, were not completely thought out. It's hard to anticipate what you will be testing until you really spend some time focusing on the feature, which includes how the user will use the system, which in turn means views. Because we were unsure of the acceptance tests we started with wire-framing the two views (ForgotPassword & ResetPassword). Then psudo-coded our implementation in the form of comments so we generally know which services would need to be created. Then at the back-end it was a return to TDD to build our services. Eventually this brought us back up front where we tested our controller actions with mocks of these new service(s). It went pretty well I think, but led me to wonder about a few things.
First, most TDD tutorials only test business rules at the domain level (back end). When in reality we are developing our solution in an all inclusive way. Our features, to be complete need a front to back, or back to front (however you decide) implementation. I'm not saying I want to write a bunch of implementation tests, but we have to be looking at a workflow that covers all these pieces and interaction between these pieces, and I don't think we are there yet.
In the real world, is it possible for the business to write valid acceptance tests that we could convert directly to test methods? How does this work where your features are coming from the business who on one extreme wants to design and architect the entire solution, or on the other extreme doesn't have a clue what he/she wants. I think what we realized is that we developers will almost always end up massaging the acceptance tests while we determine more exact requirements.
Saturday, February 11, 2012
My Second Set of Eyes When I'm Not Pairing
Tests become even more important to me when I'm coding alone. They allow me to focus on the here and now of my code while not having to spend a ton of time thinking about what I will probably break by making a change. They are in essence, my second set of eyes. Just yesterday I changed the very foundation of my current project because I found out I was doing it a bit wrong. (Side note: If I'd been programming as a pair we probably would have found this much sooner.) Rather than hack a fix because I was so far along, which I've done plenty of times in the past, I rewrote the foundation of my code-base. I only attempted this because I had the confidence that my test coverage would help me get back to where I needed to be in a short amount of time.
This quote from Michael Valenty is one of my favorites, "It’s like rediscovering that diet and exercise is the key to losing weight, except that I rediscovered that not having tests really sucks when you have to make changes."
Tuesday, February 7, 2012
Luncht S3E3, UI Testing - Chadrick's Take
Because our second session was a bit difficult I looked up a Plural Sight video on TDD and ASP.NET MVC. It was a very helpful video and led us to the conclusions I've already wrote in my post on Session Two.
After we decided what not to do, Brian did basically all the plumbing for us to implement Selenium tests against various environments. If we couldn't do a view test with TDD maybe we would do a view test with Selenium. Once the plumbing was done we wrote integration tests to validate we had a Registration page and we worked it all the way through to the Successful Account Creation page.
When we got this far we took stock of things and determined that we need to think of the Controller Action as a contract, and test it accordingly. Together we decided we would not be doing the Selenium tests as part of our TDD workflow at all. The third session was profitable and again we learned what not to do, but we are on our way to much more productive sessions in the future.
Retrospective
At the beginning of our session I felt like I had to dig into the recesses of my brain too much to determine where we left off. Those recesses are deep and dark so something had to change. Brian had the solution. He brought up our session doc and added a quick paragraph to that end. I'm looking forward to seeing if that helps us jump right into the code.
MVC Model Binding Feature Request
Model binding is smart but I really wish it would take care of my spelling errors for me ;)
Monday, February 6, 2012
Be Productive - RescueTime
I heard about this service at CodeMash (thank you Scott Hanselman) and I started using it a short while ago. It has literally made this blog possible for me. If you are a knowledge worker who works on a computer, has multiple meetings, email and IM to answer, and other things that distract you through the day RescueTime is for you. Give it a try. The basic version is "forever free" and it's worth it IMH(BC)O.
Friday, February 3, 2012
Paired Programming vs. Getting Input from a Co-Worker
So now that we have some experience in Ping Pong Pairing (PPP from now on), albeit limited, I find that while I'm working through some problem solving I'm also wishing I had another programmer to work along side. It's not good enough to get some co-workers opinion on the matter anymore, even though that's better than programming in a silo. When you are working together on the same code-base, you are both invested fully in the solution. You don't get half-thought-out, non-real-world psudo-solutions (man-I'm-using-a-lot-of-dashes). While doing PPP you are forced to understand the domain context and think through the code together. You are forced to think through the code and come up with a concrete solution together and I think this is a huge advantage verses the advantages or sometimes disadvantages to getting a co-workers opinion about your work.
Thursday, February 2, 2012
About time for some contribution
Wednesday, February 1, 2012
Luncht S3E2, Controller Testing - Chadrick's Take
We spent a lot of time writing controller tests and trying to figure out how to get the rendered HTML from Controller.Index() What we didn't understand at the time was that this is not really the way it is designed to be tested. We still learned a lot even though it was learning how NOT to do things.
Basically if you are going to be testing MVC don't try to test the rendered results of a controller action. You can test that the ViewResult has the correct Model and that the View exists by checking for an empty ViewResult.Name, but don't expect to test the rendered HTML. Brian made a good point when he said, "Our views should be stupid. If anything is going to be smart it needs to the be the business layer and the controller needs to know hot to access the business layer." Now that is not word for word, but it's how I heard it. I question if this would be true for heavy client side scripted apps.
Still having a lot of fun with this, so keep an eye out for our future postings.
Tuesday, January 31, 2012
Luncht v.3 - Password Reset
Not sure if we will get to this feature tonight but I'll try to keep one step ahead of our sessions so we are not wondering what is next.
Password Maintenance
As a user I need to be able to reset my password if I've forgotten what it is or whenever I would like to change it.
-
Key Is Created for forgotten Password
A key needs to be created that will be sent to the user in the form of a link. -
Key and New Password Required for Reset
If key does not match we will error out. -
New Password Will Be Encrypted
We never want to see the password so the new one will be encrypted. -
Email and New Password Will Validate User
If Email and New Password match the user will be valid. -
If User is Validated Password Can Change Without Key
If the user is logged in the key is not required for password reset.
I think this is doable in one session. If not it's not a big deal.
Monday, January 30, 2012
Luncht v.3 - Session One - Chadrick's Take
I want to start by thanking Brian for trying TDD & PPP. I knew he had (maybe "has") a tendancy to shy away from pairing and I appreciate his openness to try it.
I also want to thank Dan Tape for throwing out the suggestion that we try Google Hangout for our dev sessions. As far as I'm concerned it's as good, and perhaps better than real life. Now we can base our showering habits wholly on our wives desires to be around us. if you have not tried Hangouts, do it and save some soap.
I had pre-written a feature called 'Registration' with a few bullets of acceptance tests to start with. I was basically following our precompiler format. Then because we are both familiar and fans of Pivotal Tracker I converted that item to a story with tasks for each of the acceptance tests.
Registration
As a user I need to be able to register for a new account so that I can use the system.
- Required Property FirstName
User needs to have a FirstName property and it is required. - Required Property LastName
User needs to have a LastName property and it is required. - Required Field Email
User needs to have a Email property and it is required. - Required Field Password
Password field is encrypted once set. - Password Field Needs to be Encrypted
User needs to have a FirstName property and it is required. - Default Chat Notifications
During registration users are will be signed up to receive chat notifications. - Default Deal Notifications
During registration users are will be signed up to receive deal notifications
When we opened Visual Studio we started with a class library project and loaded NUnit and Moq with Nuget. We had one test at first with all the fields in it, but later refactored it so that each prop had its own test.
[TestFixture(Description = "As a user I need to be able to register for a new account so that I can use the system.")]
public class Registration
{
[Test(Description = "User needs to have a FirstName property and it is required.")]
public void RequiredPropertyFirstName()
{
// Arrange & Act
const string firstName = "blah1";
var user = new User( );
user.FirstName = firstName;
// Assert
Assert.AreEqual(firstName, user.FirstName);
}
[Test(Description = "User needs to have a LastName property and it is required.")]
public void RequiredPropertyLastName()
{
// Arrange & Act
const string lastName = "blah2";
var user = new User( );
user.LastName = lastName;
// Assert
Assert.AreEqual(lastName, user.LastName);
}
}
As you can see I've started putting the text inside of Description of the Test. I have an idea for a code generator that would build these tests out with an [Ignore] attribute on them. I might write about this in a future post. But as you can see we build our tests based on the required acceptance tests. Understand properties are not the sexiest of tests to write and perhaps a bit overkill, but it's TDD and we are 100% sure when done means done.
For most of this session we just did domain object tests. They were very basic and that allowed us to practice the Red >> Green >> Refactor Ping Pong Pairing workflow. For those of you who don't know what that is I'll give a quick run-through.
- I start by writing a failing test. We decided our code had to compile so we had to create what was necessary for that to happen. I pushed the code to BitBucket for Brian.
- He implemented the code to make the test pass and then checked it into HG and pushed it back to BitBucket.
- We talked through things if necessary and refactored it accordingly.
- Now it was his turn to write the failing test, so we jumped down to the next bullet.
- I implement...
- He refactors...
- ...repeat
I was happy how it went. I'll let Brian give his own take on it.