Archive

Posts Tagged ‘product’

Google Web Toolkit

February 17th, 2009

The post which will bring some very very interesting discussions/debates/fights. Here it is.

(Before starting flames on this post, do read the last line note.)

When I co-founded this company and decided to work with early stage startups, I was faced with technology choices. Ruby was (is) getting mainstream momentum. Many startups were using it. PHP, no matter how much I dislike it, was still used widely. Python with Django was also started getting some ground. .Net and Java being as important as ever. Choices were there, all looking good on surface. Features were all there. We decided to evaluate all these technologies. We both come from deep roots in Java and object oriented technologies and do have some bias towards it. But still we tried to do our best. We listed down all pros and cons for all these technologies. Investigated all of them. Build sample projects/apps in all of them. Talked to experts, technology mentors.

Also while making the choices we had some limitations on ourselves and this choice should be evaluated against these limitations.

Limitations - 

  • We are not building one single product. We will be building many products, for diversified set of applications. For mobile, for web, for enterprises, for embedded devices and may be even for space crafts.
  • Talent acquisition, training and retaining costs. Though we build cutting edge products, we still are a services company.
  • We use our services arm to groom engineers. So finding projects on same/similar technology which can be executed by services division was also essentially, but this was more of an nice to have feature rather than limitation.
  • We will be working for many startups in next few years. We want technology to support creation of off-shelf components and using them with multiple startups where ever possible.
  • Knowledge transfer for code/design and technology should be minimal. Again nice to have but not exactly a limitation.
Okay, so once you know the background, here is our clear choice.
Java all the way.
We decided Java provides the best technology choice we can make. True, for web applications Java is not exactly a suitable choice. So, we started thinking which is the technology that can provide UI features and sit comfortably on a Java backend? You can use any technology for that. But again doing lot of investigation, search (we dont call everything as research) and came to conclusion that Google Web Toolkit is the best technology available.
If you refer to previous post, I have outlined majority of things we consider or should consider while making choices. So how does Google Web Toolkit (GWT) ranks on all this. If you dont know what GWT is, I will suggest going through some basics before continuing.
Feature set -
  • Provides cool Ajax stuff like fading pop-overs, drag and drop and many such things in built.
  • Though most of the features are available with other technologies too.
  • Templating is one of the most important feature for UI side technology. Is there any better templating engine than a class? I dont think so.
  • Why one should learn weird things like % % terminated tags? Weird UI side syntaxs? With GWT all you are doing is writing classes and implementing methods.
  • Already many UI design tools are available for GWT. Writing your own is not a big problem. All you will be doing is churning out classes from the design tool. Hence performance and usability of such tools is much better for GWT than for other things.
Performance - 
  • On UI side it is just HTML and Javascript code. Java code cross compiled into HTML + Javascript + CSS.
  • This Javascript code is maintained by Google and open source communities. This gives it chance of getting better and better with every release. Hence more optimized.
  • GWT is not much of code generation, but more of code replacement, hence limitations that code generation techniques have are not completely applicable to GWT from performance perspective.
  • Browser specifics etc are handled much better.
  • No need to write Javascript on your own, unless you want to write your own plugins. Even then, you write the Javascript, write a simple module to cross compile Java code to that Javascript and you never have to use Javascript directly again. Release that plugin into wild ie open source communities and it will keep evolving if its good enough.
  • So performance not an issue with GWT on UI side.
  • On backend its Java, so performance can not been an issue there. Java is proven for that.
  • Also lot of performance improvement tools are available for Java. Caching systems, search engines and many such goodies are there well performing, which can be easily integrated.
Maintainability - 
  • GWT code is essentially classes. We know that classes are more maintainable than PHP/JSP or other text files.
  • Since code is just classes, you will be drawing class diagram, sequence diagram instead of screen mocks and screen flow. Now UML digram are backed up with specification and hence more maintainable.
  • Two programmers can work on same class (but not on same plain text file) without giving too many check in conflicts. Great thing to have when quick fixing is required and you are fire fighting.
  • Classes are structured, governed by OOD and OOP concepts. Its very easy to understand code written by some one else in the format of class than in a text file, even if we assume zero or 100% documentation. Also this helps in code-reviews, peer reviews and other audit processes.
  • Using UML design philosophy and OOD/P concepts, code written is much cleaner, well organized and in fact much lesser than others. So much easier to maintain.
  • I can not stop raving about how maintainable GWT+Java code is!
