in

 

Mo Khan's Blog

  • The FUN-duh-MENTALs

    So tonight I got to help demo what a fishbowl was at the ALT.NET Canada (thanks Doc!) conference and the topic of discussion was on the Fundamentals of Software development. During the session I started to realize that what I considered to be fundamental seemed to be far from what others did. After a few discussions I started to think that the fundamentals were different based on generational divides.

    I'm speaking for myself, but hopefully for my generation, but when I hear "The Fundamentals of .NET development" I think, Object Oriented Programming, Design Patterns, a knowledge of the syntax of a language, and at least a base understanding of what the CLR is and what it provides for us.

    Some other takes on fundamentals were focused on understanding how the underlying operating system works, Algorithms and Data Structures.

    This got me a little depressed because I don't have an intimate knowledge of how the underlying operating system works, or how to perform a deletion from a red-black tree, or how to implement a half decent hashing algorithm. Ask me to build an AVL tree and I might puke, or at least ask "why? it's 2008" I have a base understanding, but I'm not sure if that counts as the required fundamental knowledge to build a decent app.

    When I was writing C, I cared a lot about writing well optimized code. I cared about memory allocation/de-allocation. I cared about protecting from buffer overruns. I cared about so many things, that I just don't think about, as much, now as a .NET developer. All the things I don't have to be concerned about allows me to focus on other things that I want to care about.

    It seems like we developers are proud of being an expert at something, but when that something becomes less and less relevant in building applications today, we tag it as "fundamental". Perhaps in 10 years or so the next generation will wonder why they would need to understand object oriented programming to build valuable applications. After all it will all be written in DSL's, right?

    Couple of more pennies for ya!

  • Droppin' Pennies on context specs...

    First off I want to make it clear that I'm not a guru on the topic, but I do find it interesting. The topic of course is Context Based Specifications. I've seen an emergence in interest in writing context based specifications lately on the blogosphere. However, everyone seems to be advertising it slightly differently...

    One of the things that our team tries to aim for is to keep technical language out of our specifications. They should be human readable sentences, not "Yoda" speak. This is crucial if we want non technical people to actually read our specs to make sure the code is inline with what the business is attempting to do. The goal, in our humble opinions, is to work closer towards the ubiquitous language. The benefit is that documentation is updated along with the code, because it is the code.

    Something that reads..

    when_the_account_controller_is_given_valid_arguments_on_the_register_account_action

    Doesn't read as easy as:

    when_registering_a_new_account

    Another subtle change that our team made was to put the specs above establishing the context. In some cases it just seem to read better from top to bottom.

    when_creating_a_new_account_for_a_user_with_a_valid_submission

    - it_should_inform_the_user_that_the_account_was_created

    - it_should_save_the_new_account_information

    under_these_conditions

    because_of

    "It" being the system under test.

    We don't always get it right, but by trying to drop the technical language we force ourselves to step away and think about the problem that we are ultimately trying to address.

    Again... this is just my our 2 cents.

    Posted Aug 15 2008, 09:08 AM by mo.khan with 4 comment(s)
    Filed under:
  • Parsing The Payload

    project_referencesSo this week we got to start working a brand spanking new MVC project. So far we're leveraging Castle Windsor, NHibernate, Fluent Nhibernate, and kind of running Linq to NHibernate. It's amazing how quickly you can get a project up and running in such a short amount of time. (BTW, Fluent NHibernate rocks!) When you're building off the trunk of these projects, it's almost like the contributors to all these great projects are extended members of the team. Thank you all!

    Moving on... One of the things that are cool, but also slightly annoying, is how the MVC framework parses out items from the http payload to populate any input arguments on controller actions.

    It's great how it just works, but it's a little annoying if it's under test and you have to add more fields, or remove fields from a form, then you have to go update the signature of the action then go update the test.... yada yada The changes just ripple down...

    So one thing we tried out this week was to create a payload parser. What this guy does is take a DTO parse out the values for each of the properties on the DTO from the current requests payload and fill it. This makes it easy to package up the form parameters in a nicely packaged DTO and fire it off down to a service layer to do some work.

    So instead of declaring an action method on a controller that looks like this, where the signature would have to change based on what fields are submitted on a form:

    viewresult register_new_account(string user_name, string first_name,string last_name)

    we can write this...

    public viewresult register_new_account() {
        var accountsubmissiondto = parser.mapfrompayloadto<accountsubmissiondto>();
        var validationresult = task.validate(accountsubmissiondto);
        if (validationresult.isvalid) {
            task.submit(accountsubmissiondto);
            return view("Success", accountsubmissiondto);
        }
    
        return view("Index", validationresult.brokenrules);
    }
    

    this better allows us to adhere to the ocp. if we need to include additional fields on the form, we can add them to the form as long as the control name is the same as the name of the property on the dto that it will be bound to. the implementation of the payload parser is quite primitive for now, but at the moment it's all that we needed.

    first up the specs... simple enough, for now!

    public class when_parsing_the_values_from_the_current_request_to_populate_a_dto : context_spec<ipayloadparser> {
        [test]
        public void should_return_a_fully_populated_dto() {
            result.name.should_be_equal_to("adam");
            result.age.should_be_equal_to(15);
            result.birthdate.should_be_equal_to(new datetime(1982, 11, 25));
            result.id.should_be_equal_to(1);
        }
    
        protected override ipayloadparser undertheseconditions() {
            var current_request = dependency<iwebrequest>();
            var payload = new namevaluecollection();
    
            payload["Name"] = "adam";
            payload["Age"] = "15";
            payload["Birthdate"] = new datetime(1982, 11, 25).tostring();
            payload["Id"] = "1";
    
            current_request.setup_result_for(r => r.payload).return(payload);
    
            return new payloadparser(current_request);
        }
    
        protected override void becauseof() {
            result = sut.mapfrompayloadto<somedto>();
        }
    
        private somedto result;
    }
    
    public class when_parsing_values_from_the_request_that_is_missing_values_for_a_properties_on_the_dto :
        context_spec<ipayloadparser> {
        private accountsubmissiondto result;
    
        [test]
        public void it_should_supress_any_errors() {
            result.lastname.should_be_null();
            result.emailaddress.should_be_null();
        }
    
        protected override ipayloadparser undertheseconditions() {
            var current_request = dependency<iwebrequest>();
    
            var payload = new namevaluecollection();
    
            payload["FirstName"] = "Joel";
            current_request.setup_result_for(x => x.payload).return(payload);
    
            return new payloadparser(current_request);
        }
    
        protected override void becauseof() {
            result = sut.mapfrompayloadto<accountsubmissiondto>();
        }
        }
    
    public class somedto {
        public long id { get; set; }
        public string name { get; set; }
        public int age { get; set; }
        public datetime birthdate { get; set; }
    }
    

    the current implementation:

    public interface IPayloadParser {
        TypeToProduce MapFromPayloadTo<TypeToProduce>() where TypeToProduce : new();
    }
    
    public class PayloadParser : IPayloadParser {
        private readonly IWebRequest current_request;
    
        public PayloadParser(IWebRequest current_request) {
            this.current_request = current_request;
        }
    
        public TypeToProduce MapFromPayloadTo<TypeToProduce>() where TypeToProduce : new() {
            var dto = new TypeToProduce();
            foreach (var propertyInfo in typeof (TypeToProduce).GetProperties()) {
                var value = Convert.ChangeType(current_request.Payload[propertyInfo.Name], propertyInfo.PropertyType);
                propertyInfo.SetValue(dto, value, null);
            }
    
            return dto;
        }
    }
    
  • Disciplined Agility

    I finished reading...

    Agile Principles, Patterns, and Practices in C# (Robert C. Martin Series)
    by Robert C. Martin, Micah Martin

    Read more about this book...

     

    What an excellent book, seriously! It was written by Robert C. Martin and his son Micah. The following is a list of excerpts from the book that I can appreciate:

    "Continuous attention to technical excellence and good design enhances agility. High quality is the key to high speed. The way to go fast is to keep the software as clean and robust as possible. Thus, all agile team members are committed to producing only the highest quality code they can. They do not make messes and then tell themselves that they'll clean up when they have more time. They clean any messes as they are made."

    "The goal of refactoring, as depicted in this chapter, is to clean your code every day, every hour and every minute. We don't want the mess to build. We don't want to have to chisel and scrub the encrusted bits that accumulate over time. We want to be able to extend and modify our systems with a minimum of effort. The most important enabler of that ability is the cleanliness of code."

    "Specifying contracts in unit tests. Contracts can also be specified by writing unit tests. By thoroughly testing the behavior of a class, the unit tests make the behavior of the class clear. Authors of client code will want to review the unit tests in order to know what to reasonably assume about the classes they are using."

    "Databases are implementation details! Consideration of the database should be deferred as long as possible. Far too many applications were designed with the database in mind from the beginning and so are inextricably tied to those databases. Remember the definition of abstraction: "the amplification of the essential and the elimination of the irrelevant." At this stage of the project, the database is irrelevant; it is merely a technique used for storing and accessing data, nothing more."

    "This style of testing is called behavior-driven development. The idea is that you should not think of tests as tests, where you make assertions about state and results. Instead, you should think of tests as specifications of behavior, in which you describe how the code is supposed to behave."

    Posted Aug 09 2008, 11:02 AM by mo.khan with 3 comment(s)
    Filed under:
  • Disconnected - Channels Of Communication

    A few weeks ago I started feeling a little over whelmed by the volume of interest in what I was up to. After reading a chapter from Tim Ferris' book, I decided to disconnect. It was the most effective advice I could have ever received. I went cold turkey. I turned off my phone and put it in a drawer. I completely stopped checking my email, and wouldn't allow myself to "surf" the net.

    The result after a couple of weeks, I feel liberated... and refreshed!

    The 4-Hour work Week: Escape 9-5, Live Anywhere, and Join the New Rich
    by Timothy Ferris

    Read more about this book...

     

    The first couple of days were hard, I had the itch. I kept wondering... "what if an emergency happens and someone needs to get a hold of me?" There was no emergency, and the best part no shackles. When I finally checked my email, I spent 5 minutes scanning the email that seemed to contain "information" that was important to me. It was amazing how much "noise" I was able to filter out. This is something that Tim describes as a "Low Information Diet."

    I'm toying with the idea of completely disconnecting my phone and I'm currently checking my email once a week (Mondays).

    I looked back at a post that made remarkable difference to me when I first read it last year. It was JP's tips on becoming a more effective developer. In it he told us to limit the amount of instant messaging that we do during the day. Today I feel that instant messaging has been replaced by mailing lists, twitter, texting and RSS feeds. All of this can consume a good portion of your day, and for me causes me to lose focus, quickly. It's important to be selective about what information is important to keep you focused and to filter out what can wait.

    I'm not saying this is for everyone, but the Low Information Diet is working for me, and my daughter is loving the extra focused attention she gets from her daddy (likewise for her daddy).

    Posted Aug 04 2008, 11:05 PM by mo.khan with 4 comment(s)
    Filed under:
  • Ooops...

    Mike left a comment on my last post on Windows Forms Databinding asking:

    What do the tests look like?

    On the ComboBox binding, why aren't you using adding the binding through DataBinding.Add?  With the way you have it now if you change the value the combobox is bound too it doesn't get pushed back to the screen.

    Well Mr. Mike, on the view implementation there were no tests... *hang my head in shame* Yup, we went at it trying to understand how Windows Forms Data bindings works, but if we had gone at it test first, we would have found that leveraging the built-in data bindings are not very testable. It requires having a BindingContext setup, and in some cases the controls have to actually be displayed for the bindings to actually kick in. Second, if we had gone test first, we would have noticed the issue the Mike brought up in regards to the ComboBox.

    Feeling a little guilty about publishing code that wasn't well thought out, I decided to go at it again, with a test first approach. The test started off very high level. I knew the API that I wanted to work with, in this case a fluent interface for defining a binding to a control. The end result was quite different..

        [Concern(typeof (Create))]
        public class when_binding_a_property_from_an_object_to_a_combo_box : context_spec {
            [Test]
            public void should_initialize_the_combo_box_with_the_current_value_of_the_property() {
                combo_box.SelectedItem.should_be_equal_to(baby_girl);
            }
    
            protected override void under_these_conditions() {
                combo_box = new ComboBox();
                thing_to_bind_to = Dependency<IAnInterface>();
                baby_girl = Dependency<IAnInterface>();
                baby_boy = Dependency<IAnInterface>();
    
                combo_box.Items.Add(baby_boy);
                combo_box.Items.Add(baby_girl);
    
                thing_to_bind_to
                    .setup_result_for(t => t.Child)
                    .Return(baby_girl);
            }
    
            protected override void because_of() {
                Create
                    .BindingFor(thing_to_bind_to)
                    .BindToProperty(t => t.Child)
                    .BoundToControl(combo_box);
            }
    
            private ComboBox combo_box;
            private IAnInterface thing_to_bind_to;
            private IAnInterface baby_girl;
            private IAnInterface baby_boy;
        }

    The end result doesn't leverage the Windows Forms databindings at all. It registers event handlers for events on the controls.

        public class ComboBoxPropertyBinding<TypeToBindTo, PropertyType> : IPropertyBinding<PropertyType> {
            private readonly IPropertyBinder<TypeToBindTo, PropertyType> binder;
    
            public ComboBoxPropertyBinding(ComboBox control, IPropertyBinder<TypeToBindTo, PropertyType> binder) {
                this.binder = binder;
                control.SelectedItem = binder.CurrentValue();
                control.SelectedIndexChanged +=
                    delegate { binder.ChangeValueOfPropertyTo(control.SelectedItem.ConvertedTo<PropertyType>()); };
            }
    
            public PropertyType CurrentValue() {
                return binder.CurrentValue();
            }
        }

    If you're interested in the rest of the source code download the source here. The moral of the story... Don't become complacent and take off your TDD hat, prematurely. In most cases it can, and should be, tested. Your design will probably come out much cleaner then going at the problem head on without tests to back you up. Not only that, but tests also give you extension points for making changes, and dealing with different contexts you probably wouldn't have thought of right off the bat.

  • Windows Forms Data Binding

    A couple of weeks ago, Adam and I were pairing on a new screen in a windows forms application. He started showing me some stuff that he had learned about windows forms data bindings. I showed him a little bit of what JP tried to teach me, back in the Austin Nothin' But .NET boot camp, about Expressions and we decided to try a different way of binding domain object to screen elements in our application. The following is a method on the view that's invoked from a presenter. It's given an object from our model to display.

            public void Display(IActionPlan actionPlan)
            {
                Create
                    .BindingFor(actionPlan)
                    .BindToProperty(a => a.RecommendedAction)
                    .BoundToControl(uxRecommendedAction);
    
                Create
                    .BindingFor(actionPlan)
                    .BindToProperty(a => a.AccountablePerson)
                    .BoundToControl(uxAccoutablePerson);
    
                Create
                    .BindingFor(actionPlan)
                    .BindToProperty(a => a.EstimatedCompletionDate)
                    .BoundToControl(uxEstimatedCompletionDate);
    
                Create
                    .BindingFor(actionPlan)
                    .BindToProperty(a => a.EstimatedStartDate)
                    .BoundToControl(uxEstimatedStartDate);
    
                Create.BindingFor(actionPlan)
                    .BindToProperty(a => a.RequiredResources)
                    .BoundToControl(uxResourcesRequired);
    
                Create.BindingFor(actionPlan)
                    .BindToProperty(a => a.Priority)
                    .BoundToControl(uxPriority);
            }

    Each of our controls are prefixed with "ux". What we did was bind different types of controls to property's on the object to display. This immediately changed that state of the object as the user filled out information on the screen. The BindToPropery() method is given the property on the object to bind too. The following was the implementation we came up with.

        public static class Create
        {
            public static IBinding<T> BindingFor<T>(T object_to_bind_to)
            {
                return new ControlBinder<T>(object_to_bind_to);
            }
        }
        public interface IBinding<TypeToBindTo>
        {
            IBinder<TypeToBindTo> BindToProperty<T>(Expression<Func<TypeToBindTo, T>> property_to_bind_to);
        }
        public interface IBinder<TypeOfDomainObject>
        {
            string NameOfTheProperty { get; }
            TypeOfDomainObject InstanceToBindTo { get; }
        }

    The implementation of the BindToProperty method takes in an input argument of type Expression<Func<TypeOfDomainObject>>. This allows us to inspect the expression to parse out the name of the property the binding is for. It's like treating code as data. The IControlBinder implements two interfaces. One that's issued to client components (IBinding) which restricts what they can do with the type. (see above in the Create class) The second interface exposes enough information for extension methods to pull from to build bindings for specific windows forms controls.

        public interface IControlBinder<TypeToBindTo> : IBinding<TypeToBindTo>, IBinder<TypeToBindTo>
        {
        }
    
        public class ControlBinder<TypeOfDomainObject> : IControlBinder<TypeOfDomainObject>
        {
            public ControlBinder(TypeOfDomainObject instance_to_bind_to)
            {
                InstanceToBindTo = instance_to_bind_to;
            }
    
            public IBinder<TypeOfDomainObject> BindToProperty<TypeOfPropertyToBindTo>(
                Expression<Func<TypeOfDomainObject, TypeOfPropertyToBindTo>> property_to_bind_to)
            {
                var expression = property_to_bind_to.Body as MemberExpression;
                NameOfTheProperty = expression.Member.Name;
                return this;
            }
    
            public string NameOfTheProperty { get; private set; }
    
            public TypeOfDomainObject InstanceToBindTo { get; private set; }
        }

    The BoundToControl overloads were put into extension methods, allowing others to create new implementations of bindings without having to modify the Control binder itself. The extension methods....

        public static class ControlBindingExtensions {
            public static IControlBinding BoundToControl<TypeOfDomainObject>(
                this IBinder<TypeOfDomainObject> binder,
                TextBox control) {
                var property_binder = new TextPropertyBinding<TypeOfDomainObject>(
                    control,
                    binder.NameOfTheProperty,
                    binder.InstanceToBindTo);
                property_binder.Bind();
                return property_binder;
            }
    
            public static IControlBinding BoundToControl<T>(this IBinder<T> binder, RichTextBox box1) {
                var property_binder = new TextPropertyBinding<T>(box1,
                                                                 binder.NameOfTheProperty,
                                                                 binder.InstanceToBindTo);
                property_binder.Bind();
                return property_binder;
            }
    
            public static IControlBinding BoundToControl<T>(this IBinder<T> binder, ComboBox box1) {
                var property_binder = new ComboBoxBinding<T>(box1,
                                                             binder.NameOfTheProperty,
                                                             binder.InstanceToBindTo);
                property_binder.Bind();
                return property_binder;
            }
    
            public static IControlBinding BoundToControl<T>(this IBinder<T> binder, DateTimePicker box1) {
                var property_binder = new DatePickerBinding<T>(box1,
                                                               binder.NameOfTheProperty,
                                                               binder.InstanceToBindTo);
                property_binder.Bind();
                return property_binder;
            }
        }

    For completeness... the control bindings...

        public class TextPropertyBinding<TypeToBindTo> : IControlBinding {
            private readonly Control control_to_bind_to;
            private readonly string name_of_the_propery_to_bind;
            private readonly TypeToBindTo instance_of_the_object_to_bind_to;
    
            public TextPropertyBinding(
                Control control_to_bind_to,
                string name_of_the_propery_to_bind,
                TypeToBindTo instance_of_the_object_to_bind_to
                ) {
                this.control_to_bind_to = control_to_bind_to;
                this.name_of_the_propery_to_bind = name_of_the_propery_to_bind;
                this.instance_of_the_object_to_bind_to = instance_of_the_object_to_bind_to;
            }
    
            public void Bind() {
                control_to_bind_to.DataBindings.Clear();
                control_to_bind_to.DataBindings.Add(
                    "Text",
                    instance_of_the_object_to_bind_to,
                    name_of_the_propery_to_bind);
            }
        }
        public class ComboBoxBinding<TypeToBindTo> : IControlBinding {
            private readonly ComboBox control_to_bind_to;
            private readonly string name_of_the_propery_to_bind;
            private readonly TypeToBindTo instance_of_the_object_to_bind_to;
    
            public ComboBoxBinding(ComboBox control_to_bind_to,
                                   string name_of_the_propery_to_bind,
                                   TypeToBindTo instance_of_the_object_to_bind_to) {
                this.control_to_bind_to = control_to_bind_to;
                this.name_of_the_propery_to_bind = name_of_the_propery_to_bind;
                this.instance_of_the_object_to_bind_to = instance_of_the_object_to_bind_to;
            }
    
            public void Bind() {
                control_to_bind_to.SelectedIndexChanged +=
                    delegate {
                        typeof (TypeToBindTo)
                            .GetProperty(name_of_the_propery_to_bind)
                            .SetValue(
                            instance_of_the_object_to_bind_to,
                            control_to_bind_to.Items[control_to_bind_to.SelectedIndex],
                            null);
                    };
            }
        }
        public class DatePickerBinding<TypeToBindTo> : IControlBinding {
            private readonly DateTimePicker control_to_bind_to;
            private readonly string name_of_the_propery_to_bind;
            private readonly TypeToBindTo instance_of_the_object_to_bind_to;
    
            public DatePickerBinding(DateTimePicker control_to_bind_to,
                                     string name_of_the_propery_to_bind,
                                     TypeToBindTo instance_of_the_object_to_bind_to) {
                this.control_to_bind_to = control_to_bind_to;
                this.name_of_the_propery_to_bind = name_of_the_propery_to_bind;
                this.instance_of_the_object_to_bind_to = instance_of_the_object_to_bind_to;
            }
    
            public void Bind() {
                control_to_bind_to.DataBindings.Clear();
                control_to_bind_to.DataBindings.Add(
                    "Value",
                    instance_of_the_object_to_bind_to,
                    name_of_the_propery_to_bind);
            }
        }

    We found that using the fluent interface for creating bindings was pretty easy and made screen synchronization a breeze, however, our implementation wasn't the easiest thing to test. So far it's been good to us.

    As a side note... go register for the Las Vegas course, it may cause you to love your job! Also, if you've already attended a boot camp, and you think you already know what the course is about, you have no idea, it keeps getting better and better.

  • Recursive Command

    Note: this entry has moved.

    When building up a tree view that represents the directory structure of a file system, like the windows explorer, my first reaction was to use recursion to traverse the file system and build up a tree. I quickly found that doing something like that is a time consuming process, and required some optimization.

    I came up with what I like to call the recursive command. Each Tree Node item on a tree view is bound to a command to execute. The command looks like this...

    public interface ITreeNodeClickedCommand {
        void Execute(ITreeNode node);
    }

    When the command is executed, the command gets an opportunity to modify the state of the tree node that was clicked. In this case I wanted to lazy load the sub directories of a node that was clicked. The command implementation looks like this...

    public interface IAddFoldersCommand : ITreeNodeClickedCommand {}
    
    public class AddFoldersCommand : IAddFoldersCommand {
        private readonly DirectoryInfo the_current_directory;
        private bool has_executed;
    
        public AddFoldersCommand(DirectoryInfo the_current_directory) {
            this.the_current_directory = the_current_directory;
        }
    
        public void Execute(ITreeNode node) {
            if (!has_executed) {
                foreach (var directory in the_current_directory.GetDirectories()) {
                    node.Add(new TreeNodeItem(directory.Name, ApplicationIcons.Folder, new AddFoldersCommand(directory)));
                }
            }
            has_executed = true;
        }
    }

    This command is executed each time the tree node that it is bound too is clicked, but will only build up the child tree node items once. Each of the child tree nodes are bound to a new instance of the same command. Hence, what I like to call the recursive command.

    recursive_command

    For more information on the command pattern check out WikiPedia's write up.

  • Trust & Transparency

    Our team is comprised of 3 dedicated developers, 1 project manager, 1 super dedicated product owner and a trusty task board. Although, we're a small team we've been uber successful, and so far have been able to out perform the competition (in a surprisingly short amount of time).

    One of those reasons is because of how "tight" (read:close) the team is. What I mean is that we're completely open with each other, which has allowed us to really gel as a team. We have our good days and bad days, but overall I feel like I can honestly depend on my team mates, and likewise.

    We all make the same salary, and have the same amount of shares. There's no super heroes on our team. We all have strengths and our weaknesses, but there's no sense that any one of us feels like we are obligated to outperform one another. We're judged based on team performance rather than individual performance.

    "The problem with reviews is that most reviews and raises are based on individual goals and achievements, but XP focuses on team performance. If a programmer spends half of his time pairing with others, how can you evaluate his individual performance? How much incentive does he have to help others if he will be evaluated on individual performance?" - Kent Beck from Extreme Programming Explained

    Extreme Programming Explained: Embrace Change (2nd Edition) (The XP Series)
    by Kent Beck, Cynthia Andres

    Read more about this book...

    Depending on the day, we each step up to lead the team. There's no water cooler discussions about why a member of the team makes x dollars, while I make x - 20K. We're either performing or not, and call each other out when we're not.

    So far, this has helped our team gel. I'm curious to hear how about why you and your team are so "tight"?

    Posted Jul 14 2008, 06:43 AM by mo.khan with 2 comment(s)
    Filed under:
  • Tag mO's IT!

    So JP had to tag me... then the Los Techies crew had to invite me to join Los Techies. This sucks for someone who "claims" to be quite a private person. Thanks JP for putting me in the spotlight, and thanks to all the techies who thought I was fit to join. So here goes...

    How old were you when you first started in programming?

    I was in grade 11, so I guess that would have made me 15.

    How did you get started in programming?

    Hmm... Kind of by accident. I took a C++ course in high school as an option and I found that I actually liked it. I didn't actually think I was capable of becoming a software developer, but I knew I liked it.

    What was your first programming language?

    C++

    What was the first real program you wrote?

    In college I signed up for a curriculum that focused more on electrical engineering than software development. However we got a little bit of exposure with different programming languages like assembler and C.

    The first actual program that I finished was in my second year of college. We wrote a piece of voice recognition software using MatLab. It was actually a tonne of fun, because it required us to utilize what we had learned about digital signal processing as well as how to pick up a brand new language and learn how to get something compiling with it in a short bit of time. This was probably when I realized I liked staring at code more than I liked staring at circuit diagrams.

    What languages have you used since you started programming?

    Assembler, C, C++, C#, T-SQL, VB, VB.NET, MatLab. The languages I would say I'm ok in are C and C#.

    What was your first professional programming gig?

    Right after college I got scooped up by a company called DataShapers, where I got to work on a project called Incentus. It was a Gift Card, and Loyalty Management system. I was hired to build embedded gift card applications for different point of sale terminals.

    I was quite fortunate that I got to work on such a sweet project right out of school. I was exposed to things like chip cards, 3DES encryption, SSL/TLS at a raw sockets level written in C. I was fortunate enough to be mentored by one of the best while I was there. Thanks Mr. Mark!

    If you knew then what you know now, would you have started programming?

    Oh... yes!

    If there is one thing you learned along the way that you would tell new developers, what would it be?

    Actually listen to your elders, and follow through with what they tell you. At the same time, question everything they tell you, and decide what's right for you.

    "Listen to your elders, but question everything they tell you."

    What's the most fun you've ever had programming?

    The Nothin' But .NET boot camp (times 2)... seriously, it blows my mind!

    Who am I calling out?

    Luu Duong

    Mark Chen

    Owen Rogers

    Adam Alinauskas (whenever he gets his blog back up)

    David Morgantini

Copyright Los Techies 2007. All rights reserved.
Powered by Community Server (Commercial Edition), by Telligent Systems