Dynamic Binding

A blog by Dody Gunawinata
HTTP Verb PATCH is approved

Last week's announcement that HTTP PATCH has been adopted as an official verb via RFC 5789 has generated a lot of excitement (and questions). As a summary, the intention of each verb is:

  • POST to create a new resource when the client cannot predict the identity on the origin server (think a new order)
  • PUT to override the definition of a specified resource with what is passed in from the client
  • PATCH to override a portion of a specified resource in a predictable and effectively transactional way (if the entire patch cannot be performed, the server should not do any part of it)

The goal is to convey the intent of the patch more clearly than is possible with the more generic POSTing of modifications. Specific patch diff formats will emerge for modifying plain text, HTML, XML, etc. Semantic Universe

This is huge. Finally we have more verb to refine REST APIs operation.

Third World, not third rate

Charm Flickr (creative common license)

On face value, software development is the great equalizer because all you need is a computer, which is widespread and the Internet, which is accessible. But if you peek more closely in the industry, the challenges operating in a third world country is quite significant compared to first world - just as it applies to any other industries.

Nota bene that third world is off course encompass a large part of the world. I write this based on my experience in working in or dealing with operations in Egypt, Morocco, India, Azerbaijan and Indonesia. My first world experience are in Australia, Singapore, Czech Republic, Italy and USA.

English as Lingua Franca

English is more or less the Lingua Franca of programming. Most information about software are available first, if not only, in English. Although English comprehension is much easier to achieve, mastering the ability to write clearly in the language takes a lot of effort and time. This reduces the amount materials and critical thinking from third world programmers accessible to wider audiences because simply we do not write as much in English. I suspect that this also have a big impact on reduced open source contributions from the third world.

Immature local market

Local business software market in a third world is completely different that first world. We operate in an environment on which business systems are either new or do not exists. There are a much higher learning curve for the customers for their first system development compared to organizations that have relied and benefited from software for a while. Critically, things that software will optimize in the first world (thanks due to higher labor costs), might not make sense in the third world.

Different life rhythm

This especially applies to outsourcing projects. In Muslim countries like Egypt, the holy month of Ramadan completely change the rhythm of life. People fast during the day and more importantly, they spend more time with friends and families at night. All these factors do not bode well for productivities during the month. It is what it is and schedules should be adjusted to accommodate that. On the other hand, we keep on trucking during December.

Process adoption

Popular processes such as Agile or Lean are great ideas but again these ideas originated from first world countries with its own built in assumptions and conditions. Can it be applied successfully in the third world? I bet there are plenty of evidences that it can. Are there any other alternative processes that can be implemented instead that bring better results considering local conditions? Yes. We have been trying one in the past 18 months and the results have been encouraging (this is for another post).

Our major cities traffic are horrible and mostly polluted

We are more of a social animal that the stereotype "geek" being portrayed which means that we like to work in offices - together with our mates and colleagues. The problem is that most of the time our traffic are horrible and our public transports are non existent. You don't know traffic jam until you get stuck in one in Jakarta or Cairo. The bottom line is that all these just make work a bit more difficult than working in locations where the air is clean, public transports are available and commute are short.

We have to fight our education system

Our tertiary education system aren't that great. Yes we would have one or two example of excellence, but there are plenty more where our education system fails our students. This means that we have to invest more in training our incoming developers that we would have otherwise in first world.

Our operating environment is harsher

A third world country means there are big deficiencies in our government, private sectors and overall operating environment - in short we just have to deal with more bullshit and everything is a work in progress. All these saps more energy that could be otherwise spent on more productive things.

Different quality perception

One of the more frustrating aspect in operating in the third world is the difference perception of quality. What is acceptable in local market will not pass muster in international market and vice versa. There is also diverse cultural gap in terms of design and look and feel. What is considered as good design can varies and usually local designers are struggling to come up with designs that are acceptable to their foreign customers.

Anyway these are just several factors I would like to highlight in the reality of software development in the third world. When you see great software from the third world, try to appreciate on how much challenges that those teams and companies have to overcome to achieve that outside the technical and engineering work itself.
Mama teach your children protocols

I work and live in Cairo, Egypt - so I get to see the Pyramids of Giza from my office window while you suckers have to pay thousands of dollars to pay see it for a couple of uncomfortable hours.

On the downside, I have to review resumes and interview people on a weekly basis for web development jobs.

A standard resume will list litanies of languages, frameworks and databases that a particular person has mastered - but rarely I see people list of protocols in there. Not surprisingly I have not interviewed any web development candidates that know their HTTP/1.1 cold. That is a damn shame.

I do not see universities teaching protocols as parts of their IT degrees either. Developer conferences sell the latest language and libraries. Professional IT traning firms drill down either Java or .Net framework to their participants. But nobody talks about protocols.

It probably because people think protocols are boring. Yes, protocols are boring and you cannot do some flashy demoware on them at conferences - but not mastering critical protocols in your daily work hinders your progress unecessarily. You will get by without knowing HTTP/1.1 as a web developer, but let's aim higher than getting by in a profession.


(image licensed by creative common)

When you get to know an underlying protocol, you will be able to figure out easily their weaknesses and strength and be able to make the appropriate decision on when to use this. Protocols also tend to last longer than just mere frameworks.The coolest thing about mastering protocols is that you get to know how things work. There are wonderful things to be discovered inside multitude of protocols that are available and being used everyday on the Internet.

I wish universities take protocols more seriously than they are now. They should be at least one course on mastering the most popular Internet and web based protocols and open formats.