Talent acquisition -
  • There are thousands of Java programmers out there who are good in Java and understand HTML/CSS basics fairly well.
  • No need to have Javascript wizards in the team, if you are working with GWT.
  • Java is backed by Sun certification, if you believe in certifications which I dont much. Always good to know that some one is making money by certifying talent. You need not have to rely on them, but its a nice to have thing.
  • So in short, talent acquisition is fairly straight forward, plenty of choices.
Distributed team work -
  • I have covered these things in maintainability but to make sure one understands the importance of the same from distributed team work perspective too, I am reiterating in next points. If you know how they apply for this, then skip to next bold point :-).
  • Class diagram, sequence diagram help in communicating thought process in more concise and clear way. With UML specs in place, you are sure that what you are saying is not misunderstood on the other side on internet pipe.
  • Lots of tools, techniques available for Java to help in minimising issues related to distributed team structures. 
Eco-system - 
  • Java has a very very vibrant community. A little too vibrant for my taste actually.
  • Lot of open source communities and products have made millions of dollars. JBoss, Hibernate, Apache are only few examples to note.
  • Java is backed by Sun which is a multi billion dollar company. There revenues, not all but part, are dependent on Java and its success.
  • Though Google, does not make money out GWT, at least for now, it cant just let GWT hanging. Google brand name is associated with it.
  • Already there are tonns of communities which are creating wealth by GWT plugin development, support, tools are there.
  • This can only grow from here.
  • Many outsourcing vendors are available for GWT development, as it is nothing more than plain JEE development, a little easier in fact.
Time to market - 
  • As I have mentioned already in last post, that time to market is not counted from development day zero to release. But it is counted from inception of the concept to release. This include time for team building, trainings and everything.
  • Considering all that time to market is much lower or at least same.
  • Also lot of people who say Java is slow in development, never used any code generation tools. Never have actually seen a world class product being developed using Java. There are many things one can do to speed up the process.
  • With GWT tool support is even more rich than for Java. Hence using excellent tools infrastructure and good design principles GWT+Java app is much faster developed or at least with the speed as a python app is developed.
  • Also dont compare time to release first screen as a measurement. Yes, I agree for Java or Java based apps, getting first use case running smoothly gets some more time than others. That too if you are very rigid about following processes. But once you have that one use case flowing, rest of the things become very mechanical, apart from the algorithms. We generally generate the code using custom annotations etc once we have that first use case. So all we need to implement is the backend logics.
Open for discussions.
Note, I am not saying other technologies (apart from PHP :D) does not have these features, but they are not as evolved as Java. And this is not a polical statement!

Design Methodology, Startup, Technology , , , , , , , ,

Product technology : Selection parameters

February 14th, 2009

In last few months or so, I have had debates, diplomatic way to say I had fights, with fellow geeks about how to choose technology for a product. These parameters are not necessarily for startups, but in general. In the next post, I am going to write about how these parameters gives clear advantage to Java and GWT when it comes to Web applications.

 

Feature Set - 

   Most of the technologies, or the eco system around them, provide enough features to build any application. True, this wont be the case if you are developing an embedded application or application for space craft etc. But most of the enterprise, web application can be built using any of the technologies. Python, Ruby, Perl, Smalltalk, .Net, PHP, Java and Flex provide everything that is required to build an application. From language point of view, these technologies will differ significantly. Features they offer to developers and geeks are not considered. A true geek develops kick ass application, which creates wealth for the stake holders. I never believed that geeks who say “I wont work on a Windows machine”, are essentially good for the company and its success.  But bottom line is feature set is pretty much common in all the important technologies and no single technology is at advantage here.

Performance -

  Very selective call. If you are building a next SSN (Stupid Social Network :D ) then you will have to consider serving million users. If you are building a banking system, you will have to consider serving million transactions. If you are an Ajax heavy application, you will have to think of Javascript caching and issues it presents. Performance of the complex business algorithms is essential to the over all performance of the system. Can technology take advantage of multi-core CPUs? Does it support good distributed session management? Does it have strong security features? Can it scale? How big is the footprint of application? CPU Vs Database Vs Memory Vs Bandwidth tradeoffs. One of the most important thing in performance evaluation is, you cant generalize it. In my experience, the only theory which has hold true, is the last statement when it comes to performance evaluation.

   But again, Java obvisouly holds and edge over all other technology. Java deployed on a Linux machine with Sun RISC servers to back up, makes up the highest performance you can get. Although other technologies may not be that far behind. So for a reasonably high throughput requirement system, most of the technologies will provide you support to tune them and make sure you achieve your numbers. If you use Java, then you have to worry a little less about such tweaks that are available. One of the reason is, sheer number of high performing Java apps around and availability of quality Java performance consultation.