Anyway, here is a list of protocols that a developer can learn much from.

and there are a whole lot more.

I wish Steve Balmer can repeat his schtick of shouting Developers! Developers! Developers! to Protocols!Protocols!Protocols! It will do inumerable service to wider development community if more of us take mastering protocols seriously.

My favorites .Net development toolkits

Toolbox

 

Infrastructure

Useful web infrastructure (some are free)

  • Rabbit MQ - Rabbit MQ is a scalable message/queue AMQP server with WCF/C# client (free)
  • Twillio - This is an awesome commercial programmable VOIP infrastructure. Free accounts available (commercial)
  • ejabberd - This is one really scalable jabber/XMPP server (free)
  • fyiReporting - This is a free reporting tools for .Net based on Report Definition Langauge (RDL) (free)
  • Dotnet OpenID - C# library for OpenID authentication (free)
  • Tweetsharp - An excellent library for Tweeter API (free)
  • XML-RPC.Net - This is *the* library to make XML-RPC calls (free)
  • Jabber-net - This is the only client library for Jabber/XMPP protocol
  • Mono RelaxNG Validator - This is the most viable RelaxNG validator reader for .Net (free)
  • Quartz. Net - Enterprise job scheduler for .Net (free)
  • Topshelf - Windows service application framework (free)
  • Facebook Developer Toolkit - If you want to develop a Facebook App on .Net, use this (free)
  • Gitsharp - Library for Git version control (free)
  • SharpSVN - A library for Subversion Client API (free)
  • Math.NET - A mathematical open source (MIT/X11, LGPL & GPL) library written in C#/.Net, aiming to provide a self contained clean framework for symbolic algebraic and numerical / scientific computations. (free)
  • Linq to Twitter - Linq to Twitter
  • Sharp SSH - SSH Implementation in C#

Workflow

Workflow system you can use for your applications

  • Simple State Machine - his is a powerful and simple open source workflow system driven by Boo DSL (free)
  • Stateless - State machine framework for C#

Open Source Web Application

Useful open source web application written using .Net technologies

  • Simple Kanban - This is a simple javascript based tool to create your kanban board based on a single html file

Design Tools

Free tools to help you during design

  • Balsamiq - Bar none the most developer friendly UI sketch tools available (commercial)
  • yUML - Produce beautiful UML diagram fast (free)
  • Web Sequence Diagrams - Draw UML web sequence diagram quickly (free)
  • Spec Explorer - An awesome model based testing tool from Microsoft Research

RDF

RDF Libraries

    Scripting

    Scripting languages for .Net

    • Iron Python - A fast implementationo of Python language on DLR (free)
    • Iron Ruby - A fast implementation of Ruby language on .Net (free)
    • RemObjects ECMAScript - A DLR based implementation of JavaScript language (free)
    • LuaSharp - Use Lua language on .Net (free)
    • Iron Scheme - a DLR based implementation of Scheme language (free)
    • Boo - It's not exactly a scripting language, but an awesome language nevertheless (free)

    Serializers

    Libraries to serialize your data to open format

    • Json.NET - An excellent JSON serializer (free)
    • Yaxlib - If you find the default .Net or WCF XML Serializers too retarded for you, check this awesome library (free)
    • Yaml Serializer - A YAML 1.2 serializer

    Database

    Libraries to connect to relational or nosql database

    • System.Data.SQLite - This is the one library to use to connect to SQLite database (free)
    • Firebird .Net Data Provider - Firebird is an awesome open source database. Use this library to connect to it from .Net (free)
    • Divan - This is a c# library for CouchDB
    • Manage ESENT - Powerful and fast built in database in Windows

    Service Bus

    .Net based service bus for your enterprise application

    • nservicebus - This is an excellent service bus library (free)
    • masstransit - If nservicebus is not your cup of tea, try this one (free)

    REST Framework

    REST Application Framework

    • Open Rasta - This is a unique open source REST framework for .Net. Highly recommended (free)
    • REST for ASP.Net MVC SDK - REST programming support based on ASP.Net MVC framework (free)
    • RestSharp - this is a new kind of the block (free)
    • Dream - I use it and love it for its simplicity and brilliant async framework (free)

    ORM

    Excellent ORM for your application

    • Subsonic - A productive open source ORM (free)
    • NHibernate - This is the oldest and very popular port of Hibernate ORM (free)
    • LLBLGen Pro - This is the most awesome ORM for .Net available out there (commercial)

    Template Engine

    Text template engine

    • ndjango - a .Net implementation of Django template engine (free)
    • String Template - This is a powerful template engine (free)

    Unit Test

    Unit Test tools

    • NUnit - The oldest .Net unit testing library (free)
    • MbUnit - This unit test is compatible with NUnit attribute but also introduces boatloads of testing features (free)
    • smtp4dev - Dummy SMTP server that sits in the system tray and does not deliver the received messages. (free)
    • Spec Flow - This is a library for BDD (similar to cucumber)
    • mspec - This is yet another BDD framework (similar to specflow)

    Dependency Injection

    DI tools

    • ninject - An easy to use DI tool (free)
    • Structure Map - I know some people that swear by this (free)

    Mocking

    Mocking libraries

    • moq - An easy to use mocking library (free)
    • Rhino.Mocks - One of the most popular mocking library for .Net (free)

    Syndication

    RSS/ATOM libraries

    • Argotic - Supports RSS, ATOM and various syndication format (free)

    Javascript Libraries

    RSS/ATOM libraries

    • wireit - An open source javascript library to create wireable interface (free)
    More Posts