Maintainability -

  This is point I consider the most while choosing a technology. All other points does not give clear advantage to any particular technology. But maintainability of any particular technology is so inherent to the technology itself that this becomes a very important criteria for selecting it. A product has to be supported, enhanced, maintained for a long long period of time. Successful products tend to out live the creators. Technologies will change very fast. Product will have to adapt as per changes. Code written by you will need to be maintained by some other, may be less talented person. The code will under go lot of changes as time goes by. Does technologies you are choosing help you in keeping code maintainable? Does it provide clear constructs and architectural/design patterns which are self explanatory? Can you look at your own code written in that technology one year down the line, and explain it to some one else? Is data flow and control flow clearly depicted by the technology? 

Talent Acquisition -

   A product typically wont require more than few dozen people to develop. But as the product becomes successful, you are going to need 100s of developers to maintain it, support it, enhance it and keep it improving and delivering value to your customers. Can you acquire such talent which is required to maintain product you have developed using the technology you have chosen? I know a team of 4-5 python programmers who developed a product (not so good product) and when they wanted to expand their team to add few more programmers, it took them 8-9 months to find 2 programmers who fit the bill. If the product was developed using Java/.Net it would have taken less than 1 month, if the product would have been developed using Smalltalk, they never would have found those programmers. 

   But that does not mean you cant use other technologies at all. But you will have to know that, you cant rely on the outside to get you talent. In India, no recruiting agency will even understand how to shortlist Python or Smalltalk programmers! So you will have to come up with a contigency plan to cope up with situation. You will have to hire talent which is good in some other similar technology and train them. You will have to hire ahead of the curve and spend money on training. If you can do that, then you can choose such technologies, else not.

Distributed team work -

  Now lot of experienced folks are going to be pissed off with this, but these are my views from my experience. No matter which product you are building, how big or small it is, at some point in time you will be working in a distributed environment. Some programmers working from home, some from other continent and other timezone. So can technology be so efficient to make sure you can support such distributed team structures. Can multiple programmers work on same module/file without having to spend a lot of time on resolving check-in conflicts? Does technology provide good patterns to support separation of concern, so that you can work in horizontal or vertical team structures with out creating lot of issues? Does the technology at least comes up with a really good Diff tool? :-) .

Eco-system -

  Your product is going to live long long time if it is successful. True, having a successful product means you can spend money on porting it to whole different technology if required. But such porting rarely happens. We are still bridging with applications which run on mainframes. Businsess will very rarely do such porting. Its risky, expensive. Also are you going to fire all programmers who worked with you in making the product successful? No! So re-training costs. 

  So what you need to consider is, how good is the eco-system around my technologies. Will the eco-system evolve as per changes in other tangential technologies? Are the technologies supported by a community which is strong, vibrant and evoling? Is this community lead by a company which makes heaps of money from the technology? Can I find a consultant in particular area, like performance management or memory management,  quickly? Are their enough companies out there who make support product for this technology? Are developer tools and environment available off the shelf? Are there any outsourcing vendors available who are competent in these technologies?

Time to market - 

   People say in todays world time to market is reducing very fast and we need technologies which accelarate the same. I say, time to market was always an essential factor in considering technologies. Today we have large choices of technologies to choose from which provide very different time-to-market and hence the big discussion.

   Again lot of people will say its so easier to build application in a particular technology, that time to market is 50% lesser than other technologies. I say, okay, may be that is possible. But what is time to market? From product concept to first public release of the product is time to market. This includes time for team building too. If it is going to take me 6 months to find good programmers I can work with for a particular technology then how is that going to reduce my time to market? But I will discuss few more things on this issue in the next post, where I talk exclusively about Java+GWT combo and how we are reducing time to market using it.

Why?

  Last but not the least parameter. Why I am choosing this particular technology? Is it a status quo to work in these technologies? Am I a true if only I work on products which are written in this language? Are my customers well versed with this technology? Is the cost of building a product much lesser than other available technologies? There can be numerous such Whys, but you need to be clear about this.

Implementing Concepts, Process, Startup , , , , , , , ,